@kitschpatrol/create-project 1.2.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +16 -14
  3. package/readme.md +1 -2
  4. package/templates/cli/.gitattributes +2 -0
  5. package/templates/cli/.github/workflows/ci.yml +51 -0
  6. package/templates/cli/.github/workflows/github-release.yml +18 -6
  7. package/templates/cli/.github/workflows/set-github-metadata.yml +6 -3
  8. package/templates/cli/.prettierignore +1 -0
  9. package/templates/cli/.vscode/settings.json +3 -3
  10. package/templates/cli/mdat.config.ts +1 -3
  11. package/templates/cli/package.json +13 -10
  12. package/templates/cli/readme.md +0 -2
  13. package/templates/cli/src/index.ts +1 -1
  14. package/templates/cli/test/cli.test.ts +2 -1
  15. package/templates/cli/test/index.bench.ts +7 -0
  16. package/templates/cli/tsdown.config.ts +0 -2
  17. package/templates/cli+library/.gitattributes +2 -0
  18. package/templates/cli+library/.github/workflows/ci.yml +51 -0
  19. package/templates/cli+library/.github/workflows/github-release.yml +18 -6
  20. package/templates/cli+library/.github/workflows/set-github-metadata.yml +6 -3
  21. package/templates/cli+library/.prettierignore +1 -0
  22. package/templates/cli+library/.vscode/settings.json +3 -3
  23. package/templates/cli+library/mdat.config.ts +1 -3
  24. package/templates/cli+library/package.json +13 -10
  25. package/templates/cli+library/readme.md +0 -2
  26. package/templates/cli+library/src/lib/log.ts +2 -1
  27. package/templates/cli+library/test/cli.test.ts +3 -1
  28. package/templates/cli+library/test/index.bench.ts +7 -0
  29. package/templates/electron/.gitattributes +2 -0
  30. package/templates/electron/.github/workflows/ci.yml +51 -0
  31. package/templates/electron/.github/workflows/github-release.yml +18 -6
  32. package/templates/electron/.github/workflows/set-github-metadata.yml +6 -3
  33. package/templates/electron/.prettierignore +1 -0
  34. package/templates/electron/.vscode/settings.json +3 -3
  35. package/templates/electron/knip.config.ts +1 -0
  36. package/templates/electron/package.json +14 -11
  37. package/templates/electron/readme.md +0 -2
  38. package/templates/electron/test/index.bench.ts +7 -0
  39. package/templates/library/.gitattributes +2 -0
  40. package/templates/library/.github/workflows/ci.yml +51 -0
  41. package/templates/library/.github/workflows/github-release.yml +18 -6
  42. package/templates/library/.github/workflows/set-github-metadata.yml +6 -3
  43. package/templates/library/.prettierignore +1 -0
  44. package/templates/library/.vscode/settings.json +3 -3
  45. package/templates/library/package.json +12 -9
  46. package/templates/library/readme.md +0 -2
  47. package/templates/library/src/log.ts +2 -1
  48. package/templates/library/test/index.bench.ts +7 -0
  49. package/templates/minimal/.gitattributes +2 -0
  50. package/templates/minimal/.github/workflows/ci.yml +51 -0
  51. package/templates/minimal/.github/workflows/github-release.yml +18 -6
  52. package/templates/minimal/.github/workflows/set-github-metadata.yml +6 -3
  53. package/templates/minimal/.vscode/settings.json +3 -3
  54. package/templates/minimal/package.json +12 -5
  55. package/templates/minimal/readme.md +0 -2
  56. package/templates/unplugin/.gitattributes +2 -0
  57. package/templates/unplugin/.github/workflows/ci.yml +51 -0
  58. package/templates/unplugin/.github/workflows/github-release.yml +18 -6
  59. package/templates/unplugin/.github/workflows/set-github-metadata.yml +6 -3
  60. package/templates/unplugin/.prettierignore +1 -0
  61. package/templates/unplugin/.vscode/settings.json +3 -3
  62. package/templates/unplugin/eslint.config.ts +24 -7
  63. package/templates/unplugin/knip.config.ts +13 -1
  64. package/templates/unplugin/package.json +53 -11
  65. package/templates/unplugin/playground/env.d.ts +4 -0
  66. package/templates/unplugin/playground/index.html +23 -0
  67. package/templates/unplugin/playground/main.ts +1 -0
  68. package/templates/unplugin/playground/package.json +16 -0
  69. package/templates/unplugin/playground/readme.md +11 -0
  70. package/templates/unplugin/playground/vite.config.ts +16 -0
  71. package/templates/unplugin/pnpm-workspace.yaml +5 -1
  72. package/templates/unplugin/readme.md +0 -2
  73. package/templates/unplugin/src/bun.ts +20 -0
  74. package/templates/unplugin/src/core/options.ts +6 -4
  75. package/templates/unplugin/src/index.ts +10 -7
  76. package/templates/unplugin/test/index.bench.ts +7 -0
  77. package/templates/web/.gitattributes +2 -0
  78. package/templates/web/.github/workflows/ci.yml +51 -0
  79. package/templates/web/.github/workflows/github-release.yml +18 -6
  80. package/templates/web/.github/workflows/set-github-metadata.yml +6 -3
  81. package/templates/web/.prettierignore +2 -0
  82. package/templates/web/.vscode/settings.json +3 -3
  83. package/templates/web/package.json +20 -11
  84. package/templates/web/readme.md +0 -2
  85. package/templates/web/test/index.bench.ts +7 -0
  86. package/templates/cli/.npmrc +0 -2
  87. package/templates/cli+library/.npmrc +0 -2
  88. package/templates/electron/.npmrc +0 -2
  89. package/templates/library/.npmrc +0 -2
  90. package/templates/minimal/.npmrc +0 -2
  91. package/templates/unplugin/.npmrc +0 -2
  92. package/templates/web/.npmrc +0 -2
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{createTemplate as e,runTemplateCLI as t}from"bingo";import{intakeDirectory as n}from"bingo-fs";import{handlebars as r}from"bingo-handlebars";import i from"node:path";import{z as a}from"zod";var o=e({about:{description:`Create a new TypeScript library, CLI, or web project with Kitschpatrol's shared configuration.`,name:`Create Kitschpatrol Project`},options:{type:a.enum([`minimal`,`web`,`cli`,`library`,`cli+library`,`electron`,`unplugin`]).default(`minimal`).describe(`The type of project to create`),"author-name":a.string().default(`Eric Mika`).describe(`The name of the author`),"author-email":a.string().default(`eric@ericmika.com`).describe(`The email of the author`),"author-url":a.string().default(`https://ericmika.com`).describe(`The URL of the author`),"cli-command-name":a.string().default(`new-project`).describe(`CLI command name (if applicable)`),"github-owner":a.string().default(`kitschpatrol`).describe(`The owner of the repository`),"github-repository":a.string().default(`new-project`).describe(`The name of the repository / package`),"npm-auth-command":a.string().default(`op read 'op://Personal/npm/token'`).describe(`A shell command that sets the NPM_AUTH_TOKEN env variable with a granular token for publishing to npm`)},async produce({options:e}){let t={...e,year:new Date().getFullYear()};async function a(...n){let a={};for(let o of n)a[o]=await r(i.join(import.meta.dirname,`../templates/${e.type}/${o}`),t);return a}return{files:{...await n(i.join(import.meta.dirname,`../templates/${e.type}`),{exclude:/node_modules|pnpm-lock\.yaml/}),...await a(`license.txt`,`package.json`,...e.type===`unplugin`?[`src/esbuild.ts`,`src/farm.ts`,`src/index.ts`,`src/rolldown.ts`,`src/rollup.ts`,`src/rspack.ts`,`src/vite.ts`,`src/webpack.ts`,`src/webpack.ts`,`tests/__snapshots__/rollup.test.ts.snap`]:[])},scripts:[{commands:e.type===`electron`?[`pnpm install`,`pnpm run fix`]:[`pnpm install`,`pnpm run build`,`pnpm run fix`],phase:0,silent:!0}],suggestions:[`git commit --amend -m 'Initial commit.'`]}}});process.exitCode=await t(o);export{};
2
+ import{createTemplate as e,runTemplateCLI as t}from"bingo";import{intakeDirectory as n}from"bingo-fs";import{handlebars as r}from"bingo-handlebars";import i from"node:path";import{z as a}from"zod";const o=[`minimal`,`web`,`cli`,`library`,`cli+library`,`electron`,`unplugin`],s=/node_modules|pnpm-lock\.yaml/;var c=e({about:{description:`Create a new TypeScript library, CLI, or web project with Kitschpatrol's shared configuration.`,name:`Create Kitschpatrol Project`},options:{type:a.enum(o).default(`minimal`).describe(`The type of project to create`),"author-name":a.string().default(`Eric Mika`).describe(`The name of the author`),"author-email":a.string().default(`eric@ericmika.com`).describe(`The email of the author`),"author-url":a.string().default(`https://ericmika.com`).describe(`The URL of the author`),"cli-command-name":a.string().default(`new-project`).describe(`CLI command name (if applicable)`),"github-owner":a.string().default(`kitschpatrol`).describe(`The owner of the repository`),"github-repository":a.string().default(`new-project`).describe(`The name of the repository / package`),"npm-auth-command":a.string().default(`op read 'op://Personal/npm/token'`).describe(`A shell command that sets the NPM_AUTH_TOKEN env variable with a granular token for publishing to npm`)},async produce({options:e}){let t={...e,year:new Date().getFullYear()};async function a(...n){let a={};for(let o of n)a[o]=await r(i.join(import.meta.dirname,`../templates/${e.type}/${o}`),t);return a}return{files:{...await n(i.join(import.meta.dirname,`../templates/${e.type}`),{exclude:s}),...await a(`license.txt`,`package.json`,...e.type===`unplugin`?[`playground/package.json`,`src/bun.ts`,`src/esbuild.ts`,`src/farm.ts`,`src/index.ts`,`src/rolldown.ts`,`src/rollup.ts`,`src/rspack.ts`,`src/vite.ts`,`src/webpack.ts`,`test/__snapshots__/rollup.test.ts.snap`]:[])},scripts:[{commands:e.type===`electron`?[`pnpm install`,`pnpm run fix`]:[`pnpm install`,`pnpm run build`,`pnpm run fix`],phase:0,silent:!0}],suggestions:[`git commit --amend -m 'Initial commit.'`]}}});process.exitCode=await t(c);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitschpatrol/create-project",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "description": "Kitschpatrol's TypeScript project templates.",
5
5
  "keywords": [
6
6
  "cli",
@@ -26,7 +26,7 @@
26
26
  "dist",
27
27
  "templates",
28
28
  "templates/**/.gitignore",
29
- "templates/**/.npmrc"
29
+ "!**/node_modules"
30
30
  ],
