@wcstack/typescript 4.5.0 → 4.6.1
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.ja.md +2 -2
- package/README.md +2 -2
- package/dist/index.d.ts +5 -1
- package/dist/index.esm.js +32 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/schema-core.cjs +2 -0
- package/dist/wcs-schema.mjs +32 -5
- package/dist/wcs-schema.mjs.map +1 -1
- package/dist/wcs-tsc.mjs +36 -6
- package/dist/wcs-tsc.mjs.map +1 -1
- package/package.json +2 -2
package/README.ja.md
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
`@wcstack/typescript` はこの穴をコマンド 1 つで塞ぎます。`wcs-schema` は state ファイルを TypeScript コンパイラ API でコンパイルし、検証器が消費する sidecar `wcstack.manifest.json` の `stateSchema` を書き出します — CI でも、どのエディタでも。manifest は**派生物**です: 正本は型のままで、乖離すれば `wcs-schema check` が CI を落とします。
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install -D @wcstack/typescript typescript
|
|
12
|
+
npm install -D @wcstack/typescript typescript@6
|
|
13
13
|
npx wcs-schema emit src/state.ts # ./wcstack.manifest.json を書く
|
|
14
14
|
npx wcs-validate --strict index.html # typo は error に、偽警告は消える
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
ランタイム依存ゼロ。`typescript` は peer dependency — プロジェクト自身のコンパイラを使います。
|
|
17
|
+
ランタイム依存ゼロ。`typescript` は peer dependency — プロジェクト自身のコンパイラを使います。TypeScript 5 か 6 が必要です: TypeScript 7 は、どちらのコマンドも呼べる JavaScript のコンパイラ API を公開しません(`typescript` が公開するのは版だけで、`typescript/lib/tsc.js` もありません)。
|
|
18
18
|
|
|
19
19
|
## コマンド
|
|
20
20
|
|
package/README.md
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
`@wcstack/typescript` closes that gap with one command. `wcs-schema` compiles the state file with the TypeScript compiler API and writes the sidecar `wcstack.manifest.json` `stateSchema` that the validator consumes — in CI and in every editor. The manifest is a **derived artifact**: the type stays the source of truth, and `wcs-schema check` fails CI when they drift.
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install -D @wcstack/typescript typescript
|
|
12
|
+
npm install -D @wcstack/typescript typescript@6
|
|
13
13
|
npx wcs-schema emit src/state.ts # writes ./wcstack.manifest.json
|
|
14
14
|
npx wcs-validate --strict index.html # typos are now errors, false warnings are gone
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Zero runtime dependencies. `typescript` is a peer dependency — the project's own compiler is used.
|
|
17
|
+
Zero runtime dependencies. `typescript` is a peer dependency — the project's own compiler is used. It must be TypeScript 5 or 6: TypeScript 7 publishes no JavaScript compiler API (`typescript` exports only its version, and there is no `typescript/lib/tsc.js`) for either command to call.
|
|
18
18
|
|
|
19
19
|
## Commands
|
|
20
20
|
|
package/dist/index.d.ts
CHANGED
|
@@ -28,7 +28,11 @@ interface LoadedState {
|
|
|
28
28
|
/** A top-level spread brings in keys its type does not list: the state's schema is open (`{}`), whatever `type` says. */
|
|
29
29
|
readonly open: boolean;
|
|
30
30
|
}
|
|
31
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Defaults used when no tsconfig.json is found — enough to type a plain state file.
|
|
33
|
+
* The enums are read with `?.` so that this module still loads under TypeScript 7,
|
|
34
|
+
* whose `typescript` has none: `loadStateFile` then refuses that compiler by name.
|
|
35
|
+
*/
|
|
32
36
|
declare const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions;
|
|
33
37
|
declare function resolveCompilerOptions(stateFile: string, options?: LoadStateOptions): ts.CompilerOptions;
|
|
34
38
|
declare function loadStateFile(file: string, options?: LoadStateOptions): LoadedState;
|
package/dist/index.esm.js
CHANGED
|
@@ -4,6 +4,26 @@ import ts from 'typescript';
|
|
|
4
4
|
import { createRequire } from 'node:module';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* typescriptSupport.ts — which `typescript` this package can run on.
|
|
9
|
+
*
|
|
10
|
+
* Both commands drive the JavaScript compiler API of TypeScript 5 and 6:
|
|
11
|
+
* `wcs-schema` through `import ts from "typescript"`, `wcs-tsc` by running the
|
|
12
|
+
* project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the
|
|
13
|
+
* native compiler) publishes neither — its `typescript` export is
|
|
14
|
+
* `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both
|
|
15
|
+
* refuse it by name instead of failing on what is missing. TypeScript 7 reads other
|
|
16
|
+
* file types through content mappers (7.1); this package does not provide one yet.
|
|
17
|
+
*/
|
|
18
|
+
/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */
|
|
19
|
+
function unsupportedTypeScript(version) {
|
|
20
|
+
return Number.parseInt(version ?? "", 10) >= 7 ? version : undefined;
|
|
21
|
+
}
|
|
22
|
+
/** The refusal both commands report (exit code 2), without a trailing newline. */
|
|
23
|
+
function unsupportedTypeScriptMessage(version) {
|
|
24
|
+
return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;
|
|
25
|
+
}
|
|
26
|
+
|
|
7
27
|
/**
|
|
8
28
|
* program.ts — open a state file with the TypeScript compiler API and locate the
|
|
9
29
|
* type of its `export default`.
|
|
@@ -14,11 +34,15 @@ import { fileURLToPath } from 'node:url';
|
|
|
14
34
|
* call expression would type as `any` and every path would be lost, while the
|
|
15
35
|
* argument literal still carries the full object type.
|
|
16
36
|
*/
|
|
17
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Defaults used when no tsconfig.json is found — enough to type a plain state file.
|
|
39
|
+
* The enums are read with `?.` so that this module still loads under TypeScript 7,
|
|
40
|
+
* whose `typescript` has none: `loadStateFile` then refuses that compiler by name.
|
|
41
|
+
*/
|
|
18
42
|
const DEFAULT_COMPILER_OPTIONS = {
|
|
19
|
-
target: ts.ScriptTarget
|
|
20
|
-
module: ts.ModuleKind
|
|
21
|
-
moduleResolution: ts.ModuleResolutionKind
|
|
43
|
+
target: ts.ScriptTarget?.ESNext,
|
|
44
|
+
module: ts.ModuleKind?.ESNext,
|
|
45
|
+
moduleResolution: ts.ModuleResolutionKind?.Bundler,
|
|
22
46
|
lib: ["lib.esnext.d.ts", "lib.dom.d.ts", "lib.dom.iterable.d.ts"],
|
|
23
47
|
strict: true,
|
|
24
48
|
};
|
|
@@ -78,6 +102,9 @@ function stateExpression(expression) {
|
|
|
78
102
|
return current;
|
|
79
103
|
}
|
|
80
104
|
function loadStateFile(file, options = {}) {
|
|
105
|
+
const unsupported = unsupportedTypeScript(ts.version);
|
|
106
|
+
if (unsupported !== undefined)
|
|
107
|
+
throw new Error(unsupportedTypeScriptMessage(unsupported));
|
|
81
108
|
const abs = resolve(file);
|
|
82
109
|
if (!existsSync(abs))
|
|
83
110
|
throw new Error(`cannot read ${file}: no such file`);
|
|
@@ -614,7 +641,7 @@ function loadSchemaCore() {
|
|
|
614
641
|
return cached;
|
|
615
642
|
}
|
|
616
643
|
|
|
617
|
-
var version = "4.
|
|
644
|
+
var version = "4.6.1";
|
|
618
645
|
var pkg = {
|
|
619
646
|
version: version};
|
|
620
647
|
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../src/program.ts","../../src/typeToSchema.ts","../../src/generate.ts","../../src/manifest.ts","../../src/schemaCore.ts","../../src/version.ts"],"sourcesContent":["/**\n * program.ts — open a state file with the TypeScript compiler API and locate the\n * type of its `export default`.\n *\n * `defineState(x)` is an identity function, so the exported type is `x`'s type —\n * but the call is unwrapped syntactically anyway: when `@wcstack/state` is not\n * resolvable from the state file (a CDN-only page, a fixture in a temp dir), the\n * call expression would type as `any` and every path would be lost, while the\n * argument literal still carries the full object type.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport ts from \"typescript\";\n\nexport interface LoadStateOptions {\n /** Explicit tsconfig.json path. Default: the nearest tsconfig.json above the state file, else built-in defaults. */\n readonly tsconfig?: string;\n}\n\nexport interface LoadedState {\n readonly program: ts.Program;\n readonly checker: ts.TypeChecker;\n readonly sourceFile: ts.SourceFile;\n /** The type of the default export (the `defineState(...)` argument when wrapped). */\n readonly type: ts.Type;\n /** Node to use as the location for `getTypeOfSymbolAtLocation`. */\n readonly location: ts.Node;\n /** Non-fatal notes for the caller (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n /** A top-level spread brings in keys its type does not list: the state's schema is open (`{}`), whatever `type` says. */\n readonly open: boolean;\n}\n\n/** Defaults used when no tsconfig.json is found — enough to type a plain state file. */\nexport const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n lib: [\"lib.esnext.d.ts\", \"lib.dom.d.ts\", \"lib.dom.iterable.d.ts\"],\n strict: true,\n};\n\n/** The compiler API compares paths it attaches diagnostics to against `/`-separated ones; feed it those on Windows too. */\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nexport function resolveCompilerOptions(stateFile: string, options: LoadStateOptions = {}): ts.CompilerOptions {\n const configPath = options.tsconfig !== undefined\n ? toPosix(resolve(options.tsconfig))\n : ts.findConfigFile(toPosix(dirname(stateFile)), ts.sys.fileExists, \"tsconfig.json\");\n let base: ts.CompilerOptions = { ...DEFAULT_COMPILER_OPTIONS };\n if (configPath !== undefined) {\n let parsedOptions: ts.CompilerOptions;\n try {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n if (read.error !== undefined) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n }\n parsedOptions = ts.parseJsonConfigFileContent(read.config, ts.sys, toPosix(dirname(configPath)), undefined, configPath).options;\n } catch (e) {\n throw new Error(`cannot read ${configPath}: ${(e as Error).message}`);\n }\n base = { ...DEFAULT_COMPILER_OPTIONS, ...parsedOptions };\n }\n return {\n ...base,\n // The generator only reads types: never write, always accept JS (JSDoc types), keep it fast.\n noEmit: true,\n allowJs: true,\n checkJs: true,\n skipLibCheck: true,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n };\n}\n\n/** Unwrap `defineState(x)` (any callee whose last identifier is `defineState`) and `satisfies` / `as`-free wrappers. */\nfunction stateExpression(expression: ts.Expression): ts.Expression {\n let current = expression;\n while (ts.isParenthesizedExpression(current)) current = current.expression;\n if (ts.isCallExpression(current) && current.arguments.length > 0) {\n const callee = current.expression;\n const name = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : undefined;\n if (name === \"defineState\") return current.arguments[0];\n }\n return current;\n}\n\nexport function loadStateFile(file: string, options: LoadStateOptions = {}): LoadedState {\n const abs = resolve(file);\n if (!existsSync(abs)) throw new Error(`cannot read ${file}: no such file`);\n // Read up front so an unreadable file fails with a plain message, not a compiler internals one.\n readFileSync(abs, \"utf8\");\n\n const compilerOptions = resolveCompilerOptions(abs, options);\n const program = ts.createProgram([abs], compilerOptions);\n const sourceFile = program.getSourceFile(abs);\n /* v8 ignore next -- the file exists and is a root name; the compiler always returns it */\n if (sourceFile === undefined) throw new Error(`cannot open ${file} as a TypeScript/JavaScript source`);\n\n const syntax = program.getSyntacticDiagnostics(sourceFile);\n if (syntax.length > 0) {\n const lines = syntax.map((d) => {\n // Syntactic diagnostics always carry their file and position; the fallback is type-level only.\n /* v8 ignore next 2 */\n const pos = d.file !== undefined && d.start !== undefined ? d.file.getLineAndCharacterOfPosition(d.start) : undefined;\n const where = pos !== undefined ? `${file}:${pos.line + 1}:${pos.character + 1}` : file;\n return `${where} ${ts.flattenDiagnosticMessageText(d.messageText, \"\\n\")}`;\n });\n throw new Error(`syntax error(s) in ${file}:\\n${lines.join(\"\\n\")}`);\n }\n\n const exportAssignment = sourceFile.statements.find(\n (s): s is ts.ExportAssignment => ts.isExportAssignment(s) && !s.isExportEquals,\n );\n if (exportAssignment === undefined) {\n throw new Error(`${file} has no \\`export default\\` — a wcstack state file exports its state object as the default export`);\n }\n\n const location = stateExpression(exportAssignment.expression);\n const checker = program.getTypeChecker();\n const warnings: string[] = [];\n // A spread whose type does not list its keys first: the type of the whole literal is not needed then (and is the\n // expensive one, below)\n const spread = openSpread(checker, sourceFile, location);\n if (spread !== null) {\n warnings.push(`the spread \\`${spread.text}\\` (${file}:${spread.line}) brings in keys its type does not list (\\`${spread.type}\\`); the generated stateSchema will be open ({}). Give that expression a type that lists them (a JSDoc @returns or @type)`);\n return { program, checker, sourceFile, type: checker.getAnyType(), location, warnings, open: true };\n }\n let type: ts.Type;\n try {\n type = checker.getTypeAtLocation(location);\n } catch (e) {\n /* v8 ignore next 2 -- the checker's own overflow, exercised against the built dist (stack.test.ts) */\n if (!(e instanceof RangeError)) throw e;\n throw new Error(`the TypeScript checker ran out of stack on ${file}: an \\`export default { … }\\` with a top-level spread makes it recurse once per getter that reads \\`this\\`. The wcs-schema command runs on a larger stack; from the API, call generateStateSchema() on a worker with a larger resourceLimits.stackSizeMb`);\n }\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n warnings.push(`the default export of ${file} has type \\`${checker.typeToString(type)}\\`; the generated stateSchema will be open ({})`);\n }\n return { program, checker, sourceFile, type, location, warnings, open: false };\n}\n\n/**\n * A top-level spread of the state literal whose type does not list the keys it brings in — `any`, `unknown`, or an\n * index signature (`...sanitizeInputs({}).inputs` returning `Record<string, unknown>`). The compiler drops an\n * index signature from a spread, so the literal's type then lists only its own keys: a schema made from it would\n * call every key of the spread nonexistent (`wcs/path-nonexistent`, an error), where the validator knows nothing.\n * Found by an outside evaluation (a tax return draft whose 34 inputs come from such a spread).\n */\nfunction openSpread(checker: ts.TypeChecker, sourceFile: ts.SourceFile, location: ts.Expression): { text: string; line: number; type: string } | null {\n if (!ts.isObjectLiteralExpression(location)) return null;\n for (const property of location.properties) {\n if (!ts.isSpreadAssignment(property)) continue;\n const type = checker.getTypeAtLocation(property.expression);\n const open = (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0\n || (type.isUnion() ? type.types : [type]).some((t) => checker.getIndexInfosOfType(t).length > 0);\n if (!open) continue;\n return {\n text: property.getText(sourceFile),\n line: sourceFile.getLineAndCharacterOfPosition(property.getStart(sourceFile)).line + 1,\n type: checker.typeToString(type),\n };\n }\n return null;\n}\n","/**\n * typeToSchema.ts — TypeScript type → `stateSchema` (the JSON-Schema subset of\n * docs/wcstack-manifest-schema.md §4: type / properties / required / items /\n * enum / const / anyOf only).\n *\n * Rules (docs/app-testing-and-typescript-impl-plan.md §4-2-2):\n * - `$`-prefixed keys are dropped (runtime namespaces, never data paths).\n * - Members with call signatures (methods, function-valued properties) are dropped.\n * - Getters contribute their return type. Path getters (`get \"users.*.ageCategory\"()`)\n * are injected at the path they compute, so the validator sees them as members.\n * - Arrays → `items`; unions split `null` out into `anyOf`; literal unions → `enum`.\n * - Built-in / library object types (`Date`, `Map`, DOM types, …) become a **bare `{}`**\n * — never `{ \"type\": \"object\" }`: the validator treats a bare `{}` as *unknown*\n * (silent) and a typed object without the member as *nonexistent* (error).\n * - Nesting stops at `maxDepth` (default 5 = the validator's candidate budget) with a bare `{}`.\n * - An object type with an index signature (`{ [year: number]: Sale }`, `{ [key: string]: T }`) becomes a bare\n * `{}`: its keys are open, and the subset has no open-object form — a typed object would make every key\n * (`byYear.2024`) *nonexistent*.\n */\n\nimport ts from \"typescript\";\n\nexport interface JsonSchemaNode {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchemaNode[];\n}\n\nexport const DEFAULT_MAX_DEPTH = 5;\n\nexport interface SchemaOptions {\n /** Object nesting depth at which a bare `{}` is emitted instead of descending. Default 5. */\n readonly maxDepth?: number;\n}\n\ninterface Context {\n readonly checker: ts.TypeChecker;\n readonly program: ts.Program;\n readonly location: ts.Node;\n readonly maxDepth: number;\n /** Object types currently being expanded (recursion guard). */\n readonly stack: Set<ts.Type>;\n /** Path getters found on the root object, injected after the tree is built. */\n readonly pathGetters: Array<{ segments: string[]; type: ts.Type }>;\n}\n\n/**\n * Convert the type of a state object into a `stateSchema` node.\n */\nexport function stateTypeToSchema(\n checker: ts.TypeChecker,\n program: ts.Program,\n type: ts.Type,\n location: ts.Node,\n options: SchemaOptions = {},\n): JsonSchemaNode {\n const ctx: Context = {\n checker,\n program,\n location,\n maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,\n stack: new Set(),\n pathGetters: [],\n };\n const root = convertType(type, 0, ctx, true);\n for (const getter of ctx.pathGetters) {\n injectPath(root, getter.segments, convertType(getter.type, getter.segments.length, ctx, false));\n }\n return root;\n}\n\nfunction convertType(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n const flags = type.flags;\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Never | ts.TypeFlags.TypeParameter | ts.TypeFlags.NonPrimitive)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) return {};\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\", const: literalValue(type, ctx) };\n if (flags & ts.TypeFlags.StringLiteral) return { type: \"string\", const: (type as ts.StringLiteralType).value };\n if (flags & ts.TypeFlags.NumberLiteral) return { type: \"number\", const: (type as ts.NumberLiteralType).value };\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral | ts.TypeFlags.ESSymbolLike)) return {};\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (type.isUnion()) return convertUnion(type, depth, ctx);\n\n if (ctx.checker.isArrayType(type) || ctx.checker.isTupleType(type)) {\n return convertArray(type as ts.TypeReference, depth, ctx);\n }\n\n const callable = type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n if (callable && ctx.checker.getPropertiesOfType(type).length === 0) return {};\n\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n if (symbol !== undefined && isLibrarySymbol(symbol, ctx)) return {};\n\n return convertObject(type, depth, ctx, isRoot);\n}\n\nfunction convertUnion(type: ts.UnionType, depth: number, ctx: Context): JsonSchemaNode {\n const members = type.types.filter((t) => (t.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) === 0);\n const hasNull = members.some((t) => (t.flags & ts.TypeFlags.Null) !== 0);\n const nonNull = members.filter((t) => (t.flags & ts.TypeFlags.Null) === 0);\n\n let node: JsonSchemaNode;\n if (nonNull.length === 0) {\n return { type: \"null\" };\n } else if (nonNull.every((t) => (t.flags & ts.TypeFlags.BooleanLiteral) !== 0) && nonNull.length === 2) {\n node = { type: \"boolean\" };\n } else if (nonNull.every((t) => t.isLiteral() || (t.flags & ts.TypeFlags.BooleanLiteral) !== 0)) {\n const values = nonNull.map((t) => literalValue(t, ctx));\n const kinds = [...new Set(values.map((v) => typeof v))];\n node = kinds.length === 1 && (kinds[0] === \"string\" || kinds[0] === \"number\" || kinds[0] === \"boolean\")\n ? { type: kinds[0], enum: values }\n : { enum: values };\n } else if (nonNull.length === 1) {\n node = convertType(nonNull[0], depth, ctx, false);\n } else {\n const converted = dedupeNodes(nonNull.map((t) => convertType(t, depth, ctx, false)));\n node = converted.length === 1 ? converted[0] : { anyOf: converted };\n }\n\n if (!hasNull) return node;\n if (node.type === \"null\") return node;\n return node.anyOf !== undefined ? { anyOf: [...node.anyOf, { type: \"null\" }] } : { anyOf: [node, { type: \"null\" }] };\n}\n\nfunction convertArray(type: ts.TypeReference, depth: number, ctx: Context): JsonSchemaNode {\n const args = ctx.checker.getTypeArguments(type);\n if (args.length === 0) return { type: \"array\", items: {} };\n if (ctx.checker.isTupleType(type)) {\n const converted = dedupeNodes(args.map((t) => convertType(t, depth, ctx, false)));\n return { type: \"array\", items: converted.length === 1 ? converted[0] : { anyOf: converted } };\n }\n return { type: \"array\", items: convertType(args[0], depth, ctx, false) };\n}\n\nfunction convertObject(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n if (depth >= ctx.maxDepth) return {};\n if (ctx.stack.has(type)) return {};\n // Open keys (an index signature): unknown to the validator, not an object without members\n if (ctx.checker.getIndexInfosOfType(type).length > 0) return {};\n ctx.stack.add(type);\n try {\n const properties: Record<string, JsonSchemaNode> = {};\n const required: string[] = [];\n for (const prop of ctx.checker.getPropertiesOfType(type)) {\n const name = prop.getName();\n if (name.startsWith(\"$\")) continue;\n if (isMethodSymbol(prop)) continue;\n const propType = ctx.checker.getTypeOfSymbolAtLocation(prop, ctx.location);\n if (isFunctionValued(propType, ctx)) continue;\n if (isRoot && (name.includes(\".\") || name.includes(\"*\"))) {\n // A path getter declares a member at a nested position; inject it once the tree exists.\n ctx.pathGetters.push({ segments: name.split(\".\"), type: propType });\n continue;\n }\n properties[name] = convertType(propType, depth + 1, ctx, false);\n if (!isOptional(prop, propType)) required.push(name);\n }\n const node: JsonSchemaNode = { type: \"object\", properties };\n if (required.length > 0) node.required = required;\n return node;\n } finally {\n ctx.stack.delete(type);\n }\n}\n\n/** Walk `segments` (`*` = array items) into a definite object and add the leaf; unknown (`{}`) containers stay unknown. */\nfunction injectPath(root: JsonSchemaNode, segments: string[], leaf: JsonSchemaNode): void {\n const last = segments[segments.length - 1];\n if (last === \"*\" || last === \"\") return;\n let node: JsonSchemaNode | undefined = root;\n for (const segment of segments.slice(0, -1)) {\n node = segment === \"*\" ? node.items : descendObject(node)?.properties?.[segment];\n if (node === undefined) return;\n node = unwrapNullable(node);\n }\n const container = descendObject(node);\n if (container === undefined || container.properties === undefined) return;\n container.properties[last] = leaf;\n}\n\n/** For `anyOf: [object, null]` return the object member; otherwise the node itself. */\nfunction unwrapNullable(node: JsonSchemaNode): JsonSchemaNode {\n if (node.anyOf === undefined) return node;\n const objects = node.anyOf.filter((n) => n.properties !== undefined || n.items !== undefined);\n return objects.length === 1 ? objects[0] : node;\n}\n\nfunction descendObject(node: JsonSchemaNode | undefined): JsonSchemaNode | undefined {\n if (node === undefined) return undefined;\n const unwrapped = unwrapNullable(node);\n return unwrapped.properties !== undefined ? unwrapped : undefined;\n}\n\nfunction isMethodSymbol(symbol: ts.Symbol): boolean {\n if (symbol.flags & ts.SymbolFlags.Method) return true;\n return (symbol.declarations ?? []).some(\n (d) => ts.isMethodDeclaration(d) || ts.isMethodSignature(d) || ts.isFunctionDeclaration(d),\n );\n}\n\nfunction isFunctionValued(type: ts.Type, ctx: Context): boolean {\n const members = type.isUnion() ? type.types : [type];\n return members.some(\n (t) => t.getCallSignatures().length > 0 && ctx.checker.getPropertiesOfType(t).length === 0,\n );\n}\n\nfunction isOptional(symbol: ts.Symbol, type: ts.Type): boolean {\n if (symbol.flags & ts.SymbolFlags.Optional) return true;\n return type.isUnion() && type.types.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0);\n}\n\n/** Declared in a default lib (`lib.*.d.ts`) or under node_modules → opaque `{}` (Date, Map, DOM types, third-party classes). */\nfunction isLibrarySymbol(symbol: ts.Symbol, ctx: Context): boolean {\n const declarations = symbol.declarations ?? [];\n if (declarations.length === 0) return false;\n return declarations.every((d) => {\n const sf = d.getSourceFile();\n return ctx.program.isSourceFileDefaultLibrary(sf) || /[\\\\/]node_modules[\\\\/]/.test(sf.fileName);\n });\n}\n\nfunction literalValue(type: ts.Type, ctx: Context): unknown {\n if (type.flags & ts.TypeFlags.BooleanLiteral) return ctx.checker.typeToString(type) === \"true\";\n /* v8 ignore next 4 -- callers only pass literal types; the tail is the type-level fallback */\n if (type.isLiteral()) {\n const value = type.value;\n return typeof value === \"object\" ? Number(`${value.negative ? \"-\" : \"\"}${value.base10Value}`) : value;\n }\n return undefined;\n}\n\nfunction dedupeNodes(nodes: JsonSchemaNode[]): JsonSchemaNode[] {\n const seen = new Set<string>();\n const out: JsonSchemaNode[] = [];\n for (const n of nodes) {\n const key = JSON.stringify(n);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(n);\n }\n return out;\n}\n","/**\n * generate.ts — one call from a state file to its `stateSchema`.\n */\n\nimport { loadStateFile, type LoadStateOptions } from \"./program.js\";\nimport { stateTypeToSchema, type JsonSchemaNode, type SchemaOptions } from \"./typeToSchema.js\";\n\nexport interface GenerateOptions extends LoadStateOptions, SchemaOptions {}\n\nexport interface GeneratedSchema {\n readonly schema: JsonSchemaNode;\n /** Non-fatal notes (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n}\n\nexport function generateStateSchema(file: string, options: GenerateOptions = {}): GeneratedSchema {\n const loaded = loadStateFile(file, options);\n const schema = loaded.open ? {} : stateTypeToSchema(loaded.checker, loaded.program, loaded.type, loaded.location, options);\n return { schema, warnings: loaded.warnings };\n}\n","/**\n * manifest.ts — build / merge / compare the `application` sidecar artifact.\n *\n * The manifest is a **derived artifact** (D9): the TypeScript type is the source\n * of truth, `wcs-schema emit` writes the manifest, and `wcs-schema check`\n * detects drift between the two in CI.\n *\n * v2 (schemaVersion 2): the application namespace carries a **single**\n * `stateSchema` — one state tree per root, no name dimension\n * (docs/state-mount-design.md D15). A volume (`<wcs-state mount=\"path\">`)\n * contributes a **subtree**: `--mount=<path>` merges the module's schema under\n * that path inside the single `stateSchema`. `--merge` keeps everything else in\n * an existing manifest (filters, listContexts); a hand-written schema for the\n * same slot does not survive, by design: there is no implicit merge in the\n * sidecar spec (§5).\n */\n\nimport type { JsonSchemaNode } from \"./typeToSchema.js\";\n\nexport const APPLICATION_MANIFEST_FILENAME = \"wcstack.manifest.json\";\nexport const SCHEMA_VERSION = 2;\nexport const APPLICATION_NAMESPACE = \"wcstack.application\";\n\nexport interface ApplicationManifest {\n schemaVersion: number;\n kind: \"application\";\n manifestExtensions: {\n [APPLICATION_NAMESPACE]: {\n version: number;\n stateSchema?: JsonSchemaNode;\n [key: string]: unknown;\n };\n [namespace: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/**\n * Create the manifest object for the state tree, or graft into `existing`\n * (a parsed manifest object; envelope fields are normalized to v2 — a v1\n * manifest's `states` map does not survive, its replacement is exactly this\n * regeneration path).\n *\n * `mountPath === null` replaces the whole `stateSchema`; a mount path merges\n * the schema as a subtree at that path (intermediate object nodes are created).\n */\nexport function buildManifest(mountPath: string | null, schema: JsonSchemaNode, existing?: unknown): ApplicationManifest {\n const base: Record<string, unknown> =\n existing !== null && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n base.schemaVersion = SCHEMA_VERSION;\n base.kind = \"application\";\n const extensions =\n base.manifestExtensions !== null && typeof base.manifestExtensions === \"object\" && !Array.isArray(base.manifestExtensions)\n ? { ...(base.manifestExtensions as Record<string, unknown>) }\n : {};\n const nsRaw = extensions[APPLICATION_NAMESPACE];\n const ns: Record<string, unknown> =\n nsRaw !== null && typeof nsRaw === \"object\" && !Array.isArray(nsRaw) ? { ...(nsRaw as Record<string, unknown>) } : {};\n ns.version = SCHEMA_VERSION;\n // v1 leftovers: the name dimension is gone; regeneration does not carry it\n delete ns.states;\n if (mountPath === null) {\n ns.stateSchema = schema;\n } else {\n const rootRaw = ns.stateSchema;\n const root: Record<string, unknown> =\n rootRaw !== null && typeof rootRaw === \"object\" && !Array.isArray(rootRaw)\n ? { ...(rootRaw as Record<string, unknown>) }\n : { type: \"object\" };\n let node = root;\n const segments = mountPath.split(\".\");\n for (let i = 0; i < segments.length; i++) {\n const properties =\n node.properties !== null && typeof node.properties === \"object\" && !Array.isArray(node.properties)\n ? { ...(node.properties as Record<string, unknown>) }\n : {};\n node.properties = properties;\n if (i === segments.length - 1) {\n properties[segments[i]] = schema;\n break;\n }\n const childRaw = properties[segments[i]];\n const child: Record<string, unknown> =\n childRaw !== null && typeof childRaw === \"object\" && !Array.isArray(childRaw)\n ? { ...(childRaw as Record<string, unknown>) }\n : { type: \"object\" };\n properties[segments[i]] = child;\n node = child;\n }\n ns.stateSchema = root as unknown as JsonSchemaNode;\n }\n extensions[APPLICATION_NAMESPACE] = ns;\n base.manifestExtensions = extensions;\n return base as unknown as ApplicationManifest;\n}\n\n/** Read the single `stateSchema` from a parsed manifest object, or undefined. */\nexport function readStateSchema(manifest: unknown): unknown {\n if (manifest === null || typeof manifest !== \"object\") return undefined;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return undefined;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return undefined;\n return (ns as Record<string, unknown>).stateSchema;\n}\n\n/**\n * True for a v1-shaped manifest (`schemaVersion: 1` or a `states` map in the\n * application namespace). `check` uses it to point at the regeneration path\n * instead of reporting a confusing \"missing stateSchema\".\n */\nexport function isV1Manifest(manifest: unknown): boolean {\n if (manifest === null || typeof manifest !== \"object\") return false;\n if ((manifest as Record<string, unknown>).schemaVersion === 1) return true;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return false;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return false;\n return (ns as Record<string, unknown>).states !== undefined;\n}\n\n/** Navigate `properties` by mount-path segments; undefined when the subtree is absent. */\nfunction subtreeAt(schema: unknown, mountPath: string): unknown {\n let node: unknown = schema;\n for (const segment of mountPath.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n const properties = (node as Record<string, unknown>).properties;\n if (properties === null || typeof properties !== \"object\") return undefined;\n node = (properties as Record<string, unknown>)[segment];\n }\n return node;\n}\n\n/** JSON with object keys sorted at every level — the canonical form used for comparison. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n out[key] = sortKeys((value as Record<string, unknown>)[key]);\n }\n return out;\n }\n return value;\n}\n\nexport type SchemaComparison =\n | { readonly kind: \"same\" }\n | { readonly kind: \"differs\"; readonly changes: readonly string[] }\n | { readonly kind: \"missing-state\" }\n | { readonly kind: \"v1-manifest\" }\n | { readonly kind: \"broken\"; readonly message: string };\n\n/**\n * Compare the schema generated from the type with the one stored in `manifestText`\n * (the whole tree, or the subtree at `mountPath`).\n * `changes` lists JSON pointers: `+ ptr` (only in generated), `- ptr` (only in\n * manifest), `~ ptr` (both, different value).\n */\nexport function compareStateSchema(manifestText: string, mountPath: string | null, generated: JsonSchemaNode): SchemaComparison {\n let parsed: unknown;\n try {\n parsed = JSON.parse(manifestText);\n } catch (e) {\n return { kind: \"broken\", message: (e as Error).message };\n }\n if (isV1Manifest(parsed)) return { kind: \"v1-manifest\" };\n let stored = readStateSchema(parsed);\n if (stored !== undefined && mountPath !== null) {\n stored = subtreeAt(stored, mountPath);\n }\n if (stored === undefined) return { kind: \"missing-state\" };\n if (stableStringify(stored) === stableStringify(generated)) return { kind: \"same\" };\n\n const a = flatten(generated);\n const b = flatten(stored);\n const changes: string[] = [];\n for (const key of [...new Set([...a.keys(), ...b.keys()])].sort()) {\n const inA = a.has(key);\n const inB = b.has(key);\n if (inA && !inB) changes.push(`+ ${key}`);\n else if (!inA && inB) changes.push(`- ${key}`);\n else if (a.get(key) !== b.get(key)) changes.push(`~ ${key}`);\n }\n return { kind: \"differs\", changes };\n}\n\n/** Leaf pointer → canonical JSON. Objects with children are not listed themselves; empty objects/arrays are leaves. */\nfunction flatten(value: unknown, pointer: string = \"\", out: Map<string, string> = new Map()): Map<string, string> {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const entries = Object.entries(value as Record<string, unknown>);\n if (entries.length === 0) {\n out.set(pointer || \"/\", \"{}\");\n return out;\n }\n for (const [key, child] of entries) {\n flatten(child, `${pointer}/${key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, out);\n }\n return out;\n }\n out.set(pointer || \"/\", stableStringify(value));\n return out;\n}\n","/**\n * schemaCore.ts — the validator core bundle (`dist/schema-core.cjs`, built from\n * packages/vscode-wcs by scripts/build-schema-core.mjs), loaded lazily.\n *\n * The bundle is a self-contained CJS file that requires neither `typescript` nor\n * `vscode`; it is located relative to the running module so the same loader\n * works from `dist/index.esm.js`, `dist/wcs-schema.mjs`, and the TypeScript\n * sources under vitest (`src/…` → `../dist`).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface WcsDiagnostic {\n readonly code: string;\n readonly start: number;\n readonly end: number;\n readonly message: string;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface SchemaCore {\n validateManifestArtifact(artifact: { text: string; source: string }): WcsDiagnostic[];\n validateDocument(\n text: string,\n options?: {\n bindAttribute?: string;\n stateTagName?: string;\n locale?: string;\n fileReader?: (relativePath: string) => string | undefined;\n applicationStates?: ReadonlyMap<string, unknown>;\n },\n ): WcsDiagnostic[];\n ALLOWED_SCHEMA_KEYWORDS: ReadonlySet<string>;\n WcsDiagnosticCode: Readonly<Record<string, string>>;\n}\n\nconst BUNDLE = \"schema-core.cjs\";\n\n/** Candidate locations, nearest first: dist/ (built), ../dist (src/), ../../dist (src/cli/). */\nexport function schemaCoreCandidates(fromUrl: string = import.meta.url): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, BUNDLE), join(here, \"..\", \"dist\", BUNDLE), join(here, \"..\", \"..\", \"dist\", BUNDLE)];\n}\n\nlet cached: SchemaCore | undefined;\n\nexport function loadSchemaCore(): SchemaCore {\n if (cached !== undefined) return cached;\n const candidates = schemaCoreCandidates();\n const found = candidates.find((p) => existsSync(p));\n /* v8 ignore next 5 -- tests run after `npm run build`, so the bundle is always present */\n if (found === undefined) {\n throw new Error(\n `${BUNDLE} not found — run \\`npm run build\\` in packages/typescript (looked in: ${candidates.join(\", \")})`,\n );\n }\n cached = createRequire(import.meta.url)(found) as SchemaCore;\n return cached;\n}\n","import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/typescriptSupport.ts","../../src/program.ts","../../src/typeToSchema.ts","../../src/generate.ts","../../src/manifest.ts","../../src/schemaCore.ts","../../src/version.ts"],"sourcesContent":["/**\n * typescriptSupport.ts — which `typescript` this package can run on.\n *\n * Both commands drive the JavaScript compiler API of TypeScript 5 and 6:\n * `wcs-schema` through `import ts from \"typescript\"`, `wcs-tsc` by running the\n * project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the\n * native compiler) publishes neither — its `typescript` export is\n * `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both\n * refuse it by name instead of failing on what is missing. TypeScript 7 reads other\n * file types through content mappers (7.1); this package does not provide one yet.\n */\n\n/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */\nexport function unsupportedTypeScript(version: string | undefined): string | undefined {\n return Number.parseInt(version ?? \"\", 10) >= 7 ? version : undefined;\n}\n\n/** The refusal both commands report (exit code 2), without a trailing newline. */\nexport function unsupportedTypeScriptMessage(version: string): string {\n return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;\n}\n","/**\n * program.ts — open a state file with the TypeScript compiler API and locate the\n * type of its `export default`.\n *\n * `defineState(x)` is an identity function, so the exported type is `x`'s type —\n * but the call is unwrapped syntactically anyway: when `@wcstack/state` is not\n * resolvable from the state file (a CDN-only page, a fixture in a temp dir), the\n * call expression would type as `any` and every path would be lost, while the\n * argument literal still carries the full object type.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport ts from \"typescript\";\nimport { unsupportedTypeScript, unsupportedTypeScriptMessage } from \"./typescriptSupport.js\";\n\nexport interface LoadStateOptions {\n /** Explicit tsconfig.json path. Default: the nearest tsconfig.json above the state file, else built-in defaults. */\n readonly tsconfig?: string;\n}\n\nexport interface LoadedState {\n readonly program: ts.Program;\n readonly checker: ts.TypeChecker;\n readonly sourceFile: ts.SourceFile;\n /** The type of the default export (the `defineState(...)` argument when wrapped). */\n readonly type: ts.Type;\n /** Node to use as the location for `getTypeOfSymbolAtLocation`. */\n readonly location: ts.Node;\n /** Non-fatal notes for the caller (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n /** A top-level spread brings in keys its type does not list: the state's schema is open (`{}`), whatever `type` says. */\n readonly open: boolean;\n}\n\n/**\n * Defaults used when no tsconfig.json is found — enough to type a plain state file.\n * The enums are read with `?.` so that this module still loads under TypeScript 7,\n * whose `typescript` has none: `loadStateFile` then refuses that compiler by name.\n */\nexport const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget?.ESNext,\n module: ts.ModuleKind?.ESNext,\n moduleResolution: ts.ModuleResolutionKind?.Bundler,\n lib: [\"lib.esnext.d.ts\", \"lib.dom.d.ts\", \"lib.dom.iterable.d.ts\"],\n strict: true,\n};\n\n/** The compiler API compares paths it attaches diagnostics to against `/`-separated ones; feed it those on Windows too. */\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nexport function resolveCompilerOptions(stateFile: string, options: LoadStateOptions = {}): ts.CompilerOptions {\n const configPath = options.tsconfig !== undefined\n ? toPosix(resolve(options.tsconfig))\n : ts.findConfigFile(toPosix(dirname(stateFile)), ts.sys.fileExists, \"tsconfig.json\");\n let base: ts.CompilerOptions = { ...DEFAULT_COMPILER_OPTIONS };\n if (configPath !== undefined) {\n let parsedOptions: ts.CompilerOptions;\n try {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n if (read.error !== undefined) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n }\n parsedOptions = ts.parseJsonConfigFileContent(read.config, ts.sys, toPosix(dirname(configPath)), undefined, configPath).options;\n } catch (e) {\n throw new Error(`cannot read ${configPath}: ${(e as Error).message}`);\n }\n base = { ...DEFAULT_COMPILER_OPTIONS, ...parsedOptions };\n }\n return {\n ...base,\n // The generator only reads types: never write, always accept JS (JSDoc types), keep it fast.\n noEmit: true,\n allowJs: true,\n checkJs: true,\n skipLibCheck: true,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n };\n}\n\n/** Unwrap `defineState(x)` (any callee whose last identifier is `defineState`) and `satisfies` / `as`-free wrappers. */\nfunction stateExpression(expression: ts.Expression): ts.Expression {\n let current = expression;\n while (ts.isParenthesizedExpression(current)) current = current.expression;\n if (ts.isCallExpression(current) && current.arguments.length > 0) {\n const callee = current.expression;\n const name = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : undefined;\n if (name === \"defineState\") return current.arguments[0];\n }\n return current;\n}\n\nexport function loadStateFile(file: string, options: LoadStateOptions = {}): LoadedState {\n const unsupported = unsupportedTypeScript(ts.version);\n if (unsupported !== undefined) throw new Error(unsupportedTypeScriptMessage(unsupported));\n const abs = resolve(file);\n if (!existsSync(abs)) throw new Error(`cannot read ${file}: no such file`);\n // Read up front so an unreadable file fails with a plain message, not a compiler internals one.\n readFileSync(abs, \"utf8\");\n\n const compilerOptions = resolveCompilerOptions(abs, options);\n const program = ts.createProgram([abs], compilerOptions);\n const sourceFile = program.getSourceFile(abs);\n /* v8 ignore next -- the file exists and is a root name; the compiler always returns it */\n if (sourceFile === undefined) throw new Error(`cannot open ${file} as a TypeScript/JavaScript source`);\n\n const syntax = program.getSyntacticDiagnostics(sourceFile);\n if (syntax.length > 0) {\n const lines = syntax.map((d) => {\n // Syntactic diagnostics always carry their file and position; the fallback is type-level only.\n /* v8 ignore next 2 */\n const pos = d.file !== undefined && d.start !== undefined ? d.file.getLineAndCharacterOfPosition(d.start) : undefined;\n const where = pos !== undefined ? `${file}:${pos.line + 1}:${pos.character + 1}` : file;\n return `${where} ${ts.flattenDiagnosticMessageText(d.messageText, \"\\n\")}`;\n });\n throw new Error(`syntax error(s) in ${file}:\\n${lines.join(\"\\n\")}`);\n }\n\n const exportAssignment = sourceFile.statements.find(\n (s): s is ts.ExportAssignment => ts.isExportAssignment(s) && !s.isExportEquals,\n );\n if (exportAssignment === undefined) {\n throw new Error(`${file} has no \\`export default\\` — a wcstack state file exports its state object as the default export`);\n }\n\n const location = stateExpression(exportAssignment.expression);\n const checker = program.getTypeChecker();\n const warnings: string[] = [];\n // A spread whose type does not list its keys first: the type of the whole literal is not needed then (and is the\n // expensive one, below)\n const spread = openSpread(checker, sourceFile, location);\n if (spread !== null) {\n warnings.push(`the spread \\`${spread.text}\\` (${file}:${spread.line}) brings in keys its type does not list (\\`${spread.type}\\`); the generated stateSchema will be open ({}). Give that expression a type that lists them (a JSDoc @returns or @type)`);\n return { program, checker, sourceFile, type: checker.getAnyType(), location, warnings, open: true };\n }\n let type: ts.Type;\n try {\n type = checker.getTypeAtLocation(location);\n } catch (e) {\n /* v8 ignore next 2 -- the checker's own overflow, exercised against the built dist (stack.test.ts) */\n if (!(e instanceof RangeError)) throw e;\n throw new Error(`the TypeScript checker ran out of stack on ${file}: an \\`export default { … }\\` with a top-level spread makes it recurse once per getter that reads \\`this\\`. The wcs-schema command runs on a larger stack; from the API, call generateStateSchema() on a worker with a larger resourceLimits.stackSizeMb`);\n }\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n warnings.push(`the default export of ${file} has type \\`${checker.typeToString(type)}\\`; the generated stateSchema will be open ({})`);\n }\n return { program, checker, sourceFile, type, location, warnings, open: false };\n}\n\n/**\n * A top-level spread of the state literal whose type does not list the keys it brings in — `any`, `unknown`, or an\n * index signature (`...sanitizeInputs({}).inputs` returning `Record<string, unknown>`). The compiler drops an\n * index signature from a spread, so the literal's type then lists only its own keys: a schema made from it would\n * call every key of the spread nonexistent (`wcs/path-nonexistent`, an error), where the validator knows nothing.\n * Found by an outside evaluation (a tax return draft whose 34 inputs come from such a spread).\n */\nfunction openSpread(checker: ts.TypeChecker, sourceFile: ts.SourceFile, location: ts.Expression): { text: string; line: number; type: string } | null {\n if (!ts.isObjectLiteralExpression(location)) return null;\n for (const property of location.properties) {\n if (!ts.isSpreadAssignment(property)) continue;\n const type = checker.getTypeAtLocation(property.expression);\n const open = (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0\n || (type.isUnion() ? type.types : [type]).some((t) => checker.getIndexInfosOfType(t).length > 0);\n if (!open) continue;\n return {\n text: property.getText(sourceFile),\n line: sourceFile.getLineAndCharacterOfPosition(property.getStart(sourceFile)).line + 1,\n type: checker.typeToString(type),\n };\n }\n return null;\n}\n","/**\n * typeToSchema.ts — TypeScript type → `stateSchema` (the JSON-Schema subset of\n * docs/wcstack-manifest-schema.md §4: type / properties / required / items /\n * enum / const / anyOf only).\n *\n * Rules (docs/app-testing-and-typescript-impl-plan.md §4-2-2):\n * - `$`-prefixed keys are dropped (runtime namespaces, never data paths).\n * - Members with call signatures (methods, function-valued properties) are dropped.\n * - Getters contribute their return type. Path getters (`get \"users.*.ageCategory\"()`)\n * are injected at the path they compute, so the validator sees them as members.\n * - Arrays → `items`; unions split `null` out into `anyOf`; literal unions → `enum`.\n * - Built-in / library object types (`Date`, `Map`, DOM types, …) become a **bare `{}`**\n * — never `{ \"type\": \"object\" }`: the validator treats a bare `{}` as *unknown*\n * (silent) and a typed object without the member as *nonexistent* (error).\n * - Nesting stops at `maxDepth` (default 5 = the validator's candidate budget) with a bare `{}`.\n * - An object type with an index signature (`{ [year: number]: Sale }`, `{ [key: string]: T }`) becomes a bare\n * `{}`: its keys are open, and the subset has no open-object form — a typed object would make every key\n * (`byYear.2024`) *nonexistent*.\n */\n\nimport ts from \"typescript\";\n\nexport interface JsonSchemaNode {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchemaNode[];\n}\n\nexport const DEFAULT_MAX_DEPTH = 5;\n\nexport interface SchemaOptions {\n /** Object nesting depth at which a bare `{}` is emitted instead of descending. Default 5. */\n readonly maxDepth?: number;\n}\n\ninterface Context {\n readonly checker: ts.TypeChecker;\n readonly program: ts.Program;\n readonly location: ts.Node;\n readonly maxDepth: number;\n /** Object types currently being expanded (recursion guard). */\n readonly stack: Set<ts.Type>;\n /** Path getters found on the root object, injected after the tree is built. */\n readonly pathGetters: Array<{ segments: string[]; type: ts.Type }>;\n}\n\n/**\n * Convert the type of a state object into a `stateSchema` node.\n */\nexport function stateTypeToSchema(\n checker: ts.TypeChecker,\n program: ts.Program,\n type: ts.Type,\n location: ts.Node,\n options: SchemaOptions = {},\n): JsonSchemaNode {\n const ctx: Context = {\n checker,\n program,\n location,\n maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,\n stack: new Set(),\n pathGetters: [],\n };\n const root = convertType(type, 0, ctx, true);\n for (const getter of ctx.pathGetters) {\n injectPath(root, getter.segments, convertType(getter.type, getter.segments.length, ctx, false));\n }\n return root;\n}\n\nfunction convertType(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n const flags = type.flags;\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Never | ts.TypeFlags.TypeParameter | ts.TypeFlags.NonPrimitive)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) return {};\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\", const: literalValue(type, ctx) };\n if (flags & ts.TypeFlags.StringLiteral) return { type: \"string\", const: (type as ts.StringLiteralType).value };\n if (flags & ts.TypeFlags.NumberLiteral) return { type: \"number\", const: (type as ts.NumberLiteralType).value };\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral | ts.TypeFlags.ESSymbolLike)) return {};\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (type.isUnion()) return convertUnion(type, depth, ctx);\n\n if (ctx.checker.isArrayType(type) || ctx.checker.isTupleType(type)) {\n return convertArray(type as ts.TypeReference, depth, ctx);\n }\n\n const callable = type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n if (callable && ctx.checker.getPropertiesOfType(type).length === 0) return {};\n\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n if (symbol !== undefined && isLibrarySymbol(symbol, ctx)) return {};\n\n return convertObject(type, depth, ctx, isRoot);\n}\n\nfunction convertUnion(type: ts.UnionType, depth: number, ctx: Context): JsonSchemaNode {\n const members = type.types.filter((t) => (t.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) === 0);\n const hasNull = members.some((t) => (t.flags & ts.TypeFlags.Null) !== 0);\n const nonNull = members.filter((t) => (t.flags & ts.TypeFlags.Null) === 0);\n\n let node: JsonSchemaNode;\n if (nonNull.length === 0) {\n return { type: \"null\" };\n } else if (nonNull.every((t) => (t.flags & ts.TypeFlags.BooleanLiteral) !== 0) && nonNull.length === 2) {\n node = { type: \"boolean\" };\n } else if (nonNull.every((t) => t.isLiteral() || (t.flags & ts.TypeFlags.BooleanLiteral) !== 0)) {\n const values = nonNull.map((t) => literalValue(t, ctx));\n const kinds = [...new Set(values.map((v) => typeof v))];\n node = kinds.length === 1 && (kinds[0] === \"string\" || kinds[0] === \"number\" || kinds[0] === \"boolean\")\n ? { type: kinds[0], enum: values }\n : { enum: values };\n } else if (nonNull.length === 1) {\n node = convertType(nonNull[0], depth, ctx, false);\n } else {\n const converted = dedupeNodes(nonNull.map((t) => convertType(t, depth, ctx, false)));\n node = converted.length === 1 ? converted[0] : { anyOf: converted };\n }\n\n if (!hasNull) return node;\n if (node.type === \"null\") return node;\n return node.anyOf !== undefined ? { anyOf: [...node.anyOf, { type: \"null\" }] } : { anyOf: [node, { type: \"null\" }] };\n}\n\nfunction convertArray(type: ts.TypeReference, depth: number, ctx: Context): JsonSchemaNode {\n const args = ctx.checker.getTypeArguments(type);\n if (args.length === 0) return { type: \"array\", items: {} };\n if (ctx.checker.isTupleType(type)) {\n const converted = dedupeNodes(args.map((t) => convertType(t, depth, ctx, false)));\n return { type: \"array\", items: converted.length === 1 ? converted[0] : { anyOf: converted } };\n }\n return { type: \"array\", items: convertType(args[0], depth, ctx, false) };\n}\n\nfunction convertObject(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n if (depth >= ctx.maxDepth) return {};\n if (ctx.stack.has(type)) return {};\n // Open keys (an index signature): unknown to the validator, not an object without members\n if (ctx.checker.getIndexInfosOfType(type).length > 0) return {};\n ctx.stack.add(type);\n try {\n const properties: Record<string, JsonSchemaNode> = {};\n const required: string[] = [];\n for (const prop of ctx.checker.getPropertiesOfType(type)) {\n const name = prop.getName();\n if (name.startsWith(\"$\")) continue;\n if (isMethodSymbol(prop)) continue;\n const propType = ctx.checker.getTypeOfSymbolAtLocation(prop, ctx.location);\n if (isFunctionValued(propType, ctx)) continue;\n if (isRoot && (name.includes(\".\") || name.includes(\"*\"))) {\n // A path getter declares a member at a nested position; inject it once the tree exists.\n ctx.pathGetters.push({ segments: name.split(\".\"), type: propType });\n continue;\n }\n properties[name] = convertType(propType, depth + 1, ctx, false);\n if (!isOptional(prop, propType)) required.push(name);\n }\n const node: JsonSchemaNode = { type: \"object\", properties };\n if (required.length > 0) node.required = required;\n return node;\n } finally {\n ctx.stack.delete(type);\n }\n}\n\n/** Walk `segments` (`*` = array items) into a definite object and add the leaf; unknown (`{}`) containers stay unknown. */\nfunction injectPath(root: JsonSchemaNode, segments: string[], leaf: JsonSchemaNode): void {\n const last = segments[segments.length - 1];\n if (last === \"*\" || last === \"\") return;\n let node: JsonSchemaNode | undefined = root;\n for (const segment of segments.slice(0, -1)) {\n node = segment === \"*\" ? node.items : descendObject(node)?.properties?.[segment];\n if (node === undefined) return;\n node = unwrapNullable(node);\n }\n const container = descendObject(node);\n if (container === undefined || container.properties === undefined) return;\n container.properties[last] = leaf;\n}\n\n/** For `anyOf: [object, null]` return the object member; otherwise the node itself. */\nfunction unwrapNullable(node: JsonSchemaNode): JsonSchemaNode {\n if (node.anyOf === undefined) return node;\n const objects = node.anyOf.filter((n) => n.properties !== undefined || n.items !== undefined);\n return objects.length === 1 ? objects[0] : node;\n}\n\nfunction descendObject(node: JsonSchemaNode | undefined): JsonSchemaNode | undefined {\n if (node === undefined) return undefined;\n const unwrapped = unwrapNullable(node);\n return unwrapped.properties !== undefined ? unwrapped : undefined;\n}\n\nfunction isMethodSymbol(symbol: ts.Symbol): boolean {\n if (symbol.flags & ts.SymbolFlags.Method) return true;\n return (symbol.declarations ?? []).some(\n (d) => ts.isMethodDeclaration(d) || ts.isMethodSignature(d) || ts.isFunctionDeclaration(d),\n );\n}\n\nfunction isFunctionValued(type: ts.Type, ctx: Context): boolean {\n const members = type.isUnion() ? type.types : [type];\n return members.some(\n (t) => t.getCallSignatures().length > 0 && ctx.checker.getPropertiesOfType(t).length === 0,\n );\n}\n\nfunction isOptional(symbol: ts.Symbol, type: ts.Type): boolean {\n if (symbol.flags & ts.SymbolFlags.Optional) return true;\n return type.isUnion() && type.types.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0);\n}\n\n/** Declared in a default lib (`lib.*.d.ts`) or under node_modules → opaque `{}` (Date, Map, DOM types, third-party classes). */\nfunction isLibrarySymbol(symbol: ts.Symbol, ctx: Context): boolean {\n const declarations = symbol.declarations ?? [];\n if (declarations.length === 0) return false;\n return declarations.every((d) => {\n const sf = d.getSourceFile();\n return ctx.program.isSourceFileDefaultLibrary(sf) || /[\\\\/]node_modules[\\\\/]/.test(sf.fileName);\n });\n}\n\nfunction literalValue(type: ts.Type, ctx: Context): unknown {\n if (type.flags & ts.TypeFlags.BooleanLiteral) return ctx.checker.typeToString(type) === \"true\";\n /* v8 ignore next 4 -- callers only pass literal types; the tail is the type-level fallback */\n if (type.isLiteral()) {\n const value = type.value;\n return typeof value === \"object\" ? Number(`${value.negative ? \"-\" : \"\"}${value.base10Value}`) : value;\n }\n return undefined;\n}\n\nfunction dedupeNodes(nodes: JsonSchemaNode[]): JsonSchemaNode[] {\n const seen = new Set<string>();\n const out: JsonSchemaNode[] = [];\n for (const n of nodes) {\n const key = JSON.stringify(n);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(n);\n }\n return out;\n}\n","/**\n * generate.ts — one call from a state file to its `stateSchema`.\n */\n\nimport { loadStateFile, type LoadStateOptions } from \"./program.js\";\nimport { stateTypeToSchema, type JsonSchemaNode, type SchemaOptions } from \"./typeToSchema.js\";\n\nexport interface GenerateOptions extends LoadStateOptions, SchemaOptions {}\n\nexport interface GeneratedSchema {\n readonly schema: JsonSchemaNode;\n /** Non-fatal notes (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n}\n\nexport function generateStateSchema(file: string, options: GenerateOptions = {}): GeneratedSchema {\n const loaded = loadStateFile(file, options);\n const schema = loaded.open ? {} : stateTypeToSchema(loaded.checker, loaded.program, loaded.type, loaded.location, options);\n return { schema, warnings: loaded.warnings };\n}\n","/**\n * manifest.ts — build / merge / compare the `application` sidecar artifact.\n *\n * The manifest is a **derived artifact** (D9): the TypeScript type is the source\n * of truth, `wcs-schema emit` writes the manifest, and `wcs-schema check`\n * detects drift between the two in CI.\n *\n * v2 (schemaVersion 2): the application namespace carries a **single**\n * `stateSchema` — one state tree per root, no name dimension\n * (docs/state-mount-design.md D15). A volume (`<wcs-state mount=\"path\">`)\n * contributes a **subtree**: `--mount=<path>` merges the module's schema under\n * that path inside the single `stateSchema`. `--merge` keeps everything else in\n * an existing manifest (filters, listContexts); a hand-written schema for the\n * same slot does not survive, by design: there is no implicit merge in the\n * sidecar spec (§5).\n */\n\nimport type { JsonSchemaNode } from \"./typeToSchema.js\";\n\nexport const APPLICATION_MANIFEST_FILENAME = \"wcstack.manifest.json\";\nexport const SCHEMA_VERSION = 2;\nexport const APPLICATION_NAMESPACE = \"wcstack.application\";\n\nexport interface ApplicationManifest {\n schemaVersion: number;\n kind: \"application\";\n manifestExtensions: {\n [APPLICATION_NAMESPACE]: {\n version: number;\n stateSchema?: JsonSchemaNode;\n [key: string]: unknown;\n };\n [namespace: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/**\n * Create the manifest object for the state tree, or graft into `existing`\n * (a parsed manifest object; envelope fields are normalized to v2 — a v1\n * manifest's `states` map does not survive, its replacement is exactly this\n * regeneration path).\n *\n * `mountPath === null` replaces the whole `stateSchema`; a mount path merges\n * the schema as a subtree at that path (intermediate object nodes are created).\n */\nexport function buildManifest(mountPath: string | null, schema: JsonSchemaNode, existing?: unknown): ApplicationManifest {\n const base: Record<string, unknown> =\n existing !== null && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n base.schemaVersion = SCHEMA_VERSION;\n base.kind = \"application\";\n const extensions =\n base.manifestExtensions !== null && typeof base.manifestExtensions === \"object\" && !Array.isArray(base.manifestExtensions)\n ? { ...(base.manifestExtensions as Record<string, unknown>) }\n : {};\n const nsRaw = extensions[APPLICATION_NAMESPACE];\n const ns: Record<string, unknown> =\n nsRaw !== null && typeof nsRaw === \"object\" && !Array.isArray(nsRaw) ? { ...(nsRaw as Record<string, unknown>) } : {};\n ns.version = SCHEMA_VERSION;\n // v1 leftovers: the name dimension is gone; regeneration does not carry it\n delete ns.states;\n if (mountPath === null) {\n ns.stateSchema = schema;\n } else {\n const rootRaw = ns.stateSchema;\n const root: Record<string, unknown> =\n rootRaw !== null && typeof rootRaw === \"object\" && !Array.isArray(rootRaw)\n ? { ...(rootRaw as Record<string, unknown>) }\n : { type: \"object\" };\n let node = root;\n const segments = mountPath.split(\".\");\n for (let i = 0; i < segments.length; i++) {\n const properties =\n node.properties !== null && typeof node.properties === \"object\" && !Array.isArray(node.properties)\n ? { ...(node.properties as Record<string, unknown>) }\n : {};\n node.properties = properties;\n if (i === segments.length - 1) {\n properties[segments[i]] = schema;\n break;\n }\n const childRaw = properties[segments[i]];\n const child: Record<string, unknown> =\n childRaw !== null && typeof childRaw === \"object\" && !Array.isArray(childRaw)\n ? { ...(childRaw as Record<string, unknown>) }\n : { type: \"object\" };\n properties[segments[i]] = child;\n node = child;\n }\n ns.stateSchema = root as unknown as JsonSchemaNode;\n }\n extensions[APPLICATION_NAMESPACE] = ns;\n base.manifestExtensions = extensions;\n return base as unknown as ApplicationManifest;\n}\n\n/** Read the single `stateSchema` from a parsed manifest object, or undefined. */\nexport function readStateSchema(manifest: unknown): unknown {\n if (manifest === null || typeof manifest !== \"object\") return undefined;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return undefined;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return undefined;\n return (ns as Record<string, unknown>).stateSchema;\n}\n\n/**\n * True for a v1-shaped manifest (`schemaVersion: 1` or a `states` map in the\n * application namespace). `check` uses it to point at the regeneration path\n * instead of reporting a confusing \"missing stateSchema\".\n */\nexport function isV1Manifest(manifest: unknown): boolean {\n if (manifest === null || typeof manifest !== \"object\") return false;\n if ((manifest as Record<string, unknown>).schemaVersion === 1) return true;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return false;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return false;\n return (ns as Record<string, unknown>).states !== undefined;\n}\n\n/** Navigate `properties` by mount-path segments; undefined when the subtree is absent. */\nfunction subtreeAt(schema: unknown, mountPath: string): unknown {\n let node: unknown = schema;\n for (const segment of mountPath.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n const properties = (node as Record<string, unknown>).properties;\n if (properties === null || typeof properties !== \"object\") return undefined;\n node = (properties as Record<string, unknown>)[segment];\n }\n return node;\n}\n\n/** JSON with object keys sorted at every level — the canonical form used for comparison. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n out[key] = sortKeys((value as Record<string, unknown>)[key]);\n }\n return out;\n }\n return value;\n}\n\nexport type SchemaComparison =\n | { readonly kind: \"same\" }\n | { readonly kind: \"differs\"; readonly changes: readonly string[] }\n | { readonly kind: \"missing-state\" }\n | { readonly kind: \"v1-manifest\" }\n | { readonly kind: \"broken\"; readonly message: string };\n\n/**\n * Compare the schema generated from the type with the one stored in `manifestText`\n * (the whole tree, or the subtree at `mountPath`).\n * `changes` lists JSON pointers: `+ ptr` (only in generated), `- ptr` (only in\n * manifest), `~ ptr` (both, different value).\n */\nexport function compareStateSchema(manifestText: string, mountPath: string | null, generated: JsonSchemaNode): SchemaComparison {\n let parsed: unknown;\n try {\n parsed = JSON.parse(manifestText);\n } catch (e) {\n return { kind: \"broken\", message: (e as Error).message };\n }\n if (isV1Manifest(parsed)) return { kind: \"v1-manifest\" };\n let stored = readStateSchema(parsed);\n if (stored !== undefined && mountPath !== null) {\n stored = subtreeAt(stored, mountPath);\n }\n if (stored === undefined) return { kind: \"missing-state\" };\n if (stableStringify(stored) === stableStringify(generated)) return { kind: \"same\" };\n\n const a = flatten(generated);\n const b = flatten(stored);\n const changes: string[] = [];\n for (const key of [...new Set([...a.keys(), ...b.keys()])].sort()) {\n const inA = a.has(key);\n const inB = b.has(key);\n if (inA && !inB) changes.push(`+ ${key}`);\n else if (!inA && inB) changes.push(`- ${key}`);\n else if (a.get(key) !== b.get(key)) changes.push(`~ ${key}`);\n }\n return { kind: \"differs\", changes };\n}\n\n/** Leaf pointer → canonical JSON. Objects with children are not listed themselves; empty objects/arrays are leaves. */\nfunction flatten(value: unknown, pointer: string = \"\", out: Map<string, string> = new Map()): Map<string, string> {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const entries = Object.entries(value as Record<string, unknown>);\n if (entries.length === 0) {\n out.set(pointer || \"/\", \"{}\");\n return out;\n }\n for (const [key, child] of entries) {\n flatten(child, `${pointer}/${key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, out);\n }\n return out;\n }\n out.set(pointer || \"/\", stableStringify(value));\n return out;\n}\n","/**\n * schemaCore.ts — the validator core bundle (`dist/schema-core.cjs`, built from\n * packages/vscode-wcs by scripts/build-schema-core.mjs), loaded lazily.\n *\n * The bundle is a self-contained CJS file that requires neither `typescript` nor\n * `vscode`; it is located relative to the running module so the same loader\n * works from `dist/index.esm.js`, `dist/wcs-schema.mjs`, and the TypeScript\n * sources under vitest (`src/…` → `../dist`).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface WcsDiagnostic {\n readonly code: string;\n readonly start: number;\n readonly end: number;\n readonly message: string;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface SchemaCore {\n validateManifestArtifact(artifact: { text: string; source: string }): WcsDiagnostic[];\n validateDocument(\n text: string,\n options?: {\n bindAttribute?: string;\n stateTagName?: string;\n locale?: string;\n fileReader?: (relativePath: string) => string | undefined;\n applicationStates?: ReadonlyMap<string, unknown>;\n },\n ): WcsDiagnostic[];\n ALLOWED_SCHEMA_KEYWORDS: ReadonlySet<string>;\n WcsDiagnosticCode: Readonly<Record<string, string>>;\n}\n\nconst BUNDLE = \"schema-core.cjs\";\n\n/** Candidate locations, nearest first: dist/ (built), ../dist (src/), ../../dist (src/cli/). */\nexport function schemaCoreCandidates(fromUrl: string = import.meta.url): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, BUNDLE), join(here, \"..\", \"dist\", BUNDLE), join(here, \"..\", \"..\", \"dist\", BUNDLE)];\n}\n\nlet cached: SchemaCore | undefined;\n\nexport function loadSchemaCore(): SchemaCore {\n if (cached !== undefined) return cached;\n const candidates = schemaCoreCandidates();\n const found = candidates.find((p) => existsSync(p));\n /* v8 ignore next 5 -- tests run after `npm run build`, so the bundle is always present */\n if (found === undefined) {\n throw new Error(\n `${BUNDLE} not found — run \\`npm run build\\` in packages/typescript (looked in: ${candidates.join(\", \")})`,\n );\n }\n cached = createRequire(import.meta.url)(found) as SchemaCore;\n return cached;\n}\n","import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n"],"names":[],"mappings":"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"}
|
package/dist/schema-core.cjs
CHANGED
|
@@ -14286,10 +14286,12 @@ var BUILTIN_TAGS = {
|
|
|
14286
14286
|
"hasWcBindable": true,
|
|
14287
14287
|
"observedAttributes": [
|
|
14288
14288
|
"key",
|
|
14289
|
+
"storage-key",
|
|
14289
14290
|
"type"
|
|
14290
14291
|
],
|
|
14291
14292
|
"inputs": {
|
|
14292
14293
|
"key": null,
|
|
14294
|
+
"storageKey": null,
|
|
14293
14295
|
"type": null,
|
|
14294
14296
|
"value": null,
|
|
14295
14297
|
"manual": null,
|
package/dist/wcs-schema.mjs
CHANGED
|
@@ -6,6 +6,26 @@ import { isMainThread, Worker, parentPort } from 'node:worker_threads';
|
|
|
6
6
|
import ts from 'typescript';
|
|
7
7
|
import { createRequire } from 'node:module';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* typescriptSupport.ts — which `typescript` this package can run on.
|
|
11
|
+
*
|
|
12
|
+
* Both commands drive the JavaScript compiler API of TypeScript 5 and 6:
|
|
13
|
+
* `wcs-schema` through `import ts from "typescript"`, `wcs-tsc` by running the
|
|
14
|
+
* project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the
|
|
15
|
+
* native compiler) publishes neither — its `typescript` export is
|
|
16
|
+
* `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both
|
|
17
|
+
* refuse it by name instead of failing on what is missing. TypeScript 7 reads other
|
|
18
|
+
* file types through content mappers (7.1); this package does not provide one yet.
|
|
19
|
+
*/
|
|
20
|
+
/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */
|
|
21
|
+
function unsupportedTypeScript(version) {
|
|
22
|
+
return Number.parseInt(version ?? "", 10) >= 7 ? version : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** The refusal both commands report (exit code 2), without a trailing newline. */
|
|
25
|
+
function unsupportedTypeScriptMessage(version) {
|
|
26
|
+
return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;
|
|
27
|
+
}
|
|
28
|
+
|
|
9
29
|
/**
|
|
10
30
|
* program.ts — open a state file with the TypeScript compiler API and locate the
|
|
11
31
|
* type of its `export default`.
|
|
@@ -16,11 +36,15 @@ import { createRequire } from 'node:module';
|
|
|
16
36
|
* call expression would type as `any` and every path would be lost, while the
|
|
17
37
|
* argument literal still carries the full object type.
|
|
18
38
|
*/
|
|
19
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Defaults used when no tsconfig.json is found — enough to type a plain state file.
|
|
41
|
+
* The enums are read with `?.` so that this module still loads under TypeScript 7,
|
|
42
|
+
* whose `typescript` has none: `loadStateFile` then refuses that compiler by name.
|
|
43
|
+
*/
|
|
20
44
|
const DEFAULT_COMPILER_OPTIONS = {
|
|
21
|
-
target: ts.ScriptTarget
|
|
22
|
-
module: ts.ModuleKind
|
|
23
|
-
moduleResolution: ts.ModuleResolutionKind
|
|
45
|
+
target: ts.ScriptTarget?.ESNext,
|
|
46
|
+
module: ts.ModuleKind?.ESNext,
|
|
47
|
+
moduleResolution: ts.ModuleResolutionKind?.Bundler,
|
|
24
48
|
lib: ["lib.esnext.d.ts", "lib.dom.d.ts", "lib.dom.iterable.d.ts"],
|
|
25
49
|
strict: true,
|
|
26
50
|
};
|
|
@@ -80,6 +104,9 @@ function stateExpression(expression) {
|
|
|
80
104
|
return current;
|
|
81
105
|
}
|
|
82
106
|
function loadStateFile(file, options = {}) {
|
|
107
|
+
const unsupported = unsupportedTypeScript(ts.version);
|
|
108
|
+
if (unsupported !== undefined)
|
|
109
|
+
throw new Error(unsupportedTypeScriptMessage(unsupported));
|
|
83
110
|
const abs = resolve(file);
|
|
84
111
|
if (!existsSync(abs))
|
|
85
112
|
throw new Error(`cannot read ${file}: no such file`);
|
|
@@ -616,7 +643,7 @@ function loadSchemaCore() {
|
|
|
616
643
|
return cached;
|
|
617
644
|
}
|
|
618
645
|
|
|
619
|
-
var version = "4.
|
|
646
|
+
var version = "4.6.1";
|
|
620
647
|
var pkg = {
|
|
621
648
|
version: version};
|
|
622
649
|
|
package/dist/wcs-schema.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wcs-schema.mjs","sources":["../../src/program.ts","../../src/typeToSchema.ts","../../src/generate.ts","../../src/manifest.ts","../../src/schemaCore.ts","../../src/version.ts","../../src/cli/wcsSchema.ts"],"sourcesContent":["/**\n * program.ts — open a state file with the TypeScript compiler API and locate the\n * type of its `export default`.\n *\n * `defineState(x)` is an identity function, so the exported type is `x`'s type —\n * but the call is unwrapped syntactically anyway: when `@wcstack/state` is not\n * resolvable from the state file (a CDN-only page, a fixture in a temp dir), the\n * call expression would type as `any` and every path would be lost, while the\n * argument literal still carries the full object type.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport ts from \"typescript\";\n\nexport interface LoadStateOptions {\n /** Explicit tsconfig.json path. Default: the nearest tsconfig.json above the state file, else built-in defaults. */\n readonly tsconfig?: string;\n}\n\nexport interface LoadedState {\n readonly program: ts.Program;\n readonly checker: ts.TypeChecker;\n readonly sourceFile: ts.SourceFile;\n /** The type of the default export (the `defineState(...)` argument when wrapped). */\n readonly type: ts.Type;\n /** Node to use as the location for `getTypeOfSymbolAtLocation`. */\n readonly location: ts.Node;\n /** Non-fatal notes for the caller (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n /** A top-level spread brings in keys its type does not list: the state's schema is open (`{}`), whatever `type` says. */\n readonly open: boolean;\n}\n\n/** Defaults used when no tsconfig.json is found — enough to type a plain state file. */\nexport const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n lib: [\"lib.esnext.d.ts\", \"lib.dom.d.ts\", \"lib.dom.iterable.d.ts\"],\n strict: true,\n};\n\n/** The compiler API compares paths it attaches diagnostics to against `/`-separated ones; feed it those on Windows too. */\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nexport function resolveCompilerOptions(stateFile: string, options: LoadStateOptions = {}): ts.CompilerOptions {\n const configPath = options.tsconfig !== undefined\n ? toPosix(resolve(options.tsconfig))\n : ts.findConfigFile(toPosix(dirname(stateFile)), ts.sys.fileExists, \"tsconfig.json\");\n let base: ts.CompilerOptions = { ...DEFAULT_COMPILER_OPTIONS };\n if (configPath !== undefined) {\n let parsedOptions: ts.CompilerOptions;\n try {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n if (read.error !== undefined) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n }\n parsedOptions = ts.parseJsonConfigFileContent(read.config, ts.sys, toPosix(dirname(configPath)), undefined, configPath).options;\n } catch (e) {\n throw new Error(`cannot read ${configPath}: ${(e as Error).message}`);\n }\n base = { ...DEFAULT_COMPILER_OPTIONS, ...parsedOptions };\n }\n return {\n ...base,\n // The generator only reads types: never write, always accept JS (JSDoc types), keep it fast.\n noEmit: true,\n allowJs: true,\n checkJs: true,\n skipLibCheck: true,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n };\n}\n\n/** Unwrap `defineState(x)` (any callee whose last identifier is `defineState`) and `satisfies` / `as`-free wrappers. */\nfunction stateExpression(expression: ts.Expression): ts.Expression {\n let current = expression;\n while (ts.isParenthesizedExpression(current)) current = current.expression;\n if (ts.isCallExpression(current) && current.arguments.length > 0) {\n const callee = current.expression;\n const name = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : undefined;\n if (name === \"defineState\") return current.arguments[0];\n }\n return current;\n}\n\nexport function loadStateFile(file: string, options: LoadStateOptions = {}): LoadedState {\n const abs = resolve(file);\n if (!existsSync(abs)) throw new Error(`cannot read ${file}: no such file`);\n // Read up front so an unreadable file fails with a plain message, not a compiler internals one.\n readFileSync(abs, \"utf8\");\n\n const compilerOptions = resolveCompilerOptions(abs, options);\n const program = ts.createProgram([abs], compilerOptions);\n const sourceFile = program.getSourceFile(abs);\n /* v8 ignore next -- the file exists and is a root name; the compiler always returns it */\n if (sourceFile === undefined) throw new Error(`cannot open ${file} as a TypeScript/JavaScript source`);\n\n const syntax = program.getSyntacticDiagnostics(sourceFile);\n if (syntax.length > 0) {\n const lines = syntax.map((d) => {\n // Syntactic diagnostics always carry their file and position; the fallback is type-level only.\n /* v8 ignore next 2 */\n const pos = d.file !== undefined && d.start !== undefined ? d.file.getLineAndCharacterOfPosition(d.start) : undefined;\n const where = pos !== undefined ? `${file}:${pos.line + 1}:${pos.character + 1}` : file;\n return `${where} ${ts.flattenDiagnosticMessageText(d.messageText, \"\\n\")}`;\n });\n throw new Error(`syntax error(s) in ${file}:\\n${lines.join(\"\\n\")}`);\n }\n\n const exportAssignment = sourceFile.statements.find(\n (s): s is ts.ExportAssignment => ts.isExportAssignment(s) && !s.isExportEquals,\n );\n if (exportAssignment === undefined) {\n throw new Error(`${file} has no \\`export default\\` — a wcstack state file exports its state object as the default export`);\n }\n\n const location = stateExpression(exportAssignment.expression);\n const checker = program.getTypeChecker();\n const warnings: string[] = [];\n // A spread whose type does not list its keys first: the type of the whole literal is not needed then (and is the\n // expensive one, below)\n const spread = openSpread(checker, sourceFile, location);\n if (spread !== null) {\n warnings.push(`the spread \\`${spread.text}\\` (${file}:${spread.line}) brings in keys its type does not list (\\`${spread.type}\\`); the generated stateSchema will be open ({}). Give that expression a type that lists them (a JSDoc @returns or @type)`);\n return { program, checker, sourceFile, type: checker.getAnyType(), location, warnings, open: true };\n }\n let type: ts.Type;\n try {\n type = checker.getTypeAtLocation(location);\n } catch (e) {\n /* v8 ignore next 2 -- the checker's own overflow, exercised against the built dist (stack.test.ts) */\n if (!(e instanceof RangeError)) throw e;\n throw new Error(`the TypeScript checker ran out of stack on ${file}: an \\`export default { … }\\` with a top-level spread makes it recurse once per getter that reads \\`this\\`. The wcs-schema command runs on a larger stack; from the API, call generateStateSchema() on a worker with a larger resourceLimits.stackSizeMb`);\n }\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n warnings.push(`the default export of ${file} has type \\`${checker.typeToString(type)}\\`; the generated stateSchema will be open ({})`);\n }\n return { program, checker, sourceFile, type, location, warnings, open: false };\n}\n\n/**\n * A top-level spread of the state literal whose type does not list the keys it brings in — `any`, `unknown`, or an\n * index signature (`...sanitizeInputs({}).inputs` returning `Record<string, unknown>`). The compiler drops an\n * index signature from a spread, so the literal's type then lists only its own keys: a schema made from it would\n * call every key of the spread nonexistent (`wcs/path-nonexistent`, an error), where the validator knows nothing.\n * Found by an outside evaluation (a tax return draft whose 34 inputs come from such a spread).\n */\nfunction openSpread(checker: ts.TypeChecker, sourceFile: ts.SourceFile, location: ts.Expression): { text: string; line: number; type: string } | null {\n if (!ts.isObjectLiteralExpression(location)) return null;\n for (const property of location.properties) {\n if (!ts.isSpreadAssignment(property)) continue;\n const type = checker.getTypeAtLocation(property.expression);\n const open = (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0\n || (type.isUnion() ? type.types : [type]).some((t) => checker.getIndexInfosOfType(t).length > 0);\n if (!open) continue;\n return {\n text: property.getText(sourceFile),\n line: sourceFile.getLineAndCharacterOfPosition(property.getStart(sourceFile)).line + 1,\n type: checker.typeToString(type),\n };\n }\n return null;\n}\n","/**\n * typeToSchema.ts — TypeScript type → `stateSchema` (the JSON-Schema subset of\n * docs/wcstack-manifest-schema.md §4: type / properties / required / items /\n * enum / const / anyOf only).\n *\n * Rules (docs/app-testing-and-typescript-impl-plan.md §4-2-2):\n * - `$`-prefixed keys are dropped (runtime namespaces, never data paths).\n * - Members with call signatures (methods, function-valued properties) are dropped.\n * - Getters contribute their return type. Path getters (`get \"users.*.ageCategory\"()`)\n * are injected at the path they compute, so the validator sees them as members.\n * - Arrays → `items`; unions split `null` out into `anyOf`; literal unions → `enum`.\n * - Built-in / library object types (`Date`, `Map`, DOM types, …) become a **bare `{}`**\n * — never `{ \"type\": \"object\" }`: the validator treats a bare `{}` as *unknown*\n * (silent) and a typed object without the member as *nonexistent* (error).\n * - Nesting stops at `maxDepth` (default 5 = the validator's candidate budget) with a bare `{}`.\n * - An object type with an index signature (`{ [year: number]: Sale }`, `{ [key: string]: T }`) becomes a bare\n * `{}`: its keys are open, and the subset has no open-object form — a typed object would make every key\n * (`byYear.2024`) *nonexistent*.\n */\n\nimport ts from \"typescript\";\n\nexport interface JsonSchemaNode {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchemaNode[];\n}\n\nexport const DEFAULT_MAX_DEPTH = 5;\n\nexport interface SchemaOptions {\n /** Object nesting depth at which a bare `{}` is emitted instead of descending. Default 5. */\n readonly maxDepth?: number;\n}\n\ninterface Context {\n readonly checker: ts.TypeChecker;\n readonly program: ts.Program;\n readonly location: ts.Node;\n readonly maxDepth: number;\n /** Object types currently being expanded (recursion guard). */\n readonly stack: Set<ts.Type>;\n /** Path getters found on the root object, injected after the tree is built. */\n readonly pathGetters: Array<{ segments: string[]; type: ts.Type }>;\n}\n\n/**\n * Convert the type of a state object into a `stateSchema` node.\n */\nexport function stateTypeToSchema(\n checker: ts.TypeChecker,\n program: ts.Program,\n type: ts.Type,\n location: ts.Node,\n options: SchemaOptions = {},\n): JsonSchemaNode {\n const ctx: Context = {\n checker,\n program,\n location,\n maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,\n stack: new Set(),\n pathGetters: [],\n };\n const root = convertType(type, 0, ctx, true);\n for (const getter of ctx.pathGetters) {\n injectPath(root, getter.segments, convertType(getter.type, getter.segments.length, ctx, false));\n }\n return root;\n}\n\nfunction convertType(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n const flags = type.flags;\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Never | ts.TypeFlags.TypeParameter | ts.TypeFlags.NonPrimitive)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) return {};\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\", const: literalValue(type, ctx) };\n if (flags & ts.TypeFlags.StringLiteral) return { type: \"string\", const: (type as ts.StringLiteralType).value };\n if (flags & ts.TypeFlags.NumberLiteral) return { type: \"number\", const: (type as ts.NumberLiteralType).value };\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral | ts.TypeFlags.ESSymbolLike)) return {};\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (type.isUnion()) return convertUnion(type, depth, ctx);\n\n if (ctx.checker.isArrayType(type) || ctx.checker.isTupleType(type)) {\n return convertArray(type as ts.TypeReference, depth, ctx);\n }\n\n const callable = type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n if (callable && ctx.checker.getPropertiesOfType(type).length === 0) return {};\n\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n if (symbol !== undefined && isLibrarySymbol(symbol, ctx)) return {};\n\n return convertObject(type, depth, ctx, isRoot);\n}\n\nfunction convertUnion(type: ts.UnionType, depth: number, ctx: Context): JsonSchemaNode {\n const members = type.types.filter((t) => (t.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) === 0);\n const hasNull = members.some((t) => (t.flags & ts.TypeFlags.Null) !== 0);\n const nonNull = members.filter((t) => (t.flags & ts.TypeFlags.Null) === 0);\n\n let node: JsonSchemaNode;\n if (nonNull.length === 0) {\n return { type: \"null\" };\n } else if (nonNull.every((t) => (t.flags & ts.TypeFlags.BooleanLiteral) !== 0) && nonNull.length === 2) {\n node = { type: \"boolean\" };\n } else if (nonNull.every((t) => t.isLiteral() || (t.flags & ts.TypeFlags.BooleanLiteral) !== 0)) {\n const values = nonNull.map((t) => literalValue(t, ctx));\n const kinds = [...new Set(values.map((v) => typeof v))];\n node = kinds.length === 1 && (kinds[0] === \"string\" || kinds[0] === \"number\" || kinds[0] === \"boolean\")\n ? { type: kinds[0], enum: values }\n : { enum: values };\n } else if (nonNull.length === 1) {\n node = convertType(nonNull[0], depth, ctx, false);\n } else {\n const converted = dedupeNodes(nonNull.map((t) => convertType(t, depth, ctx, false)));\n node = converted.length === 1 ? converted[0] : { anyOf: converted };\n }\n\n if (!hasNull) return node;\n if (node.type === \"null\") return node;\n return node.anyOf !== undefined ? { anyOf: [...node.anyOf, { type: \"null\" }] } : { anyOf: [node, { type: \"null\" }] };\n}\n\nfunction convertArray(type: ts.TypeReference, depth: number, ctx: Context): JsonSchemaNode {\n const args = ctx.checker.getTypeArguments(type);\n if (args.length === 0) return { type: \"array\", items: {} };\n if (ctx.checker.isTupleType(type)) {\n const converted = dedupeNodes(args.map((t) => convertType(t, depth, ctx, false)));\n return { type: \"array\", items: converted.length === 1 ? converted[0] : { anyOf: converted } };\n }\n return { type: \"array\", items: convertType(args[0], depth, ctx, false) };\n}\n\nfunction convertObject(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n if (depth >= ctx.maxDepth) return {};\n if (ctx.stack.has(type)) return {};\n // Open keys (an index signature): unknown to the validator, not an object without members\n if (ctx.checker.getIndexInfosOfType(type).length > 0) return {};\n ctx.stack.add(type);\n try {\n const properties: Record<string, JsonSchemaNode> = {};\n const required: string[] = [];\n for (const prop of ctx.checker.getPropertiesOfType(type)) {\n const name = prop.getName();\n if (name.startsWith(\"$\")) continue;\n if (isMethodSymbol(prop)) continue;\n const propType = ctx.checker.getTypeOfSymbolAtLocation(prop, ctx.location);\n if (isFunctionValued(propType, ctx)) continue;\n if (isRoot && (name.includes(\".\") || name.includes(\"*\"))) {\n // A path getter declares a member at a nested position; inject it once the tree exists.\n ctx.pathGetters.push({ segments: name.split(\".\"), type: propType });\n continue;\n }\n properties[name] = convertType(propType, depth + 1, ctx, false);\n if (!isOptional(prop, propType)) required.push(name);\n }\n const node: JsonSchemaNode = { type: \"object\", properties };\n if (required.length > 0) node.required = required;\n return node;\n } finally {\n ctx.stack.delete(type);\n }\n}\n\n/** Walk `segments` (`*` = array items) into a definite object and add the leaf; unknown (`{}`) containers stay unknown. */\nfunction injectPath(root: JsonSchemaNode, segments: string[], leaf: JsonSchemaNode): void {\n const last = segments[segments.length - 1];\n if (last === \"*\" || last === \"\") return;\n let node: JsonSchemaNode | undefined = root;\n for (const segment of segments.slice(0, -1)) {\n node = segment === \"*\" ? node.items : descendObject(node)?.properties?.[segment];\n if (node === undefined) return;\n node = unwrapNullable(node);\n }\n const container = descendObject(node);\n if (container === undefined || container.properties === undefined) return;\n container.properties[last] = leaf;\n}\n\n/** For `anyOf: [object, null]` return the object member; otherwise the node itself. */\nfunction unwrapNullable(node: JsonSchemaNode): JsonSchemaNode {\n if (node.anyOf === undefined) return node;\n const objects = node.anyOf.filter((n) => n.properties !== undefined || n.items !== undefined);\n return objects.length === 1 ? objects[0] : node;\n}\n\nfunction descendObject(node: JsonSchemaNode | undefined): JsonSchemaNode | undefined {\n if (node === undefined) return undefined;\n const unwrapped = unwrapNullable(node);\n return unwrapped.properties !== undefined ? unwrapped : undefined;\n}\n\nfunction isMethodSymbol(symbol: ts.Symbol): boolean {\n if (symbol.flags & ts.SymbolFlags.Method) return true;\n return (symbol.declarations ?? []).some(\n (d) => ts.isMethodDeclaration(d) || ts.isMethodSignature(d) || ts.isFunctionDeclaration(d),\n );\n}\n\nfunction isFunctionValued(type: ts.Type, ctx: Context): boolean {\n const members = type.isUnion() ? type.types : [type];\n return members.some(\n (t) => t.getCallSignatures().length > 0 && ctx.checker.getPropertiesOfType(t).length === 0,\n );\n}\n\nfunction isOptional(symbol: ts.Symbol, type: ts.Type): boolean {\n if (symbol.flags & ts.SymbolFlags.Optional) return true;\n return type.isUnion() && type.types.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0);\n}\n\n/** Declared in a default lib (`lib.*.d.ts`) or under node_modules → opaque `{}` (Date, Map, DOM types, third-party classes). */\nfunction isLibrarySymbol(symbol: ts.Symbol, ctx: Context): boolean {\n const declarations = symbol.declarations ?? [];\n if (declarations.length === 0) return false;\n return declarations.every((d) => {\n const sf = d.getSourceFile();\n return ctx.program.isSourceFileDefaultLibrary(sf) || /[\\\\/]node_modules[\\\\/]/.test(sf.fileName);\n });\n}\n\nfunction literalValue(type: ts.Type, ctx: Context): unknown {\n if (type.flags & ts.TypeFlags.BooleanLiteral) return ctx.checker.typeToString(type) === \"true\";\n /* v8 ignore next 4 -- callers only pass literal types; the tail is the type-level fallback */\n if (type.isLiteral()) {\n const value = type.value;\n return typeof value === \"object\" ? Number(`${value.negative ? \"-\" : \"\"}${value.base10Value}`) : value;\n }\n return undefined;\n}\n\nfunction dedupeNodes(nodes: JsonSchemaNode[]): JsonSchemaNode[] {\n const seen = new Set<string>();\n const out: JsonSchemaNode[] = [];\n for (const n of nodes) {\n const key = JSON.stringify(n);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(n);\n }\n return out;\n}\n","/**\n * generate.ts — one call from a state file to its `stateSchema`.\n */\n\nimport { loadStateFile, type LoadStateOptions } from \"./program.js\";\nimport { stateTypeToSchema, type JsonSchemaNode, type SchemaOptions } from \"./typeToSchema.js\";\n\nexport interface GenerateOptions extends LoadStateOptions, SchemaOptions {}\n\nexport interface GeneratedSchema {\n readonly schema: JsonSchemaNode;\n /** Non-fatal notes (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n}\n\nexport function generateStateSchema(file: string, options: GenerateOptions = {}): GeneratedSchema {\n const loaded = loadStateFile(file, options);\n const schema = loaded.open ? {} : stateTypeToSchema(loaded.checker, loaded.program, loaded.type, loaded.location, options);\n return { schema, warnings: loaded.warnings };\n}\n","/**\n * manifest.ts — build / merge / compare the `application` sidecar artifact.\n *\n * The manifest is a **derived artifact** (D9): the TypeScript type is the source\n * of truth, `wcs-schema emit` writes the manifest, and `wcs-schema check`\n * detects drift between the two in CI.\n *\n * v2 (schemaVersion 2): the application namespace carries a **single**\n * `stateSchema` — one state tree per root, no name dimension\n * (docs/state-mount-design.md D15). A volume (`<wcs-state mount=\"path\">`)\n * contributes a **subtree**: `--mount=<path>` merges the module's schema under\n * that path inside the single `stateSchema`. `--merge` keeps everything else in\n * an existing manifest (filters, listContexts); a hand-written schema for the\n * same slot does not survive, by design: there is no implicit merge in the\n * sidecar spec (§5).\n */\n\nimport type { JsonSchemaNode } from \"./typeToSchema.js\";\n\nexport const APPLICATION_MANIFEST_FILENAME = \"wcstack.manifest.json\";\nexport const SCHEMA_VERSION = 2;\nexport const APPLICATION_NAMESPACE = \"wcstack.application\";\n\nexport interface ApplicationManifest {\n schemaVersion: number;\n kind: \"application\";\n manifestExtensions: {\n [APPLICATION_NAMESPACE]: {\n version: number;\n stateSchema?: JsonSchemaNode;\n [key: string]: unknown;\n };\n [namespace: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/**\n * Create the manifest object for the state tree, or graft into `existing`\n * (a parsed manifest object; envelope fields are normalized to v2 — a v1\n * manifest's `states` map does not survive, its replacement is exactly this\n * regeneration path).\n *\n * `mountPath === null` replaces the whole `stateSchema`; a mount path merges\n * the schema as a subtree at that path (intermediate object nodes are created).\n */\nexport function buildManifest(mountPath: string | null, schema: JsonSchemaNode, existing?: unknown): ApplicationManifest {\n const base: Record<string, unknown> =\n existing !== null && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n base.schemaVersion = SCHEMA_VERSION;\n base.kind = \"application\";\n const extensions =\n base.manifestExtensions !== null && typeof base.manifestExtensions === \"object\" && !Array.isArray(base.manifestExtensions)\n ? { ...(base.manifestExtensions as Record<string, unknown>) }\n : {};\n const nsRaw = extensions[APPLICATION_NAMESPACE];\n const ns: Record<string, unknown> =\n nsRaw !== null && typeof nsRaw === \"object\" && !Array.isArray(nsRaw) ? { ...(nsRaw as Record<string, unknown>) } : {};\n ns.version = SCHEMA_VERSION;\n // v1 leftovers: the name dimension is gone; regeneration does not carry it\n delete ns.states;\n if (mountPath === null) {\n ns.stateSchema = schema;\n } else {\n const rootRaw = ns.stateSchema;\n const root: Record<string, unknown> =\n rootRaw !== null && typeof rootRaw === \"object\" && !Array.isArray(rootRaw)\n ? { ...(rootRaw as Record<string, unknown>) }\n : { type: \"object\" };\n let node = root;\n const segments = mountPath.split(\".\");\n for (let i = 0; i < segments.length; i++) {\n const properties =\n node.properties !== null && typeof node.properties === \"object\" && !Array.isArray(node.properties)\n ? { ...(node.properties as Record<string, unknown>) }\n : {};\n node.properties = properties;\n if (i === segments.length - 1) {\n properties[segments[i]] = schema;\n break;\n }\n const childRaw = properties[segments[i]];\n const child: Record<string, unknown> =\n childRaw !== null && typeof childRaw === \"object\" && !Array.isArray(childRaw)\n ? { ...(childRaw as Record<string, unknown>) }\n : { type: \"object\" };\n properties[segments[i]] = child;\n node = child;\n }\n ns.stateSchema = root as unknown as JsonSchemaNode;\n }\n extensions[APPLICATION_NAMESPACE] = ns;\n base.manifestExtensions = extensions;\n return base as unknown as ApplicationManifest;\n}\n\n/** Read the single `stateSchema` from a parsed manifest object, or undefined. */\nexport function readStateSchema(manifest: unknown): unknown {\n if (manifest === null || typeof manifest !== \"object\") return undefined;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return undefined;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return undefined;\n return (ns as Record<string, unknown>).stateSchema;\n}\n\n/**\n * True for a v1-shaped manifest (`schemaVersion: 1` or a `states` map in the\n * application namespace). `check` uses it to point at the regeneration path\n * instead of reporting a confusing \"missing stateSchema\".\n */\nexport function isV1Manifest(manifest: unknown): boolean {\n if (manifest === null || typeof manifest !== \"object\") return false;\n if ((manifest as Record<string, unknown>).schemaVersion === 1) return true;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return false;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return false;\n return (ns as Record<string, unknown>).states !== undefined;\n}\n\n/** Navigate `properties` by mount-path segments; undefined when the subtree is absent. */\nfunction subtreeAt(schema: unknown, mountPath: string): unknown {\n let node: unknown = schema;\n for (const segment of mountPath.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n const properties = (node as Record<string, unknown>).properties;\n if (properties === null || typeof properties !== \"object\") return undefined;\n node = (properties as Record<string, unknown>)[segment];\n }\n return node;\n}\n\n/** JSON with object keys sorted at every level — the canonical form used for comparison. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n out[key] = sortKeys((value as Record<string, unknown>)[key]);\n }\n return out;\n }\n return value;\n}\n\nexport type SchemaComparison =\n | { readonly kind: \"same\" }\n | { readonly kind: \"differs\"; readonly changes: readonly string[] }\n | { readonly kind: \"missing-state\" }\n | { readonly kind: \"v1-manifest\" }\n | { readonly kind: \"broken\"; readonly message: string };\n\n/**\n * Compare the schema generated from the type with the one stored in `manifestText`\n * (the whole tree, or the subtree at `mountPath`).\n * `changes` lists JSON pointers: `+ ptr` (only in generated), `- ptr` (only in\n * manifest), `~ ptr` (both, different value).\n */\nexport function compareStateSchema(manifestText: string, mountPath: string | null, generated: JsonSchemaNode): SchemaComparison {\n let parsed: unknown;\n try {\n parsed = JSON.parse(manifestText);\n } catch (e) {\n return { kind: \"broken\", message: (e as Error).message };\n }\n if (isV1Manifest(parsed)) return { kind: \"v1-manifest\" };\n let stored = readStateSchema(parsed);\n if (stored !== undefined && mountPath !== null) {\n stored = subtreeAt(stored, mountPath);\n }\n if (stored === undefined) return { kind: \"missing-state\" };\n if (stableStringify(stored) === stableStringify(generated)) return { kind: \"same\" };\n\n const a = flatten(generated);\n const b = flatten(stored);\n const changes: string[] = [];\n for (const key of [...new Set([...a.keys(), ...b.keys()])].sort()) {\n const inA = a.has(key);\n const inB = b.has(key);\n if (inA && !inB) changes.push(`+ ${key}`);\n else if (!inA && inB) changes.push(`- ${key}`);\n else if (a.get(key) !== b.get(key)) changes.push(`~ ${key}`);\n }\n return { kind: \"differs\", changes };\n}\n\n/** Leaf pointer → canonical JSON. Objects with children are not listed themselves; empty objects/arrays are leaves. */\nfunction flatten(value: unknown, pointer: string = \"\", out: Map<string, string> = new Map()): Map<string, string> {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const entries = Object.entries(value as Record<string, unknown>);\n if (entries.length === 0) {\n out.set(pointer || \"/\", \"{}\");\n return out;\n }\n for (const [key, child] of entries) {\n flatten(child, `${pointer}/${key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, out);\n }\n return out;\n }\n out.set(pointer || \"/\", stableStringify(value));\n return out;\n}\n","/**\n * schemaCore.ts — the validator core bundle (`dist/schema-core.cjs`, built from\n * packages/vscode-wcs by scripts/build-schema-core.mjs), loaded lazily.\n *\n * The bundle is a self-contained CJS file that requires neither `typescript` nor\n * `vscode`; it is located relative to the running module so the same loader\n * works from `dist/index.esm.js`, `dist/wcs-schema.mjs`, and the TypeScript\n * sources under vitest (`src/…` → `../dist`).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface WcsDiagnostic {\n readonly code: string;\n readonly start: number;\n readonly end: number;\n readonly message: string;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface SchemaCore {\n validateManifestArtifact(artifact: { text: string; source: string }): WcsDiagnostic[];\n validateDocument(\n text: string,\n options?: {\n bindAttribute?: string;\n stateTagName?: string;\n locale?: string;\n fileReader?: (relativePath: string) => string | undefined;\n applicationStates?: ReadonlyMap<string, unknown>;\n },\n ): WcsDiagnostic[];\n ALLOWED_SCHEMA_KEYWORDS: ReadonlySet<string>;\n WcsDiagnosticCode: Readonly<Record<string, string>>;\n}\n\nconst BUNDLE = \"schema-core.cjs\";\n\n/** Candidate locations, nearest first: dist/ (built), ../dist (src/), ../../dist (src/cli/). */\nexport function schemaCoreCandidates(fromUrl: string = import.meta.url): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, BUNDLE), join(here, \"..\", \"dist\", BUNDLE), join(here, \"..\", \"..\", \"dist\", BUNDLE)];\n}\n\nlet cached: SchemaCore | undefined;\n\nexport function loadSchemaCore(): SchemaCore {\n if (cached !== undefined) return cached;\n const candidates = schemaCoreCandidates();\n const found = candidates.find((p) => existsSync(p));\n /* v8 ignore next 5 -- tests run after `npm run build`, so the bundle is always present */\n if (found === undefined) {\n throw new Error(\n `${BUNDLE} not found — run \\`npm run build\\` in packages/typescript (looked in: ${candidates.join(\", \")})`,\n );\n }\n cached = createRequire(import.meta.url)(found) as SchemaCore;\n return cached;\n}\n","import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n","/**\n * wcsSchema.ts — the `wcs-schema` command.\n *\n * wcs-schema emit <state.ts|state.js> [--mount=<path>] [--out=wcstack.manifest.json] [--merge] [--tsconfig=<path>] [--max-depth=5]\n * wcs-schema check <state.ts|state.js> [--mount=<path>] [--manifest=wcstack.manifest.json] [--tsconfig=<path>] [--max-depth=5]\n *\n * exit codes\n * emit : 0 written / 2 usage, unreadable file, syntax error, or the generated manifest failed its self-check\n * check: 0 manifest matches the type / 1 drift (changes listed on stderr) / 2 usage, unreadable file, broken or state-less manifest\n *\n * `--out=-` prints the manifest to stdout instead of writing a file. `--merge`\n * keeps everything in an existing manifest except the slot being written —\n * the whole `stateSchema`, or the subtree at `--mount=<path>` (a volume's type\n * merges as a subtree of the single tree, docs/state-mount-design.md D15).\n *\n * The generated artifact is always run through the validator core's\n * `validateManifestArtifact` (dist/schema-core.cjs, built from vscode-wcs) so a\n * generator bug can never write a manifest the validator would reject.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { isMainThread, parentPort, Worker } from \"node:worker_threads\";\nimport { generateStateSchema } from \"../generate.js\";\nimport { APPLICATION_MANIFEST_FILENAME, buildManifest, compareStateSchema } from \"../manifest.js\";\nimport { loadSchemaCore } from \"../schemaCore.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface CliIo {\n readonly stdout: (text: string) => void;\n readonly stderr: (text: string) => void;\n readonly cwd: () => string;\n}\n\nconst USAGE =\n \"usage: wcs-schema emit <state.ts|state.js> [--mount=<path>] [--out=wcstack.manifest.json] [--merge] [--tsconfig=<path>] [--max-depth=5]\\n\" +\n \" wcs-schema check <state.ts|state.js> [--mount=<path>] [--manifest=wcstack.manifest.json] [--tsconfig=<path>] [--max-depth=5]\\n\";\n\nexport interface ParsedArgs {\n readonly command: \"emit\" | \"check\" | \"version\" | \"help\" | undefined;\n readonly file: string | undefined;\n readonly mount: string | null;\n readonly out: string;\n readonly manifest: string;\n readonly merge: boolean;\n readonly tsconfig: string | undefined;\n readonly maxDepth: number | undefined;\n readonly unknown: readonly string[];\n}\n\nexport function parseArgs(argv: readonly string[]): ParsedArgs {\n let command: ParsedArgs[\"command\"];\n let file: string | undefined;\n let mount: string | null = null;\n let out = APPLICATION_MANIFEST_FILENAME;\n let manifest = APPLICATION_MANIFEST_FILENAME;\n let merge = false;\n let tsconfig: string | undefined;\n let maxDepth: number | undefined;\n const unknown: string[] = [];\n for (const arg of argv) {\n if (arg === \"--version\" || arg === \"-v\") command ??= \"version\";\n else if (arg === \"--help\" || arg === \"-h\") command ??= \"help\";\n else if (arg.startsWith(\"--mount=\")) mount = arg.slice(\"--mount=\".length);\n else if (arg.startsWith(\"--state=\")) unknown.push(arg); // v2: 名前次元は撤去 — --mount=<path> へ\n else if (arg.startsWith(\"--out=\")) out = arg.slice(\"--out=\".length);\n else if (arg.startsWith(\"--manifest=\")) manifest = arg.slice(\"--manifest=\".length);\n else if (arg.startsWith(\"--tsconfig=\")) tsconfig = arg.slice(\"--tsconfig=\".length);\n else if (arg.startsWith(\"--max-depth=\")) maxDepth = Number(arg.slice(\"--max-depth=\".length));\n else if (arg === \"--merge\") merge = true;\n else if (arg.startsWith(\"-\")) unknown.push(arg);\n else if (command === undefined && (arg === \"emit\" || arg === \"check\")) command = arg;\n else if (file === undefined) file = arg;\n else unknown.push(arg);\n }\n return { command, file, mount, out, manifest, merge, tsconfig, maxDepth, unknown };\n}\n\nexport function main(argv: readonly string[], io: CliIo = defaultIo()): number {\n const args = parseArgs(argv);\n if (args.command === \"version\") {\n io.stdout(`${VERSION}\\n`);\n return 0;\n }\n if (args.command === \"help\") {\n io.stdout(USAGE);\n return 0;\n }\n if (args.command === undefined || args.file === undefined || args.unknown.length > 0) {\n if (args.unknown.some((arg) => arg.startsWith(\"--state=\"))) {\n io.stderr('--state was removed in v2 — there is a single state tree. Use --mount=<path> for a volume, or no flag for the root tree.\\n');\n } else if (args.unknown.length > 0) {\n io.stderr(`unknown argument(s): ${args.unknown.join(\" \")}\\n`);\n }\n io.stderr(USAGE);\n return 2;\n }\n if (args.maxDepth !== undefined && (!Number.isInteger(args.maxDepth) || args.maxDepth < 1)) {\n io.stderr(\"--max-depth must be a positive integer\\n\");\n return 2;\n }\n if (args.mount !== null) {\n // runtime(state の validateVolumeMountPath)と同条件: 空セグメント・ワイルドカードと\n // 予約文字($ # @ — 位置を問わず)を拒否し、数字先頭などはランタイム同様に受理する。\n // 旧 regex は `$` 先頭を受理し数字先頭を拒否していて runtime と両方向にずれていた\n const problem = findMountPathProblem(args.mount);\n if (problem !== null) {\n io.stderr(`--mount ${problem} (got \"${args.mount}\")\\n`);\n return 2;\n }\n }\n\n let generated;\n try {\n generated = generateStateSchema(resolve(io.cwd(), args.file), { tsconfig: args.tsconfig, maxDepth: args.maxDepth });\n } catch (e) {\n io.stderr(`${(e as Error).message}\\n`);\n return 2;\n }\n for (const warning of generated.warnings) io.stderr(`warning: ${warning}\\n`);\n\n return args.command === \"emit\" ? emit(args, generated.schema, io) : check(args, generated.schema, io);\n}\n\n/** runtime(validateVolumeMountPath)が raise する形なら理由を返す(妥当なら null)。 */\nfunction findMountPathProblem(mountPath: string): string | null {\n if (mountPath.length === 0) return \"requires a non-empty tree path\";\n for (const segment of mountPath.split(\".\")) {\n if (segment.length === 0) return \"path has an empty segment\";\n if (segment === \"*\") return \"path must be static (wildcards are not allowed)\";\n if (/[$#@]/.test(segment)) return \"path must not use reserved characters ($, #, @)\";\n }\n return null;\n}\n\nfunction emit(args: ParsedArgs, schema: ReturnType<typeof generateStateSchema>[\"schema\"], io: CliIo): number {\n const toStdout = args.out === \"-\";\n const outPath = toStdout ? undefined : resolve(io.cwd(), args.out);\n\n let existing: unknown;\n if ((args.merge || args.mount !== null) && outPath !== undefined && existsSync(outPath)) {\n try {\n existing = JSON.parse(readFileSync(outPath, \"utf8\"));\n } catch (e) {\n io.stderr(`cannot merge into ${args.out}: ${(e as Error).message}\\n`);\n return 2;\n }\n }\n\n const manifest = buildManifest(args.mount, schema, existing);\n const text = `${JSON.stringify(manifest, null, 2)}\\n`;\n\n // Self-check: the validator must accept what the generator wrote.\n const core = loadSchemaCore();\n const problems = core.validateManifestArtifact({ text, source: args.out });\n for (const d of problems.filter((p) => p.severity !== \"error\")) {\n io.stderr(`${d.severity} ${d.code} ${d.message}\\n`);\n }\n const errors = problems.filter((p) => p.severity === \"error\");\n if (errors.length > 0) {\n for (const d of errors) io.stderr(`error ${d.code} ${d.message}\\n`);\n io.stderr(`generated manifest failed its self-check (${errors.length} error(s)); nothing written\\n`);\n return 2;\n }\n\n if (toStdout) {\n io.stdout(text);\n return 0;\n }\n writeFileSync(outPath!, text, \"utf8\");\n io.stderr(`wrote ${args.out} (${args.mount === null ? \"state tree\" : `mount \"${args.mount}\"`})\\n`);\n return 0;\n}\n\nfunction check(args: ParsedArgs, schema: ReturnType<typeof generateStateSchema>[\"schema\"], io: CliIo): number {\n const manifestPath = resolve(io.cwd(), args.manifest);\n if (!existsSync(manifestPath)) {\n io.stderr(`cannot read ${args.manifest}: no such file (run \\`wcs-schema emit\\` first)\\n`);\n return 2;\n }\n const slot = args.mount === null ? \"state tree\" : `mount \"${args.mount}\"`;\n // 誘導コマンドは check と同じスロットを指すこと(--mount 抜きだとルートを差し替えてしまう)\n const mountFlag = args.mount === null ? \"\" : ` --mount=${args.mount}`;\n const comparison = compareStateSchema(readFileSync(manifestPath, \"utf8\"), args.mount, schema);\n switch (comparison.kind) {\n case \"same\":\n io.stderr(`${args.manifest}: ${slot} is up to date\\n`);\n return 0;\n case \"missing-state\":\n io.stderr(`${args.manifest}: ${slot} has no stateSchema (run \\`wcs-schema emit --merge${mountFlag}\\`)\\n`);\n return 2;\n case \"v1-manifest\":\n io.stderr(`${args.manifest}: schemaVersion 1 manifest (states[name]) — the name dimension was removed in v2. Regenerate with \\`wcs-schema emit --out=${args.manifest}\\` (single stateSchema, schemaVersion 2)\\n`);\n return 2;\n case \"broken\":\n io.stderr(`${args.manifest}: broken JSON: ${comparison.message}\\n`);\n return 2;\n case \"differs\":\n io.stderr(`${args.manifest}: ${slot} is out of date (${comparison.changes.length} change(s)):\\n`);\n for (const change of comparison.changes) io.stderr(` ${change}\\n`);\n io.stderr(`run \\`wcs-schema emit --merge${mountFlag} --out=${args.manifest}\\` to update it\\n`);\n return 1;\n }\n}\n\n/* v8 ignore start -- process plumbing; exercised by running the built bin, not by unit tests */\nfunction defaultIo(): CliIo {\n return {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n cwd: () => process.cwd(),\n };\n}\n\n// Entry point when executed as the `wcs-schema` bin (rollup emits dist/wcs-schema.mjs\n// with a shebang). Under vitest this module is imported, and `process.argv[1]` is\n// vitest's own entry, so the branch is not taken.\nconst invokedAsBin = typeof process !== \"undefined\"\n && Array.isArray(process.argv)\n && /wcs-schema(\\.mjs)?$/.test(process.argv[1] ?? \"\");\nif (invokedAsBin) {\n if (isMainThread) {\n // The TypeScript checker recurses once per getter that reads `this` in a state literal with a top-level spread\n // (program.ts): a state of a hundred getters ran out of the main thread's stack (an outside evaluation, a tax\n // return draft). The command runs on a worker thread with a larger one, and its exit code comes back.\n const worker = new Worker(fileURLToPath(import.meta.url), { argv: process.argv.slice(2), resourceLimits: { stackSizeMb: 256 } });\n worker.on(\"message\", (code: number) => { process.exitCode = code; });\n worker.on(\"error\", (e) => {\n process.stderr.write(`${e.stack ?? e}\n`);\n process.exitCode = 2;\n });\n } else {\n parentPort!.postMessage(main(process.argv.slice(2)));\n }\n}\n/* v8 ignore stop */\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wcs-schema.mjs","sources":["../../src/typescriptSupport.ts","../../src/program.ts","../../src/typeToSchema.ts","../../src/generate.ts","../../src/manifest.ts","../../src/schemaCore.ts","../../src/version.ts","../../src/cli/wcsSchema.ts"],"sourcesContent":["/**\n * typescriptSupport.ts — which `typescript` this package can run on.\n *\n * Both commands drive the JavaScript compiler API of TypeScript 5 and 6:\n * `wcs-schema` through `import ts from \"typescript\"`, `wcs-tsc` by running the\n * project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the\n * native compiler) publishes neither — its `typescript` export is\n * `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both\n * refuse it by name instead of failing on what is missing. TypeScript 7 reads other\n * file types through content mappers (7.1); this package does not provide one yet.\n */\n\n/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */\nexport function unsupportedTypeScript(version: string | undefined): string | undefined {\n return Number.parseInt(version ?? \"\", 10) >= 7 ? version : undefined;\n}\n\n/** The refusal both commands report (exit code 2), without a trailing newline. */\nexport function unsupportedTypeScriptMessage(version: string): string {\n return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;\n}\n","/**\n * program.ts — open a state file with the TypeScript compiler API and locate the\n * type of its `export default`.\n *\n * `defineState(x)` is an identity function, so the exported type is `x`'s type —\n * but the call is unwrapped syntactically anyway: when `@wcstack/state` is not\n * resolvable from the state file (a CDN-only page, a fixture in a temp dir), the\n * call expression would type as `any` and every path would be lost, while the\n * argument literal still carries the full object type.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport ts from \"typescript\";\nimport { unsupportedTypeScript, unsupportedTypeScriptMessage } from \"./typescriptSupport.js\";\n\nexport interface LoadStateOptions {\n /** Explicit tsconfig.json path. Default: the nearest tsconfig.json above the state file, else built-in defaults. */\n readonly tsconfig?: string;\n}\n\nexport interface LoadedState {\n readonly program: ts.Program;\n readonly checker: ts.TypeChecker;\n readonly sourceFile: ts.SourceFile;\n /** The type of the default export (the `defineState(...)` argument when wrapped). */\n readonly type: ts.Type;\n /** Node to use as the location for `getTypeOfSymbolAtLocation`. */\n readonly location: ts.Node;\n /** Non-fatal notes for the caller (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n /** A top-level spread brings in keys its type does not list: the state's schema is open (`{}`), whatever `type` says. */\n readonly open: boolean;\n}\n\n/**\n * Defaults used when no tsconfig.json is found — enough to type a plain state file.\n * The enums are read with `?.` so that this module still loads under TypeScript 7,\n * whose `typescript` has none: `loadStateFile` then refuses that compiler by name.\n */\nexport const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget?.ESNext,\n module: ts.ModuleKind?.ESNext,\n moduleResolution: ts.ModuleResolutionKind?.Bundler,\n lib: [\"lib.esnext.d.ts\", \"lib.dom.d.ts\", \"lib.dom.iterable.d.ts\"],\n strict: true,\n};\n\n/** The compiler API compares paths it attaches diagnostics to against `/`-separated ones; feed it those on Windows too. */\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nexport function resolveCompilerOptions(stateFile: string, options: LoadStateOptions = {}): ts.CompilerOptions {\n const configPath = options.tsconfig !== undefined\n ? toPosix(resolve(options.tsconfig))\n : ts.findConfigFile(toPosix(dirname(stateFile)), ts.sys.fileExists, \"tsconfig.json\");\n let base: ts.CompilerOptions = { ...DEFAULT_COMPILER_OPTIONS };\n if (configPath !== undefined) {\n let parsedOptions: ts.CompilerOptions;\n try {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n if (read.error !== undefined) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n }\n parsedOptions = ts.parseJsonConfigFileContent(read.config, ts.sys, toPosix(dirname(configPath)), undefined, configPath).options;\n } catch (e) {\n throw new Error(`cannot read ${configPath}: ${(e as Error).message}`);\n }\n base = { ...DEFAULT_COMPILER_OPTIONS, ...parsedOptions };\n }\n return {\n ...base,\n // The generator only reads types: never write, always accept JS (JSDoc types), keep it fast.\n noEmit: true,\n allowJs: true,\n checkJs: true,\n skipLibCheck: true,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n };\n}\n\n/** Unwrap `defineState(x)` (any callee whose last identifier is `defineState`) and `satisfies` / `as`-free wrappers. */\nfunction stateExpression(expression: ts.Expression): ts.Expression {\n let current = expression;\n while (ts.isParenthesizedExpression(current)) current = current.expression;\n if (ts.isCallExpression(current) && current.arguments.length > 0) {\n const callee = current.expression;\n const name = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : undefined;\n if (name === \"defineState\") return current.arguments[0];\n }\n return current;\n}\n\nexport function loadStateFile(file: string, options: LoadStateOptions = {}): LoadedState {\n const unsupported = unsupportedTypeScript(ts.version);\n if (unsupported !== undefined) throw new Error(unsupportedTypeScriptMessage(unsupported));\n const abs = resolve(file);\n if (!existsSync(abs)) throw new Error(`cannot read ${file}: no such file`);\n // Read up front so an unreadable file fails with a plain message, not a compiler internals one.\n readFileSync(abs, \"utf8\");\n\n const compilerOptions = resolveCompilerOptions(abs, options);\n const program = ts.createProgram([abs], compilerOptions);\n const sourceFile = program.getSourceFile(abs);\n /* v8 ignore next -- the file exists and is a root name; the compiler always returns it */\n if (sourceFile === undefined) throw new Error(`cannot open ${file} as a TypeScript/JavaScript source`);\n\n const syntax = program.getSyntacticDiagnostics(sourceFile);\n if (syntax.length > 0) {\n const lines = syntax.map((d) => {\n // Syntactic diagnostics always carry their file and position; the fallback is type-level only.\n /* v8 ignore next 2 */\n const pos = d.file !== undefined && d.start !== undefined ? d.file.getLineAndCharacterOfPosition(d.start) : undefined;\n const where = pos !== undefined ? `${file}:${pos.line + 1}:${pos.character + 1}` : file;\n return `${where} ${ts.flattenDiagnosticMessageText(d.messageText, \"\\n\")}`;\n });\n throw new Error(`syntax error(s) in ${file}:\\n${lines.join(\"\\n\")}`);\n }\n\n const exportAssignment = sourceFile.statements.find(\n (s): s is ts.ExportAssignment => ts.isExportAssignment(s) && !s.isExportEquals,\n );\n if (exportAssignment === undefined) {\n throw new Error(`${file} has no \\`export default\\` — a wcstack state file exports its state object as the default export`);\n }\n\n const location = stateExpression(exportAssignment.expression);\n const checker = program.getTypeChecker();\n const warnings: string[] = [];\n // A spread whose type does not list its keys first: the type of the whole literal is not needed then (and is the\n // expensive one, below)\n const spread = openSpread(checker, sourceFile, location);\n if (spread !== null) {\n warnings.push(`the spread \\`${spread.text}\\` (${file}:${spread.line}) brings in keys its type does not list (\\`${spread.type}\\`); the generated stateSchema will be open ({}). Give that expression a type that lists them (a JSDoc @returns or @type)`);\n return { program, checker, sourceFile, type: checker.getAnyType(), location, warnings, open: true };\n }\n let type: ts.Type;\n try {\n type = checker.getTypeAtLocation(location);\n } catch (e) {\n /* v8 ignore next 2 -- the checker's own overflow, exercised against the built dist (stack.test.ts) */\n if (!(e instanceof RangeError)) throw e;\n throw new Error(`the TypeScript checker ran out of stack on ${file}: an \\`export default { … }\\` with a top-level spread makes it recurse once per getter that reads \\`this\\`. The wcs-schema command runs on a larger stack; from the API, call generateStateSchema() on a worker with a larger resourceLimits.stackSizeMb`);\n }\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n warnings.push(`the default export of ${file} has type \\`${checker.typeToString(type)}\\`; the generated stateSchema will be open ({})`);\n }\n return { program, checker, sourceFile, type, location, warnings, open: false };\n}\n\n/**\n * A top-level spread of the state literal whose type does not list the keys it brings in — `any`, `unknown`, or an\n * index signature (`...sanitizeInputs({}).inputs` returning `Record<string, unknown>`). The compiler drops an\n * index signature from a spread, so the literal's type then lists only its own keys: a schema made from it would\n * call every key of the spread nonexistent (`wcs/path-nonexistent`, an error), where the validator knows nothing.\n * Found by an outside evaluation (a tax return draft whose 34 inputs come from such a spread).\n */\nfunction openSpread(checker: ts.TypeChecker, sourceFile: ts.SourceFile, location: ts.Expression): { text: string; line: number; type: string } | null {\n if (!ts.isObjectLiteralExpression(location)) return null;\n for (const property of location.properties) {\n if (!ts.isSpreadAssignment(property)) continue;\n const type = checker.getTypeAtLocation(property.expression);\n const open = (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0\n || (type.isUnion() ? type.types : [type]).some((t) => checker.getIndexInfosOfType(t).length > 0);\n if (!open) continue;\n return {\n text: property.getText(sourceFile),\n line: sourceFile.getLineAndCharacterOfPosition(property.getStart(sourceFile)).line + 1,\n type: checker.typeToString(type),\n };\n }\n return null;\n}\n","/**\n * typeToSchema.ts — TypeScript type → `stateSchema` (the JSON-Schema subset of\n * docs/wcstack-manifest-schema.md §4: type / properties / required / items /\n * enum / const / anyOf only).\n *\n * Rules (docs/app-testing-and-typescript-impl-plan.md §4-2-2):\n * - `$`-prefixed keys are dropped (runtime namespaces, never data paths).\n * - Members with call signatures (methods, function-valued properties) are dropped.\n * - Getters contribute their return type. Path getters (`get \"users.*.ageCategory\"()`)\n * are injected at the path they compute, so the validator sees them as members.\n * - Arrays → `items`; unions split `null` out into `anyOf`; literal unions → `enum`.\n * - Built-in / library object types (`Date`, `Map`, DOM types, …) become a **bare `{}`**\n * — never `{ \"type\": \"object\" }`: the validator treats a bare `{}` as *unknown*\n * (silent) and a typed object without the member as *nonexistent* (error).\n * - Nesting stops at `maxDepth` (default 5 = the validator's candidate budget) with a bare `{}`.\n * - An object type with an index signature (`{ [year: number]: Sale }`, `{ [key: string]: T }`) becomes a bare\n * `{}`: its keys are open, and the subset has no open-object form — a typed object would make every key\n * (`byYear.2024`) *nonexistent*.\n */\n\nimport ts from \"typescript\";\n\nexport interface JsonSchemaNode {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n const?: unknown;\n anyOf?: JsonSchemaNode[];\n}\n\nexport const DEFAULT_MAX_DEPTH = 5;\n\nexport interface SchemaOptions {\n /** Object nesting depth at which a bare `{}` is emitted instead of descending. Default 5. */\n readonly maxDepth?: number;\n}\n\ninterface Context {\n readonly checker: ts.TypeChecker;\n readonly program: ts.Program;\n readonly location: ts.Node;\n readonly maxDepth: number;\n /** Object types currently being expanded (recursion guard). */\n readonly stack: Set<ts.Type>;\n /** Path getters found on the root object, injected after the tree is built. */\n readonly pathGetters: Array<{ segments: string[]; type: ts.Type }>;\n}\n\n/**\n * Convert the type of a state object into a `stateSchema` node.\n */\nexport function stateTypeToSchema(\n checker: ts.TypeChecker,\n program: ts.Program,\n type: ts.Type,\n location: ts.Node,\n options: SchemaOptions = {},\n): JsonSchemaNode {\n const ctx: Context = {\n checker,\n program,\n location,\n maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,\n stack: new Set(),\n pathGetters: [],\n };\n const root = convertType(type, 0, ctx, true);\n for (const getter of ctx.pathGetters) {\n injectPath(root, getter.segments, convertType(getter.type, getter.segments.length, ctx, false));\n }\n return root;\n}\n\nfunction convertType(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n const flags = type.flags;\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Never | ts.TypeFlags.TypeParameter | ts.TypeFlags.NonPrimitive)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) return {};\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\", const: literalValue(type, ctx) };\n if (flags & ts.TypeFlags.StringLiteral) return { type: \"string\", const: (type as ts.StringLiteralType).value };\n if (flags & ts.TypeFlags.NumberLiteral) return { type: \"number\", const: (type as ts.NumberLiteralType).value };\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral | ts.TypeFlags.ESSymbolLike)) return {};\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (type.isUnion()) return convertUnion(type, depth, ctx);\n\n if (ctx.checker.isArrayType(type) || ctx.checker.isTupleType(type)) {\n return convertArray(type as ts.TypeReference, depth, ctx);\n }\n\n const callable = type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n if (callable && ctx.checker.getPropertiesOfType(type).length === 0) return {};\n\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n if (symbol !== undefined && isLibrarySymbol(symbol, ctx)) return {};\n\n return convertObject(type, depth, ctx, isRoot);\n}\n\nfunction convertUnion(type: ts.UnionType, depth: number, ctx: Context): JsonSchemaNode {\n const members = type.types.filter((t) => (t.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) === 0);\n const hasNull = members.some((t) => (t.flags & ts.TypeFlags.Null) !== 0);\n const nonNull = members.filter((t) => (t.flags & ts.TypeFlags.Null) === 0);\n\n let node: JsonSchemaNode;\n if (nonNull.length === 0) {\n return { type: \"null\" };\n } else if (nonNull.every((t) => (t.flags & ts.TypeFlags.BooleanLiteral) !== 0) && nonNull.length === 2) {\n node = { type: \"boolean\" };\n } else if (nonNull.every((t) => t.isLiteral() || (t.flags & ts.TypeFlags.BooleanLiteral) !== 0)) {\n const values = nonNull.map((t) => literalValue(t, ctx));\n const kinds = [...new Set(values.map((v) => typeof v))];\n node = kinds.length === 1 && (kinds[0] === \"string\" || kinds[0] === \"number\" || kinds[0] === \"boolean\")\n ? { type: kinds[0], enum: values }\n : { enum: values };\n } else if (nonNull.length === 1) {\n node = convertType(nonNull[0], depth, ctx, false);\n } else {\n const converted = dedupeNodes(nonNull.map((t) => convertType(t, depth, ctx, false)));\n node = converted.length === 1 ? converted[0] : { anyOf: converted };\n }\n\n if (!hasNull) return node;\n if (node.type === \"null\") return node;\n return node.anyOf !== undefined ? { anyOf: [...node.anyOf, { type: \"null\" }] } : { anyOf: [node, { type: \"null\" }] };\n}\n\nfunction convertArray(type: ts.TypeReference, depth: number, ctx: Context): JsonSchemaNode {\n const args = ctx.checker.getTypeArguments(type);\n if (args.length === 0) return { type: \"array\", items: {} };\n if (ctx.checker.isTupleType(type)) {\n const converted = dedupeNodes(args.map((t) => convertType(t, depth, ctx, false)));\n return { type: \"array\", items: converted.length === 1 ? converted[0] : { anyOf: converted } };\n }\n return { type: \"array\", items: convertType(args[0], depth, ctx, false) };\n}\n\nfunction convertObject(type: ts.Type, depth: number, ctx: Context, isRoot: boolean): JsonSchemaNode {\n if (depth >= ctx.maxDepth) return {};\n if (ctx.stack.has(type)) return {};\n // Open keys (an index signature): unknown to the validator, not an object without members\n if (ctx.checker.getIndexInfosOfType(type).length > 0) return {};\n ctx.stack.add(type);\n try {\n const properties: Record<string, JsonSchemaNode> = {};\n const required: string[] = [];\n for (const prop of ctx.checker.getPropertiesOfType(type)) {\n const name = prop.getName();\n if (name.startsWith(\"$\")) continue;\n if (isMethodSymbol(prop)) continue;\n const propType = ctx.checker.getTypeOfSymbolAtLocation(prop, ctx.location);\n if (isFunctionValued(propType, ctx)) continue;\n if (isRoot && (name.includes(\".\") || name.includes(\"*\"))) {\n // A path getter declares a member at a nested position; inject it once the tree exists.\n ctx.pathGetters.push({ segments: name.split(\".\"), type: propType });\n continue;\n }\n properties[name] = convertType(propType, depth + 1, ctx, false);\n if (!isOptional(prop, propType)) required.push(name);\n }\n const node: JsonSchemaNode = { type: \"object\", properties };\n if (required.length > 0) node.required = required;\n return node;\n } finally {\n ctx.stack.delete(type);\n }\n}\n\n/** Walk `segments` (`*` = array items) into a definite object and add the leaf; unknown (`{}`) containers stay unknown. */\nfunction injectPath(root: JsonSchemaNode, segments: string[], leaf: JsonSchemaNode): void {\n const last = segments[segments.length - 1];\n if (last === \"*\" || last === \"\") return;\n let node: JsonSchemaNode | undefined = root;\n for (const segment of segments.slice(0, -1)) {\n node = segment === \"*\" ? node.items : descendObject(node)?.properties?.[segment];\n if (node === undefined) return;\n node = unwrapNullable(node);\n }\n const container = descendObject(node);\n if (container === undefined || container.properties === undefined) return;\n container.properties[last] = leaf;\n}\n\n/** For `anyOf: [object, null]` return the object member; otherwise the node itself. */\nfunction unwrapNullable(node: JsonSchemaNode): JsonSchemaNode {\n if (node.anyOf === undefined) return node;\n const objects = node.anyOf.filter((n) => n.properties !== undefined || n.items !== undefined);\n return objects.length === 1 ? objects[0] : node;\n}\n\nfunction descendObject(node: JsonSchemaNode | undefined): JsonSchemaNode | undefined {\n if (node === undefined) return undefined;\n const unwrapped = unwrapNullable(node);\n return unwrapped.properties !== undefined ? unwrapped : undefined;\n}\n\nfunction isMethodSymbol(symbol: ts.Symbol): boolean {\n if (symbol.flags & ts.SymbolFlags.Method) return true;\n return (symbol.declarations ?? []).some(\n (d) => ts.isMethodDeclaration(d) || ts.isMethodSignature(d) || ts.isFunctionDeclaration(d),\n );\n}\n\nfunction isFunctionValued(type: ts.Type, ctx: Context): boolean {\n const members = type.isUnion() ? type.types : [type];\n return members.some(\n (t) => t.getCallSignatures().length > 0 && ctx.checker.getPropertiesOfType(t).length === 0,\n );\n}\n\nfunction isOptional(symbol: ts.Symbol, type: ts.Type): boolean {\n if (symbol.flags & ts.SymbolFlags.Optional) return true;\n return type.isUnion() && type.types.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0);\n}\n\n/** Declared in a default lib (`lib.*.d.ts`) or under node_modules → opaque `{}` (Date, Map, DOM types, third-party classes). */\nfunction isLibrarySymbol(symbol: ts.Symbol, ctx: Context): boolean {\n const declarations = symbol.declarations ?? [];\n if (declarations.length === 0) return false;\n return declarations.every((d) => {\n const sf = d.getSourceFile();\n return ctx.program.isSourceFileDefaultLibrary(sf) || /[\\\\/]node_modules[\\\\/]/.test(sf.fileName);\n });\n}\n\nfunction literalValue(type: ts.Type, ctx: Context): unknown {\n if (type.flags & ts.TypeFlags.BooleanLiteral) return ctx.checker.typeToString(type) === \"true\";\n /* v8 ignore next 4 -- callers only pass literal types; the tail is the type-level fallback */\n if (type.isLiteral()) {\n const value = type.value;\n return typeof value === \"object\" ? Number(`${value.negative ? \"-\" : \"\"}${value.base10Value}`) : value;\n }\n return undefined;\n}\n\nfunction dedupeNodes(nodes: JsonSchemaNode[]): JsonSchemaNode[] {\n const seen = new Set<string>();\n const out: JsonSchemaNode[] = [];\n for (const n of nodes) {\n const key = JSON.stringify(n);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(n);\n }\n return out;\n}\n","/**\n * generate.ts — one call from a state file to its `stateSchema`.\n */\n\nimport { loadStateFile, type LoadStateOptions } from \"./program.js\";\nimport { stateTypeToSchema, type JsonSchemaNode, type SchemaOptions } from \"./typeToSchema.js\";\n\nexport interface GenerateOptions extends LoadStateOptions, SchemaOptions {}\n\nexport interface GeneratedSchema {\n readonly schema: JsonSchemaNode;\n /** Non-fatal notes (e.g. the state type resolved to `any`). */\n readonly warnings: readonly string[];\n}\n\nexport function generateStateSchema(file: string, options: GenerateOptions = {}): GeneratedSchema {\n const loaded = loadStateFile(file, options);\n const schema = loaded.open ? {} : stateTypeToSchema(loaded.checker, loaded.program, loaded.type, loaded.location, options);\n return { schema, warnings: loaded.warnings };\n}\n","/**\n * manifest.ts — build / merge / compare the `application` sidecar artifact.\n *\n * The manifest is a **derived artifact** (D9): the TypeScript type is the source\n * of truth, `wcs-schema emit` writes the manifest, and `wcs-schema check`\n * detects drift between the two in CI.\n *\n * v2 (schemaVersion 2): the application namespace carries a **single**\n * `stateSchema` — one state tree per root, no name dimension\n * (docs/state-mount-design.md D15). A volume (`<wcs-state mount=\"path\">`)\n * contributes a **subtree**: `--mount=<path>` merges the module's schema under\n * that path inside the single `stateSchema`. `--merge` keeps everything else in\n * an existing manifest (filters, listContexts); a hand-written schema for the\n * same slot does not survive, by design: there is no implicit merge in the\n * sidecar spec (§5).\n */\n\nimport type { JsonSchemaNode } from \"./typeToSchema.js\";\n\nexport const APPLICATION_MANIFEST_FILENAME = \"wcstack.manifest.json\";\nexport const SCHEMA_VERSION = 2;\nexport const APPLICATION_NAMESPACE = \"wcstack.application\";\n\nexport interface ApplicationManifest {\n schemaVersion: number;\n kind: \"application\";\n manifestExtensions: {\n [APPLICATION_NAMESPACE]: {\n version: number;\n stateSchema?: JsonSchemaNode;\n [key: string]: unknown;\n };\n [namespace: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/**\n * Create the manifest object for the state tree, or graft into `existing`\n * (a parsed manifest object; envelope fields are normalized to v2 — a v1\n * manifest's `states` map does not survive, its replacement is exactly this\n * regeneration path).\n *\n * `mountPath === null` replaces the whole `stateSchema`; a mount path merges\n * the schema as a subtree at that path (intermediate object nodes are created).\n */\nexport function buildManifest(mountPath: string | null, schema: JsonSchemaNode, existing?: unknown): ApplicationManifest {\n const base: Record<string, unknown> =\n existing !== null && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n base.schemaVersion = SCHEMA_VERSION;\n base.kind = \"application\";\n const extensions =\n base.manifestExtensions !== null && typeof base.manifestExtensions === \"object\" && !Array.isArray(base.manifestExtensions)\n ? { ...(base.manifestExtensions as Record<string, unknown>) }\n : {};\n const nsRaw = extensions[APPLICATION_NAMESPACE];\n const ns: Record<string, unknown> =\n nsRaw !== null && typeof nsRaw === \"object\" && !Array.isArray(nsRaw) ? { ...(nsRaw as Record<string, unknown>) } : {};\n ns.version = SCHEMA_VERSION;\n // v1 leftovers: the name dimension is gone; regeneration does not carry it\n delete ns.states;\n if (mountPath === null) {\n ns.stateSchema = schema;\n } else {\n const rootRaw = ns.stateSchema;\n const root: Record<string, unknown> =\n rootRaw !== null && typeof rootRaw === \"object\" && !Array.isArray(rootRaw)\n ? { ...(rootRaw as Record<string, unknown>) }\n : { type: \"object\" };\n let node = root;\n const segments = mountPath.split(\".\");\n for (let i = 0; i < segments.length; i++) {\n const properties =\n node.properties !== null && typeof node.properties === \"object\" && !Array.isArray(node.properties)\n ? { ...(node.properties as Record<string, unknown>) }\n : {};\n node.properties = properties;\n if (i === segments.length - 1) {\n properties[segments[i]] = schema;\n break;\n }\n const childRaw = properties[segments[i]];\n const child: Record<string, unknown> =\n childRaw !== null && typeof childRaw === \"object\" && !Array.isArray(childRaw)\n ? { ...(childRaw as Record<string, unknown>) }\n : { type: \"object\" };\n properties[segments[i]] = child;\n node = child;\n }\n ns.stateSchema = root as unknown as JsonSchemaNode;\n }\n extensions[APPLICATION_NAMESPACE] = ns;\n base.manifestExtensions = extensions;\n return base as unknown as ApplicationManifest;\n}\n\n/** Read the single `stateSchema` from a parsed manifest object, or undefined. */\nexport function readStateSchema(manifest: unknown): unknown {\n if (manifest === null || typeof manifest !== \"object\") return undefined;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return undefined;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return undefined;\n return (ns as Record<string, unknown>).stateSchema;\n}\n\n/**\n * True for a v1-shaped manifest (`schemaVersion: 1` or a `states` map in the\n * application namespace). `check` uses it to point at the regeneration path\n * instead of reporting a confusing \"missing stateSchema\".\n */\nexport function isV1Manifest(manifest: unknown): boolean {\n if (manifest === null || typeof manifest !== \"object\") return false;\n if ((manifest as Record<string, unknown>).schemaVersion === 1) return true;\n const extensions = (manifest as Record<string, unknown>).manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return false;\n const ns = (extensions as Record<string, unknown>)[APPLICATION_NAMESPACE];\n if (ns === null || typeof ns !== \"object\") return false;\n return (ns as Record<string, unknown>).states !== undefined;\n}\n\n/** Navigate `properties` by mount-path segments; undefined when the subtree is absent. */\nfunction subtreeAt(schema: unknown, mountPath: string): unknown {\n let node: unknown = schema;\n for (const segment of mountPath.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n const properties = (node as Record<string, unknown>).properties;\n if (properties === null || typeof properties !== \"object\") return undefined;\n node = (properties as Record<string, unknown>)[segment];\n }\n return node;\n}\n\n/** JSON with object keys sorted at every level — the canonical form used for comparison. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n out[key] = sortKeys((value as Record<string, unknown>)[key]);\n }\n return out;\n }\n return value;\n}\n\nexport type SchemaComparison =\n | { readonly kind: \"same\" }\n | { readonly kind: \"differs\"; readonly changes: readonly string[] }\n | { readonly kind: \"missing-state\" }\n | { readonly kind: \"v1-manifest\" }\n | { readonly kind: \"broken\"; readonly message: string };\n\n/**\n * Compare the schema generated from the type with the one stored in `manifestText`\n * (the whole tree, or the subtree at `mountPath`).\n * `changes` lists JSON pointers: `+ ptr` (only in generated), `- ptr` (only in\n * manifest), `~ ptr` (both, different value).\n */\nexport function compareStateSchema(manifestText: string, mountPath: string | null, generated: JsonSchemaNode): SchemaComparison {\n let parsed: unknown;\n try {\n parsed = JSON.parse(manifestText);\n } catch (e) {\n return { kind: \"broken\", message: (e as Error).message };\n }\n if (isV1Manifest(parsed)) return { kind: \"v1-manifest\" };\n let stored = readStateSchema(parsed);\n if (stored !== undefined && mountPath !== null) {\n stored = subtreeAt(stored, mountPath);\n }\n if (stored === undefined) return { kind: \"missing-state\" };\n if (stableStringify(stored) === stableStringify(generated)) return { kind: \"same\" };\n\n const a = flatten(generated);\n const b = flatten(stored);\n const changes: string[] = [];\n for (const key of [...new Set([...a.keys(), ...b.keys()])].sort()) {\n const inA = a.has(key);\n const inB = b.has(key);\n if (inA && !inB) changes.push(`+ ${key}`);\n else if (!inA && inB) changes.push(`- ${key}`);\n else if (a.get(key) !== b.get(key)) changes.push(`~ ${key}`);\n }\n return { kind: \"differs\", changes };\n}\n\n/** Leaf pointer → canonical JSON. Objects with children are not listed themselves; empty objects/arrays are leaves. */\nfunction flatten(value: unknown, pointer: string = \"\", out: Map<string, string> = new Map()): Map<string, string> {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const entries = Object.entries(value as Record<string, unknown>);\n if (entries.length === 0) {\n out.set(pointer || \"/\", \"{}\");\n return out;\n }\n for (const [key, child] of entries) {\n flatten(child, `${pointer}/${key.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`, out);\n }\n return out;\n }\n out.set(pointer || \"/\", stableStringify(value));\n return out;\n}\n","/**\n * schemaCore.ts — the validator core bundle (`dist/schema-core.cjs`, built from\n * packages/vscode-wcs by scripts/build-schema-core.mjs), loaded lazily.\n *\n * The bundle is a self-contained CJS file that requires neither `typescript` nor\n * `vscode`; it is located relative to the running module so the same loader\n * works from `dist/index.esm.js`, `dist/wcs-schema.mjs`, and the TypeScript\n * sources under vitest (`src/…` → `../dist`).\n */\n\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface WcsDiagnostic {\n readonly code: string;\n readonly start: number;\n readonly end: number;\n readonly message: string;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface SchemaCore {\n validateManifestArtifact(artifact: { text: string; source: string }): WcsDiagnostic[];\n validateDocument(\n text: string,\n options?: {\n bindAttribute?: string;\n stateTagName?: string;\n locale?: string;\n fileReader?: (relativePath: string) => string | undefined;\n applicationStates?: ReadonlyMap<string, unknown>;\n },\n ): WcsDiagnostic[];\n ALLOWED_SCHEMA_KEYWORDS: ReadonlySet<string>;\n WcsDiagnosticCode: Readonly<Record<string, string>>;\n}\n\nconst BUNDLE = \"schema-core.cjs\";\n\n/** Candidate locations, nearest first: dist/ (built), ../dist (src/), ../../dist (src/cli/). */\nexport function schemaCoreCandidates(fromUrl: string = import.meta.url): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, BUNDLE), join(here, \"..\", \"dist\", BUNDLE), join(here, \"..\", \"..\", \"dist\", BUNDLE)];\n}\n\nlet cached: SchemaCore | undefined;\n\nexport function loadSchemaCore(): SchemaCore {\n if (cached !== undefined) return cached;\n const candidates = schemaCoreCandidates();\n const found = candidates.find((p) => existsSync(p));\n /* v8 ignore next 5 -- tests run after `npm run build`, so the bundle is always present */\n if (found === undefined) {\n throw new Error(\n `${BUNDLE} not found — run \\`npm run build\\` in packages/typescript (looked in: ${candidates.join(\", \")})`,\n );\n }\n cached = createRequire(import.meta.url)(found) as SchemaCore;\n return cached;\n}\n","import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n","/**\n * wcsSchema.ts — the `wcs-schema` command.\n *\n * wcs-schema emit <state.ts|state.js> [--mount=<path>] [--out=wcstack.manifest.json] [--merge] [--tsconfig=<path>] [--max-depth=5]\n * wcs-schema check <state.ts|state.js> [--mount=<path>] [--manifest=wcstack.manifest.json] [--tsconfig=<path>] [--max-depth=5]\n *\n * exit codes\n * emit : 0 written / 2 usage, unreadable file, syntax error, or the generated manifest failed its self-check\n * check: 0 manifest matches the type / 1 drift (changes listed on stderr) / 2 usage, unreadable file, broken or state-less manifest\n *\n * `--out=-` prints the manifest to stdout instead of writing a file. `--merge`\n * keeps everything in an existing manifest except the slot being written —\n * the whole `stateSchema`, or the subtree at `--mount=<path>` (a volume's type\n * merges as a subtree of the single tree, docs/state-mount-design.md D15).\n *\n * The generated artifact is always run through the validator core's\n * `validateManifestArtifact` (dist/schema-core.cjs, built from vscode-wcs) so a\n * generator bug can never write a manifest the validator would reject.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { isMainThread, parentPort, Worker } from \"node:worker_threads\";\nimport { generateStateSchema } from \"../generate.js\";\nimport { APPLICATION_MANIFEST_FILENAME, buildManifest, compareStateSchema } from \"../manifest.js\";\nimport { loadSchemaCore } from \"../schemaCore.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface CliIo {\n readonly stdout: (text: string) => void;\n readonly stderr: (text: string) => void;\n readonly cwd: () => string;\n}\n\nconst USAGE =\n \"usage: wcs-schema emit <state.ts|state.js> [--mount=<path>] [--out=wcstack.manifest.json] [--merge] [--tsconfig=<path>] [--max-depth=5]\\n\" +\n \" wcs-schema check <state.ts|state.js> [--mount=<path>] [--manifest=wcstack.manifest.json] [--tsconfig=<path>] [--max-depth=5]\\n\";\n\nexport interface ParsedArgs {\n readonly command: \"emit\" | \"check\" | \"version\" | \"help\" | undefined;\n readonly file: string | undefined;\n readonly mount: string | null;\n readonly out: string;\n readonly manifest: string;\n readonly merge: boolean;\n readonly tsconfig: string | undefined;\n readonly maxDepth: number | undefined;\n readonly unknown: readonly string[];\n}\n\nexport function parseArgs(argv: readonly string[]): ParsedArgs {\n let command: ParsedArgs[\"command\"];\n let file: string | undefined;\n let mount: string | null = null;\n let out = APPLICATION_MANIFEST_FILENAME;\n let manifest = APPLICATION_MANIFEST_FILENAME;\n let merge = false;\n let tsconfig: string | undefined;\n let maxDepth: number | undefined;\n const unknown: string[] = [];\n for (const arg of argv) {\n if (arg === \"--version\" || arg === \"-v\") command ??= \"version\";\n else if (arg === \"--help\" || arg === \"-h\") command ??= \"help\";\n else if (arg.startsWith(\"--mount=\")) mount = arg.slice(\"--mount=\".length);\n else if (arg.startsWith(\"--state=\")) unknown.push(arg); // v2: 名前次元は撤去 — --mount=<path> へ\n else if (arg.startsWith(\"--out=\")) out = arg.slice(\"--out=\".length);\n else if (arg.startsWith(\"--manifest=\")) manifest = arg.slice(\"--manifest=\".length);\n else if (arg.startsWith(\"--tsconfig=\")) tsconfig = arg.slice(\"--tsconfig=\".length);\n else if (arg.startsWith(\"--max-depth=\")) maxDepth = Number(arg.slice(\"--max-depth=\".length));\n else if (arg === \"--merge\") merge = true;\n else if (arg.startsWith(\"-\")) unknown.push(arg);\n else if (command === undefined && (arg === \"emit\" || arg === \"check\")) command = arg;\n else if (file === undefined) file = arg;\n else unknown.push(arg);\n }\n return { command, file, mount, out, manifest, merge, tsconfig, maxDepth, unknown };\n}\n\nexport function main(argv: readonly string[], io: CliIo = defaultIo()): number {\n const args = parseArgs(argv);\n if (args.command === \"version\") {\n io.stdout(`${VERSION}\\n`);\n return 0;\n }\n if (args.command === \"help\") {\n io.stdout(USAGE);\n return 0;\n }\n if (args.command === undefined || args.file === undefined || args.unknown.length > 0) {\n if (args.unknown.some((arg) => arg.startsWith(\"--state=\"))) {\n io.stderr('--state was removed in v2 — there is a single state tree. Use --mount=<path> for a volume, or no flag for the root tree.\\n');\n } else if (args.unknown.length > 0) {\n io.stderr(`unknown argument(s): ${args.unknown.join(\" \")}\\n`);\n }\n io.stderr(USAGE);\n return 2;\n }\n if (args.maxDepth !== undefined && (!Number.isInteger(args.maxDepth) || args.maxDepth < 1)) {\n io.stderr(\"--max-depth must be a positive integer\\n\");\n return 2;\n }\n if (args.mount !== null) {\n // runtime(state の validateVolumeMountPath)と同条件: 空セグメント・ワイルドカードと\n // 予約文字($ # @ — 位置を問わず)を拒否し、数字先頭などはランタイム同様に受理する。\n // 旧 regex は `$` 先頭を受理し数字先頭を拒否していて runtime と両方向にずれていた\n const problem = findMountPathProblem(args.mount);\n if (problem !== null) {\n io.stderr(`--mount ${problem} (got \"${args.mount}\")\\n`);\n return 2;\n }\n }\n\n let generated;\n try {\n generated = generateStateSchema(resolve(io.cwd(), args.file), { tsconfig: args.tsconfig, maxDepth: args.maxDepth });\n } catch (e) {\n io.stderr(`${(e as Error).message}\\n`);\n return 2;\n }\n for (const warning of generated.warnings) io.stderr(`warning: ${warning}\\n`);\n\n return args.command === \"emit\" ? emit(args, generated.schema, io) : check(args, generated.schema, io);\n}\n\n/** runtime(validateVolumeMountPath)が raise する形なら理由を返す(妥当なら null)。 */\nfunction findMountPathProblem(mountPath: string): string | null {\n if (mountPath.length === 0) return \"requires a non-empty tree path\";\n for (const segment of mountPath.split(\".\")) {\n if (segment.length === 0) return \"path has an empty segment\";\n if (segment === \"*\") return \"path must be static (wildcards are not allowed)\";\n if (/[$#@]/.test(segment)) return \"path must not use reserved characters ($, #, @)\";\n }\n return null;\n}\n\nfunction emit(args: ParsedArgs, schema: ReturnType<typeof generateStateSchema>[\"schema\"], io: CliIo): number {\n const toStdout = args.out === \"-\";\n const outPath = toStdout ? undefined : resolve(io.cwd(), args.out);\n\n let existing: unknown;\n if ((args.merge || args.mount !== null) && outPath !== undefined && existsSync(outPath)) {\n try {\n existing = JSON.parse(readFileSync(outPath, \"utf8\"));\n } catch (e) {\n io.stderr(`cannot merge into ${args.out}: ${(e as Error).message}\\n`);\n return 2;\n }\n }\n\n const manifest = buildManifest(args.mount, schema, existing);\n const text = `${JSON.stringify(manifest, null, 2)}\\n`;\n\n // Self-check: the validator must accept what the generator wrote.\n const core = loadSchemaCore();\n const problems = core.validateManifestArtifact({ text, source: args.out });\n for (const d of problems.filter((p) => p.severity !== \"error\")) {\n io.stderr(`${d.severity} ${d.code} ${d.message}\\n`);\n }\n const errors = problems.filter((p) => p.severity === \"error\");\n if (errors.length > 0) {\n for (const d of errors) io.stderr(`error ${d.code} ${d.message}\\n`);\n io.stderr(`generated manifest failed its self-check (${errors.length} error(s)); nothing written\\n`);\n return 2;\n }\n\n if (toStdout) {\n io.stdout(text);\n return 0;\n }\n writeFileSync(outPath!, text, \"utf8\");\n io.stderr(`wrote ${args.out} (${args.mount === null ? \"state tree\" : `mount \"${args.mount}\"`})\\n`);\n return 0;\n}\n\nfunction check(args: ParsedArgs, schema: ReturnType<typeof generateStateSchema>[\"schema\"], io: CliIo): number {\n const manifestPath = resolve(io.cwd(), args.manifest);\n if (!existsSync(manifestPath)) {\n io.stderr(`cannot read ${args.manifest}: no such file (run \\`wcs-schema emit\\` first)\\n`);\n return 2;\n }\n const slot = args.mount === null ? \"state tree\" : `mount \"${args.mount}\"`;\n // 誘導コマンドは check と同じスロットを指すこと(--mount 抜きだとルートを差し替えてしまう)\n const mountFlag = args.mount === null ? \"\" : ` --mount=${args.mount}`;\n const comparison = compareStateSchema(readFileSync(manifestPath, \"utf8\"), args.mount, schema);\n switch (comparison.kind) {\n case \"same\":\n io.stderr(`${args.manifest}: ${slot} is up to date\\n`);\n return 0;\n case \"missing-state\":\n io.stderr(`${args.manifest}: ${slot} has no stateSchema (run \\`wcs-schema emit --merge${mountFlag}\\`)\\n`);\n return 2;\n case \"v1-manifest\":\n io.stderr(`${args.manifest}: schemaVersion 1 manifest (states[name]) — the name dimension was removed in v2. Regenerate with \\`wcs-schema emit --out=${args.manifest}\\` (single stateSchema, schemaVersion 2)\\n`);\n return 2;\n case \"broken\":\n io.stderr(`${args.manifest}: broken JSON: ${comparison.message}\\n`);\n return 2;\n case \"differs\":\n io.stderr(`${args.manifest}: ${slot} is out of date (${comparison.changes.length} change(s)):\\n`);\n for (const change of comparison.changes) io.stderr(` ${change}\\n`);\n io.stderr(`run \\`wcs-schema emit --merge${mountFlag} --out=${args.manifest}\\` to update it\\n`);\n return 1;\n }\n}\n\n/* v8 ignore start -- process plumbing; exercised by running the built bin, not by unit tests */\nfunction defaultIo(): CliIo {\n return {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n cwd: () => process.cwd(),\n };\n}\n\n// Entry point when executed as the `wcs-schema` bin (rollup emits dist/wcs-schema.mjs\n// with a shebang). Under vitest this module is imported, and `process.argv[1]` is\n// vitest's own entry, so the branch is not taken.\nconst invokedAsBin = typeof process !== \"undefined\"\n && Array.isArray(process.argv)\n && /wcs-schema(\\.mjs)?$/.test(process.argv[1] ?? \"\");\nif (invokedAsBin) {\n if (isMainThread) {\n // The TypeScript checker recurses once per getter that reads `this` in a state literal with a top-level spread\n // (program.ts): a state of a hundred getters ran out of the main thread's stack (an outside evaluation, a tax\n // return draft). The command runs on a worker thread with a larger one, and its exit code comes back.\n const worker = new Worker(fileURLToPath(import.meta.url), { argv: process.argv.slice(2), resourceLimits: { stackSizeMb: 256 } });\n worker.on(\"message\", (code: number) => { process.exitCode = code; });\n worker.on(\"error\", (e) => {\n process.stderr.write(`${e.stack ?? e}\n`);\n process.exitCode = 2;\n });\n } else {\n parentPort!.postMessage(main(process.argv.slice(2)));\n }\n}\n/* v8 ignore stop */\n"],"names":[],"mappings":"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"}
|
package/dist/wcs-tsc.mjs
CHANGED
|
@@ -5,7 +5,27 @@ import { tmpdir } from 'node:os';
|
|
|
5
5
|
import { dirname, join, isAbsolute, resolve, basename } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* typescriptSupport.ts — which `typescript` this package can run on.
|
|
10
|
+
*
|
|
11
|
+
* Both commands drive the JavaScript compiler API of TypeScript 5 and 6:
|
|
12
|
+
* `wcs-schema` through `import ts from "typescript"`, `wcs-tsc` by running the
|
|
13
|
+
* project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the
|
|
14
|
+
* native compiler) publishes neither — its `typescript` export is
|
|
15
|
+
* `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both
|
|
16
|
+
* refuse it by name instead of failing on what is missing. TypeScript 7 reads other
|
|
17
|
+
* file types through content mappers (7.1); this package does not provide one yet.
|
|
18
|
+
*/
|
|
19
|
+
/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */
|
|
20
|
+
function unsupportedTypeScript(version) {
|
|
21
|
+
return Number.parseInt(version ?? "", 10) >= 7 ? version : undefined;
|
|
22
|
+
}
|
|
23
|
+
/** The refusal both commands report (exit code 2), without a trailing newline. */
|
|
24
|
+
function unsupportedTypeScriptMessage(version) {
|
|
25
|
+
return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var version = "4.6.1";
|
|
9
29
|
var pkg = {
|
|
10
30
|
version: version};
|
|
11
31
|
|
|
@@ -34,12 +54,13 @@ const VERSION = pkg.version;
|
|
|
34
54
|
* `checkJs`), run with a temporary config that extends it and
|
|
35
55
|
* adds them, instead of only warning.
|
|
36
56
|
*
|
|
37
|
-
* Peers: `typescript` (required
|
|
38
|
-
*
|
|
39
|
-
*
|
|
57
|
+
* Peers: `typescript` (required, 5 or 6 — TypeScript 7 has no lib/tsc.js, see
|
|
58
|
+
* typescriptSupport.ts), `@volar/typescript` + `@volar/language-core` (optional —
|
|
59
|
+
* only this command needs them). Resolved from the project first, then from this
|
|
60
|
+
* package's own location.
|
|
40
61
|
*
|
|
41
62
|
* Exit codes: tsc's own (0 clean / 1 type errors / 2 usage) — plus 2 when the peers
|
|
42
|
-
* are missing or the arguments are invalid.
|
|
63
|
+
* are missing or unsupported, or the arguments are invalid.
|
|
43
64
|
*/
|
|
44
65
|
const USAGE = "usage: wcs-tsc [--url-imports=any|error] [--wcs-defaults] [tsc arguments...]\n" +
|
|
45
66
|
" e.g. wcs-tsc --noEmit wcs-tsc -p tsconfig.json --noEmit\n";
|
|
@@ -195,6 +216,15 @@ function main(argv, io = defaultIo(), deps = defaultDeps) {
|
|
|
195
216
|
return 2;
|
|
196
217
|
}
|
|
197
218
|
const cwd = io.cwd();
|
|
219
|
+
// TypeScript 7 resolves as `typescript` but has no lib/tsc.js: name it rather than say typescript is missing.
|
|
220
|
+
const tsPackagePath = deps.resolve("typescript/package.json", cwd);
|
|
221
|
+
const unsupported = tsPackagePath === undefined
|
|
222
|
+
? undefined
|
|
223
|
+
: unsupportedTypeScript(deps.load(tsPackagePath).version);
|
|
224
|
+
if (unsupported !== undefined) {
|
|
225
|
+
io.stderr(`wcs-tsc: ${unsupportedTypeScriptMessage(unsupported)}\n`);
|
|
226
|
+
return 2;
|
|
227
|
+
}
|
|
198
228
|
const runTscPath = deps.resolve("@volar/typescript/lib/quickstart/runTsc.js", cwd);
|
|
199
229
|
if (runTscPath === undefined) {
|
|
200
230
|
io.stderr("wcs-tsc needs @volar/typescript (an optional peer): npm i -D @volar/typescript@~2.4.0 @volar/language-core@~2.4.0\n");
|
|
@@ -203,7 +233,7 @@ function main(argv, io = defaultIo(), deps = defaultDeps) {
|
|
|
203
233
|
const tscPath = deps.resolve("typescript/lib/tsc.js", cwd);
|
|
204
234
|
const tsApiPath = deps.resolve("typescript", cwd);
|
|
205
235
|
if (tscPath === undefined || tsApiPath === undefined) {
|
|
206
|
-
io.stderr("wcs-tsc needs typescript (a peer): npm i -D typescript\n");
|
|
236
|
+
io.stderr("wcs-tsc needs typescript (a peer): npm i -D typescript@6\n");
|
|
207
237
|
return 2;
|
|
208
238
|
}
|
|
209
239
|
const corePath = tscCoreCandidates(import.meta.url).find((p) => existsSync(p));
|
package/dist/wcs-tsc.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wcs-tsc.mjs","sources":["../../src/version.ts","../../src/cli/wcsTsc.ts"],"sourcesContent":["import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n","/**\n * wcsTsc.ts — the `wcs-tsc` command: `tsc` over `.html` files.\n *\n * wcs-tsc [--url-imports=any|error] [--wcs-defaults] [tsc arguments...]\n *\n * Every `<wcs-state>` inline `<script type=\"module\">` is mapped through the same\n * Volar language plugin the VS Code extension uses (dist/tsc-core.cjs, built from\n * vscode-wcs), so `this.coutn++` fails CI with a `file.html(line,col): error TS2339`\n * exactly where the editor underlines it. The mechanism is vue-tsc's:\n * `@volar/typescript`'s `runTsc` patches the `typescript/lib/tsc.js` the project\n * already has to accept `.html` and to build the program through the plugin.\n *\n * Options\n * --url-imports=any (default) treat every `https://` / `http://` module import\n * as `any` — buildless pages import from a CDN, and tsc has\n * nothing to resolve those against. `@wcstack/state` URL\n * imports are stripped by the plugin and typed by its preamble.\n * --url-imports=error leave URL imports alone (TS2307 for each).\n * --wcs-defaults when the project tsconfig lacks what the check needs\n * (`include` covering `**\\/*.html`, `noImplicitThis`, `allowJs`,\n * `checkJs`), run with a temporary config that extends it and\n * adds them, instead of only warning.\n *\n * Peers: `typescript` (required), `@volar/typescript` + `@volar/language-core`\n * (optional — only this command needs them). Resolved from the project first,\n * then from this package's own location.\n *\n * Exit codes: tsc's own (0 clean / 1 type errors / 2 usage) — plus 2 when the peers\n * are missing or the arguments are invalid.\n */\n\nimport { existsSync, mkdtempSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { VERSION } from \"../version.js\";\n\nexport interface TscIo {\n readonly stdout: (text: string) => void;\n readonly stderr: (text: string) => void;\n readonly cwd: () => string;\n}\n\nexport interface TscArgs {\n readonly urlImports: \"any\" | \"error\";\n readonly wcsDefaults: boolean;\n readonly help: boolean;\n readonly version: boolean;\n /** Everything else, handed to tsc verbatim. */\n readonly tscArgs: readonly string[];\n readonly invalid: readonly string[];\n}\n\nconst USAGE =\n \"usage: wcs-tsc [--url-imports=any|error] [--wcs-defaults] [tsc arguments...]\\n\" +\n \" e.g. wcs-tsc --noEmit wcs-tsc -p tsconfig.json --noEmit\\n\";\n\nexport function parseTscArgs(argv: readonly string[]): TscArgs {\n let urlImports: TscArgs[\"urlImports\"] = \"any\";\n let wcsDefaults = false;\n let help = false;\n let version = false;\n const tscArgs: string[] = [];\n const invalid: string[] = [];\n for (const arg of argv) {\n if (arg.startsWith(\"--url-imports=\")) {\n const value = arg.slice(\"--url-imports=\".length);\n if (value === \"any\" || value === \"error\") urlImports = value;\n else invalid.push(arg);\n } else if (arg === \"--wcs-defaults\") wcsDefaults = true;\n else if (arg === \"--wcs-help\") help = true;\n else if (arg === \"--wcs-version\") version = true;\n else tscArgs.push(arg);\n }\n return { urlImports, wcsDefaults, help, version, tscArgs, invalid };\n}\n\n/** Resolve a module from the project (cwd) first, then from this package. */\nexport function resolveFromProject(id: string, cwd: string, fromUrl: string = import.meta.url): string | undefined {\n for (const base of [join(cwd, \"__wcs_tsc_resolve__.js\"), fromUrl]) {\n try {\n return createRequire(base).resolve(id);\n } catch {\n /* try the next base */\n }\n }\n return undefined;\n}\n\n/** The tsconfig tsc will read: `-p/--project` (a file or a directory), else ./tsconfig.json. */\nexport function findProjectConfig(tscArgs: readonly string[], cwd: string): { path: string; index: number } | undefined {\n for (let i = 0; i < tscArgs.length; i++) {\n const arg = tscArgs[i];\n let value: string | undefined;\n let index = i;\n if (arg === \"-p\" || arg === \"--project\") {\n value = tscArgs[i + 1];\n index = i + 1;\n } else if (arg.startsWith(\"--project=\") || arg.startsWith(\"-p=\")) {\n value = arg.slice(arg.indexOf(\"=\") + 1);\n }\n if (value === undefined) continue;\n let path = isAbsolute(value) ? value : resolve(cwd, value);\n if (existsSync(path) && !path.endsWith(\".json\")) path = join(path, \"tsconfig.json\");\n return { path, index };\n }\n const fallback = join(cwd, \"tsconfig.json\");\n return existsSync(fallback) ? { path: fallback, index: -1 } : undefined;\n}\n\nexport interface ConfigAudit {\n /** Human-readable names of what is missing (empty = ready). */\n readonly missing: readonly string[];\n readonly include: readonly string[] | undefined;\n readonly compilerOptions: Readonly<Record<string, unknown>>;\n /** No `target` / `lib` at all (tsc defaults to ES5, whose lib lacks the Map / Set / Promise types the `this` preamble uses). */\n readonly needsTarget: boolean;\n}\n\n/**\n * Check the project tsconfig for what the HTML check needs. `include` is only\n * checked when present (tsc's default `**\\/*` already picks `.html` up once the\n * extension is registered); a `files`-only config never sees HTML.\n */\nexport function auditConfig(configPath: string, ts: TypeScriptLike): ConfigAudit {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n const raw = (read.config ?? {}) as { include?: unknown; files?: unknown; compilerOptions?: Record<string, unknown> };\n const parsed = ts.parseJsonConfigFileContent(read.config ?? {}, ts.sys, toPosix(dirname(configPath)), undefined, toPosix(configPath));\n const options = parsed.options as Record<string, unknown>;\n const missing: string[] = [];\n const include = Array.isArray(raw.include) ? (raw.include as string[]) : undefined;\n const coversHtml = (patterns: readonly string[]): boolean => patterns.some((p) => /\\.html?$|\\*\\*\\/\\*$|\\*$/.test(p) && !/\\.(ts|js|tsx|jsx|mts|cts|mjs|cjs)$/.test(p));\n if (include !== undefined && !coversHtml(include)) missing.push('include: \"**/*.html\"');\n else if (include === undefined && Array.isArray(raw.files)) missing.push('include: \"**/*.html\" (a files-only config never sees HTML)');\n // `strict: true` implies noImplicitThis unless it is explicitly turned off.\n const noImplicitThis = options.noImplicitThis ?? options.strict === true;\n if (noImplicitThis !== true) missing.push(\"compilerOptions.noImplicitThis: true\");\n if (options.allowJs !== true) missing.push(\"compilerOptions.allowJs: true\");\n if (options.checkJs !== true) missing.push(\"compilerOptions.checkJs: true\");\n // With neither target nor lib, tsc's ES5 default lib has no Map / Set / Promise:\n // the preamble's `_WcsThis<T>` degrades silently and `this.typo` stops being an error.\n const target = options.target as number | undefined;\n const needsTarget = options.lib === undefined && (target === undefined || target < ts.ScriptTarget.ES2015);\n if (needsTarget) missing.push('compilerOptions.target: \"ES2015\" or later (the this-typing preamble uses Map / Set / Promise)');\n return { missing, include, compilerOptions: raw.compilerOptions ?? {}, needsTarget };\n}\n\n/** Write a temporary config next to the project one that extends it with the missing pieces. */\nexport function writeDefaultsConfig(configPath: string, audit: ConfigAudit): string {\n const dir = dirname(configPath);\n const tempPath = join(dir, `.wcs-tsc.${process.pid}.tsconfig.json`);\n const include = audit.include !== undefined ? [...audit.include, \"**/*.html\"] : [\"**/*\", \"**/*.html\"];\n const config = {\n extends: `./${basename(configPath)}`,\n compilerOptions: {\n allowJs: true,\n checkJs: true,\n noImplicitThis: true,\n // only when the project set neither target nor lib — never override an explicit choice\n ...(audit.needsTarget ? { target: \"ESNext\" } : {}),\n },\n include,\n };\n writeFileSync(tempPath, JSON.stringify(config, null, 2), \"utf8\");\n return tempPath;\n}\n\n/** Ambient shorthand modules: every `http(s)://` import types as `any`. */\nexport function writeUrlImportsDeclaration(): string {\n const dir = mkdtempSync(join(tmpdir(), \"wcs-tsc-\"));\n const path = join(dir, \"url-imports.d.ts\");\n writeFileSync(path, `// wcs-tsc --url-imports=any: CDN module imports resolve to any.\\ndeclare module \"https://*\";\\ndeclare module \"http://*\";\\n`, \"utf8\");\n return path;\n}\n\nexport interface TypeScriptLike {\n readConfigFile(path: string, readFile: (path: string) => string | undefined): { config?: unknown; error?: unknown };\n parseJsonConfigFileContent(json: unknown, host: unknown, basePath: string, existing?: unknown, configFileName?: string): { options: unknown };\n sys: { readFile(path: string): string | undefined };\n ScriptTarget: { ES2015: number };\n}\n\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction tscCoreCandidates(fromUrl: string): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, \"tsc-core.cjs\"), join(here, \"..\", \"dist\", \"tsc-core.cjs\"), join(here, \"..\", \"..\", \"dist\", \"tsc-core.cjs\")];\n}\n\n/** Module resolution / loading, injectable so the whole flow can be tested in-process. */\nexport interface MainDeps {\n readonly resolve: (id: string, cwd: string) => string | undefined;\n readonly load: (path: string) => unknown;\n}\n\n/* v8 ignore start -- the real resolver / loader; tests inject fakes to keep tsc from exiting the process */\nconst defaultDeps: MainDeps = {\n resolve: (id, cwd) => resolveFromProject(id, cwd),\n load: (path) => createRequire(import.meta.url)(path),\n};\n/* v8 ignore stop */\n\n/**\n * Prepare and run. Returns an exit code only on the paths that do not reach tsc;\n * tsc itself calls `process.exit` with its own code.\n */\nexport function main(argv: readonly string[], io: TscIo = defaultIo(), deps: MainDeps = defaultDeps): number {\n const args = parseTscArgs(argv);\n if (args.version) {\n io.stdout(`${VERSION}\\n`);\n return 0;\n }\n if (args.help) {\n io.stdout(USAGE);\n return 0;\n }\n if (args.invalid.length > 0) {\n io.stderr(`invalid option(s): ${args.invalid.join(\" \")}\\n${USAGE}`);\n return 2;\n }\n const cwd = io.cwd();\n\n const runTscPath = deps.resolve(\"@volar/typescript/lib/quickstart/runTsc.js\", cwd);\n if (runTscPath === undefined) {\n io.stderr(\"wcs-tsc needs @volar/typescript (an optional peer): npm i -D @volar/typescript@~2.4.0 @volar/language-core@~2.4.0\\n\");\n return 2;\n }\n const tscPath = deps.resolve(\"typescript/lib/tsc.js\", cwd);\n const tsApiPath = deps.resolve(\"typescript\", cwd);\n if (tscPath === undefined || tsApiPath === undefined) {\n io.stderr(\"wcs-tsc needs typescript (a peer): npm i -D typescript\\n\");\n return 2;\n }\n const corePath = tscCoreCandidates(import.meta.url).find((p) => existsSync(p));\n /* v8 ignore next 4 -- tests run after `npm run build`, so the bundle is always present */\n if (corePath === undefined) {\n io.stderr(\"wcs-tsc: dist/tsc-core.cjs not found — run `npm run build` in packages/typescript\\n\");\n return 2;\n }\n\n const ts = deps.load(tsApiPath) as TypeScriptLike;\n const tscArgs = [...args.tscArgs];\n const temporaries: string[] = [];\n\n const project = findProjectConfig(tscArgs, cwd);\n if (project !== undefined && existsSync(project.path)) {\n const audit = auditConfig(project.path, ts);\n if (audit.missing.length > 0) {\n if (args.wcsDefaults) {\n const tempConfig = writeDefaultsConfig(project.path, audit);\n temporaries.push(tempConfig);\n if (project.index === -1) tscArgs.push(\"-p\", tempConfig);\n else tscArgs[project.index] = tempConfig;\n io.stderr(`wcs-tsc: running with a temporary config that adds ${audit.missing.join(\", \")} (--wcs-defaults)\\n`);\n } else {\n io.stderr(`wcs-tsc: ${project.path} is missing ${audit.missing.join(\", \")} — HTML may not be checked; pass --wcs-defaults or add them\\n`);\n }\n }\n }\n\n const declaration = args.urlImports === \"any\" ? writeUrlImportsDeclaration() : undefined;\n if (declaration !== undefined) temporaries.push(declaration);\n\n const { createWcsLanguagePlugin } = deps.load(corePath) as {\n createWcsLanguagePlugin: (stateTagName?: string, options?: { mode: \"tsc\" }) => unknown;\n };\n const { runTsc } = deps.load(runTscPath) as {\n runTsc: (\n tscPath: string,\n options: { extraSupportedExtensions: string[]; extraExtensionsToRemove: string[] },\n getLanguagePlugins: (ts: unknown, options: { rootNames: readonly string[] }) => unknown[],\n ) => unknown;\n };\n\n const cleanup = (): void => {\n for (const file of temporaries.splice(0)) {\n /* v8 ignore next -- a temp file that vanished before cleanup is not an error */\n try { unlinkSync(file); } catch { /* best effort */ }\n }\n };\n process.once(\"exit\", cleanup);\n\n // tsc reads its arguments from process.argv when typescript/lib/tsc.js loads.\n process.argv = [process.argv[0], tscPath, ...tscArgs];\n runTsc(\n tscPath,\n { extraSupportedExtensions: [\".html\"], extraExtensionsToRemove: [] },\n (_ts, options) => {\n if (declaration !== undefined) (options.rootNames as string[]).push(declaration);\n // tsc mode: proxyCreateProgram supports one service script per file, so every\n // <wcs-state> block of a page is combined into one virtual TS module.\n return [createWcsLanguagePlugin(\"wcs-state\", { mode: \"tsc\" })];\n },\n );\n // Reached only when runTsc returns (tsc normally exits the process itself).\n cleanup();\n return 0;\n}\n\n/* v8 ignore start -- process plumbing; exercised by running the built bin */\nfunction defaultIo(): TscIo {\n return {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n cwd: () => process.cwd(),\n };\n}\n\nconst invokedAsBin = typeof process !== \"undefined\"\n && Array.isArray(process.argv)\n && /wcs-tsc(\\.mjs)?$/.test(process.argv[1] ?? \"\");\nif (invokedAsBin) {\n const code = main(process.argv.slice(2));\n if (code !== 0) process.exit(code);\n}\n/* v8 ignore stop */\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wcs-tsc.mjs","sources":["../../src/typescriptSupport.ts","../../src/version.ts","../../src/cli/wcsTsc.ts"],"sourcesContent":["/**\n * typescriptSupport.ts — which `typescript` this package can run on.\n *\n * Both commands drive the JavaScript compiler API of TypeScript 5 and 6:\n * `wcs-schema` through `import ts from \"typescript\"`, `wcs-tsc` by running the\n * project's `typescript/lib/tsc.js` through Volar's `runTsc`. TypeScript 7 (the\n * native compiler) publishes neither — its `typescript` export is\n * `{ version, versionMajorMinor }` and its `exports` has no `./lib/tsc` — so both\n * refuse it by name instead of failing on what is missing. TypeScript 7 reads other\n * file types through content mappers (7.1); this package does not provide one yet.\n */\n\n/** The version, when it is one neither command can run on (7 and later); otherwise `undefined`. */\nexport function unsupportedTypeScript(version: string | undefined): string | undefined {\n return Number.parseInt(version ?? \"\", 10) >= 7 ? version : undefined;\n}\n\n/** The refusal both commands report (exit code 2), without a trailing newline. */\nexport function unsupportedTypeScriptMessage(version: string): string {\n return `@wcstack/typescript runs on TypeScript 5 or 6, and the project has TypeScript ${version}, which has no JavaScript compiler API: npm i -D typescript@6`;\n}\n","import pkg from \"../package.json\";\n\nexport const VERSION: string = pkg.version;\n","/**\n * wcsTsc.ts — the `wcs-tsc` command: `tsc` over `.html` files.\n *\n * wcs-tsc [--url-imports=any|error] [--wcs-defaults] [tsc arguments...]\n *\n * Every `<wcs-state>` inline `<script type=\"module\">` is mapped through the same\n * Volar language plugin the VS Code extension uses (dist/tsc-core.cjs, built from\n * vscode-wcs), so `this.coutn++` fails CI with a `file.html(line,col): error TS2339`\n * exactly where the editor underlines it. The mechanism is vue-tsc's:\n * `@volar/typescript`'s `runTsc` patches the `typescript/lib/tsc.js` the project\n * already has to accept `.html` and to build the program through the plugin.\n *\n * Options\n * --url-imports=any (default) treat every `https://` / `http://` module import\n * as `any` — buildless pages import from a CDN, and tsc has\n * nothing to resolve those against. `@wcstack/state` URL\n * imports are stripped by the plugin and typed by its preamble.\n * --url-imports=error leave URL imports alone (TS2307 for each).\n * --wcs-defaults when the project tsconfig lacks what the check needs\n * (`include` covering `**\\/*.html`, `noImplicitThis`, `allowJs`,\n * `checkJs`), run with a temporary config that extends it and\n * adds them, instead of only warning.\n *\n * Peers: `typescript` (required, 5 or 6 — TypeScript 7 has no lib/tsc.js, see\n * typescriptSupport.ts), `@volar/typescript` + `@volar/language-core` (optional —\n * only this command needs them). Resolved from the project first, then from this\n * package's own location.\n *\n * Exit codes: tsc's own (0 clean / 1 type errors / 2 usage) — plus 2 when the peers\n * are missing or unsupported, or the arguments are invalid.\n */\n\nimport { existsSync, mkdtempSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { unsupportedTypeScript, unsupportedTypeScriptMessage } from \"../typescriptSupport.js\";\nimport { VERSION } from \"../version.js\";\n\nexport interface TscIo {\n readonly stdout: (text: string) => void;\n readonly stderr: (text: string) => void;\n readonly cwd: () => string;\n}\n\nexport interface TscArgs {\n readonly urlImports: \"any\" | \"error\";\n readonly wcsDefaults: boolean;\n readonly help: boolean;\n readonly version: boolean;\n /** Everything else, handed to tsc verbatim. */\n readonly tscArgs: readonly string[];\n readonly invalid: readonly string[];\n}\n\nconst USAGE =\n \"usage: wcs-tsc [--url-imports=any|error] [--wcs-defaults] [tsc arguments...]\\n\" +\n \" e.g. wcs-tsc --noEmit wcs-tsc -p tsconfig.json --noEmit\\n\";\n\nexport function parseTscArgs(argv: readonly string[]): TscArgs {\n let urlImports: TscArgs[\"urlImports\"] = \"any\";\n let wcsDefaults = false;\n let help = false;\n let version = false;\n const tscArgs: string[] = [];\n const invalid: string[] = [];\n for (const arg of argv) {\n if (arg.startsWith(\"--url-imports=\")) {\n const value = arg.slice(\"--url-imports=\".length);\n if (value === \"any\" || value === \"error\") urlImports = value;\n else invalid.push(arg);\n } else if (arg === \"--wcs-defaults\") wcsDefaults = true;\n else if (arg === \"--wcs-help\") help = true;\n else if (arg === \"--wcs-version\") version = true;\n else tscArgs.push(arg);\n }\n return { urlImports, wcsDefaults, help, version, tscArgs, invalid };\n}\n\n/** Resolve a module from the project (cwd) first, then from this package. */\nexport function resolveFromProject(id: string, cwd: string, fromUrl: string = import.meta.url): string | undefined {\n for (const base of [join(cwd, \"__wcs_tsc_resolve__.js\"), fromUrl]) {\n try {\n return createRequire(base).resolve(id);\n } catch {\n /* try the next base */\n }\n }\n return undefined;\n}\n\n/** The tsconfig tsc will read: `-p/--project` (a file or a directory), else ./tsconfig.json. */\nexport function findProjectConfig(tscArgs: readonly string[], cwd: string): { path: string; index: number } | undefined {\n for (let i = 0; i < tscArgs.length; i++) {\n const arg = tscArgs[i];\n let value: string | undefined;\n let index = i;\n if (arg === \"-p\" || arg === \"--project\") {\n value = tscArgs[i + 1];\n index = i + 1;\n } else if (arg.startsWith(\"--project=\") || arg.startsWith(\"-p=\")) {\n value = arg.slice(arg.indexOf(\"=\") + 1);\n }\n if (value === undefined) continue;\n let path = isAbsolute(value) ? value : resolve(cwd, value);\n if (existsSync(path) && !path.endsWith(\".json\")) path = join(path, \"tsconfig.json\");\n return { path, index };\n }\n const fallback = join(cwd, \"tsconfig.json\");\n return existsSync(fallback) ? { path: fallback, index: -1 } : undefined;\n}\n\nexport interface ConfigAudit {\n /** Human-readable names of what is missing (empty = ready). */\n readonly missing: readonly string[];\n readonly include: readonly string[] | undefined;\n readonly compilerOptions: Readonly<Record<string, unknown>>;\n /** No `target` / `lib` at all (tsc defaults to ES5, whose lib lacks the Map / Set / Promise types the `this` preamble uses). */\n readonly needsTarget: boolean;\n}\n\n/**\n * Check the project tsconfig for what the HTML check needs. `include` is only\n * checked when present (tsc's default `**\\/*` already picks `.html` up once the\n * extension is registered); a `files`-only config never sees HTML.\n */\nexport function auditConfig(configPath: string, ts: TypeScriptLike): ConfigAudit {\n const read = ts.readConfigFile(configPath, ts.sys.readFile);\n const raw = (read.config ?? {}) as { include?: unknown; files?: unknown; compilerOptions?: Record<string, unknown> };\n const parsed = ts.parseJsonConfigFileContent(read.config ?? {}, ts.sys, toPosix(dirname(configPath)), undefined, toPosix(configPath));\n const options = parsed.options as Record<string, unknown>;\n const missing: string[] = [];\n const include = Array.isArray(raw.include) ? (raw.include as string[]) : undefined;\n const coversHtml = (patterns: readonly string[]): boolean => patterns.some((p) => /\\.html?$|\\*\\*\\/\\*$|\\*$/.test(p) && !/\\.(ts|js|tsx|jsx|mts|cts|mjs|cjs)$/.test(p));\n if (include !== undefined && !coversHtml(include)) missing.push('include: \"**/*.html\"');\n else if (include === undefined && Array.isArray(raw.files)) missing.push('include: \"**/*.html\" (a files-only config never sees HTML)');\n // `strict: true` implies noImplicitThis unless it is explicitly turned off.\n const noImplicitThis = options.noImplicitThis ?? options.strict === true;\n if (noImplicitThis !== true) missing.push(\"compilerOptions.noImplicitThis: true\");\n if (options.allowJs !== true) missing.push(\"compilerOptions.allowJs: true\");\n if (options.checkJs !== true) missing.push(\"compilerOptions.checkJs: true\");\n // With neither target nor lib, tsc's ES5 default lib has no Map / Set / Promise:\n // the preamble's `_WcsThis<T>` degrades silently and `this.typo` stops being an error.\n const target = options.target as number | undefined;\n const needsTarget = options.lib === undefined && (target === undefined || target < ts.ScriptTarget.ES2015);\n if (needsTarget) missing.push('compilerOptions.target: \"ES2015\" or later (the this-typing preamble uses Map / Set / Promise)');\n return { missing, include, compilerOptions: raw.compilerOptions ?? {}, needsTarget };\n}\n\n/** Write a temporary config next to the project one that extends it with the missing pieces. */\nexport function writeDefaultsConfig(configPath: string, audit: ConfigAudit): string {\n const dir = dirname(configPath);\n const tempPath = join(dir, `.wcs-tsc.${process.pid}.tsconfig.json`);\n const include = audit.include !== undefined ? [...audit.include, \"**/*.html\"] : [\"**/*\", \"**/*.html\"];\n const config = {\n extends: `./${basename(configPath)}`,\n compilerOptions: {\n allowJs: true,\n checkJs: true,\n noImplicitThis: true,\n // only when the project set neither target nor lib — never override an explicit choice\n ...(audit.needsTarget ? { target: \"ESNext\" } : {}),\n },\n include,\n };\n writeFileSync(tempPath, JSON.stringify(config, null, 2), \"utf8\");\n return tempPath;\n}\n\n/** Ambient shorthand modules: every `http(s)://` import types as `any`. */\nexport function writeUrlImportsDeclaration(): string {\n const dir = mkdtempSync(join(tmpdir(), \"wcs-tsc-\"));\n const path = join(dir, \"url-imports.d.ts\");\n writeFileSync(path, `// wcs-tsc --url-imports=any: CDN module imports resolve to any.\\ndeclare module \"https://*\";\\ndeclare module \"http://*\";\\n`, \"utf8\");\n return path;\n}\n\nexport interface TypeScriptLike {\n readConfigFile(path: string, readFile: (path: string) => string | undefined): { config?: unknown; error?: unknown };\n parseJsonConfigFileContent(json: unknown, host: unknown, basePath: string, existing?: unknown, configFileName?: string): { options: unknown };\n sys: { readFile(path: string): string | undefined };\n ScriptTarget: { ES2015: number };\n}\n\nfunction toPosix(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction tscCoreCandidates(fromUrl: string): string[] {\n const here = dirname(fileURLToPath(fromUrl));\n return [join(here, \"tsc-core.cjs\"), join(here, \"..\", \"dist\", \"tsc-core.cjs\"), join(here, \"..\", \"..\", \"dist\", \"tsc-core.cjs\")];\n}\n\n/** Module resolution / loading, injectable so the whole flow can be tested in-process. */\nexport interface MainDeps {\n readonly resolve: (id: string, cwd: string) => string | undefined;\n readonly load: (path: string) => unknown;\n}\n\n/* v8 ignore start -- the real resolver / loader; tests inject fakes to keep tsc from exiting the process */\nconst defaultDeps: MainDeps = {\n resolve: (id, cwd) => resolveFromProject(id, cwd),\n load: (path) => createRequire(import.meta.url)(path),\n};\n/* v8 ignore stop */\n\n/**\n * Prepare and run. Returns an exit code only on the paths that do not reach tsc;\n * tsc itself calls `process.exit` with its own code.\n */\nexport function main(argv: readonly string[], io: TscIo = defaultIo(), deps: MainDeps = defaultDeps): number {\n const args = parseTscArgs(argv);\n if (args.version) {\n io.stdout(`${VERSION}\\n`);\n return 0;\n }\n if (args.help) {\n io.stdout(USAGE);\n return 0;\n }\n if (args.invalid.length > 0) {\n io.stderr(`invalid option(s): ${args.invalid.join(\" \")}\\n${USAGE}`);\n return 2;\n }\n const cwd = io.cwd();\n\n // TypeScript 7 resolves as `typescript` but has no lib/tsc.js: name it rather than say typescript is missing.\n const tsPackagePath = deps.resolve(\"typescript/package.json\", cwd);\n const unsupported = tsPackagePath === undefined\n ? undefined\n : unsupportedTypeScript((deps.load(tsPackagePath) as { version?: string }).version);\n if (unsupported !== undefined) {\n io.stderr(`wcs-tsc: ${unsupportedTypeScriptMessage(unsupported)}\\n`);\n return 2;\n }\n\n const runTscPath = deps.resolve(\"@volar/typescript/lib/quickstart/runTsc.js\", cwd);\n if (runTscPath === undefined) {\n io.stderr(\"wcs-tsc needs @volar/typescript (an optional peer): npm i -D @volar/typescript@~2.4.0 @volar/language-core@~2.4.0\\n\");\n return 2;\n }\n const tscPath = deps.resolve(\"typescript/lib/tsc.js\", cwd);\n const tsApiPath = deps.resolve(\"typescript\", cwd);\n if (tscPath === undefined || tsApiPath === undefined) {\n io.stderr(\"wcs-tsc needs typescript (a peer): npm i -D typescript@6\\n\");\n return 2;\n }\n const corePath = tscCoreCandidates(import.meta.url).find((p) => existsSync(p));\n /* v8 ignore next 4 -- tests run after `npm run build`, so the bundle is always present */\n if (corePath === undefined) {\n io.stderr(\"wcs-tsc: dist/tsc-core.cjs not found — run `npm run build` in packages/typescript\\n\");\n return 2;\n }\n\n const ts = deps.load(tsApiPath) as TypeScriptLike;\n const tscArgs = [...args.tscArgs];\n const temporaries: string[] = [];\n\n const project = findProjectConfig(tscArgs, cwd);\n if (project !== undefined && existsSync(project.path)) {\n const audit = auditConfig(project.path, ts);\n if (audit.missing.length > 0) {\n if (args.wcsDefaults) {\n const tempConfig = writeDefaultsConfig(project.path, audit);\n temporaries.push(tempConfig);\n if (project.index === -1) tscArgs.push(\"-p\", tempConfig);\n else tscArgs[project.index] = tempConfig;\n io.stderr(`wcs-tsc: running with a temporary config that adds ${audit.missing.join(\", \")} (--wcs-defaults)\\n`);\n } else {\n io.stderr(`wcs-tsc: ${project.path} is missing ${audit.missing.join(\", \")} — HTML may not be checked; pass --wcs-defaults or add them\\n`);\n }\n }\n }\n\n const declaration = args.urlImports === \"any\" ? writeUrlImportsDeclaration() : undefined;\n if (declaration !== undefined) temporaries.push(declaration);\n\n const { createWcsLanguagePlugin } = deps.load(corePath) as {\n createWcsLanguagePlugin: (stateTagName?: string, options?: { mode: \"tsc\" }) => unknown;\n };\n const { runTsc } = deps.load(runTscPath) as {\n runTsc: (\n tscPath: string,\n options: { extraSupportedExtensions: string[]; extraExtensionsToRemove: string[] },\n getLanguagePlugins: (ts: unknown, options: { rootNames: readonly string[] }) => unknown[],\n ) => unknown;\n };\n\n const cleanup = (): void => {\n for (const file of temporaries.splice(0)) {\n /* v8 ignore next -- a temp file that vanished before cleanup is not an error */\n try { unlinkSync(file); } catch { /* best effort */ }\n }\n };\n process.once(\"exit\", cleanup);\n\n // tsc reads its arguments from process.argv when typescript/lib/tsc.js loads.\n process.argv = [process.argv[0], tscPath, ...tscArgs];\n runTsc(\n tscPath,\n { extraSupportedExtensions: [\".html\"], extraExtensionsToRemove: [] },\n (_ts, options) => {\n if (declaration !== undefined) (options.rootNames as string[]).push(declaration);\n // tsc mode: proxyCreateProgram supports one service script per file, so every\n // <wcs-state> block of a page is combined into one virtual TS module.\n return [createWcsLanguagePlugin(\"wcs-state\", { mode: \"tsc\" })];\n },\n );\n // Reached only when runTsc returns (tsc normally exits the process itself).\n cleanup();\n return 0;\n}\n\n/* v8 ignore start -- process plumbing; exercised by running the built bin */\nfunction defaultIo(): TscIo {\n return {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n cwd: () => process.cwd(),\n };\n}\n\nconst invokedAsBin = typeof process !== \"undefined\"\n && Array.isArray(process.argv)\n && /wcs-tsc(\\.mjs)?$/.test(process.argv[1] ?? \"\");\nif (invokedAsBin) {\n const code = main(process.argv.slice(2));\n if (code !== 0) process.exit(code);\n}\n/* v8 ignore stop */\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcstack/typescript",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.1",
|
|
4
4
|
"description": "TypeScript tooling for wcstack apps: wcs-schema generates the sidecar stateSchema from a typed state file, so wcs-validate checks data-wcs paths against real types in CI and every editor.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.esm.js",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@volar/language-core": "~2.4.0",
|
|
53
53
|
"@volar/typescript": "~2.4.0",
|
|
54
|
-
"typescript": ">=5.0"
|
|
54
|
+
"typescript": ">=5.0 <7"
|
|
55
55
|
},
|
|
56
56
|
"peerDependenciesMeta": {
|
|
57
57
|
"@volar/language-core": {
|