@wildwinter/toolkit 0.1.0 → 0.2.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/CHANGELOG.md +54 -0
- package/README.md +17 -2
- package/conformance/extensions/defaults.json +69 -0
- package/conformance/extensions/manifest.json +1129 -0
- package/conformance/extensions/merge.json +154 -0
- package/conformance/extensions/values.json +741 -0
- package/dist/chunk-ONEAWPDZ.js +11 -0
- package/dist/chunk-ONEAWPDZ.js.map +1 -0
- package/dist/extensions.cjs +948 -0
- package/dist/extensions.cjs.map +1 -0
- package/dist/extensions.d.cts +324 -0
- package/dist/extensions.d.ts +324 -0
- package/dist/extensions.js +902 -0
- package/dist/extensions.js.map +1 -0
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/extensions.md +192 -0
- package/package.json +29 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extensions/types.ts","../src/extensions/path.ts","../src/extensions/values.ts","../src/extensions/manifest.ts","../src/extensions/merge.ts"],"names":["out","err"],"mappings":"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","file":"extensions.js","sourcesContent":["// ---------------------------------------------------------------------------\n// The manifest's shapes, and what each host is.\n//\n// A manifest is data a project keeps a copy of, so every shape here is read\n// from JSON as it came: the checks in manifest.ts say what is wrong with one,\n// and nothing else in this package assumes a manifest is sound without them.\n// ---------------------------------------------------------------------------\n\n/** The manifest schema tag this build reads and writes. */\nexport const MANIFEST_SCHEMA = \"wildwinter/extension@0\";\n\n/** What a manifest file is called: `<id>.extension.json`. */\nexport const MANIFEST_FILE_SUFFIX = \".extension.json\";\n\n/** The hosts an extension can target. */\nexport type HostName = \"patter\" | \"storylets\";\n\nexport interface HostSpec {\n /** The node kinds a target may name. */\n readonly kinds: readonly string[];\n /** The node kinds a `reference` may point at. */\n readonly references: readonly string[];\n /** The node kinds with host fields of their own, which a claim may present. */\n readonly claimable: readonly string[];\n}\n\n/** Each host's node kinds, references and claimable kinds. */\nexport const HOSTS: Readonly<Record<HostName, HostSpec>> = {\n patter: {\n kinds: [\"scene\", \"block\", \"snippet\", \"line\", \"text\", \"gameEvent\", \"option\", \"project\"],\n references: [\"cast\", \"scene\", \"block\", \"snippet\", \"line\"],\n claimable: [\"scene\", \"block\", \"snippet\", \"line\", \"text\", \"gameEvent\", \"option\"],\n },\n storylets: {\n kinds: [\"box\", \"tagGroup\", \"tag\", \"deck\", \"card\", \"outcome\", \"handTemplate\", \"hand\", \"project\"],\n references: [\"box\", \"deck\", \"card\", \"outcome\", \"tag\"],\n claimable: [\"card\", \"outcome\"],\n },\n};\n\n/** The family's seven scalar types, spelled as the family spells them. */\nexport const SCALAR_TYPES = [\"text\", \"multiline\", \"number\", \"boolean\", \"enum\", \"flags\", \"quality\"] as const;\nexport type ScalarType = typeof SCALAR_TYPES[number];\n\n/** Every type a value can take. */\nexport const VALUE_TYPES = [...SCALAR_TYPES, \"reference\", \"record\", \"map\", \"list\"] as const;\nexport type ValueType = typeof VALUE_TYPES[number];\n\n/** A JSON value, as extension data holds it. */\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\n/**\n * A value's type, with the constraints that belong to it. A target's fields\n * and a record's fields add a name and the editor's words (`FieldDecl`); the\n * `of` of a map or a list is a bare type.\n */\nexport interface TypeDecl {\n readonly type: string;\n /** An enum's values, or the flags a flags value may hold. */\n readonly values?: readonly string[];\n /** A quality's ladder. */\n readonly stages?: readonly string[];\n /** A quality's renames: every name a stage has had, to the stage it is now. */\n readonly renamedStages?: Readonly<Record<string, string>>;\n /** A reference's node kind. */\n readonly to?: string;\n /** A record's fields. */\n readonly fields?: readonly FieldDecl[];\n /** A map's key. */\n readonly key?: { readonly type: string; readonly to?: string };\n /** A map's or a list's value type. */\n readonly of?: TypeDecl;\n /** A list's id field: the text field of its records that keys each item. */\n readonly id?: string;\n /** A number's bounds. */\n readonly min?: number;\n readonly max?: number;\n /** One sentence per enum or flags value, or quality stage. Editor only. */\n readonly valueHelp?: Readonly<Record<string, string>>;\n /** Optional in source: the type's own default when absent (`defaultOf`). */\n readonly default?: unknown;\n}\n\n/** A named field: a target's, or a record's. */\nexport interface FieldDecl extends TypeDecl {\n readonly name: string;\n readonly label?: string;\n readonly help?: string;\n /** A node of this kind must set it. */\n readonly required?: boolean;\n /** A heading within the extension's group in the editor. */\n readonly group?: string;\n /** Stripped at compile: editor data, never in a bundle. A target's own fields only. */\n readonly editorOnly?: boolean;\n}\n\n/** A claim on a host field, named through one of the manifest's settings. */\nexport interface ClaimDecl extends TypeDecl {\n readonly setting: string;\n readonly label?: string;\n readonly help?: string;\n readonly required?: boolean;\n}\n\n/** What an extension declares for one node kind of one host. */\nexport interface TargetDecl {\n readonly fields?: readonly FieldDecl[];\n readonly claims?: readonly ClaimDecl[];\n}\n\n/** A project setting, naming a host field a claim presents. */\nexport interface SettingDecl {\n readonly name: string;\n readonly label?: string;\n readonly help?: string;\n /** The field name used when the project names none. */\n readonly default: string;\n}\n\nexport interface Manifest {\n readonly schema: string;\n readonly id: string;\n readonly name: string;\n readonly version: string;\n readonly docs?: string;\n readonly settings?: readonly SettingDecl[];\n readonly targets: Readonly<Partial<Record<HostName, Readonly<Record<string, TargetDecl>>>>>;\n}\n\n/** One thing wrong, with where it is. A host words it in its own report shape. */\nexport interface Problem {\n readonly severity: \"error\" | \"warning\";\n /** A stable name for the kind of problem, for tests and quick fixes. */\n readonly code: string;\n /** Where, relative to what was checked: `targets.storylets.card.fields[2].stages`. */\n readonly path: string;\n readonly message: string;\n /** The values a quick fix may offer (an enum's values, the stages either side). */\n readonly options?: readonly string[];\n}\n\n/** The format-neutral part of an extension data shard. */\nexport interface ExtensionData {\n readonly extension: string;\n /** By node kind, then node id, then field name. */\n readonly entries: Readonly<Record<string, Readonly<Record<string, Readonly<Record<string, unknown>>>>>>;\n readonly unresolved?: readonly UnresolvedEntry[];\n}\n\n/** How a three-way merge failed to agree on one value. */\nexport type ConflictKind =\n | \"both-changed\" // both sides changed the same value differently\n | \"delete-vs-edit\" // one side deleted it, the other edited it\n | \"added-both\" // both sides added it, with different content\n | \"structural\"; // a format's own post-merge check failed (a duplicate id)\n\n/** One clash, as the reserved `unresolved` key of a merged shard holds it. */\nexport interface UnresolvedEntry {\n readonly path: string;\n readonly kind: ConflictKind;\n readonly base?: unknown;\n readonly ours?: unknown;\n readonly theirs?: unknown;\n}\n","// Where a problem is: dotted names, `[i]` for a list position, and `[\"...\"]`\n// for a key that is not an identifier, so a path reads the way the JSON does.\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n/** `base` and then the key `key`. */\nexport const atKey = (base: string, key: string): string =>\n (IDENTIFIER.test(key) ? (base === \"\" ? key : `${base}.${key}`) : `${base}[${JSON.stringify(key)}]`);\n\n/** `base` and then list position `i`. */\nexport const atIndex = (base: string, i: number): string => `${base}[${i}]`;\n\nexport const isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/** An author-written name read as an own property, never through the prototype. */\nexport const own = (record: object, name: string): boolean => Object.prototype.hasOwnProperty.call(record, name);\n","// ---------------------------------------------------------------------------\n// Values against their declarations: the checks, the defaults, what a bundle\n// carries, and stage renames.\n//\n// The scalar checks are the kernel's (`valueFits`, `stagesEitherSide`), so a\n// value an extension holds is judged by the rule every field and property in\n// both formats is. What this file adds is the structured types, which walk\n// down to scalars, and the extension's own constraints (ranges, required\n// fields, references).\n// ---------------------------------------------------------------------------\n\nimport { stagesEitherSide, valueFits } from \"@wildwinter/expr\";\nimport { defaultFor } from \"@wildwinter/scoperegistry\";\nimport { atIndex, atKey, isObject, own } from \"./path.js\";\nimport type { FieldDecl, Problem, TargetDecl, TypeDecl } from \"./types.js\";\n\n/** What the host knows about its nodes, for references. */\nexport interface ValueContext {\n /** Does a node of `kind` with `id` exist? Absent, references are not checked\n * (a host checking a manifest's default, say, has no nodes to hand). */\n readonly exists?: (kind: string, id: string) => boolean;\n}\n\nconst typeWord = (v: unknown): string =>\n (Array.isArray(v) ? \"a list\" : v === null ? \"null\" : isObject(v) ? \"an object\" : `a ${typeof v}`);\n\nconst where = (path: string): string => (path === \"\" ? \"the value\" : `\"${path}\"`);\n\nconst err = (code: string, path: string, message: string, options?: readonly string[]): Problem =>\n ({ severity: \"error\", code, path, message, ...(options !== undefined ? { options } : {}) });\n\n/** Every problem with `value` as a value of `decl`, paths relative to the value. */\nexport function valueProblems(decl: TypeDecl, value: unknown, ctx: ValueContext = {}, path = \"\"): Problem[] {\n const out: Problem[] = [];\n const wrong = (expected: string): void => {\n out.push(err(\"wrong-type\", path, `${where(path)} should be ${expected}, not ${typeWord(value)}`));\n };\n switch (decl.type) {\n case \"text\":\n case \"multiline\":\n if (typeof value !== \"string\") wrong(\"text\");\n break;\n case \"boolean\":\n if (typeof value !== \"boolean\") wrong(\"true or false\");\n break;\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) { wrong(\"a number\"); break; }\n if (typeof decl.min === \"number\" && value < decl.min) {\n out.push(err(\"below-min\", path, `${where(path)} is ${value}, below the least it may be, ${decl.min}`));\n }\n if (typeof decl.max === \"number\" && value > decl.max) {\n out.push(err(\"above-max\", path, `${where(path)} is ${value}, above the most it may be, ${decl.max}`));\n }\n break;\n case \"enum\":\n if (typeof value !== \"string\") { wrong(\"one of its values\"); break; }\n if (!valueFits(decl, value, { noneChosen: true })) {\n out.push(err(\"not-a-value\", path, `${where(path)} is \"${value}\", which is not one of its values`, [...(decl.values ?? [])]));\n }\n break;\n case \"flags\":\n if (!Array.isArray(value) || !value.every((f) => typeof f === \"string\")) { wrong(\"a list of its flags\"); break; }\n if (!valueFits(decl, value)) {\n const odd = value.filter((f) => !(decl.values ?? []).includes(f as string));\n out.push(err(\"not-a-value\", path, `${where(path)} names ${odd.map((f) => `\"${f}\"`).join(\", \")}, not among its flags`, [...(decl.values ?? [])]));\n }\n break;\n case \"quality\": {\n if (typeof value !== \"string\") { wrong(\"one of its stages\"); break; }\n if (valueFits(decl, value)) break;\n const renamed = renamedStage(decl, value);\n if (renamed !== undefined) {\n // A warning: a host compiles the value through the rename, and the\n // project takes the new name when it takes the version (`renameStages`).\n out.push({ severity: \"warning\", code: \"renamed-stage\", path, options: [renamed],\n message: `${where(path)} is \"${value}\", a stage this extension has since renamed \"${renamed}\"` });\n } else {\n out.push(err(\"not-a-stage\", path, `${where(path)} is \"${value}\", which is not one of its stages`, stagesEitherSide(decl, value)));\n }\n break;\n }\n case \"reference\":\n if (typeof value !== \"string\") { wrong(`the id of a ${decl.to ?? \"node\"}`); break; }\n if (value !== \"\" && ctx.exists && decl.to !== undefined && !ctx.exists(decl.to, value)) {\n out.push(err(\"no-such-node\", path, `${where(path)} names ${decl.to} \"${value}\", which does not exist`));\n }\n break;\n case \"record\":\n if (!isObject(value)) { wrong(\"an object\"); break; }\n out.push(...fieldsProblems(decl.fields ?? [], value, ctx, path));\n break;\n case \"map\": {\n if (!isObject(value)) { wrong(\"an object\"); break; }\n const key = decl.key;\n for (const [k, v] of Object.entries(value)) {\n const at = atKey(path, k);\n if (key?.type === \"reference\" && ctx.exists && key.to !== undefined && !ctx.exists(key.to, k)) {\n out.push(err(\"no-such-node\", at, `${where(at)} is keyed by ${key.to} \"${k}\", which does not exist`));\n }\n if (decl.of) out.push(...valueProblems(decl.of, v, ctx, at));\n }\n break;\n }\n case \"list\": {\n if (!Array.isArray(value)) { wrong(\"a list\"); break; }\n const seen = new Set<string>();\n value.forEach((item, i) => {\n const at = atIndex(path, i);\n if (decl.id !== undefined && isObject(item)) {\n const id = item[decl.id];\n const idAt = atKey(at, decl.id);\n if (typeof id !== \"string\" || id === \"\") {\n out.push(err(\"missing-id\", idAt, `${where(at)} has no \"${decl.id}\", which keys every item of this list`));\n } else if (seen.has(id)) {\n out.push(err(\"duplicate-id\", idAt, `${where(at)} repeats the id \"${id}\"`));\n } else {\n seen.add(id);\n }\n }\n if (decl.of) out.push(...valueProblems(decl.of, item, ctx, at));\n });\n break;\n }\n default:\n // A type this build does not know constrains nothing: a newer manifest's\n // field is the manifest check's to report, not a reason to refuse data.\n break;\n }\n return out;\n}\n\n/** Named fields against an object: required fields, unknown ones, each value. */\nfunction fieldsProblems(fields: readonly FieldDecl[], value: Record<string, unknown>, ctx: ValueContext, path: string): Problem[] {\n const out: Problem[] = [];\n const named = new Map(fields.map((f) => [f.name, f]));\n for (const f of fields) {\n if (f.required === true && !own(value, f.name)) {\n const at = atKey(path, f.name);\n out.push(err(\"required\", at, `${where(at)} is required and not set`));\n }\n }\n for (const [k, v] of Object.entries(value)) {\n const at = atKey(path, k);\n const f = named.get(k);\n if (f === undefined) {\n out.push({ severity: \"warning\", code: \"unknown-field\", path: at,\n message: `${where(at)} is not a field this extension declares; it is kept, and not compiled` });\n continue;\n }\n out.push(...valueProblems(f, v, ctx, at));\n }\n return out;\n}\n\n/** Every problem with one node's entry, against its target. */\nexport function entryProblems(target: TargetDecl, entry: unknown, ctx: ValueContext = {}, path = \"\"): Problem[] {\n if (!isObject(entry)) {\n return [err(\"wrong-type\", path, `${where(path)} should be an object of field values, not ${typeWord(entry)}`)];\n }\n return fieldsProblems(target.fields ?? [], entry, ctx, path);\n}\n\n// --- defaults -------------------------------------------------------------------\n\n/**\n * A declaration's default: the one it gives, else its type's. A scalar's is\n * the kernel's (`defaultFor`: false, 0, \"\", the first enum value, no flags,\n * the first stage), a reference's is none (\"\"), a record's is each of its\n * fields' defaults, a map's and a list's are empty.\n */\nexport function defaultOf(decl: TypeDecl): unknown {\n if (decl.default !== undefined) return decl.default;\n switch (decl.type) {\n case \"reference\": return \"\";\n case \"record\": return Object.fromEntries((decl.fields ?? []).map((f) => [f.name, defaultOf(f)]));\n case \"map\": return {};\n case \"list\": return [];\n default:\n return defaultFor({\n type: decl.type,\n ...(decl.values !== undefined ? { values: decl.values } : {}),\n ...(decl.stages !== undefined ? { stages: decl.stages } : {}),\n });\n }\n}\n\n// --- what a bundle carries ------------------------------------------------------\n\n/** The editor's words, and the manifest's own bookkeeping: never in a bundle. */\nconst EDITOR_KEYS = new Set([\"label\", \"help\", \"valueHelp\", \"group\", \"editorOnly\", \"renamedStages\"]);\n\n/** One declaration as a bundle carries it: the editor's words gone, the default resolved, all the way down. */\nfunction compiledDecl<D extends TypeDecl>(decl: D): D {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(decl)) if (!EDITOR_KEYS.has(k)) out[k] = v;\n if (decl.fields !== undefined) out[\"fields\"] = decl.fields.map((f) => compiledDecl(f));\n if (decl.of !== undefined) out[\"of\"] = compiledDecl(decl.of);\n out[\"default\"] = defaultOf(decl);\n return out as D;\n}\n\n/** A target's fields with every default resolved and the editor's words gone, as a bundle carries them;\n * editor-only fields are left out. */\nexport function compiledTarget(target: TargetDecl): FieldDecl[] {\n return (target.fields ?? []).filter((f) => f.editorOnly !== true).map((f) => stripOfDefaults(compiledDecl(f)));\n}\n\n/** The `of` of a map or a list is a bare type: its items are each node's own. */\nfunction stripOfDefaults<D extends TypeDecl>(decl: D): D {\n const out: Record<string, unknown> = { ...(decl as TypeDecl) };\n if (decl.of !== undefined) {\n const { default: _drop, ...rest } = decl.of as TypeDecl & { default?: unknown };\n out[\"of\"] = stripOfDefaults(rest as TypeDecl);\n }\n if (decl.fields !== undefined) out[\"fields\"] = decl.fields.map((f) => stripOfDefaults(f));\n return out as D;\n}\n\n/**\n * A node's values as a bundle carries them: raw and sparse, with editor-only\n * and undeclared fields left out and renamed stages renamed. Undefined when\n * nothing is left, so a host writes no `extensions` entry for the node.\n */\nexport function compileEntry(target: TargetDecl, entry: Readonly<Record<string, unknown>>): Record<string, unknown> | undefined {\n const renamed = renameStages(target, entry).entry;\n const out: Record<string, unknown> = {};\n const named = new Map((target.fields ?? []).map((f) => [f.name, f]));\n for (const k of Object.keys(renamed).sort()) {\n const f = named.get(k);\n if (f === undefined || f.editorOnly === true) continue;\n out[k] = renamed[k];\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n// --- stage renames --------------------------------------------------------------\n\n/** The stage an old name was renamed to, when the declaration says it was. */\nfunction renamedStage(decl: TypeDecl, value: string): string | undefined {\n const map = decl.renamedStages;\n if (map === undefined || !own(map, value)) return undefined;\n const to = map[value];\n return typeof to === \"string\" && (decl.stages ?? []).includes(to) ? to : undefined;\n}\n\nexport interface StageRename {\n readonly path: string;\n readonly from: string;\n readonly to: string;\n}\n\n/** Rename every stage the manifest says was renamed, at any depth. Returns the\n * entry (a new object when anything changed) and the renames made. */\nexport function renameStages(target: TargetDecl, entry: Readonly<Record<string, unknown>>): { entry: Record<string, unknown>; renames: StageRename[] } {\n const renames: StageRename[] = [];\n const walk = (decl: TypeDecl, value: unknown, path: string): unknown => {\n switch (decl.type) {\n case \"quality\": {\n if (typeof value !== \"string\" || (decl.stages ?? []).includes(value)) return value;\n const to = renamedStage(decl, value);\n if (to === undefined) return value;\n renames.push({ path, from: value, to });\n return to;\n }\n case \"record\":\n return isObject(value) ? walkFields(decl.fields ?? [], value, path) : value;\n case \"map\":\n if (!isObject(value) || decl.of === undefined) return value;\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, walk(decl.of!, v, atKey(path, k))]));\n case \"list\":\n if (!Array.isArray(value) || decl.of === undefined) return value;\n return value.map((v, i) => walk(decl.of!, v, atIndex(path, i)));\n default:\n return value;\n }\n };\n const walkFields = (fields: readonly FieldDecl[], value: Readonly<Record<string, unknown>>, path: string): Record<string, unknown> => {\n const named = new Map(fields.map((f) => [f.name, f]));\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n const f = named.get(k);\n out[k] = f === undefined ? v : walk(f, v, atKey(path, k));\n }\n return out;\n };\n const out = walkFields(target.fields ?? [], entry, \"\");\n return { entry: renames.length > 0 ? out : { ...entry }, renames };\n}\n","// ---------------------------------------------------------------------------\n// Manifest checks.\n//\n// A manifest is pinned and referenced, and nobody in the project edits it, so\n// a fault in one is the extension author's. The checks still run in every\n// project that takes it, because a project's validation is the only thing\n// standing between a broken manifest and a host reading it.\n// ---------------------------------------------------------------------------\n\nimport { qualityDeclarationProblems } from \"@wildwinter/expr\";\nimport { parseSource } from \"../source.js\";\nimport { atIndex, atKey, isObject, own } from \"./path.js\";\nimport { HOSTS, MANIFEST_SCHEMA, SCALAR_TYPES, VALUE_TYPES } from \"./types.js\";\nimport type { ClaimDecl, FieldDecl, HostName, Manifest, Problem, SettingDecl, TargetDecl, TypeDecl } from \"./types.js\";\nimport { valueProblems } from \"./values.js\";\n\nconst ID = /^[a-z][a-z0-9-]*$/;\nconst VERSION = /^\\d+\\.\\d+\\.\\d+$/;\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** The keys a declaration may carry. Anything else is most likely a misspelling. */\nconst TYPE_KEYS = [\"type\", \"values\", \"stages\", \"renamedStages\", \"to\", \"fields\", \"key\", \"of\", \"id\", \"min\", \"max\", \"valueHelp\", \"default\"];\nconst FIELD_KEYS = new Set([...TYPE_KEYS, \"name\", \"label\", \"help\", \"required\", \"group\", \"editorOnly\"]);\nconst CLAIM_KEYS = new Set([...TYPE_KEYS, \"setting\", \"label\", \"help\", \"required\"]);\nconst BARE_KEYS = new Set(TYPE_KEYS);\nconst MANIFEST_KEYS = new Set([\"schema\", \"id\", \"name\", \"version\", \"docs\", \"settings\", \"targets\"]);\n\nconst err = (code: string, path: string, message: string): Problem => ({ severity: \"error\", code, path, message });\n\n/** Read a manifest file's text (JSON, or JSON5). Throws on text that will not parse. */\nexport function parseManifest(text: string): Manifest {\n return parseSource(text) as Manifest;\n}\n\n/** Every problem with a manifest, by path. An empty list means it is sound. */\nexport function manifestProblems(manifest: unknown): Problem[] {\n const out: Problem[] = [];\n if (!isObject(manifest)) return [err(\"not-an-object\", \"\", \"a manifest is a JSON object\")];\n const m = manifest;\n unknownKeys(m, MANIFEST_KEYS, \"\", out);\n if (m[\"schema\"] !== MANIFEST_SCHEMA) {\n out.push(err(\"schema\", \"schema\", `the schema tag is ${JSON.stringify(m[\"schema\"])}, not \"${MANIFEST_SCHEMA}\"`));\n }\n if (typeof m[\"id\"] !== \"string\" || !ID.test(m[\"id\"])) {\n out.push(err(\"id\", \"id\", \"the id is lower case letters, digits and hyphens, starting with a letter\"));\n }\n if (typeof m[\"name\"] !== \"string\" || m[\"name\"].trim() === \"\") out.push(err(\"name\", \"name\", \"the manifest has no name\"));\n if (typeof m[\"version\"] !== \"string\" || !VERSION.test(m[\"version\"])) {\n out.push(err(\"version\", \"version\", \"the version is major.minor.patch, such as 1.0.0\"));\n }\n if (m[\"docs\"] !== undefined && typeof m[\"docs\"] !== \"string\") out.push(err(\"docs\", \"docs\", \"docs is a link, as text\"));\n\n const settings = settingsProblems(m[\"settings\"], out);\n\n const targets = m[\"targets\"];\n if (!isObject(targets) || Object.keys(targets).length === 0) {\n out.push(err(\"no-targets\", \"targets\", \"the manifest targets no host\"));\n return out;\n }\n for (const [host, kinds] of Object.entries(targets)) {\n const hostPath = atKey(\"targets\", host);\n const spec = own(HOSTS, host) ? HOSTS[host as HostName] : undefined;\n if (spec === undefined) {\n out.push(err(\"unknown-host\", hostPath, `\"${host}\" is not a host; a manifest targets \"patter\" or \"storylets\"`));\n continue;\n }\n if (!isObject(kinds)) { out.push(err(\"not-an-object\", hostPath, \"a host's targets are an object, by node kind\")); continue; }\n for (const [kind, target] of Object.entries(kinds)) {\n const kindPath = atKey(hostPath, kind);\n if (!spec.kinds.includes(kind)) {\n out.push(err(\"unknown-kind\", kindPath, `\"${kind}\" is not a node kind of ${host}; it has ${spec.kinds.join(\", \")}`));\n continue;\n }\n targetProblems(host as HostName, kind, target, kindPath, settings, out);\n }\n }\n return out;\n}\n\nfunction unknownKeys(obj: Record<string, unknown>, known: ReadonlySet<string>, path: string, out: Problem[]): void {\n for (const k of Object.keys(obj)) {\n if (!known.has(k)) {\n out.push({ severity: \"warning\", code: \"unknown-key\", path: atKey(path, k), message: `\"${k}\" means nothing here; it is ignored` });\n }\n }\n}\n\nfunction settingsProblems(settings: unknown, out: Problem[]): Set<string> {\n const names = new Set<string>();\n if (settings === undefined) return names;\n if (!Array.isArray(settings)) { out.push(err(\"not-a-list\", \"settings\", \"settings are a list\")); return names; }\n settings.forEach((s: unknown, i) => {\n const at = atIndex(\"settings\", i);\n if (!isObject(s)) { out.push(err(\"not-an-object\", at, \"a setting is an object\")); return; }\n const name = s[\"name\"];\n if (typeof name !== \"string\" || !NAME.test(name)) {\n out.push(err(\"setting-name\", atKey(at, \"name\"), \"a setting's name is an identifier\"));\n } else if (names.has(name)) {\n out.push(err(\"setting-duplicate\", atKey(at, \"name\"), `setting \"${name}\" is declared twice`));\n } else {\n names.add(name);\n }\n const dflt = (s as Partial<SettingDecl>).default;\n if (typeof dflt !== \"string\" || !NAME.test(dflt)) {\n out.push(err(\"setting-default\", atKey(at, \"default\"), \"a setting names a host field by default, so its default is a field name\"));\n }\n });\n return names;\n}\n\nfunction targetProblems(host: HostName, kind: string, target: unknown, path: string, settings: ReadonlySet<string>, out: Problem[]): void {\n if (!isObject(target)) { out.push(err(\"not-an-object\", path, \"a target is an object\")); return; }\n unknownKeys(target, new Set([\"fields\", \"claims\"]), path, out);\n const t = target as TargetDecl;\n if (t.fields !== undefined) fieldListProblems(host, t.fields, atKey(path, \"fields\"), true, out);\n if (t.claims === undefined) return;\n if (!Array.isArray(t.claims)) { out.push(err(\"not-a-list\", atKey(path, \"claims\"), \"claims are a list\")); return; }\n const claimable = HOSTS[host].claimable.includes(kind);\n const claimed = new Set<string>();\n t.claims.forEach((c: unknown, i) => {\n const at = atIndex(atKey(path, \"claims\"), i);\n if (!claimable) {\n out.push(err(\"claim-kind\", at, `a ${kind} has no host fields to claim; ${host} has them on ${HOSTS[host].claimable.join(\", \")}`));\n return;\n }\n if (!isObject(c)) { out.push(err(\"not-an-object\", at, \"a claim is an object\")); return; }\n const claim = c as unknown as ClaimDecl;\n unknownKeys(c, CLAIM_KEYS, at, out);\n if (!(SCALAR_TYPES as readonly string[]).includes(claim.type)) {\n out.push(err(\"claim-type\", atKey(at, \"type\"), \"a claim presents a host field, which is a scalar\"));\n } else {\n typeProblems(host, claim, at, false, out, true);\n }\n if (typeof claim.setting !== \"string\" || !settings.has(claim.setting)) {\n out.push(err(\"claim-setting\", atKey(at, \"setting\"), `a claim names its field through a setting, and \"${String(claim.setting)}\" is not one of the manifest's settings`));\n } else if (claimed.has(claim.setting)) {\n out.push(err(\"claim-duplicate\", atKey(at, \"setting\"), `setting \"${claim.setting}\" is claimed twice for one kind`));\n } else {\n claimed.add(claim.setting);\n }\n });\n}\n\nfunction fieldListProblems(host: HostName, fields: unknown, path: string, topLevel: boolean, out: Problem[]): void {\n if (!Array.isArray(fields)) { out.push(err(\"not-a-list\", path, \"fields are a list\")); return; }\n const names = new Set<string>();\n fields.forEach((f: unknown, i) => {\n const at = atIndex(path, i);\n if (!isObject(f)) { out.push(err(\"not-an-object\", at, \"a field is an object\")); return; }\n const field = f as unknown as FieldDecl;\n unknownKeys(f, FIELD_KEYS, at, out);\n if (typeof field.name !== \"string\" || !NAME.test(field.name)) {\n out.push(err(\"field-name\", atKey(at, \"name\"), \"a field's name is an identifier: letters, digits and underscores, not starting with a digit\"));\n } else if (names.has(field.name)) {\n out.push(err(\"duplicate-field\", atKey(at, \"name\"), `field \"${field.name}\" is declared twice`));\n } else {\n names.add(field.name);\n }\n typeProblems(host, field, at, true, out);\n if (field.editorOnly !== undefined && !topLevel) {\n out.push(err(\"editor-only-nested\", atKey(at, \"editorOnly\"), \"only a target's own fields can be editor-only, not a record's\"));\n }\n for (const flag of [\"required\", \"editorOnly\"] as const) {\n if (field[flag] !== undefined && typeof field[flag] !== \"boolean\") {\n out.push(err(\"not-a-boolean\", atKey(at, flag), `${flag} is true or false`));\n }\n }\n });\n}\n\n/**\n * A declaration's type and constraints. `named` is false for a map's or a list's bare `of`. `claim` is true for\n * a claim on a host field, which may leave out an enum's or flags' values and a quality's stages: the host's\n * declaration then gives them (`effectiveClaim`), and its value help may describe values the host does not\n * declare, which are simply unused.\n */\nfunction typeProblems(host: HostName, decl: TypeDecl, path: string, named: boolean, out: Problem[], claim = false): void {\n const typeAt = atKey(path, \"type\");\n if (decl.type === \"string\") {\n out.push(err(\"string-type\", typeAt, \"the text type is spelled \\\"text\\\"\"));\n return;\n }\n if (typeof decl.type !== \"string\" || !(VALUE_TYPES as readonly string[]).includes(decl.type)) {\n out.push(err(\"unknown-type\", typeAt, `${JSON.stringify(decl.type)} is not a type; the types are ${VALUE_TYPES.join(\", \")}`));\n return;\n }\n const at = (k: string): string => atKey(path, k);\n let sound = true;\n switch (decl.type) {\n case \"enum\":\n case \"flags\": {\n const values = decl.values;\n if (claim && values === undefined) break;\n if (!Array.isArray(values) || values.length === 0) {\n out.push(err(\"values-empty\", at(\"values\"), `an ${decl.type === \"enum\" ? \"enum\" : \"flags field\"} lists its values`));\n sound = false;\n break;\n }\n const seen = new Set<string>();\n values.forEach((v, i) => {\n if (typeof v !== \"string\" || v.trim() === \"\") { out.push(err(\"value-empty\", atIndex(at(\"values\"), i), \"a value has a name\")); sound = false; }\n else if (seen.has(v)) { out.push(err(\"value-duplicate\", atIndex(at(\"values\"), i), `\"${v}\" is listed twice`)); sound = false; }\n else seen.add(v);\n });\n break;\n }\n case \"quality\": {\n if (claim && decl.stages === undefined) break;\n // The kernel's one rule; the default is checked below, with every type's.\n for (const p of qualityDeclarationProblems(decl.stages)) {\n out.push(err(`quality-${p.kind === \"default-not-a-stage\" ? \"default\" : p.kind}`, at(\"stages\"),\n p.kind === \"too-few-stages\" ? \"a quality's ladder has at least two stages\"\n : p.kind === \"empty-stage\" ? `stage ${p.index + 1} has no name`\n : p.kind === \"duplicate-stage\" ? `stage \"${p.stage}\" is listed twice` : \"the default is not a stage\"));\n sound = false;\n }\n break;\n }\n case \"reference\":\n if (typeof decl.to !== \"string\" || !HOSTS[host].references.includes(decl.to)) {\n out.push(err(\"reference-to\", at(\"to\"), `a reference names the kind it points at, one of ${HOSTS[host].references.join(\", \")}`));\n sound = false;\n }\n break;\n case \"record\":\n if (!Array.isArray(decl.fields) || decl.fields.length === 0) {\n out.push(err(\"record-empty\", at(\"fields\"), \"a record declares its fields\"));\n sound = false;\n } else {\n const before = out.length;\n fieldListProblems(host, decl.fields, at(\"fields\"), false, out);\n if (out.slice(before).some((p) => p.severity === \"error\")) sound = false;\n }\n break;\n case \"map\": {\n const key = decl.key;\n const keyOk = isObject(key) && (key[\"type\"] === \"text\"\n || (key[\"type\"] === \"reference\" && typeof key[\"to\"] === \"string\" && HOSTS[host].references.includes(key[\"to\"])));\n if (!keyOk) {\n out.push(err(\"map-key\", at(\"key\"), `a map is keyed by { type: \"text\" } or a reference, { type: \"reference\", to: \"${HOSTS[host].references[0]}\" }`));\n sound = false;\n }\n if (!ofProblems(host, decl, at, out)) sound = false;\n break;\n }\n case \"list\": {\n if (decl.id !== undefined) {\n const of = decl.of;\n const idField = isObject(of) && of[\"type\"] === \"record\" && Array.isArray(of[\"fields\"])\n ? (of[\"fields\"] as unknown[]).find((f) => isObject(f) && f[\"name\"] === decl.id) as FieldDecl | undefined\n : undefined;\n if (typeof decl.id !== \"string\" || idField === undefined || idField.type !== \"text\") {\n out.push(err(\"list-id\", at(\"id\"), \"a list with ids holds records, and its id names a text field of them\"));\n sound = false;\n }\n }\n if (!ofProblems(host, decl, at, out)) sound = false;\n break;\n }\n }\n\n // The constraints that belong to some types only.\n if (decl.min !== undefined || decl.max !== undefined) {\n const which = decl.max !== undefined ? \"max\" : \"min\";\n if (decl.type !== \"number\") {\n out.push(err(\"range\", at(which), \"a range applies to a number\"));\n } else if (typeof decl.min === \"number\" && typeof decl.max === \"number\" && decl.min > decl.max) {\n out.push(err(\"range\", at(\"max\"), `the range runs from ${decl.min} down to ${decl.max}`));\n sound = false;\n }\n }\n if (decl.renamedStages !== undefined) renamedStagesProblems(decl, at(\"renamedStages\"), out);\n if (decl.valueHelp !== undefined && claim) {\n if (!isObject(decl.valueHelp) || !([\"enum\", \"flags\", \"quality\"] as const).includes(decl.type as \"enum\")) {\n out.push(err(\"value-help\", at(\"valueHelp\"), \"value help describes the values of an enum or flags field, or a quality's stages\"));\n }\n } else if (decl.valueHelp !== undefined) {\n const vocabulary = decl.type === \"quality\" ? decl.stages : decl.type === \"enum\" || decl.type === \"flags\" ? decl.values : undefined;\n if (vocabulary === undefined || !isObject(decl.valueHelp)) {\n out.push(err(\"value-help\", at(\"valueHelp\"), \"value help describes the values of an enum or flags field, or a quality's stages\"));\n } else {\n for (const k of Object.keys(decl.valueHelp)) {\n if (!vocabulary.includes(k)) out.push(err(\"value-help\", atKey(at(\"valueHelp\"), k), `\"${k}\" is not one of its values`));\n }\n }\n }\n if (named && decl.default !== undefined && sound) {\n const misfit = valueProblems(decl, decl.default).filter((p) => p.severity === \"error\");\n if (misfit.length > 0) out.push(err(\"default-misfit\", at(\"default\"), `the default does not fit: ${misfit[0]!.message}`));\n }\n}\n\nfunction ofProblems(host: HostName, decl: TypeDecl, at: (k: string) => string, out: Problem[]): boolean {\n if (!isObject(decl.of)) {\n out.push(err(\"missing-of\", at(\"of\"), `a ${decl.type} says what it holds, in \"of\"`));\n return false;\n }\n const before = out.length;\n unknownKeys(decl.of as Record<string, unknown>, BARE_KEYS, at(\"of\"), out);\n typeProblems(host, decl.of, at(\"of\"), false, out);\n return !out.slice(before).some((p) => p.severity === \"error\");\n}\n\nfunction renamedStagesProblems(decl: TypeDecl, path: string, out: Problem[]): void {\n if (decl.type !== \"quality\" || !isObject(decl.renamedStages)) {\n out.push(err(\"renamed-stages\", path, \"renamed stages belong to a quality, as { \\\"old\\\": \\\"new\\\" }\"));\n return;\n }\n const stages = decl.stages ?? [];\n for (const [from, to] of Object.entries(decl.renamedStages)) {\n if (stages.includes(from)) {\n out.push(err(\"renamed-stages\", atKey(path, from), `\"${from}\" is still a stage, so it cannot also be an old name`));\n } else if (typeof to !== \"string\" || !stages.includes(to)) {\n out.push(err(\"renamed-stages\", atKey(path, from), `\"${from}\" is renamed to ${JSON.stringify(to)}, which is not a stage`));\n }\n }\n}\n\n// --- settings and claims across a project --------------------------------------\n\n/** The host field each of a manifest's settings names, the project's choice\n * first, else the setting's default. */\nexport function settingValues(manifest: Manifest, chosen?: Readonly<Record<string, unknown>>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const s of manifest.settings ?? []) {\n const v = chosen !== undefined && own(chosen, s.name) ? chosen[s.name] : undefined;\n out[s.name] = typeof v === \"string\" && v !== \"\" ? v : s.default;\n }\n return out;\n}\n\n/** A claim as a project resolves it: the host field it presents, by name. */\nexport interface ResolvedClaim {\n readonly extension: string;\n readonly host: HostName;\n readonly kind: string;\n /** The host field's name, through the setting. */\n readonly field: string;\n readonly claim: ClaimDecl;\n}\n\n/** Every claim of a manifest for one host, resolved through the project's settings. */\nexport function resolvedClaims(manifest: Manifest, host: HostName, chosen?: Readonly<Record<string, unknown>>): ResolvedClaim[] {\n const settings = settingValues(manifest, chosen);\n const out: ResolvedClaim[] = [];\n for (const [kind, target] of Object.entries(manifest.targets[host] ?? {})) {\n for (const claim of target.claims ?? []) {\n const field = settings[claim.setting];\n if (field !== undefined) out.push({ extension: manifest.id, host, kind, field, claim });\n }\n }\n return out;\n}\n\n/** Two extensions claiming one host field: an error naming both, once per pair. */\nexport function claimClashes(claims: readonly ResolvedClaim[]): Problem[] {\n const out: Problem[] = [];\n const first = new Map<string, ResolvedClaim>();\n for (const c of claims) {\n const key = `${c.host}\\u0000${c.kind}\\u0000${c.field}`;\n const prior = first.get(key);\n if (prior === undefined) { first.set(key, c); continue; }\n if (prior.extension === c.extension) continue;\n out.push(err(\"claim-clash\", `${c.kind}.${c.field}`,\n `extensions \"${prior.extension}\" and \"${c.extension}\" both claim the ${c.kind} field \"${c.field}\"`));\n }\n return out;\n}\n\n/** One manifest's declarations for one host and node kind, or undefined. */\nexport function targetOf(manifest: Manifest | undefined, host: HostName, kind: string): TargetDecl | undefined {\n const kinds = manifest?.targets[host];\n return kinds !== undefined && own(kinds, kind) ? kinds[kind] : undefined;\n}\n\n/**\n * A claim as a host draws and checks its field: the claim's label, help, value help and constraints, over the\n * host's own declaration for what the claim leaves out (an enum's or flags' values, a quality's stages, the\n * default). The host's vocabulary stands when the claim names none, as the host's ladder always does.\n */\nexport function effectiveClaim<C extends ClaimDecl>(\n claim: C, hostDecl: { readonly type?: string; readonly values?: readonly string[]; readonly stages?: readonly string[]; readonly default?: unknown },\n): C {\n return {\n ...claim,\n ...(claim.values === undefined && hostDecl.values !== undefined ? { values: hostDecl.values } : {}),\n ...(claim.stages === undefined && hostDecl.stages !== undefined ? { stages: hostDecl.stages } : {}),\n ...(claim.default === undefined && hostDecl.default !== undefined ? { default: hostDecl.default } : {}),\n };\n}\n","// ---------------------------------------------------------------------------\n// The type-driven three-way merge, and the unresolved mark.\n//\n// Lifted from the Storylets format's strategy table (storylets\n// packages/ops/src/merge.ts), which merged every shard of that format as a tree\n// of five behaviours, and generalised two ways: a strategy can be built from a\n// manifest's types, and a keyed list can keep its authored order rather than\n// sorting by key (patterkit design/family-parity-2026-10.md item 4: a list the\n// editor lets you reorder must not be re-sorted by a merge).\n//\n// Pure: data in, data out.\n// ---------------------------------------------------------------------------\n\nimport { isObject } from \"./path.js\";\nimport { targetOf } from \"./manifest.js\";\nimport type { ConflictKind, FieldDecl, HostName, Manifest, Problem, TargetDecl, TypeDecl, UnresolvedEntry } from \"./types.js\";\n\n/**\n * A merge strategy, as data:\n * atomic one value, classic three-way (objects compare by content)\n * map(of) an open string-keyed map, each value merged by `of`\n * set a list of strings as a set: additions union, deletions respected\n * keyed(key, of) a list of objects keyed by the string field `key`; output\n * sorted by key, or in the authored order with `order: \"preserve\"`\n * object(fields) named keys by their own strategy, every other key by `other`\n * (atomic when absent)\n */\nexport type Strategy =\n | { readonly kind: \"atomic\" }\n | { readonly kind: \"map\"; readonly of: Strategy }\n | { readonly kind: \"set\" }\n | { readonly kind: \"keyed\"; readonly key: string; readonly of: Strategy; readonly order?: \"sorted\" | \"preserve\"; readonly renameWarning?: string }\n | { readonly kind: \"object\"; readonly fields: Readonly<Record<string, Strategy>>; readonly other?: Strategy };\n\nexport const ATOMIC: Strategy = { kind: \"atomic\" };\nexport const SET: Strategy = { kind: \"set\" };\nexport const mapOf = (of: Strategy): Strategy => ({ kind: \"map\", of });\nexport const keyedBy = (key: string, of: Strategy, opts?: { order?: \"sorted\" | \"preserve\"; renameWarning?: string }): Strategy =>\n ({ kind: \"keyed\", key, of, ...(opts?.order !== undefined ? { order: opts.order } : {}),\n ...(opts?.renameWarning !== undefined ? { renameWarning: opts.renameWarning } : {}) });\nexport const objectOf = (fields: Readonly<Record<string, Strategy>>, other?: Strategy): Strategy =>\n ({ kind: \"object\", fields, ...(other !== undefined ? { other } : {}) });\n\n/** One clash; the merged value holds OURS for it. */\nexport interface Conflict {\n /** The entity key involved (a keyed item's key, a map's key), or \"\" at the top. */\n readonly id: string;\n /** Where, from the root: `entries.card.c_1.perf.v_ann.look`, `cards[c_1].priority`. */\n readonly path: string;\n readonly base: unknown;\n readonly ours: unknown;\n readonly theirs: unknown;\n readonly kind: ConflictKind;\n}\n\n/** A note on a merge that went through but that a person should check. */\nexport interface MergeWarning {\n readonly id: string;\n readonly path: string;\n readonly message: string;\n}\n\nexport interface TreeMergeResult {\n readonly merged: unknown;\n readonly conflicts: Conflict[];\n readonly warnings: MergeWarning[];\n}\n\nexport interface TreeMergeOptions {\n /** Whether two values say the same thing. Content equality with keys in any\n * order by default; a format whose canonical form is looser passes its own. */\n readonly equal?: (a: unknown, b: unknown) => boolean;\n}\n\n/** JSON with every object's keys sorted: two values with this text say the same thing. */\nexport function stableStringify(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (Array.isArray(value)) return `[${value.map((v) => (v === undefined ? \"null\" : stableStringify(v))).join(\",\")}]`;\n if (isObject(value)) {\n const keys = Object.keys(value).filter((k) => value[k] !== undefined).sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`).join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nconst defaultEqual = (a: unknown, b: unknown): boolean => stableStringify(a) === stableStringify(b);\nconst asArr = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n\ninterface Ctx {\n readonly eq: (a: unknown, b: unknown) => boolean;\n readonly conflicts: Conflict[];\n readonly warnings: MergeWarning[];\n}\n\n/** Three-way merge `base`, `ours` and `theirs` by `strategy`. A clash keeps ours. */\nexport function mergeTree(strategy: Strategy, base: unknown, ours: unknown, theirs: unknown, opts?: TreeMergeOptions): TreeMergeResult {\n const ctx: Ctx = { eq: opts?.equal ?? defaultEqual, conflicts: [], warnings: [] };\n const merged = mergeValue(strategy, base, ours, theirs, \"\", \"\", ctx);\n return { merged, conflicts: ctx.conflicts, warnings: ctx.warnings };\n}\n\nfunction deletedKind(base: unknown, ours: unknown, theirs: unknown): ConflictKind {\n if (base !== undefined && (ours === undefined || theirs === undefined)) return \"delete-vs-edit\";\n return base === undefined ? \"added-both\" : \"both-changed\";\n}\n\nfunction merge3(b: unknown, o: unknown, t: unknown, id: string, path: string, ctx: Ctx): unknown {\n if (ctx.eq(o, t)) return o;\n if (ctx.eq(b, o)) return t;\n if (ctx.eq(b, t)) return o;\n ctx.conflicts.push({ id, path, base: b, ours: o, theirs: t, kind: deletedKind(b, o, t) });\n return o;\n}\n\n/** Does a value fit a composite strategy's shape? One that does not (a scalar where a list was) merges whole. */\nfunction hasShape(spec: Strategy, v: unknown): boolean {\n switch (spec.kind) {\n case \"atomic\": return true;\n case \"set\":\n case \"keyed\": return Array.isArray(v);\n case \"map\":\n case \"object\": return isObject(v);\n }\n}\n\nfunction mergeValue(spec: Strategy, b: unknown, o: unknown, t: unknown, id: string, path: string, ctx: Ctx): unknown {\n // A composite strategy applies only when neither side deleted the whole\n // value; a delete against an edit is decided here, as one value.\n if (spec.kind === \"atomic\" || o === undefined || t === undefined || !hasShape(spec, o) || !hasShape(spec, t)) {\n return merge3(b, o, t, id, path, ctx);\n }\n switch (spec.kind) {\n case \"set\": {\n const strings = (v: unknown): Set<string> => new Set(asArr(v).filter((x): x is string => typeof x === \"string\"));\n const B = strings(b), O = strings(o), T = strings(t);\n const out = new Set<string>();\n for (const x of [...O, ...T]) if ((O.has(x) && T.has(x)) || !B.has(x)) out.add(x);\n return [...out].sort();\n }\n case \"map\": {\n const B = isObject(b) ? b : {}, O = o as Record<string, unknown>, T = t as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys({ ...B, ...O, ...T }).sort()) {\n const v = mergeValue(spec.of, B[k], O[k], T[k], id || k, `${path}.${k}`, ctx);\n if (v !== undefined) out[k] = v;\n }\n return out;\n }\n case \"object\": {\n const B = isObject(b) ? b : {}, O = o as Record<string, unknown>, T = t as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys({ ...B, ...O, ...T }).sort()) {\n const field = Object.prototype.hasOwnProperty.call(spec.fields, k) ? spec.fields[k]! : spec.other ?? ATOMIC;\n const v = mergeValue(field, B[k], O[k], T[k], id, path ? `${path}.${k}` : k, ctx);\n if (v !== undefined) out[k] = v;\n }\n return out;\n }\n case \"keyed\":\n return mergeKeyed(spec, asArr(b), o as unknown[], t as unknown[], path, ctx);\n }\n}\n\nfunction mergeKeyed(spec: Extract<Strategy, { kind: \"keyed\" }>, B: unknown[], O: unknown[], T: unknown[], path: string, ctx: Ctx): unknown[] {\n const keyOf = (v: unknown): string | undefined => (isObject(v) && typeof v[spec.key] === \"string\" ? (v[spec.key] as string) : undefined);\n const keysOf = (arr: unknown[]): string[] => arr.map(keyOf).filter((k): k is string => k !== undefined);\n const toMap = (arr: unknown[]): Map<string, unknown> => {\n const m = new Map<string, unknown>();\n for (const v of arr) {\n const k = keyOf(v);\n if (k !== undefined) m.set(k, v);\n }\n return m;\n };\n const Bm = toMap(B), Om = toMap(O), Tm = toMap(T);\n const out = new Map<string, unknown>();\n const here = (k: string): string => `${path}[${k}]`;\n\n for (const k of new Set([...Bm.keys(), ...Om.keys(), ...Tm.keys()])) {\n const b = Bm.get(k), o = Om.get(k), t = Tm.get(k);\n const inB = Bm.has(k), inO = Om.has(k), inT = Tm.has(k);\n if (inO && inT) {\n if (!inB && !ctx.eq(o, t)) {\n ctx.conflicts.push({ id: k, path: here(k), base: undefined, ours: o, theirs: t, kind: \"added-both\" });\n out.set(k, o);\n } else {\n out.set(k, mergeValue(spec.of, b, o, t, k, here(k), ctx));\n }\n } else if (inO && !inT) {\n if (inB && !ctx.eq(o, b)) {\n ctx.conflicts.push({ id: k, path: here(k), base: b, ours: o, theirs: undefined, kind: \"delete-vs-edit\" });\n out.set(k, o); // theirs deleted, ours edited: ours keeps it\n } else if (!inB) {\n out.set(k, o); // ours added\n } // else ours unchanged and theirs deleted: gone\n } else if (!inO && inT) {\n if (inB && !ctx.eq(t, b)) {\n ctx.conflicts.push({ id: k, path: here(k), base: b, ours: undefined, theirs: t, kind: \"delete-vs-edit\" });\n } else if (!inB) {\n out.set(k, t); // theirs added\n }\n } // else in the base only: both deleted\n }\n\n if (spec.renameWarning !== undefined) {\n for (const [k, v] of out) {\n const b = Bm.get(k);\n if (isObject(b) && isObject(v) && typeof b[\"gameId\"] === \"string\" && typeof v[\"gameId\"] === \"string\" && b[\"gameId\"] !== v[\"gameId\"]) {\n ctx.warnings.push({ id: k, path: here(k), message: `${spec.renameWarning} (\"${b[\"gameId\"]}\" -> \"${v[\"gameId\"]}\")` });\n }\n }\n }\n\n if (spec.order !== \"preserve\") return [...out.keys()].sort().map((k) => out.get(k));\n return preservedOrder(keysOf(B), keysOf(O), keysOf(T), out, path, ctx).map((k) => out.get(k));\n}\n\n/**\n * The authored order of a keyed list after a merge. The side that reordered\n * the items both sides kept is the skeleton (ours when neither did, and ours,\n * with a clash, when both did differently); the other side's additions then\n * go in after the item they followed there, or at the front when they led.\n */\nfunction preservedOrder(B: string[], O: string[], T: string[], survivors: ReadonlyMap<string, unknown>, path: string, ctx: Ctx): string[] {\n const inAll = new Set(B.filter((k) => O.includes(k) && T.includes(k) && survivors.has(k)));\n const common = (seq: string[]): string[] => seq.filter((k) => inAll.has(k));\n const same = (a: string[], b: string[]): boolean => a.length === b.length && a.every((x, i) => x === b[i]);\n const oMoved = !same(common(O), common(B)), tMoved = !same(common(T), common(B));\n if (oMoved && tMoved && !same(common(O), common(T))) {\n ctx.conflicts.push({ id: \"\", path: `${path}:order`, base: common(B), ours: common(O), theirs: common(T), kind: \"both-changed\" });\n }\n const [skeleton, other] = tMoved && !oMoved ? [T, O] : [O, T];\n const result = skeleton.filter((k) => survivors.has(k));\n for (let i = 0; i < other.length; i++) {\n const k = other[i]!;\n if (!survivors.has(k) || result.includes(k)) continue;\n let at = 0;\n for (let j = i - 1; j >= 0; j--) {\n const p = result.indexOf(other[j]!);\n if (p >= 0) { at = p + 1; break; }\n }\n result.splice(at, 0, k);\n }\n // Survivors neither list holds in order (cannot happen for well-formed input) go last, sorted.\n for (const k of [...survivors.keys()].sort()) if (!result.includes(k)) result.push(k);\n return result;\n}\n\n// --- strategies from a manifest ---------------------------------------------------\n\n/** How a value of this type merges (the README's table). */\nexport function strategyForType(decl: TypeDecl): Strategy {\n switch (decl.type) {\n case \"flags\": return SET;\n case \"record\": return strategyForFields(decl.fields ?? []);\n case \"map\": return mapOf(decl.of !== undefined ? strategyForType(decl.of) : ATOMIC);\n case \"list\":\n return decl.id !== undefined\n ? keyedBy(decl.id, decl.of !== undefined ? strategyForType(decl.of) : ATOMIC, { order: \"preserve\" })\n : ATOMIC;\n default: return ATOMIC;\n }\n}\n\nfunction strategyForFields(fields: readonly FieldDecl[]): Strategy {\n return objectOf(Object.fromEntries(fields.map((f) => [f.name, strategyForType(f)])));\n}\n\n/** How one node's entry merges: field by field, each by its type. */\nexport function strategyForTarget(target: TargetDecl): Strategy {\n return strategyForFields(target.fields ?? []);\n}\n\n/**\n * How an extension data shard merges for one host. With the manifest, each\n * kind's entries merge node by node and each entry field by field; a kind the\n * manifest does not target, and every kind without the manifest, merges node\n * by node with each entry as one value.\n */\nexport function extensionDataStrategy(manifest: Manifest | undefined, host: HostName): Strategy {\n const perNode = mapOf(ATOMIC);\n const kinds: Record<string, Strategy> = {};\n for (const kind of Object.keys(manifest?.targets[host] ?? {})) {\n const target = targetOf(manifest, host, kind);\n if (target !== undefined) kinds[kind] = mapOf(strategyForTarget(target));\n }\n return objectOf({ entries: objectOf(kinds, perNode) });\n}\n\n// --- the unresolved mark ---------------------------------------------------------\n\n/** The reserved key a merged shard carries its clashes under. */\nexport const UNRESOLVED_KEY = \"unresolved\";\n\n/** A shard's mark, when it carries one. */\nexport function unresolvedOf(shard: unknown): readonly UnresolvedEntry[] | undefined {\n if (!isObject(shard) || !Object.prototype.hasOwnProperty.call(shard, UNRESOLVED_KEY)) return undefined;\n const mark = shard[UNRESOLVED_KEY];\n return Array.isArray(mark) ? (mark as UnresolvedEntry[]) : [];\n}\n\n/** A shard without its mark, for merging and for comparing content. */\nexport function withoutMark<T>(shard: T): T {\n if (!isObject(shard) || !Object.prototype.hasOwnProperty.call(shard, UNRESOLVED_KEY)) return shard;\n const { [UNRESOLVED_KEY]: _mark, ...rest } = shard;\n return rest as T;\n}\n\nconst entryOf = (c: Conflict): UnresolvedEntry => ({\n path: c.path, kind: c.kind,\n ...(c.base !== undefined ? { base: c.base } : {}),\n ...(c.ours !== undefined ? { ours: c.ours } : {}),\n ...(c.theirs !== undefined ? { theirs: c.theirs } : {}),\n});\n\n/**\n * Write a merge's clashes into the merged shard under `unresolved`, carrying\n * any mark either side already had (a mark is a set by path: one side\n * resolving it, by removing it, resolves it). A clash found now replaces a\n * carried one at the same path. With nothing to mark, the key is absent.\n */\nexport function markUnresolved<T extends Record<string, unknown>>(\n merged: T, conflicts: readonly Conflict[], sides?: { base?: unknown; ours?: unknown; theirs?: unknown },\n): T {\n const byPath = (mark: readonly UnresolvedEntry[] | undefined): Map<string, UnresolvedEntry> =>\n new Map((mark ?? []).filter((e) => isObject(e) && typeof e.path === \"string\").map((e) => [e.path, e]));\n const B = byPath(unresolvedOf(sides?.base)), O = byPath(unresolvedOf(sides?.ours)), T = byPath(unresolvedOf(sides?.theirs));\n const out = new Map<string, UnresolvedEntry>();\n for (const [p, e] of [...O, ...T]) {\n const kept = (O.has(p) && T.has(p)) || !B.has(p); // on both sides still, or newly marked on one\n if (kept && !out.has(p)) out.set(p, e);\n }\n for (const c of conflicts) out.set(c.path, entryOf(c));\n const result = withoutMark(merged) as Record<string, unknown>;\n if (out.size === 0) return result as T;\n return { ...result, [UNRESOLVED_KEY]: [...out.keys()].sort().map((p) => out.get(p)!) } as unknown as T;\n}\n\n/** Validation's refusal of a marked shard: one error per clash, or one for an empty mark. */\nexport function unresolvedProblems(shard: unknown): Problem[] {\n const mark = unresolvedOf(shard);\n if (mark === undefined) return [];\n const message = \"unresolved merge: this shard holds our side of a clash; resolve it, then remove the entry from \\\"unresolved\\\"\";\n if (mark.length === 0) return [{ severity: \"error\", code: \"unresolved\", path: UNRESOLVED_KEY, message }];\n return mark.map((e) => ({\n severity: \"error\" as const, code: \"unresolved\",\n path: isObject(e) && typeof e.path === \"string\" ? e.path : UNRESOLVED_KEY,\n message: `${message} (${isObject(e) && typeof e.kind === \"string\" ? e.kind : \"clash\"})`,\n }));\n}\n\n// --- extension data ----------------------------------------------------------------\n\nexport interface DataMergeResult {\n /** The merged shard: ours where it clashed, with the mark written in. */\n readonly merged: Record<string, unknown>;\n readonly conflicts: Conflict[];\n readonly warnings: MergeWarning[];\n}\n\n/**\n * Three-way merge of one extension data shard. `manifest` is the project's copy,\n * read from the working tree, or undefined when it is missing, unreadable or\n * itself in conflict, which merges each node's entry as one value: always safe.\n * The shard's other keys (a format's schema tag, the extension id) merge as values.\n */\nexport function mergeExtensionData(\n base: Record<string, unknown>, ours: Record<string, unknown>, theirs: Record<string, unknown>,\n opts: { manifest?: Manifest; host: HostName } & TreeMergeOptions,\n): DataMergeResult {\n const strategy = extensionDataStrategy(opts.manifest, opts.host);\n const { merged, conflicts, warnings } = mergeTree(strategy, withoutMark(base), withoutMark(ours), withoutMark(theirs),\n opts.equal !== undefined ? { equal: opts.equal } : undefined);\n return {\n merged: markUnresolved(merged as Record<string, unknown>, conflicts, { base, ours, theirs }),\n conflicts, warnings,\n };\n}\n\n/** Entries naming a node the host no longer has: kept, and reported as warnings. */\nexport function orphanedEntries(data: unknown, exists: (kind: string, id: string) => boolean): Problem[] {\n const out: Problem[] = [];\n const entries = isObject(data) ? data[\"entries\"] : undefined;\n if (!isObject(entries)) return out;\n for (const [kind, nodes] of Object.entries(entries)) {\n if (!isObject(nodes)) continue;\n for (const id of Object.keys(nodes)) {\n if (!exists(kind, id)) {\n out.push({ severity: \"warning\", code: \"orphan\", path: `entries.${kind}.${id}`,\n message: `an entry for ${kind} \"${id}\", which no longer exists; it is kept, and not compiled` });\n }\n }\n }\n return out;\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export { parseSource } from './chunk-ONEAWPDZ.js';
|
|
2
2
|
|
|
3
3
|
// src/ids.ts
|
|
4
4
|
var ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
@@ -30,10 +30,6 @@ function fnv32(input) {
|
|
|
30
30
|
}
|
|
31
31
|
return h >>> 0;
|
|
32
32
|
}
|
|
33
|
-
function parseSource(text) {
|
|
34
|
-
const body = text.charCodeAt(0) === 65279 ? text.slice(1) : text;
|
|
35
|
-
return JSON5.parse(body);
|
|
36
|
-
}
|
|
37
33
|
|
|
38
34
|
// src/find.ts
|
|
39
35
|
function findMatcher(opts) {
|
|
@@ -43,6 +39,6 @@ function findMatcher(opts) {
|
|
|
43
39
|
return new RegExp(body, opts.caseSensitive ? "g" : "gi");
|
|
44
40
|
}
|
|
45
41
|
|
|
46
|
-
export { findMatcher, fnv32, newId,
|
|
42
|
+
export { findMatcher, fnv32, newId, slug };
|
|
47
43
|
//# sourceMappingURL=index.js.map
|
|
48
44
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ids.ts","../src/hash.ts","../src/
|
|
1
|
+
{"version":3,"sources":["../src/ids.ts","../src/hash.ts","../src/find.ts"],"names":[],"mappings":";;;AASA,IAAM,QAAA,GAAW,sCAAA;AAGV,SAAS,KAAA,CAAM,MAAA,GAAS,EAAA,EAAI,MAAA,GAAS,CAAA,EAAW;AAGrD,EAAA,MAAM,KAAA,GAAQ,GAAA,GAAO,GAAA,GAAM,QAAA,CAAS,MAAA;AACpC,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,OAAO,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AACvC,IAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,KAAK,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,KAAK,KAAA,EAAO;AAChB,MAAA,KAAA,IAAS,QAAA,CAAS,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AACzC;AAGO,SAAS,IAAA,CAAK,IAAA,EAAc,QAAA,GAAW,SAAA,EAAmB;AAC/D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AACtF,EAAA,OAAO,CAAA,IAAK,QAAA;AACd;;;ACxBO,SAAS,MAAM,KAAA,EAAuB;AAC3C,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,CAAA,IAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AACvB,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,QAAU,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;;;ACCO,SAAS,YAAY,IAAA,EAAkC;AAC5D,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,uBAAuB,MAAM,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,GAAY,CAAA,GAAA,EAAM,GAAG,CAAA,GAAA,CAAA,GAAQ,GAAA;AAC/C,EAAA,OAAO,IAAI,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,aAAA,GAAgB,MAAM,IAAI,CAAA;AACzD","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Stable, immutable, opaque ids.\n//\n// Generated at creation, never derived from content or position, so an id\n// survives moving, renaming and reordering the thing it names. A short,\n// collision-resistant base-36 token with an optional type prefix that aids\n// debugging but carries no meaning.\n// ---------------------------------------------------------------------------\n\nconst ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n\n/** Generate a new opaque id, e.g. `newId(\"scn\") -> \"scn_8f3kq2z1\"`. */\nexport function newId(prefix = \"\", length = 8): string {\n // Rejection-sample so every alphabet character is equally likely: a plain\n // `byte % 36` over-weights the first four characters.\n const limit = 256 - (256 % ALPHABET.length); // 252\n let token = \"\";\n while (token.length < length) {\n const bytes = new Uint8Array(length * 2);\n globalThis.crypto.getRandomValues(bytes);\n for (const b of bytes) {\n if (b >= limit) continue;\n token += ALPHABET[b % ALPHABET.length];\n if (token.length === length) break;\n }\n }\n return prefix ? `${prefix}_${token}` : token;\n}\n\n/** A url-ish slug from a human label; `\"project\"` when nothing usable is left. */\nexport function slug(name: string, fallback = \"project\"): string {\n const s = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return s || fallback;\n}\n","// ---------------------------------------------------------------------------\n// FNV-1a, 32-bit.\n//\n// A published, fixed algorithm. Not cryptographic: it is for short stable\n// handles and change detection, where the properties that matter are that it is\n// the same everywhere and does not move between runs.\n// ---------------------------------------------------------------------------\n\n/** FNV-1a over a string's UTF-16 code units, as an unsigned 32-bit integer. */\nexport function fnv32(input: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n","// ---------------------------------------------------------------------------\n// Find and replace over authored text.\n// ---------------------------------------------------------------------------\n\nexport interface FindOptions {\n query: string;\n caseSensitive?: boolean;\n wholeWord?: boolean;\n}\n\n/**\n * Build the find matcher, or null for an empty query. Global, so every\n * occurrence in a string is replaced rather than only the first.\n *\n * The query is escaped: a person typing `a.b` means those three characters, not\n * \"a, anything, b\".\n */\nexport function findMatcher(opts: FindOptions): RegExp | null {\n if (!opts.query) return null;\n const esc = opts.query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const body = opts.wholeWord ? `\\\\b${esc}\\\\b` : esc;\n return new RegExp(body, opts.caseSensitive ? \"g\" : \"gi\");\n}\n"]}
|
package/extensions.md
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# @wildwinter/toolkit/extensions
|
|
2
|
+
|
|
3
|
+
The shared spec and merge for Patter extensions and Storylet extensions: the manifest an extension ships, the
|
|
4
|
+
types its values take, the checks both editors and both command lines run, and the type-driven three-way merge
|
|
5
|
+
both formats use for extension data. Nothing here is UI and nothing runs in a game.
|
|
6
|
+
|
|
7
|
+
A Patter extension extends Patter projects and Patterpad; a Storylet extension extends Storylets projects and
|
|
8
|
+
Storyletter; one that does both is both. This package is the part they share. Each format stores extension data in
|
|
9
|
+
shards of its own, compiles it into its own bundle and delivers it on its own runtimes.
|
|
10
|
+
|
|
11
|
+
**The host's rule: a host knows that extension data exists, and its shape, but never its meaning.**
|
|
12
|
+
|
|
13
|
+
## The manifest
|
|
14
|
+
|
|
15
|
+
A manifest is declarative: no code runs. A project keeps a copy of each manifest it takes, so every machine and CI
|
|
16
|
+
read the same one. It is JSON (JSON5 is read too), and is called `<id>.extension.json`
|
|
17
|
+
(`MANIFEST_FILE_SUFFIX`).
|
|
18
|
+
|
|
19
|
+
```json5
|
|
20
|
+
{
|
|
21
|
+
schema: "wildwinter/extension@0",
|
|
22
|
+
id: "pattershot", // lower case, digits and hyphens, starting with a letter
|
|
23
|
+
name: "Pattershot",
|
|
24
|
+
version: "1.2.0", // major.minor.patch
|
|
25
|
+
docs: "https://example.com/pattershot",
|
|
26
|
+
settings: [ // project settings, each naming a host field a claim presents
|
|
27
|
+
{ name: "moodField", label: "Mood field", help: "The card field holding the mood.", default: "mood" },
|
|
28
|
+
],
|
|
29
|
+
targets: {
|
|
30
|
+
storylets: { // a host: "patter" or "storylets"
|
|
31
|
+
card: { // a node kind of that host
|
|
32
|
+
fields: [ /* field declarations, below */ ],
|
|
33
|
+
claims: [ /* claims on host fields, below */ ],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- **Identity**: `id`, `name`, `version`, and optionally `docs`, a link to the extension's own documentation.
|
|
41
|
+
- **Targets**, by host and node kind:
|
|
42
|
+
|
|
43
|
+
| Host | Node kinds | References | Kinds with host fields (claimable) |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| `patter` | `scene`, `block`, `snippet`, `line`, `text`, `gameEvent`, `option`, `project` | `cast`, `scene`, `block`, `snippet`, `line` | every kind but `project` (game data) |
|
|
46
|
+
| `storylets` | `box`, `tagGroup`, `tag`, `deck`, `card`, `outcome`, `handTemplate`, `hand`, `project` | `box`, `deck`, `card`, `outcome`, `tag` | `card`, `outcome` (fields) |
|
|
47
|
+
|
|
48
|
+
- **Fields** per target, in the order the editor shows them.
|
|
49
|
+
- **Claims** on host fields, named through a project setting.
|
|
50
|
+
|
|
51
|
+
### Field declarations
|
|
52
|
+
|
|
53
|
+
```json5
|
|
54
|
+
{
|
|
55
|
+
name: "mood", // an identifier, unique within the target (or the record)
|
|
56
|
+
label: "Mood", // shown beside the control; the name when absent
|
|
57
|
+
help: "How the line is played.",
|
|
58
|
+
type: "enum",
|
|
59
|
+
values: ["calm", "tense"],
|
|
60
|
+
valueHelp: { calm: "Unhurried.", tense: "Clipped." },
|
|
61
|
+
default: "calm", // optional: the type's default when absent (below)
|
|
62
|
+
required: true, // a node of this kind must set it
|
|
63
|
+
group: "Delivery", // a heading within the extension's group, in field order
|
|
64
|
+
editorOnly: true, // stripped at compile; editor data, never in the bundle
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- `label`, `help`, `valueHelp` (one sentence per enum or flags value or quality stage) and `group` are for the
|
|
69
|
+
editor, and never reach a bundle.
|
|
70
|
+
- `required`, `min` and `max` (numbers only) are validation.
|
|
71
|
+
- `editorOnly` is allowed on a target's own fields only, not inside a record.
|
|
72
|
+
|
|
73
|
+
### Claims on host fields
|
|
74
|
+
|
|
75
|
+
A claim presents a field the host already has, with this manifest's control, help and validation, without moving the
|
|
76
|
+
data. It names the field through a setting, so a project whose field has another name says so once:
|
|
77
|
+
|
|
78
|
+
```json5
|
|
79
|
+
{ setting: "moodField", type: "enum", values: ["calm", "tense"], label: "Mood", help: "..." }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A claim is a scalar. It may leave out an enum's or flags' `values` and a quality's `stages`: the host's
|
|
83
|
+
declaration is then the vocabulary, as the host's ladder always is, and the claim adds its label, help and
|
|
84
|
+
`valueHelp`, which may describe values the host does not declare (they are simply unused). `effectiveClaim(claim,
|
|
85
|
+
hostDecl)` gives the declaration a host draws and checks the field with. The project names the extension's settings when it opts in (each host's project shard says
|
|
86
|
+
how); a setting the project leaves out takes the setting's `default`. A claimed field keeps the host's own merge
|
|
87
|
+
rule, ladder and renames. Two extensions claiming one field is an error naming both (`claimClashes`); a host
|
|
88
|
+
whose field has a type other than the claim's is an error naming where (the host checks: in Storylets, per box).
|
|
89
|
+
|
|
90
|
+
## The types
|
|
91
|
+
|
|
92
|
+
| Type | Holds | Default when none is given | Merges |
|
|
93
|
+
|---|---|---|---|
|
|
94
|
+
| `text`, `multiline` | A string | `""` | Three-way: one side's change wins; two different changes clash |
|
|
95
|
+
| `number` | A number, within `min` and `max` when given | `0` | Three-way |
|
|
96
|
+
| `boolean` | `true` or `false` | `false` | Three-way |
|
|
97
|
+
| `enum` | One of `values`, or `""` (none chosen) | The first value | Three-way |
|
|
98
|
+
| `flags` | A set of `values` | `[]` | As a set, value by value |
|
|
99
|
+
| `quality` | One stage of `stages` (at least two, none empty, none twice) | The first stage | Three-way |
|
|
100
|
+
| `reference` | The id of a node of the kind named by `to` | `""` | Three-way; validated to exist |
|
|
101
|
+
| `record` | Named `fields`, each a field declaration | Each field's default | Field by field |
|
|
102
|
+
| `map` | Entries keyed by `key` (`{ type: "text" }` or `{ type: "reference", to }`), each of type `of` | `{}` | Key by key, then by the value's own type |
|
|
103
|
+
| `list` with `id` | Records, each carrying the text field named by `id`, unique in the list | `[]` | Union by id, each item by its own type; order kept |
|
|
104
|
+
| `list` without `id` | Values of type `of` | `[]` | Whole: two different changes clash |
|
|
105
|
+
|
|
106
|
+
The scalars are the family's field types, spelled as the family spells them: `text`, never `string`. A scalar's
|
|
107
|
+
default is the kernel's (`defaultFor` in `@wildwinter/scoperegistry`); a structured type's is built from its parts.
|
|
108
|
+
A default that is given must fit the type. Defaults are optional in source and resolved in each bundle
|
|
109
|
+
(`resolvedFields`), so a host's defaults helper always returns every declared field. A node's values stay raw and
|
|
110
|
+
sparse: "the node sets nothing" is told apart from "the node sets the default".
|
|
111
|
+
|
|
112
|
+
A value that does not fit is reported by `valueProblems`, through the kernel's `valueFits`. A quality value that
|
|
113
|
+
names no stage carries the stages either side of it as `options` (the kernel's `stagesEitherSide`, the whole
|
|
114
|
+
ladder for a stage that is gone).
|
|
115
|
+
|
|
116
|
+
### Stage renames
|
|
117
|
+
|
|
118
|
+
An extension's ladder belongs to its manifest. A version that renames a stage says so on the field:
|
|
119
|
+
`renamedStages: { "old": "new" }`, every name a stage has ever had to the stage it is now (a value of the map is a
|
|
120
|
+
current stage, a key is not). A host applies the renames (`renameStages`) to the extension's data when the project
|
|
121
|
+
takes the new version, as one step with the new pin, and compiles values through them meanwhile.
|
|
122
|
+
|
|
123
|
+
## Extension data
|
|
124
|
+
|
|
125
|
+
Each format keeps one shard per extension per scene (Patter) or per box (Storylets), plus one for the project. The
|
|
126
|
+
format-neutral part of a shard is:
|
|
127
|
+
|
|
128
|
+
```json5
|
|
129
|
+
{
|
|
130
|
+
extension: "pattershot", // the extension's id
|
|
131
|
+
entries: { // by node kind, then node id
|
|
132
|
+
card: {
|
|
133
|
+
c_7k2: { mood: "tense", beats: [{ id: "b1", at: 2 }] },
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
unresolved: [ /* the clashes of a merge nobody has resolved yet; absent otherwise */ ],
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Everything under `entries` is the extension's, and a host's canonical form must not reorder it. An entry naming a
|
|
141
|
+
node that no longer exists is kept, and reported by the host's validation as a warning (`orphanedEntries`), never
|
|
142
|
+
silently dropped. A project that names an extension whose manifest is missing opens with a warning, and its data is
|
|
143
|
+
left untouched.
|
|
144
|
+
|
|
145
|
+
## Merge
|
|
146
|
+
|
|
147
|
+
`mergeExtensionData(base, ours, theirs, manifest?)`:
|
|
148
|
+
|
|
149
|
+
1. **By node id**: entries for different nodes never clash.
|
|
150
|
+
2. **Within a node, by the manifest's types**, as in the table above (`strategyForType`).
|
|
151
|
+
3. **A real clash** keeps our side and is named in the shard's `unresolved` entry.
|
|
152
|
+
4. **Without the manifest** (removed, unreadable, or itself in conflict in the same merge), a node's whole entry merges
|
|
153
|
+
as one value: different nodes still merge cleanly, and two changes to the same node's entry clash.
|
|
154
|
+
5. An entry deleted on one side while it changes on the other clashes like any other value: ours stands, and the mark
|
|
155
|
+
holds theirs. Data left without a node is kept and reported.
|
|
156
|
+
|
|
157
|
+
The merge reads the manifest from the project, never from what is installed, so every machine gives the same
|
|
158
|
+
result. A git merge driver receives three files and a path: it finds the project from the path and reads the
|
|
159
|
+
manifest from the working tree.
|
|
160
|
+
|
|
161
|
+
### The engine
|
|
162
|
+
|
|
163
|
+
`mergeTree(strategy, base, ours, theirs)` is the three-way merge both formats' shards use, a tree of five
|
|
164
|
+
behaviours (lifted from the Storylets format's strategy table):
|
|
165
|
+
|
|
166
|
+
- `atomic`: one value, classic three-way.
|
|
167
|
+
- `map(of)`: an open string-keyed map, each value merged by `of`.
|
|
168
|
+
- `set`: a list of strings as a set: additions union, deletions respected.
|
|
169
|
+
- `keyed(key, of)`: a list of objects keyed by the string field `key`; a delete against an edit and the same key added
|
|
170
|
+
twice with different content are clashes. `order: "sorted"` (the default) sorts by key; `"preserve"` keeps the
|
|
171
|
+
authored order, taking the side that reordered, and clashes when both did.
|
|
172
|
+
- `object(fields)`: named keys get their own strategy, every other key is atomic.
|
|
173
|
+
|
|
174
|
+
### The unresolved mark
|
|
175
|
+
|
|
176
|
+
**An unresolved merge is marked in the merged shard, in both formats.** `markUnresolved` writes the clashes into the
|
|
177
|
+
shard under the reserved key `unresolved` (`UNRESOLVED_KEY`), each with its path, its kind and the three values; a
|
|
178
|
+
mark already on either side is carried until somebody resolves it. Validation, and so CI, refuses a shard carrying
|
|
179
|
+
the mark (`unresolvedProblems`); resolving removes it. The mark travels with the file in every version control
|
|
180
|
+
system and needs no ignore rule. Conflict sidecars, where a format writes them, stay uncommitted.
|
|
181
|
+
|
|
182
|
+
This covers every shard of a format, not only extension shards.
|
|
183
|
+
|
|
184
|
+
## Conformance
|
|
185
|
+
|
|
186
|
+
`conformance/extensions/*.json` are the contract: hand-written cases for manifest validation, value validation,
|
|
187
|
+
defaults, stage renames and the merge, with their expectations. `test/extensions.test.ts` runs them. A host that
|
|
188
|
+
reimplements any part runs the same files.
|
|
189
|
+
|
|
190
|
+
This entry needs `@wildwinter/expr` and `@wildwinter/scoperegistry` (the kernel's value and ladder rules, and
|
|
191
|
+
`defaultFor`). They are optional peer dependencies of the toolkit, so a host that imports only the toolkit's main
|
|
192
|
+
entry installs nothing more.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wildwinter/toolkit",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "Small shared pieces of the authoring tooling: opaque ids, a stable hash, JSON5 source parsing, find/replace matching, and the
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Small shared pieces of the authoring tooling: opaque ids, a stable hash, JSON5 source parsing, find/replace matching, the archive guards, and (in ./extensions) the spec and merge for Patter extensions and Storylet extensions. Nothing here runs in a game.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Ian Thomas",
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
"hash",
|
|
16
16
|
"json5",
|
|
17
17
|
"zip",
|
|
18
|
-
"tooling"
|
|
18
|
+
"tooling",
|
|
19
|
+
"extensions",
|
|
20
|
+
"merge"
|
|
19
21
|
],
|
|
20
22
|
"main": "./dist/index.cjs",
|
|
21
23
|
"module": "./dist/index.js",
|
|
@@ -30,11 +32,19 @@
|
|
|
30
32
|
"types": "./dist/archive.d.ts",
|
|
31
33
|
"import": "./dist/archive.js",
|
|
32
34
|
"require": "./dist/archive.cjs"
|
|
35
|
+
},
|
|
36
|
+
"./extensions": {
|
|
37
|
+
"types": "./dist/extensions.d.ts",
|
|
38
|
+
"import": "./dist/extensions.js",
|
|
39
|
+
"require": "./dist/extensions.cjs"
|
|
33
40
|
}
|
|
34
41
|
},
|
|
35
42
|
"files": [
|
|
36
43
|
"dist",
|
|
44
|
+
"conformance",
|
|
45
|
+
"extensions.md",
|
|
37
46
|
"README.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
38
48
|
"LICENSE"
|
|
39
49
|
],
|
|
40
50
|
"sideEffects": false,
|
|
@@ -50,5 +60,21 @@
|
|
|
50
60
|
},
|
|
51
61
|
"dependencies": {
|
|
52
62
|
"json5": "^2.2.3"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"@wildwinter/expr": ">=0.6.0 <1.0.0",
|
|
66
|
+
"@wildwinter/scoperegistry": ">=0.9.0 <1.0.0"
|
|
67
|
+
},
|
|
68
|
+
"peerDependenciesMeta": {
|
|
69
|
+
"@wildwinter/expr": {
|
|
70
|
+
"optional": true
|
|
71
|
+
},
|
|
72
|
+
"@wildwinter/scoperegistry": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@wildwinter/expr": "*",
|
|
78
|
+
"@wildwinter/scoperegistry": "*"
|
|
53
79
|
}
|
|
54
80
|
}
|