@mica-js/core 0.1.0 → 0.1.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.md +431 -10
- package/dist/canvas/index.d.ts +38 -147
- package/dist/canvas/index.js +196 -153
- package/dist/canvas/index.js.map +1 -1
- package/dist/index.d.ts +445 -4
- package/dist/index.js +2432 -4
- package/dist/index.js.map +1 -1
- package/dist/schematic/index.d.ts +11 -10
- package/dist/schematic/index.js +3 -3
- package/dist/schematic/index.js.map +1 -1
- package/dist/{validate-COqYIMQg.js → validate-DuALfDe0.js} +5 -5
- package/dist/validate-DuALfDe0.js.map +1 -0
- package/package.json +4 -1
- package/dist/validate-COqYIMQg.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/
|
|
1
|
+
//#region src/format/value.ts
|
|
2
2
|
/** Where an image / binary property value lives (#7). */
|
|
3
3
|
var ASSET_MODES = [
|
|
4
4
|
"file",
|
|
@@ -35,7 +35,7 @@ function assetSrcError(mode, src) {
|
|
|
35
35
|
return mode === "file" ? assetPathError(src) : void 0;
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
|
-
//#region src/
|
|
38
|
+
//#region src/format/errors.ts
|
|
39
39
|
/**
|
|
40
40
|
* Thrown when input violates the schematic format contract.
|
|
41
41
|
* `diagnostics` carries every problem found, so callers can report them all at once.
|
|
@@ -64,7 +64,7 @@ function throwIfErrors(diagnostics) {
|
|
|
64
64
|
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) throw new SchematicError(diagnostics);
|
|
65
65
|
}
|
|
66
66
|
//#endregion
|
|
67
|
-
//#region src/
|
|
67
|
+
//#region src/format/input.ts
|
|
68
68
|
/** Strings are parsed as JSON text; any other value is validated as-is. */
|
|
69
69
|
function parseInput(input, diagnostics) {
|
|
70
70
|
if (typeof input !== "string") return {
|
|
@@ -90,7 +90,7 @@ function parseInput(input, diagnostics) {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
//#endregion
|
|
93
|
-
//#region src/
|
|
93
|
+
//#region src/format/validate.ts
|
|
94
94
|
function toPointer(path) {
|
|
95
95
|
if (path.length === 0) return "";
|
|
96
96
|
return `/${path.map((segment) => segment.replace(/~/g, "~0").replace(/\//g, "~1")).join("/")}`;
|
|
@@ -287,4 +287,4 @@ function checkDuplicateIds(entries, kind, diagnostics) {
|
|
|
287
287
|
//#endregion
|
|
288
288
|
export { ASSET_MODES as _, readArrayField as a, isAssetMode as b, readObjectField as c, readStringField as d, report as f, throwIfErrors as g, SchematicError as h, isRecord as i, readPoint as l, parseInput as m, forbidUnknownFields as n, readIntegerField as o, toPointer as p, hasErrors as r, readNumberField as s, checkDuplicateIds as t, readProperties as u, assetPathError as v, isAssetReference as x, base64Error as y };
|
|
289
289
|
|
|
290
|
-
//# sourceMappingURL=validate-
|
|
290
|
+
//# sourceMappingURL=validate-DuALfDe0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-DuALfDe0.js","names":[],"sources":["../src/format/value.ts","../src/format/errors.ts","../src/format/input.ts","../src/format/validate.ts"],"sourcesContent":["/** 2D point shared by the `.sch` and `.cnv` contracts. */\nexport interface Point {\n readonly x: number;\n readonly y: number;\n}\n\n/** Where an image / binary property value lives (#7). */\nexport type AssetMode = 'file' | 'inline' | 'store';\n\n/**\n * Reference to a project asset instead of inline bytes (#7): `file` is a project-root relative\n * POSIX path, `inline` is base64 text and `store` is a host resource identifier.\n */\nexport interface AssetReference {\n readonly src: string;\n readonly mode: AssetMode;\n}\n\n/**\n * Instance property value stored in `symbol.properties` (see #6 / #7): a scalar, a resource\n * reference for `image` / `binary` properties, or `null` for an explicitly cleared nullable one.\n */\nexport type PropertyValue = string | number | boolean | AssetReference | null;\n\n/** Where an image / binary property value lives (#7). */\nexport const ASSET_MODES = ['file', 'inline', 'store'] as const;\n\nexport function isAssetMode(value: unknown): value is AssetMode {\n return typeof value === 'string' && (ASSET_MODES as readonly string[]).includes(value);\n}\n\nexport function isAssetReference(value: unknown): value is AssetReference {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n return typeof record['src'] === 'string' && isAssetMode(record['mode']);\n}\n\n/**\n * `file` mode payload rules (#7): a project-root relative POSIX path that never escapes the\n * project root and never turns into a URL.\n */\nexport function assetPathError(src: string): string | undefined {\n if (src.startsWith('/')) {\n return 'must be relative to the project root, not absolute';\n }\n if (/^[A-Za-z]:/.test(src)) {\n return 'must not carry a drive letter';\n }\n if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(src)) {\n return 'must not be a URL';\n }\n if (src.includes('\\\\')) {\n return 'must use POSIX separators';\n }\n const escaping = src.split('/').find((segment) => segment === '..' || segment.startsWith('~'));\n if (escaping !== undefined) {\n return `must stay inside the project root (segment \"${escaping}\")`;\n }\n return undefined;\n}\n\n/** `inline` mode payload: base64 text, so hosts decode without guessing the encoding. */\nexport function base64Error(src: string): string | undefined {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(src)\n ? undefined\n : 'must be base64 text';\n}\n\n/** Payload problem for a resource reference `src`, or `undefined` when it is well formed. */\nexport function assetSrcError(mode: AssetMode, src: string): string | undefined {\n if (mode === 'inline') {\n return base64Error(src);\n }\n return mode === 'file' ? assetPathError(src) : undefined;\n}\n","import type { Diagnostic, DiagnosticCode } from './diagnostics';\n\n/**\n * Thrown when input violates the schematic format contract.\n * `diagnostics` carries every problem found, so callers can report them all at once.\n */\nexport class SchematicError extends Error {\n readonly diagnostics: readonly Diagnostic[];\n\n constructor(diagnostics: readonly Diagnostic[]) {\n super(buildMessage(diagnostics));\n this.name = 'SchematicError';\n this.diagnostics = diagnostics;\n }\n\n /** Code of the first diagnostic, for coarse programmatic handling. */\n get code(): DiagnosticCode | undefined {\n return this.diagnostics[0]?.code;\n }\n}\n\nfunction buildMessage(diagnostics: readonly Diagnostic[]): string {\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === 'error');\n const relevant = errors.length > 0 ? errors : diagnostics;\n const [first, ...rest] = relevant;\n if (first === undefined) {\n return 'Schematic validation failed.';\n }\n const location =\n first.pointer === undefined || first.pointer === '' ? '' : ` at ${first.pointer}`;\n const suffix = rest.length === 0 ? '' : ` (and ${rest.length} more)`;\n return `${first.code}${location}: ${first.message}${suffix}`;\n}\n\nexport function throwIfErrors(diagnostics: readonly Diagnostic[]): void {\n if (diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {\n throw new SchematicError(diagnostics);\n }\n}\n","import type { Diagnostic } from './diagnostics';\n\nexport interface ParsedInput {\n readonly ok: boolean;\n readonly value: unknown;\n}\n\n/** Strings are parsed as JSON text; any other value is validated as-is. */\nexport function parseInput(input: string | unknown, diagnostics: Diagnostic[]): ParsedInput {\n if (typeof input !== 'string') {\n return { ok: true, value: input };\n }\n try {\n return { ok: true, value: JSON.parse(input) as unknown };\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n diagnostics.push({\n severity: 'error',\n code: 'json/invalid',\n message: `Invalid JSON: ${detail}`,\n });\n return { ok: false, value: undefined };\n }\n}\n","import type { Diagnostic, DiagnosticCode, DiagnosticEntity } from './diagnostics';\nimport type { AssetMode, AssetReference, Point, PropertyValue } from './value';\nimport { assetSrcError, isAssetMode } from './value';\n\nexport function toPointer(path: readonly string[]): string {\n if (path.length === 0) {\n return '';\n }\n const segments = path.map((segment) => segment.replace(/~/g, '~0').replace(/\\//g, '~1'));\n return `/${segments.join('/')}`;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function hasErrors(diagnostics: readonly Diagnostic[]): boolean {\n return diagnostics.some((diagnostic) => diagnostic.severity === 'error');\n}\n\nexport function report(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n path: readonly string[],\n entity?: DiagnosticEntity,\n): void {\n const diagnostic: Diagnostic = {\n severity: 'error',\n code,\n message,\n pointer: toPointer(path),\n };\n diagnostics.push(entity === undefined ? diagnostic : { ...diagnostic, entity });\n}\n\nexport function forbidUnknownFields(\n value: Record<string, unknown>,\n allowed: readonly string[],\n path: readonly string[],\n diagnostics: Diagnostic[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) {\n report(diagnostics, 'schema/unknown-field', `Unknown field \"${key}\".`, [...path, key]);\n }\n }\n}\n\nexport interface StringFieldOptions {\n readonly nonEmpty?: boolean;\n}\n\nexport function readStringField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n options: StringFieldOptions = {},\n): string | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (typeof field !== 'string') {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be a string.`, fieldPath);\n return undefined;\n }\n if (options.nonEmpty === true && field.length === 0) {\n report(diagnostics, 'schema/invalid-value', `Field \"${key}\" must not be empty.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readNumberField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): number | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (typeof field !== 'number') {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be a number.`, fieldPath);\n return undefined;\n }\n if (!Number.isFinite(field)) {\n report(\n diagnostics,\n 'schema/invalid-value',\n `Field \"${key}\" must be a finite number.`,\n fieldPath,\n );\n return undefined;\n }\n return field;\n}\n\nexport function readIntegerField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): number | undefined {\n const field = readNumberField(value, key, path, diagnostics);\n if (field === undefined) {\n return undefined;\n }\n if (!Number.isInteger(field)) {\n report(diagnostics, 'schema/invalid-value', `Field \"${key}\" must be an integer.`, [\n ...path,\n key,\n ]);\n return undefined;\n }\n return field;\n}\n\nexport function readArrayField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): unknown[] | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (!Array.isArray(field)) {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be an array.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readObjectField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Record<string, unknown> | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (!isRecord(field)) {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be an object.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readPoint(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Point | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Point must be an object.', path);\n return undefined;\n }\n forbidUnknownFields(value, ['x', 'y'], path, diagnostics);\n const x = readNumberField(value, 'x', path, diagnostics);\n const y = readNumberField(value, 'y', path, diagnostics);\n if (x === undefined || y === undefined) {\n return undefined;\n }\n return { x, y };\n}\n\nexport interface IdentifiedEntry {\n readonly id: string;\n readonly path: readonly string[];\n}\n\n/**\n * Reads an `image` / `binary` property value: a resource reference `{ \"src\", \"mode\" }` (#7).\n * `src` is checked against the rules of its mode; content itself lives outside the document.\n */\nexport function readAssetReference(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): AssetReference | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Resource reference must be an object.', path);\n return undefined;\n }\n forbidUnknownFields(value, ['src', 'mode'], path, diagnostics);\n const src = readStringField(value, 'src', path, diagnostics, { nonEmpty: true });\n let mode: AssetMode | undefined;\n if (!Object.prototype.hasOwnProperty.call(value, 'mode')) {\n report(diagnostics, 'schema/missing-field', 'Missing required field \"mode\".', [\n ...path,\n 'mode',\n ]);\n } else if (isAssetMode(value['mode'])) {\n mode = value['mode'];\n } else {\n report(\n diagnostics,\n 'schema/invalid-value',\n 'Field \"mode\" must be \"file\", \"inline\" or \"store\".',\n [...path, 'mode'],\n );\n }\n if (src === undefined || mode === undefined) {\n return undefined;\n }\n const srcError = assetSrcError(mode, src);\n if (srcError !== undefined) {\n report(diagnostics, 'schema/invalid-value', `Field \"src\" ${srcError}.`, [...path, 'src']);\n return undefined;\n }\n return { src, mode };\n}\n\n/** Reads an optional `properties` map of scalars, resource references and explicit nulls (#6). */\nexport function readProperties(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Record<string, PropertyValue> | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Field \"properties\" must be an object.', path);\n return undefined;\n }\n const properties: Record<string, PropertyValue> = Object.create(null);\n let failed = false;\n for (const [key, entry] of Object.entries(value)) {\n if (key.length === 0) {\n report(diagnostics, 'schema/invalid-value', 'Property keys must not be empty.', path);\n failed = true;\n continue;\n }\n const entryPath = [...path, key];\n if (typeof entry === 'string' || typeof entry === 'boolean') {\n properties[key] = entry;\n continue;\n }\n if (entry === null) {\n properties[key] = null;\n continue;\n }\n if (typeof entry === 'number') {\n if (!Number.isFinite(entry)) {\n report(\n diagnostics,\n 'schema/invalid-value',\n `Property \"${key}\" must be a finite number.`,\n entryPath,\n );\n failed = true;\n continue;\n }\n properties[key] = entry;\n continue;\n }\n if (typeof entry === 'object' && !Array.isArray(entry)) {\n const reference = readAssetReference(entry, entryPath, diagnostics);\n if (reference === undefined) {\n failed = true;\n continue;\n }\n properties[key] = reference;\n continue;\n }\n report(\n diagnostics,\n 'schema/invalid-value',\n `Property \"${key}\" must be a string, finite number, boolean, resource reference or null.`,\n entryPath,\n );\n failed = true;\n }\n return failed ? undefined : properties;\n}\n\nexport function checkDuplicateIds(\n entries: readonly IdentifiedEntry[],\n kind: DiagnosticEntity['kind'],\n diagnostics: Diagnostic[],\n): void {\n const seen = new Set<string>();\n for (const entry of entries) {\n if (seen.has(entry.id)) {\n report(diagnostics, 'id/duplicate', `Duplicate ${kind} id \"${entry.id}\".`, entry.path, {\n kind,\n id: entry.id,\n });\n continue;\n }\n seen.add(entry.id);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mica-js/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Mica circuit simulator core: virtual time and deterministic event scheduling",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,6 +30,9 @@
|
|
|
30
30
|
"publishConfig": {
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@mica-js/ir": "0.1.0"
|
|
35
|
+
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"typescript": "^6.0.3",
|
|
35
38
|
"vite": "^8.3.4",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-COqYIMQg.js","names":[],"sources":["../src/schematic/format/asset.ts","../src/schematic/format/errors.ts","../src/schematic/format/input.ts","../src/schematic/format/validate.ts"],"sourcesContent":["import type { AssetMode, AssetReference } from './types';\n\n/** Where an image / binary property value lives (#7). */\nexport const ASSET_MODES = ['file', 'inline', 'store'] as const;\n\nexport function isAssetMode(value: unknown): value is AssetMode {\n return typeof value === 'string' && (ASSET_MODES as readonly string[]).includes(value);\n}\n\nexport function isAssetReference(value: unknown): value is AssetReference {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n return typeof record['src'] === 'string' && isAssetMode(record['mode']);\n}\n\n/**\n * `file` mode payload rules (#7): a project-root relative POSIX path that never escapes the\n * project root and never turns into a URL.\n */\nexport function assetPathError(src: string): string | undefined {\n if (src.startsWith('/')) {\n return 'must be relative to the project root, not absolute';\n }\n if (/^[A-Za-z]:/.test(src)) {\n return 'must not carry a drive letter';\n }\n if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(src)) {\n return 'must not be a URL';\n }\n if (src.includes('\\\\')) {\n return 'must use POSIX separators';\n }\n const escaping = src.split('/').find((segment) => segment === '..' || segment.startsWith('~'));\n if (escaping !== undefined) {\n return `must stay inside the project root (segment \"${escaping}\")`;\n }\n return undefined;\n}\n\n/** `inline` mode payload: base64 text, so hosts decode without guessing the encoding. */\nexport function base64Error(src: string): string | undefined {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(src)\n ? undefined\n : 'must be base64 text';\n}\n\n/** Payload problem for a resource reference `src`, or `undefined` when it is well formed. */\nexport function assetSrcError(mode: AssetMode, src: string): string | undefined {\n if (mode === 'inline') {\n return base64Error(src);\n }\n return mode === 'file' ? assetPathError(src) : undefined;\n}\n","import type { Diagnostic, DiagnosticCode } from './diagnostics';\n\n/**\n * Thrown when input violates the schematic format contract.\n * `diagnostics` carries every problem found, so callers can report them all at once.\n */\nexport class SchematicError extends Error {\n readonly diagnostics: readonly Diagnostic[];\n\n constructor(diagnostics: readonly Diagnostic[]) {\n super(buildMessage(diagnostics));\n this.name = 'SchematicError';\n this.diagnostics = diagnostics;\n }\n\n /** Code of the first diagnostic, for coarse programmatic handling. */\n get code(): DiagnosticCode | undefined {\n return this.diagnostics[0]?.code;\n }\n}\n\nfunction buildMessage(diagnostics: readonly Diagnostic[]): string {\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === 'error');\n const relevant = errors.length > 0 ? errors : diagnostics;\n const [first, ...rest] = relevant;\n if (first === undefined) {\n return 'Schematic validation failed.';\n }\n const location =\n first.pointer === undefined || first.pointer === '' ? '' : ` at ${first.pointer}`;\n const suffix = rest.length === 0 ? '' : ` (and ${rest.length} more)`;\n return `${first.code}${location}: ${first.message}${suffix}`;\n}\n\nexport function throwIfErrors(diagnostics: readonly Diagnostic[]): void {\n if (diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {\n throw new SchematicError(diagnostics);\n }\n}\n","import type { Diagnostic } from './diagnostics';\n\nexport interface ParsedInput {\n readonly ok: boolean;\n readonly value: unknown;\n}\n\n/** Strings are parsed as JSON text; any other value is validated as-is. */\nexport function parseInput(input: string | unknown, diagnostics: Diagnostic[]): ParsedInput {\n if (typeof input !== 'string') {\n return { ok: true, value: input };\n }\n try {\n return { ok: true, value: JSON.parse(input) as unknown };\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n diagnostics.push({\n severity: 'error',\n code: 'json/invalid',\n message: `Invalid JSON: ${detail}`,\n });\n return { ok: false, value: undefined };\n }\n}\n","import type { Diagnostic, DiagnosticCode, DiagnosticEntity } from './diagnostics';\nimport type { AssetMode, AssetReference, Point, PropertyValue } from './types';\nimport { assetSrcError, isAssetMode } from './asset';\n\nexport function toPointer(path: readonly string[]): string {\n if (path.length === 0) {\n return '';\n }\n const segments = path.map((segment) => segment.replace(/~/g, '~0').replace(/\\//g, '~1'));\n return `/${segments.join('/')}`;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function hasErrors(diagnostics: readonly Diagnostic[]): boolean {\n return diagnostics.some((diagnostic) => diagnostic.severity === 'error');\n}\n\nexport function report(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n path: readonly string[],\n entity?: DiagnosticEntity,\n): void {\n const diagnostic: Diagnostic = {\n severity: 'error',\n code,\n message,\n pointer: toPointer(path),\n };\n diagnostics.push(entity === undefined ? diagnostic : { ...diagnostic, entity });\n}\n\nexport function forbidUnknownFields(\n value: Record<string, unknown>,\n allowed: readonly string[],\n path: readonly string[],\n diagnostics: Diagnostic[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) {\n report(diagnostics, 'schema/unknown-field', `Unknown field \"${key}\".`, [...path, key]);\n }\n }\n}\n\nexport interface StringFieldOptions {\n readonly nonEmpty?: boolean;\n}\n\nexport function readStringField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n options: StringFieldOptions = {},\n): string | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (typeof field !== 'string') {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be a string.`, fieldPath);\n return undefined;\n }\n if (options.nonEmpty === true && field.length === 0) {\n report(diagnostics, 'schema/invalid-value', `Field \"${key}\" must not be empty.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readNumberField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): number | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (typeof field !== 'number') {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be a number.`, fieldPath);\n return undefined;\n }\n if (!Number.isFinite(field)) {\n report(\n diagnostics,\n 'schema/invalid-value',\n `Field \"${key}\" must be a finite number.`,\n fieldPath,\n );\n return undefined;\n }\n return field;\n}\n\nexport function readIntegerField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): number | undefined {\n const field = readNumberField(value, key, path, diagnostics);\n if (field === undefined) {\n return undefined;\n }\n if (!Number.isInteger(field)) {\n report(diagnostics, 'schema/invalid-value', `Field \"${key}\" must be an integer.`, [\n ...path,\n key,\n ]);\n return undefined;\n }\n return field;\n}\n\nexport function readArrayField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): unknown[] | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (!Array.isArray(field)) {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be an array.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readObjectField(\n value: Record<string, unknown>,\n key: string,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Record<string, unknown> | undefined {\n const fieldPath = [...path, key];\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n report(diagnostics, 'schema/missing-field', `Missing required field \"${key}\".`, fieldPath);\n return undefined;\n }\n const field = value[key];\n if (!isRecord(field)) {\n report(diagnostics, 'schema/invalid-type', `Field \"${key}\" must be an object.`, fieldPath);\n return undefined;\n }\n return field;\n}\n\nexport function readPoint(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Point | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Point must be an object.', path);\n return undefined;\n }\n forbidUnknownFields(value, ['x', 'y'], path, diagnostics);\n const x = readNumberField(value, 'x', path, diagnostics);\n const y = readNumberField(value, 'y', path, diagnostics);\n if (x === undefined || y === undefined) {\n return undefined;\n }\n return { x, y };\n}\n\nexport interface IdentifiedEntry {\n readonly id: string;\n readonly path: readonly string[];\n}\n\n/**\n * Reads an `image` / `binary` property value: a resource reference `{ \"src\", \"mode\" }` (#7).\n * `src` is checked against the rules of its mode; content itself lives outside the document.\n */\nexport function readAssetReference(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): AssetReference | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Resource reference must be an object.', path);\n return undefined;\n }\n forbidUnknownFields(value, ['src', 'mode'], path, diagnostics);\n const src = readStringField(value, 'src', path, diagnostics, { nonEmpty: true });\n let mode: AssetMode | undefined;\n if (!Object.prototype.hasOwnProperty.call(value, 'mode')) {\n report(diagnostics, 'schema/missing-field', 'Missing required field \"mode\".', [\n ...path,\n 'mode',\n ]);\n } else if (isAssetMode(value['mode'])) {\n mode = value['mode'];\n } else {\n report(\n diagnostics,\n 'schema/invalid-value',\n 'Field \"mode\" must be \"file\", \"inline\" or \"store\".',\n [...path, 'mode'],\n );\n }\n if (src === undefined || mode === undefined) {\n return undefined;\n }\n const srcError = assetSrcError(mode, src);\n if (srcError !== undefined) {\n report(diagnostics, 'schema/invalid-value', `Field \"src\" ${srcError}.`, [...path, 'src']);\n return undefined;\n }\n return { src, mode };\n}\n\n/** Reads an optional `properties` map of scalars, resource references and explicit nulls (#6). */\nexport function readProperties(\n value: unknown,\n path: readonly string[],\n diagnostics: Diagnostic[],\n): Record<string, PropertyValue> | undefined {\n if (!isRecord(value)) {\n report(diagnostics, 'schema/invalid-type', 'Field \"properties\" must be an object.', path);\n return undefined;\n }\n const properties: Record<string, PropertyValue> = Object.create(null);\n let failed = false;\n for (const [key, entry] of Object.entries(value)) {\n if (key.length === 0) {\n report(diagnostics, 'schema/invalid-value', 'Property keys must not be empty.', path);\n failed = true;\n continue;\n }\n const entryPath = [...path, key];\n if (typeof entry === 'string' || typeof entry === 'boolean') {\n properties[key] = entry;\n continue;\n }\n if (entry === null) {\n properties[key] = null;\n continue;\n }\n if (typeof entry === 'number') {\n if (!Number.isFinite(entry)) {\n report(\n diagnostics,\n 'schema/invalid-value',\n `Property \"${key}\" must be a finite number.`,\n entryPath,\n );\n failed = true;\n continue;\n }\n properties[key] = entry;\n continue;\n }\n if (typeof entry === 'object' && !Array.isArray(entry)) {\n const reference = readAssetReference(entry, entryPath, diagnostics);\n if (reference === undefined) {\n failed = true;\n continue;\n }\n properties[key] = reference;\n continue;\n }\n report(\n diagnostics,\n 'schema/invalid-value',\n `Property \"${key}\" must be a string, finite number, boolean, resource reference or null.`,\n entryPath,\n );\n failed = true;\n }\n return failed ? undefined : properties;\n}\n\nexport function checkDuplicateIds(\n entries: readonly IdentifiedEntry[],\n kind: DiagnosticEntity['kind'],\n diagnostics: Diagnostic[],\n): void {\n const seen = new Set<string>();\n for (const entry of entries) {\n if (seen.has(entry.id)) {\n report(diagnostics, 'id/duplicate', `Duplicate ${kind} id \"${entry.id}\".`, entry.path, {\n kind,\n id: entry.id,\n });\n continue;\n }\n seen.add(entry.id);\n }\n}\n"],"mappings":"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"}
|