@williamthorsen/release-kit 1.0.1 → 2.1.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.
package/CHANGELOG.md CHANGED
@@ -2,109 +2,38 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [release-kit-v1.0.1] - 2026-03-12
6
-
7
- ### Bug fixes
8
-
9
- - #34 release-kit|fix: Fix failure to find consumer's config (#35)
10
-
11
- Resolves the config file path to an absolute path using `process.cwd()` before passing it to both `existsSync` and `jiti.import()`. Previously, `jiti.import()` received a bare relative path which it resolved against `import.meta.url` (the package's install location), making it impossible for consumers to load their config files. Also fixes root tsconfig includes to cover `.config/` and removes a stale duplicate comment.
12
-
13
- ## [release-kit-v1.0.0] - 2026-03-12
14
-
15
- ### Features
16
-
17
- - #28 release-kit|feat!: Migrate to CLI-driven release preparation with auto-discovery (#31)
18
-
19
- Replaces release-kit's script-based release preparation with a self-contained CLI (`npx @williamthorsen/release-kit prepare`) that auto-discovers workspaces from `pnpm-workspace.yaml`. Adds workspace auto-discovery, TypeScript config loading via jiti, config validation, and a `component()` factory that accepts full workspace-relative paths. Refactors the type system: `WorkTypeConfig` becomes a record keyed by type name, version-bump rules move to a separate `VersionPatterns` structure, and `ComponentConfig` gains a `dir` field for canonical directory identity.
20
-
21
- ### Refactoring
22
-
23
- - #28 release-kit|refactor: Adjust location of config & tags file
24
-
25
- ### Tooling
26
-
27
- - #28 release-kit|tooling: Remove legacy release-kit scripts
28
-
29
- ## [release-kit-v0.3.0] - 2026-03-11
5
+ ## [release-kit-v2.1.0] - 2026-03-17
30
6
 
31
7
  ### Features
32
8
 
33
- - Release-kit|feat: Extract CLI runner into release-kit and co-locate scripts with workflow
34
-
35
- Move release script logic (arg parsing, validation, component filtering) into a reusable `runReleasePrepare` function in the release-kit package. Consuming repos now provide only their config and call `runReleasePrepare(config)`.
36
-
37
- Relocate release-prepare.ts and release.config.ts from scripts/ to .github/scripts/ so they live alongside the workflow they serve.
38
-
39
- - #20 release-kit|feat: Add release-kit init CLI command for automated repo setup (#22)
40
-
41
- Add an interactive `npx release-kit init` CLI command that checks repo eligibility, detects monorepo vs single-package layout, scaffolds workflow/scripts/config files, and updates `package.json` with release scripts.
42
-
43
- Also expand `runReleasePrepare` to polymorphically handle both `MonorepoReleaseConfig` and `ReleaseConfig`, and update the esbuild plugin to preserve shebangs during compilation.
44
-
45
- - #24 release-kit|feat: Return computed tags from release prepare and write .release-tags (#27)
9
+ - #7 release-kit|feat!: Slim down release workflow by removing unnecessary pnpm install (#21)
46
10
 
47
- `releasePrepare` and `releasePrepareMono` now return `string[]` of computed tag names instead of `void`. `runReleasePrepare` writes these tags to a `.release-tags` file (one tag per line) so the CI workflow can read them instead of independently deriving tag names from `git diff`. In dry-run mode the file is not written. This makes `tagPrefix` the single source of truth for tag names, eliminating the mismatch between TypeScript-computed tags and workflow-derived tags.
11
+ Make release-kit self-contained by invoking git-cliff via `npx --yes` instead of requiring it on PATH, and by appending modified file paths to the format command so lightweight formatters like `npx prettier --write` work without a full `pnpm install`. Update init templates, README, and consuming repo config/workflow to reference workflow v3.
48
12
 
49
- ## [strings-v3.1.1] - 2026-03-10
13
+ - #22 release-kit|feat: Add --force flag to release-kit prepare (#25)
50
14
 
51
- ### Tooling
15
+ Add a `--force` flag to `release-kit prepare` that bypasses the "no commits since last tag" check in monorepo mode, allowing version bumping and changelog generation to proceed even when no new commits are found since the last release tag. The flag requires `--bump` since there are no commits to infer bump type from. The local release workflow gains a `force` boolean input for future use.
52
16
 
53
- - \*|tooling: Change package registry from github to npmjs
17
+ - #20 release-kit|feat!: Move reusable release workflow into repo (#26)
54
18
 
55
- ## [tools-v3.0.1] - 2026-03-10
19
+ Moves the reusable release workflow from `williamthorsen/.github` into this repo as `release-workflow.yaml`, stripping all pnpm-related steps since release-kit now runs git-cliff and prettier via `npx` internally. Updates this repo's caller workflow to use a relative path and update init templates to reference the new location. Establishes a naming convention (`{name}-workflow.yaml` for reusable, `{name}.yaml` for callers) and independent versioning strategy (`{name}-workflow-v{major}` tags), documented in `.github/workflows/README.md`.
56
20
 
57
- ### Tooling
21
+ - #30 release-kit|feat: Allow git-cliff to be used without config (#31)
58
22
 
59
- - \*|tooling: Change package registry from github to npmjs
23
+ Adds a `resolveCliffConfigPath()` function that searches for a git-cliff config in a 4-step cascade (explicit path → `.config/git-cliff.toml` → `cliff.toml` → bundled `cliff.toml.template`), eliminating the requirement for consuming repos to maintain a cliff config copy. Restructures the `init` command to scaffold only the workflow file by default, with new `--with-config` and `--force` flags. Moves `.release-tags` from `/tmp/release-kit/` to project-local `tmp/` for predictable behavior in local runs.
60
24
 
61
- ## [release-kit-v0.2.1] - 2026-03-09
62
-
63
- ### Tooling
64
-
65
- - Root|tooling: Make release-kit public
66
-
67
- ## [release-kit-v0.2.0] - 2026-03-09
68
-
69
- ### Documentation
70
-
71
- - Release-kit|docs: Rewrite README as adoption guide
72
-
73
- Replace minimal API docs with end-to-end adoption guide covering single-package and monorepo configurations, release scripts, GitHub Actions workflows that commit directly to `main`.
74
-
75
- ### Tooling
76
-
77
- - #13 root|tooling: Migrate from changesets to release-kit (#16)
78
-
79
- Replaces the `@changesets/cli`-based release workflow with the in-house `release-kit` package, adding `git-cliff` for changelog generation, a monorepo release config for all 13 packages, and a CLI wrapper script. Removes all changeset infrastructure and creates per-package baseline version tags.
80
-
81
- - #10 root|tooling: Publish release-kit to GitHub Package Registry (#17)
25
+ ### Refactoring
82
26
 
83
- Adds release infrastructure for the toolbelt monorepo: a GitHub Actions `workflow_dispatch` workflow that automates the full release cycle (prepare, commit, tag, push) on `main`, convenience `release:prepare` scripts in the release-kit package, and a `RELEASING.md` documenting the workflow-based release process.
27
+ - #6 release-kit|refactor: Clean up release-kit post-migration issues (#19)
84
28
 
85
- - #10 root|tooling: Streamline release-kit adoption
29
+ Addresses five code quality issues and a test coverage gap identified during the release-kit migration (#5). Extracts a duplicated `isRecord` type guard into a shared module, eliminates a double-read in `bumpAllVersions`, improves error handling in `usesPnpm` by replacing a silent catch with a structured error boundary, removes an unreachable `'feature'` pattern from version defaults, and adds an integration test for scaffold template path resolution.
86
30
 
87
- ## [tools-v3.0.0] - 2026-03-08
31
+ ## [release-kit-v1.0.1] - 2026-03-14
88
32
 
89
33
  ### Features
90
34
 
91
- - #7 release|feat: Create release-kit package (#9)
92
-
93
- Creates the `@williamthorsen/release-kit` package in the `toolbelt` monorepo, extracting version-bumping and changelog-generation logic from `skypilot-site` and `devtools/afg` into a reusable library. The package provides functions for parsing conventional commits, determining semver bump types, updating `package.json` versions across workspaces, and generating changelogs via `git-cliff`.
94
-
95
- Add contextual error messages to all I/O operations: file reads/writes in bumpAllVersions, execSync calls in generateChangelogs and releasePrepare, and git commands in getCommitsSinceTarget.
96
-
97
- Differentiate expected "no tag" errors from real failures in git describe. Replace string-based commit separator with null-byte to prevent collisions with commit message content. Log git log failures before returning empty results.
98
-
99
- Add tests for uppercase/mixed-case type resolution, workspace+breaking combo parsing, breaking-on-first-commit early return, and empty workTypes. Strengthen alias tests to use toStrictEqual for full shape
100
- verification.
101
-
102
- Simplify determineBumpType by replacing the redundant isKeyOf guard on RELEASE_PRIORITY with a direct lookup, since bump is already typed as ReleaseType. Simplify parseCommitMessage by replacing mutable object construction with a conditional spread for the optional workspace field.
103
-
104
- Add workspaceAliases field to ReleaseConfig and integrate into parseCommitMessage for resolving workspace shorthand names to canonical names. Replace execSync with execFileSync using argument arrays in generateChangelogs and getCommitsSinceTarget to prevent shell injection from paths with special characters. Remove redundant length-check guard in bumpAllVersions, keeping the undefined guard that also narrows the type.
105
-
106
- ### Refactoring
35
+ - #5 release-kit|feat: Migrate release-kit from toolbelt (#18)
107
36
 
108
- - Release-kit|refactor: Inline isKeyOf and remove toolbelt.objects dependency
37
+ Migrates the complete `@williamthorsen/release-kit` package (v1.0.1) from `williamthorsen/toolbelt` into `packages/release-kit/`, adds shebang preservation to the shared esbuild plugin for CLI binaries, and sets up dogfooding infrastructure so this monorepo uses release-kit for its own releases.
109
38
 
110
39
  <!-- generated by git-cliff -->
package/README.md CHANGED
@@ -7,23 +7,20 @@ Provides a self-contained CLI that auto-discovers workspaces from `pnpm-workspac
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- pnpm add -D @williamthorsen/release-kit git-cliff
10
+ pnpm add -D @williamthorsen/release-kit
11
11
  ```
12
12
 
13
13
  ## Quick start
14
14
 
15
15
  ```bash
16
- # 1. Set up release-kit in your repo (scaffolds workflow + optional config)
16
+ # 1. Set up release-kit in your repo (scaffolds the release workflow)
17
17
  npx @williamthorsen/release-kit init
18
18
 
19
19
  # 2. Preview what a release would do
20
20
  npx @williamthorsen/release-kit prepare --dry-run
21
-
22
- # 3. Copy cliff.toml.template to your repo root (if init didn't create one)
23
- cp node_modules/@williamthorsen/release-kit/cliff.toml.template cliff.toml
24
21
  ```
25
22
 
26
- That's it for most repos. The CLI auto-discovers workspaces and applies sensible defaults. Customize only what you need via `.config/release-kit.config.ts`.
23
+ That's it for most repos. The CLI auto-discovers workspaces and applies sensible defaults. The bundled `cliff.toml.template` is used automatically — no need to copy it. Customize only what you need via `.config/release-kit.config.ts`.
27
24
 
28
25
  ## How it works
29
26
 
@@ -31,7 +28,7 @@ That's it for most repos. The CLI auto-discovers workspaces and applies sensible
31
28
  2. **Config loading**: loads `.config/release-kit.config.ts` (if present) via [jiti](https://github.com/unjs/jiti) and merges it with discovered defaults.
32
29
  3. **Commit analysis**: for each component, finds commits since the last version tag, parses them for type and scope, and determines the appropriate version bump.
33
30
  4. **Version bump + changelog**: bumps `package.json` versions and generates changelogs via `git-cliff`.
34
- 5. **Release tags file**: writes computed tags to `/tmp/release-kit/.release-tags` for CI consumption.
31
+ 5. **Release tags file**: writes computed tags to `tmp/.release-tags` for the release workflow to read when tagging and pushing.
35
32
 
36
33
  ## CLI reference
37
34
 
@@ -59,21 +56,23 @@ node packages/release-kit/dist/esm/bin/release-kit.js prepare --dry-run
59
56
 
60
57
  ### `release-kit init`
61
58
 
62
- Initialize release-kit in the current repository. Scaffolds a GitHub Actions workflow and an optional config file.
59
+ Initialize release-kit in the current repository. By default, scaffolds only the GitHub Actions workflow file. Use `--with-config` to also scaffold configuration files.
63
60
 
64
61
  ```
65
62
  Usage: release-kit init [options]
66
63
 
67
64
  Options:
68
- --dry-run Preview changes without writing files
69
- --help, -h Show help
65
+ --with-config Also scaffold .config/release-kit.config.ts and .config/git-cliff.toml
66
+ --force Overwrite existing files instead of skipping them
67
+ --dry-run Preview changes without writing files
68
+ --help, -h Show help
70
69
  ```
71
70
 
72
71
  Scaffolded files:
73
72
 
74
- - `.config/release-kit.config.ts` — starter config with commented-out customization examples
75
73
  - `.github/workflows/release.yaml` — workflow that delegates to a reusable release workflow
76
- - `cliff.toml` — copied from the bundled template (prompted if missing)
74
+ - `.config/release-kit.config.ts` — starter config with commented-out customization examples (with `--with-config`)
75
+ - `.config/git-cliff.toml` — copied from the bundled template (with `--with-config`)
77
76
 
78
77
  ## Configuration
79
78
 
@@ -88,8 +87,8 @@ const config: ReleaseKitConfig = {
88
87
  // Exclude a component from release processing
89
88
  components: [{ dir: 'internal-tools', shouldExclude: true }],
90
89
 
91
- // Run a formatter after changelog generation
92
- formatCommand: 'pnpm run fmt',
90
+ // Run a formatter after changelog generation (modified file paths are appended as arguments)
91
+ formatCommand: 'npx prettier --write',
93
92
 
94
93
  // Override the default version patterns
95
94
  versionPatterns: { major: ['!'], minor: ['feat', 'feature'] },
@@ -105,14 +104,14 @@ The config file supports both `export default config` and `export const config =
105
104
 
106
105
  ### `ReleaseKitConfig` reference
107
106
 
108
- | Field | Type | Description |
109
- | ------------------ | -------------------------------- | ------------------------------------------------------------ |
110
- | `cliffConfigPath` | `string` | Path to `cliff.toml` (defaults to `'cliff.toml'`) |
111
- | `components` | `ComponentOverride[]` | Override or exclude discovered components (matched by `dir`) |
112
- | `formatCommand` | `string` | Shell command to run after changelog generation |
113
- | `versionPatterns` | `VersionPatterns` | Rules for which commit types trigger major/minor bumps |
114
- | `workspaceAliases` | `Record<string, string>` | Maps shorthand workspace names to canonical names in commits |
115
- | `workTypes` | `Record<string, WorkTypeConfig>` | Work type definitions, merged with defaults by key |
107
+ | Field | Type | Description |
108
+ | ------------------ | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
109
+ | `cliffConfigPath` | `string` | Explicit path to cliff config. If omitted, resolved automatically: `.config/git-cliff.toml` `cliff.toml` → bundled template |
110
+ | `components` | `ComponentOverride[]` | Override or exclude discovered components (matched by `dir`) |
111
+ | `formatCommand` | `string` | Shell command to run after changelog generation; modified file paths are appended as arguments |
112
+ | `versionPatterns` | `VersionPatterns` | Rules for which commit types trigger major/minor bumps |
113
+ | `workspaceAliases` | `Record<string, string>` | Maps shorthand workspace names to canonical names in commits |
114
+ | `workTypes` | `Record<string, WorkTypeConfig>` | Work type definitions, merged with defaults by key |
116
115
 
117
116
  All fields are optional.
118
117
 
@@ -230,14 +229,9 @@ jobs:
230
229
  fetch-depth: 0
231
230
  token: ${{ secrets.GITHUB_TOKEN }}
232
231
 
233
- - uses: pnpm/action-setup@v4
234
-
235
232
  - uses: actions/setup-node@v4
236
233
  with:
237
- node-version: '22'
238
- cache: 'pnpm'
239
-
240
- - run: pnpm install
234
+ node-version: '24'
241
235
 
242
236
  - name: Run release preparation
243
237
  run: |
@@ -264,7 +258,7 @@ jobs:
264
258
  if: steps.check.outputs.changed == 'true'
265
259
  id: tags
266
260
  run: |
267
- TAGS=$(cat /tmp/release-kit/.release-tags | tr '\n' ' ')
261
+ TAGS=$(cat tmp/.release-tags | tr '\n' ' ')
268
262
  echo "tags=$TAGS" >> "$GITHUB_OUTPUT"
269
263
  echo "Releasing: $TAGS"
270
264
 
@@ -302,7 +296,7 @@ And the tag step with:
302
296
  if: steps.check.outputs.changed == 'true'
303
297
  id: tags
304
298
  run: |
305
- TAG=$(cat /tmp/release-kit/.release-tags)
299
+ TAG=$(cat tmp/.release-tags)
306
300
  echo "tag=$TAG" >> "$GITHUB_OUTPUT"
307
301
  ```
308
302
 
@@ -321,26 +315,27 @@ Or use the GitHub UI: Actions > Release > Run workflow.
321
315
 
322
316
  ## cliff.toml setup
323
317
 
324
- The package includes a `cliff.toml.template` with a generic git-cliff configuration that:
318
+ The package includes a bundled `cliff.toml.template` that is used automatically when no custom config is found. The resolution order is:
319
+
320
+ 1. Explicit `cliffConfigPath` in `.config/release-kit.config.ts`
321
+ 2. `.config/git-cliff.toml`
322
+ 3. `cliff.toml` (repo root)
323
+ 4. Bundled `cliff.toml.template` (automatic fallback)
324
+
325
+ The bundled template provides a generic git-cliff configuration that:
325
326
 
326
327
  - Strips issue-ticket prefixes matching `^[A-Z]+-\d+\s+` (e.g., `TOOL-123 `, `AFG-456 `)
327
328
  - Handles both `type: description` and `workspace|type: description` commit formats
328
329
  - Groups commits by work type into changelog sections
329
330
 
330
- Copy it to your repo root:
331
-
332
- ```bash
333
- cp node_modules/@williamthorsen/release-kit/cliff.toml.template cliff.toml
334
- ```
335
-
336
- Then customize as needed for your project.
331
+ To customize, scaffold a local copy with `release-kit init --with-config` and edit `.config/git-cliff.toml`.
337
332
 
338
333
  ## External dependencies
339
334
 
340
335
  This package shells out to two external tools:
341
336
 
342
337
  - **`git`** — must be available on `PATH`. Used to find tags and retrieve commit history.
343
- - **`git-cliff`** — must be available on `PATH`. Add `git-cliff` as a dev dependency to make it available in CI.
338
+ - **`git-cliff`** — automatically downloaded and cached via `npx` on first invocation. No need to install it as a dev dependency.
344
339
 
345
340
  ## Legacy script-based approach
346
341
 
@@ -353,7 +348,7 @@ import { component } from '@williamthorsen/release-kit';
353
348
 
354
349
  export const config: MonorepoReleaseConfig = {
355
350
  components: [component('packages/arrays'), component('packages/strings')],
356
- formatCommand: 'pnpm run fmt',
351
+ formatCommand: 'npx prettier --write',
357
352
  };
358
353
  ```
359
354
 
@@ -367,12 +362,30 @@ runReleasePrepare(config);
367
362
 
368
363
  The key difference: the script-based approach requires manually listing every component, while the CLI auto-discovers them from `pnpm-workspace.yaml`.
369
364
 
365
+ ## Breaking changes
366
+
367
+ ### v1.1.0: `formatCommand` receives file paths as trailing arguments
368
+
369
+ Previously, `formatCommand` was executed as-is (e.g., `pnpm run fmt` would run without arguments). Now, the paths of all modified files (package.json files and changelogs) are appended as trailing arguments.
370
+
371
+ If your format command does not accept file arguments, update it to one that does:
372
+
373
+ ```diff
374
+ -formatCommand: 'pnpm run fmt',
375
+ +formatCommand: 'npx prettier --write',
376
+ ```
377
+
378
+ ### v1.1.0: `git-cliff` is no longer a required dev dependency
379
+
380
+ `git-cliff` is now invoked via `npx --yes git-cliff` instead of requiring it as a dev dependency. You can remove it from your `devDependencies`. The version is not pinned, so `npx` downloads and caches the latest version on first invocation. To pin a specific version, use `npx --yes git-cliff@2.12.0` by wrapping the call in a custom script.
381
+
370
382
  ## Migration from changesets
371
383
 
372
- 1. Add `@williamthorsen/release-kit` and `git-cliff` as dev dependencies.
384
+ 1. Add `@williamthorsen/release-kit` as a dev dependency.
373
385
  2. Remove `@changesets/cli` from dev dependencies.
374
386
  3. Delete the `.changeset/` directory.
375
387
  4. Run `npx @williamthorsen/release-kit init` to scaffold workflow and config files.
376
388
  5. Remove `changeset:*` scripts from `package.json` (no replacement needed — the CLI handles everything).
377
- 6. Copy `cliff.toml.template` to your repo root as `cliff.toml` (if `init` didn't create one).
378
- 7. Create an initial version tag for each package (e.g., `git tag v1.0.0` or `git tag arrays-v1.0.0`).
389
+ 6. Create an initial version tag for each package (e.g., `git tag v1.0.0` or `git tag arrays-v1.0.0`).
390
+
391
+ No cliff config copy is needed — the bundled template is used automatically. To customize, run `release-kit init --with-config`.
package/dist/esm/.cache CHANGED
@@ -1 +1 @@
1
- 0ede8bfb18cd7eb611431537e6a16d4476ee70169599c97626bb6f6fc4349bbf
1
+ c3020d624e72bb577d60cb16ff223c951d26227fa82aec1c15894f2b2429603f
@@ -19,11 +19,13 @@ function showInitHelp() {
19
19
  Usage: release-kit init [options]
20
20
 
21
21
  Initialize release-kit in the current repository.
22
- Scaffolds workflow and config files.
22
+ By default, scaffolds only the GitHub Actions workflow file.
23
23
 
24
24
  Options:
25
- --dry-run Preview changes without writing files
26
- --help, -h Show this help message
25
+ --with-config Also scaffold .config/release-kit.config.ts and .config/git-cliff.toml
26
+ --force Overwrite existing files instead of skipping them
27
+ --dry-run Preview changes without writing files
28
+ --help, -h Show this help message
27
29
  `);
28
30
  }
29
31
  function showPrepareHelp() {
@@ -59,13 +61,16 @@ if (command === "init") {
59
61
  showInitHelp();
60
62
  process.exit(0);
61
63
  }
62
- const unknownFlags = flags.filter((f) => f !== "--dry-run" && f !== "--help" && f !== "-h");
64
+ const knownInitFlags = /* @__PURE__ */ new Set(["--dry-run", "--force", "--with-config", "--help", "-h"]);
65
+ const unknownFlags = flags.filter((f) => !knownInitFlags.has(f));
63
66
  if (unknownFlags.length > 0) {
64
67
  console.error(`Error: Unknown option: ${unknownFlags[0]}`);
65
68
  process.exit(1);
66
69
  }
67
70
  const dryRun = flags.includes("--dry-run");
68
- const exitCode = await initCommand({ dryRun });
71
+ const force = flags.includes("--force");
72
+ const withConfig = flags.includes("--with-config");
73
+ const exitCode = initCommand({ dryRun, force, withConfig });
69
74
  process.exit(exitCode);
70
75
  }
71
76
  console.error(`Error: Unknown command: ${command}`);
@@ -17,7 +17,7 @@ function bumpAllVersions(packageFiles, releaseType, dryRun) {
17
17
  console.info(` [dry-run] Would bump ${filePath}`);
18
18
  continue;
19
19
  }
20
- const pkg = readPackageJson(filePath);
20
+ const pkg = filePath === firstFile ? firstPkg : readPackageJson(filePath);
21
21
  pkg.version = newVersion;
22
22
  try {
23
23
  writeFileSync(filePath, JSON.stringify(pkg, null, 2) + "\n", "utf8");
@@ -12,7 +12,7 @@ const DEFAULT_WORK_TYPES = {
12
12
  };
13
13
  const DEFAULT_VERSION_PATTERNS = {
14
14
  major: ["!"],
15
- minor: ["feat", "feature"]
15
+ minor: ["feat"]
16
16
  };
17
17
  export {
18
18
  DEFAULT_VERSION_PATTERNS,
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { glob } from "glob";
4
4
  import { load } from "js-yaml";
5
+ import { isRecord } from "./typeGuards.js";
5
6
  async function discoverWorkspaces() {
6
7
  const workspaceFile = "pnpm-workspace.yaml";
7
8
  if (!existsSync(workspaceFile)) {
@@ -37,9 +38,6 @@ async function discoverWorkspaces() {
37
38
  }
38
39
  return directories.length > 0 ? [...directories].sort() : void 0;
39
40
  }
40
- function isRecord(value) {
41
- return typeof value === "object" && value !== null && !Array.isArray(value);
42
- }
43
41
  export {
44
42
  discoverWorkspaces
45
43
  };
@@ -1,18 +1,19 @@
1
1
  import { execFileSync } from "node:child_process";
2
+ import { resolveCliffConfigPath } from "./resolveCliffConfigPath.js";
2
3
  function generateChangelog(config, changelogPath, tag, dryRun, options) {
3
- const cliffConfigPath = config.cliffConfigPath ?? "cliff.toml";
4
+ const cliffConfigPath = resolveCliffConfigPath(config.cliffConfigPath, import.meta.url);
4
5
  const outputFile = `${changelogPath}/CHANGELOG.md`;
5
6
  const args = ["--config", cliffConfigPath, "--output", outputFile, "--tag", tag];
6
7
  for (const includePath of options?.includePaths ?? []) {
7
8
  args.push("--include-path", includePath);
8
9
  }
9
10
  if (dryRun) {
10
- console.info(` [dry-run] Would run: git-cliff ${args.join(" ")}`);
11
+ console.info(` [dry-run] Would run: npx --yes git-cliff ${args.join(" ")}`);
11
12
  return;
12
13
  }
13
14
  console.info(` Generating changelog: ${outputFile}`);
14
15
  try {
15
- execFileSync("git-cliff", args, { stdio: "inherit" });
16
+ execFileSync("npx", ["--yes", "git-cliff", ...args], { stdio: "inherit" });
16
17
  } catch (error) {
17
18
  throw new Error(
18
19
  `Failed to generate changelog for ${outputFile}: ${error instanceof Error ? error.message : String(error)}`
@@ -5,5 +5,3 @@ export interface CheckResult {
5
5
  export declare function isGitRepo(): CheckResult;
6
6
  export declare function hasPackageJson(): CheckResult;
7
7
  export declare function usesPnpm(): CheckResult;
8
- export declare function hasCliffToml(): CheckResult;
9
- export declare function notAlreadyInitialized(): CheckResult;
@@ -19,38 +19,18 @@ function usesPnpm() {
19
19
  if (existsSync("pnpm-lock.yaml")) {
20
20
  return { ok: true };
21
21
  }
22
- try {
23
- const raw = readFileSync("package.json", "utf8");
24
- const pkg = parseJsonRecord(raw);
25
- if (pkg !== void 0 && typeof pkg.packageManager === "string" && pkg.packageManager.startsWith("pnpm")) {
26
- return { ok: true };
27
- }
28
- } catch {
29
- }
30
- return {
31
- ok: false,
32
- message: "This project does not appear to use pnpm. A pnpm-lock.yaml or packageManager field is required."
33
- };
34
- }
35
- function hasCliffToml() {
36
- if (existsSync("cliff.toml")) {
37
- return { ok: true };
38
- }
39
- return { ok: false, message: "No cliff.toml found. This file is required for changelog generation." };
40
- }
41
- function notAlreadyInitialized() {
42
- if (!existsSync(".config/release-kit.config.ts") && !existsSync(".github/scripts/release.config.ts")) {
22
+ const raw = readFileSync("package.json", "utf8");
23
+ const pkg = parseJsonRecord(raw);
24
+ if (pkg !== void 0 && typeof pkg.packageManager === "string" && pkg.packageManager.startsWith("pnpm")) {
43
25
  return { ok: true };
44
26
  }
45
27
  return {
46
28
  ok: false,
47
- message: "release-kit appears to be already initialized."
29
+ message: "This project does not appear to use pnpm. A pnpm-lock.yaml or packageManager field is required."
48
30
  };
49
31
  }
50
32
  export {
51
- hasCliffToml,
52
33
  hasPackageJson,
53
34
  isGitRepo,
54
- notAlreadyInitialized,
55
35
  usesPnpm
56
36
  };
@@ -1,5 +1,7 @@
1
1
  interface InitOptions {
2
2
  dryRun: boolean;
3
+ force: boolean;
4
+ withConfig: boolean;
3
5
  }
4
- export declare function initCommand({ dryRun }: InitOptions): Promise<number>;
6
+ export declare function initCommand({ dryRun, force, withConfig }: InitOptions): number;
5
7
  export {};
@@ -1,7 +1,7 @@
1
- import { hasCliffToml, hasPackageJson, isGitRepo, notAlreadyInitialized, usesPnpm } from "./checks.js";
1
+ import { hasPackageJson, isGitRepo, usesPnpm } from "./checks.js";
2
2
  import { detectRepoType } from "./detectRepoType.js";
3
- import { confirm, printError, printStep, printSuccess } from "./prompt.js";
4
- import { copyCliffTemplate, scaffoldFiles } from "./scaffold.js";
3
+ import { printError, printStep, printSuccess } from "./prompt.js";
4
+ import { scaffoldFiles } from "./scaffold.js";
5
5
  function runRequiredCheck(label, result) {
6
6
  if (result.ok) {
7
7
  printSuccess(label);
@@ -10,53 +10,47 @@ function runRequiredCheck(label, result) {
10
10
  printError(result.message ?? `${label} failed`);
11
11
  return false;
12
12
  }
13
- async function checkEligibility(dryRun) {
13
+ function checkEligibility() {
14
14
  printStep("Checking eligibility");
15
- if (!runRequiredCheck("Git repository detected", isGitRepo())) return { status: "fail", overwrite: false };
16
- if (!runRequiredCheck("package.json found", hasPackageJson())) return { status: "fail", overwrite: false };
17
- if (!runRequiredCheck("pnpm detected", usesPnpm())) return { status: "fail", overwrite: false };
18
- const cliffCheck = hasCliffToml();
19
- if (cliffCheck.ok) {
20
- printSuccess("cliff.toml found");
21
- } else {
22
- console.info("");
23
- const shouldCreate = await confirm("No cliff.toml found. Create one from the bundled template?");
24
- if (shouldCreate) {
25
- copyCliffTemplate(dryRun);
26
- } else {
27
- printError("cliff.toml is required for changelog generation. Aborting.");
28
- return { status: "fail", overwrite: false };
29
- }
30
- }
31
- const initCheck = notAlreadyInitialized();
32
- if (!initCheck.ok) {
33
- console.info("");
34
- const shouldOverwrite = await confirm("release-kit appears to be already initialized. Overwrite existing files?");
35
- if (!shouldOverwrite) {
36
- console.info("Aborting.");
37
- return { status: "abort", overwrite: false };
38
- }
39
- return { status: "pass", overwrite: true };
40
- }
41
- return { status: "pass", overwrite: false };
15
+ if (!runRequiredCheck("Git repository detected", isGitRepo())) return false;
16
+ if (!runRequiredCheck("package.json found", hasPackageJson())) return false;
17
+ if (!runRequiredCheck("pnpm detected", usesPnpm())) return false;
18
+ return true;
42
19
  }
43
- async function initCommand({ dryRun }) {
20
+ function initCommand({ dryRun, force, withConfig }) {
44
21
  if (dryRun) {
45
22
  console.info("[dry-run mode]");
46
23
  }
47
- const eligibility = await checkEligibility(dryRun);
48
- if (eligibility.status === "fail") return 1;
49
- if (eligibility.status === "abort") return 0;
24
+ let eligible;
25
+ try {
26
+ eligible = checkEligibility();
27
+ } catch (error) {
28
+ printError(`Eligibility check failed: ${error instanceof Error ? error.message : String(error)}`);
29
+ return 1;
30
+ }
31
+ if (!eligible) return 1;
50
32
  printStep("Detecting repo type");
51
- const repoType = detectRepoType();
33
+ let repoType;
34
+ try {
35
+ repoType = detectRepoType();
36
+ } catch (error) {
37
+ printError(`Failed to detect repo type: ${error instanceof Error ? error.message : String(error)}`);
38
+ return 1;
39
+ }
52
40
  printSuccess(`Detected: ${repoType}`);
53
41
  printStep("Scaffolding files");
54
- scaffoldFiles({ repoType, dryRun, overwrite: eligibility.overwrite });
42
+ try {
43
+ scaffoldFiles({ repoType, dryRun, overwrite: force, withConfig });
44
+ } catch (error) {
45
+ printError(`Failed to scaffold files: ${error instanceof Error ? error.message : String(error)}`);
46
+ return 1;
47
+ }
55
48
  printStep("Next steps");
49
+ const configHint = withConfig ? "1. (Optional) Customize .config/release-kit.config.ts and .config/git-cliff.toml." : "1. (Optional) Run again with --with-config to scaffold config files.";
56
50
  console.info(`
57
- 1. (Optional) Customize .config/release-kit.config.ts to exclude components, override version patterns, add custom work types, etc.
51
+ ${configHint}
58
52
  2. Test by running: npx @williamthorsen/release-kit prepare --dry-run
59
- 3. Commit the generated workflow file (and config file if created).
53
+ 3. Commit the generated files.
60
54
  `);
61
55
  return 0;
62
56
  }
@@ -1,6 +1,4 @@
1
- function isRecord(value) {
2
- return typeof value === "object" && value !== null && !Array.isArray(value);
3
- }
1
+ import { isRecord } from "../typeGuards.js";
4
2
  function parseJsonRecord(raw) {
5
3
  let parsed;
6
4
  try {
@@ -1,4 +1,3 @@
1
- export declare function confirm(question: string): Promise<boolean>;
2
1
  export declare function printStep(message: string): void;
3
2
  export declare function printSuccess(message: string): void;
4
3
  export declare function printSkip(message: string): void;
@@ -1,28 +1,17 @@
1
- import { createInterface } from "node:readline/promises";
2
- async function confirm(question) {
3
- const rl = createInterface({ input: process.stdin, output: process.stdout });
4
- try {
5
- const answer = await rl.question(`${question} (y/n) `);
6
- return answer.trim().toLowerCase().startsWith("y");
7
- } finally {
8
- rl.close();
9
- }
10
- }
11
1
  function printStep(message) {
12
2
  console.info(`
13
3
  > ${message}`);
14
4
  }
15
5
  function printSuccess(message) {
16
- console.info(` [ok] ${message}`);
6
+ console.info(` \u2705 ${message}`);
17
7
  }
18
8
  function printSkip(message) {
19
- console.info(` [skip] ${message}`);
9
+ console.info(` \u26A0\uFE0F ${message}`);
20
10
  }
21
11
  function printError(message) {
22
- console.error(` [error] ${message}`);
12
+ console.error(` \u274C ${message}`);
23
13
  }
24
14
  export {
25
- confirm,
26
15
  printError,
27
16
  printSkip,
28
17
  printStep,
@@ -3,7 +3,8 @@ interface ScaffoldOptions {
3
3
  repoType: RepoType;
4
4
  dryRun: boolean;
5
5
  overwrite: boolean;
6
+ withConfig: boolean;
6
7
  }
7
- export declare function copyCliffTemplate(dryRun: boolean): void;
8
- export declare function scaffoldFiles({ repoType, dryRun, overwrite }: ScaffoldOptions): void;
8
+ export declare function copyCliffTemplate(dryRun: boolean, overwrite: boolean): void;
9
+ export declare function scaffoldFiles({ repoType, dryRun, overwrite, withConfig }: ScaffoldOptions): void;
9
10
  export {};
@@ -33,7 +33,7 @@ function writeIfAbsent(filePath, content, dryRun, overwrite) {
33
33
  printSuccess(`Created ${filePath}`);
34
34
  }
35
35
  }
36
- function copyCliffTemplate(dryRun) {
36
+ function copyCliffTemplate(dryRun, overwrite) {
37
37
  const thisDir = dirname(fileURLToPath(import.meta.url));
38
38
  const templatePath = resolve(thisDir, "..", "..", "..", "cliff.toml.template");
39
39
  if (!existsSync(templatePath)) {
@@ -48,15 +48,13 @@ function copyCliffTemplate(dryRun) {
48
48
  printError(`Failed to read cliff.toml.template: ${message}`);
49
49
  return;
50
50
  }
51
- writeIfAbsent("cliff.toml", content, dryRun, false);
51
+ writeIfAbsent(".config/git-cliff.toml", content, dryRun, overwrite);
52
52
  }
53
- function scaffoldFiles({ repoType, dryRun, overwrite }) {
54
- const files = [
55
- { path: ".config/release-kit.config.ts", content: releaseConfigScript(repoType) },
56
- { path: ".github/workflows/release.yaml", content: releaseWorkflow(repoType) }
57
- ];
58
- for (const file of files) {
59
- writeIfAbsent(file.path, file.content, dryRun, overwrite);
53
+ function scaffoldFiles({ repoType, dryRun, overwrite, withConfig }) {
54
+ writeIfAbsent(".github/workflows/release.yaml", releaseWorkflow(repoType), dryRun, overwrite);
55
+ if (withConfig) {
56
+ writeIfAbsent(".config/release-kit.config.ts", releaseConfigScript(repoType), dryRun, overwrite);
57
+ copyCliffTemplate(dryRun, overwrite);
60
58
  }
61
59
  }
62
60
  export {
@@ -7,12 +7,15 @@ const config: ReleaseKitConfig = {
7
7
  // components: [
8
8
  // { dir: 'my-package', shouldExclude: true },
9
9
  // ],
10
+
11
+ // TODO: Uncomment and adjust if you have a format command
12
+ // formatCommand: 'npx prettier --write',
13
+
10
14
  // Uncomment to override the default version patterns:
11
15
  // versionPatterns: { major: ['!'], minor: ['feat', 'feature'] },
16
+
12
17
  // Uncomment to add custom work types (merged with defaults):
13
18
  // workTypes: { perf: { header: 'Performance' } },
14
- // TODO: Uncomment and adjust if you have a format command
15
- // formatCommand: 'pnpm run fmt',
16
19
  };
17
20
 
18
21
  export default config;
@@ -21,12 +24,14 @@ export default config;
21
24
  return `import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
22
25
 
23
26
  const config: ReleaseKitConfig = {
27
+ // TODO: Uncomment and adjust if you have a format command
28
+ // formatCommand: 'npx prettier --write',
29
+
24
30
  // Uncomment to override the default version patterns:
25
31
  // versionPatterns: { major: ['!'], minor: ['feat', 'feature'] },
32
+
26
33
  // Uncomment to add custom work types (merged with defaults):
27
34
  // workTypes: { perf: { header: 'Performance' } },
28
- // TODO: Uncomment and adjust if you have a format command
29
- // formatCommand: 'pnpm run fmt',
30
35
  };
31
36
 
32
37
  export default config;
@@ -60,11 +65,8 @@ permissions:
60
65
 
61
66
  jobs:
62
67
  release:
63
- uses: williamthorsen/.github/.github/workflows/release-pnpm.yaml@v2
68
+ uses: williamthorsen/node-monorepo-tools/.github/workflows/release-workflow.yaml@release-workflow-v1
64
69
  with:
65
- # TODO: Set the Node.js and pnpm versions for your project
66
- node-version: '24'
67
- pnpm-version: '10.32.1'
68
70
  only: \${{ inputs.only }}
69
71
  bump: \${{ inputs.bump }}
70
72
  `;
@@ -91,11 +93,8 @@ permissions:
91
93
 
92
94
  jobs:
93
95
  release:
94
- uses: williamthorsen/.github/.github/workflows/release-pnpm.yaml@v2
96
+ uses: williamthorsen/node-monorepo-tools/.github/workflows/release-workflow.yaml@release-workflow-v1
95
97
  with:
96
- # TODO: Set the Node.js and pnpm versions for your project
97
- node-version: '24'
98
- pnpm-version: '10.32.1'
99
98
  bump: \${{ inputs.bump }}
100
99
  `;
101
100
  }
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { component } from "./component.js";
4
4
  import { DEFAULT_VERSION_PATTERNS, DEFAULT_WORK_TYPES } from "./defaults.js";
5
+ import { isRecord } from "./typeGuards.js";
5
6
  const CONFIG_FILE_PATH = ".config/release-kit.config.ts";
6
7
  async function loadConfig() {
7
8
  const absoluteConfigPath = path.resolve(process.cwd(), CONFIG_FILE_PATH);
@@ -22,9 +23,6 @@ async function loadConfig() {
22
23
  }
23
24
  return resolved;
24
25
  }
25
- function isRecord(value) {
26
- return typeof value === "object" && value !== null && !Array.isArray(value);
27
- }
28
26
  function mergeMonorepoConfig(discoveredPaths, userConfig) {
29
27
  let components = discoveredPaths.map((workspacePath) => component(workspacePath));
30
28
  if (userConfig?.components !== void 0) {
@@ -5,8 +5,12 @@ import { releasePrepareMono } from "./releasePrepareMono.js";
5
5
  import { parseArgs, RELEASE_TAGS_FILE, writeReleaseTags } from "./runReleasePrepare.js";
6
6
  import { validateConfig } from "./validateConfig.js";
7
7
  async function prepareCommand(argv) {
8
- const { dryRun, bumpOverride, only } = parseArgs(argv);
9
- const options = { dryRun, ...bumpOverride === void 0 ? {} : { bumpOverride } };
8
+ const { dryRun, force, bumpOverride, only } = parseArgs(argv);
9
+ const options = {
10
+ dryRun,
11
+ force,
12
+ ...bumpOverride === void 0 ? {} : { bumpOverride }
13
+ };
10
14
  let rawConfig;
11
15
  try {
12
16
  rawConfig = await loadConfig();
@@ -20,7 +24,7 @@ async function prepareCommand(argv) {
20
24
  if (errors.length > 0) {
21
25
  console.error("Invalid config:");
22
26
  for (const err of errors) {
23
- console.error(` - ${err}`);
27
+ console.error(` \u274C ${err}`);
24
28
  }
25
29
  process.exit(1);
26
30
  }
@@ -1,6 +1,7 @@
1
1
  import type { ReleaseConfig, ReleaseType } from './types.ts';
2
2
  export interface ReleasePrepareOptions {
3
3
  dryRun: boolean;
4
+ force?: boolean;
4
5
  bumpOverride?: ReleaseType;
5
6
  }
6
7
  export declare function releasePrepare(config: ReleaseConfig, options: ReleasePrepareOptions): string[];
@@ -31,15 +31,17 @@ function releasePrepare(config, options) {
31
31
  console.info("Generating changelogs...");
32
32
  generateChangelogs(config, newTag, dryRun);
33
33
  if (config.formatCommand !== void 0) {
34
+ const modifiedFiles = [...config.packageFiles, ...config.changelogPaths.map((p) => `${p}/CHANGELOG.md`)];
35
+ const fullCommand = `${config.formatCommand} ${modifiedFiles.join(" ")}`;
34
36
  if (dryRun) {
35
- console.info(` [dry-run] Would run format command: ${config.formatCommand}`);
37
+ console.info(` [dry-run] Would run format command: ${fullCommand}`);
36
38
  } else {
37
- console.info(` Running format command: ${config.formatCommand}`);
39
+ console.info(` Running format command: ${fullCommand}`);
38
40
  try {
39
- execSync(config.formatCommand, { stdio: "inherit" });
41
+ execSync(fullCommand, { stdio: "inherit" });
40
42
  } catch (error) {
41
43
  throw new Error(
42
- `Format command failed ('${config.formatCommand}'): ${error instanceof Error ? error.message : String(error)}`
44
+ `Format command failed ('${fullCommand}'): ${error instanceof Error ? error.message : String(error)}`
43
45
  );
44
46
  }
45
47
  }
@@ -6,10 +6,11 @@ import { generateChangelog } from "./generateChangelogs.js";
6
6
  import { getCommitsSinceTarget } from "./getCommitsSinceTarget.js";
7
7
  import { parseCommitMessage } from "./parseCommitMessage.js";
8
8
  function releasePrepareMono(config, options) {
9
- const { dryRun, bumpOverride } = options;
9
+ const { dryRun, force, bumpOverride } = options;
10
10
  const workTypes = config.workTypes ?? { ...DEFAULT_WORK_TYPES };
11
11
  const versionPatterns = config.versionPatterns ?? { ...DEFAULT_VERSION_PATTERNS };
12
12
  const tags = [];
13
+ const modifiedFiles = [];
13
14
  for (const component of config.components) {
14
15
  const name = component.dir;
15
16
  console.info(`
@@ -18,7 +19,7 @@ Processing component: ${name}`);
18
19
  const { tag, commits } = getCommitsSinceTarget(component.tagPrefix, component.paths);
19
20
  const since = tag === void 0 ? "(no previous release found)" : `since ${tag}`;
20
21
  console.info(` Found ${commits.length} commits ${since}`);
21
- if (commits.length === 0) {
22
+ if (commits.length === 0 && !force) {
22
23
  console.info(` No changes for ${name} ${since}. Skipping.`);
23
24
  continue;
24
25
  }
@@ -39,6 +40,7 @@ Processing component: ${name}`);
39
40
  const newVersion = bumpAllVersions(component.packageFiles, releaseType, dryRun);
40
41
  const newTag = `${component.tagPrefix}${newVersion}`;
41
42
  tags.push(newTag);
43
+ modifiedFiles.push(...component.packageFiles, ...component.changelogPaths.map((p) => `${p}/CHANGELOG.md`));
42
44
  console.info(" Generating changelogs...");
43
45
  for (const changelogPath of component.changelogPaths) {
44
46
  generateChangelog(config, changelogPath, newTag, dryRun, { includePaths: component.paths });
@@ -46,17 +48,18 @@ Processing component: ${name}`);
46
48
  console.info(` Component release prepared: ${newTag}`);
47
49
  }
48
50
  if (tags.length > 0 && config.formatCommand !== void 0) {
51
+ const fullCommand = `${config.formatCommand} ${modifiedFiles.join(" ")}`;
49
52
  if (dryRun) {
50
53
  console.info(`
51
- [dry-run] Would run format command: ${config.formatCommand}`);
54
+ [dry-run] Would run format command: ${fullCommand}`);
52
55
  } else {
53
56
  console.info(`
54
- Running format command: ${config.formatCommand}`);
57
+ Running format command: ${fullCommand}`);
55
58
  try {
56
- execSync(config.formatCommand, { stdio: "inherit" });
59
+ execSync(fullCommand, { stdio: "inherit" });
57
60
  } catch (error) {
58
61
  throw new Error(
59
- `Format command failed ('${config.formatCommand}'): ${error instanceof Error ? error.message : String(error)}`
62
+ `Format command failed ('${fullCommand}'): ${error instanceof Error ? error.message : String(error)}`
60
63
  );
61
64
  }
62
65
  }
@@ -0,0 +1 @@
1
+ export declare function resolveCliffConfigPath(cliffConfigPath: string | undefined, metaUrl: string): string;
@@ -0,0 +1,25 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ function resolveCliffConfigPath(cliffConfigPath, metaUrl) {
5
+ if (cliffConfigPath !== void 0) {
6
+ return cliffConfigPath;
7
+ }
8
+ const candidates = [".config/git-cliff.toml", "cliff.toml"];
9
+ for (const candidate of candidates) {
10
+ if (existsSync(candidate)) {
11
+ return candidate;
12
+ }
13
+ }
14
+ const thisDir = dirname(fileURLToPath(metaUrl));
15
+ const bundledPath = resolve(thisDir, "..", "..", "cliff.toml.template");
16
+ if (existsSync(bundledPath)) {
17
+ return bundledPath;
18
+ }
19
+ throw new Error(
20
+ `Could not resolve a git-cliff config file. Searched: ${candidates.join(", ")}, and bundled template at ${bundledPath}`
21
+ );
22
+ }
23
+ export {
24
+ resolveCliffConfigPath
25
+ };
@@ -1,7 +1,8 @@
1
1
  import type { MonorepoReleaseConfig, ReleaseConfig, ReleaseType } from './types.ts';
2
- export declare const RELEASE_TAGS_FILE = "/tmp/release-kit/.release-tags";
2
+ export declare const RELEASE_TAGS_FILE = "tmp/.release-tags";
3
3
  export declare function parseArgs(argv: string[]): {
4
4
  dryRun: boolean;
5
+ force: boolean;
5
6
  bumpOverride: ReleaseType | undefined;
6
7
  only: string[] | undefined;
7
8
  };
@@ -2,7 +2,7 @@ import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { dirname } from "node:path";
3
3
  import { releasePrepare } from "./releasePrepare.js";
4
4
  import { releasePrepareMono } from "./releasePrepareMono.js";
5
- const RELEASE_TAGS_FILE = "/tmp/release-kit/.release-tags";
5
+ const RELEASE_TAGS_FILE = "tmp/.release-tags";
6
6
  const VALID_BUMP_TYPES = ["major", "minor", "patch"];
7
7
  function isReleaseType(value) {
8
8
  return VALID_BUMP_TYPES.includes(value);
@@ -20,17 +20,21 @@ Legacy entry point for release preparation. Prefer the CLI:
20
20
  Options:
21
21
  --dry-run Run without modifying any files
22
22
  --bump=major|minor|patch Override the bump type for all components
23
+ --force Bypass the "no commits since last tag" check (monorepo only, requires --bump)
23
24
  --only=name1,name2 Only process the named components (comma-separated, monorepo only)
24
25
  --help Show this help message
25
26
  `);
26
27
  }
27
28
  function parseArgs(argv) {
28
29
  let dryRun = false;
30
+ let force = false;
29
31
  let bumpOverride;
30
32
  let only;
31
33
  for (const arg of argv) {
32
34
  if (arg === "--dry-run") {
33
35
  dryRun = true;
36
+ } else if (arg === "--force") {
37
+ force = true;
34
38
  } else if (arg.startsWith("--bump=")) {
35
39
  const value = arg.slice("--bump=".length);
36
40
  if (!isReleaseType(value)) {
@@ -53,11 +57,19 @@ function parseArgs(argv) {
53
57
  process.exit(1);
54
58
  }
55
59
  }
56
- return { dryRun, bumpOverride, only };
60
+ if (force && bumpOverride === void 0) {
61
+ console.error("Error: --force requires --bump to specify the version bump type");
62
+ process.exit(1);
63
+ }
64
+ return { dryRun, force, bumpOverride, only };
57
65
  }
58
66
  function runReleasePrepare(config) {
59
- const { dryRun, bumpOverride, only } = parseArgs(process.argv.slice(2));
60
- const options = { dryRun, ...bumpOverride === void 0 ? {} : { bumpOverride } };
67
+ const { dryRun, force, bumpOverride, only } = parseArgs(process.argv.slice(2));
68
+ const options = {
69
+ dryRun,
70
+ force,
71
+ ...bumpOverride === void 0 ? {} : { bumpOverride }
72
+ };
61
73
  if (!isMonorepoConfig(config)) {
62
74
  if (only !== void 0) {
63
75
  console.error("Error: --only is only supported for monorepo configurations");
@@ -0,0 +1 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -0,0 +1,6 @@
1
+ function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export {
5
+ isRecord
6
+ };
@@ -1,3 +1,4 @@
1
+ import { isRecord } from "./typeGuards.js";
1
2
  function validateConfig(raw) {
2
3
  const errors = [];
3
4
  if (!isRecord(raw)) {
@@ -25,9 +26,6 @@ function validateConfig(raw) {
25
26
  validateWorkspaceAliases(raw.workspaceAliases, config, errors);
26
27
  return { config, errors };
27
28
  }
28
- function isRecord(value) {
29
- return typeof value === "object" && value !== null && !Array.isArray(value);
30
- }
31
29
  function isStringArray(value) {
32
30
  return Array.isArray(value) && value.every((item) => typeof item === "string");
33
31
  }
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@williamthorsen/release-kit",
3
- "version": "1.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Version-bumping and changelog-generation toolkit for release workflows",
5
5
  "keywords": [],
6
- "homepage": "https://github.com/williamthorsen/toolbelt/tree/main/packages/release-kit#readme",
6
+ "homepage": "https://github.com/williamthorsen/node-monorepo-tools/tree/main/packages/release-kit#readme",
7
7
  "bugs": {
8
- "url": "https://github.com/williamthorsen/toolbelt/issues"
8
+ "url": "https://github.com/williamthorsen/node-monorepo-tools/issues"
9
9
  },
10
10
  "repository": {
11
11
  "type": "git",
12
- "url": "https://github.com/williamthorsen/toolbelt.git",
12
+ "url": "https://github.com/williamthorsen/node-monorepo-tools.git",
13
13
  "directory": "packages/release-kit"
14
14
  },
15
15
  "license": "UNLICENSED",
@@ -1 +0,0 @@
1
- {"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/types.ts","../src/bumpversion.ts","../src/bumpallversions.ts","../src/component.ts","../src/defaults.ts","../src/determinebumptype.ts","../../../node_modules/.pnpm/minipass@7.1.3/node_modules/minipass/dist/esm/index.d.ts","../../../node_modules/.pnpm/lru-cache@11.1.0/node_modules/lru-cache/dist/esm/index.d.ts","../../../node_modules/.pnpm/path-scurry@2.0.2/node_modules/path-scurry/dist/esm/index.d.ts","../../../node_modules/.pnpm/minimatch@10.2.4/node_modules/minimatch/dist/esm/ast.d.ts","../../../node_modules/.pnpm/minimatch@10.2.4/node_modules/minimatch/dist/esm/escape.d.ts","../../../node_modules/.pnpm/minimatch@10.2.4/node_modules/minimatch/dist/esm/unescape.d.ts","../../../node_modules/.pnpm/minimatch@10.2.4/node_modules/minimatch/dist/esm/index.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/pattern.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/processor.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/walker.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/ignore.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/glob.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/has-magic.d.ts","../../../node_modules/.pnpm/glob@13.0.6/node_modules/glob/dist/esm/index.d.ts","../../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.ts","../../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.mts","../src/discoverworkspaces.ts","../src/generatechangelogs.ts","../src/getcommitssincetarget.ts","../src/parsecommitmessage.ts","../src/releaseprepare.ts","../src/releasepreparemono.ts","../src/runreleaseprepare.ts","../src/index.ts","../../../node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/types.d.ts","../../../node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/jiti.d.mts","../src/loadconfig.ts","../src/validateconfig.ts","../src/preparecommand.ts","../src/init/parsejsonrecord.ts","../src/init/checks.ts","../src/init/detectrepotype.ts","../src/init/prompt.ts","../src/init/templates.ts","../src/init/scaffold.ts","../src/init/initcommand.ts","../src/bin/release-kit.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/utility.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client-stats.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/h2c-client.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/index.d.ts"],"fileIdsList":[[101,126,180,197,198],[126,180,197,198],[126,177,178,180,197,198],[126,179,180,197,198],[180,197,198],[126,180,185,197,198,215],[126,180,181,186,191,197,198,200,212,223],[126,180,181,182,191,197,198,200],[126,180,183,197,198,224],[126,180,184,185,192,197,198,201],[126,180,185,197,198,212,220],[126,180,186,188,191,197,198,200],[126,179,180,187,197,198],[126,180,188,189,197,198],[126,180,190,191,197,198],[126,179,180,191,197,198],[126,180,191,192,193,197,198,212,223],[126,180,191,192,193,197,198,207,212,215],[126,172,180,188,191,194,197,198,200,212,223],[126,180,191,192,194,195,197,198,200,212,220,223],[126,180,194,196,197,198,212,220,223],[124,125,126,127,128,129,130,131,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229],[126,180,191,197,198],[126,180,197,198,199,223],[126,180,188,191,197,198,200,212],[126,180,197,198,201],[126,180,197,198,202],[126,179,180,197,198,203],[126,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229],[126,180,197,198,205],[126,180,197,198,206],[126,180,191,197,198,207,208],[126,180,197,198,207,209,224,226],[126,180,192,197,198],[126,180,191,197,198,212,213,215],[126,180,197,198,214,215],[126,180,197,198,212,213],[126,180,197,198,215],[126,180,197,198,216],[126,177,180,197,198,212,217,223],[126,180,191,197,198,218,219],[126,180,197,198,218,219],[126,180,185,197,198,200,212,220],[126,180,197,198,221],[126,180,197,198,200,222],[126,180,194,197,198,206,223],[126,180,185,197,198,224],[126,180,197,198,212,225],[126,180,197,198,199,226],[126,180,197,198,227],[126,180,185,197,198],[126,172,180,197,198],[126,180,197,198,228],[126,172,180,191,193,197,198,203,212,215,223,225,226,228],[126,180,197,198,212,229],[87,89,93,94,97,126,180,197,198],[98,126,180,197,198],[89,93,96,126,180,197,198],[87,89,93,96,97,98,99,126,180,197,198],[93,126,180,197,198],[89,93,94,96,126,180,197,198],[87,89,94,95,97,126,180,197,198],[111,126,180,197,198],[90,91,92,126,180,197,198],[126,180,191,197,198,216],[87,88,126,180,192,197,198,202],[126,138,141,144,145,180,197,198,223],[126,141,180,197,198,212,223],[126,141,145,180,197,198,223],[126,180,197,198,212],[126,135,180,197,198],[126,139,180,197,198],[126,137,138,141,180,197,198,223],[126,180,197,198,200,220],[126,180,197,198,230],[126,135,180,197,198,230],[126,137,141,180,197,198,200,223],[126,132,133,134,136,140,180,191,197,198,212,223],[126,141,149,157,180,197,198],[126,133,139,180,197,198],[126,141,166,167,180,197,198],[126,133,136,141,180,197,198,215,223,230],[126,141,180,197,198],[126,137,141,180,197,198,223],[126,132,180,197,198],[126,135,136,137,139,140,141,142,143,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,167,168,169,170,171,180,197,198],[126,141,159,162,180,188,197,198],[126,141,149,150,151,180,197,198],[126,139,141,150,152,180,197,198],[126,140,180,197,198],[126,133,135,141,180,197,198],[126,141,145,150,152,180,197,198],[126,145,180,197,198],[126,139,141,144,180,197,198,223],[126,133,137,141,149,180,197,198],[126,141,159,180,197,198],[126,152,180,197,198],[126,135,141,166,180,197,198,215,228,230],[115,122,126,180,197,198],[81,82,126,180,192,197,198],[81,126,180,197,198],[81,126,180,197,198,202],[100,102,126,180,192,197,198,202],[81,126,180,181,197,198],[81,82,83,84,85,86,103,104,105,106,107,108,109,126,180,197,198],[116,126,180,181,192,197,198],[116,126,180,192,197,198],[117,118,119,121,126,180,197,198],[126,180,197,198,208],[118,119,120,126,180,192,197,198,202,223],[118,126,180,197,198],[81,84,85,112,126,180,192,197,198,202],[81,103,107,108,109,113,114,126,180,197,198],[81,83,85,86,104,105,106,126,180,181,197,198],[81,83,85,86,104,105,106,107,126,180,181,197,198],[81,107,108,126,180,192,197,198,202]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6214ed750212cf332973054a0002f9c766a19cb5992e2c42913f6f92acc0e36b","signature":"e9f2fe73ff22837cd6715f191c12642a7861a1dc01e1950b7bddb6579ca3c754","impliedFormat":99},{"version":"8fa9d8a01b5f23351e74bb5ed27056f2dc61f3be784e2b40ac5c6769d5b5c857","signature":"4addc77f22adb312bacc79b2d60daf7f22d038021c9eacff9acb4c12d26b50dd","impliedFormat":99},{"version":"5cb7020711b38f8e28df92ac824f8f6ebcb877948c187b00f5f2b3d67af5c220","signature":"36eb11bac75359679c935842c23b13247a4137cae851f623ae4a04424df8e336","impliedFormat":99},{"version":"e053f222e8058bb3d352a360aafb517f0d988b0786464a505269bfd982fd6c5e","signature":"d56ad72cd08b80c5da64050dbeb4cdfe430ef21a56330093f71bdb04e05bb5b2","impliedFormat":99},{"version":"0e477ebc0de7d5cbb589203bb54d98a171e007bc9d7dfad53753ef7903c58c28","signature":"ef276620114fe084a05e1411f22ac821a5ced585178dfedb6c2f5edbb095369f","impliedFormat":99},{"version":"7c647f3de4bdc7c88d85151e169aaabd7295a14ead66e2d531f1604f64957436","signature":"a83163320f055c50cc4114279a7526cbec9762e5e89b2c0d4c3d18f980d45d81","impliedFormat":99},{"version":"894bd2a64bfce5b28d1f4b6760f2eb75f07ce64dd1c272bbf7ceb6fec3f27912","impliedFormat":99},{"version":"599b42c2c7227d59788f9239a30b16e465e15127c7c4541d30b801c23ca681e6","impliedFormat":99},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":99},{"version":"ba2b8858ace0b631b318392c75c167fc3b2f819b0afb6706da4635346db92451","impliedFormat":99},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":99},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":99},{"version":"6d719ee5051d87a0f5c94d9481d86221cfbe350f3f80c12bb3fe6ab7ea30f1ab","impliedFormat":99},{"version":"a0846c150c0960c2a1ab7582d9b4c351afa4923e0f767d4ef7d8c26ed893f685","impliedFormat":99},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":99},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":99},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":99},{"version":"add2e396a8d10be760e447464be5861e12ecc215489f87910afeaa26a6a54c88","impliedFormat":99},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":99},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":99},{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"95bf7c19205d7a4c92f1699dae58e217bb18f324276dfe06b1c2e312c7c75cf2","impliedFormat":99},{"version":"e6d7df71fc7bee6e11b43c3ee6b37fe6b3a29cfcc6056c7344c24db80eb76ade","signature":"daf330f8405a25b73e8f9f3bef13f9afe38c0ce7531885862c2c625b26b326ae","impliedFormat":99},{"version":"c5bfb6f5c5cb1a45c480e6aa993eb632b619eeb16d93e2f0c7b83869a4a1ff33","signature":"b2c36e251fe4ccf17ee130f0f287416961138db58cf27efd4fb63d347b0fce6c","impliedFormat":99},{"version":"483f19266cbc2534d7c3fa1ef66f98847e90d3a35112f58c22cdc0ef270d64c5","signature":"a33a4b1c537925114d141aa19ec342fc3c942f1725a7467d6741350cddd356f1","impliedFormat":99},{"version":"da045c2b64ad363e4d005320c699280425995be4758fd2829eee8df2e80a7c81","signature":"d1a5d2a3a384b1170b7da9715c370173ca2aba6a9896abf59fb4e50d9fd2aded","impliedFormat":99},{"version":"d890d8c6e8ab3c862e934c4cb97bb99019780f23908998eef652ea0abfd2123c","signature":"b732c0706a0886605ff08600b18cd4545e49b65d19c826d3c95d56b690c313f9","impliedFormat":99},{"version":"89b16662b6e33d02e8646a9a2cdca31811105bd3ae8b1ebfdef3d8c8f6a90804","signature":"dc09d9ce0c2abaf212e009b937280bcb65b91b01ed3ac43e402871ac909373a4","impliedFormat":99},{"version":"5986e89d60dc59f932aa8277e73ad924ccfcb2ef54fe83d1506bb8ee089a5c02","signature":"e3bee88e2437cb73a9b00c741ecae8f19f0b92bb0b65b3aee69684ff2fb5c865","impliedFormat":99},{"version":"df1e6177460f63c4fabbbabf6aa67711cb3836ade449956e60d3acc5f0cf0bbb","signature":"4c7d80bbd5ac218cb94bb208cca508871458004705eef8e2ce01f61e7f4370ce","impliedFormat":99},{"version":"1e2587f9989eb52993aba54a2e4aee663d392e7b7555dbf63c0e621eeec4549c","impliedFormat":99},{"version":"c6c2f7ca8e09b0020387e38962dcafba007738506197c0098c58db9f365eeb84","impliedFormat":99},{"version":"9ea3955f7733c658a55dd6f3e8a838cfb36fd926def711dd7abd530db9fbe20b","signature":"ae3db8a96d91881a2a860609ff311e4e7a980879a007b7a952bec3a5049886a3","impliedFormat":99},{"version":"b5355756d87508d8dc65029825f3cdb6c99cb7681e3c35f5b6bde6a94824049a","signature":"4a4dec799112754e6b05197068fbfff0a3401a5d2a1c42a3297f49154d98ea22","impliedFormat":99},{"version":"be84719627119e466f501414c7ecb041f62b8ff08ea83abce87efd0d1d335773","signature":"6650bb5e5a9f553b9f96d23eca5d1db16e275aa2eb7164c990ed9de0fa68ef94","impliedFormat":99},{"version":"8310a270c448fa3f93c4dfeff4363c7a52f5dfc90b4901d7d5d2f2975e7381de","signature":"033a272715611b5683218497b3f90916c1f78c5d1b03ce4db663cf2bdd51c710","impliedFormat":99},{"version":"75522dfb81a8477c531cd5455dbf7ecd2f3c6518cafa1ab3bc0cf7de9b487333","signature":"c4c5035a5211f9c03b125dbe514757c3038eef766b3a17f019a43580a7cd5f2d","impliedFormat":99},{"version":"864cd3cac0e49ca7ab6af80a3608596ef3d251dc52d66f1afe7a5ca1c0eebf2b","signature":"dd43f86fca716ef3c1a2fd574d00a61a05e6d334eab5fdd1bfb53c6201477fe0","impliedFormat":99},{"version":"6431efa08dc23e97b642b9f97122a12e0571c1e0e05b814556db0e0b33339193","signature":"be15beb2ecb736061a2af65fbb6551f0b5206eec60b69205a1f0e69c57065b98","impliedFormat":99},{"version":"8d50269506b77c5741751e29bb6c2b65813f2a451440c81364242f30edc4106d","signature":"886ac28bf70841b4a258d928334a2c52ffb7f73cba31a1528f81f15c11ade0d0","impliedFormat":99},{"version":"8f699f649d31e5dc83a7953182d122ed3fb6832df619a7d5ef99ee757bc6e74e","signature":"bd0aca2cd8b4f4a985cd1932cf97720e63c0653440673ce6394c173537e44f49","impliedFormat":99},{"version":"8cca355e9e8c5a98f05810098652b26ed62a544bd7b090eb1438e1e5a78440b2","signature":"22c55f433266d1aa96849fe4207851c9f682926b236bbb2c9fb2d681ebc3862e","impliedFormat":99},{"version":"11c1361be4c0a59f7d7fff1d9bed94a1eedb933a3300d947ddf7d4d78dcf78e4","signature":"43e818adf60173644896298637f47b01d5819b17eda46eaa32d0c7d64724d012","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"0904660ae854e6d41f6ff25356db1d654436c6305b0f0aa89d1532df0253486e","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"230bdc111d7578276e4a3bb9d075d85c78c6b68f428c3a9935e2eaa10f4ae1f5","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"0e5974dfff7a97181c7c376545f126b20acf2f1341db7d3fccea4977bf3ce19c","impliedFormat":1},{"version":"c7f977ea78a1b060a30554c1c4ec0e2269c6e305a349ca2ada14931ac27ecc0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"145dcf25fd4967c610c53d93d7bc4dce8fbb1b6dd7935362472d4ae49363c7ba","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bf3fe89ec8baa335f6370b9fa36308e1bc7a72e2eb2dad1e94f31e27fa28b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"35390d6fa94bdb432c5d0bcb6547bdd11406c2692a6b90b9e47be2105ea19bd6","impliedFormat":1},{"version":"b33b74b97952d9bf4fbd2951dcfbb5136656ddb310ce1c84518aaa77dbca9992","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"8d117798e5228c7fdff887f44851d07320739c5cc0d511afae8f250c51809a36","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"8e7c3bed5f19ade8f911677ddc83052e2283e25b0a8654cd89db9079d4b323c7","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ccf3afaeebbeee4ca9092101e99fd6abd681116b6e5ec23e381bbb1e1f32262c","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"ab7818a9d57a9297b90e456fc68b77f84d74395a9210a3cfa9d87db33aff8b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb08062718a5470cd864c1fae0eb5b3a3adc5bcd05dcf87608d6f60b65eca3f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a815b7d1aebc0646b91548eab2fc19dada09ff255d04c71ced00bbd3058c8eb","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"836b36913830645ac3b28fe33731aac3fdb3524ee8adbb4cdab9a5c189f41943","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1}],"root":[[81,86],[103,110],[113,123]],"options":{"allowImportingTsExtensions":true,"allowJs":false,"allowUnreachableCode":false,"allowUnusedLabels":false,"declaration":true,"emitDeclarationOnly":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"experimentalDecorators":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"outDir":"./esm","removeComments":true,"rootDir":"../src","skipLibCheck":true,"sourceMap":false,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.generate-typings.tsbuildinfo"},"referencedMap":[[102,1],[101,2],[177,3],[178,3],[179,4],[126,5],[180,6],[181,7],[182,8],[124,2],[183,9],[184,10],[185,11],[186,12],[187,13],[188,14],[189,14],[190,15],[191,16],[192,17],[193,18],[127,2],[125,2],[194,19],[195,20],[196,21],[230,22],[197,23],[198,2],[199,24],[200,25],[201,26],[202,27],[203,28],[204,29],[205,30],[206,31],[207,32],[208,32],[209,33],[210,2],[211,34],[212,35],[214,36],[213,37],[215,38],[216,39],[217,40],[218,41],[219,42],[220,43],[221,44],[222,45],[223,46],[224,47],[225,48],[226,49],[227,50],[128,2],[129,51],[130,2],[131,2],[173,52],[174,53],[175,2],[176,38],[228,54],[229,55],[98,56],[99,57],[97,58],[100,59],[94,60],[95,61],[96,62],[112,63],[111,2],[88,2],[90,60],[91,60],[93,64],[92,60],[87,65],[89,66],[79,2],[80,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[62,2],[63,2],[11,2],[64,2],[65,2],[66,2],[67,2],[68,2],[1,2],[69,2],[70,2],[12,2],[74,2],[72,2],[77,2],[76,2],[71,2],[75,2],[73,2],[78,2],[149,67],[161,68],[147,69],[162,70],[171,71],[138,72],[139,73],[137,74],[170,75],[165,76],[169,77],[141,78],[158,79],[140,80],[168,81],[135,82],[136,76],[142,83],[143,2],[148,84],[146,83],[133,85],[172,86],[163,87],[152,88],[151,83],[153,89],[156,90],[150,91],[154,92],[166,75],[144,93],[145,94],[157,95],[134,70],[160,96],[159,83],[155,97],[164,2],[132,2],[167,98],[123,99],[83,100],[82,101],[84,102],[85,101],[86,101],[103,103],[104,104],[105,104],[110,105],[117,106],[118,107],[122,108],[116,2],[119,109],[121,110],[120,111],[113,112],[106,101],[115,113],[107,114],[108,115],[109,116],[81,2],[114,101]],"version":"5.9.3"}