chkit 0.1.2-beta.7 → 0.2.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -56
- package/dist/bin/chkit.js +82 -31
- package/dist/bin/chkit.js.map +1 -1
- package/dist/commands/check/output.js +1 -1
- package/dist/commands/check/output.js.map +1 -1
- package/dist/commands/drift/command.d.ts.map +1 -1
- package/dist/commands/drift/command.js +9 -0
- package/dist/commands/drift/command.js.map +1 -1
- package/dist/commands/drift/compare.d.ts +52 -4
- package/dist/commands/drift/compare.d.ts.map +1 -1
- package/dist/commands/drift/compare.js +258 -49
- package/dist/commands/drift/compare.js.map +1 -1
- package/dist/commands/drift/payload.d.ts +1 -0
- package/dist/commands/drift/payload.d.ts.map +1 -1
- package/dist/commands/drift/payload.js +59 -10
- package/dist/commands/drift/payload.js.map +1 -1
- package/dist/commands/generate/command.d.ts.map +1 -1
- package/dist/commands/generate/command.js +73 -33
- package/dist/commands/generate/command.js.map +1 -1
- package/dist/commands/generate/cutover.d.ts +56 -0
- package/dist/commands/generate/cutover.d.ts.map +1 -0
- package/dist/commands/generate/cutover.js +138 -0
- package/dist/commands/generate/cutover.js.map +1 -0
- package/dist/commands/generate/output.d.ts +3 -2
- package/dist/commands/generate/output.d.ts.map +1 -1
- package/dist/commands/generate/output.js +17 -2
- package/dist/commands/generate/output.js.map +1 -1
- package/dist/commands/generate/plan-pipeline.d.ts.map +1 -1
- package/dist/commands/generate/plan-pipeline.js +35 -36
- package/dist/commands/generate/plan-pipeline.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate/abandon.d.ts +39 -0
- package/dist/commands/migrate/abandon.d.ts.map +1 -0
- package/dist/commands/migrate/abandon.js +76 -0
- package/dist/commands/migrate/abandon.js.map +1 -0
- package/dist/commands/migrate/apply.d.ts +10 -1
- package/dist/commands/migrate/apply.d.ts.map +1 -1
- package/dist/commands/migrate/apply.js +108 -10
- package/dist/commands/migrate/apply.js.map +1 -1
- package/dist/commands/migrate/async-apply.d.ts +11 -3
- package/dist/commands/migrate/async-apply.d.ts.map +1 -1
- package/dist/commands/migrate/async-apply.js +113 -27
- package/dist/commands/migrate/async-apply.js.map +1 -1
- package/dist/commands/migrate/command.d.ts +46 -1
- package/dist/commands/migrate/command.d.ts.map +1 -1
- package/dist/commands/migrate/command.js +159 -35
- package/dist/commands/migrate/command.js.map +1 -1
- package/dist/commands/migrate/empty.d.ts +8 -0
- package/dist/commands/migrate/empty.d.ts.map +1 -0
- package/dist/commands/migrate/empty.js +17 -0
- package/dist/commands/migrate/empty.js.map +1 -0
- package/dist/commands/migrate/errors.d.ts +22 -0
- package/dist/commands/migrate/errors.d.ts.map +1 -0
- package/dist/commands/migrate/errors.js +31 -0
- package/dist/commands/migrate/errors.js.map +1 -0
- package/dist/commands/migrate/output.d.ts +31 -0
- package/dist/commands/migrate/output.d.ts.map +1 -1
- package/dist/commands/migrate/output.js +120 -9
- package/dist/commands/migrate/output.js.map +1 -1
- package/dist/commands/migrate/prompts.d.ts +1 -0
- package/dist/commands/migrate/prompts.d.ts.map +1 -1
- package/dist/commands/migrate/prompts.js +3 -0
- package/dist/commands/migrate/prompts.js.map +1 -1
- package/dist/commands/migrate/recovery.d.ts +90 -0
- package/dist/commands/migrate/recovery.d.ts.map +1 -0
- package/dist/commands/migrate/recovery.js +163 -0
- package/dist/commands/migrate/recovery.js.map +1 -0
- package/dist/commands/migrate/retry.d.ts +37 -0
- package/dist/commands/migrate/retry.d.ts.map +1 -0
- package/dist/commands/migrate/retry.js +46 -0
- package/dist/commands/migrate/retry.js.map +1 -0
- package/dist/commands/migrate/settings.d.ts +8 -0
- package/dist/commands/migrate/settings.d.ts.map +1 -0
- package/dist/commands/migrate/settings.js +40 -0
- package/dist/commands/migrate/settings.js.map +1 -0
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +28 -4
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/query.d.ts.map +1 -1
- package/dist/commands/query.js +11 -15
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/registry.d.ts +2 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +228 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/snapshot/command.d.ts +3 -0
- package/dist/commands/snapshot/command.d.ts.map +1 -0
- package/dist/commands/snapshot/command.js +32 -0
- package/dist/commands/snapshot/command.js.map +1 -0
- package/dist/commands/snapshot/output.d.ts +24 -0
- package/dist/commands/snapshot/output.d.ts.map +1 -0
- package/dist/commands/snapshot/output.js +86 -0
- package/dist/commands/snapshot/output.js.map +1 -0
- package/dist/commands/snapshot/rebuild.d.ts +19 -0
- package/dist/commands/snapshot/rebuild.d.ts.map +1 -0
- package/dist/commands/snapshot/rebuild.js +94 -0
- package/dist/commands/snapshot/rebuild.js.map +1 -0
- package/dist/internal-plugins/core/plugin.d.ts.map +1 -1
- package/dist/internal-plugins/core/plugin.js +2 -0
- package/dist/internal-plugins/core/plugin.js.map +1 -1
- package/dist/registry/build.d.ts +17 -0
- package/dist/registry/build.d.ts.map +1 -0
- package/dist/registry/build.js +94 -0
- package/dist/registry/build.js.map +1 -0
- package/dist/registry/dependencies.d.ts +19 -0
- package/dist/registry/dependencies.d.ts.map +1 -0
- package/dist/registry/dependencies.js +105 -0
- package/dist/registry/dependencies.js.map +1 -0
- package/dist/registry/files.d.ts +4 -0
- package/dist/registry/files.d.ts.map +1 -0
- package/dist/registry/files.js +33 -0
- package/dist/registry/files.js.map +1 -0
- package/dist/registry/install.d.ts +55 -0
- package/dist/registry/install.d.ts.map +1 -0
- package/dist/registry/install.js +175 -0
- package/dist/registry/install.js.map +1 -0
- package/dist/registry/model.d.ts +172 -0
- package/dist/registry/model.d.ts.map +1 -0
- package/dist/registry/model.js +161 -0
- package/dist/registry/model.js.map +1 -0
- package/dist/registry/project-config.d.ts +18 -0
- package/dist/registry/project-config.d.ts.map +1 -0
- package/dist/registry/project-config.js +337 -0
- package/dist/registry/project-config.js.map +1 -0
- package/dist/registry/resolve.d.ts +7 -0
- package/dist/registry/resolve.d.ts.map +1 -0
- package/dist/registry/resolve.js +136 -0
- package/dist/registry/resolve.js.map +1 -0
- package/dist/runtime/argv.d.ts +3 -0
- package/dist/runtime/argv.d.ts.map +1 -0
- package/dist/runtime/argv.js +29 -0
- package/dist/runtime/argv.js.map +1 -0
- package/dist/runtime/command-dispatch.d.ts +2 -1
- package/dist/runtime/command-dispatch.d.ts.map +1 -1
- package/dist/runtime/command-dispatch.js +15 -7
- package/dist/runtime/command-dispatch.js.map +1 -1
- package/dist/runtime/config-merge.d.ts.map +1 -1
- package/dist/runtime/config-merge.js +2 -1
- package/dist/runtime/config-merge.js.map +1 -1
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +2 -1
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/global-flags.d.ts +4 -0
- package/dist/runtime/global-flags.d.ts.map +1 -1
- package/dist/runtime/global-flags.js +1 -0
- package/dist/runtime/global-flags.js.map +1 -1
- package/dist/runtime/help.d.ts +1 -1
- package/dist/runtime/help.d.ts.map +1 -1
- package/dist/runtime/help.js +13 -4
- package/dist/runtime/help.js.map +1 -1
- package/dist/runtime/journal-store.d.ts.map +1 -1
- package/dist/runtime/journal-store.js +178 -42
- package/dist/runtime/journal-store.js.map +1 -1
- package/dist/runtime/json-output.d.ts +15 -1
- package/dist/runtime/json-output.d.ts.map +1 -1
- package/dist/runtime/json-output.js +43 -2
- package/dist/runtime/json-output.js.map +1 -1
- package/dist/runtime/migration-store.d.ts +1 -1
- package/dist/runtime/migration-store.d.ts.map +1 -1
- package/dist/runtime/migration-store.js +17 -16
- package/dist/runtime/migration-store.js.map +1 -1
- package/dist/runtime/plugin-runtime/executor-debug.d.ts.map +1 -1
- package/dist/runtime/plugin-runtime/executor-debug.js +10 -8
- package/dist/runtime/plugin-runtime/executor-debug.js.map +1 -1
- package/dist/runtime/plugin-runtime/loader.js +1 -1
- package/dist/runtime/plugin-runtime/loader.js.map +1 -1
- package/dist/runtime/safety-markers.d.ts +4 -2
- package/dist/runtime/safety-markers.d.ts.map +1 -1
- package/dist/runtime/safety-markers.js +4 -2
- package/dist/runtime/safety-markers.js.map +1 -1
- package/dist/runtime/schema-loader.d.ts +20 -1
- package/dist/runtime/schema-loader.d.ts.map +1 -1
- package/dist/runtime/schema-loader.js +26 -0
- package/dist/runtime/schema-loader.js.map +1 -1
- package/dist/runtime/snapshot-document.d.ts +33 -0
- package/dist/runtime/snapshot-document.d.ts.map +1 -0
- package/dist/runtime/snapshot-document.js +65 -0
- package/dist/runtime/snapshot-document.js.map +1 -0
- package/package.json +20 -7
- package/dist/bin/clickhouse-resource.d.ts +0 -4
- package/dist/bin/clickhouse-resource.d.ts.map +0 -1
- package/dist/bin/clickhouse-resource.js +0 -11
- package/dist/bin/clickhouse-resource.js.map +0 -1
- package/dist/bin/command-dispatch.d.ts +0 -13
- package/dist/bin/command-dispatch.d.ts.map +0 -1
- package/dist/bin/command-dispatch.js +0 -186
- package/dist/bin/command-dispatch.js.map +0 -1
- package/dist/bin/command-registry.d.ts +0 -34
- package/dist/bin/command-registry.d.ts.map +0 -1
- package/dist/bin/command-registry.js +0 -87
- package/dist/bin/command-registry.js.map +0 -1
- package/dist/bin/commands/check.d.ts +0 -3
- package/dist/bin/commands/check.d.ts.map +0 -1
- package/dist/bin/commands/check.js +0 -181
- package/dist/bin/commands/check.js.map +0 -1
- package/dist/bin/commands/codegen.d.ts +0 -2
- package/dist/bin/commands/codegen.d.ts.map +0 -1
- package/dist/bin/commands/codegen.js +0 -25
- package/dist/bin/commands/codegen.js.map +0 -1
- package/dist/bin/commands/drift.d.ts +0 -27
- package/dist/bin/commands/drift.d.ts.map +0 -1
- package/dist/bin/commands/drift.js +0 -220
- package/dist/bin/commands/drift.js.map +0 -1
- package/dist/bin/commands/generate/output.d.ts +0 -8
- package/dist/bin/commands/generate/output.d.ts.map +0 -1
- package/dist/bin/commands/generate/output.js +0 -58
- package/dist/bin/commands/generate/output.js.map +0 -1
- package/dist/bin/commands/generate/plan-pipeline.d.ts +0 -7
- package/dist/bin/commands/generate/plan-pipeline.d.ts.map +0 -1
- package/dist/bin/commands/generate/plan-pipeline.js +0 -143
- package/dist/bin/commands/generate/plan-pipeline.js.map +0 -1
- package/dist/bin/commands/generate/rename-mappings.d.ts +0 -29
- package/dist/bin/commands/generate/rename-mappings.d.ts.map +0 -1
- package/dist/bin/commands/generate/rename-mappings.js +0 -195
- package/dist/bin/commands/generate/rename-mappings.js.map +0 -1
- package/dist/bin/commands/generate.d.ts +0 -3
- package/dist/bin/commands/generate.d.ts.map +0 -1
- package/dist/bin/commands/generate.js +0 -158
- package/dist/bin/commands/generate.js.map +0 -1
- package/dist/bin/commands/init.d.ts +0 -2
- package/dist/bin/commands/init.d.ts.map +0 -1
- package/dist/bin/commands/init.js +0 -12
- package/dist/bin/commands/init.js.map +0 -1
- package/dist/bin/commands/migrate.d.ts +0 -3
- package/dist/bin/commands/migrate.d.ts.map +0 -1
- package/dist/bin/commands/migrate.js +0 -288
- package/dist/bin/commands/migrate.js.map +0 -1
- package/dist/bin/commands/plugin-like.d.ts +0 -38
- package/dist/bin/commands/plugin-like.d.ts.map +0 -1
- package/dist/bin/commands/plugin-like.js +0 -101
- package/dist/bin/commands/plugin-like.js.map +0 -1
- package/dist/bin/commands/plugin.d.ts +0 -3
- package/dist/bin/commands/plugin.d.ts.map +0 -1
- package/dist/bin/commands/plugin.js +0 -148
- package/dist/bin/commands/plugin.js.map +0 -1
- package/dist/bin/commands/pull.d.ts +0 -2
- package/dist/bin/commands/pull.d.ts.map +0 -1
- package/dist/bin/commands/pull.js +0 -25
- package/dist/bin/commands/pull.js.map +0 -1
- package/dist/bin/commands/status.d.ts +0 -3
- package/dist/bin/commands/status.d.ts.map +0 -1
- package/dist/bin/commands/status.js +0 -63
- package/dist/bin/commands/status.js.map +0 -1
- package/dist/bin/commands/typegen.d.ts +0 -2
- package/dist/bin/commands/typegen.d.ts.map +0 -1
- package/dist/bin/commands/typegen.js +0 -25
- package/dist/bin/commands/typegen.js.map +0 -1
- package/dist/bin/config.d.ts +0 -13
- package/dist/bin/config.d.ts.map +0 -1
- package/dist/bin/config.js +0 -48
- package/dist/bin/config.js.map +0 -1
- package/dist/bin/debug.d.ts +0 -3
- package/dist/bin/debug.d.ts.map +0 -1
- package/dist/bin/debug.js +0 -14
- package/dist/bin/debug.js.map +0 -1
- package/dist/bin/global-flags.d.ts +0 -16
- package/dist/bin/global-flags.d.ts.map +0 -1
- package/dist/bin/global-flags.js +0 -7
- package/dist/bin/global-flags.js.map +0 -1
- package/dist/bin/help.d.ts +0 -5
- package/dist/bin/help.d.ts.map +0 -1
- package/dist/bin/help.js +0 -84
- package/dist/bin/help.js.map +0 -1
- package/dist/bin/internal-plugins/index.d.ts +0 -3
- package/dist/bin/internal-plugins/index.d.ts.map +0 -1
- package/dist/bin/internal-plugins/index.js +0 -5
- package/dist/bin/internal-plugins/index.js.map +0 -1
- package/dist/bin/internal-plugins/skill-hint.d.ts +0 -31
- package/dist/bin/internal-plugins/skill-hint.d.ts.map +0 -1
- package/dist/bin/internal-plugins/skill-hint.js +0 -172
- package/dist/bin/internal-plugins/skill-hint.js.map +0 -1
- package/dist/bin/journal-store.d.ts +0 -10
- package/dist/bin/journal-store.d.ts.map +0 -1
- package/dist/bin/journal-store.js +0 -137
- package/dist/bin/journal-store.js.map +0 -1
- package/dist/bin/json-output.d.ts +0 -5
- package/dist/bin/json-output.d.ts.map +0 -1
- package/dist/bin/json-output.js +0 -21
- package/dist/bin/json-output.js.map +0 -1
- package/dist/bin/lib.d.ts +0 -5
- package/dist/bin/lib.d.ts.map +0 -1
- package/dist/bin/lib.js +0 -5
- package/dist/bin/lib.js.map +0 -1
- package/dist/bin/logging.d.ts +0 -3
- package/dist/bin/logging.d.ts.map +0 -1
- package/dist/bin/logging.js +0 -31
- package/dist/bin/logging.js.map +0 -1
- package/dist/bin/migration-store.d.ts +0 -22
- package/dist/bin/migration-store.d.ts.map +0 -1
- package/dist/bin/migration-store.js +0 -60
- package/dist/bin/migration-store.js.map +0 -1
- package/dist/bin/plugin-runtime.d.ts +0 -45
- package/dist/bin/plugin-runtime.d.ts.map +0 -1
- package/dist/bin/plugin-runtime.js +0 -513
- package/dist/bin/plugin-runtime.js.map +0 -1
- package/dist/bin/safety-markers.d.ts +0 -23
- package/dist/bin/safety-markers.d.ts.map +0 -1
- package/dist/bin/safety-markers.js +0 -85
- package/dist/bin/safety-markers.js.map +0 -1
- package/dist/bin/schema-loader.d.ts +0 -3
- package/dist/bin/schema-loader.d.ts.map +0 -1
- package/dist/bin/schema-loader.js +0 -11
- package/dist/bin/schema-loader.js.map +0 -1
- package/dist/bin/table-scope.d.ts +0 -38
- package/dist/bin/table-scope.d.ts.map +0 -1
- package/dist/bin/table-scope.js +0 -167
- package/dist/bin/table-scope.js.map +0 -1
- package/dist/bin/version.d.ts +0 -2
- package/dist/bin/version.d.ts.map +0 -1
- package/dist/bin/version.js +0 -5
- package/dist/bin/version.js.map +0 -1
- package/dist/drift-diff.d.ts +0 -8
- package/dist/drift-diff.d.ts.map +0 -1
- package/dist/drift-diff.js +0 -46
- package/dist/drift-diff.js.map +0 -1
- package/dist/drift.d.ts +0 -66
- package/dist/drift.d.ts.map +0 -1
- package/dist/drift.js +0 -220
- package/dist/drift.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isAbsolute, relative } from 'node:path';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { emitJson } from '../../runtime/json-output.js';
|
|
4
|
+
const DOCS_URL = 'https://chkit.obsessiondb.com/cli/snapshot/';
|
|
5
|
+
const UNREADABLE_LABELS = {
|
|
6
|
+
empty: 'empty file',
|
|
7
|
+
invalid_json: 'invalid JSON',
|
|
8
|
+
invalid_shape: 'not a chkit snapshot',
|
|
9
|
+
};
|
|
10
|
+
export function emitSnapshotRebuildOutput(payload, jsonMode) {
|
|
11
|
+
if (jsonMode) {
|
|
12
|
+
emitJson('snapshot', payload);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
console.log(formatSnapshotRebuildText(payload).join('\n'));
|
|
16
|
+
}
|
|
17
|
+
function formatSnapshotRebuildText(payload) {
|
|
18
|
+
const { previous } = payload;
|
|
19
|
+
const displayPath = formatShellPath(payload.snapshotFile);
|
|
20
|
+
const lines = [
|
|
21
|
+
formatHeader(payload),
|
|
22
|
+
`Definitions: ${payload.definitionCount}`,
|
|
23
|
+
`Previous snapshot: ${formatPreviousSummary(previous)}`,
|
|
24
|
+
];
|
|
25
|
+
if (previous.status === 'parsed') {
|
|
26
|
+
lines.push(...previous.added.map((key) => ` + ${key}`), ...previous.removed.map((key) => ` - ${key}`), ...previous.changed.map((key) => ` ~ ${key}`));
|
|
27
|
+
}
|
|
28
|
+
if (previous.status === 'conflicted') {
|
|
29
|
+
// Only one of MERGE_HEAD and REBASE_HEAD exists at a time, so each gets its
|
|
30
|
+
// own line. The labels are shell comments: a line still runs when pasted.
|
|
31
|
+
lines.push('', payload.mode === 'plan'
|
|
32
|
+
? 'After the rebuild, compare snapshot.json with both sides of the conflict before you commit it:'
|
|
33
|
+
: 'Compare snapshot.json with both sides of the conflict before you commit it:', ` git diff HEAD -- ${displayPath}`, ` git diff MERGE_HEAD -- ${displayPath} # during a merge`, ` git diff REBASE_HEAD -- ${displayPath} # during a rebase`, 'Every entry that differs from one side must come from a migration file of the other side.');
|
|
34
|
+
}
|
|
35
|
+
if (previous.status === 'unreadable') {
|
|
36
|
+
// `git checkout -- <path>` restores from the index, which still holds a
|
|
37
|
+
// staged damaged file and refuses an unmerged one. HEAD is the committed
|
|
38
|
+
// version, but during a merge or rebase it is only one side of the conflict.
|
|
39
|
+
lines.push('', 'If no merge or rebase is in progress and the damaged file is committed, its committed version', 'is a safer baseline than a rebuild. Restore it with:', ` git checkout HEAD -- ${displayPath}`);
|
|
40
|
+
}
|
|
41
|
+
if (needsCaution(previous)) {
|
|
42
|
+
lines.push('', ...formatCaution(payload.mode));
|
|
43
|
+
}
|
|
44
|
+
return lines;
|
|
45
|
+
}
|
|
46
|
+
function formatHeader(payload) {
|
|
47
|
+
if (payload.mode === 'plan')
|
|
48
|
+
return `Dry run: ${payload.snapshotFile} was not written.`;
|
|
49
|
+
if (payload.written && payload.previous.status === 'missing')
|
|
50
|
+
return `Created snapshot: ${payload.snapshotFile}`;
|
|
51
|
+
if (payload.written)
|
|
52
|
+
return `Rebuilt snapshot: ${payload.snapshotFile}`;
|
|
53
|
+
return `Snapshot is up to date: ${payload.snapshotFile}`;
|
|
54
|
+
}
|
|
55
|
+
function formatPreviousSummary(previous) {
|
|
56
|
+
if (previous.status === 'missing')
|
|
57
|
+
return 'none';
|
|
58
|
+
if (previous.status === 'parsed') {
|
|
59
|
+
return `${previous.added.length} added, ${previous.removed.length} removed, ${previous.changed.length} changed`;
|
|
60
|
+
}
|
|
61
|
+
if (previous.status === 'conflicted')
|
|
62
|
+
return 'unresolved merge conflict markers (not compared)';
|
|
63
|
+
return `${UNREADABLE_LABELS[previous.reason]} (not compared)`;
|
|
64
|
+
}
|
|
65
|
+
/** The snapshot path for a copy-pasteable command: relative when it is inside cwd, quoted when needed. */
|
|
66
|
+
function formatShellPath(file) {
|
|
67
|
+
const fromCwd = relative(process.cwd(), file);
|
|
68
|
+
const path = fromCwd && !fromCwd.startsWith('..') && !isAbsolute(fromCwd) ? fromCwd : file;
|
|
69
|
+
return /^[\w./-]+$/.test(path) ? path : `'${path.replaceAll("'", `'\\''`)}'`;
|
|
70
|
+
}
|
|
71
|
+
function needsCaution(previous) {
|
|
72
|
+
if (previous.status !== 'parsed')
|
|
73
|
+
return true;
|
|
74
|
+
return previous.added.length + previous.removed.length + previous.changed.length > 0;
|
|
75
|
+
}
|
|
76
|
+
function formatCaution(mode) {
|
|
77
|
+
const verb = mode === 'plan' ? 'would record' : 'records';
|
|
78
|
+
return [
|
|
79
|
+
`Caution: the rebuilt snapshot ${verb} every schema definition as already migrated, so`,
|
|
80
|
+
'`chkit generate` will not write a migration for any change it absorbed. Rebuild only when',
|
|
81
|
+
'every schema change already has a migration file. For merged branches, `chkit generate --dryrun`',
|
|
82
|
+
'should have reported 0 operations on each branch. After upgrading chkit, run `chkit generate` first.',
|
|
83
|
+
`When not to rebuild: ${DOCS_URL}#when-not-to-rebuild`,
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/snapshot/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ParsedFlags, type ResolvedChxConfig } from '@chkit/core';
|
|
2
|
+
import type { PluginRuntime } from '../../plugins.js';
|
|
3
|
+
export interface SnapshotRebuildInput {
|
|
4
|
+
dryrun: boolean;
|
|
5
|
+
jsonMode: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SnapshotRebuildDeps {
|
|
8
|
+
config: ResolvedChxConfig;
|
|
9
|
+
configPath: string;
|
|
10
|
+
flags: ParsedFlags;
|
|
11
|
+
pluginRuntime: PluginRuntime;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Rewrite snapshot.json from the schema definitions. Definitions are loaded,
|
|
15
|
+
* passed through the plugin hooks, validated and written exactly as
|
|
16
|
+
* `chkit generate` does; no migration is planned or written.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runSnapshotRebuild(input: SnapshotRebuildInput, deps: SnapshotRebuildDeps): Promise<number>;
|
|
19
|
+
//# sourceMappingURL=rebuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../../src/commands/snapshot/rebuild.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAarD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,WAAW,CAAA;IAClB,aAAa,EAAE,aAAa,CAAA;CAC7B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDhH"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { writeSnapshot } from '@chkit/codegen';
|
|
5
|
+
import { canonicalizeDefinitions, ChxValidationError, validateDefinitions, } from '@chkit/core';
|
|
6
|
+
import { resolveDirs } from '../../runtime/config.js';
|
|
7
|
+
import { emitJson } from '../../runtime/json-output.js';
|
|
8
|
+
import { readSnapshot } from '../../runtime/migration-store.js';
|
|
9
|
+
import { loadSchemaDefinitionsWithHooks } from '../../runtime/schema-loader.js';
|
|
10
|
+
import { carryRetainedDefinitions } from '../generate/cutover.js';
|
|
11
|
+
import { diffSnapshotDefinitions, parseSnapshotDocument, } from '../../runtime/snapshot-document.js';
|
|
12
|
+
import { emitSnapshotRebuildOutput } from './output.js';
|
|
13
|
+
/**
|
|
14
|
+
* Rewrite snapshot.json from the schema definitions. Definitions are loaded,
|
|
15
|
+
* passed through the plugin hooks, validated and written exactly as
|
|
16
|
+
* `chkit generate` does; no migration is planned or written.
|
|
17
|
+
*/
|
|
18
|
+
export async function runSnapshotRebuild(input, deps) {
|
|
19
|
+
const { metaDir } = resolveDirs(deps.config);
|
|
20
|
+
const snapshotFile = join(metaDir, 'snapshot.json');
|
|
21
|
+
const loaded = await loadSchemaDefinitionsWithHooks({
|
|
22
|
+
command: 'snapshot',
|
|
23
|
+
config: deps.config,
|
|
24
|
+
configPath: deps.configPath,
|
|
25
|
+
flags: deps.flags,
|
|
26
|
+
jsonMode: input.jsonMode,
|
|
27
|
+
}, { pluginRuntime: deps.pluginRuntime });
|
|
28
|
+
// A hook that edits definitions in place (instead of returning them) leaves
|
|
29
|
+
// them non-canonical. The snapshot always stores canonical definitions, so
|
|
30
|
+
// canonicalize once and validate, compare, count and write that same list.
|
|
31
|
+
// A table that a keep-mode cutover retained is declared in the snapshot only,
|
|
32
|
+
// so the rebuild keeps it, as `generate` does.
|
|
33
|
+
const definitions = carryRetainedDefinitions({
|
|
34
|
+
previousDefinitions: await readRetainedSource(metaDir),
|
|
35
|
+
definitions: canonicalizeDefinitions(loaded),
|
|
36
|
+
dropRetained: [],
|
|
37
|
+
});
|
|
38
|
+
// Same validation and error contract as `chkit generate` (planDiff validates the new definitions).
|
|
39
|
+
const issues = validateDefinitions(definitions);
|
|
40
|
+
if (issues.length > 0) {
|
|
41
|
+
if (input.jsonMode) {
|
|
42
|
+
emitJson('snapshot', { error: 'validation_failed', issues });
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
const details = issues.map((issue) => `- [${issue.code}] ${issue.message}`).join('\n');
|
|
46
|
+
throw new Error(`${new ChxValidationError(issues).message}\n${details}`);
|
|
47
|
+
}
|
|
48
|
+
const previous = await describePreviousSnapshot(snapshotFile, definitions);
|
|
49
|
+
const upToDate = previous.status === 'parsed' &&
|
|
50
|
+
previous.added.length + previous.removed.length + previous.changed.length === 0;
|
|
51
|
+
// An unchanged snapshot is left alone, so a rebuild never churns `generatedAt`.
|
|
52
|
+
const written = !input.dryrun && !upToDate;
|
|
53
|
+
if (written)
|
|
54
|
+
await writeSnapshot({ metaDir, definitions });
|
|
55
|
+
emitSnapshotRebuildOutput({
|
|
56
|
+
subcommand: 'rebuild',
|
|
57
|
+
mode: input.dryrun ? 'plan' : 'write',
|
|
58
|
+
snapshotFile,
|
|
59
|
+
written,
|
|
60
|
+
definitionCount: definitions.length,
|
|
61
|
+
previous,
|
|
62
|
+
}, input.jsonMode);
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
/** The definitions of the current snapshot, or none when it is missing or unreadable. */
|
|
66
|
+
async function readRetainedSource(metaDir) {
|
|
67
|
+
try {
|
|
68
|
+
return (await readSnapshot(metaDir))?.definitions ?? [];
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function describePreviousSnapshot(snapshotFile, next) {
|
|
75
|
+
if (!existsSync(snapshotFile))
|
|
76
|
+
return { status: 'missing' };
|
|
77
|
+
const raw = await readFile(snapshotFile, 'utf8');
|
|
78
|
+
let parsed;
|
|
79
|
+
try {
|
|
80
|
+
parsed = parseSnapshotDocument(raw);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Valid JSON whose entries cannot be read as chkit definitions. The rebuild
|
|
84
|
+
// replaces it anyway; it just cannot be compared.
|
|
85
|
+
return { status: 'unreadable', reason: 'invalid_shape' };
|
|
86
|
+
}
|
|
87
|
+
if (parsed.status === 'ok') {
|
|
88
|
+
return { status: 'parsed', ...diffSnapshotDefinitions(parsed.snapshot.definitions, next) };
|
|
89
|
+
}
|
|
90
|
+
if (parsed.reason === 'conflict_markers')
|
|
91
|
+
return { status: 'conflicted' };
|
|
92
|
+
return { status: 'unreadable', reason: parsed.reason };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=rebuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../../src/commands/snapshot/rebuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/internal-plugins/core/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/internal-plugins/core/plugin.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,sCAYrB,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { generateCommand } from '../../commands/generate/command.js';
|
|
|
4
4
|
import { migrateCommand } from '../../commands/migrate/command.js';
|
|
5
5
|
import { pluginCommand } from '../../commands/plugin.js';
|
|
6
6
|
import { queryCommand } from '../../commands/query.js';
|
|
7
|
+
import { snapshotCommand } from '../../commands/snapshot/command.js';
|
|
7
8
|
import { statusCommand } from '../../commands/status.js';
|
|
8
9
|
import { definePlugin } from '../../plugins.js';
|
|
9
10
|
export const corePlugin = definePlugin({
|
|
@@ -14,6 +15,7 @@ export const corePlugin = definePlugin({
|
|
|
14
15
|
statusCommand,
|
|
15
16
|
driftCommand,
|
|
16
17
|
checkCommand,
|
|
18
|
+
snapshotCommand,
|
|
17
19
|
queryCommand,
|
|
18
20
|
pluginCommand,
|
|
19
21
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/internal-plugins/core/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;IACrC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IACzC,QAAQ,EAAE;QACR,eAAe;QACf,cAAc;QACd,aAAa;QACb,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,aAAa;KACd;CACF,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/internal-plugins/core/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;IACrC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IACzC,QAAQ,EAAE;QACR,eAAe;QACf,cAAc;QACd,aAAa;QACb,YAAY;QACZ,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,aAAa;KACd;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type RegistryCatalog, type RegistryItem } from './model.js';
|
|
2
|
+
export declare function buildRegistry(input: {
|
|
3
|
+
manifestPath: string;
|
|
4
|
+
outputDir: string;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
items: RegistryItem[];
|
|
7
|
+
files: string[];
|
|
8
|
+
}>;
|
|
9
|
+
export declare function buildRegistryCatalog(input: {
|
|
10
|
+
catalog: RegistryCatalog;
|
|
11
|
+
sourceRoot: string;
|
|
12
|
+
outputDir: string;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
items: RegistryItem[];
|
|
15
|
+
files: string[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/registry/build.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiH,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAEnL,wBAAsB,aAAa,CAAC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAI3I;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsC1K"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import * as ts from 'typescript';
|
|
4
|
+
import { assertProjectPath, readOptional } from './files.js';
|
|
5
|
+
import { CATALOG_SCHEMA_URL, hashContent, ITEM_SCHEMA_URL, MAX_ARTIFACT_BYTES, parseRegistryCatalog, parseRegistryItem } from './model.js';
|
|
6
|
+
export async function buildRegistry(input) {
|
|
7
|
+
const manifestPath = resolve(input.manifestPath);
|
|
8
|
+
const catalog = parseRegistryCatalog(JSON.parse(await readFile(manifestPath, 'utf8')));
|
|
9
|
+
return buildRegistryCatalog({ catalog, sourceRoot: dirname(manifestPath), outputDir: input.outputDir });
|
|
10
|
+
}
|
|
11
|
+
export async function buildRegistryCatalog(input) {
|
|
12
|
+
const sourceRoot = resolve(input.sourceRoot);
|
|
13
|
+
const outputDir = resolve(input.outputDir);
|
|
14
|
+
const catalog = parseRegistryCatalog(input.catalog);
|
|
15
|
+
const items = [];
|
|
16
|
+
const outputs = [];
|
|
17
|
+
for (const source of catalog.items) {
|
|
18
|
+
const files = [];
|
|
19
|
+
for (const file of source.files) {
|
|
20
|
+
const path = resolve(sourceRoot, file.path);
|
|
21
|
+
await assertProjectPath(sourceRoot, path);
|
|
22
|
+
const content = await readFile(path, 'utf8');
|
|
23
|
+
if (/\.[cm]?tsx?$/.test(file.path))
|
|
24
|
+
validateSyntax(file.path, content);
|
|
25
|
+
files.push({ ...file, content });
|
|
26
|
+
}
|
|
27
|
+
const item = parseRegistryItem({
|
|
28
|
+
...source,
|
|
29
|
+
$schema: ITEM_SCHEMA_URL,
|
|
30
|
+
files,
|
|
31
|
+
meta: { chkit: { ...source.meta.chkit, fileHashes: Object.fromEntries(files.map((file) => [file.target, hashContent(file.content ?? '')])) } },
|
|
32
|
+
});
|
|
33
|
+
validateEntryExports(item);
|
|
34
|
+
const content = serialize(item);
|
|
35
|
+
const versionPath = resolve(outputDir, item.name, `${item.meta.chkit.version}.json`);
|
|
36
|
+
await assertProjectPath(outputDir, versionPath);
|
|
37
|
+
const existing = await readOptional(versionPath);
|
|
38
|
+
if (existing !== undefined && existing !== content)
|
|
39
|
+
throw new Error(`Immutable registry version already exists with different content: ${versionPath}. Bump the template version.`);
|
|
40
|
+
items.push(item);
|
|
41
|
+
outputs.push({ path: versionPath, content }, { path: resolve(outputDir, `${item.name}.json`), content });
|
|
42
|
+
}
|
|
43
|
+
const index = { ...catalog, $schema: CATALOG_SCHEMA_URL, items: items.map((item) => ({ ...item, files: item.files.map(({ content: _content, ...file }) => file) })) };
|
|
44
|
+
outputs.push({ path: resolve(outputDir, 'registry.json'), content: serialize(index) });
|
|
45
|
+
for (const output of outputs)
|
|
46
|
+
await assertProjectPath(outputDir, output.path);
|
|
47
|
+
for (const output of outputs) {
|
|
48
|
+
await mkdir(dirname(output.path), { recursive: true });
|
|
49
|
+
await writeFile(output.path, output.content);
|
|
50
|
+
}
|
|
51
|
+
return { items, files: outputs.map((file) => file.path) };
|
|
52
|
+
}
|
|
53
|
+
function validateEntryExports(item) {
|
|
54
|
+
const entryPath = `${item.meta.chkit.root}/${item.meta.chkit.entry}`;
|
|
55
|
+
const entry = item.files.find((file) => file.target === entryPath);
|
|
56
|
+
if (!entry?.content)
|
|
57
|
+
throw new Error(`Missing entry source: ${entryPath}`);
|
|
58
|
+
const source = ts.createSourceFile(entryPath, entry.content, ts.ScriptTarget.Latest, true);
|
|
59
|
+
const names = new Set();
|
|
60
|
+
for (const statement of source.statements) {
|
|
61
|
+
if (ts.isExportDeclaration(statement) && !statement.isTypeOnly && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
62
|
+
for (const element of statement.exportClause.elements)
|
|
63
|
+
if (!element.isTypeOnly)
|
|
64
|
+
names.add(element.name.text);
|
|
65
|
+
}
|
|
66
|
+
if (ts.canHaveModifiers(statement) && ts.getModifiers(statement)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) {
|
|
67
|
+
if (ts.isVariableStatement(statement)) {
|
|
68
|
+
for (const declaration of statement.declarationList.declarations)
|
|
69
|
+
if (ts.isIdentifier(declaration.name))
|
|
70
|
+
names.add(declaration.name.text);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const name of item.meta.chkit.exports) {
|
|
75
|
+
if (!names.has(name))
|
|
76
|
+
throw new Error(`Entry ${entryPath} must explicitly export ${name}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function validateSyntax(path, content) {
|
|
80
|
+
const diagnostics = ts.transpileModule(content, {
|
|
81
|
+
fileName: path, reportDiagnostics: true,
|
|
82
|
+
compilerOptions: { target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.ESNext },
|
|
83
|
+
}).diagnostics ?? [];
|
|
84
|
+
const error = diagnostics.find((diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error);
|
|
85
|
+
if (error)
|
|
86
|
+
throw new Error(`Invalid template source ${path}: ${ts.flattenDiagnosticMessageText(error.messageText, '\n')}`);
|
|
87
|
+
}
|
|
88
|
+
function serialize(value) {
|
|
89
|
+
const text = `${JSON.stringify(value, null, 2)}\n`;
|
|
90
|
+
if (Buffer.byteLength(text) > MAX_ARTIFACT_BYTES)
|
|
91
|
+
throw new Error('Registry artifact exceeds the 8 MiB limit');
|
|
92
|
+
return text;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/registry/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type PackageManager } from '../runtime/deps.js';
|
|
2
|
+
import { type RegistryItem } from './model.js';
|
|
3
|
+
export declare function planDependencies(input: {
|
|
4
|
+
cwd: string;
|
|
5
|
+
item: RegistryItem;
|
|
6
|
+
cliVersion: string;
|
|
7
|
+
packageManager?: PackageManager;
|
|
8
|
+
withTests?: boolean;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
original?: string;
|
|
13
|
+
dependencies: string[];
|
|
14
|
+
packageManager: PackageManager;
|
|
15
|
+
installed: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function installDependencies(cwd: string, packageManager: PackageManager): Promise<void>;
|
|
18
|
+
export declare function parsePackageManager(value: string): PackageManager;
|
|
19
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE9E,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAYjE,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IACpK,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAC7H,CAAC,CA0CD;AAmBD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAGjE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { basename, dirname, resolve } from 'node:path';
|
|
3
|
+
import { satisfies, subset, validRange } from 'semver';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { detectPackageManager } from '../runtime/deps.js';
|
|
6
|
+
import { readOptional } from './files.js';
|
|
7
|
+
import { requireDependency } from './model.js';
|
|
8
|
+
const manifestSchema = z.object({
|
|
9
|
+
name: z.string().optional(),
|
|
10
|
+
version: z.string().optional(),
|
|
11
|
+
packageManager: z.string().optional(),
|
|
12
|
+
dependencies: z.record(z.string(), z.string()).optional(),
|
|
13
|
+
devDependencies: z.record(z.string(), z.string()).optional(),
|
|
14
|
+
peerDependencies: z.record(z.string(), z.string()).optional(),
|
|
15
|
+
optionalDependencies: z.record(z.string(), z.string()).optional(),
|
|
16
|
+
}).passthrough();
|
|
17
|
+
export async function planDependencies(input) {
|
|
18
|
+
const path = resolve(input.cwd, 'package.json');
|
|
19
|
+
const original = await readOptional(path);
|
|
20
|
+
const manifest = original === undefined
|
|
21
|
+
? { name: basename(input.cwd).toLowerCase().replace(/[^a-z0-9._-]/g, '-') || 'chkit-project', private: true, type: 'module' }
|
|
22
|
+
: manifestSchema.parse(JSON.parse(original));
|
|
23
|
+
const parsed = manifestSchema.parse(manifest);
|
|
24
|
+
const packageManager = input.packageManager ?? await choosePackageManager(input.cwd, parsed.packageManager);
|
|
25
|
+
const meta = input.item.meta.chkit;
|
|
26
|
+
const versionOptions = { includePrerelease: true };
|
|
27
|
+
if (!satisfies(input.cliVersion, meta.chkit, versionOptions))
|
|
28
|
+
throw new Error(`Template requires chkit ${meta.chkit}; running ${input.cliVersion}. Use a compatible CLI version.`);
|
|
29
|
+
const desired = [...input.item.dependencies, ...(input.withTests ? input.item.devDependencies ?? [] : [])];
|
|
30
|
+
const hasExplicitCli = desired.some((spec) => requireDependency(spec).name === 'chkit');
|
|
31
|
+
if (!hasExplicitCli)
|
|
32
|
+
desired.push(`chkit@${input.cliVersion}`);
|
|
33
|
+
const devDependencies = { ...parsed.devDependencies };
|
|
34
|
+
const dependencies = [];
|
|
35
|
+
let installed = true;
|
|
36
|
+
for (const spec of desired) {
|
|
37
|
+
const { name, range } = requireDependency(spec);
|
|
38
|
+
const compatibility = name === '@chkit/plugin-ingest' ? meta.ingest : name === 'chkit' || name === '@chkit/core' ? meta.chkit : undefined;
|
|
39
|
+
if (compatibility && !subset(range, compatibility, versionOptions))
|
|
40
|
+
throw new Error(`Dependency ${spec} is outside the template compatibility range ${compatibility}`);
|
|
41
|
+
const existing = parsed.dependencies?.[name] ?? parsed.devDependencies?.[name];
|
|
42
|
+
const required = name === 'chkit' && !hasExplicitCli ? meta.chkit : range;
|
|
43
|
+
const localVersion = await installedVersion(input.cwd, name);
|
|
44
|
+
if (!localVersion || !satisfies(localVersion, existing ?? required, versionOptions) || !satisfies(localVersion, required, versionOptions))
|
|
45
|
+
installed = false;
|
|
46
|
+
for (const indirect of [parsed.peerDependencies?.[name], parsed.optionalDependencies?.[name]]) {
|
|
47
|
+
if (indirect !== undefined && (!validRange(indirect) || !subset(indirect, required, versionOptions))) {
|
|
48
|
+
throw new Error(`Dependency conflict: ${name} is ${indirect}, but the template requires ${required}. Choose compatible versions before installing.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (existing !== undefined) {
|
|
52
|
+
if (!validRange(existing) || !subset(existing, required, versionOptions)) {
|
|
53
|
+
throw new Error(`Dependency conflict: ${name} is ${existing}, but the template requires ${required}. Choose compatible versions before installing.`);
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
devDependencies[name] = range;
|
|
58
|
+
dependencies.push(spec);
|
|
59
|
+
}
|
|
60
|
+
const changed = dependencies.length > 0 || original === undefined;
|
|
61
|
+
const content = changed ? `${JSON.stringify({ ...parsed, devDependencies }, null, 2)}\n` : original;
|
|
62
|
+
return { path, content: content ?? '', original, dependencies, packageManager, installed };
|
|
63
|
+
}
|
|
64
|
+
async function installedVersion(cwd, name) {
|
|
65
|
+
// Inspect the current filesystem rather than module-resolution caches, which
|
|
66
|
+
// may retain a miss across package installation in the same Bun process.
|
|
67
|
+
// Reading through node_modules links also supports pnpm's strict layout.
|
|
68
|
+
let path = resolve(cwd);
|
|
69
|
+
while (true) {
|
|
70
|
+
const text = await readOptional(resolve(path, 'node_modules', name, 'package.json'));
|
|
71
|
+
if (text !== undefined) {
|
|
72
|
+
const manifest = manifestSchema.parse(JSON.parse(text));
|
|
73
|
+
if (manifest.name === name)
|
|
74
|
+
return manifest.version;
|
|
75
|
+
}
|
|
76
|
+
const parent = dirname(path);
|
|
77
|
+
if (parent === path)
|
|
78
|
+
return undefined;
|
|
79
|
+
path = parent;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function installDependencies(cwd, packageManager) {
|
|
83
|
+
await new Promise((resolvePromise, reject) => {
|
|
84
|
+
// stdout remains available for the CLI's JSON response; package-manager logs go to stderr.
|
|
85
|
+
const child = spawn(packageManager, ['install'], { cwd, stdio: ['ignore', 2, 2] });
|
|
86
|
+
child.on('error', reject);
|
|
87
|
+
child.on('close', (code) => code === 0 ? resolvePromise() : reject(new Error(`${packageManager} install failed (${code}). Files are installed; run ${packageManager} install in ${cwd} to complete setup.`)));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export function parsePackageManager(value) {
|
|
91
|
+
if (value === 'bun' || value === 'npm' || value === 'pnpm' || value === 'yarn')
|
|
92
|
+
return value;
|
|
93
|
+
throw new Error(`Unsupported package manager: ${value}. Use bun, npm, pnpm, or yarn.`);
|
|
94
|
+
}
|
|
95
|
+
async function choosePackageManager(cwd, declared) {
|
|
96
|
+
if (declared)
|
|
97
|
+
return parsePackageManager(declared.split('@')[0] ?? '');
|
|
98
|
+
const lockfiles = [['bun.lock', 'bun'], ['bun.lockb', 'bun'], ['package-lock.json', 'npm'], ['pnpm-lock.yaml', 'pnpm'], ['yarn.lock', 'yarn']];
|
|
99
|
+
const present = await Promise.all(lockfiles.map(async ([file, pm]) => (await readOptional(resolve(cwd, file))) === undefined ? undefined : pm));
|
|
100
|
+
const managers = [...new Set(present.filter((pm) => pm !== undefined))];
|
|
101
|
+
if (managers.length > 1)
|
|
102
|
+
throw new Error('Multiple package-manager lockfiles found. Choose --package-manager explicitly.');
|
|
103
|
+
return managers[0] ?? detectPackageManager();
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/registry/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Reject symlinks even within the project: installation should never write through one. */
|
|
2
|
+
export declare function assertProjectPath(root: string, path: string): Promise<void>;
|
|
3
|
+
export declare function readOptional(path: string): Promise<string | undefined>;
|
|
4
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/registry/files.ts"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK5E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { lstat, readFile } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, relative, resolve, sep } from 'node:path';
|
|
3
|
+
/** Reject symlinks even within the project: installation should never write through one. */
|
|
4
|
+
export async function assertProjectPath(root, path) {
|
|
5
|
+
const absoluteRoot = resolve(root);
|
|
6
|
+
const absolutePath = resolve(path);
|
|
7
|
+
const suffix = relative(absoluteRoot, absolutePath);
|
|
8
|
+
if (!suffix || suffix === '..' || suffix.startsWith(`..${sep}`) || isAbsolute(suffix)) {
|
|
9
|
+
throw new Error(`Path must stay inside the project: ${path}`);
|
|
10
|
+
}
|
|
11
|
+
let current = absoluteRoot;
|
|
12
|
+
for (const part of suffix.split(sep)) {
|
|
13
|
+
current = resolve(current, part);
|
|
14
|
+
const stat = await lstat(current).catch((error) => {
|
|
15
|
+
if (isMissing(error))
|
|
16
|
+
return undefined;
|
|
17
|
+
throw error;
|
|
18
|
+
});
|
|
19
|
+
if (stat?.isSymbolicLink())
|
|
20
|
+
throw new Error(`Refusing a symlink in registry path: ${current}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function readOptional(path) {
|
|
24
|
+
return readFile(path, 'utf8').catch((error) => {
|
|
25
|
+
if (isMissing(error))
|
|
26
|
+
return undefined;
|
|
27
|
+
throw error;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function isMissing(error) {
|
|
31
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/registry/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE9D,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IACnD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACzD,IAAI,SAAS,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAA;YACtC,MAAM,KAAK,CAAA;QACb,CAAC,CAAC,CAAA;QACF,IAAI,IAAI,EAAE,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAA;IAChG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACrD,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QACtC,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC7E,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { PackageManager } from '../runtime/deps.js';
|
|
2
|
+
import { type RegistryItem } from './model.js';
|
|
3
|
+
export interface PlannedFile {
|
|
4
|
+
path: string;
|
|
5
|
+
content: string;
|
|
6
|
+
original?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface InstallPlan {
|
|
9
|
+
cwd: string;
|
|
10
|
+
template: {
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
origin: string;
|
|
14
|
+
};
|
|
15
|
+
files: PlannedFile[];
|
|
16
|
+
dependencies: string[];
|
|
17
|
+
packageManager: PackageManager;
|
|
18
|
+
noInstall: boolean;
|
|
19
|
+
withTests: boolean;
|
|
20
|
+
alreadyInstalled: boolean;
|
|
21
|
+
installRequired: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function planInstallation(input: {
|
|
24
|
+
cwd: string;
|
|
25
|
+
item: RegistryItem;
|
|
26
|
+
origin: string;
|
|
27
|
+
cliVersion: string;
|
|
28
|
+
path?: string;
|
|
29
|
+
configPath?: string;
|
|
30
|
+
packageManager?: PackageManager;
|
|
31
|
+
noInstall?: boolean;
|
|
32
|
+
withTests?: boolean;
|
|
33
|
+
}): Promise<InstallPlan>;
|
|
34
|
+
export declare function applyInstallation(plan: InstallPlan, deps?: {
|
|
35
|
+
install?: (cwd: string, packageManager: PackageManager) => Promise<void>;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
export declare function describePlan(plan: InstallPlan): {
|
|
38
|
+
template: {
|
|
39
|
+
name: string;
|
|
40
|
+
version: string;
|
|
41
|
+
origin: string;
|
|
42
|
+
};
|
|
43
|
+
files: {
|
|
44
|
+
path: string;
|
|
45
|
+
action: string;
|
|
46
|
+
content: string;
|
|
47
|
+
}[];
|
|
48
|
+
dependencies: string[];
|
|
49
|
+
packageManager: PackageManager;
|
|
50
|
+
noInstall: boolean;
|
|
51
|
+
withTests: boolean;
|
|
52
|
+
alreadyInstalled: boolean;
|
|
53
|
+
installRequired: boolean;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=install.d.ts.map
|