constructa-schema 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,6 +31,8 @@ A `GeneratorDocumentV1` wraps exactly one root definition and carries versioning
31
31
 
32
32
  Use `parseDocument` to validate and obtain a `GeneratorDocumentV1`, or `safeParseDocument` for a non-throwing parse result. Use `isGeneratorDefinition` or `assertGeneratorDefinition` when validating an unwrapped definition.
33
33
 
34
+ `parseDocument` dispatches only supported schema versions and never migrates input implicitly. Unsupported versions throw `UNSUPPORTED_SCHEMA_VERSION` at `schemaVersion`. To migrate an older portable document deliberately, call `migrateDocument(value, { from, to, migrate })`; the migration receives a JSON copy, and its result is validated through the target version parser.
35
+
34
36
  Use `serializeDefinition()` or `serializeDocument()` when stable JSON text is needed for storage, review, or diffs. Both validate their input through the same schema boundary and emit two-space JSON with recursively sorted object keys and one trailing newline. The serialized text remains ordinary JSON and round-trips through `JSON.parse`; generated values are not documents and cannot be serialized as one.
35
37
 
36
38
  ## Validation issues
package/dist/index.d.ts CHANGED
@@ -60,6 +60,12 @@ type GeneratorDocumentV1 = {
60
60
  readonly description?: string;
61
61
  };
62
62
  type GeneratorDocument = GeneratorDocumentV1;
63
+ /** An explicit one-step migration into a supported document schema version. */
64
+ type DocumentMigration = {
65
+ readonly from: number;
66
+ readonly to: SchemaVersion;
67
+ readonly migrate: (document: JsonObject) => unknown;
68
+ };
63
69
  /** Reusable portable definitions for serialization and integration fixtures. */
64
70
  declare const SERIALIZATION_DEFINITION_FIXTURES: readonly GeneratorDefinition[];
65
71
  /** Reusable versioned documents for serialization and integration fixtures. */
@@ -153,6 +159,11 @@ declare function assertGeneratorMetadata(value: unknown, path?: ValidationPath):
153
159
  declare function assertDocument(value: unknown, path?: ValidationPath): asserts value is GeneratorDocumentV1;
154
160
  declare function parseDocument(value: unknown, path?: ValidationPath): GeneratorDocumentV1;
155
161
  declare function safeParseDocument(value: unknown, path?: ValidationPath): GeneratorDocumentParseResult;
162
+ /**
163
+ * Applies one declared migration and validates its result through the normal
164
+ * version parser. Migrations are never applied implicitly by `parseDocument`.
165
+ */
166
+ declare function migrateDocument(value: unknown, migration: DocumentMigration): GeneratorDocumentV1;
156
167
  /**
157
168
  * Serializes a portable definition with recursively sorted object keys and a
158
169
  * trailing newline. The result is intended for stable diffs, not execution.
@@ -167,5 +178,5 @@ declare function validateDocument(value: unknown, path?: ValidationPath): readon
167
178
  declare function validateGeneratorDefinition(value: unknown, path?: ValidationPath): readonly GeneratorDefinitionFailure[];
168
179
  declare function validateGeneratorMetadata(value: unknown, path?: ValidationPath): readonly GeneratorMetadataFailure[];
169
180
  //#endregion
170
- export { CONSTRUCTA_ERROR_KINDS, CURRENT_SCHEMA_VERSION, ConstructaError, ConstructaErrorCode, ConstructaErrorKind, ConstructaErrorOptions, GENERATOR_DOCUMENT_TOP_LEVEL_KEYS, GENERATOR_METADATA_KEYS, GeneratorDefinition, GeneratorDefinitionError, GeneratorDefinitionFailure, GeneratorDefinitionFailureCode, GeneratorDocument, GeneratorDocumentError, GeneratorDocumentFailure, GeneratorDocumentFailureCode, GeneratorDocumentParseResult, GeneratorDocumentV1, GeneratorMetadata, GeneratorMetadataError, GeneratorMetadataFailure, GeneratorMetadataFailureCode, GeneratorOutputCategory, Infer, JsonArray, JsonObject, JsonPrimitive, JsonValue, JsonValueError, RESERVED_CONSTRUCTA_ERROR_CODES, SERIALIZATION_DEFINITION_FIXTURES, SERIALIZATION_DOCUMENT_FIXTURES, SUPPORTED_SCHEMA_VERSIONS, SafeConstructaError, SchemaVersion, SchemaVersionError, SchemaVersionFailure, SchemaVersionFailureCode, SemanticMetadataId, ValidationIssue, ValidationPath, ValidationPathSegment, assertDocument, assertGeneratorDefinition, assertGeneratorMetadata, assertJsonValue, assertSchemaVersion, createConstructaError, isDocument, isGeneratorDefinition, isGeneratorMetadata, isJsonValue, isSchemaVersion, normalizeConstructaError, parseDocument, safeParseDocument, serializeDefinition, serializeDocument, validateDocument, validateGeneratorDefinition, validateGeneratorMetadata, validateJsonValue };
181
+ export { CONSTRUCTA_ERROR_KINDS, CURRENT_SCHEMA_VERSION, ConstructaError, ConstructaErrorCode, ConstructaErrorKind, ConstructaErrorOptions, DocumentMigration, GENERATOR_DOCUMENT_TOP_LEVEL_KEYS, GENERATOR_METADATA_KEYS, GeneratorDefinition, GeneratorDefinitionError, GeneratorDefinitionFailure, GeneratorDefinitionFailureCode, GeneratorDocument, GeneratorDocumentError, GeneratorDocumentFailure, GeneratorDocumentFailureCode, GeneratorDocumentParseResult, GeneratorDocumentV1, GeneratorMetadata, GeneratorMetadataError, GeneratorMetadataFailure, GeneratorMetadataFailureCode, GeneratorOutputCategory, Infer, JsonArray, JsonObject, JsonPrimitive, JsonValue, JsonValueError, RESERVED_CONSTRUCTA_ERROR_CODES, SERIALIZATION_DEFINITION_FIXTURES, SERIALIZATION_DOCUMENT_FIXTURES, SUPPORTED_SCHEMA_VERSIONS, SafeConstructaError, SchemaVersion, SchemaVersionError, SchemaVersionFailure, SchemaVersionFailureCode, SemanticMetadataId, ValidationIssue, ValidationPath, ValidationPathSegment, assertDocument, assertGeneratorDefinition, assertGeneratorMetadata, assertJsonValue, assertSchemaVersion, createConstructaError, isDocument, isGeneratorDefinition, isGeneratorMetadata, isJsonValue, isSchemaVersion, migrateDocument, normalizeConstructaError, parseDocument, safeParseDocument, serializeDefinition, serializeDocument, validateDocument, validateGeneratorDefinition, validateGeneratorMetadata, validateJsonValue };
171
182
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAAY;KACA,YAAY,YAAY,aAAa;KACrC,qBAAqB;KACrB;YAAyB,cAAc;;KAEvC;KACA,0BAA0B;KAC1B;WACD;WACA,MAAM;WACN;WACA,UAAU;;cAGR;KAMD,8BAA8B;cAE7B;KAYD,sBAAsB;KAEtB;WACD,MAAM;WACN,MAAM;WACN,MAAM;WACN;WACA,UAAU;;KAGT,sBAAsB;;cAGrB,wBAAwB;;WAC1B,MAAM;WACN,MAAM;WACN,MAAM;WACN,UAAU;EAGP,YAAA,SAAS,wBAAwB;;EAY7C,UAAU;EAiBV;;iBAKc,sBACd,SAAS,yBACR;iBAIa,yBACd,gBACA,SAAS,yBACR;cAMU;cACA;KACD,wBAAwB;cAEtB;;;;;KAMF,oBAAoB,oBAAoB;WACzC;YACC,mBAAmB;;KAGnB,MAAM,cAChB,mBAAmB,0BAA0B,UAAU;;KAG7C;WACD;WACA,YAAY;WACZ;WACA;;KAGC,oBAAoB;;cAGnB,4CAA4C;;cAiB5C,0CAA0C;;KAe3C;;KAGA,0BAA0B;;;;;KAM1B;WACD,SAAS;WACT;WACA;WACA,WAAW;WACX,iBAAiB;WACjB;WACA,oBAAoB;;cAGlB;cAOA;KAsBD;KAGA;WACD,MAAM;WACN;WACA,MAAM;WACN;WACA;aAAoB,4BAA4B;;IACvD;KAEQ;KAMA;WACD,MAAM;WACN;WACA,MAAM;WACN;;KAGC;KAWA;WACD,MAAM;WACN;WACA,MAAM;WACN;;KAGC,+BACR,2BACA;KAQQ,2BACR;WAEW,MAAM,QACb,8BACA;WAEO;WACA,MAAM;WACN;;KAEH;WACG;WAAwB,OAAO;;WAC/B;WAAyB,SAAS;;cAEpC,uBAAuB;WACzB,OAAO;EACJ,YAAA,MAAM,gBAAgB;;cAavB,2BAA2B;WAC7B,SAAS;EACN,YAAA,SAAS;;cAaV,iCAAiC;WACnC,SAAS;EACN,YAAA,SAAS;;cAaV,+BAA+B;WACjC,SAAS;EACN,YAAA,SAAS;;cAaV,+BAA+B;WACjC,SAAS;EACN,YAAA,SAAS;;iBAaP,YAAY,iBAAiB,SAAS;iBAGtC,gBAAgB,iBAAiB,SAAS;iBAG1C,sBACd,iBACC,SAAS;iBAGI,WAAW,iBAAiB,SAAS;iBAGrC,oBACd,iBACC,SAAS;iBAGI,gBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,oBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,0BACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,wBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,eACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,cACd,gBACA,OAAM,iBACL;iBAIa,kBACd,gBACA,OAAM,iBACL;;;;;iBAWa,oBAAoB;;iBAMpB,kBAAkB;iBAqBlB,kBACd,gBACA,OAAM,0BACI;;iBAeI,iBACd,gBACA,OAAM,0BACI;;iBA8DI,4BACd,gBACA,OAAM,0BACI;iBAmBI,0BACd,gBACA,OAAM,0BACI"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAAY;KACA,YAAY,YAAY,aAAa;KACrC,qBAAqB;KACrB;YAAyB,cAAc;;KAEvC;KACA,0BAA0B;KAC1B;WACD;WACA,MAAM;WACN;WACA,UAAU;;cAGR;KAMD,8BAA8B;cAE7B;KAYD,sBAAsB;KAEtB;WACD,MAAM;WACN,MAAM;WACN,MAAM;WACN;WACA,UAAU;;KAGT,sBAAsB;;cAGrB,wBAAwB;;WAC1B,MAAM;WACN,MAAM;WACN,MAAM;WACN,UAAU;EAGP,YAAA,SAAS,wBAAwB;;EAY7C,UAAU;EAiBV;;iBAKc,sBACd,SAAS,yBACR;iBAIa,yBACd,gBACA,SAAS,yBACR;cAMU;cACA;KACD,wBAAwB;cAEtB;;;;;KAMF,oBAAoB,oBAAoB;WACzC;YACC,mBAAmB;;KAGnB,MAAM,cAChB,mBAAmB,0BAA0B,UAAU;;KAG7C;WACD;WACA,YAAY;WACZ;WACA;;KAGC,oBAAoB;;KAGpB;WACD;WACA,IAAI;WACJ,UAAU,UAAU;;;cAIlB,4CAA4C;;cAiB5C,0CAA0C;;KAe3C;;KAGA,0BAA0B;;;;;KAM1B;WACD,SAAS;WACT;WACA;WACA,WAAW;WACX,iBAAiB;WACjB;WACA,oBAAoB;;cAGlB;cAOA;KAsBD;KAGA;WACD,MAAM;WACN;WACA,MAAM;WACN;WACA;aAAoB,4BAA4B;;IACvD;KAEQ;KAMA;WACD,MAAM;WACN;WACA,MAAM;WACN;;KAGC;KAWA;WACD,MAAM;WACN;WACA,MAAM;WACN;;KAGC,+BACR,2BACA;KAQQ,2BACR;WAEW,MAAM,QACb,8BACA;WAEO;WACA,MAAM;WACN;;KAEH;WACG;WAAwB,OAAO;;WAC/B;WAAyB,SAAS;;cAEpC,uBAAuB;WACzB,OAAO;EACJ,YAAA,MAAM,gBAAgB;;cAavB,2BAA2B;WAC7B,SAAS;EACN,YAAA,SAAS;;cAaV,iCAAiC;WACnC,SAAS;EACN,YAAA,SAAS;;cAaV,+BAA+B;WACjC,SAAS;EACN,YAAA,SAAS;;cAaV,+BAA+B;WACjC,SAAS;EACN,YAAA,SAAS;;iBAaP,YAAY,iBAAiB,SAAS;iBAGtC,gBAAgB,iBAAiB,SAAS;iBAG1C,sBACd,iBACC,SAAS;iBAGI,WAAW,iBAAiB,SAAS;iBAGrC,oBACd,iBACC,SAAS;iBAGI,gBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,oBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,0BACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,wBACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,eACd,gBACA,OAAM,yBACG,SAAS;iBAIJ,cACd,gBACA,OAAM,iBACL;iBAIa,kBACd,gBACA,OAAM,iBACL;;;;;iBAWa,gBACd,gBACA,WAAW,oBACV;;;;;iBAsGa,oBAAoB;;iBAMpB,kBAAkB;iBAqBlB,kBACd,gBACA,OAAM,0BACI;;iBAeI,iBACd,gBACA,OAAM,0BACI;;iBA8DI,4BACd,gBACA,OAAM,0BACI;iBAmBI,0BACd,gBACA,OAAM,0BACI"}
package/dist/index.js CHANGED
@@ -222,8 +222,7 @@ function assertDocument(value, path = []) {
222
222
  if (issue !== void 0) throw new GeneratorDocumentError(issue);
223
223
  }
224
224
  function parseDocument(value, path = []) {
225
- assertDocument(value, path);
226
- return value;
225
+ return resolveDocumentParser(value, path)(value, path);
227
226
  }
228
227
  function safeParseDocument(value, path = []) {
229
228
  const [failure] = validateDocument(value, path);
@@ -236,6 +235,66 @@ function safeParseDocument(value, path = []) {
236
235
  };
237
236
  }
238
237
  /**
238
+ * Applies one declared migration and validates its result through the normal
239
+ * version parser. Migrations are never applied implicitly by `parseDocument`.
240
+ */
241
+ function migrateDocument(value, migration) {
242
+ assertDocumentMigration(migration);
243
+ assertJsonValue(value);
244
+ if (!isJsonRecord(value)) throw new GeneratorDocumentError(documentFailure("generator_document_not_object", []));
245
+ const sourceVersion = value.schemaVersion;
246
+ if (!Number.isSafeInteger(sourceVersion) || sourceVersion !== migration.from) throw new SchemaVersionError({
247
+ code: "schema_version_unsupported",
248
+ path: ["schemaVersion"],
249
+ severity: "error",
250
+ message: `schemaVersion must be ${migration.from} before this migration.`,
251
+ details: { supportedVersions: [migration.to] }
252
+ });
253
+ const source = JSON.parse(JSON.stringify(value));
254
+ let migrated;
255
+ try {
256
+ migrated = migration.migrate(source);
257
+ } catch (cause) {
258
+ throw normalizeConstructaError(cause, {
259
+ kind: "configuration",
260
+ code: "INVALID_CONFIGURATION",
261
+ path: ["migration"],
262
+ message: "Document migration failed."
263
+ });
264
+ }
265
+ return parseDocument(migrated);
266
+ }
267
+ const DOCUMENT_PARSERS = /* @__PURE__ */ new Map([[1, parseCurrentDocument]]);
268
+ function resolveDocumentParser(value, path) {
269
+ if (!isJsonRecord(value) || !Object.hasOwn(value, "schemaVersion")) {
270
+ assertDocument(value, path);
271
+ throw new ConstructaError({
272
+ kind: "system",
273
+ code: "INVALID_CONFIGURATION",
274
+ path,
275
+ message: "Document validation unexpectedly succeeded without a schema version."
276
+ });
277
+ }
278
+ const parser = DOCUMENT_PARSERS.get(value.schemaVersion);
279
+ if (parser === void 0) {
280
+ const failure = findSchemaVersionValueFailure(value.schemaVersion, appendPathSegment(path, "schemaVersion"));
281
+ if (failure !== void 0) throw new SchemaVersionError(failure);
282
+ }
283
+ return parser ?? parseCurrentDocument;
284
+ }
285
+ function parseCurrentDocument(value, path) {
286
+ assertDocument(value, path);
287
+ return value;
288
+ }
289
+ function assertDocumentMigration(migration) {
290
+ if (typeof migration !== "object" || migration === null || !Number.isSafeInteger(migration.from) || migration.from < 0 || !isSchemaVersion(migration.to) || typeof migration.migrate !== "function") throw new ConstructaError({
291
+ kind: "configuration",
292
+ code: "INVALID_CONFIGURATION",
293
+ path: ["migration"],
294
+ message: "A migration must declare a non-negative source version, a supported target version, and a migrate function."
295
+ });
296
+ }
297
+ /**
239
298
  * Serializes a portable definition with recursively sorted object keys and a
240
299
  * trailing newline. The result is intended for stable diffs, not execution.
241
300
  */