31
31
  "dependencies": {
32
32
  "bingo": "^0.9.2",
@@ -35,14 +35,15 @@
35
35
  "zod": "^3.25.76"
36
36
  },
37
37
  "devDependencies": {
38
- "@kitschpatrol/shared-config": "^6.0.2",
39
- "@types/node": "~20.19.35",
40
- "bumpp": "^10.4.1",
41
- "mdat": "^1.4.0",
42
- "taze": "^19.10.0",
43
- "tsdown": "^0.21.0",
38
+ "@kitschpatrol/shared-config": "^7.2.0",
39
+ "@types/node": "~20.19.39",
40
+ "bumpp": "^11.0.1",
41
+ "mdat": "^2.2.1",
42
+ "shx": "^0.4.0",
43
+ "taze": "^19.11.0",
44
+ "tsdown": "^0.21.7",
44
45
  "typescript": "~5.9.3",
45
- "vitest": "^4.0.18"
46
+ "vitest": "^4.1.4"
46
47
  },
47
48
  "engines": {
48
49
  "node": ">=20.19.0"
@@ -58,11 +59,12 @@
58
59
  },
59
60
  "scripts": {
60
61
  "build": "tsdown",
61
- "clean": "git rm -f pnpm-lock.yaml ; git clean -fdX",
62
- "fix": "ksc fix",
63
- "lint": "ksc-repo lint ; mdat readme check readme.md ; ksc-typescript lint ; ksc-eslint lint ; ksc-stylelint lint ; ksc-cspell lint ; ksc-knip lint ; ksc-prettier lint",
64
- "release": "bumpp --commit 'Release: %s' && pnpm run build && NPM_AUTH_TOKEN=$(op read 'op://Personal/npm/token') && pnpm publish",
62
+ "clean": "shx rm -f pnpm-lock.yaml && git clean -fdX -e !.claude/",
63
+ "fix": "ksc fix --skip mdat && mdat readme.md",
64
+ "lint": "ksc fix --skip mdat",
65
+ "release": "bumpp --commit 'Release: %s' && pnpm build && NPM_AUTH_TOKEN=$(op read 'op://Personal/npm/token') && pnpm publish",
65
66
  "test": "vitest run",
66
- "update-templates": "for dir in ./templates/*; do taze -w --cwd \"$dir\"; done"
67
+ "update-templates": "for dir in ./templates/*; do taze -w --cwd \"$dir\"; done",
68
+ "update-templates-major": "for dir in ./templates/*; do taze major -w --cwd \"$dir\" --exclude @types/node,typescript,zod,vite; done"
67
69
  }
