Repository: JoshuaKGoldberg/create-typescript-app (ts)

Issue:
🐛 Bug: eslint-plugin-perfectionist's configs/recommended-natural not found in latest version
### Bug Report Checklist

- [X] I have tried restarting my IDE and the issue persists.
- [X] I have pulled the latest `main` branch of the repository.
- [X] I have [searched for related issues](https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=is%3Aissue) and found none that matched my issue.

### Expected

`npx create-typescript-app --base everything` should create a repo with working `pnpm lint`.

### Actual

```plaintext
 $ pnpm lint

> text-table-fast@0.0.0 lint /Users/josh/repos/text-table-fast
> eslint . --max-warnings 0


Oops! Something went wrong! :(

ESLint: 9.7.0

Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './configs/recommended-natural' is not defined by "exports" in /Users/josh/repos/text-table-fast/node_modules/eslint-plugin-perfectionist/package.json imported from /Users/josh/repos/text-table-fast/eslint.config.js
    at exportsNotFound (node:internal/modules/esm/resolve:299:10)
    at packageExportsResolve (node:internal/modules/esm/resolve:646:9)
    at packageResolve (node:internal/modules/esm/resolve:825:14)
    at moduleResolve (node:internal/modules/esm/resolve:915:18)
    at defaultResolve (node:internal/modules/esm/resolve:1132:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:526:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)
    at ModuleJob._link (node:internal/modules/esm/module_job:126:49)
 ELIFECYCLE  Command failed with exit code 2.
```

### Additional Info

💖 

Pull request:
fix: support eslint-plugin-perfectionist@3
## PR Checklist

