create-typescript-app 1.57.1 → 1.57.3
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.
- package/README.md +1 -1
- package/lib/create/createRerunSuggestion.js +1 -1
- package/lib/create/createRerunSuggestion.js.map +1 -1
- package/lib/shared/options/augmentOptionsWithExcludes.d.ts +2 -4
- package/lib/shared/options/augmentOptionsWithExcludes.js +8 -116
- package/lib/shared/options/augmentOptionsWithExcludes.js.map +1 -1
- package/lib/shared/options/exclusionKeys.d.ts +15 -0
- package/lib/shared/options/exclusionKeys.js +122 -0
- package/lib/shared/options/exclusionKeys.js.map +1 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ Thanks! 💖
|
|
|
77
77
|
<td align="center" valign="top" width="14.28%"><a href="https://roe.dev/"><img src="https://avatars.githubusercontent.com/u/28706372?v=4?s=100" width="100px;" alt="Daniel Roe"/><br /><sub><b>Daniel Roe</b></sub></a><br /><a href="https://github.com/JoshuaKGoldberg/create-typescript-app/commits?author=danielroe" title="Code">💻</a></td>
|
|
78
78
|
</tr>
|
|
79
79
|
<tr>
|
|
80
|
-
<td align="center" valign="top" width="14.28%"><a href="https://linktr.ee/DemianParkhomenko"><img src="https://avatars.githubusercontent.com/u/95881717?v=4?s=100" width="100px;" alt="Demian Parkhomenko"/><br /><sub><b>Demian Parkhomenko</b></sub></a><br /><a href="https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=author%3Ademianparkhomenko" title="Bug reports">🐛</a></td>
|
|
80
|
+
<td align="center" valign="top" width="14.28%"><a href="https://linktr.ee/DemianParkhomenko"><img src="https://avatars.githubusercontent.com/u/95881717?v=4?s=100" width="100px;" alt="Demian Parkhomenko"/><br /><sub><b>Demian Parkhomenko</b></sub></a><br /><a href="https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=author%3Ademianparkhomenko" title="Bug reports">🐛</a> <a href="https://github.com/JoshuaKGoldberg/create-typescript-app/commits?author=demianparkhomenko" title="Code">💻</a></td>
|
|
81
81
|
<td align="center" valign="top" width="14.28%"><a href="https://dominicduffin.uk"><img src="https://avatars.githubusercontent.com/u/26224873?v=4?s=100" width="100px;" alt="Dominic Duffin"/><br /><sub><b>Dominic Duffin</b></sub></a><br /><a href="https://github.com/JoshuaKGoldberg/create-typescript-app/commits?author=dominicduffin1" title="Code">💻</a></td>
|
|
82
82
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nowyDEV"><img src="https://avatars.githubusercontent.com/u/12304307?v=4?s=100" width="100px;" alt="Dominik Nowik"/><br /><sub><b>Dominik Nowik</b></sub></a><br /><a href="#tool-nowyDEV" title="Tools">🔧</a> <a href="https://github.com/JoshuaKGoldberg/create-typescript-app/commits?author=nowyDEV" title="Code">💻</a> <a href="#ideas-nowyDEV" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
83
83
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emday4prez"><img src="https://avatars.githubusercontent.com/u/35363144?v=4?s=100" width="100px;" alt="Emerson"/><br /><sub><b>Emerson</b></sub></a><br /><a href="https://github.com/JoshuaKGoldberg/create-typescript-app/commits?author=emday4prez" title="Code">💻</a></td>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { allArgOptions } from "../shared/options/args.js";
|
|
2
2
|
import {
|
|
3
3
|
getExclusions
|
|
4
|
-
} from "../shared/options/
|
|
4
|
+
} from "../shared/options/exclusionKeys.js";
|
|
5
5
|
function getFirstMatchingArg(key) {
|
|
6
6
|
return Object.keys(allArgOptions).find(
|
|
7
7
|
(arg) => arg.replaceAll("-", "") === key.toLowerCase()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create/createRerunSuggestion.ts"],"sourcesContent":["import { allArgOptions } from \"../shared/options/args.js\";\nimport {\n\tExclusionKey,\n\tgetExclusions,\n} from \"../shared/options/
|
|
1
|
+
{"version":3,"sources":["../../src/create/createRerunSuggestion.ts"],"sourcesContent":["import { allArgOptions } from \"../shared/options/args.js\";\nimport {\n\tExclusionKey,\n\tgetExclusions,\n} from \"../shared/options/exclusionKeys.js\";\nimport { Options } from \"../shared/types.js\";\n\nfunction getFirstMatchingArg(key: string) {\n\treturn Object.keys(allArgOptions).find(\n\t\t(arg) => arg.replaceAll(\"-\", \"\") === key.toLowerCase(),\n\t);\n}\n\nexport function createRerunSuggestion(options: Partial<Options>): string {\n\tconst optionsNormalized = {\n\t\t...options,\n\t\temail: undefined,\n\t\t...(options.email && {\n\t\t\temailGitHub: options.email.github,\n\t\t\temailNpm: options.email.npm,\n\t\t}),\n\t\t...(options.guide\n\t\t\t? {\n\t\t\t\t\tguide: options.guide.href,\n\t\t\t\t\tguideTitle: options.guide.title,\n\t\t\t }\n\t\t\t: { guide: undefined }),\n\t\t...(options.logo\n\t\t\t? {\n\t\t\t\t\tlogo: options.logo.src,\n\t\t\t\t\tlogoAlt: options.logo.alt,\n\t\t\t }\n\t\t\t: { logo: undefined }),\n\t};\n\n\tconst args = Object.entries(optionsNormalized)\n\t\t// Sort so the base is first, then the rest are sorted alphabetically\n\t\t.sort(([a], [b]) =>\n\t\t\ta === \"base\" ? -1 : b === \"base\" ? 1 : a.localeCompare(b),\n\t\t)\n\t\t// Filter out all entries that have a key in the excluded object or have a falsy value\n\t\t.filter(\n\t\t\t([key, value]) =>\n\t\t\t\tgetExclusions(options, optionsNormalized.base)[key as ExclusionKey] ==\n\t\t\t\t\tundefined && !!value,\n\t\t)\n\t\t.map(([key, value]) => {\n\t\t\treturn `--${getFirstMatchingArg(key)}${stringifyValue(value)}`;\n\t\t})\n\t\t.join(\" \");\n\n\treturn `npx create-typescript-app --mode ${options.mode} ${args}`;\n}\n\nfunction stringifyValue(\n\tvalue: boolean | string | string[] | undefined,\n): string {\n\tif (Array.isArray(value)) {\n\t\treturn stringifyValue(value.join(\" \"));\n\t}\n\n\tif (typeof value === \"boolean\" && value) {\n\t\treturn \"\";\n\t}\n\n\tconst valueStringified = `${value}`;\n\n\treturn valueStringified.includes(\" \")\n\t\t? ` \"${valueStringified}\"`\n\t\t: ` ${valueStringified}`;\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAC9B;AAAA,EAEC;AAAA,OACM;AAGP,SAAS,oBAAoB,KAAa;AACzC,SAAO,OAAO,KAAK,aAAa,EAAE;AAAA,IACjC,CAAC,QAAQ,IAAI,WAAW,KAAK,EAAE,MAAM,IAAI,YAAY;AAAA,EACtD;AACD;AAEO,SAAS,sBAAsB,SAAmC;AACxE,QAAM,oBAAoB;AAAA,IACzB,GAAG;AAAA,IACH,OAAO;AAAA,IACP,GAAI,QAAQ,SAAS;AAAA,MACpB,aAAa,QAAQ,MAAM;AAAA,MAC3B,UAAU,QAAQ,MAAM;AAAA,IACzB;AAAA,IACA,GAAI,QAAQ,QACT;AAAA,MACA,OAAO,QAAQ,MAAM;AAAA,MACrB,YAAY,QAAQ,MAAM;AAAA,IAC1B,IACA,EAAE,OAAO,OAAU;AAAA,IACtB,GAAI,QAAQ,OACT;AAAA,MACA,MAAM,QAAQ,KAAK;AAAA,MACnB,SAAS,QAAQ,KAAK;AAAA,IACtB,IACA,EAAE,MAAM,OAAU;AAAA,EACtB;AAEA,QAAM,OAAO,OAAO,QAAQ,iBAAiB,EAE3C;AAAA,IAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MACb,MAAM,SAAS,KAAK,MAAM,SAAS,IAAI,EAAE,cAAc,CAAC;AAAA,EACzD,EAEC;AAAA,IACA,CAAC,CAAC,KAAK,KAAK,MACX,cAAc,SAAS,kBAAkB,IAAI,EAAE,GAAmB,KACjE,UAAa,CAAC,CAAC;AAAA,EAClB,EACC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACtB,WAAO,KAAK,oBAAoB,GAAG,CAAC,GAAG,eAAe,KAAK,CAAC;AAAA,EAC7D,CAAC,EACA,KAAK,GAAG;AAEV,SAAO,oCAAoC,QAAQ,IAAI,IAAI,IAAI;AAChE;AAEA,SAAS,eACR,OACS;AACT,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,eAAe,MAAM,KAAK,GAAG,CAAC;AAAA,EACtC;AAEA,MAAI,OAAO,UAAU,aAAa,OAAO;AACxC,WAAO;AAAA,EACR;AAEA,QAAM,mBAAmB,GAAG,KAAK;AAEjC,SAAO,iBAAiB,SAAS,GAAG,IACjC,KAAK,gBAAgB,MACrB,IAAI,gBAAgB;AACxB;","names":[]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { Options
|
|
1
|
+
import { Options } from '../types.js';
|
|
2
2
|
import 'zod';
|
|
3
3
|
import '../codes.js';
|
|
4
4
|
|
|
5
|
-
type ExclusionKey = keyof Options & `exclude${string}`;
|
|
6
|
-
declare function getExclusions(options: Partial<Options>, base?: OptionsBase): Partial<Options>;
|
|
7
5
|
declare function augmentOptionsWithExcludes(options: Options): Promise<Options | undefined>;
|
|
8
6
|
|
|
9
|
-
export {
|
|
7
|
+
export { augmentOptionsWithExcludes };
|
|
@@ -1,120 +1,11 @@
|
|
|
1
1
|
import * as prompts from "@clack/prompts";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { filterPromptCancel } from "../prompts.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
excludeCompliance: {
|
|
10
|
-
hint: "--exclude-compliance",
|
|
11
|
-
label: "Add a GitHub Actions workflow to verify that PRs match an expected format.",
|
|
12
|
-
uncommon: true
|
|
13
|
-
},
|
|
14
|
-
excludeLintDeprecation: {
|
|
15
|
-
hint: "--exclude-lint-deprecation",
|
|
16
|
-
label: "Include an eslint-plugin-deprecation to reports on usage of code marked as @deprecated.",
|
|
17
|
-
uncommon: true
|
|
18
|
-
},
|
|
19
|
-
excludeLintESLint: {
|
|
20
|
-
hint: "--exclude-lint-eslint",
|
|
21
|
-
label: "Include eslint-plugin-eslint-comment to enforce good practices around ESLint comment directives.",
|
|
22
|
-
uncommon: true
|
|
23
|
-
},
|
|
24
|
-
excludeLintJSDoc: {
|
|
25
|
-
hint: "--exclude-lint-jsdoc",
|
|
26
|
-
label: "Include eslint-plugin-jsdoc to enforce good practices around JSDoc comments.",
|
|
27
|
-
uncommon: true
|
|
28
|
-
},
|
|
29
|
-
excludeLintJson: {
|
|
30
|
-
hint: "--exclude-lint-json",
|
|
31
|
-
label: "Apply linting and sorting to *.json and *.jsonc files.",
|
|
32
|
-
uncommon: true
|
|
33
|
-
},
|
|
34
|
-
excludeLintKnip: {
|
|
35
|
-
hint: "--exclude-lint-knip",
|
|
36
|
-
label: "Add Knip to detect unused files, dependencies, and code exports."
|
|
37
|
-
},
|
|
38
|
-
excludeLintMd: {
|
|
39
|
-
hint: "--exclude-lint-md",
|
|
40
|
-
label: "Apply linting to *.md files.",
|
|
41
|
-
uncommon: true
|
|
42
|
-
},
|
|
43
|
-
excludeLintPackageJson: {
|
|
44
|
-
hint: "--exclude-lint-package-json",
|
|
45
|
-
label: "Add eslint-plugin-package-json to lint for package.json correctness.",
|
|
46
|
-
uncommon: true
|
|
47
|
-
},
|
|
48
|
-
excludeLintPackages: {
|
|
49
|
-
hint: "--exclude-lint-packages",
|
|
50
|
-
label: "Add a pnpm dedupe workflow to ensure packages aren't duplicated unnecessarily.",
|
|
51
|
-
uncommon: true
|
|
52
|
-
},
|
|
53
|
-
excludeLintPerfectionist: {
|
|
54
|
-
hint: "--exclude-lint-perfectionist",
|
|
55
|
-
label: "Apply eslint-plugin-perfectionist to ensure imports, keys, and so on are in sorted order.",
|
|
56
|
-
uncommon: true
|
|
57
|
-
},
|
|
58
|
-
excludeLintRegex: {
|
|
59
|
-
hint: "--exclude-lint-regex",
|
|
60
|
-
label: "Include eslint-plugin-regex to enforce good practices around regular expressions.",
|
|
61
|
-
uncommon: true
|
|
62
|
-
},
|
|
63
|
-
excludeLintSpelling: {
|
|
64
|
-
hint: "--exclude-lint-spelling",
|
|
65
|
-
label: "Add cspell to spell check against dictionaries of known words.",
|
|
66
|
-
uncommon: true
|
|
67
|
-
},
|
|
68
|
-
excludeLintStrict: {
|
|
69
|
-
hint: "--exclude-lint-strict",
|
|
70
|
-
label: "Include strict logical lint rules such as typescript-eslint's strict config. ",
|
|
71
|
-
uncommon: true
|
|
72
|
-
},
|
|
73
|
-
excludeLintStylistic: {
|
|
74
|
-
hint: "--exclude-lint-stylistic",
|
|
75
|
-
label: "Include stylistic lint rules such as typescript-eslint's stylistic config.",
|
|
76
|
-
uncommon: true
|
|
77
|
-
},
|
|
78
|
-
excludeLintYml: {
|
|
79
|
-
hint: "--exclude-lint-yml",
|
|
80
|
-
label: "Apply linting and sorting to *.yaml and *.yml files.",
|
|
81
|
-
uncommon: true
|
|
82
|
-
},
|
|
83
|
-
excludeReleases: {
|
|
84
|
-
hint: "--exclude-releases",
|
|
85
|
-
label: "Add release-it to generate changelogs, package bumps, and publishes based on conventional commits."
|
|
86
|
-
},
|
|
87
|
-
excludeRenovate: {
|
|
88
|
-
hint: "--exclude-renovate",
|
|
89
|
-
label: "Add a Renovate config to keep dependencies up-to-date with PRs."
|
|
90
|
-
},
|
|
91
|
-
excludeTests: {
|
|
92
|
-
hint: "--exclude-tests",
|
|
93
|
-
label: "Add Vitest tooling for fast unit tests, configured with coverage tracking."
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
const exclusionKeys = Object.keys(exclusionDescriptions);
|
|
97
|
-
function getExclusions(options, base) {
|
|
98
|
-
switch (base) {
|
|
99
|
-
case "common":
|
|
100
|
-
return {
|
|
101
|
-
...Object.fromEntries(
|
|
102
|
-
exclusionKeys.filter((exclusion) => exclusionDescriptions[exclusion].uncommon).map((exclusion) => [exclusion, options[exclusion] ?? true])
|
|
103
|
-
)
|
|
104
|
-
};
|
|
105
|
-
case "minimum":
|
|
106
|
-
return {
|
|
107
|
-
...Object.fromEntries(
|
|
108
|
-
exclusionKeys.map((exclusion) => [
|
|
109
|
-
exclusion,
|
|
110
|
-
options[exclusion] ?? true
|
|
111
|
-
])
|
|
112
|
-
)
|
|
113
|
-
};
|
|
114
|
-
default:
|
|
115
|
-
return {};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
4
|
+
import {
|
|
5
|
+
exclusionDescriptions,
|
|
6
|
+
exclusionKeys,
|
|
7
|
+
getExclusions
|
|
8
|
+
} from "./exclusionKeys.js";
|
|
118
9
|
async function augmentOptionsWithExcludes(options) {
|
|
119
10
|
if (Object.keys(options).some(
|
|
120
11
|
(key) => key in exclusionDescriptions && options[key] !== void 0
|
|
@@ -163,6 +54,7 @@ async function augmentOptionsWithExcludes(options) {
|
|
|
163
54
|
case "everything":
|
|
164
55
|
return {
|
|
165
56
|
...options,
|
|
57
|
+
base,
|
|
166
58
|
...getExclusions(options, base)
|
|
167
59
|
};
|
|
168
60
|
case "prompt":
|
|
@@ -183,6 +75,7 @@ async function augmentOptionsWithExcludes(options) {
|
|
|
183
75
|
);
|
|
184
76
|
return {
|
|
185
77
|
...options,
|
|
78
|
+
base,
|
|
186
79
|
...Object.fromEntries(
|
|
187
80
|
exclusionKeys.map(
|
|
188
81
|
(exclusionKey) => [exclusionKey, !exclusionsNotEnabled.has(exclusionKey)]
|
|
@@ -195,7 +88,6 @@ function makeLabel(label, message) {
|
|
|
195
88
|
return [chalk.bold(label), message].join(" ");
|
|
196
89
|
}
|
|
197
90
|
export {
|
|
198
|
-
augmentOptionsWithExcludes
|
|
199
|
-
getExclusions
|
|
91
|
+
augmentOptionsWithExcludes
|
|
200
92
|
};
|
|
201
93
|
//# sourceMappingURL=augmentOptionsWithExcludes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/options/augmentOptionsWithExcludes.ts"],"sourcesContent":["import * as prompts from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { filterPromptCancel } from \"../prompts.js\";\nimport { Options, OptionsBase } from \"../types.js\";\n\ninterface ExclusionDescription {\n\thint: string;\n\tlabel: string;\n\tuncommon?: true;\n}\n\nexport type ExclusionKey = keyof Options & `exclude${string}`;\n\nconst exclusionDescriptions: Record<ExclusionKey, ExclusionDescription> = {\n\texcludeAllContributors: {\n\t\thint: \"--exclude-all-contributors\",\n\t\tlabel:\n\t\t\t\"Add all-contributors to track contributions and display them in a README.md table.\",\n\t},\n\texcludeCompliance: {\n\t\thint: \"--exclude-compliance\",\n\t\tlabel:\n\t\t\t\"Add a GitHub Actions workflow to verify that PRs match an expected format.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintDeprecation: {\n\t\thint: \"--exclude-lint-deprecation\",\n\t\tlabel:\n\t\t\t\"Include an eslint-plugin-deprecation to reports on usage of code marked as @deprecated.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintESLint: {\n\t\thint: \"--exclude-lint-eslint\",\n\t\tlabel:\n\t\t\t\"Include eslint-plugin-eslint-comment to enforce good practices around ESLint comment directives.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintJSDoc: {\n\t\thint: \"--exclude-lint-jsdoc\",\n\t\tlabel:\n\t\t\t\"Include eslint-plugin-jsdoc to enforce good practices around JSDoc comments.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintJson: {\n\t\thint: \"--exclude-lint-json\",\n\t\tlabel: \"Apply linting and sorting to *.json and *.jsonc files.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintKnip: {\n\t\thint: \"--exclude-lint-knip\",\n\t\tlabel: \"Add Knip to detect unused files, dependencies, and code exports.\",\n\t},\n\texcludeLintMd: {\n\t\thint: \"--exclude-lint-md\",\n\t\tlabel: \"Apply linting to *.md files.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintPackageJson: {\n\t\thint: \"--exclude-lint-package-json\",\n\t\tlabel:\n\t\t\t\"Add eslint-plugin-package-json to lint for package.json correctness.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintPackages: {\n\t\thint: \"--exclude-lint-packages\",\n\t\tlabel:\n\t\t\t\"Add a pnpm dedupe workflow to ensure packages aren't duplicated unnecessarily.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintPerfectionist: {\n\t\thint: \"--exclude-lint-perfectionist\",\n\t\tlabel:\n\t\t\t\"Apply eslint-plugin-perfectionist to ensure imports, keys, and so on are in sorted order.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintRegex: {\n\t\thint: \"--exclude-lint-regex\",\n\t\tlabel:\n\t\t\t\"Include eslint-plugin-regex to enforce good practices around regular expressions.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintSpelling: {\n\t\thint: \"--exclude-lint-spelling\",\n\t\tlabel: \"Add cspell to spell check against dictionaries of known words.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintStrict: {\n\t\thint: \"--exclude-lint-strict\",\n\t\tlabel:\n\t\t\t\"Include strict logical lint rules such as typescript-eslint's strict config. \",\n\t\tuncommon: true,\n\t},\n\texcludeLintStylistic: {\n\t\thint: \"--exclude-lint-stylistic\",\n\t\tlabel:\n\t\t\t\"Include stylistic lint rules such as typescript-eslint's stylistic config.\",\n\t\tuncommon: true,\n\t},\n\texcludeLintYml: {\n\t\thint: \"--exclude-lint-yml\",\n\t\tlabel: \"Apply linting and sorting to *.yaml and *.yml files.\",\n\t\tuncommon: true,\n\t},\n\texcludeReleases: {\n\t\thint: \"--exclude-releases\",\n\t\tlabel:\n\t\t\t\"Add release-it to generate changelogs, package bumps, and publishes based on conventional commits.\",\n\t},\n\texcludeRenovate: {\n\t\thint: \"--exclude-renovate\",\n\t\tlabel: \"Add a Renovate config to keep dependencies up-to-date with PRs.\",\n\t},\n\texcludeTests: {\n\t\thint: \"--exclude-tests\",\n\t\tlabel:\n\t\t\t\"Add Vitest tooling for fast unit tests, configured with coverage tracking.\",\n\t},\n};\n\nconst exclusionKeys = Object.keys(exclusionDescriptions) as ExclusionKey[];\n\nexport function getExclusions(\n\toptions: Partial<Options>,\n\tbase?: OptionsBase,\n): Partial<Options> {\n\tswitch (base) {\n\t\tcase \"common\":\n\t\t\treturn {\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys\n\t\t\t\t\t\t.filter((exclusion) => exclusionDescriptions[exclusion].uncommon)\n\t\t\t\t\t\t.map((exclusion) => [exclusion, options[exclusion] ?? true]),\n\t\t\t\t),\n\t\t\t};\n\t\tcase \"minimum\":\n\t\t\treturn {\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys.map((exclusion) => [\n\t\t\t\t\t\texclusion,\n\t\t\t\t\t\toptions[exclusion] ?? true,\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t};\n\t\t// We only really care about exclusions on the common and minimum bases\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n\nexport async function augmentOptionsWithExcludes(\n\toptions: Options,\n): Promise<Options | undefined> {\n\tif (\n\t\tObject.keys(options).some(\n\t\t\t(key) =>\n\t\t\t\tkey in exclusionDescriptions &&\n\t\t\t\toptions[key as keyof typeof options] !== undefined,\n\t\t)\n\t) {\n\t\treturn options;\n\t}\n\n\tconst base =\n\t\toptions.base ??\n\t\tfilterPromptCancel<OptionsBase | symbol>(\n\t\t\tawait prompts.select({\n\t\t\t\tinitialValue: \"common\" as OptionsBase,\n\t\t\t\tmessage: `How much tooling would you like the template to set up for you?`,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"everything\",\n\t\t\t\t\t\t\t\"The most comprehensive tooling imaginable: sorting, spellchecking, and more!\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"everything\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thint: \"recommended\",\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"common\",\n\t\t\t\t\t\t\t\"Bare starters plus testing and automation for all-contributors and releases.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"common\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"minimum\",\n\t\t\t\t\t\t\t\"Just bare starter tooling: building, formatting, linting, and type checking.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"minimum\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\"prompt\", \"(allow me to customize)\"),\n\t\t\t\t\t\tvalue: \"prompt\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\n\tswitch (base) {\n\t\tcase undefined:\n\t\t\treturn undefined;\n\t\tcase \"common\":\n\t\tcase \"minimum\":\n\t\tcase \"everything\":\n\t\t\treturn {\n\t\t\t\t...options,\n\t\t\t\t...getExclusions(options, base),\n\t\t\t};\n\t\tcase \"prompt\":\n\t\t\tconst exclusionsNotEnabled = new Set(\n\t\t\t\tfilterPromptCancel(\n\t\t\t\t\tawait prompts.multiselect({\n\t\t\t\t\t\tinitialValues: exclusionKeys,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Select the tooling portions you'd like to remove. All are enabled by default. Press ↑ or ↓ to change the selected item, then space to select.\",\n\t\t\t\t\t\toptions: Object.entries(exclusionDescriptions).map(\n\t\t\t\t\t\t\t([value, { hint, label }]) => ({\n\t\t\t\t\t\t\t\thint,\n\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\tvalue: value as ExclusionKey,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...options,\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys.map(\n\t\t\t\t\t\t(exclusionKey) =>\n\t\t\t\t\t\t\t[exclusionKey, !exclusionsNotEnabled.has(exclusionKey)] as const,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t}\n}\n\nfunction makeLabel(label: string, message: string) {\n\treturn [chalk.bold(label), message].join(\"\\t \");\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/options/augmentOptionsWithExcludes.ts"],"sourcesContent":["import * as prompts from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { filterPromptCancel } from \"../prompts.js\";\nimport { Options, OptionsBase } from \"../types.js\";\nimport {\n\tExclusionKey,\n\texclusionDescriptions,\n\texclusionKeys,\n\tgetExclusions,\n} from \"./exclusionKeys.js\";\n\nexport async function augmentOptionsWithExcludes(\n\toptions: Options,\n): Promise<Options | undefined> {\n\tif (\n\t\tObject.keys(options).some(\n\t\t\t(key) =>\n\t\t\t\tkey in exclusionDescriptions &&\n\t\t\t\toptions[key as keyof typeof options] !== undefined,\n\t\t)\n\t) {\n\t\treturn options;\n\t}\n\n\tconst base =\n\t\toptions.base ??\n\t\tfilterPromptCancel<OptionsBase | symbol>(\n\t\t\tawait prompts.select({\n\t\t\t\tinitialValue: \"common\" as OptionsBase,\n\t\t\t\tmessage: `How much tooling would you like the template to set up for you?`,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"everything\",\n\t\t\t\t\t\t\t\"The most comprehensive tooling imaginable: sorting, spellchecking, and more!\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"everything\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thint: \"recommended\",\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"common\",\n\t\t\t\t\t\t\t\"Bare starters plus testing and automation for all-contributors and releases.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"common\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\n\t\t\t\t\t\t\t\"minimum\",\n\t\t\t\t\t\t\t\"Just bare starter tooling: building, formatting, linting, and type checking.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: \"minimum\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: makeLabel(\"prompt\", \"(allow me to customize)\"),\n\t\t\t\t\t\tvalue: \"prompt\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\n\tswitch (base) {\n\t\tcase undefined:\n\t\t\treturn undefined;\n\t\tcase \"common\":\n\t\tcase \"minimum\":\n\t\tcase \"everything\":\n\t\t\treturn {\n\t\t\t\t...options,\n\t\t\t\tbase,\n\t\t\t\t...getExclusions(options, base),\n\t\t\t};\n\t\tcase \"prompt\":\n\t\t\tconst exclusionsNotEnabled = new Set(\n\t\t\t\tfilterPromptCancel(\n\t\t\t\t\tawait prompts.multiselect({\n\t\t\t\t\t\tinitialValues: exclusionKeys,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Select the tooling portions you'd like to remove. All are enabled by default. Press ↑ or ↓ to change the selected item, then space to select.\",\n\t\t\t\t\t\toptions: Object.entries(exclusionDescriptions).map(\n\t\t\t\t\t\t\t([value, { hint, label }]) => ({\n\t\t\t\t\t\t\t\thint,\n\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\tvalue: value as ExclusionKey,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...options,\n\t\t\t\tbase,\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys.map(\n\t\t\t\t\t\t(exclusionKey) =>\n\t\t\t\t\t\t\t[exclusionKey, !exclusionsNotEnabled.has(exclusionKey)] as const,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t}\n}\n\nfunction makeLabel(label: string, message: string) {\n\treturn [chalk.bold(label), message].join(\"\\t \");\n}\n"],"mappings":"AAAA,YAAY,aAAa;AACzB,OAAO,WAAW;AAElB,SAAS,0BAA0B;AAEnC;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,eAAsB,2BACrB,SAC+B;AAC/B,MACC,OAAO,KAAK,OAAO,EAAE;AAAA,IACpB,CAAC,QACA,OAAO,yBACP,QAAQ,GAA2B,MAAM;AAAA,EAC3C,GACC;AACD,WAAO;AAAA,EACR;AAEA,QAAM,OACL,QAAQ,QACR;AAAA,IACC,MAAM,QAAQ,OAAO;AAAA,MACpB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,QACR;AAAA,UACC,OAAO;AAAA,YACN;AAAA,YACA;AAAA,UACD;AAAA,UACA,OAAO;AAAA,QACR;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,YACN;AAAA,YACA;AAAA,UACD;AAAA,UACA,OAAO;AAAA,QACR;AAAA,QACA;AAAA,UACC,OAAO;AAAA,YACN;AAAA,YACA;AAAA,UACD;AAAA,UACA,OAAO;AAAA,QACR;AAAA,QACA;AAAA,UACC,OAAO,UAAU,UAAU,yBAAyB;AAAA,UACpD,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAED,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACJ,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,QACA,GAAG,cAAc,SAAS,IAAI;AAAA,MAC/B;AAAA,IACD,KAAK;AACJ,YAAM,uBAAuB,IAAI;AAAA,QAChC;AAAA,UACC,MAAM,QAAQ,YAAY;AAAA,YACzB,eAAe;AAAA,YACf,SACC;AAAA,YACD,SAAS,OAAO,QAAQ,qBAAqB,EAAE;AAAA,cAC9C,CAAC,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,OAAO;AAAA,gBAC9B;AAAA,gBACA;AAAA,gBACA;AAAA,cACD;AAAA,YACD;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AAEA,aAAO;AAAA,QACN,GAAG;AAAA,QACH;AAAA,QACA,GAAG,OAAO;AAAA,UACT,cAAc;AAAA,YACb,CAAC,iBACA,CAAC,cAAc,CAAC,qBAAqB,IAAI,YAAY,CAAC;AAAA,UACxD;AAAA,QACD;AAAA,MACD;AAAA,EACF;AACD;AAEA,SAAS,UAAU,OAAe,SAAiB;AAClD,SAAO,CAAC,MAAM,KAAK,KAAK,GAAG,OAAO,EAAE,KAAK,IAAK;AAC/C;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Options, OptionsBase } from '../types.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
import '../codes.js';
|
|
4
|
+
|
|
5
|
+
type ExclusionKey = keyof Options & `exclude${string}`;
|
|
6
|
+
interface ExclusionDescription {
|
|
7
|
+
hint: string;
|
|
8
|
+
label: string;
|
|
9
|
+
uncommon?: true;
|
|
10
|
+
}
|
|
11
|
+
declare const exclusionDescriptions: Record<ExclusionKey, ExclusionDescription>;
|
|
12
|
+
declare const exclusionKeys: ExclusionKey[];
|
|
13
|
+
declare function getExclusions(options: Partial<Options>, base?: OptionsBase): Partial<Options>;
|
|
14
|
+
|
|
15
|
+
export { type ExclusionDescription, type ExclusionKey, exclusionDescriptions, exclusionKeys, getExclusions };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const exclusionDescriptions = {
|
|
2
|
+
excludeAllContributors: {
|
|
3
|
+
hint: "--exclude-all-contributors",
|
|
4
|
+
label: "Add all-contributors to track contributions and display them in a README.md table."
|
|
5
|
+
},
|
|
6
|
+
excludeCompliance: {
|
|
7
|
+
hint: "--exclude-compliance",
|
|
8
|
+
label: "Add a GitHub Actions workflow to verify that PRs match an expected format.",
|
|
9
|
+
uncommon: true
|
|
10
|
+
},
|
|
11
|
+
excludeLintDeprecation: {
|
|
12
|
+
hint: "--exclude-lint-deprecation",
|
|
13
|
+
label: "Include an eslint-plugin-deprecation to reports on usage of code marked as @deprecated.",
|
|
14
|
+
uncommon: true
|
|
15
|
+
},
|
|
16
|
+
excludeLintESLint: {
|
|
17
|
+
hint: "--exclude-lint-eslint",
|
|
18
|
+
label: "Include eslint-plugin-eslint-comment to enforce good practices around ESLint comment directives.",
|
|
19
|
+
uncommon: true
|
|
20
|
+
},
|
|
21
|
+
excludeLintJSDoc: {
|
|
22
|
+
hint: "--exclude-lint-jsdoc",
|
|
23
|
+
label: "Include eslint-plugin-jsdoc to enforce good practices around JSDoc comments.",
|
|
24
|
+
uncommon: true
|
|
25
|
+
},
|
|
26
|
+
excludeLintJson: {
|
|
27
|
+
hint: "--exclude-lint-json",
|
|
28
|
+
label: "Apply linting and sorting to *.json and *.jsonc files.",
|
|
29
|
+
uncommon: true
|
|
30
|
+
},
|
|
31
|
+
excludeLintKnip: {
|
|
32
|
+
hint: "--exclude-lint-knip",
|
|
33
|
+
label: "Add Knip to detect unused files, dependencies, and code exports."
|
|
34
|
+
},
|
|
35
|
+
excludeLintMd: {
|
|
36
|
+
hint: "--exclude-lint-md",
|
|
37
|
+
label: "Apply linting to *.md files.",
|
|
38
|
+
uncommon: true
|
|
39
|
+
},
|
|
40
|
+
excludeLintPackageJson: {
|
|
41
|
+
hint: "--exclude-lint-package-json",
|
|
42
|
+
label: "Add eslint-plugin-package-json to lint for package.json correctness.",
|
|
43
|
+
uncommon: true
|
|
44
|
+
},
|
|
45
|
+
excludeLintPackages: {
|
|
46
|
+
hint: "--exclude-lint-packages",
|
|
47
|
+
label: "Add a pnpm dedupe workflow to ensure packages aren't duplicated unnecessarily.",
|
|
48
|
+
uncommon: true
|
|
49
|
+
},
|
|
50
|
+
excludeLintPerfectionist: {
|
|
51
|
+
hint: "--exclude-lint-perfectionist",
|
|
52
|
+
label: "Apply eslint-plugin-perfectionist to ensure imports, keys, and so on are in sorted order.",
|
|
53
|
+
uncommon: true
|
|
54
|
+
},
|
|
55
|
+
excludeLintRegex: {
|
|
56
|
+
hint: "--exclude-lint-regex",
|
|
57
|
+
label: "Include eslint-plugin-regex to enforce good practices around regular expressions.",
|
|
58
|
+
uncommon: true
|
|
59
|
+
},
|
|
60
|
+
excludeLintSpelling: {
|
|
61
|
+
hint: "--exclude-lint-spelling",
|
|
62
|
+
label: "Add cspell to spell check against dictionaries of known words.",
|
|
63
|
+
uncommon: true
|
|
64
|
+
},
|
|
65
|
+
excludeLintStrict: {
|
|
66
|
+
hint: "--exclude-lint-strict",
|
|
67
|
+
label: "Include strict logical lint rules such as typescript-eslint's strict config. ",
|
|
68
|
+
uncommon: true
|
|
69
|
+
},
|
|
70
|
+
excludeLintStylistic: {
|
|
71
|
+
hint: "--exclude-lint-stylistic",
|
|
72
|
+
label: "Include stylistic lint rules such as typescript-eslint's stylistic config.",
|
|
73
|
+
uncommon: true
|
|
74
|
+
},
|
|
75
|
+
excludeLintYml: {
|
|
76
|
+
hint: "--exclude-lint-yml",
|
|
77
|
+
label: "Apply linting and sorting to *.yaml and *.yml files.",
|
|
78
|
+
uncommon: true
|
|
79
|
+
},
|
|
80
|
+
excludeReleases: {
|
|
81
|
+
hint: "--exclude-releases",
|
|
82
|
+
label: "Add release-it to generate changelogs, package bumps, and publishes based on conventional commits."
|
|
83
|
+
},
|
|
84
|
+
excludeRenovate: {
|
|
85
|
+
hint: "--exclude-renovate",
|
|
86
|
+
label: "Add a Renovate config to keep dependencies up-to-date with PRs."
|
|
87
|
+
},
|
|
88
|
+
excludeTests: {
|
|
89
|
+
hint: "--exclude-tests",
|
|
90
|
+
label: "Add Vitest tooling for fast unit tests, configured with coverage tracking."
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const exclusionKeys = Object.keys(
|
|
94
|
+
exclusionDescriptions
|
|
95
|
+
);
|
|
96
|
+
function getExclusions(options, base) {
|
|
97
|
+
switch (base) {
|
|
98
|
+
case "common":
|
|
99
|
+
return {
|
|
100
|
+
...Object.fromEntries(
|
|
101
|
+
exclusionKeys.filter((exclusion) => exclusionDescriptions[exclusion].uncommon).map((exclusion) => [exclusion, options[exclusion] ?? true])
|
|
102
|
+
)
|
|
103
|
+
};
|
|
104
|
+
case "minimum":
|
|
105
|
+
return {
|
|
106
|
+
...Object.fromEntries(
|
|
107
|
+
exclusionKeys.map((exclusion) => [
|
|
108
|
+
exclusion,
|
|
109
|
+
options[exclusion] ?? true
|
|
110
|
+
])
|
|
111
|
+
)
|
|
112
|
+
};
|
|
113
|
+
default:
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
exclusionDescriptions,
|
|
119
|
+
exclusionKeys,
|
|
120
|
+
getExclusions
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=exclusionKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/options/exclusionKeys.ts"],"sourcesContent":["import { Options, OptionsBase } from \"../types.js\";\n\nexport type ExclusionKey = keyof Options & `exclude${string}`;\n\nexport interface ExclusionDescription {\n\thint: string;\n\tlabel: string;\n\tuncommon?: true;\n}\n\nexport const exclusionDescriptions: Record<ExclusionKey, ExclusionDescription> =\n\t{\n\t\texcludeAllContributors: {\n\t\t\thint: \"--exclude-all-contributors\",\n\t\t\tlabel:\n\t\t\t\t\"Add all-contributors to track contributions and display them in a README.md table.\",\n\t\t},\n\t\texcludeCompliance: {\n\t\t\thint: \"--exclude-compliance\",\n\t\t\tlabel:\n\t\t\t\t\"Add a GitHub Actions workflow to verify that PRs match an expected format.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintDeprecation: {\n\t\t\thint: \"--exclude-lint-deprecation\",\n\t\t\tlabel:\n\t\t\t\t\"Include an eslint-plugin-deprecation to reports on usage of code marked as @deprecated.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintESLint: {\n\t\t\thint: \"--exclude-lint-eslint\",\n\t\t\tlabel:\n\t\t\t\t\"Include eslint-plugin-eslint-comment to enforce good practices around ESLint comment directives.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintJSDoc: {\n\t\t\thint: \"--exclude-lint-jsdoc\",\n\t\t\tlabel:\n\t\t\t\t\"Include eslint-plugin-jsdoc to enforce good practices around JSDoc comments.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintJson: {\n\t\t\thint: \"--exclude-lint-json\",\n\t\t\tlabel: \"Apply linting and sorting to *.json and *.jsonc files.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintKnip: {\n\t\t\thint: \"--exclude-lint-knip\",\n\t\t\tlabel: \"Add Knip to detect unused files, dependencies, and code exports.\",\n\t\t},\n\t\texcludeLintMd: {\n\t\t\thint: \"--exclude-lint-md\",\n\t\t\tlabel: \"Apply linting to *.md files.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintPackageJson: {\n\t\t\thint: \"--exclude-lint-package-json\",\n\t\t\tlabel:\n\t\t\t\t\"Add eslint-plugin-package-json to lint for package.json correctness.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintPackages: {\n\t\t\thint: \"--exclude-lint-packages\",\n\t\t\tlabel:\n\t\t\t\t\"Add a pnpm dedupe workflow to ensure packages aren't duplicated unnecessarily.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintPerfectionist: {\n\t\t\thint: \"--exclude-lint-perfectionist\",\n\t\t\tlabel:\n\t\t\t\t\"Apply eslint-plugin-perfectionist to ensure imports, keys, and so on are in sorted order.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintRegex: {\n\t\t\thint: \"--exclude-lint-regex\",\n\t\t\tlabel:\n\t\t\t\t\"Include eslint-plugin-regex to enforce good practices around regular expressions.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintSpelling: {\n\t\t\thint: \"--exclude-lint-spelling\",\n\t\t\tlabel: \"Add cspell to spell check against dictionaries of known words.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintStrict: {\n\t\t\thint: \"--exclude-lint-strict\",\n\t\t\tlabel:\n\t\t\t\t\"Include strict logical lint rules such as typescript-eslint's strict config. \",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintStylistic: {\n\t\t\thint: \"--exclude-lint-stylistic\",\n\t\t\tlabel:\n\t\t\t\t\"Include stylistic lint rules such as typescript-eslint's stylistic config.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeLintYml: {\n\t\t\thint: \"--exclude-lint-yml\",\n\t\t\tlabel: \"Apply linting and sorting to *.yaml and *.yml files.\",\n\t\t\tuncommon: true,\n\t\t},\n\t\texcludeReleases: {\n\t\t\thint: \"--exclude-releases\",\n\t\t\tlabel:\n\t\t\t\t\"Add release-it to generate changelogs, package bumps, and publishes based on conventional commits.\",\n\t\t},\n\t\texcludeRenovate: {\n\t\t\thint: \"--exclude-renovate\",\n\t\t\tlabel: \"Add a Renovate config to keep dependencies up-to-date with PRs.\",\n\t\t},\n\t\texcludeTests: {\n\t\t\thint: \"--exclude-tests\",\n\t\t\tlabel:\n\t\t\t\t\"Add Vitest tooling for fast unit tests, configured with coverage tracking.\",\n\t\t},\n\t};\n\nexport const exclusionKeys = Object.keys(\n\texclusionDescriptions,\n) as ExclusionKey[];\n\nexport function getExclusions(\n\toptions: Partial<Options>,\n\tbase?: OptionsBase,\n): Partial<Options> {\n\tswitch (base) {\n\t\tcase \"common\":\n\t\t\treturn {\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys\n\t\t\t\t\t\t.filter((exclusion) => exclusionDescriptions[exclusion].uncommon)\n\t\t\t\t\t\t.map((exclusion) => [exclusion, options[exclusion] ?? true]),\n\t\t\t\t),\n\t\t\t};\n\t\tcase \"minimum\":\n\t\t\treturn {\n\t\t\t\t...Object.fromEntries(\n\t\t\t\t\texclusionKeys.map((exclusion) => [\n\t\t\t\t\t\texclusion,\n\t\t\t\t\t\toptions[exclusion] ?? true,\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t};\n\t\t// We only really care about exclusions on the common and minimum bases\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n"],"mappings":"AAUO,MAAM,wBACZ;AAAA,EACC,wBAAwB;AAAA,IACvB,MAAM;AAAA,IACN,OACC;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IAClB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,wBAAwB;AAAA,IACvB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,mBAAmB;AAAA,IAClB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IACjB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACA,wBAAwB;AAAA,IACvB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,qBAAqB;AAAA,IACpB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,0BAA0B;AAAA,IACzB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IACjB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,qBAAqB;AAAA,IACpB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACA,mBAAmB;AAAA,IAClB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,sBAAsB;AAAA,IACrB,MAAM;AAAA,IACN,OACC;AAAA,IACD,UAAU;AAAA,EACX;AAAA,EACA,gBAAgB;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IAChB,MAAM;AAAA,IACN,OACC;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,EACR;AAAA,EACA,cAAc;AAAA,IACb,MAAM;AAAA,IACN,OACC;AAAA,EACF;AACD;AAEM,MAAM,gBAAgB,OAAO;AAAA,EACnC;AACD;AAEO,SAAS,cACf,SACA,MACmB;AACnB,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,QACN,GAAG,OAAO;AAAA,UACT,cACE,OAAO,CAAC,cAAc,sBAAsB,SAAS,EAAE,QAAQ,EAC/D,IAAI,CAAC,cAAc,CAAC,WAAW,QAAQ,SAAS,KAAK,IAAI,CAAC;AAAA,QAC7D;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN,GAAG,OAAO;AAAA,UACT,cAAc,IAAI,CAAC,cAAc;AAAA,YAChC;AAAA,YACA,QAAQ,SAAS,KAAK;AAAA,UACvB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IAED;AACC,aAAO,CAAC;AAAA,EACV;AACD;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-typescript-app",
|
|
3
|
-
"version": "1.57.
|
|
3
|
+
"version": "1.57.3",
|
|
4
4
|
"description": "Quickstart-friendly TypeScript template with comprehensive, configurable, opinionated tooling. 💝",
|
|
5
5
|
"repository": "JoshuaKGoldberg/create-typescript-app",
|
|
6
6
|
"license": "MIT",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"rimraf": "^5.0.5",
|
|
55
55
|
"title-case": "^4.1.2",
|
|
56
56
|
"zod": "^3.22.4",
|
|
57
|
-
"zod-validation-error": "^3.0.
|
|
57
|
+
"zod-validation-error": "^3.0.2"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@octokit/request-error": "^5.0.1",
|
|
@@ -84,9 +84,9 @@
|
|
|
84
84
|
"eslint-plugin-vitest": "^0.3.10",
|
|
85
85
|
"eslint-plugin-yml": "^1.10.0",
|
|
86
86
|
"globby": "^14.0.0",
|
|
87
|
-
"husky": "^
|
|
87
|
+
"husky": "^9.0.0",
|
|
88
88
|
"jsonc-eslint-parser": "^2.4.0",
|
|
89
|
-
"knip": "
|
|
89
|
+
"knip": "5.0.1",
|
|
90
90
|
"lint-staged": "^15.2.0",
|
|
91
91
|
"markdownlint": "^0.33.0",
|
|
92
92
|
"markdownlint-cli": "^0.39.0",
|