diff --git a/.prettierrc b/.prettierrc
index adb0aebd..8bf95b38 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -6,7 +6,14 @@
"jsxSingleQuote": false,
"overrides": [
{ "files": ["*.md"], "options": { "tabWidth": 2, "useTabs": false } },
- { "files": "*.astro", "options": { "parser": "astro" } }
+ { "files": "*.astro", "options": { "parser": "astro" } },
+ {
+ "files": ["pnpm-workspace.yaml"],
+ "options": {
+ "useTabs": true,
+ "singleQuote": true
+ }
+ }
],
"plugins": [
"@stephansama/prettier-plugin-handlebars",
diff --git a/package.json b/package.json
index a5ab11bc..0344d8a4 100644
--- a/package.json
+++ b/package.json
@@ -90,6 +90,7 @@
},
"devDependencies": {
"actions-up": "^1.11.0",
+ "node-plop": "catalog:",
"taze": "^19.9.2"
},
"packageManager": "pnpm@10.29.3"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b13c92cd..80f10246 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -82,6 +82,9 @@ catalogs:
minify:
specifier: 14.0.0
version: 14.0.0
+ node-plop:
+ specifier: ^0.32.3
+ version: 0.32.3
prettier:
specifier: ^3.8.1
version: 3.8.1
@@ -334,6 +337,9 @@ importers:
actions-up:
specifier: ^1.11.0
version: 1.11.0
+ node-plop:
+ specifier: 'catalog:'
+ version: 0.32.3(@types/node@24.10.13)
taze:
specifier: ^19.9.2
version: 19.9.2
@@ -360,7 +366,7 @@ importers:
version: 1.1.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.15(typescript@5.9.3)))
vitepress:
specifier: ^1.6.4
- version: 1.6.4(@algolia/client-search@5.35.0)(@types/node@24.10.13)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.0(react@19.2.1))(react@19.2.1)(search-insights@2.17.3)(terser@5.42.0)(typescript@5.9.3)
+ version: 1.6.4(@algolia/client-search@5.35.0)(@types/node@24.10.13)(change-case@5.4.4)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.0(react@19.2.1))(react@19.2.1)(search-insights@2.17.3)(terser@5.42.0)(typescript@5.9.3)
core/ai-commit-msg:
dependencies:
@@ -3981,6 +3987,9 @@ packages:
'@types/http-cache-semantics@4.0.4':
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+ '@types/inquirer@9.0.9':
+ resolution: {integrity: sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -4026,6 +4035,9 @@ packages:
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+ '@types/picomatch@4.0.2':
+ resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==}
+
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
@@ -4040,6 +4052,9 @@ packages:
'@types/sax@1.2.7':
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+ '@types/through@0.0.33':
+ resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
+
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -4480,6 +4495,10 @@ packages:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
ansi-escapes@7.2.0:
resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
engines: {node: '>=18'}
@@ -4701,6 +4720,9 @@ packages:
birpc@2.6.1:
resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==}
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
blake3-wasm@2.1.5:
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
@@ -4742,6 +4764,9 @@ packages:
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
bundle-name@4.1.0:
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
engines: {node: '>=18'}
@@ -4832,6 +4857,9 @@ packages:
resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ change-case@5.4.4:
+ resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
+
character-entities-html4@2.1.0:
resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
@@ -4894,6 +4922,10 @@ packages:
resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
engines: {node: '>=10'}
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
cli-cursor@5.0.0:
resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
engines: {node: '>=18'}
@@ -4918,6 +4950,10 @@ packages:
resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
engines: {node: '>=20'}
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
clone@2.1.2:
resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
engines: {node: '>=0.8'}
@@ -5227,6 +5263,9 @@ packages:
resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
engines: {node: '>=18'}
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
defer-to-connect@2.0.1:
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
engines: {node: '>=10'}
@@ -6223,6 +6262,9 @@ packages:
resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
engines: {node: '>=0.10.0'}
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -6270,6 +6312,10 @@ packages:
inline-style-parser@0.2.4:
resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+ inquirer@9.3.8:
+ resolution: {integrity: sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==}
+ engines: {node: '>=18'}
+
internal-slot@1.1.0:
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
@@ -6378,6 +6424,10 @@ packages:
engines: {node: '>=14.16'}
hasBin: true
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
is-interactive@2.0.0:
resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
engines: {node: '>=12'}
@@ -6488,6 +6538,10 @@ packages:
resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
engines: {node: '>= 0.4'}
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
is-unicode-supported@1.3.0:
resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
engines: {node: '>=12'}
@@ -6534,6 +6588,10 @@ packages:
resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==}
engines: {node: '>= 18.0.0'}
+ isbinaryfile@5.0.7:
+ resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==}
+ engines: {node: '>= 18.0.0'}
+
isbot@5.1.31:
resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==}
engines: {node: '>=18'}
@@ -6853,6 +6911,10 @@ packages:
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
log-symbols@6.0.0:
resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
engines: {node: '>=18'}
@@ -7266,6 +7328,10 @@ packages:
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
mute-stream@2.0.0:
resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -7349,6 +7415,10 @@ packages:
node-modules-tools@1.2.0:
resolution: {integrity: sha512-RiUfH6cGw1TnmYV+9hyPcTKWZwTlypYuWR90V9utkhRT/rZ4b4yg1pUn+fdolJmuGgJsZqGfxYr9bIh8+BIIXA==}
+ node-plop@0.32.3:
+ resolution: {integrity: sha512-tn+OxutdqhvoByKJ7p84FZBSUDfUB76bcvj0ugLBvgE9V52LFcnz8cauCDKi6otnctvFCqa9XkrU35pBY5Baig==}
+ engines: {node: '>=18'}
+
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
@@ -7477,6 +7547,10 @@ packages:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
ora@8.2.0:
resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
engines: {node: '>=18'}
@@ -8052,6 +8126,10 @@ packages:
resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
engines: {node: '>=6'}
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
@@ -8203,6 +8281,10 @@ packages:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
restore-cursor@5.1.0:
resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
engines: {node: '>=18'}
@@ -8272,9 +8354,16 @@ packages:
resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
engines: {node: '>=18'}
+ run-async@3.0.0:
+ resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
+ engines: {node: '>=0.12.0'}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ rxjs@7.8.2:
+ resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
s.color@0.0.15:
resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
@@ -8602,6 +8691,9 @@ packages:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
@@ -8821,6 +8913,9 @@ packages:
resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==}
engines: {node: '>=14.0.0'}
+ title-case@4.3.2:
+ resolution: {integrity: sha512-I/nkcBo73mO42Idfv08jhInV61IMb61OdIFxk+B4Gu1oBjWBPOLmhZdsli+oJCVaD+86pYQA93cJfFt224ZFAA==}
+
tldts-core@7.0.17:
resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==}
@@ -8979,6 +9074,10 @@ packages:
resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
engines: {node: '>=4'}
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
type-fest@0.4.1:
resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==}
engines: {node: '>=6'}
@@ -9099,10 +9198,6 @@ packages:
resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==}
engines: {node: '>=18.17'}
- undici@7.16.0:
- resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==}
- engines: {node: '>=20.18.1'}
-
undici@7.22.0:
resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==}
engines: {node: '>=20.18.1'}
@@ -9793,6 +9888,9 @@ packages:
resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}
engines: {node: 20 || >=22}
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
@@ -10276,7 +10374,7 @@ snapshots:
'@loaderkit/resolve': 1.0.4
cjs-module-lexer: 1.4.3
fflate: 0.8.2
- lru-cache: 11.2.4
+ lru-cache: 11.2.6
semver: 7.7.4
typescript: 5.6.1-rc
validate-npm-package-name: 5.0.1
@@ -13022,6 +13120,11 @@ snapshots:
'@types/http-cache-semantics@4.0.4': {}
+ '@types/inquirer@9.0.9':
+ dependencies:
+ '@types/through': 0.0.33
+ rxjs: 7.8.2
+
'@types/json-schema@7.0.15': {}
'@types/keyv@3.1.4':
@@ -13069,6 +13172,8 @@ snapshots:
'@types/normalize-package-data@2.4.4': {}
+ '@types/picomatch@4.0.2': {}
+
'@types/react-dom@19.2.3(@types/react@19.2.14)':
dependencies:
'@types/react': 19.2.14
@@ -13085,6 +13190,10 @@ snapshots:
dependencies:
'@types/node': 24.10.13
+ '@types/through@0.0.33':
+ dependencies:
+ '@types/node': 24.10.13
+
'@types/trusted-types@2.0.7': {}
'@types/ungap__structured-clone@1.2.0': {}
@@ -13533,12 +13642,13 @@ snapshots:
transitivePeerDependencies:
- typescript
- '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(typescript@5.9.3)':
+ '@vueuse/integrations@12.8.2(change-case@5.4.4)(focus-trap@7.6.5)(typescript@5.9.3)':
dependencies:
'@vueuse/core': 12.8.2(typescript@5.9.3)
'@vueuse/shared': 12.8.2(typescript@5.9.3)
vue: 3.5.18(typescript@5.9.3)
optionalDependencies:
+ change-case: 5.4.4
focus-trap: 7.6.5
transitivePeerDependencies:
- typescript
@@ -13691,6 +13801,10 @@ snapshots:
ansi-colors@4.1.3: {}
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
ansi-escapes@7.2.0:
dependencies:
environment: 1.1.0
@@ -14107,6 +14221,12 @@ snapshots:
birpc@2.6.1: {}
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
blake3-wasm@2.1.5:
optional: true
@@ -14172,6 +14292,11 @@ snapshots:
buffer-from@1.1.2: {}
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
bundle-name@4.1.0:
dependencies:
run-applescript: 7.1.0
@@ -14271,6 +14396,8 @@ snapshots:
chalk@5.6.0: {}
+ change-case@5.4.4: {}
+
character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {}
@@ -14310,6 +14437,10 @@ snapshots:
cli-boxes@3.0.0: {}
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
cli-cursor@5.0.0:
dependencies:
restore-cursor: 5.1.0
@@ -14335,6 +14466,8 @@ snapshots:
strip-ansi: 7.1.2
wrap-ansi: 9.0.2
+ clone@1.0.4: {}
+
clone@2.1.2: {}
clsx@2.1.1: {}
@@ -14628,6 +14761,10 @@ snapshots:
bundle-name: 4.1.0
default-browser-id: 5.0.0
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
defer-to-connect@2.0.1: {}
define-data-property@1.1.4:
@@ -16000,6 +16137,8 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ ieee754@1.2.1: {}
+
ignore@5.3.2: {}
ignore@7.0.5: {}
@@ -16032,6 +16171,23 @@ snapshots:
inline-style-parser@0.2.4: {}
+ inquirer@9.3.8(@types/node@24.10.13):
+ dependencies:
+ '@inquirer/external-editor': 1.0.3(@types/node@24.10.13)
+ '@inquirer/figures': 1.0.15
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 1.0.0
+ ora: 5.4.1
+ run-async: 3.0.0
+ rxjs: 7.8.2
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ transitivePeerDependencies:
+ - '@types/node'
+
internal-slot@1.1.0:
dependencies:
es-errors: 1.3.0
@@ -16133,6 +16289,8 @@ snapshots:
dependencies:
is-docker: 3.0.0
+ is-interactive@1.0.0: {}
+
is-interactive@2.0.0: {}
is-map@2.0.3: {}
@@ -16218,6 +16376,8 @@ snapshots:
dependencies:
which-typed-array: 1.1.19
+ is-unicode-supported@0.1.0: {}
+
is-unicode-supported@1.3.0: {}
is-unicode-supported@2.1.0: {}
@@ -16251,6 +16411,8 @@ snapshots:
isbinaryfile@5.0.4: {}
+ isbinaryfile@5.0.7: {}
+
isbot@5.1.31: {}
isexe@2.0.0: {}
@@ -16561,6 +16723,11 @@ snapshots:
lodash@4.17.21: {}
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
log-symbols@6.0.0:
dependencies:
chalk: 5.6.0
@@ -17180,7 +17347,7 @@ snapshots:
glob-to-regexp: 0.4.1
sharp: 0.33.5
stoppable: 1.1.0
- undici: 7.16.0
+ undici: 7.22.0
workerd: 1.20250813.0
ws: 8.18.0
youch: 4.1.0-beta.10
@@ -17269,6 +17436,8 @@ snapshots:
muggle-string@0.4.1: {}
+ mute-stream@1.0.0: {}
+
mute-stream@2.0.0: {}
nano-spawn@2.0.0: {}
@@ -17374,6 +17543,21 @@ snapshots:
semver: 7.7.4
tinyexec: 1.0.2
+ node-plop@0.32.3(@types/node@24.10.13):
+ dependencies:
+ '@types/inquirer': 9.0.9
+ '@types/picomatch': 4.0.2
+ change-case: 5.4.4
+ dlv: 1.1.3
+ handlebars: 4.7.8
+ inquirer: 9.3.8(@types/node@24.10.13)
+ isbinaryfile: 5.0.7
+ resolve: 1.22.10
+ tinyglobby: 0.2.15
+ title-case: 4.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
node-releases@2.0.19: {}
node-stream-zip@1.15.0: {}
@@ -17523,6 +17707,18 @@ snapshots:
type-check: 0.4.0
word-wrap: 1.2.5
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
ora@8.2.0:
dependencies:
chalk: 5.6.0
@@ -18058,6 +18254,12 @@ snapshots:
pify: 4.0.1
strip-bom: 3.0.0
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
readdirp@4.1.2: {}
readdirp@5.0.0: {}
@@ -18305,6 +18507,11 @@ snapshots:
dependencies:
lowercase-keys: 3.0.0
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
restore-cursor@5.1.0:
dependencies:
onetime: 7.0.0
@@ -18440,10 +18647,16 @@ snapshots:
run-applescript@7.1.0: {}
+ run-async@3.0.0: {}
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
+ rxjs@7.8.2:
+ dependencies:
+ tslib: 2.8.1
+
s.color@0.0.15: {}
sade@1.8.1:
@@ -18875,6 +19088,10 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.1
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
stringify-entities@4.0.4:
dependencies:
character-entities-html4: 2.1.0
@@ -19094,6 +19311,8 @@ snapshots:
tinyspy@4.0.3: {}
+ title-case@4.3.2: {}
+
tldts-core@7.0.17: {}
tldts@7.0.17:
@@ -19222,6 +19441,8 @@ snapshots:
type-detect@4.1.0: {}
+ type-fest@0.21.3: {}
+
type-fest@0.4.1: {}
type-fest@2.19.0: {}
@@ -19353,9 +19574,6 @@ snapshots:
undici@6.21.3: {}
- undici@7.16.0:
- optional: true
-
undici@7.22.0: {}
unenv@2.0.0-rc.19:
@@ -19364,7 +19582,7 @@ snapshots:
exsolve: 1.0.8
ohash: 2.0.11
pathe: 2.0.3
- ufo: 1.6.1
+ ufo: 1.6.3
optional: true
unicode-properties@1.4.1:
@@ -19731,7 +19949,7 @@ snapshots:
optionalDependencies:
vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.42.0)(tsx@4.21.0)(yaml@2.8.2)
- vitepress@1.6.4(@algolia/client-search@5.35.0)(@types/node@24.10.13)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.0(react@19.2.1))(react@19.2.1)(search-insights@2.17.3)(terser@5.42.0)(typescript@5.9.3):
+ vitepress@1.6.4(@algolia/client-search@5.35.0)(@types/node@24.10.13)(change-case@5.4.4)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.0(react@19.2.1))(react@19.2.1)(search-insights@2.17.3)(terser@5.42.0)(typescript@5.9.3):
dependencies:
'@docsearch/css': 3.8.2
'@docsearch/js': 3.8.2(@algolia/client-search@5.35.0)(react-dom@19.2.0(react@19.2.1))(react@19.2.1)(search-insights@2.17.3)
@@ -19744,7 +19962,7 @@ snapshots:
'@vue/devtools-api': 7.7.7
'@vue/shared': 3.5.18
'@vueuse/core': 12.8.2(typescript@5.9.3)
- '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(typescript@5.9.3)
+ '@vueuse/integrations': 12.8.2(change-case@5.4.4)(focus-trap@7.6.5)(typescript@5.9.3)
focus-trap: 7.6.5
mark.js: 8.11.1
minisearch: 7.1.2
@@ -19941,6 +20159,10 @@ snapshots:
walk-up-path@4.0.0: {}
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
web-namespaces@2.0.1: {}
webidl-conversions@3.0.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 98ac11d2..5d0e71fe 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,70 +1,37 @@
-autoInstallPeers: true
-catalogMode: strict
-cleanupUnusedCatalogs: true
-engineStrict: true
-shellEmulator: true
-
packages:
- ./.config/*
- core/**
- examples/**
-catalogs:
- cli:
- cosmiconfig: 9.0.0
- obug: 2.1.1
- yargs: 18.0.0
- schema:
- "@standard-schema/spec": ^1.1.0
- arktype: 2.1.29
- valibot: 1.2.0
- zod: 4.2.1
- storybook:
- "@chromatic-com/storybook": ^4.1.3
- "@storybook/addon-a11y": ^10.2.8
- "@storybook/addon-docs": ^10.2.8
- "@storybook/addon-svelte-csf": ^5.0.11
- "@storybook/svelte-vite": ^10.2.8
- storybook: ^10.2.8
- svelte:
- "@sveltejs/package": ^2.5.7
- "@sveltejs/vite-plugin-svelte": ^6.2.4
- "@tsconfig/svelte": ^5.0.7
- svelte: ^5.51.2
- svelte-check: ^4.4.0
- vitest:
- "@vitest/coverage-v8": "^4.0.18"
- "@vitest/ui": "^4.0.18"
- vitest: "^4.0.18"
+autoInstallPeers: true
catalog:
- "@catppuccin/palette": 1.7.1
- "@dotenvx/dotenvx": ^1.52.0
- "@iconify/types": ^2.0.0
- "@iconify/utils": ^2.3.0
- "@manypkg/find-root": "^3.1.0"
- "@manypkg/get-packages": ^3.1.0
- "@testing-library/react": ^16.3.2
- "@testing-library/jest-dom": ^6.9.1
- "@types/debug": ^4.1.12
- "@types/mdast": ^4.0.4
- "@types/minify": 9.1.4
- "@types/react": ^19.2.14
- "@types/vfile": ^4.0.0
- "@types/yargs": ^17.0.35
- actions-up: ^1.11.0
- deepmerge: "^4.3.1"
- es-toolkit: 1.43.0
+ '@catppuccin/palette': 1.7.1
+ '@dotenvx/dotenvx': ^1.52.0
+ '@iconify/types': ^2.0.0
+ '@iconify/utils': ^2.3.0
+ '@manypkg/find-root': ^3.1.0
+ '@manypkg/get-packages': ^3.1.0
+ '@testing-library/jest-dom': ^6.9.1
+ '@testing-library/react': ^16.3.2
+ '@types/debug': ^4.1.12
+ '@types/mdast': ^4.0.4
+ '@types/minify': 9.1.4
+ '@types/react': ^19.2.14
+ '@types/vfile': ^4.0.0
+ '@types/yargs': ^17.0.35
astro: 5.9.3
+ deepmerge: ^4.3.1
+ es-toolkit: 1.43.0
handlebars: 4.7.8
happy-dom: ^20.6.1
jsr: ^0.13.5
mdast: ^3.0.0
minify: 14.0.0
+ node-plop: ^0.32.3
prettier: ^3.8.1
react: 19.2.0
remark: ^15.0.1
- taze: ^19.9.2
tsdown: 0.15.12
tsx: 4.21.0
typescript: 5.9.3
@@ -74,8 +41,42 @@ catalog:
vite: 6.3.5
vite-tsconfig-paths: ^5.1.4
+catalogMode: strict
+
+catalogs:
+ cli:
+ cosmiconfig: 9.0.0
+ obug: 2.1.1
+ yargs: 18.0.0
+ schema:
+ '@standard-schema/spec': ^1.1.0
+ arktype: 2.1.29
+ valibot: 1.2.0
+ zod: 4.2.1
+ storybook:
+ '@chromatic-com/storybook': ^4.1.3
+ '@storybook/addon-a11y': ^10.2.8
+ '@storybook/addon-docs': ^10.2.8
+ '@storybook/addon-svelte-csf': ^5.0.11
+ '@storybook/svelte-vite': ^10.2.8
+ storybook: ^10.2.8
+ svelte:
+ '@sveltejs/package': ^2.5.7
+ '@sveltejs/vite-plugin-svelte': ^6.2.4
+ '@tsconfig/svelte': ^5.0.7
+ svelte: ^5.51.2
+ svelte-check: ^4.4.0
+ vitest:
+ '@vitest/coverage-v8': ^4.0.18
+ '@vitest/ui': ^4.0.18
+ vitest: ^4.0.18
+
+cleanupUnusedCatalogs: true
+
+engineStrict: true
+
ignoredBuiltDependencies:
- - "@swc/core"
+ - '@swc/core'
- core-js-pure
- sharp
- workerd
@@ -84,9 +85,11 @@ onlyBuiltDependencies:
- esbuild
overrides:
- "@stephansama/astro-iconify-svgmap": workspace:*
- "@stephansama/catppuccin-xsl": workspace:*
- "@stephansama/remark-asciinema": workspace:*
- "@stephansama/svelte-social-share-links": workspace:*
- "@stephansama/typed-events": workspace:*
+ '@stephansama/astro-iconify-svgmap': workspace:*
+ '@stephansama/catppuccin-xsl': workspace:*
+ '@stephansama/remark-asciinema': workspace:*
+ '@stephansama/svelte-social-share-links': workspace:*
+ '@stephansama/typed-events': workspace:*
create-stephansama-example: workspace:*
+
+shellEmulator: true
diff --git a/turbo/generators/config.ts b/turbo/generators/config.ts
index 53138218..635a7644 100644
--- a/turbo/generators/config.ts
+++ b/turbo/generators/config.ts
@@ -1,64 +1,27 @@
import type { PlopTypes } from "@turbo/gen";
+import { actions, prompts } from "./utils";
+
+/* eslint-disable perfectionist/sort-objects */
export default function generator(plop: PlopTypes.NodePlopAPI) {
- plop.setGenerator("package", {
- description: "Generate a new package",
- prompts: [
- {
- message: "What is the name of the new package?",
- name: "name",
- type: "input",
- validate(input: string) {
- if (input.includes(".")) {
- return "library name cannot include an extension";
- }
- if (input.includes(" ")) {
- return "library name cannot include spaces";
- }
- if (!input) {
- return "library name is required";
- }
- return true;
- },
- },
- {
- message: "What is the description of the new package?",
- name: "description",
- type: "input",
- },
- ],
- // eslint-disable-next-line
+ plop.setGenerator("cli", {
+ description: "Generate a new cli package",
+ prompts: [prompts.name, prompts.description],
+ actions: [actions.addTemplate({ type: "cli" }), actions.addAllCommon],
+ });
+
+ plop.setGenerator("env", {
+ description: "Generate a new env package",
+ prompts: [prompts.name, prompts.description],
actions: [
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/package.json",
- templateFile: "templates/lib/package.json.hbs",
- type: "add",
- },
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/README.md",
- templateFile: "templates/lib/README.md.hbs",
- type: "add",
- },
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/tsdown.config.ts",
- templateFile: "templates/lib/tsdown.config.ts.hbs",
- type: "add",
- },
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/tsconfig.json",
- templateFile: "templates/lib/tsconfig.json.hbs",
- type: "add",
- },
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/typedoc.json",
- templateFile: "templates/lib/typedoc.json",
- type: "add",
- },
- {
- path: "{{ turbo.paths.root }}/core/{{ dashCase name }}/src/index.ts",
- templateFile: "templates/lib/BLANK",
- type: "add",
- },
+ actions.addTemplate({ type: "env" }),
+ actions.addCommonFile("tsconfig.json"),
],
});
+
+ plop.setGenerator("lib", {
+ description: "Generate a new lib package",
+ prompts: [prompts.name, prompts.description],
+ actions: [actions.addTemplate({ type: "lib" }), actions.addAllCommon],
+ });
}
diff --git a/turbo/generators/templates/cli/cli.mjs b/turbo/generators/templates/cli/cli.mjs
new file mode 100644
index 00000000..e9c8ad75
--- /dev/null
+++ b/turbo/generators/templates/cli/cli.mjs
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+
+"use strict";
+
+import("./dist/index.js")
+ .then((mod) => mod.run())
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/turbo/generators/templates/cli/package.json b/turbo/generators/templates/cli/package.json
new file mode 100644
index 00000000..492dfcd8
--- /dev/null
+++ b/turbo/generators/templates/cli/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@stephansama/{{name}}",
+ "version": "0.0.0",
+ "description": "{{description}}",
+ "keywords": [
+ "{{name}}"
+ ],
+ "homepage": "https://packages.stephansama.info/api/@stephansama/{{name}}",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/stephansama/packages.git",
+ "directory": "core/{{name}}"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Stephan Randle",
+ "email": "stephanrandle.dev@gmail.com",
+ "url": "https://stephansama.info"
+ },
+ "type": "module",
+ "bin": "./cli.mjs",
+ "files": [
+ "cli.mjs",
+ "dist"
+ ],
+ "scripts": {
+ "build": "tsdown",
+ "dev": "tsdown --watch",
+ "lint": "eslint ./ --pass-on-no-patterns --no-error-on-unmatched-pattern",
+ "lint:fix": "eslint ./ --fix"
+ },
+ "publishConfig": {
+ "access": "public",
+ "provenance": true
+ },
+ "readme": "./README.md"
+}
diff --git a/turbo/generators/templates/cli/src/index.ts b/turbo/generators/templates/cli/src/index.ts
new file mode 100644
index 00000000..8aca8f96
--- /dev/null
+++ b/turbo/generators/templates/cli/src/index.ts
@@ -0,0 +1,3 @@
+export async function run() {
+ console.info("running cli {{name}}");
+}
diff --git a/turbo/generators/templates/lib/tsconfig.json.hbs b/turbo/generators/templates/common/tsconfig.json
similarity index 100%
rename from turbo/generators/templates/lib/tsconfig.json.hbs
rename to turbo/generators/templates/common/tsconfig.json
diff --git a/turbo/generators/templates/lib/tsdown.config.ts.hbs b/turbo/generators/templates/common/tsdown.config.ts
similarity index 92%
rename from turbo/generators/templates/lib/tsdown.config.ts.hbs
rename to turbo/generators/templates/common/tsdown.config.ts
index f89b6d45..a1058fc6 100644
--- a/turbo/generators/templates/lib/tsdown.config.ts.hbs
+++ b/turbo/generators/templates/common/tsdown.config.ts
@@ -3,8 +3,9 @@ import { defineConfig } from "tsdown";
export default defineConfig({
attw: true,
dts: true,
- publint: true,
entry: ["src/index.ts"],
+ exports: true,
format: ["esm", "cjs"],
+ publint: true,
target: "esnext",
});
diff --git a/turbo/generators/templates/lib/typedoc.json b/turbo/generators/templates/common/typedoc.json
similarity index 100%
rename from turbo/generators/templates/lib/typedoc.json
rename to turbo/generators/templates/common/typedoc.json
diff --git a/turbo/generators/templates/env/package.json b/turbo/generators/templates/env/package.json
new file mode 100644
index 00000000..a817776c
--- /dev/null
+++ b/turbo/generators/templates/env/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@stephansama/{{name}}",
+ "version": "0.0.0",
+ "description": "{{description}}",
+ "homepage": "https://packages.stephansama.info/api/@stephansama/{{name}}",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/stephansama/packages.git",
+ "directory": "core/{{name}}"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Stephan Randle",
+ "email": "stephanrandle.dev@gmail.com",
+ "url": "https://stephansama.info"
+ },
+ "type": "module",
+ "files": [
+ "src"
+ ],
+ "scripts": {
+ "lint": "eslint ./src",
+ "lint:fix": "eslint ./src --fix"
+ },
+ "publishConfig": {
+ "access": "public",
+ "provenance": true
+ }
+}
diff --git a/turbo/generators/templates/env/src/env.d.ts b/turbo/generators/templates/env/src/env.d.ts
new file mode 100644
index 00000000..36090fae
--- /dev/null
+++ b/turbo/generators/templates/env/src/env.d.ts
@@ -0,0 +1,9 @@
+declare global {
+ namespace NodeJS {
+ interface ProcessEnv extends ExtendEnvironment {}
+ }
+}
+
+interface ExtendEnvironment {}
+
+export {};
diff --git a/turbo/generators/templates/lib/README.md.hbs b/turbo/generators/templates/lib/README.md
similarity index 87%
rename from turbo/generators/templates/lib/README.md.hbs
rename to turbo/generators/templates/lib/README.md
index 8b717c56..4da142ac 100644
--- a/turbo/generators/templates/lib/README.md.hbs
+++ b/turbo/generators/templates/lib/README.md
@@ -9,6 +9,13 @@
##### Table of contents
+Open Table of contents
+
+- [Installation](#installation)
+- [Usage](#usage)
+
+
+
## Installation
```sh
diff --git a/turbo/generators/templates/lib/package.json.hbs b/turbo/generators/templates/lib/package.json
similarity index 90%
rename from turbo/generators/templates/lib/package.json.hbs
rename to turbo/generators/templates/lib/package.json
index 400c4771..1f435e01 100644
--- a/turbo/generators/templates/lib/package.json.hbs
+++ b/turbo/generators/templates/lib/package.json
@@ -2,26 +2,28 @@
"name": "@stephansama/{{name}}",
"version": "0.0.0",
"description": "{{description}}",
+ "keywords": [
+ "{{name}}"
+ ],
+ "homepage": "https://packages.stephansama.info/api/@stephansama/{{name}}",
"repository": {
- "url": "https://github.com/stephansama/packages",
"type": "git",
+ "url": "https://github.com/stephansama/packages",
"directory": "core/{{name}}"
},
- "homepage": "https://packages.stephansama.info/api/@stephansama/{{name}}",
+ "license": "MIT",
"author": {
- "email": "stephanrandle.dev@gmail.com",
"name": "Stephan Randle",
+ "email": "stephanrandle.dev@gmail.com",
"url": "https://stephansama.info"
},
- "license": "MIT",
"type": "module",
"scripts": {
"build": "tsdown",
"dev": "tsdown --watch",
- "lint": "eslint ./ --pass-on-no-patterns --no-error-on-unmatched-pattern"
+ "lint": "eslint ./ --pass-on-no-patterns --no-error-on-unmatched-pattern",
+ "lint:fix": "eslint ./ --fix"
},
- "packageManager": "pnpm@10.11.0",
- "keywords": ["{{name}}"],
"dependencies": {},
"devDependencies": {
"tsdown": "catalog:"
diff --git a/turbo/generators/templates/lib/BLANK b/turbo/generators/templates/lib/src/index.ts
similarity index 100%
rename from turbo/generators/templates/lib/BLANK
rename to turbo/generators/templates/lib/src/index.ts
diff --git a/turbo/generators/utils/actions.ts b/turbo/generators/utils/actions.ts
new file mode 100644
index 00000000..27e0e092
--- /dev/null
+++ b/turbo/generators/utils/actions.ts
@@ -0,0 +1,29 @@
+import { PlopTypes } from "@turbo/gen";
+
+export function addTemplate({
+ type: templateType,
+}: {
+ type: "cli" | "env" | "lib";
+}) {
+ return {
+ base: `{{turbo.paths.root}}/turbo/generators/templates/${templateType}`,
+ destination: `{{ turbo.paths.root }}/core/{{ dashCase name }}`,
+ templateFiles: `{{turbo.paths.root}}/turbo/generators/templates/${templateType}/**`,
+ type: "addMany",
+ } as const satisfies PlopTypes.ActionType;
+}
+
+export const addAllCommon = {
+ base: `{{ turbo.paths.root }}/turbo/generators/templates/common`,
+ destination: `{{turbo.paths.root}}/core/{{dashCase name}}`,
+ templateFiles: `{{turbo.paths.root}}/turbo/generators/templates/common/**`,
+ type: "addMany",
+} as const;
+
+export function addCommonFile(file: S) {
+ return {
+ path: `{{ turbo.paths.root }}/core/{{ dashCase name }}/${file}`,
+ templateFile: `templates/common/${file}`,
+ type: "add",
+ } as const;
+}
diff --git a/turbo/generators/utils/index.ts b/turbo/generators/utils/index.ts
new file mode 100644
index 00000000..f7d6da44
--- /dev/null
+++ b/turbo/generators/utils/index.ts
@@ -0,0 +1,2 @@
+export * as actions from "./actions";
+export * as prompts from "./prompts";
diff --git a/turbo/generators/utils/prompts.ts b/turbo/generators/utils/prompts.ts
new file mode 100644
index 00000000..f8ae44df
--- /dev/null
+++ b/turbo/generators/utils/prompts.ts
@@ -0,0 +1,25 @@
+import type { PlopTypes } from "@turbo/gen";
+
+export const name = {
+ message: "What is the name of the new package?",
+ name: "name",
+ type: "input",
+ validate(input: string) {
+ if (input.includes(".")) {
+ return "library name cannot include an extension";
+ }
+ if (input.includes(" ")) {
+ return "library name cannot include spaces";
+ }
+ if (!input) {
+ return "library name is required";
+ }
+ return true;
+ },
+} as const satisfies PlopTypes.PromptQuestion;
+
+export const description = {
+ message: "What is the description of the new package?",
+ name: "description",
+ type: "input",
+} as const satisfies PlopTypes.PromptQuestion;