- [x] Addresses an existing open issue: fixes #1588
- [x] That issue was marked as [`status: accepting prs`](https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22status%3A+accepting+prs%22)
- [x] Steps in [CONTRIBUTING.md](https://github.com/JoshuaKGoldberg/create-typescript-app/blob/main/.github/CONTRIBUTING.md) were taken

## Overview

Bumps to `eslint-plugin-perfection@3` and runs `pnpm lint --fix` for all its behavior differences.

💖 

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d5f7a1..340a566 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## [1.63.1](https://github.com/JoshuaKGoldberg/create-typescript-app/compare/v1.63.0...v1.63.1) (2024-08-07)
+
+### Bug Fixes
+
+- also install @types/node in created projects ([#1599](https://github.com/JoshuaKGoldberg/create-typescript-app/issues/1599)) ([e60808c](https://github.com/JoshuaKGoldberg/create-typescript-app/commit/e60808c637394a7a75b6a0a1eab914e118b1b15e)), closes [#1598](https://github.com/JoshuaKGoldberg/create-typescript-app/issues/1598)
+
 # [1.63.0](https://github.com/JoshuaKGoldberg/create-typescript-app/compare/v1.62.6...v1.63.0) (2024-08-01)
 
 ### Features
diff --git a/eslint.config.js b/eslint.config.js
index edc111e..9c76e8a 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -15,7 +15,7 @@ import jsonc from "eslint-plugin-jsonc";
 import markdown from "eslint-plugin-markdown";
 import n from "eslint-plugin-n";
 import packageJson from "eslint-plugin-package-json/configs/recommended";
-import perfectionistNatural from "eslint-plugin-perfectionist/configs/recommended-natural";
+import perfectionist from "eslint-plugin-perfectionist";
 import * as regexp from "eslint-plugin-regexp";
 import vitest from "eslint-plugin-vitest";
 import yml from "eslint-plugin-yml";
@@ -45,7 +45,7 @@ export default tseslint.config(
 	jsdoc.configs["flat/recommended-typescript-error"],
 	n.configs["flat/recommended"],
 	packageJson,
-	perfectionistNatural,
+	perfectionist.configs["recommended-natural"],
 	regexp.configs["flat/recommended"],
 	...tseslint.config({
 		extends: [
@@ -99,7 +99,7 @@ export default tseslint.config(
 				"error",
 				{
 					order: "asc",
-					"partition-by-comment": true,
+					partitionByComment: true,
 					type: "natural",
 				},
 			],
diff --git a/package.json b/package.json
index 09feacc..2a3d865 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "create-typescript-app",
-	"version": "1.63.0",
+	"version": "1.63.1",
 	"description": "Quickstart-friendly TypeScript template with comprehensive, configurable, opinionated tooling. 💝",
 	"repository": {
 		"type": "git",
@@ -81,7 +81,7 @@
 		"eslint-plugin-markdown": "^5.0.0",
 		"eslint-plugin-n": "^17.3.1",
 		"eslint-plugin-package-json": "^0.15.0",
-		"eslint-plugin-perfectionist": "^2.9.0",
+		"eslint-plugin-perfectionist": "^3.1.2",
 		"eslint-plugin-regexp": "^2.5.0",
 		"eslint-plugin-vitest": "^0.5.3",
 		"eslint-plugin-yml": "^1.14.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6f34374..1c6d156 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -124,8 +124,8 @@ importers:
         specifier: ^0.15.0
         version: 0.15.0(eslint@9.2.0)(jsonc-eslint-parser@2.4.0)
       eslint-plugin-perfectionist:
-        specifier: ^2.9.0
-        version: 2.9.0(eslint@9.2.0)(typescript@5.5.2)
+        specifier: ^3.1.2
+        version: 3.1.2(eslint@9.2.0)(typescript@5.5.2)
       eslint-plugin-regexp:
         specifier: ^2.5.0
         version: 2.5.0(eslint@9.2.0)
@@ -1369,10 +1369,6 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/scope-manager@6.21.0':
-    resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
-    engines: {node: ^16.0.0 || >=18.0.0}
-
   '@typescript-eslint/scope-manager@7.7.0':
     resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -1390,10 +1386,6 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/types@6.21.0':
-    resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
-    engines: {node: ^16.0.0 || >=18.0.0}
-
   '@typescript-eslint/types@7.7.0':
     resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -1402,15 +1394,6 @@ packages:
     resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@6.21.0':
-    resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-
   '@typescript-eslint/typescript-estree@7.7.0':
     resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -1429,12 +1412,6 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/utils@6.21.0':
-    resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
-    peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
-
   '@typescript-eslint/utils@7.7.0':
     resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -1447,10 +1424,6 @@ packages:
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
 
-  '@typescript-eslint/visitor-keys@6.21.0':
-    resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
-    engines: {node: ^16.0.0 || >=18.0.0}
-
   '@typescript-eslint/visitor-keys@7.7.0':
     resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -2283,13 +2256,14 @@ packages:
       eslint: '>=8.0.0'
       jsonc-eslint-parser: ^2.0.0
 
-  eslint-plugin-perfectionist@2.9.0:
-    resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==}
+  eslint-plugin-perfectionist@3.1.2:
+    resolution: {integrity: sha512-YeqJBqDzbJdYy9u1Tc9ntVEziMiJ2nZ0dpG2DJCWEYpI0UkGKuiTGVep+5ZgQn8nn2/EeC6RSzfysmKiUesGPQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
-      astro-eslint-parser: ^0.16.0
+      astro-eslint-parser: ^1.0.2
       eslint: '>=8.0.0'
       svelte: '>=3.0.0'
-      svelte-eslint-parser: ^0.33.0
+      svelte-eslint-parser: ^0.40.0
       vue-eslint-parser: '>=9.0.0'
     peerDependenciesMeta:
       astro-eslint-parser:
@@ -3364,10 +3338,6 @@ packages:
     resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
     engines: {node: '>=10'}
 
-  minimatch@9.0.3:
-    resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
-    engines: {node: '>=16 || 14 >=14.17'}
-
   minimatch@9.0.5:
     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -5632,11 +5602,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@6.21.0':
-    dependencies:
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/visitor-keys': 6.21.0
-
   '@typescript-eslint/scope-manager@7.7.0':
     dependencies:
       '@typescript-eslint/types': 7.7.0
@@ -5659,27 +5624,10 @@ snapshots:
       - eslint
       - supports-color
 
-  '@typescript-eslint/types@6.21.0': {}
-
   '@typescript-eslint/types@7.7.0': {}
 
   '@typescript-eslint/types@8.0.0': {}
 
-  '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.2)':
-    dependencies:
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.5
-      globby: 11.1.0
-      is-glob: 4.0.3
-      minimatch: 9.0.3
-      semver: 7.6.2
-      ts-api-utils: 1.3.0(typescript@5.5.2)
-    optionalDependencies:
-      typescript: 5.5.2
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/typescript-estree@7.7.0(typescript@5.5.2)':
     dependencies:
       '@typescript-eslint/types': 7.7.0
@@ -5710,20 +5658,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@6.21.0(eslint@9.2.0)(typescript@5.5.2)':
-    dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0)
-      '@types/json-schema': 7.0.15
-      '@types/semver': 7.5.8
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2)
-      eslint: 9.2.0
-      semver: 7.6.2
-    transitivePeerDependencies:
-      - supports-color
-      - typescript
-
   '@typescript-eslint/utils@7.7.0(eslint@9.2.0)(typescript@5.5.2)':
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0)
@@ -5749,11 +5683,6 @@ snapshots:
       - supports-color
       - typescript
 
-  '@typescript-eslint/visitor-keys@6.21.0':
-    dependencies:
-      '@typescript-eslint/types': 6.21.0
-      eslint-visitor-keys: 3.4.3
-
   '@typescript-eslint/visitor-keys@7.7.0':
     dependencies:
       '@typescript-eslint/types': 7.7.0
@@ -6804,11 +6733,12 @@ snapshots:
       sort-package-json: 1.57.0
       validate-npm-package-name: 5.0.0
 
-  eslint-plugin-perfectionist@2.9.0(eslint@9.2.0)(typescript@5.5.2):
+  eslint-plugin-perfectionist@3.1.2(eslint@9.2.0)(typescript@5.5.2):
     dependencies:
-      '@typescript-eslint/utils': 6.21.0(eslint@9.2.0)(typescript@5.5.2)
+      '@typescript-eslint/types': 8.0.0
+      '@typescript-eslint/utils': 8.0.0(eslint@9.2.0)(typescript@5.5.2)
       eslint: 9.2.0
-      minimatch: 9.0.5
+      minimatch: 10.0.1
       natural-compare-lite: 1.4.0
     transitivePeerDependencies:
       - supports-color
@@ -7977,10 +7907,6 @@ snapshots:
     dependencies:
       brace-expansion: 2.0.1
 
-  minimatch@9.0.3:
-    dependencies:
-      brace-expansion: 2.0.1
-
   minimatch@9.0.5:
     dependencies:
       brace-expansion: 2.0.1
diff --git a/src/shared/options/augmentOptionsWithExcludes.ts b/src/shared/options/augmentOptionsWithExcludes.ts
index c25b7bf..d592e30 100644
--- a/src/shared/options/augmentOptionsWithExcludes.ts
+++ b/src/shared/options/augmentOptionsWithExcludes.ts
@@ -4,8 +4,8 @@ import chalk from "chalk";
 import { filterPromptCancel } from "../prompts.js";
 import { Options, OptionsBase } from "../types.js";
 import {
-	ExclusionKey,
 	exclusionDescriptions,
+	ExclusionKey,
 	exclusionKeys,
 	getExclusions,
 } from "./exclusionKeys.js";
diff --git a/src/shared/options/readOptions.ts b/src/shared/options/readOptions.ts
index a416332..8377780 100644
--- a/src/shared/options/readOptions.ts
+++ b/src/shared/options/readOptions.ts
@@ -11,7 +11,7 @@ import { createOptionDefaults } from "./createOptionDefaults/index.js";
 import { detectEmailRedundancy } from "./detectEmailRedundancy.js";
 import { ensureRepositoryExists } from "./ensureRepositoryExists.js";
 import { getBase } from "./getBase.js";
-import { GitHub, getGitHub } from "./getGitHub.js";
+import { getGitHub, GitHub } from "./getGitHub.js";
 import { getPrefillOrPromptedOption } from "./getPrefillOrPromptedOption.js";
 import { logInferredOptions } from "./logInferredOptions.js";
 import { optionsSchema } from "./optionsSchema.js";
diff --git a/src/shared/prompts.ts b/src/shared/prompts.ts
index a886345..4202b66 100644
--- a/src/shared/prompts.ts
+++ b/src/shared/prompts.ts
@@ -1,5 +1,5 @@
 import * as prompts from "@clack/prompts";
 
-export function filterPromptCancel<Value>(value: Value | symbol) {
+export function filterPromptCancel<Value>(value: symbol | Value) {
 	return prompts.isCancel(value) ? undefined : value;
 }
diff --git a/src/shared/readFileSafe.ts b/src/shared/readFileSafe.ts
index 652a25c..4ad8a77 100644
--- a/src/shared/readFileSafe.ts
+++ b/src/shared/readFileSafe.ts
@@ -1,6 +1,6 @@
 import * as fs from "node:fs/promises";
 
-export async function readFileSafe(filePath: URL | string, fallback: string) {
+export async function readFileSafe(filePath: string | URL, fallback: string) {
 	try {
 		return (await fs.readFile(filePath)).toString();
 	} catch {
diff --git a/src/shared/readFileSafeAsJson.ts b/src/shared/readFileSafeAsJson.ts
index 6bd18a9..af2dcbe 100644
--- a/src/shared/readFileSafeAsJson.ts
+++ b/src/shared/readFileSafeAsJson.ts
@@ -1,5 +1,5 @@
 import { readFileSafe } from "./readFileSafe.js";
 
-export async function readFileSafeAsJson(filePath: URL | string) {
+export async function readFileSafeAsJson(filePath: string | URL) {
 	return JSON.parse(await readFileSafe(filePath, "null")) as unknown;
 }
diff --git a/src/steps/initializeGitHubRepository/labels/initializeRepositoryLabels.ts b/src/steps/initializeGitHubRepository/labels/initializeRepositoryLabels.ts
index 06cea95..06b39dd 100644
--- a/src/steps/initializeGitHubRepository/labels/initializeRepositoryLabels.ts
+++ b/src/steps/initializeGitHubRepository/labels/initializeRepositoryLabels.ts
@@ -1,8 +1,8 @@
 import { $ } from "execa";
 
 import {
-	GhLabelData,
 	getExistingEquivalentLabels,
+	GhLabelData,
 } from "./getExistingEquivalentLabels.js";
 import { outcomeLabels } from "./outcomeLabels.js";
 
diff --git a/src/steps/writing/creation/createESLintConfig.ts b/src/steps/writing/creation/createESLintConfig.ts
index 538e73e..a938042 100644
--- a/src/steps/writing/creation/createESLintConfig.ts
+++ b/src/steps/writing/creation/createESLintConfig.ts
@@ -15,7 +15,7 @@ export async function createESLintConfig(options: Options) {
 		!options.excludeLintPackageJson &&
 			`import packageJson from "eslint-plugin-package-json/configs/recommended";`,
 		!options.excludeLintPerfectionist &&
-			`import perfectionistNatural from "eslint-plugin-perfectionist/configs/recommended-natural";`,
+			`import perfectionist from "eslint-plugin-perfectionist";`,
 		!options.excludeLintRegex &&
 			`import * as regexp from "eslint-plugin-regexp";`,
 		!options.excludeTests && `import vitest from "eslint-plugin-vitest";`,
@@ -35,7 +35,8 @@ export async function createESLintConfig(options: Options) {
 			`	jsdoc.configs["flat/recommended-typescript-error"],`,
 		`	n.configs["flat/recommended"],`,
 		!options.excludeLintPackageJson && `	packageJson,`,
-		!options.excludeLintPerfectionist && `	perfectionistNatural,`,
+		!options.excludeLintPerfectionist &&
+			`	perfectionist.configs["recommended-natural"],`,
 		!options.excludeLintRegex && `	regexp.configs["flat/recommended"],`,
 	].filter(Boolean);
 
@@ -122,7 +123,7 @@ export default tseslint.config(
 				"error",
 				{
 					order: "asc",
-					"partition-by-comment": true,
+					partitionByComment: true,
 					type: "natural",
 				},
 			],`
diff --git a/src/steps/writing/creation/dotGitHub/createWorkflowFile.ts b/src/steps/writing/creation/dotGitHub/createWorkflowFile.ts
index 534df93..f25f3c4 100644
--- a/src/steps/writing/creation/dotGitHub/createWorkflowFile.ts
+++ b/src/steps/writing/creation/dotGitHub/createWorkflowFile.ts
@@ -56,7 +56,7 @@ interface WorkflowFileOptionsBase {
 }
 
 interface WorkflowFileOptionsRuns extends WorkflowFileOptionsBase {
-	runs: (WorkflowFileStep | string)[];
+	runs: (string | WorkflowFileStep)[];
 }
 
 interface WorkflowFileOptionsSteps extends WorkflowFileOptionsBase {
diff --git a/src/steps/writing/creation/dotGitHub/createWorkflows.ts b/src/steps/writing/creation/dotGitHub/createWorkflows.ts
index 70a6e1c..3b30143 100644
--- a/src/steps/writing/creation/dotGitHub/createWorkflows.ts
+++ b/src/steps/writing/creation/dotGitHub/createWorkflows.ts
@@ -157,7 +157,6 @@ export function createWorkflows(options: Options) {
 					{
 						uses: "apexskier/github-release-commenter@v1",
 						with: {
-							GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}",
 							"comment-template": `
 							:tada: This is included in version {release_link} :tada:
 
@@ -168,6 +167,7 @@ export function createWorkflows(options: Options) {
 
 							Cheers! 📦🚀
 						`,
+							GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}",
 						},
 					},
 				],
diff --git a/src/steps/writing/creation/dotGitHub/index.ts b/src/steps/writing/creation/dotGitHub/index.ts
index 876e8f6..031d1b8 100644
--- a/src/steps/writing/creation/dotGitHub/index.ts
+++ b/src/steps/writing/creation/dotGitHub/index.ts
@@ -6,8 +6,8 @@ import { createDotGitHubIssueTemplate } from "./issueTemplate.js";
 
 export async function createDotGitHub(options: Options) {
 	return {
-		ISSUE_TEMPLATE: createDotGitHubIssueTemplate(options),
 		actions: createDotGitHubActions(),
+		ISSUE_TEMPLATE: createDotGitHubIssueTemplate(options),
 		workflows: createWorkflows(options),
 		...(await createDotGitHubFiles(options)),
 	};
diff --git a/src/steps/writing/creation/writePackageJson.ts b/src/steps/writing/creation/writePackageJson.ts
index fdaf2c4..6e17975 100644
--- a/src/steps/writing/creation/writePackageJson.ts
+++ b/src/steps/writing/creation/writePackageJson.ts
@@ -33,7 +33,7 @@ export async function writePackageJson(options: Options) {
 	const existingPackageJson =
 		((await readFileSafeAsJson(
 			"./package.json",
-		)) as PartialPackageData | null) ?? {};
+		)) as null | PartialPackageData) ?? {};
 
 	return await formatJson({
 		// If we didn't already have a version, set it to 0.0.0
diff --git a/src/steps/writing/types.ts b/src/steps/writing/types.ts
index 6b5449c..6ec8160 100644
--- a/src/steps/writing/types.ts
+++ b/src/steps/writing/types.ts
@@ -1,3 +1,3 @@
 export interface Structure {
-	[i: string]: Structure | string;
+	[i: string]: string | Structure;
 }


Test patch:
diff --git a/src/bin/help.test.ts b/src/bin/help.test.ts
index c253a82..951430c 100644
--- a/src/bin/help.test.ts
+++ b/src/bin/help.test.ts
@@ -1,5 +1,5 @@
 import chalk from "chalk";
-import { MockInstance, beforeEach, describe, expect, it, vi } from "vitest";
+import { beforeEach, describe, expect, it, MockInstance, vi } from "vitest";
 
 import { logHelpText } from "./help.js";
 
diff --git a/src/shared/cli/outro.test.ts b/src/shared/cli/outro.test.ts
index f46f8e9..9f228a5 100644
--- a/src/shared/cli/outro.test.ts
+++ b/src/shared/cli/outro.test.ts
@@ -1,5 +1,5 @@
 import chalk from "chalk";
-import { MockInstance, beforeEach, describe, expect, it, vi } from "vitest";
+import { beforeEach, describe, expect, it, MockInstance, vi } from "vitest";
 
 import { outro } from "./outro.js";
 
diff --git a/src/shared/doesRepositoryExist.test.ts b/src/shared/doesRepositoryExist.test.ts
index d6a3db9..5932d64 100644
--- a/src/shared/doesRepositoryExist.test.ts
+++ b/src/shared/doesRepositoryExist.test.ts
@@ -1,5 +1,5 @@
 import { Octokit } from "octokit";
-import { MockInstance, describe, expect, it, vi } from "vitest";
+import { describe, expect, it, MockInstance, vi } from "vitest";
 
 import { doesRepositoryExist } from "./doesRepositoryExist.js";
 
diff --git a/src/shared/getGitHubUserAsAllContributor.test.ts b/src/shared/getGitHubUserAsAllContributor.test.ts
index 6b60918..c0300f4 100644
--- a/src/shared/getGitHubUserAsAllContributor.test.ts
+++ b/src/shared/getGitHubUserAsAllContributor.test.ts
@@ -1,5 +1,5 @@
 import chalk from "chalk";
-import { MockInstance, beforeEach, describe, expect, it, vi } from "vitest";
+import { beforeEach, describe, expect, it, MockInstance, vi } from "vitest";
 
 import { getGitHubUserAsAllContributor } from "./getGitHubUserAsAllContributor.js";
 
diff --git a/src/steps/initializeBranchProtectionSettings.test.ts b/src/steps/initializeBranchProtectionSettings.test.ts
index 0eec86a..b52aa14 100644
--- a/src/steps/initializeBranchProtectionSettings.test.ts
+++ b/src/steps/initializeBranchProtectionSettings.test.ts
@@ -1,5 +1,5 @@
 import { Octokit } from "octokit";
-import { MockInstance, describe, expect, it, vi } from "vitest";
+import { describe, expect, it, MockInstance, vi } from "vitest";
 
 import { Options } from "../shared/types.js";
 import { initializeBranchProtectionSettings } from "./initializeGitHubRepository/initializeBranchProtectionSettings.js";
diff --git a/src/steps/writing/creation/createESLintConfig.test.ts b/src/steps/writing/creation/createESLintConfig.test.ts
index 72df5f1..36732e1 100644
--- a/src/steps/writing/creation/createESLintConfig.test.ts
+++ b/src/steps/writing/creation/createESLintConfig.test.ts
@@ -115,7 +115,7 @@ describe("createESLintConfig", () => {
 				import markdown from "eslint-plugin-markdown";
 				import n from "eslint-plugin-n";
 				import packageJson from "eslint-plugin-package-json/configs/recommended";
-				import perfectionistNatural from "eslint-plugin-perfectionist/configs/recommended-natural";
+				import perfectionist from "eslint-plugin-perfectionist";
 				import * as regexp from "eslint-plugin-regexp";
 				import vitest from "eslint-plugin-vitest";
 				import yml from "eslint-plugin-yml";
@@ -145,7 +145,7 @@ describe("createESLintConfig", () => {
 				  jsdoc.configs["flat/recommended-typescript-error"],
 				  n.configs["flat/recommended"],
 				  packageJson,
-				  perfectionistNatural,
+				  perfectionist.configs["recommended-natural"],
 				  regexp.configs["flat/recommended"],
 				  ...tseslint.config({
 				    extends: [
@@ -185,7 +185,7 @@ describe("createESLintConfig", () => {
 				        "error",
 				        {
 				          order: "asc",
-				          "partition-by-comment": true,
+				          partitionByComment: true,
 				          type: "natural",
 				        },
 				      ],