@@ -516,6 +575,6 @@ function findUnsupportedOwnProperty(value, path, allowedNonEnumerableProperties
516
575
  }
517
576
  }
518
577
  //#endregion
519
- export { CONSTRUCTA_ERROR_KINDS, CURRENT_SCHEMA_VERSION, ConstructaError, GENERATOR_DOCUMENT_TOP_LEVEL_KEYS, GENERATOR_METADATA_KEYS, GeneratorDefinitionError, GeneratorDocumentError, GeneratorMetadataError, JsonValueError, RESERVED_CONSTRUCTA_ERROR_CODES, SERIALIZATION_DEFINITION_FIXTURES, SERIALIZATION_DOCUMENT_FIXTURES, SUPPORTED_SCHEMA_VERSIONS, SchemaVersionError, assertDocument, assertGeneratorDefinition, assertGeneratorMetadata, assertJsonValue, assertSchemaVersion, createConstructaError, isDocument, isGeneratorDefinition, isGeneratorMetadata, isJsonValue, isSchemaVersion, normalizeConstructaError, parseDocument, safeParseDocument, serializeDefinition, serializeDocument, validateDocument, validateGeneratorDefinition, validateGeneratorMetadata, validateJsonValue };
578
+ export { CONSTRUCTA_ERROR_KINDS, CURRENT_SCHEMA_VERSION, ConstructaError, GENERATOR_DOCUMENT_TOP_LEVEL_KEYS, GENERATOR_METADATA_KEYS, GeneratorDefinitionError, GeneratorDocumentError, GeneratorMetadataError, JsonValueError, RESERVED_CONSTRUCTA_ERROR_CODES, SERIALIZATION_DEFINITION_FIXTURES, SERIALIZATION_DOCUMENT_FIXTURES, SUPPORTED_SCHEMA_VERSIONS, SchemaVersionError, assertDocument, assertGeneratorDefinition, assertGeneratorMetadata, assertJsonValue, assertSchemaVersion, createConstructaError, isDocument, isGeneratorDefinition, isGeneratorMetadata, isJsonValue, isSchemaVersion, migrateDocument, normalizeConstructaError, parseDocument, safeParseDocument, serializeDefinition, serializeDocument, validateDocument, validateGeneratorDefinition, validateGeneratorMetadata, validateJsonValue };
520
579
 