68
70
  }
package/readme.md CHANGED
@@ -1,5 +1,3 @@
1
- <!--+ Warning: Content inside HTML comment blocks was generated by mdat and may be overwritten. +-->
2
-
3
1
  <!-- title -->
4
2
 
5
3
  # @kitschpatrol/create-project
@@ -10,6 +8,7 @@
10
8
 
11
9
  [![NPM Package @kitschpatrol/create-project](https://img.shields.io/npm/v/@kitschpatrol/create-project.svg)](https://npmjs.com/package/@kitschpatrol/create-project)
12
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
11
+ [![CI](https://github.com/kitschpatrol/create-project/actions/workflows/ci.yml/badge.svg)](https://github.com/kitschpatrol/create-project/actions/workflows/ci.yml)
13
12
 
14
13
  <!-- /badges -->
15
14
 
@@ -0,0 +1,2 @@
1
+ # Enforce LF line endings across platforms
2
+ * text=auto eol=lf
@@ -0,0 +1,51 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request: {}
7
+ workflow_dispatch: {}
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
14
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
15
+
16
+ jobs:
17
+ ci:
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 20
20
+
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os: [ubuntu-latest, macos-latest, windows-latest]
25
+
26
+ steps:
27
+ - name: Checkout
28
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
29
+ with:
30
+ persist-credentials: false
31
+
32
+ - name: Install pnpm
33
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5
34
+
35
+ - name: Setup Node.js
36
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
37
+ with:
38
+ node-version: 24
39
+ cache: 'pnpm'
40
+
41
+ - name: Install dependencies
42
+ run: pnpm install --frozen-lockfile
43
+
44
+ - name: Build
45
+ run: pnpm run build
46
+
47
+ - name: Lint
48
+ run: pnpm run lint
49
+
50
+ - name: Test
51
+ run: pnpm run test
@@ -4,6 +4,10 @@ on:
4
4
  push:
5
5
  tags:
6
6
  - 'v[0-9]*'
7
+ - '[0-9]*'
8
+
9
+ permissions:
10
+ contents: write
7
11
 
8
12
  jobs:
9
13
  build:
@@ -16,13 +20,17 @@ jobs:
16
20
 
17
21
  steps:
18
22
  - name: Checkout
19
- uses: actions/checkout@v6
23
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
20
24
  with:
21
25
  fetch-depth: 0
26
+ persist-credentials: false
22
27
 
23
28
  - name: Log Token Type
29
+ env:
30
+ TOKEN: ${{ env.ACCESS_TOKEN }}
31
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24
32
  run: |
25
- if [ ${{ env.ACCESS_TOKEN }} == ${{ secrets.GITHUB_TOKEN }} ]; then
33
+ if [ "$TOKEN" = "$GH_TOKEN" ]; then
26
34
  echo "🗝️ Authenticated with GitHub Token"
27
35
  else
28
36
  echo "🔑 Authenticated with Personal Access token"
@@ -31,7 +39,7 @@ jobs:
31
39
  - name: Validate Tag and Branch
32
40
  id: validation
33
41
  run: |
34
- TAG=$(git tag --contains HEAD | grep '^v[0-9]' | head -n 1)
42
+ TAG=$(git tag --contains HEAD | grep -E '^v?[0-9]' | head -n 1)
35
43
  echo "🏷️ Tag for commit is: $TAG"
36
44
  BRANCH=$(git branch -r --contains tags/${GITHUB_REF_NAME} | grep 'origin/main' | xargs)
37
45
  if [[ -z "$BRANCH" ]]; then
@@ -75,7 +83,11 @@ jobs:
75
83
 
76
84
  - name: Log Release Details
77
85
  if: env.IS_VALID_COMMIT == 'true'
86
+ env:
87
+ TAG: ${{ env.TAG_NAME }}
88
+ RELEASE_URL: ${{ steps.release.outputs.url }}
89
+ RELEASE_ID: ${{ steps.release.outputs.id }}
78
90
  run: |
79
- echo "📦 Successfully released: ${{ env.TAG_NAME }}"
80
- echo "🔗 Release URL: ${{ steps.release.outputs.url }}"
81
- echo "🪪 Release ID: ${{ steps.release.outputs.id }}"
91
+ echo "📦 Successfully released: $TAG"
92
+ echo "🔗 Release URL: $RELEASE_URL"
93
+ echo "🪪 Release ID: $RELEASE_ID"
@@ -4,6 +4,9 @@ on:
4
4
  branches: [main]
5
5
  workflow_dispatch: {}
6
6
 
7
+ permissions:
8
+ contents: read
9
+
7
10
  jobs:
8
11
  build:
9
12
  name: Set GitHub Metadata
@@ -11,11 +14,11 @@ jobs:
11
14
 
12
15
  steps:
13
16
  - name: Checkout
14
- uses: actions/checkout@v6
17
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
15
18
  with:
16
- fetch-depth: 0
19
+ persist-credentials: false
17
20
 
18
21
  - name: Sync Package info to GitHub
19
- uses: kitschpatrol/github-action-repo-sync@v4
22
+ uses: kitschpatrol/github-action-repo-sync@v5
20
23
  with:
21
24
  TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
@@ -6,3 +6,4 @@ pnpm-lock.yaml
6
6
  package-lock.json
7
7
 
8
8
  # Customizations
9
+ test/benchmarks/baseline.json
@@ -50,7 +50,7 @@
50
50
  ".env": ".env.*, .template.env",
51
51
  "*.js": "${basename}.ts.map, ${basename}.js.map, ${basename}.d.ts, ${basename}.d.ts.map, ${basename}.d.js.map",
52
52
  "*.ts": "${basename}.ts.map, ${basename}.d.ts, ${basename}.d.ts.map",
53
- "package.json": ".*.cjs, .*.cts, .*.js, .*.json, .*.json5, .*.jsonc, .*.mjs, .*.mts, .*.toml, .*.ts, .*.yaml, .*.yml, .*ignore, .*rc, .node-version, *config.cjs, *config.cts, *config.js, *config.json, *config.json5, *config.jsonc, *config.mjs, *config.mts, *config.toml, *config.ts, *config.yaml, *config.yml, tsconfig.*.json, lerna.json, netlify.toml, package-lock.json, pnpm*, turbo.json, vercel.json, workspace*, wrangler.toml, wrangler.json, wrangler.jsonc, yarn.lock, yarn*",
53
+ "package.json": ".*.cjs, .*.cts, .*.js, .*.json, .*.json5, .*.jsonc, .*.mjs, .*.mts, .*.toml, .*.ts, .*.yaml, .*.yml, .*attributes, .*ignore, .*rc, .node-version, *config.cjs, *config.cts, *config.js, *config.json, *config.json5, *config.jsonc, *config.mjs, *config.mts, *config.toml, *config.ts, *config.yaml, *config.yml, tsconfig.*.json, lerna.json, netlify.toml, package-lock.json, pnpm*, skills-lock.json, turbo.json, vercel.json, workspace*, wrangler.toml, wrangler.json, wrangler.jsonc, yarn.lock, yarn*",
54
54
  "readme.md": "authors*, backers*, changelog*, citation*, code_of_conduct*, contributing*, contributors*, copying*, credits*, governance*, history*, license*, maintainers*, release_notes*, security*, sponsors*"
55
55
  },
56
56
  "prettier.documentSelectors": [
@@ -65,6 +65,6 @@
65
65
  "prettier.enable": true,
66
66
  "stylelint.enable": true,
67
67
  "stylelint.validate": ["css", "html", "svelte", "astro"],
68
- "typescript.enablePromptUseWorkspaceTsdk": true,
69
- "typescript.tsdk": "node_modules/typescript/lib"
68
+ "js/ts.tsdk.promptToUseWorkspaceVersion": true,
69
+ "js/ts.tsdk.path": "node_modules/typescript/lib"
70
70
  }
@@ -2,7 +2,5 @@ import { mdatConfig } from '@kitschpatrol/mdat-config'
2
2
  import cliHelpPlugin from 'mdat-plugin-cli-help'
3
3
 
4
4
  export default mdatConfig({
5
- rules: {
6
- ...cliHelpPlugin,
7
- },
5
+ ...cliHelpPlugin,
8
6
  })
@@ -27,29 +27,32 @@
27
27
  "dist/*"
28
28
  ],
29
29
  "scripts": {
30
+ "bench": "vitest bench --run --compare test/benchmarks/baseline.json",
31
+ "bench:baseline": "vitest bench --run --outputJson test/benchmarks/baseline.json",
30
32
  "build": "tsdown",
31
- "clean": "git rm -f pnpm-lock.yaml ; git clean -fdX",
33
+ "clean": "shx rm -f pnpm-lock.yaml && git clean -fdX -e !.claude/",
32
34
  "fix": "ksc fix",
33
35
  "lint": "ksc lint",
34
- "release": "bumpp --commit 'Release: %s' && pnpm run build && NPM_AUTH_TOKEN=$({{{npm-auth-command}}}) && pnpm publish",
36
+ "release": "bumpp --commit 'Release: %s' && pnpm build && NPM_AUTH_TOKEN=$({{{npm-auth-command}}}) && pnpm publish",
35
37
  "test": "vitest run"
36
38
  },
37
39
  "dependencies": {
38
- "@types/node": "~20.19.35",
40
+ "@types/node": "~20.19.39",
39
41
  "@types/yargs": "^17.0.35",
40
- "lognow": "^0.5.2",
42
+ "lognow": "^0.6.1",
41
43
  "yargs": "^18.0.0"
42
44
  },
43
45
  "devDependencies": {
44
- "@kitschpatrol/shared-config": "^6.0.2",
45
- "bumpp": "^10.4.1",
46
- "mdat-plugin-cli-help": "^1.0.7",
46
+ "@kitschpatrol/shared-config": "^7.2.0",
47
+ "bumpp": "^11.0.1",
48
+ "mdat-plugin-cli-help": "^2.1.2",
47
49
  "publint": "^0.3.18",
48
- "tsdown": "^0.21.0",
50
+ "shx": "^0.4.0",
51
+ "tsdown": "^0.21.7",
49
52
  "typescript": "~5.9.3",
50
- "vitest": "^4.0.18"
53
+ "vitest": "^4.1.4"
51
54
  },
52
- "packageManager": "pnpm@10.30.3",
55
+ "packageManager": "pnpm@10.33.0",
53
56
  "engines": {
54
57
  "node": ">=20.19.0"
55
58
  },
@@ -1,5 +1,3 @@
1
- <!--+ Warning: Content inside HTML comment blocks was generated by mdat and may be overwritten. +-->
2
-
3
1
  <!-- title -->
4
2
 
5
3
  <!-- badges -->
@@ -3,7 +3,7 @@
3
3
  import { log, setDefaultLogOptions } from 'lognow'
4
4
  import yargs from 'yargs'
5
5
  import { hideBin } from 'yargs/helpers'
6
- import { bin, version } from '../package.json'
6
+ import { bin, version } from '../package.json' with { type: 'json' }
7
7
 
8
8
  const cliCommandName = Object.keys(bin).at(0)!
9
9
  const yargsInstance = yargs(hideBin(process.argv))
@@ -18,11 +18,12 @@ async function run(...args: string[]): Promise<{ code: number; stderr: string; s
18
18
  })
19
19
  }
