create-typescript-app 2.67.4 → 2.68.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.
@@ -5,8 +5,8 @@ import { resolveBin } from "../utils/resolveBin.mjs";
5
5
  import { CommandPhase } from "./phases.mjs";
6
6
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
7
7
  import { formatFile } from "../utils/formatFile.mjs";
8
- import { blockPackageJson } from "./blockPackageJson.mjs";
9
8
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
9
+ import { blockPackageJson } from "./blockPackageJson.mjs";
10
10
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
11
11
  import { blockVSCode } from "./blockVSCode.mjs";
12
12
  import { z } from "zod";
@@ -27,7 +27,10 @@ const blockCSpell = base.createBlock({
27
27
  if (!cspellJson) return;
28
28
  const { data } = zAddons.safeParse(JSON5.parse(cspellJson[0]));
29
29
  if (!data) return;
30
- return data;
30
+ return {
31
+ ...data,
32
+ ignorePaths: data.ignorePaths.filter((ignorePath) => ignorePath !== ".github")
33
+ };
31
34
  },
32
35
  produce({ addons, options }) {
33
36
  const { ignorePaths, words } = addons;
@@ -52,7 +55,6 @@ const blockCSpell = base.createBlock({
52
55
  "typescript"
53
56
  ],
54
57
  ignorePaths: Array.from(/* @__PURE__ */ new Set([
55
- ".github",
56
58
  "CHANGELOG.md",
57
59
  "dist",
58
60
  "node_modules",
@@ -6,12 +6,21 @@ import { formatYaml } from "./files/formatYaml.mjs";
6
6
  import { createSoloWorkflowFile } from "./files/createSoloWorkflowFile.mjs";
7
7
  import { withPreviously } from "./files/withPreviously.mjs";
8
8
  import { blockPackageJson } from "./blockPackageJson.mjs";
9
+ import { blockCSpell } from "./blockCSpell.mjs";
9
10
  //#region src/blocks/blockCTATransitions.ts
10
11
  const blockCTATransitions = base.createBlock({
11
12
  about: { name: "CTA Transitions" },
12
13
  produce({ options }) {
13
14
  return {
14
- addons: [blockPackageJson({ properties: { devDependencies: { "create-typescript-app": packageData.version } } }), blockRepositoryBranchRuleset({ requiredStatusChecks: ["Transition"] })],
15
+ addons: [
16
+ blockCSpell({ words: [
17
+ "mshick",
18
+ options.owner,
19
+ "stefanzweifel"
20
+ ] }),
21
+ blockPackageJson({ properties: { devDependencies: { "create-typescript-app": packageData.version } } }),
22
+ blockRepositoryBranchRuleset({ requiredStatusChecks: ["Transition"] })
23
+ ],
15
24
  files: { ".github": {
16
25
  actions: { transition: { "action.yaml": withPreviously(formatYaml({
17
26
  description: "Runs create-typescript-app in transition mode",
@@ -31,7 +31,7 @@ There are two steps involved:
31
31
 
32
32
  With the exception of very small typos, all changes to this repository generally need to correspond to an [unassigned open issue marked as \`status: accepting prs\` on the issue tracker](https://github.com/${options.owner}/${options.repository}/issues?q=is%3Aissue+is%3Aopen+label%3A%22status%3A+accepting+prs%22+no%3Aassignee+).
33
33
  If this is your first time contributing, consider searching for [unassigned issues that also have the \`good first issue\` label](https://github.com/${options.owner}/${options.repository}/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22+label%3A%22status%3A+accepting+prs%22+no%3Aassignee+).
34
- If the issue you'd like to fix isn't found on the issue, see [Reporting Issues](#reporting-issues) for filing your own (please do!).
34
+ If the issue you'd like to fix isn't found on the issue tracker, see [Reporting Issues](#reporting-issues) for filing your own (please do!).
35
35
 
36
36
  #### Issue Claiming
37
37
 
@@ -6,8 +6,8 @@ import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
6
6
  import { withPreviously } from "./files/withPreviously.mjs";
7
7
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
8
8
  import { formatFile } from "../utils/formatFile.mjs";
9
- import { blockPackageJson } from "./blockPackageJson.mjs";
10
9
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
10
+ import { blockPackageJson } from "./blockPackageJson.mjs";
11
11
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
12
12
  import { blockVSCode } from "./blockVSCode.mjs";
13
13
  import { blockRemoveDependencies } from "./blockRemoveDependencies.mjs";
@@ -3,8 +3,8 @@ import { base } from "../base.mjs";
3
3
  import { CommandPhase } from "./phases.mjs";
4
4
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
5
5
  import { formatFile } from "../utils/formatFile.mjs";
6
- import { blockPackageJson } from "./blockPackageJson.mjs";
7
6
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
7
+ import { blockPackageJson } from "./blockPackageJson.mjs";
8
8
  import { blockCSpell } from "./blockCSpell.mjs";
9
9
  import { getScriptFileExtension } from "./eslint/getScriptFileExtension.mjs";
10
10
  import { zConfigEmoji } from "./eslint/schemas.mjs";
@@ -1,6 +1,6 @@
1
1
  import { base } from "../base.mjs";
2
- import { blockPackageJson } from "./blockPackageJson.mjs";
3
2
  import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
3
+ import { blockPackageJson } from "./blockPackageJson.mjs";
4
4
  import { blockTSDown } from "./blockTSDown.mjs";
5
5
  import { z } from "zod";
6
6
  //#region src/blocks/blockExports.ts
@@ -2,11 +2,15 @@ import { base } from "../base.mjs";
2
2
  import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
3
3
  import { formatYaml } from "./files/formatYaml.mjs";
4
4
  import { withPreviously } from "./files/withPreviously.mjs";
5
+ import { blockCSpell } from "./blockCSpell.mjs";
5
6
  //#region src/blocks/blockFunding.ts
6
7
  const blockFunding = base.createBlock({
7
8
  about: { name: "Funding" },
8
9
  produce({ options }) {
9
- return { files: { ".github": { "FUNDING.yaml": withPreviously(options.funding && formatYaml({ github: options.funding }), ["FUNDING.yml"]) } } };
10
+ return {
11
+ addons: options.funding ? [blockCSpell({ words: [options.funding] })] : [],
12
+ files: { ".github": { "FUNDING.yaml": withPreviously(options.funding && formatYaml({ github: options.funding }), ["FUNDING.yml"]) } }
13
+ };
10
14
  },
11
15
  transition() {
12
16
  return { addons: [blockRemoveFiles({ files: [".github/FUNDING.yml"] })] };
@@ -13,6 +13,7 @@ export declare const blockGitHubActionsCI: import("bingo-stratum").BlockWithAddo
13
13
  }))[];
14
14
  checkoutWith?: Record<string, string> | undefined;
15
15
  if?: string | undefined;
16
+ permissions?: Record<string, "write" | "none" | "read"> | undefined;
16
17
  }[] | undefined;
17
18
  }, {
18
19
  access: "public" | "restricted";
@@ -4,7 +4,7 @@ import { resolveUses } from "./actions/resolveUses.mjs";
4
4
  import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { blockRepositoryBranchRuleset } from "./blockRepositoryBranchRuleset.mjs";
6
6
  import { formatYaml } from "./files/formatYaml.mjs";
7
- import { createMultiWorkflowFile } from "./files/createMultiWorkflowFile.mjs";
7
+ import { createMultiWorkflowFile, zMultiWorkflowJobPermissions } from "./files/createMultiWorkflowFile.mjs";
8
8
  import { createSoloWorkflowFile } from "./files/createSoloWorkflowFile.mjs";
9
9
  import { withPreviously } from "./files/withPreviously.mjs";
10
10
  import { z } from "zod";
@@ -15,6 +15,7 @@ const blockGitHubActionsCI = base.createBlock({
15
15
  checkoutWith: z.record(z.string(), z.string()).optional(),
16
16
  if: z.string().optional(),
17
17
  name: z.string(),
18
+ permissions: zMultiWorkflowJobPermissions.optional(),
18
19
  steps: z.array(zActionStep)
19
20
  })).optional() },
20
21
  produce({ addons, options }) {
@@ -4,11 +4,11 @@ import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
4
4
  import { withPreviously } from "./files/withPreviously.mjs";
5
5
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
6
6
  import { formatFile } from "../utils/formatFile.mjs";
7
- import { blockPackageJson } from "./blockPackageJson.mjs";
8
7
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
8
+ import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
9
+ import { blockPackageJson } from "./blockPackageJson.mjs";
9
10
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
10
11
  import { blockVSCode } from "./blockVSCode.mjs";
11
- import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
12
12
  import { intakeFileExportObject } from "./intake/intakeFileExportObject.mjs";
13
13
  import { z } from "zod";
14
14
  import removeUndefinedObjects from "remove-undefined-objects";
@@ -1,7 +1,7 @@
1
1
  import { base } from "../base.mjs";
2
2
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
3
- import { blockPackageJson } from "./blockPackageJson.mjs";
4
3
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
4
+ import { blockPackageJson } from "./blockPackageJson.mjs";
5
5
  import { blockCSpell } from "./blockCSpell.mjs";
6
6
  import { blockESLint } from "./blockESLint.mjs";
7
7
  import { blockPrettier } from "./blockPrettier.mjs";
@@ -38,6 +38,10 @@ Run [\`@vercel/ncc\`](https://github.com/vercel/ncc) to create an output \`dist/
38
38
  \`\`\`shell
39
39
  pnpm build:release
40
40
  \`\`\`
41
+
42
+ CI fails if the committed \`dist/\` doesn't match what \`pnpm build:release\` produces, not counting \`.d.ts\` files.
43
+ If that happens, run \`pnpm build:release\` and commit the changed files under \`dist/\`.
44
+ Renovate PRs that update bundled dependencies need the same: rebuild and commit \`dist/\` on their branch before they can merge.
41
45
  `,
42
46
  heading: "Building for Release"
43
47
  }]
@@ -48,7 +52,14 @@ pnpm build:release
48
52
  steps: [{ run: "pnpm build" }]
49
53
  }, {
50
54
  name: "Build (Release)",
51
- steps: [{ run: "pnpm build:release" }]
55
+ steps: [{ run: "pnpm build:release" }, { run: `# Verify dist/ is up to date
56
+ changes=$(git status --porcelain --untracked-files=all --ignored -- dist ':!*.d.ts' ':!*.d.ts.map')
57
+ if [ -n "$changes" ]; then
58
+ echo "$changes"
59
+ echo "::error::dist/ is out of date. Run 'pnpm build:release', then commit the files listed above. Files marked !! are gitignored and need 'git add --force'."
60
+ exit 1
61
+ fi
62
+ ` }]
52
63
  }] }),
53
64
  blockPackageJson({ properties: {
54
65
  devDependencies: { "@vercel/ncc": "^0.38.3" },
@@ -4,6 +4,7 @@ import { resolveUses } from "./actions/resolveUses.mjs";
4
4
  import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { createSoloWorkflowFile } from "./files/createSoloWorkflowFile.mjs";
6
6
  import { withPreviously } from "./files/withPreviously.mjs";
7
+ import { blockCSpell } from "./blockCSpell.mjs";
7
8
  import { z } from "zod";
8
9
  //#region src/blocks/blockOctoGuide.ts
9
10
  const blockOctoGuide = base.createBlock({
@@ -25,42 +26,45 @@ const blockOctoGuide = base.createBlock({
25
26
  return { config: runOctoGuideStep.with?.config };
26
27
  },
27
28
  produce({ addons, options }) {
28
- return { files: { ".github": { workflows: { "octoguide.yaml": withPreviously(createSoloWorkflowFile({
29
- if: "${{ !endsWith(github.actor, '[bot]') }}",
30
- name: "OctoGuide",
31
- on: {
32
- discussion: { types: ["created", "edited"] },
33
- discussion_comment: { types: [
34
- "created",
35
- "deleted",
36
- "edited"
37
- ] },
38
- issue_comment: { types: [
39
- "created",
40
- "deleted",
41
- "edited"
42
- ] },
43
- issues: { types: ["edited", "opened"] },
44
- pull_request_review_comment: { types: [
45
- "created",
46
- "deleted",
47
- "edited"
48
- ] },
49
- pull_request_target: { types: ["edited", "opened"] }
50
- },
51
- permissions: {
52
- discussions: "write",
53
- issues: "write",
54
- "pull-requests": "write"
55
- },
56
- steps: [{
57
- uses: resolveUses("JoshuaKGoldberg/octoguide", "0.11.1", options.workflowsVersions),
58
- with: {
59
- config: addons.config ?? "recommended",
60
- "github-token": "${{ secrets.GITHUB_TOKEN }}"
61
- }
62
- }]
63
- }), ["octoguide.yml"]) } } } };
29
+ return {
30
+ addons: [blockCSpell({ words: ["octoguide"] })],
31
+ files: { ".github": { workflows: { "octoguide.yaml": withPreviously(createSoloWorkflowFile({
32
+ if: "${{ !endsWith(github.actor, '[bot]') }}",
33
+ name: "OctoGuide",
34
+ on: {
35
+ discussion: { types: ["created", "edited"] },
36
+ discussion_comment: { types: [
37
+ "created",
38
+ "deleted",
39
+ "edited"
40
+ ] },
41
+ issue_comment: { types: [
42
+ "created",
43
+ "deleted",
44
+ "edited"
45
+ ] },
46
+ issues: { types: ["edited", "opened"] },
47
+ pull_request_review_comment: { types: [
48
+ "created",
49
+ "deleted",
50
+ "edited"
51
+ ] },
52
+ pull_request_target: { types: ["edited", "opened"] }
53
+ },
54
+ permissions: {
55
+ discussions: "write",
56
+ issues: "write",
57
+ "pull-requests": "write"
58
+ },
59
+ steps: [{
60
+ uses: resolveUses("JoshuaKGoldberg/octoguide", "0.11.1", options.workflowsVersions),
61
+ with: {
62
+ config: addons.config ?? "recommended",
63
+ "github-token": "${{ secrets.GITHUB_TOKEN }}"
64
+ }
65
+ }]
66
+ }), ["octoguide.yml"]) } } }
67
+ };
64
68
  },
65
69
  transition() {
66
70
  return { addons: [blockRemoveFiles({ files: [".github/workflows/accessibility-alt-text-bot.{yaml,yml}", ".github/workflows/compliance.{yaml,yml}"] })] };
@@ -1,6 +1,8 @@
1
1
  //#region src/blocks/blockPackageJson.d.ts
2
2
  export declare const blockPackageJson: import("bingo-stratum").BlockWithAddons<{
3
3
  cleanupCommands: string[];
4
+ existingFiles: string[];
5
+ outdatedFiles: string[];
4
6
  properties: {
5
7
  [x: string]: unknown;
6
8
  name?: string | undefined;
@@ -4,6 +4,7 @@ import { CommandPhase } from "./phases.mjs";
4
4
  import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { formatFile } from "../utils/formatFile.mjs";
6
6
  import { resolveEmails } from "../utils/resolveEmails.mjs";
7
+ import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
7
8
  import { z } from "zod";
8
9
  import semver from "semver";
9
10
  import removeUndefinedObjects from "remove-undefined-objects";
@@ -15,8 +16,15 @@ const blockPackageJson = base.createBlock({
15
16
  about: { name: "Package JSON" },
16
17
  addons: {
17
18
  cleanupCommands: z.array(z.string()).default([]),
19
+ existingFiles: z.array(z.string()).default([]),
20
+ outdatedFiles: z.array(z.string()).default([]),
18
21
  properties: PackageJsonWithNullableScripts.default({})
19
22
  },
23
+ intake({ files }) {
24
+ const packageData = intakeFileAsJson(files, ["package.json"]);
25
+ if (!Array.isArray(packageData?.files)) return;
26
+ return { existingFiles: packageData.files.filter((file) => typeof file === "string") };
27
+ },
20
28
  produce({ addons, offline, options }) {
21
29
  const dependencies = useLargerVersions(options.packageData?.dependencies, {
22
30
  ...options.packageData?.dependencies,
@@ -41,7 +49,7 @@ const blockPackageJson = base.createBlock({
41
49
  devDependencies: Object.keys(devDependencies).length ? devDependencies : void 0,
42
50
  engines: { node: /^\d/u.test(options.node.minimum) ? `>=${options.node.minimum}` : options.node.minimum },
43
51
  ...options.pnpm && { packageManager: `pnpm@${options.pnpm}` },
44
- files: processFiles(addons.properties.files),
52
+ files: mergeFiles(processFiles(addons.properties.files), addons.existingFiles, addons.outdatedFiles, options.bin),
45
53
  keywords: options.keywords,
46
54
  name: options.repository,
47
55
  repository: {
@@ -65,8 +73,29 @@ const blockPackageJson = base.createBlock({
65
73
  return { addons: [blockRemoveFiles({ files: ["package-lock.json yarn.lock"] })] };
66
74
  }
67
75
  });
68
- function processFiles(files) {
69
- if (!files?.length) return;
76
+ function mergeFiles(addonFiles, existingFiles, outdatedFiles, bin) {
77
+ const removals = new Set([
78
+ ...outdatedFiles,
79
+ ...typeof bin === "object" ? Object.values(bin) : [bin],
80
+ "LICENSE.md",
81
+ "package.json",
82
+ "README.md"
83
+ ].filter((file) => file !== void 0).map(normalizeFile));
84
+ const seen = new Set(addonFiles.map(normalizeFile));
85
+ const files = [...addonFiles];
86
+ for (const file of existingFiles) {
87
+ const normalized = normalizeFile(file);
88
+ if (normalized && !removals.has(normalized) && !seen.has(normalized)) {
89
+ files.push(file);
90
+ seen.add(normalized);
91
+ }
92
+ }
93
+ return files.length ? files : void 0;
94
+ }
95
+ function normalizeFile(file) {
96
+ return file.replace(/^(!?)\.?\//u, "$1").replace(/\/$/u, "");
97
+ }
98
+ function processFiles(files = []) {
70
99
  const sortedByLength = files.filter(Boolean).sort((a, b) => a.length - b.length);
71
100
  return sortedByLength.filter((file, i) => !sortedByLength.slice(0, i).some((earlier) => earlier.endsWith("/") && file.startsWith(earlier))).sort();
72
101
  }
@@ -5,8 +5,8 @@ import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { withPreviously } from "./files/withPreviously.mjs";
6
6
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
7
7
  import { formatFile } from "../utils/formatFile.mjs";
8
- import { blockPackageJson } from "./blockPackageJson.mjs";
9
8
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
9
+ import { blockPackageJson } from "./blockPackageJson.mjs";
10
10
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
11
11
  import { blockVSCode } from "./blockVSCode.mjs";
12
12
  import { blockCSpell } from "./blockCSpell.mjs";
@@ -5,6 +5,7 @@ import { createSoloWorkflowFile } from "./files/createSoloWorkflowFile.mjs";
5
5
  import { withPreviously } from "./files/withPreviously.mjs";
6
6
  import { formatFile } from "../utils/formatFile.mjs";
7
7
  import { blockPackageJson } from "./blockPackageJson.mjs";
8
+ import { blockCSpell } from "./blockCSpell.mjs";
8
9
  import { blockREADME } from "./blockREADME.mjs";
9
10
  import { blockRepositorySecrets } from "./blockRepositorySecrets.mjs";
10
11
  import { z } from "zod";
@@ -19,6 +20,7 @@ const blockReleaseIt = base.createBlock({
19
20
  const { builders } = addons;
20
21
  return {
21
22
  addons: [
23
+ blockCSpell({ words: ["apexskier"] }),
22
24
  blockPackageJson({ properties: {
23
25
  devDependencies: getPackageDependencies("@release-it/conventional-changelog", "release-it"),
24
26
  scripts: { "should-semantic-release": void 0 }
@@ -5,13 +5,13 @@ import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { withPreviously } from "./files/withPreviously.mjs";
6
6
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
7
7
  import { formatFile } from "../utils/formatFile.mjs";
8
- import { blockPackageJson } from "./blockPackageJson.mjs";
9
8
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
9
+ import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
10
+ import { blockPackageJson } from "./blockPackageJson.mjs";
10
11
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
11
12
  import { blockRemoveDependencies } from "./blockRemoveDependencies.mjs";
12
13
  import { blockESLint } from "./blockESLint.mjs";
13
14
  import { blockGitignore } from "./blockGitignore.mjs";
14
- import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
15
15
  import { blockReleaseIt } from "./blockReleaseIt.mjs";
16
16
  import { intakeFileDefineConfig } from "./intake/intakeFileDefineConfig.mjs";
17
17
  import { z } from "zod";
@@ -104,6 +104,7 @@ export default defineConfig(${JSON.stringify({
104
104
  transition() {
105
105
  return { addons: [
106
106
  blockGitignore({ removals: ["/lib", "lib/"] }),
107
+ blockPackageJson({ outdatedFiles: ["lib/"] }),
107
108
  blockRemoveDependencies({ dependencies: [
108
109
  "@babel/cli",
109
110
  "@babel/core",
@@ -2,14 +2,14 @@ import { getPackageDependencies } from "../data/packageData.mjs";
2
2
  import { base } from "../base.mjs";
3
3
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
4
4
  import { formatFile } from "../utils/formatFile.mjs";
5
- import { blockPackageJson } from "./blockPackageJson.mjs";
6
5
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
6
+ import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
7
+ import { blockPackageJson } from "./blockPackageJson.mjs";
7
8
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
8
9
  import { getPrimaryBin } from "./bin/getPrimaryBin.mjs";
9
10
  import { blockVSCode } from "./blockVSCode.mjs";
10
11
  import { blockExampleFiles } from "./blockExampleFiles.mjs";
11
12
  import { blockGitignore } from "./blockGitignore.mjs";
12
- import { intakeFileAsJson } from "./intake/intakeFileAsJson.mjs";
13
13
  import { blockKnip } from "./blockKnip.mjs";
14
14
  import { blockVitest } from "./blockVitest.mjs";
15
15
  import sortKeys from "sort-keys";
@@ -4,8 +4,8 @@ import { base } from "../base.mjs";
4
4
  import { blockRemoveFiles } from "./blockRemoveFiles.mjs";
5
5
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
6
6
  import { formatFile } from "../utils/formatFile.mjs";
7
- import { blockPackageJson } from "./blockPackageJson.mjs";
8
7
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
8
+ import { blockPackageJson } from "./blockPackageJson.mjs";
9
9
  import { blockRemoveWorkflows } from "./blockRemoveWorkflows.mjs";
10
10
  import { blockVSCode } from "./blockVSCode.mjs";
11
11
  import { blockCSpell } from "./blockCSpell.mjs";
@@ -1,7 +1,7 @@
1
1
  import { base } from "../base.mjs";
2
2
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
3
- import { blockPackageJson } from "./blockPackageJson.mjs";
4
3
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
4
+ import { blockPackageJson } from "./blockPackageJson.mjs";
5
5
  import { blockCSpell } from "./blockCSpell.mjs";
6
6
  import { blockESLint } from "./blockESLint.mjs";
7
7
  import { blockGitignore } from "./blockGitignore.mjs";
@@ -1,5 +1,11 @@
1
1
  import { WorkflowsVersions } from "../../schemas.mjs";
2
+ import { z } from "zod";
2
3
  //#region src/blocks/files/createMultiWorkflowFile.d.ts
4
+ export declare const zMultiWorkflowJobPermissions: z.ZodRecord<z.ZodString, z.ZodEnum<{
5
+ write: "write";
6
+ none: "none";
7
+ read: "read";
8
+ }>>;
3
9
  export interface MultiWorkflowFileOptions {
4
10
  jobs: MultiWorkflowJobOptions[];
5
11
  name: string;
@@ -9,6 +15,7 @@ export interface MultiWorkflowJobOptions {
9
15
  checkoutWith?: Record<string, string>;
10
16
  if?: string;
11
17
  name: string;
18
+ permissions?: z.infer<typeof zMultiWorkflowJobPermissions>;
12
19
  steps: MultiWorkflowJobStep[];
13
20
  }
14
21
  export type MultiWorkflowJobStep = {
@@ -1,12 +1,19 @@
1
1
  import { resolveUses } from "../actions/resolveUses.mjs";
2
2
  import { createJobName } from "./createJobName.mjs";
3
3
  import { formatWorkflowYaml } from "./formatWorkflowYaml.mjs";
4
+ import { z } from "zod";
4
5
  //#region src/blocks/files/createMultiWorkflowFile.ts
6
+ const zMultiWorkflowJobPermissions = z.record(z.string(), z.enum([
7
+ "none",
8
+ "read",
9
+ "write"
10
+ ]));
5
11
  function createMultiWorkflowFile({ jobs, name, workflowsVersions }) {
6
12
  return formatWorkflowYaml({
7
13
  jobs: Object.fromEntries(jobs.map((job) => [createJobName(job.name), {
8
14
  if: job.if,
9
15
  name: job.name,
16
+ permissions: job.permissions,
10
17
  "runs-on": "ubuntu-latest",
11
18
  steps: [
12
19
  {
@@ -25,4 +32,4 @@ function createMultiWorkflowFile({ jobs, name, workflowsVersions }) {
25
32
  });
26
33
  }
27
34
  //#endregion
28
- export { createMultiWorkflowFile };
35
+ export { createMultiWorkflowFile, zMultiWorkflowJobPermissions };
@@ -1749,6 +1749,7 @@ export declare const blocks: {
1749
1749
  }))[];
1750
1750
  checkoutWith?: Record<string, string> | undefined;
1751
1751
  if?: string | undefined;
1752
+ permissions?: Record<string, "write" | "none" | "read"> | undefined;
1752
1753
  }[] | undefined;
1753
1754
  }, {
1754
1755
  access: "public" | "restricted";
@@ -2474,6 +2475,8 @@ export declare const blocks: {
2474
2475
  }>;
2475
2476
  blockPackageJson: import("bingo-stratum").BlockWithAddons<{
2476
2477
  cleanupCommands: string[];
2478
+ existingFiles: string[];
2479
+ outdatedFiles: string[];
2477
2480
  properties: {
2478
2481
  [x: string]: unknown;
2479
2482
  name?: string | undefined;
@@ -1,10 +1,10 @@
1
1
  import { blockGitHubActionsCI } from "./blockGitHubActionsCI.mjs";
2
2
  import { blockAreTheTypesWrong } from "./blockAreTheTypesWrong.mjs";
3
- import { blockPackageJson } from "./blockPackageJson.mjs";
4
- import { blockCTATransitions } from "./blockCTATransitions.mjs";
5
3
  import { blockDevelopmentDocs } from "./blockDevelopmentDocs.mjs";
4
+ import { blockPackageJson } from "./blockPackageJson.mjs";
6
5
  import { blockVSCode } from "./blockVSCode.mjs";
7
6
  import { blockCSpell } from "./blockCSpell.mjs";
7
+ import { blockCTATransitions } from "./blockCTATransitions.mjs";
8
8
  import { blockESLintMoreStyling } from "./blockESLintMoreStyling.mjs";
9
9
  import { blockESLint } from "./blockESLint.mjs";
10
10
  import { blockREADME } from "./blockREADME.mjs";
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { base } from "./base.mjs";
2
2
  import { blockGitHubActionsCI } from "./blocks/blockGitHubActionsCI.mjs";
3
3
  import { blockAreTheTypesWrong } from "./blocks/blockAreTheTypesWrong.mjs";
4
- import { blockPackageJson } from "./blocks/blockPackageJson.mjs";
5
- import { blockCTATransitions } from "./blocks/blockCTATransitions.mjs";
6
4
  import { blockDevelopmentDocs } from "./blocks/blockDevelopmentDocs.mjs";
5
+ import { blockPackageJson } from "./blocks/blockPackageJson.mjs";
7
6
  import { blockVSCode } from "./blocks/blockVSCode.mjs";
8
7
  import { blockCSpell } from "./blocks/blockCSpell.mjs";
8
+ import { blockCTATransitions } from "./blocks/blockCTATransitions.mjs";
9
9
  import { blockESLintMoreStyling } from "./blocks/blockESLintMoreStyling.mjs";
10
10
  import { blockESLint } from "./blocks/blockESLint.mjs";
11
11
  import { blockREADME } from "./blocks/blockREADME.mjs";
@@ -2,8 +2,8 @@ import { base } from "../base.mjs";
2
2
  import { blockRemoveFiles } from "../blocks/blockRemoveFiles.mjs";
3
3
  import { blockRepositoryBranchRuleset } from "../blocks/blockRepositoryBranchRuleset.mjs";
4
4
  import { blockGitHubActionsCI } from "../blocks/blockGitHubActionsCI.mjs";
5
- import { blockPackageJson } from "../blocks/blockPackageJson.mjs";
6
5
  import { blockDevelopmentDocs } from "../blocks/blockDevelopmentDocs.mjs";
6
+ import { blockPackageJson } from "../blocks/blockPackageJson.mjs";
7
7
  import { blockRemoveWorkflows } from "../blocks/blockRemoveWorkflows.mjs";
8
8
  import { blockRemoveDependencies } from "../blocks/blockRemoveDependencies.mjs";
9
9
  import { blockESLint } from "../blocks/blockESLint.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-typescript-app",
3
- "version": "2.67.4",
3
+ "version": "2.68.0",
4
4
  "description": "Quickstart-friendly TypeScript template with comprehensive, configurable, opinionated tooling. 🎁",
5
5
  "repository": {
6
6
  "type": "git",