521
580
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#cause"],"sources":["../src/index.ts"],"sourcesContent":["export type JsonPrimitive = boolean | null | number | string;\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\nexport type JsonArray = readonly JsonValue[];\nexport type JsonObject = { readonly [key: string]: JsonValue };\n\nexport type ValidationPathSegment = string | number;\nexport type ValidationPath = readonly ValidationPathSegment[];\nexport type ValidationIssue = {\n readonly code: string;\n readonly path: ValidationPath;\n readonly message: string;\n readonly details?: JsonObject;\n};\n\nexport const CONSTRUCTA_ERROR_KINDS = [\n \"configuration\",\n \"dependency\",\n \"execution\",\n \"system\",\n] as const;\nexport type ConstructaErrorKind = (typeof CONSTRUCTA_ERROR_KINDS)[number];\n\nexport const RESERVED_CONSTRUCTA_ERROR_CODES = [\n \"INVALID_RANGE\",\n \"EMPTY_CHOICE\",\n \"INVALID_LENGTH\",\n \"UNKNOWN_GENERATOR\",\n \"REFERENCE_NOT_FOUND\",\n \"CIRCULAR_REFERENCE\",\n \"EXECUTION_FAILED\",\n \"UNSUPPORTED_SCHEMA_VERSION\",\n \"INVALID_CONFIGURATION\",\n \"INVALID_JSON_VALUE\",\n] as const;\nexport type ConstructaErrorCode = Uppercase<string>;\n\nexport type ConstructaErrorOptions = {\n readonly kind: ConstructaErrorKind;\n readonly code: ConstructaErrorCode;\n readonly path: ValidationPath;\n readonly message: string;\n readonly details?: JsonObject;\n};\n\nexport type SafeConstructaError = ConstructaErrorOptions;\n\n/** A safe, serializable error shared by every Constructa surface. */\nexport class ConstructaError extends TypeError {\n readonly kind: ConstructaErrorKind;\n readonly code: ConstructaErrorCode;\n readonly path: ValidationPath;\n readonly details?: JsonObject;\n readonly #cause: unknown;\n\n constructor(options: ConstructaErrorOptions, cause?: unknown) {\n validateConstructaErrorOptions(options);\n super(options.message);\n this.name = \"ConstructaError\";\n this.kind = options.kind;\n this.code = options.code;\n this.path = options.path;\n this.details = options.details;\n this.#cause = cause;\n }\n\n /** Returns only data that is safe to send across a process or network boundary. */\n toJSON(): SafeConstructaError {\n return this.details === undefined\n ? {\n kind: this.kind,\n code: this.code,\n path: this.path,\n message: this.message,\n }\n : {\n kind: this.kind,\n code: this.code,\n path: this.path,\n message: this.message,\n details: this.details,\n };\n }\n\n hasCause(): boolean {\n return this.#cause !== undefined;\n }\n}\n\nexport function createConstructaError(\n options: ConstructaErrorOptions,\n): ConstructaError {\n return new ConstructaError(options);\n}\n\nexport function normalizeConstructaError(\n cause: unknown,\n options: ConstructaErrorOptions,\n): ConstructaError {\n return cause instanceof ConstructaError\n ? cause\n : new ConstructaError(options, cause);\n}\n\nexport const CURRENT_SCHEMA_VERSION = 1;\nexport const SUPPORTED_SCHEMA_VERSIONS = [CURRENT_SCHEMA_VERSION] as const;\nexport type SchemaVersion = (typeof SUPPORTED_SCHEMA_VERSIONS)[number];\n\ndeclare const generatorOutput: unique symbol;\n\n/**\n * Portable executable generator data. `Output` exists only to carry compile-time\n * inference and never creates a runtime property.\n */\nexport type GeneratorDefinition<Output = unknown> = JsonObject & {\n readonly type: string;\n readonly [generatorOutput]?: Output;\n};\n\nexport type Infer<Definition> =\n Definition extends GeneratorDefinition<infer Output> ? Output : never;\n\n/** Versioned document containing exactly one root generator definition. */\nexport type GeneratorDocumentV1 = {\n readonly schemaVersion: 1;\n readonly definition: GeneratorDefinition;\n readonly name?: string;\n readonly description?: string;\n};\n\nexport type GeneratorDocument = GeneratorDocumentV1;\n\n/** Reusable portable definitions for serialization and integration fixtures. */\nexport const SERIALIZATION_DEFINITION_FIXTURES: readonly GeneratorDefinition[] =\n Object.freeze([\n Object.freeze({ type: \"boolean\" }) as GeneratorDefinition,\n Object.freeze({\n type: \"object\",\n fields: Object.freeze({\n account: Object.freeze({\n type: \"object\",\n fields: Object.freeze({\n id: Object.freeze({ type: \"integer\", min: 1 }),\n }),\n }),\n }),\n }) as GeneratorDefinition,\n ]);\n\n/** Reusable versioned documents for serialization and integration fixtures. */\nexport const SERIALIZATION_DOCUMENT_FIXTURES: readonly GeneratorDocumentV1[] =\n Object.freeze([\n Object.freeze({\n schemaVersion: 1,\n definition: SERIALIZATION_DEFINITION_FIXTURES[0] as GeneratorDefinition,\n }) as GeneratorDocumentV1,\n Object.freeze({\n schemaVersion: 1,\n name: \"Small integer\",\n description: \"An integer in a bounded range.\",\n definition: Object.freeze({ type: \"integer\", min: 1, max: 100 }),\n }) as GeneratorDocumentV1,\n ]);\n\n/** A stable, lowercase identifier used to classify portable metadata. */\nexport type SemanticMetadataId = string;\n\n/** A coarse output-preview classification, not an execution or inference type. */\nexport type GeneratorOutputCategory = SemanticMetadataId;\n\n/**\n * Portable, descriptive metadata for a generator implementation.\n * It is intentionally separate from executable generator definitions.\n */\nexport type GeneratorMetadata = {\n readonly typeId?: SemanticMetadataId;\n readonly displayName?: string;\n readonly description?: string;\n readonly category?: SemanticMetadataId;\n readonly outputCategory?: GeneratorOutputCategory;\n readonly documentationUrl?: string;\n readonly examples?: readonly JsonValue[];\n};\n\nexport const GENERATOR_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"name\",\n \"description\",\n \"definition\",\n] as const;\n\nexport const GENERATOR_METADATA_KEYS = [\n \"typeId\",\n \"displayName\",\n \"description\",\n \"category\",\n \"outputCategory\",\n \"documentationUrl\",\n \"examples\",\n] as const;\n\nconst DOCUMENT_METADATA_KEYS = new Set([\n \"schemaVersion\",\n \"name\",\n \"description\",\n \"owner\",\n \"ownership\",\n \"visibility\",\n \"createdAt\",\n \"updatedAt\",\n \"timestamps\",\n]);\n\nexport type SchemaVersionFailureCode =\n | \"schema_version_missing\"\n | \"schema_version_unsupported\";\nexport type SchemaVersionFailure = {\n readonly code: SchemaVersionFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n readonly details: { readonly supportedVersions: readonly SchemaVersion[] };\n} & ValidationIssue;\n\nexport type GeneratorDefinitionFailureCode =\n | \"generator_definition_not_json\"\n | \"generator_definition_not_object\"\n | \"generator_type_missing\"\n | \"generator_type_invalid\"\n | \"definition_document_metadata\";\nexport type GeneratorDefinitionFailure = {\n readonly code: GeneratorDefinitionFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n};\n\nexport type GeneratorMetadataFailureCode =\n | \"generator_metadata_not_json\"\n | \"generator_metadata_not_object\"\n | \"metadata_type_id_invalid\"\n | \"metadata_display_name_invalid\"\n | \"metadata_description_invalid\"\n | \"metadata_category_invalid\"\n | \"metadata_output_category_invalid\"\n | \"metadata_documentation_url_invalid\"\n | \"metadata_examples_invalid\"\n | \"metadata_property_unknown\";\nexport type GeneratorMetadataFailure = {\n readonly code: GeneratorMetadataFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n};\n\nexport type GeneratorDocumentFailureCode =\n | SchemaVersionFailureCode\n | GeneratorDefinitionFailureCode\n | \"generator_document_not_json\"\n | \"generator_document_not_object\"\n | \"definition_missing\"\n | \"name_invalid\"\n | \"description_invalid\"\n | \"top_level_property_unknown\"\n | \"configuration_envelope_removed\";\nexport type GeneratorDocumentFailure =\n | SchemaVersionFailure\n | {\n readonly code: Exclude<\n GeneratorDocumentFailureCode,\n SchemaVersionFailureCode\n >;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n };\nexport type GeneratorDocumentParseResult =\n | { readonly success: true; readonly value: GeneratorDocumentV1 }\n | { readonly success: false; readonly failure: GeneratorDocumentFailure };\n\nexport class JsonValueError extends ConstructaError {\n readonly issue: ValidationIssue;\n constructor(path: ValidationPath, reason: string) {\n super({\n kind: \"configuration\",\n code: \"INVALID_JSON_VALUE\",\n path,\n message: reason,\n details: { issueCode: \"invalid_json_value\" },\n });\n this.name = \"JsonValueError\";\n this.issue = { code: \"invalid_json_value\", path, message: reason };\n }\n}\n\nexport class SchemaVersionError extends ConstructaError {\n readonly failure: SchemaVersionFailure;\n constructor(failure: SchemaVersionFailure) {\n super({\n kind: \"configuration\",\n code: \"UNSUPPORTED_SCHEMA_VERSION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"SchemaVersionError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorDefinitionError extends ConstructaError {\n readonly failure: GeneratorDefinitionFailure;\n constructor(failure: GeneratorDefinitionFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorDefinitionError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorMetadataError extends ConstructaError {\n readonly failure: GeneratorMetadataFailure;\n constructor(failure: GeneratorMetadataFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorMetadataError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorDocumentError extends ConstructaError {\n readonly failure: GeneratorDocumentFailure;\n constructor(failure: GeneratorDocumentFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorDocumentError\";\n this.failure = failure;\n }\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return validateJsonValue(value).length === 0;\n}\nexport function isSchemaVersion(value: unknown): value is SchemaVersion {\n return value === CURRENT_SCHEMA_VERSION;\n}\nexport function isGeneratorDefinition(\n value: unknown,\n): value is GeneratorDefinition {\n return validateGeneratorDefinition(value).length === 0;\n}\nexport function isDocument(value: unknown): value is GeneratorDocumentV1 {\n return validateDocument(value).length === 0;\n}\nexport function isGeneratorMetadata(\n value: unknown,\n): value is GeneratorMetadata {\n return validateGeneratorMetadata(value).length === 0;\n}\nexport function assertJsonValue(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is JsonValue {\n const [issue] = validateJsonValue(value, path);\n if (issue !== undefined) throw new JsonValueError(issue.path, issue.message);\n}\nexport function assertSchemaVersion(\n value: unknown,\n path: ValidationPath = [\"schemaVersion\"],\n): asserts value is SchemaVersion {\n const failure = findSchemaVersionValueFailure(value, path);\n if (failure !== undefined) throw new SchemaVersionError(failure);\n}\nexport function assertGeneratorDefinition(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorDefinition {\n const [failure] = validateGeneratorDefinition(value, path);\n if (failure !== undefined) throw new GeneratorDefinitionError(failure);\n}\nexport function assertGeneratorMetadata(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorMetadata {\n const [failure] = validateGeneratorMetadata(value, path);\n if (failure !== undefined) throw new GeneratorMetadataError(failure);\n}\nexport function assertDocument(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorDocumentV1 {\n const [issue] = validateDocument(value, path);\n if (issue !== undefined) throw new GeneratorDocumentError(issue);\n}\nexport function parseDocument(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorDocumentV1 {\n assertDocument(value, path);\n return value;\n}\nexport function safeParseDocument(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorDocumentParseResult {\n const [failure] = validateDocument(value, path);\n return failure === undefined\n ? { success: true, value: value as GeneratorDocumentV1 }\n : { success: false, failure };\n}\n\n/**\n * Serializes a portable definition with recursively sorted object keys and a\n * trailing newline. The result is intended for stable diffs, not execution.\n */\nexport function serializeDefinition(value: unknown): string {\n assertGeneratorDefinition(value);\n return serializeCanonicalJson(value);\n}\n\n/** Serializes a validated versioned document using the same canonical format. */\nexport function serializeDocument(value: unknown): string {\n assertDocument(value);\n return serializeCanonicalJson(value);\n}\n\nfunction serializeCanonicalJson(value: JsonValue): string {\n return `${JSON.stringify(canonicalizeJson(value), null, 2)}\\n`;\n}\n\nfunction canonicalizeJson(value: JsonValue): JsonValue {\n if (Array.isArray(value)) return value.map(canonicalizeJson);\n if (isJsonRecord(value)) {\n const result: Record<string, JsonValue> = {};\n for (const key of Object.keys(value).sort()) {\n result[key] = canonicalizeJson(value[key] as JsonValue);\n }\n return result;\n }\n return value;\n}\n\nexport function validateJsonValue(\n value: unknown,\n path: ValidationPath = [],\n): readonly ValidationIssue[] {\n const error = findJsonValueError(value, path);\n return error === undefined\n ? []\n : [{ code: \"invalid_json_value\", path: error.path, message: error.reason }];\n}\n\nfunction findJsonValueError(\n value: unknown,\n path: ValidationPath,\n): { path: ValidationPath; reason: string } | undefined {\n return findJsonValueErrorInternal(value, path, new Set());\n}\n\n/** Returns all independent document validation issues in deterministic order. */\nexport function validateDocument(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorDocumentFailure[] {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return [\n documentFailure(\n \"generator_document_not_json\",\n jsonError.path,\n jsonError.reason,\n ),\n ];\n }\n if (!isJsonRecord(value)) {\n return [documentFailure(\"generator_document_not_object\", path)];\n }\n\n const issues: GeneratorDocumentFailure[] = [];\n if (Object.hasOwn(value, \"configuration\") && Object.hasOwn(value, \"type\")) {\n issues.push(documentFailure(\"configuration_envelope_removed\", path));\n }\n for (const key of Object.keys(value)) {\n if (!GENERATOR_DOCUMENT_TOP_LEVEL_KEYS.includes(key as never)) {\n issues.push(\n documentFailure(\n \"top_level_property_unknown\",\n appendPathSegment(path, key),\n `Unknown top-level property: ${key}`,\n ),\n );\n }\n }\n\n const versionFailure = findSchemaVersionFailure(value, path);\n if (versionFailure !== undefined) issues.push(versionFailure);\n for (const property of [\"name\", \"description\"] as const) {\n if (Object.hasOwn(value, property) && typeof value[property] !== \"string\") {\n issues.push(\n documentFailure(\n property === \"name\" ? \"name_invalid\" : \"description_invalid\",\n appendPathSegment(path, property),\n ),\n );\n }\n }\n if (!Object.hasOwn(value, \"definition\")) {\n issues.push(\n documentFailure(\n \"definition_missing\",\n appendPathSegment(path, \"definition\"),\n ),\n );\n } else {\n issues.push(\n ...validateGeneratorDefinition(\n value.definition,\n appendPathSegment(path, \"definition\"),\n ),\n );\n }\n return issues;\n}\n\n/** Returns definition issues. Nested typed definitions are validated recursively. */\nexport function validateGeneratorDefinition(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorDefinitionFailure[] {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return [\n definitionFailure(\n \"generator_definition_not_json\",\n jsonError.path,\n jsonError.reason,\n ),\n ];\n }\n if (!isJsonRecord(value)) {\n return [definitionFailure(\"generator_definition_not_object\", path)];\n }\n\n const issues: GeneratorDefinitionFailure[] = [];\n collectDefinitionMetadataIssues(value as JsonObject, path, issues, true);\n return issues;\n}\nexport function validateGeneratorMetadata(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorMetadataFailure[] {\n const failure = findGeneratorMetadataFailure(value, path);\n return failure === undefined ? [] : [failure];\n}\n\nfunction findGeneratorMetadataFailure(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorMetadataFailure | undefined {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return metadataFailure(\n \"generator_metadata_not_json\",\n jsonError.path,\n jsonError.reason,\n );\n }\n if (!isJsonRecord(value)) {\n return metadataFailure(\"generator_metadata_not_object\", path);\n }\n\n const unknownKey = Object.keys(value).find(\n (key) => !GENERATOR_METADATA_KEYS.includes(key as never),\n );\n if (unknownKey !== undefined) {\n return metadataFailure(\n \"metadata_property_unknown\",\n appendPathSegment(path, unknownKey),\n `Unknown metadata property: ${unknownKey}`,\n );\n }\n\n for (const property of [\"typeId\", \"category\", \"outputCategory\"] as const) {\n if (\n Object.hasOwn(value, property) &&\n (typeof value[property] !== \"string\" || !isMetadataId(value[property]))\n ) {\n const code =\n property === \"typeId\"\n ? \"metadata_type_id_invalid\"\n : property === \"category\"\n ? \"metadata_category_invalid\"\n : \"metadata_output_category_invalid\";\n return metadataFailure(code, appendPathSegment(path, property));\n }\n }\n\n for (const property of [\n \"displayName\",\n \"description\",\n \"documentationUrl\",\n ] as const) {\n if (Object.hasOwn(value, property) && typeof value[property] !== \"string\") {\n const code =\n property === \"displayName\"\n ? \"metadata_display_name_invalid\"\n : property === \"description\"\n ? \"metadata_description_invalid\"\n : \"metadata_documentation_url_invalid\";\n return metadataFailure(code, appendPathSegment(path, property));\n }\n }\n\n if (Object.hasOwn(value, \"examples\") && !Array.isArray(value.examples)) {\n return metadataFailure(\n \"metadata_examples_invalid\",\n appendPathSegment(path, \"examples\"),\n );\n }\n\n return undefined;\n}\nfunction findSchemaVersionFailure(\n value: unknown,\n path: ValidationPath = [],\n): SchemaVersionFailure | undefined {\n if (!isJsonRecord(value) || !Object.hasOwn(value, \"schemaVersion\"))\n return createSchemaVersionFailure(\n \"schema_version_missing\",\n appendPathSegment(path, \"schemaVersion\"),\n );\n return findSchemaVersionValueFailure(\n value.schemaVersion,\n appendPathSegment(path, \"schemaVersion\"),\n );\n}\nfunction findSchemaVersionValueFailure(\n value: unknown,\n path: ValidationPath = [\"schemaVersion\"],\n): SchemaVersionFailure | undefined {\n return isSchemaVersion(value)\n ? undefined\n : createSchemaVersionFailure(\"schema_version_unsupported\", path);\n}\n\nfunction createSchemaVersionFailure(\n code: SchemaVersionFailureCode,\n path: ValidationPath,\n): SchemaVersionFailure {\n return {\n code,\n message:\n code === \"schema_version_missing\"\n ? `schemaVersion is required and must be ${CURRENT_SCHEMA_VERSION}`\n : `schemaVersion must be ${CURRENT_SCHEMA_VERSION}`,\n path,\n severity: \"error\",\n details: { supportedVersions: SUPPORTED_SCHEMA_VERSIONS },\n };\n}\nfunction definitionFailure(\n code: GeneratorDefinitionFailureCode,\n path: ValidationPath,\n message?: string,\n): GeneratorDefinitionFailure {\n const messages: Record<GeneratorDefinitionFailureCode, string> = {\n generator_definition_not_json:\n \"generator definition must be portable JSON data\",\n generator_definition_not_object:\n \"generator definition must be a JSON object\",\n generator_type_missing: \"type is required\",\n generator_type_invalid: \"type must be a non-empty string\",\n definition_document_metadata:\n \"document metadata is not allowed in a generator definition\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction metadataFailure(\n code: GeneratorMetadataFailureCode,\n path: ValidationPath,\n message?: string,\n): GeneratorMetadataFailure {\n const messages: Record<GeneratorMetadataFailureCode, string> = {\n generator_metadata_not_json:\n \"generator metadata must be portable JSON data\",\n generator_metadata_not_object: \"generator metadata must be a JSON object\",\n metadata_type_id_invalid: \"typeId must be a stable metadata ID\",\n metadata_display_name_invalid: \"displayName must be a string when present\",\n metadata_description_invalid: \"description must be a string when present\",\n metadata_category_invalid: \"category must be a stable metadata ID\",\n metadata_output_category_invalid:\n \"outputCategory must be a stable metadata ID\",\n metadata_documentation_url_invalid:\n \"documentationUrl must be a string when present\",\n metadata_examples_invalid: \"examples must be an array when present\",\n metadata_property_unknown: \"unknown metadata properties are not allowed\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction documentFailure(\n code: Exclude<GeneratorDocumentFailureCode, SchemaVersionFailureCode>,\n path: ValidationPath,\n message?: string,\n): Exclude<GeneratorDocumentFailure, SchemaVersionFailure> {\n const messages: Record<\n Exclude<GeneratorDocumentFailureCode, SchemaVersionFailureCode>,\n string\n > = {\n generator_document_not_json:\n \"generator document must be portable JSON data\",\n generator_document_not_object: \"generator document must be a JSON object\",\n generator_definition_not_json:\n \"generator definition must be portable JSON data\",\n generator_definition_not_object:\n \"generator definition must be a JSON object\",\n generator_type_missing: \"type is required\",\n generator_type_invalid: \"type must be a non-empty string\",\n definition_document_metadata:\n \"document metadata is not allowed in a generator definition\",\n definition_missing: \"definition is required\",\n name_invalid: \"name must be a string when present\",\n description_invalid: \"description must be a string when present\",\n top_level_property_unknown: \"unknown top-level properties are not allowed\",\n configuration_envelope_removed:\n \"The configuration envelope was removed; put generator fields directly inside definition.\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction appendPathSegment(\n path: ValidationPath,\n segment: ValidationPathSegment,\n): ValidationPath {\n return [...path, segment];\n}\n\nfunction validateConstructaErrorOptions(options: ConstructaErrorOptions): void {\n if (!CONSTRUCTA_ERROR_KINDS.includes(options.kind)) {\n throw new TypeError(\"kind must be a Constructa error kind\");\n }\n if (!/^[A-Z][A-Z0-9_]*$/u.test(options.code)) {\n throw new TypeError(\"code must be an uppercase stable error code\");\n }\n if (typeof options.message !== \"string\" || options.message.length === 0) {\n throw new TypeError(\"message must be a non-empty string\");\n }\n for (const segment of options.path) {\n if (\n typeof segment !== \"string\" &&\n (typeof segment !== \"number\" || !Number.isSafeInteger(segment))\n ) {\n throw new TypeError(\"path segments must be strings or safe integers\");\n }\n }\n if (\n options.details !== undefined &&\n (!isJsonRecord(options.details) || !isJsonValue(options.details))\n ) {\n throw new TypeError(\"details must be a portable JSON object\");\n }\n}\n\nfunction isMetadataId(value: string) {\n return /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/u.test(value);\n}\n\nfunction collectDefinitionMetadataIssues(\n value: JsonObject,\n path: ValidationPath,\n issues: GeneratorDefinitionFailure[],\n isDefinition: boolean,\n): void {\n if (isDefinition) {\n if (!Object.hasOwn(value, \"type\")) {\n issues.push(\n definitionFailure(\n \"generator_type_missing\",\n appendPathSegment(path, \"type\"),\n ),\n );\n } else if (\n typeof value.type !== \"string\" ||\n value.type.trim().length === 0\n ) {\n issues.push(\n definitionFailure(\n \"generator_type_invalid\",\n appendPathSegment(path, \"type\"),\n ),\n );\n }\n for (const key of Object.keys(value)) {\n if (key !== \"type\" && DOCUMENT_METADATA_KEYS.has(key)) {\n issues.push(\n definitionFailure(\n \"definition_document_metadata\",\n appendPathSegment(path, key),\n ),\n );\n }\n }\n }\n\n for (const [key, child] of Object.entries(value)) {\n if (key === \"type\") continue;\n collectNestedDefinitionMetadataIssues(\n child,\n appendPathSegment(path, key),\n issues,\n );\n }\n}\n\nfunction collectNestedDefinitionMetadataIssues(\n value: JsonValue,\n path: ValidationPath,\n issues: GeneratorDefinitionFailure[],\n): void {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n collectNestedDefinitionMetadataIssues(\n value[index],\n appendPathSegment(path, index),\n issues,\n );\n }\n return;\n }\n if (!isJsonRecord(value)) return;\n collectDefinitionMetadataIssues(\n value,\n path,\n issues,\n Object.hasOwn(value, \"type\"),\n );\n}\n\nfunction isJsonRecord(value: unknown): value is Record<string, unknown> {\n const prototype =\n typeof value === \"object\" && value !== null\n ? Object.getPrototypeOf(value)\n : undefined;\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (prototype === null || prototype === Object.prototype)\n );\n}\nfunction findJsonValueErrorInternal(\n value: unknown,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return undefined;\n case \"number\":\n if (!Number.isFinite(value))\n return { path, reason: \"number must be finite\" };\n return Object.is(value, -0)\n ? { path, reason: \"number must not be negative zero\" }\n : undefined;\n case \"object\":\n return value === null\n ? undefined\n : findJsonObjectError(value, path, ancestors);\n case \"bigint\":\n case \"function\":\n case \"symbol\":\n case \"undefined\":\n return { path, reason: `${typeof value} is not JSON-compatible` };\n }\n}\nfunction findJsonObjectError(\n value: object,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n if (ancestors.has(value))\n return { path, reason: \"cyclic objects are not JSON-compatible\" };\n if (\n \"toJSON\" in value &&\n typeof (value as { readonly toJSON?: unknown }).toJSON === \"function\"\n )\n return { path, reason: \"objects with toJSON behavior are not portable\" };\n ancestors.add(value);\n const error = Array.isArray(value)\n ? findJsonArrayError(value, path, ancestors)\n : findJsonRecordError(value, path, ancestors);\n ancestors.delete(value);\n return error;\n}\nfunction findJsonArrayError(\n value: readonly unknown[],\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n const extraProperty = Object.keys(value).find((key) => !isArrayIndexKey(key));\n if (extraProperty !== undefined)\n return {\n path: appendPathSegment(path, extraProperty),\n reason: \"array object properties would be omitted from JSON\",\n };\n const propertyError = findUnsupportedOwnProperty(value, path, [\"length\"]);\n if (propertyError !== undefined) return propertyError;\n for (let index = 0; index < value.length; index += 1) {\n if (!(index in value))\n return {\n path: appendPathSegment(path, index),\n reason: \"sparse array slots are not JSON-compatible\",\n };\n const itemError = findJsonValueErrorInternal(\n value[index],\n appendPathSegment(path, index),\n ancestors,\n );\n if (itemError !== undefined) return itemError;\n }\n return undefined;\n}\nfunction isArrayIndexKey(key: string) {\n const index = Number(key);\n return (\n Number.isInteger(index) &&\n index >= 0 &&\n index < 2 ** 32 - 1 &&\n String(index) === key\n );\n}\nfunction findJsonRecordError(\n value: object,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype)\n return { path, reason: \"object must be a plain JSON record\" };\n const propertyError = findUnsupportedOwnProperty(value, path);\n if (propertyError !== undefined) return propertyError;\n for (const key of Object.keys(value)) {\n const itemError = findJsonValueErrorInternal(\n (value as Record<string, unknown>)[key],\n appendPathSegment(path, key),\n ancestors,\n );\n if (itemError !== undefined) return itemError;\n }\n return undefined;\n}\nfunction findUnsupportedOwnProperty(\n value: object,\n path: ValidationPath,\n allowedNonEnumerableProperties: readonly string[] = [],\n): { path: ValidationPath; reason: string } | undefined {\n if (Object.hasOwn(value, \"__proto__\")) {\n return {\n path: appendPathSegment(path, \"__proto__\"),\n reason: \"__proto__ keys are not portable JSON data\",\n };\n }\n if (Object.getOwnPropertySymbols(value).length > 0)\n return { path, reason: \"symbol keys are not JSON-compatible\" };\n const allowed = new Set(allowedNonEnumerableProperties);\n for (const [key, descriptor] of Object.entries(\n Object.getOwnPropertyDescriptors(value),\n )) {\n if (\"get\" in descriptor || \"set\" in descriptor)\n return {\n path: appendPathSegment(path, key),\n reason: \"accessor properties are not portable JSON data\",\n };\n if (!descriptor.enumerable && !allowed.has(key))\n return {\n path: appendPathSegment(path, key),\n reason: \"non-enumerable properties would be omitted from JSON\",\n };\n }\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["#cause"],"sources":["../src/index.ts"],"sourcesContent":["export type JsonPrimitive = boolean | null | number | string;\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\nexport type JsonArray = readonly JsonValue[];\nexport type JsonObject = { readonly [key: string]: JsonValue };\n\nexport type ValidationPathSegment = string | number;\nexport type ValidationPath = readonly ValidationPathSegment[];\nexport type ValidationIssue = {\n readonly code: string;\n readonly path: ValidationPath;\n readonly message: string;\n readonly details?: JsonObject;\n};\n\nexport const CONSTRUCTA_ERROR_KINDS = [\n \"configuration\",\n \"dependency\",\n \"execution\",\n \"system\",\n] as const;\nexport type ConstructaErrorKind = (typeof CONSTRUCTA_ERROR_KINDS)[number];\n\nexport const RESERVED_CONSTRUCTA_ERROR_CODES = [\n \"INVALID_RANGE\",\n \"EMPTY_CHOICE\",\n \"INVALID_LENGTH\",\n \"UNKNOWN_GENERATOR\",\n \"REFERENCE_NOT_FOUND\",\n \"CIRCULAR_REFERENCE\",\n \"EXECUTION_FAILED\",\n \"UNSUPPORTED_SCHEMA_VERSION\",\n \"INVALID_CONFIGURATION\",\n \"INVALID_JSON_VALUE\",\n] as const;\nexport type ConstructaErrorCode = Uppercase<string>;\n\nexport type ConstructaErrorOptions = {\n readonly kind: ConstructaErrorKind;\n readonly code: ConstructaErrorCode;\n readonly path: ValidationPath;\n readonly message: string;\n readonly details?: JsonObject;\n};\n\nexport type SafeConstructaError = ConstructaErrorOptions;\n\n/** A safe, serializable error shared by every Constructa surface. */\nexport class ConstructaError extends TypeError {\n readonly kind: ConstructaErrorKind;\n readonly code: ConstructaErrorCode;\n readonly path: ValidationPath;\n readonly details?: JsonObject;\n readonly #cause: unknown;\n\n constructor(options: ConstructaErrorOptions, cause?: unknown) {\n validateConstructaErrorOptions(options);\n super(options.message);\n this.name = \"ConstructaError\";\n this.kind = options.kind;\n this.code = options.code;\n this.path = options.path;\n this.details = options.details;\n this.#cause = cause;\n }\n\n /** Returns only data that is safe to send across a process or network boundary. */\n toJSON(): SafeConstructaError {\n return this.details === undefined\n ? {\n kind: this.kind,\n code: this.code,\n path: this.path,\n message: this.message,\n }\n : {\n kind: this.kind,\n code: this.code,\n path: this.path,\n message: this.message,\n details: this.details,\n };\n }\n\n hasCause(): boolean {\n return this.#cause !== undefined;\n }\n}\n\nexport function createConstructaError(\n options: ConstructaErrorOptions,\n): ConstructaError {\n return new ConstructaError(options);\n}\n\nexport function normalizeConstructaError(\n cause: unknown,\n options: ConstructaErrorOptions,\n): ConstructaError {\n return cause instanceof ConstructaError\n ? cause\n : new ConstructaError(options, cause);\n}\n\nexport const CURRENT_SCHEMA_VERSION = 1;\nexport const SUPPORTED_SCHEMA_VERSIONS = [CURRENT_SCHEMA_VERSION] as const;\nexport type SchemaVersion = (typeof SUPPORTED_SCHEMA_VERSIONS)[number];\n\ndeclare const generatorOutput: unique symbol;\n\n/**\n * Portable executable generator data. `Output` exists only to carry compile-time\n * inference and never creates a runtime property.\n */\nexport type GeneratorDefinition<Output = unknown> = JsonObject & {\n readonly type: string;\n readonly [generatorOutput]?: Output;\n};\n\nexport type Infer<Definition> =\n Definition extends GeneratorDefinition<infer Output> ? Output : never;\n\n/** Versioned document containing exactly one root generator definition. */\nexport type GeneratorDocumentV1 = {\n readonly schemaVersion: 1;\n readonly definition: GeneratorDefinition;\n readonly name?: string;\n readonly description?: string;\n};\n\nexport type GeneratorDocument = GeneratorDocumentV1;\n\n/** An explicit one-step migration into a supported document schema version. */\nexport type DocumentMigration = {\n readonly from: number;\n readonly to: SchemaVersion;\n readonly migrate: (document: JsonObject) => unknown;\n};\n\n/** Reusable portable definitions for serialization and integration fixtures. */\nexport const SERIALIZATION_DEFINITION_FIXTURES: readonly GeneratorDefinition[] =\n Object.freeze([\n Object.freeze({ type: \"boolean\" }) as GeneratorDefinition,\n Object.freeze({\n type: \"object\",\n fields: Object.freeze({\n account: Object.freeze({\n type: \"object\",\n fields: Object.freeze({\n id: Object.freeze({ type: \"integer\", min: 1 }),\n }),\n }),\n }),\n }) as GeneratorDefinition,\n ]);\n\n/** Reusable versioned documents for serialization and integration fixtures. */\nexport const SERIALIZATION_DOCUMENT_FIXTURES: readonly GeneratorDocumentV1[] =\n Object.freeze([\n Object.freeze({\n schemaVersion: 1,\n definition: SERIALIZATION_DEFINITION_FIXTURES[0] as GeneratorDefinition,\n }) as GeneratorDocumentV1,\n Object.freeze({\n schemaVersion: 1,\n name: \"Small integer\",\n description: \"An integer in a bounded range.\",\n definition: Object.freeze({ type: \"integer\", min: 1, max: 100 }),\n }) as GeneratorDocumentV1,\n ]);\n\n/** A stable, lowercase identifier used to classify portable metadata. */\nexport type SemanticMetadataId = string;\n\n/** A coarse output-preview classification, not an execution or inference type. */\nexport type GeneratorOutputCategory = SemanticMetadataId;\n\n/**\n * Portable, descriptive metadata for a generator implementation.\n * It is intentionally separate from executable generator definitions.\n */\nexport type GeneratorMetadata = {\n readonly typeId?: SemanticMetadataId;\n readonly displayName?: string;\n readonly description?: string;\n readonly category?: SemanticMetadataId;\n readonly outputCategory?: GeneratorOutputCategory;\n readonly documentationUrl?: string;\n readonly examples?: readonly JsonValue[];\n};\n\nexport const GENERATOR_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"name\",\n \"description\",\n \"definition\",\n] as const;\n\nexport const GENERATOR_METADATA_KEYS = [\n \"typeId\",\n \"displayName\",\n \"description\",\n \"category\",\n \"outputCategory\",\n \"documentationUrl\",\n \"examples\",\n] as const;\n\nconst DOCUMENT_METADATA_KEYS = new Set([\n \"schemaVersion\",\n \"name\",\n \"description\",\n \"owner\",\n \"ownership\",\n \"visibility\",\n \"createdAt\",\n \"updatedAt\",\n \"timestamps\",\n]);\n\nexport type SchemaVersionFailureCode =\n | \"schema_version_missing\"\n | \"schema_version_unsupported\";\nexport type SchemaVersionFailure = {\n readonly code: SchemaVersionFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n readonly details: { readonly supportedVersions: readonly SchemaVersion[] };\n} & ValidationIssue;\n\nexport type GeneratorDefinitionFailureCode =\n | \"generator_definition_not_json\"\n | \"generator_definition_not_object\"\n | \"generator_type_missing\"\n | \"generator_type_invalid\"\n | \"definition_document_metadata\";\nexport type GeneratorDefinitionFailure = {\n readonly code: GeneratorDefinitionFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n};\n\nexport type GeneratorMetadataFailureCode =\n | \"generator_metadata_not_json\"\n | \"generator_metadata_not_object\"\n | \"metadata_type_id_invalid\"\n | \"metadata_display_name_invalid\"\n | \"metadata_description_invalid\"\n | \"metadata_category_invalid\"\n | \"metadata_output_category_invalid\"\n | \"metadata_documentation_url_invalid\"\n | \"metadata_examples_invalid\"\n | \"metadata_property_unknown\";\nexport type GeneratorMetadataFailure = {\n readonly code: GeneratorMetadataFailureCode;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n};\n\nexport type GeneratorDocumentFailureCode =\n | SchemaVersionFailureCode\n | GeneratorDefinitionFailureCode\n | \"generator_document_not_json\"\n | \"generator_document_not_object\"\n | \"definition_missing\"\n | \"name_invalid\"\n | \"description_invalid\"\n | \"top_level_property_unknown\"\n | \"configuration_envelope_removed\";\nexport type GeneratorDocumentFailure =\n | SchemaVersionFailure\n | {\n readonly code: Exclude<\n GeneratorDocumentFailureCode,\n SchemaVersionFailureCode\n >;\n readonly message: string;\n readonly path: ValidationPath;\n readonly severity: \"error\";\n };\nexport type GeneratorDocumentParseResult =\n | { readonly success: true; readonly value: GeneratorDocumentV1 }\n | { readonly success: false; readonly failure: GeneratorDocumentFailure };\n\nexport class JsonValueError extends ConstructaError {\n readonly issue: ValidationIssue;\n constructor(path: ValidationPath, reason: string) {\n super({\n kind: \"configuration\",\n code: \"INVALID_JSON_VALUE\",\n path,\n message: reason,\n details: { issueCode: \"invalid_json_value\" },\n });\n this.name = \"JsonValueError\";\n this.issue = { code: \"invalid_json_value\", path, message: reason };\n }\n}\n\nexport class SchemaVersionError extends ConstructaError {\n readonly failure: SchemaVersionFailure;\n constructor(failure: SchemaVersionFailure) {\n super({\n kind: \"configuration\",\n code: \"UNSUPPORTED_SCHEMA_VERSION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"SchemaVersionError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorDefinitionError extends ConstructaError {\n readonly failure: GeneratorDefinitionFailure;\n constructor(failure: GeneratorDefinitionFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorDefinitionError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorMetadataError extends ConstructaError {\n readonly failure: GeneratorMetadataFailure;\n constructor(failure: GeneratorMetadataFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorMetadataError\";\n this.failure = failure;\n }\n}\n\nexport class GeneratorDocumentError extends ConstructaError {\n readonly failure: GeneratorDocumentFailure;\n constructor(failure: GeneratorDocumentFailure) {\n super({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: failure.path,\n message: failure.message,\n details: { issueCode: failure.code },\n });\n this.name = \"GeneratorDocumentError\";\n this.failure = failure;\n }\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return validateJsonValue(value).length === 0;\n}\nexport function isSchemaVersion(value: unknown): value is SchemaVersion {\n return value === CURRENT_SCHEMA_VERSION;\n}\nexport function isGeneratorDefinition(\n value: unknown,\n): value is GeneratorDefinition {\n return validateGeneratorDefinition(value).length === 0;\n}\nexport function isDocument(value: unknown): value is GeneratorDocumentV1 {\n return validateDocument(value).length === 0;\n}\nexport function isGeneratorMetadata(\n value: unknown,\n): value is GeneratorMetadata {\n return validateGeneratorMetadata(value).length === 0;\n}\nexport function assertJsonValue(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is JsonValue {\n const [issue] = validateJsonValue(value, path);\n if (issue !== undefined) throw new JsonValueError(issue.path, issue.message);\n}\nexport function assertSchemaVersion(\n value: unknown,\n path: ValidationPath = [\"schemaVersion\"],\n): asserts value is SchemaVersion {\n const failure = findSchemaVersionValueFailure(value, path);\n if (failure !== undefined) throw new SchemaVersionError(failure);\n}\nexport function assertGeneratorDefinition(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorDefinition {\n const [failure] = validateGeneratorDefinition(value, path);\n if (failure !== undefined) throw new GeneratorDefinitionError(failure);\n}\nexport function assertGeneratorMetadata(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorMetadata {\n const [failure] = validateGeneratorMetadata(value, path);\n if (failure !== undefined) throw new GeneratorMetadataError(failure);\n}\nexport function assertDocument(\n value: unknown,\n path: ValidationPath = [],\n): asserts value is GeneratorDocumentV1 {\n const [issue] = validateDocument(value, path);\n if (issue !== undefined) throw new GeneratorDocumentError(issue);\n}\nexport function parseDocument(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorDocumentV1 {\n const parser = resolveDocumentParser(value, path);\n return parser(value, path);\n}\nexport function safeParseDocument(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorDocumentParseResult {\n const [failure] = validateDocument(value, path);\n return failure === undefined\n ? { success: true, value: value as GeneratorDocumentV1 }\n : { success: false, failure };\n}\n\n/**\n * Applies one declared migration and validates its result through the normal\n * version parser. Migrations are never applied implicitly by `parseDocument`.\n */\nexport function migrateDocument(\n value: unknown,\n migration: DocumentMigration,\n): GeneratorDocumentV1 {\n assertDocumentMigration(migration);\n assertJsonValue(value);\n if (!isJsonRecord(value)) {\n throw new GeneratorDocumentError(\n documentFailure(\"generator_document_not_object\", []),\n );\n }\n const sourceVersion = value.schemaVersion;\n if (\n !Number.isSafeInteger(sourceVersion) ||\n sourceVersion !== migration.from\n ) {\n throw new SchemaVersionError({\n code: \"schema_version_unsupported\",\n path: [\"schemaVersion\"],\n severity: \"error\",\n message: `schemaVersion must be ${migration.from} before this migration.`,\n details: { supportedVersions: [migration.to] },\n });\n }\n\n const source = JSON.parse(JSON.stringify(value)) as JsonObject;\n let migrated: unknown;\n try {\n migrated = migration.migrate(source);\n } catch (cause) {\n throw normalizeConstructaError(cause, {\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: [\"migration\"],\n message: \"Document migration failed.\",\n });\n }\n return parseDocument(migrated);\n}\n\ntype DocumentParser = (\n value: unknown,\n path: ValidationPath,\n) => GeneratorDocumentV1;\n\nconst DOCUMENT_PARSERS: ReadonlyMap<SchemaVersion, DocumentParser> = new Map([\n [CURRENT_SCHEMA_VERSION, parseCurrentDocument],\n]);\n\nfunction resolveDocumentParser(\n value: unknown,\n path: ValidationPath,\n): DocumentParser {\n if (!isJsonRecord(value) || !Object.hasOwn(value, \"schemaVersion\")) {\n assertDocument(value, path);\n throw new ConstructaError({\n kind: \"system\",\n code: \"INVALID_CONFIGURATION\",\n path,\n message:\n \"Document validation unexpectedly succeeded without a schema version.\",\n });\n }\n const parser = DOCUMENT_PARSERS.get(value.schemaVersion as SchemaVersion);\n if (parser === undefined) {\n const failure = findSchemaVersionValueFailure(\n value.schemaVersion,\n appendPathSegment(path, \"schemaVersion\"),\n );\n if (failure !== undefined) throw new SchemaVersionError(failure);\n }\n return parser ?? parseCurrentDocument;\n}\n\nfunction parseCurrentDocument(\n value: unknown,\n path: ValidationPath,\n): GeneratorDocumentV1 {\n assertDocument(value, path);\n return value;\n}\n\nfunction assertDocumentMigration(migration: DocumentMigration): void {\n if (\n typeof migration !== \"object\" ||\n migration === null ||\n !Number.isSafeInteger(migration.from) ||\n migration.from < 0 ||\n !isSchemaVersion(migration.to) ||\n typeof migration.migrate !== \"function\"\n ) {\n throw new ConstructaError({\n kind: \"configuration\",\n code: \"INVALID_CONFIGURATION\",\n path: [\"migration\"],\n message:\n \"A migration must declare a non-negative source version, a supported target version, and a migrate function.\",\n });\n }\n}\n\n/**\n * Serializes a portable definition with recursively sorted object keys and a\n * trailing newline. The result is intended for stable diffs, not execution.\n */\nexport function serializeDefinition(value: unknown): string {\n assertGeneratorDefinition(value);\n return serializeCanonicalJson(value);\n}\n\n/** Serializes a validated versioned document using the same canonical format. */\nexport function serializeDocument(value: unknown): string {\n assertDocument(value);\n return serializeCanonicalJson(value);\n}\n\nfunction serializeCanonicalJson(value: JsonValue): string {\n return `${JSON.stringify(canonicalizeJson(value), null, 2)}\\n`;\n}\n\nfunction canonicalizeJson(value: JsonValue): JsonValue {\n if (Array.isArray(value)) return value.map(canonicalizeJson);\n if (isJsonRecord(value)) {\n const result: Record<string, JsonValue> = {};\n for (const key of Object.keys(value).sort()) {\n result[key] = canonicalizeJson(value[key] as JsonValue);\n }\n return result;\n }\n return value;\n}\n\nexport function validateJsonValue(\n value: unknown,\n path: ValidationPath = [],\n): readonly ValidationIssue[] {\n const error = findJsonValueError(value, path);\n return error === undefined\n ? []\n : [{ code: \"invalid_json_value\", path: error.path, message: error.reason }];\n}\n\nfunction findJsonValueError(\n value: unknown,\n path: ValidationPath,\n): { path: ValidationPath; reason: string } | undefined {\n return findJsonValueErrorInternal(value, path, new Set());\n}\n\n/** Returns all independent document validation issues in deterministic order. */\nexport function validateDocument(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorDocumentFailure[] {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return [\n documentFailure(\n \"generator_document_not_json\",\n jsonError.path,\n jsonError.reason,\n ),\n ];\n }\n if (!isJsonRecord(value)) {\n return [documentFailure(\"generator_document_not_object\", path)];\n }\n\n const issues: GeneratorDocumentFailure[] = [];\n if (Object.hasOwn(value, \"configuration\") && Object.hasOwn(value, \"type\")) {\n issues.push(documentFailure(\"configuration_envelope_removed\", path));\n }\n for (const key of Object.keys(value)) {\n if (!GENERATOR_DOCUMENT_TOP_LEVEL_KEYS.includes(key as never)) {\n issues.push(\n documentFailure(\n \"top_level_property_unknown\",\n appendPathSegment(path, key),\n `Unknown top-level property: ${key}`,\n ),\n );\n }\n }\n\n const versionFailure = findSchemaVersionFailure(value, path);\n if (versionFailure !== undefined) issues.push(versionFailure);\n for (const property of [\"name\", \"description\"] as const) {\n if (Object.hasOwn(value, property) && typeof value[property] !== \"string\") {\n issues.push(\n documentFailure(\n property === \"name\" ? \"name_invalid\" : \"description_invalid\",\n appendPathSegment(path, property),\n ),\n );\n }\n }\n if (!Object.hasOwn(value, \"definition\")) {\n issues.push(\n documentFailure(\n \"definition_missing\",\n appendPathSegment(path, \"definition\"),\n ),\n );\n } else {\n issues.push(\n ...validateGeneratorDefinition(\n value.definition,\n appendPathSegment(path, \"definition\"),\n ),\n );\n }\n return issues;\n}\n\n/** Returns definition issues. Nested typed definitions are validated recursively. */\nexport function validateGeneratorDefinition(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorDefinitionFailure[] {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return [\n definitionFailure(\n \"generator_definition_not_json\",\n jsonError.path,\n jsonError.reason,\n ),\n ];\n }\n if (!isJsonRecord(value)) {\n return [definitionFailure(\"generator_definition_not_object\", path)];\n }\n\n const issues: GeneratorDefinitionFailure[] = [];\n collectDefinitionMetadataIssues(value as JsonObject, path, issues, true);\n return issues;\n}\nexport function validateGeneratorMetadata(\n value: unknown,\n path: ValidationPath = [],\n): readonly GeneratorMetadataFailure[] {\n const failure = findGeneratorMetadataFailure(value, path);\n return failure === undefined ? [] : [failure];\n}\n\nfunction findGeneratorMetadataFailure(\n value: unknown,\n path: ValidationPath = [],\n): GeneratorMetadataFailure | undefined {\n const jsonError = findJsonValueError(value, path);\n if (jsonError !== undefined) {\n return metadataFailure(\n \"generator_metadata_not_json\",\n jsonError.path,\n jsonError.reason,\n );\n }\n if (!isJsonRecord(value)) {\n return metadataFailure(\"generator_metadata_not_object\", path);\n }\n\n const unknownKey = Object.keys(value).find(\n (key) => !GENERATOR_METADATA_KEYS.includes(key as never),\n );\n if (unknownKey !== undefined) {\n return metadataFailure(\n \"metadata_property_unknown\",\n appendPathSegment(path, unknownKey),\n `Unknown metadata property: ${unknownKey}`,\n );\n }\n\n for (const property of [\"typeId\", \"category\", \"outputCategory\"] as const) {\n if (\n Object.hasOwn(value, property) &&\n (typeof value[property] !== \"string\" || !isMetadataId(value[property]))\n ) {\n const code =\n property === \"typeId\"\n ? \"metadata_type_id_invalid\"\n : property === \"category\"\n ? \"metadata_category_invalid\"\n : \"metadata_output_category_invalid\";\n return metadataFailure(code, appendPathSegment(path, property));\n }\n }\n\n for (const property of [\n \"displayName\",\n \"description\",\n \"documentationUrl\",\n ] as const) {\n if (Object.hasOwn(value, property) && typeof value[property] !== \"string\") {\n const code =\n property === \"displayName\"\n ? \"metadata_display_name_invalid\"\n : property === \"description\"\n ? \"metadata_description_invalid\"\n : \"metadata_documentation_url_invalid\";\n return metadataFailure(code, appendPathSegment(path, property));\n }\n }\n\n if (Object.hasOwn(value, \"examples\") && !Array.isArray(value.examples)) {\n return metadataFailure(\n \"metadata_examples_invalid\",\n appendPathSegment(path, \"examples\"),\n );\n }\n\n return undefined;\n}\nfunction findSchemaVersionFailure(\n value: unknown,\n path: ValidationPath = [],\n): SchemaVersionFailure | undefined {\n if (!isJsonRecord(value) || !Object.hasOwn(value, \"schemaVersion\"))\n return createSchemaVersionFailure(\n \"schema_version_missing\",\n appendPathSegment(path, \"schemaVersion\"),\n );\n return findSchemaVersionValueFailure(\n value.schemaVersion,\n appendPathSegment(path, \"schemaVersion\"),\n );\n}\nfunction findSchemaVersionValueFailure(\n value: unknown,\n path: ValidationPath = [\"schemaVersion\"],\n): SchemaVersionFailure | undefined {\n return isSchemaVersion(value)\n ? undefined\n : createSchemaVersionFailure(\"schema_version_unsupported\", path);\n}\n\nfunction createSchemaVersionFailure(\n code: SchemaVersionFailureCode,\n path: ValidationPath,\n): SchemaVersionFailure {\n return {\n code,\n message:\n code === \"schema_version_missing\"\n ? `schemaVersion is required and must be ${CURRENT_SCHEMA_VERSION}`\n : `schemaVersion must be ${CURRENT_SCHEMA_VERSION}`,\n path,\n severity: \"error\",\n details: { supportedVersions: SUPPORTED_SCHEMA_VERSIONS },\n };\n}\nfunction definitionFailure(\n code: GeneratorDefinitionFailureCode,\n path: ValidationPath,\n message?: string,\n): GeneratorDefinitionFailure {\n const messages: Record<GeneratorDefinitionFailureCode, string> = {\n generator_definition_not_json:\n \"generator definition must be portable JSON data\",\n generator_definition_not_object:\n \"generator definition must be a JSON object\",\n generator_type_missing: \"type is required\",\n generator_type_invalid: \"type must be a non-empty string\",\n definition_document_metadata:\n \"document metadata is not allowed in a generator definition\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction metadataFailure(\n code: GeneratorMetadataFailureCode,\n path: ValidationPath,\n message?: string,\n): GeneratorMetadataFailure {\n const messages: Record<GeneratorMetadataFailureCode, string> = {\n generator_metadata_not_json:\n \"generator metadata must be portable JSON data\",\n generator_metadata_not_object: \"generator metadata must be a JSON object\",\n metadata_type_id_invalid: \"typeId must be a stable metadata ID\",\n metadata_display_name_invalid: \"displayName must be a string when present\",\n metadata_description_invalid: \"description must be a string when present\",\n metadata_category_invalid: \"category must be a stable metadata ID\",\n metadata_output_category_invalid:\n \"outputCategory must be a stable metadata ID\",\n metadata_documentation_url_invalid:\n \"documentationUrl must be a string when present\",\n metadata_examples_invalid: \"examples must be an array when present\",\n metadata_property_unknown: \"unknown metadata properties are not allowed\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction documentFailure(\n code: Exclude<GeneratorDocumentFailureCode, SchemaVersionFailureCode>,\n path: ValidationPath,\n message?: string,\n): Exclude<GeneratorDocumentFailure, SchemaVersionFailure> {\n const messages: Record<\n Exclude<GeneratorDocumentFailureCode, SchemaVersionFailureCode>,\n string\n > = {\n generator_document_not_json:\n \"generator document must be portable JSON data\",\n generator_document_not_object: \"generator document must be a JSON object\",\n generator_definition_not_json:\n \"generator definition must be portable JSON data\",\n generator_definition_not_object:\n \"generator definition must be a JSON object\",\n generator_type_missing: \"type is required\",\n generator_type_invalid: \"type must be a non-empty string\",\n definition_document_metadata:\n \"document metadata is not allowed in a generator definition\",\n definition_missing: \"definition is required\",\n name_invalid: \"name must be a string when present\",\n description_invalid: \"description must be a string when present\",\n top_level_property_unknown: \"unknown top-level properties are not allowed\",\n configuration_envelope_removed:\n \"The configuration envelope was removed; put generator fields directly inside definition.\",\n };\n return { code, message: message ?? messages[code], path, severity: \"error\" };\n}\nfunction appendPathSegment(\n path: ValidationPath,\n segment: ValidationPathSegment,\n): ValidationPath {\n return [...path, segment];\n}\n\nfunction validateConstructaErrorOptions(options: ConstructaErrorOptions): void {\n if (!CONSTRUCTA_ERROR_KINDS.includes(options.kind)) {\n throw new TypeError(\"kind must be a Constructa error kind\");\n }\n if (!/^[A-Z][A-Z0-9_]*$/u.test(options.code)) {\n throw new TypeError(\"code must be an uppercase stable error code\");\n }\n if (typeof options.message !== \"string\" || options.message.length === 0) {\n throw new TypeError(\"message must be a non-empty string\");\n }\n for (const segment of options.path) {\n if (\n typeof segment !== \"string\" &&\n (typeof segment !== \"number\" || !Number.isSafeInteger(segment))\n ) {\n throw new TypeError(\"path segments must be strings or safe integers\");\n }\n }\n if (\n options.details !== undefined &&\n (!isJsonRecord(options.details) || !isJsonValue(options.details))\n ) {\n throw new TypeError(\"details must be a portable JSON object\");\n }\n}\n\nfunction isMetadataId(value: string) {\n return /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/u.test(value);\n}\n\nfunction collectDefinitionMetadataIssues(\n value: JsonObject,\n path: ValidationPath,\n issues: GeneratorDefinitionFailure[],\n isDefinition: boolean,\n): void {\n if (isDefinition) {\n if (!Object.hasOwn(value, \"type\")) {\n issues.push(\n definitionFailure(\n \"generator_type_missing\",\n appendPathSegment(path, \"type\"),\n ),\n );\n } else if (\n typeof value.type !== \"string\" ||\n value.type.trim().length === 0\n ) {\n issues.push(\n definitionFailure(\n \"generator_type_invalid\",\n appendPathSegment(path, \"type\"),\n ),\n );\n }\n for (const key of Object.keys(value)) {\n if (key !== \"type\" && DOCUMENT_METADATA_KEYS.has(key)) {\n issues.push(\n definitionFailure(\n \"definition_document_metadata\",\n appendPathSegment(path, key),\n ),\n );\n }\n }\n }\n\n for (const [key, child] of Object.entries(value)) {\n if (key === \"type\") continue;\n collectNestedDefinitionMetadataIssues(\n child,\n appendPathSegment(path, key),\n issues,\n );\n }\n}\n\nfunction collectNestedDefinitionMetadataIssues(\n value: JsonValue,\n path: ValidationPath,\n issues: GeneratorDefinitionFailure[],\n): void {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n collectNestedDefinitionMetadataIssues(\n value[index],\n appendPathSegment(path, index),\n issues,\n );\n }\n return;\n }\n if (!isJsonRecord(value)) return;\n collectDefinitionMetadataIssues(\n value,\n path,\n issues,\n Object.hasOwn(value, \"type\"),\n );\n}\n\nfunction isJsonRecord(value: unknown): value is Record<string, unknown> {\n const prototype =\n typeof value === \"object\" && value !== null\n ? Object.getPrototypeOf(value)\n : undefined;\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (prototype === null || prototype === Object.prototype)\n );\n}\nfunction findJsonValueErrorInternal(\n value: unknown,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return undefined;\n case \"number\":\n if (!Number.isFinite(value))\n return { path, reason: \"number must be finite\" };\n return Object.is(value, -0)\n ? { path, reason: \"number must not be negative zero\" }\n : undefined;\n case \"object\":\n return value === null\n ? undefined\n : findJsonObjectError(value, path, ancestors);\n case \"bigint\":\n case \"function\":\n case \"symbol\":\n case \"undefined\":\n return { path, reason: `${typeof value} is not JSON-compatible` };\n }\n}\nfunction findJsonObjectError(\n value: object,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n if (ancestors.has(value))\n return { path, reason: \"cyclic objects are not JSON-compatible\" };\n if (\n \"toJSON\" in value &&\n typeof (value as { readonly toJSON?: unknown }).toJSON === \"function\"\n )\n return { path, reason: \"objects with toJSON behavior are not portable\" };\n ancestors.add(value);\n const error = Array.isArray(value)\n ? findJsonArrayError(value, path, ancestors)\n : findJsonRecordError(value, path, ancestors);\n ancestors.delete(value);\n return error;\n}\nfunction findJsonArrayError(\n value: readonly unknown[],\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n const extraProperty = Object.keys(value).find((key) => !isArrayIndexKey(key));\n if (extraProperty !== undefined)\n return {\n path: appendPathSegment(path, extraProperty),\n reason: \"array object properties would be omitted from JSON\",\n };\n const propertyError = findUnsupportedOwnProperty(value, path, [\"length\"]);\n if (propertyError !== undefined) return propertyError;\n for (let index = 0; index < value.length; index += 1) {\n if (!(index in value))\n return {\n path: appendPathSegment(path, index),\n reason: \"sparse array slots are not JSON-compatible\",\n };\n const itemError = findJsonValueErrorInternal(\n value[index],\n appendPathSegment(path, index),\n ancestors,\n );\n if (itemError !== undefined) return itemError;\n }\n return undefined;\n}\nfunction isArrayIndexKey(key: string) {\n const index = Number(key);\n return (\n Number.isInteger(index) &&\n index >= 0 &&\n index < 2 ** 32 - 1 &&\n String(index) === key\n );\n}\nfunction findJsonRecordError(\n value: object,\n path: ValidationPath,\n ancestors: Set<object>,\n): { path: ValidationPath; reason: string } | undefined {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype)\n return { path, reason: \"object must be a plain JSON record\" };\n const propertyError = findUnsupportedOwnProperty(value, path);\n if (propertyError !== undefined) return propertyError;\n for (const key of Object.keys(value)) {\n const itemError = findJsonValueErrorInternal(\n (value as Record<string, unknown>)[key],\n appendPathSegment(path, key),\n ancestors,\n );\n if (itemError !== undefined) return itemError;\n }\n return undefined;\n}\nfunction findUnsupportedOwnProperty(\n value: object,\n path: ValidationPath,\n allowedNonEnumerableProperties: readonly string[] = [],\n): { path: ValidationPath; reason: string } | undefined {\n if (Object.hasOwn(value, \"__proto__\")) {\n return {\n path: appendPathSegment(path, \"__proto__\"),\n reason: \"__proto__ keys are not portable JSON data\",\n };\n }\n if (Object.getOwnPropertySymbols(value).length > 0)\n return { path, reason: \"symbol keys are not JSON-compatible\" };\n const allowed = new Set(allowedNonEnumerableProperties);\n for (const [key, descriptor] of Object.entries(\n Object.getOwnPropertyDescriptors(value),\n )) {\n if (\"get\" in descriptor || \"set\" in descriptor)\n return {\n path: appendPathSegment(path, key),\n reason: \"accessor properties are not portable JSON data\",\n };\n if (!descriptor.enumerable && !allowed.has(key))\n return {\n path: appendPathSegment(path, key),\n reason: \"non-enumerable properties would be omitted from JSON\",\n };\n }\n return undefined;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "constructa-schema",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Portable schemas and types for Constructa generator definitions.",
5
5
  "private": false,
6
6
  "license": "MIT",