20
20
 
21
+ const VERSION_REGEX = /\d+\.\d+\.\d+/
21
22
  describe('cli', () => {
22
23
  it('should print version with --version', async () => {
23
24
  const { code, stdout } = await run('--version')
24
25
  expect(code).toBe(0)
25
- expect(stdout.trim()).toMatch(/\d+\.\d+\.\d+/)
26
+ expect(stdout.trim()).toMatch(VERSION_REGEX)
26
27
  })
27
28
 
28
29
  it('should print help with --help', async () => {
@@ -0,0 +1,7 @@
1
+ import { bench, describe } from 'vitest'
2
+
3
+ describe('placeholder', () => {
4
+ bench('should pass', () => {
5
+ // Placeholder
6
+ })
7
+ })
@@ -5,10 +5,8 @@ export default defineConfig({
5
5
  alwaysBundle: /.+/,
6
6
  },
7
7
  dts: false,
8
- entry: 'src/bin/cli.ts',
9
8
  fixedExtension: false,
10
9
  minify: true,
11
- outDir: 'dist/bin',
12
10
  platform: 'node',
13
11
  publint: true,
14
12
  })
@@ -0,0 +1,2 @@
1
+ # Enforce LF line endings across platforms
2
+ * text=auto eol=lf
@@ -0,0 +1,51 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request: {}
7
+ workflow_dispatch: {}
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
14
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
15
+
16
+ jobs:
17
+ ci:
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 20
20
+
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os: [ubuntu-latest, macos-latest, windows-latest]
25
+
26
+ steps:
27
+ - name: Checkout
28
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
29
+ with:
30
+ persist-credentials: false
31
+
32
+ - name: Install pnpm
33
+ uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5
34
+
35
+ - name: Setup Node.js
36
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
37
+ with:
38
+ node-version: 24
39
+ cache: 'pnpm'
40
+
41
+ - name: Install dependencies
42
+ run: pnpm install --frozen-lockfile
43
+
44
+ - name: Build
45
+ run: pnpm run build
46
+
47
+ - name: Lint
48
+ run: pnpm run lint
49
+
50
+ - name: Test
51
+ run: pnpm run test
@@ -4,6 +4,10 @@ on:
4
4
  push:
5
5
  tags:
6
6
  - 'v[0-9]*'
7
+ - '[0-9]*'
8
+
9
+ permissions:
10
+ contents: write
7
11
 
8
12
  jobs:
9
13
  build:
@@ -16,13 +20,17 @@ jobs:
16
20
 
17
21
  steps:
18
22
  - name: Checkout
19
- uses: actions/checkout@v6
23
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
20
24
  with:
21
25
  fetch-depth: 0
26
+ persist-credentials: false
22
27
 
23
28
  - name: Log Token Type
29
+ env:
30
+ TOKEN: ${{ env.ACCESS_TOKEN }}
31
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24
32
  run: |
25
- if [ ${{ env.ACCESS_TOKEN }} == ${{ secrets.GITHUB_TOKEN }} ]; then
33
+ if [ "$TOKEN" = "$GH_TOKEN" ]; then
26
34
  echo "🗝️ Authenticated with GitHub Token"
27
35
  else
28
36
  echo "🔑 Authenticated with Personal Access token"
@@ -31,7 +39,7 @@ jobs:
31
39
  - name: Validate Tag and Branch
32
40
  id: validation
33
41
  run: |
34
- TAG=$(git tag --contains HEAD | grep '^v[0-9]' | head -n 1)
42
+ TAG=$(git tag --contains HEAD | grep -E '^v?[0-9]' | head -n 1)
35
43
  echo "🏷️ Tag for commit is: $TAG"
36
44
  BRANCH=$(git branch -r --contains tags/${GITHUB_REF_NAME} | grep 'origin/main' | xargs)
37
45
  if [[ -z "$BRANCH" ]]; then
@@ -75,7 +83,11 @@ jobs:
75
83
 
76
84
  - name: Log Release Details
77
85
  if: env.IS_VALID_COMMIT == 'true'
86
+ env:
87
+ TAG: ${{ env.TAG_NAME }}
88
+ RELEASE_URL: ${{ steps.release.outputs.url }}
89
+ RELEASE_ID: ${{ steps.release.outputs.id }}
78
90
  run: |
79
- echo "📦 Successfully released: ${{ env.TAG_NAME }}"
80
- echo "🔗 Release URL: ${{ steps.release.outputs.url }}"
81
- echo "🪪 Release ID: ${{ steps.release.outputs.id }}"
91
+ echo "📦 Successfully released: $TAG"
92
+ echo "🔗 Release URL: $RELEASE_URL"
93
+ echo "🪪 Release ID: $RELEASE_ID"
@@ -4,6 +4,9 @@ on:
4
4
  branches: [main]
5
5
  workflow_dispatch: {}
6
6
 
7
+ permissions:
8
+ contents: read
9
+
7
10
  jobs:
8
11
  build:
9
12
  name: Set GitHub Metadata
@@ -11,11 +14,11 @@ jobs:
11
14
 
12
15
  steps:
13
16
  - name: Checkout
14
- uses: actions/checkout@v6
17
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
15
18
  with:
16
- fetch-depth: 0
19
+ persist-credentials: false
17
20
 
18
21
  - name: Sync Package info to GitHub
19
- uses: kitschpatrol/github-action-repo-sync@v4
22
+ uses: kitschpatrol/github-action-repo-sync@v5
20
23
  with:
21
24
  TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
@@ -6,3 +6,4 @@ pnpm-lock.yaml
6
6
  package-lock.json
7
7
 
8
8
  # Customizations
9
+ test/benchmarks/baseline.json
@@ -50,7 +50,7 @@
50
50
  ".env": ".env.*, .template.env",
51
51
  "*.js": "${basename}.ts.map, ${basename}.js.map, ${basename}.d.ts, ${basename}.d.ts.map, ${basename}.d.js.map",
52
52
  "*.ts": "${basename}.ts.map, ${basename}.d.ts, ${basename}.d.ts.map",
53
- "package.json": ".*.cjs, .*.cts, .*.js, .*.json, .*.json5, .*.jsonc, .*.mjs, .*.mts, .*.toml, .*.ts, .*.yaml, .*.yml, .*ignore, .*rc, .node-version, *config.cjs, *config.cts, *config.js, *config.json, *config.json5, *config.jsonc, *config.mjs, *config.mts, *config.toml, *config.ts, *config.yaml, *config.yml, tsconfig.*.json, lerna.json, netlify.toml, package-lock.json, pnpm*, turbo.json, vercel.json, workspace*, wrangler.toml, wrangler.json, wrangler.jsonc, yarn.lock, yarn*",
53
+ "package.json": ".*.cjs, .*.cts, .*.js, .*.json, .*.json5, .*.jsonc, .*.mjs, .*.mts, .*.toml, .*.ts, .*.yaml, .*.yml, .*attributes, .*ignore, .*rc, .node-version, *config.cjs, *config.cts, *config.js, *config.json, *config.json5, *config.jsonc, *config.mjs, *config.mts, *config.toml, *config.ts, *config.yaml, *config.yml, tsconfig.*.json, lerna.json, netlify.toml, package-lock.json, pnpm*, skills-lock.json, turbo.json, vercel.json, workspace*, wrangler.toml, wrangler.json, wrangler.jsonc, yarn.lock, yarn*",
54
54
  "readme.md": "authors*, backers*, changelog*, citation*, code_of_conduct*, contributing*, contributors*, copying*, credits*, governance*, history*, license*, maintainers*, release_notes*, security*, sponsors*"
55
55
  },
56
56
  "prettier.documentSelectors": [
@@ -65,6 +65,6 @@
65
65
  "prettier.enable": true,
66
66
  "stylelint.enable": true,
67
67
  "stylelint.validate": ["css", "html", "svelte", "astro"],
68
- "typescript.enablePromptUseWorkspaceTsdk": true,
69
- "typescript.tsdk": "node_modules/typescript/lib"
68
+ "js/ts.tsdk.promptToUseWorkspaceVersion": true,
69
+ "js/ts.tsdk.path": "node_modules/typescript/lib"
70
70
  }
@@ -2,7 +2,5 @@ import { mdatConfig } from '@kitschpatrol/mdat-config'
2
2
  import cliHelpPlugin from 'mdat-plugin-cli-help'
3
3
 
4
4
  export default mdatConfig({
5
- rules: {
6
- ...cliHelpPlugin,
7
- },
5
+ ...cliHelpPlugin,
8
6
  })
@@ -36,30 +36,33 @@
36
36
  "dist/*"
37
37
  ],
38
38
  "scripts": {
39
+ "bench": "vitest bench --run --compare test/benchmarks/baseline.json",
40
+ "bench:baseline": "vitest bench --run --outputJson test/benchmarks/baseline.json",
39
41
  "build": "tsdown",
40
- "clean": "git rm -f pnpm-lock.yaml ; git clean -fdX",
42
+ "clean": "shx rm -f pnpm-lock.yaml && git clean -fdX -e !.claude/",
41
43
  "fix": "ksc fix",
42
44
  "lint": "ksc lint",
43
- "release": "bumpp --commit 'Release: %s' && pnpm run build && NPM_AUTH_TOKEN=$({{{npm-auth-command}}}) && pnpm publish",
45
+ "release": "bumpp --commit 'Release: %s' && pnpm build && NPM_AUTH_TOKEN=$({{{npm-auth-command}}}) && pnpm publish",
44
46
  "test": "vitest run"
45
47
  },
46
48
  "dependencies": {
47
- "@types/node": "~20.19.35",
49
+ "@types/node": "~20.19.39",
48
50
  "@types/yargs": "^17.0.35",
49
- "lognow": "^0.5.2",
51
+ "lognow": "^0.6.1",
50
52
  "yargs": "^18.0.0"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@arethetypeswrong/core": "^0.18.2",
54
- "@kitschpatrol/shared-config": "^6.0.2",
55
- "bumpp": "^10.4.1",
56
- "mdat-plugin-cli-help": "^1.0.7",
56
+ "@kitschpatrol/shared-config": "^7.2.0",
57
+ "bumpp": "^11.0.1",
58
+ "mdat-plugin-cli-help": "^2.1.2",
57
59
  "publint": "^0.3.18",
58
- "tsdown": "^0.21.0",
60
+ "shx": "^0.4.0",
61
+ "tsdown": "^0.21.7",
59
62
  "typescript": "~5.9.3",
60
- "vitest": "^4.0.18"
63
+ "vitest": "^4.1.4"
61
64
  },
62
- "packageManager": "pnpm@10.30.3",
65
+ "packageManager": "pnpm@10.33.0",
63
66
  "engines": {
64
67
  "node": ">=20.19.0"
65
68
  },
@@ -1,5 +1,3 @@
1
- <!--+ Warning: Content inside HTML comment blocks was generated by mdat and may be overwritten. +-->
2
-
3
1
  <!-- title -->
4
2
 
5
3
  <!-- badges -->
@@ -1,10 +1,11 @@
1
1
  import type { ILogBasic, ILogLayer } from 'lognow'
2
2
  import { createLogger, injectionHelper } from 'lognow'
3
+ import { name } from '../../package.json' with { type: 'json' }
3
4
 
4
5
  /**
5
6
  * The default logger instance for the library.
6
7
  */
7
- export let log = createLogger()
8
+ export let log = createLogger(name)
8
9
 
9
10
  /**
10
11
  * Set the logger instance for the module.
@@ -18,11 +18,13 @@ async function run(...args: string[]): Promise<{ code: number; stderr: string; s
18
18
  })
19
19
  }
20
20
 
21
+ const VERSION_REGEX = /\d+\.\d+\.\d+/
22
+
21
23
  describe('cli', () => {
22
24
  it('should print version with --version', async () => {
23
25
  const { code, stdout } = await run('--version')
24
26
  expect(code).toBe(0)
25
- expect(stdout.trim()).toMatch(/\d+\.\d+\.\d+/)
27
+ expect(stdout.trim()).toMatch(VERSION_REGEX)
26
28
  })
27
29
 
28
30
  it('should print help with --help', async () => {
@@ -0,0 +1,7 @@
1
+ import { bench, describe } from 'vitest'
2
+
3
+ describe('placeholder', () => {
4
+ bench('should pass', () => {
5
+ // Placeholder
6
+ })
7
+ })
@@ -0,0 +1,2 @@
1
+ # Enforce LF line endings across platforms
2
+ * text=auto eol=lf