@theme-registry/refract-json 0.1.6 → 0.1.8
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/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("@theme-registry/refract");const t=e=>e.endsWith(".json")?e:`${e.replace(/\.[^./]+$/,"")}.json`;exports.createJsonAdapter=(
|
|
1
|
+
"use strict";var e=require("@theme-registry/refract");const t=e=>e.endsWith(".json")?e:`${e.replace(/\.[^./]+$/,"")}.json`;exports.createJsonAdapter=(r={})=>{var s,n;const o=null!==(s=r.refs)&&void 0!==s?s:"both",i=null!==(n=r.indent)&&void 0!==n?n:2,a={name:"json",version:1,bind(r,s){const{media:n,resolve:a}=s,c=e.buildTokenMap(r),l=e=>JSON.stringify(e,null,i),d=e=>{try{return a(e)}catch{return}},u=(e,t,r)=>{const s={},n=void 0!==e.ref;return"value"!==r&&n&&(s.ref=e.ref,void 0!==e.fn&&(s.fn=e.fn),void 0!==e.arg&&(s.arg=e.arg)),"value"!==r&&void 0!==e.wrap&&(s.wrap=e.wrap),void 0!==e.external&&(s.external=e.external),"path"===r&&n||void 0===t||(s.value=t),void 0!==e.struct&&(s.struct=e.struct),s},f=(e,t,r)=>{var s;return u(t,null!==(s=d(e))&&void 0!==s?s:t.value,r)},v=(e,t)=>{var r;const s=void 0!==e.ref&&null!==(r=d(e.ref))&&void 0!==r?r:e.value,n=u(e,s,t);if(void 0===n.ref&&void 0===n.value&&void 0===n.struct&&void 0!==e.ref){const t=c[e.ref];void 0!==(null==t?void 0:t.struct)&&(n.struct=t.struct)}return n},b=(e,t)=>{const r={};for(const[s,n]of Object.entries(e))r[s]=v(n,t);return r},k=(e,t)=>{void 0!==e.state&&(t.state=e.state),void 0!==e.breakpoint&&(t.breakpoint=e.breakpoint),void 0!==e.query&&(t.query=e.query),void 0!==e.orientation&&(t.orientation=e.orientation),void 0!==e.container&&(t.container=e.container),void 0!==e.size&&(t.size=e.size),void 0!==e.variant&&(t.variant=e.variant),void 0!==e.target&&(t.target=e.target)},p=(e,t)=>{const r=[];for(const s of e){const e={};k(s,e),e.declarations=s.declarations?b(s.declarations,t):{},r.push(e)}return r},y=(e,t)=>{const r=((e,t,r)=>{const s={};return e.kind&&(s.kind=e.kind),void 0!==e.selector&&(s.selector=e.selector),e.references&&e.references.length&&(s.references=e.references),s.declarations=t,s.overrides=r,s})({kind:e.kind,selector:e.selector,references:e.references?[...e.references]:void 0},b(e.declarations,t),p(e.overrides,t));return e.variants&&Object.keys(e.variants).length&&(r.variants=Object.fromEntries(Object.entries(e.variants).map(([e,r])=>[e,{declarations:b(r.declarations,t),overrides:p(r.overrides,t)}]))),r},m=(e,t)=>({steps:e.steps.map(e=>({stop:e.stop,declarations:b(e.declarations,t)}))}),h=(e,t)=>{const r={kind:"recipe",declarations:b(e.base,t),overrides:[]};for(const[s,n]of Object.entries(e.states))r.overrides.push({state:s,declarations:b(n,t)});for(const s of e.responsive){const e={};k(s,e),e.declarations=b(s.declarations,t),r.overrides.push(e)}return r},j=e=>{const t=void 0!==e?`${e}.`:"",r={};for(const[s,n]of Object.entries(c))(void 0===e||s.startsWith(t))&&(r[s]=f(s,n,o));return r},g=e=>{var t;const s={};for(const[n,i]of Object.entries(r.subsystems))if(void 0===e||n===e)for(const[e,r]of Object.entries(null!==(t=i.ruleSets)&&void 0!==t?t:{}))for(const[t,i]of Object.entries(r))s[`${n}.${e}.${t}`]=y(i,o);return s},O=e=>{var t;const s={};for(const[n,i]of Object.entries(r.subsystems))if(void 0===e||n===e)for(const[e,r]of Object.entries(null!==(t=i.keyframes)&&void 0!==t?t:{}))s[`${n}.${e}`]=m(r,o);return s},S=()=>{if(!r.containers||!Object.keys(r.containers).length)return;const e={};for(const[t,s]of Object.entries(r.containers))e[t]={type:s.type,sizes:{...s.sizes}};return e},$=()=>{const e={breakpoints:{...r.breakpoints}},t=S();t&&(e.containers=t);const s=j();Object.keys(s).length&&(e.tokens=s);const n=g();Object.keys(n).length&&(e.ruleSets=n);const o=O();return Object.keys(o).length&&(e.keyframes=o),e},w=e=>Object.keys(e).length>0;return{recipeName:(e,t,r)=>`${e}.${t}.${r}`,describePreview:()=>({stylesheets:[],unavailable:"This target emits a JSON document — data, with no rendered form. Token values below are exact; recipes are listed by the dotted key they carry under `ruleSets`."}),describeUsage(){var e;const t=[];for(const[s,n]of Object.entries(r.subsystems))for(const[r,o]of Object.entries(null!==(e=n.ruleSets)&&void 0!==e?e:{}))for(const e of Object.keys(o))t.push({subsystem:s,group:r,variant:e,name:`${s}.${r}.${e}`});return{format:"json",summary:["This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.",'Load it in any language or tool: `import theme from "./theme.json"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention."],recipes:t}},renderRecipe(e,t,s){var n,i,a;const c=null===(a=null===(i=null===(n=r.subsystems[e])||void 0===n?void 0:n.ruleSets)||void 0===i?void 0:i[t])||void 0===a?void 0:a[s];return c?{ruleSets:{[`${e}.${t}.${s}`]:y(c,o)}}:{}},renderVariables(e){const t=j(e);return Object.keys(t).length?{tokens:t}:{}},join:e=>{const t={};for(const r of e)r.breakpoints&&(t.breakpoints={...t.breakpoints,...r.breakpoints}),r.containers&&(t.containers={...t.containers,...r.containers}),r.tokens&&(t.tokens={...t.tokens,...r.tokens}),r.ruleSets&&(t.ruleSets={...t.ruleSets,...r.ruleSets}),r.keyframes&&(t.keyframes={...t.keyframes,...r.keyframes});return t},renderAllVariables(){const e={breakpoints:{...r.breakpoints}},t=S();t&&(e.containers=t);const s=j();return Object.keys(s).length&&(e.tokens=s),e},renderAllRecipes(){const e={},t=g();Object.keys(t).length&&(e.ruleSets=t);const r=O();return Object.keys(r).length&&(e.keyframes=r),e},renderAll:$,extend:()=>({media:n,get json(){return $()},get jsonString(){return l($())}}),emit(s){var n,o,i,a;const d=null!==(n=null==s?void 0:s.type)&&void 0!==n?n:"single";if("single"===d){const e="single"===(null==s?void 0:s.type)?s.file:"theme.json";return{files:{[t(e)]:l($())}}}if("split"===(null==s?void 0:s.type)){const e=$(),r={};e.ruleSets&&(r.ruleSets=e.ruleSets),e.keyframes&&(r.keyframes=e.keyframes);const n={};return e.breakpoints&&(n.breakpoints=e.breakpoints),e.containers&&(n.containers=e.containers),e.tokens&&(n.tokens=e.tokens),{files:{[t(s.file)]:l(r),[t(s.variables)]:l(n)}}}if("subsystem"===(null==s?void 0:s.type)){const e={};for(const n of Object.keys(r.subsystems)){const r=j(n);Object.keys(r).length&&(e[t(s.filename(n,"variables"))]=l({tokens:r}));const o={},i=g(n);Object.keys(i).length&&(o.ruleSets=i);const a=O(n);Object.keys(a).length&&(o.keyframes=a),w(o)&&(e[t(s.filename(n,"styles"))]=l(o))}return{files:e}}if("components"===(null==s?void 0:s.type)){const n=null!==(i=null===(o=r.subsystems.components)||void 0===o?void 0:o.ruleSets)&&void 0!==i?i:{},d=s.inline?"value":"both",u={},v=[],b=new Set;for(const[o,i]of Object.entries(n))for(const n of Object.keys(i)){const i=e.mergeComponentRuleSet(r,o,n),c=t(s.filename({group:o,variant:n}));if((null!==(a=u[c])&&void 0!==a?a:u[c]={})[`components.${o}.${n}`]=h(i,d),!s.inline)for(const e of i.referencedPaths)b.has(e)||(b.add(e),v.push(e))}const k={};for(const[e,t]of Object.entries(u))k[e]=l({ruleSets:t});if(!s.inline&&!1!==s.variables){const e={};for(const t of v){const r=c[t];r&&(e[t]=f(t,r,"both"))}Object.keys(e).length&&(k[t(s.variables)]=l({tokens:e}))}return{files:k}}throw new Error(`json adapter: emit mode '${d}' not yet implemented`)}}}};return e.defineAdapter(a)};
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The JSON adapter — lowers the format-neutral {@link ThemeModel} to structured JSON.\n *\n * The second shipping adapter, and the proof that \"one Model, many formats\" is real: where the\n * CSS adapter's output unit is `string`, this adapter's is a {@link JsonDoc} object and `join`\n * is a bucket merge — the same four primitives + `defineAdapter` aggregators, a different `TUnit`.\n *\n * What it adds over the adapter-free `./dtcg` export (which is tokens-only): it lowers the FULL\n * Model — not just tokens, but rule-sets/recipes, states, responsive/container overrides,\n * composition-by-reference, and keyframes — keeping each `ref` as data alongside its resolved\n * value (exactly what CSS collapses into opaque `var(--…)` strings). That is recipes-as-data,\n * and it doubles as the Model + build-time emit path.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all addressing, the doc IR,\n * and value resolution live here.\n */\nimport type { Literal, Ref, RuleSet, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { AdapterSpec, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type {\n JsonAdapterOptions,\n JsonDoc,\n JsonKeyframe,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\nexport type {\n JsonAdapterOptions,\n JsonContainer,\n JsonDoc,\n JsonKeyframe,\n JsonKeyframeStep,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\n/** The JSON adapter's output unit — a document fragment (see {@link JsonDoc}). */\nexport type JsonUnit = JsonDoc;\n\n/** Normalize an emitted filename's extension to `.json` (plan defaults are CSS-centric: `theme.css`,\n * `variables.css`, …). Any existing extension is swapped; a bare name gains `.json`. */\nconst jsonName = (name: string): string =>\n name.endsWith(\".json\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.json`;\n\nexport const createJsonAdapter = (options: JsonAdapterOptions = {}): ThemeAdapter<JsonUnit> => {\n const refsMode: RefsMode = options.refs ?? \"both\";\n const indent = options.indent ?? 2;\n\n const spec: AdapterSpec<JsonUnit> = {\n name: \"json\",\n version: 1,\n // No `allowedStates`: JSON renders any state name as a data key — it owns no selector knowledge\n // (contrast the CSS adapter's CSS_KNOWN_STATES). Core then does no state validation for this adapter.\n bind(model: ThemeModel, ctx: RenderContext) {\n const { media, resolve } = ctx;\n // The flat `path -> Ref` token map (base + variants + extras), shared by the tokens bucket,\n // renderVariables, and the components tree-shake — the same map that backs `theme.tokens`.\n const tokenMap = buildTokenMap(model);\n\n const stringify = (doc: JsonDoc): string => JSON.stringify(doc, null, indent);\n\n /** Resolve a token path to its literal, swallowing a resolver throw (defensive — a well-formed\n * Model resolves everything; falls back to the Ref's cached `value`). */\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /** Build a leaf from a `Ref` + its already-resolved literal, honoring the ref mode. */\n const buildLeaf = (ref: Ref, value: Literal | undefined, mode: RefsMode): JsonLeaf => {\n const leaf: JsonLeaf = {};\n const hasRef = ref.ref !== undefined;\n if (mode !== \"value\" && hasRef) {\n leaf.ref = ref.ref;\n if (ref.fn !== undefined) leaf.fn = ref.fn;\n if (ref.arg !== undefined) leaf.arg = ref.arg;\n }\n if (mode !== \"value\" && ref.wrap !== undefined) leaf.wrap = ref.wrap;\n if (ref.external !== undefined) leaf.external = ref.external; // §W6b — parent-var passthrough\n // `value` in both/value modes; in path mode only for a literal (no ref to stand in for it).\n if ((mode !== \"path\" || !hasRef) && value !== undefined) leaf.value = value;\n // §15: a structured (shadow/transition) value carries as data — the format-neutral shape a\n // future RN adapter lowers; its per-layer `color` stays a `colors.*` ref for the consumer.\n if (ref.struct !== undefined) leaf.struct = ref.struct;\n return leaf;\n };\n\n /** A token leaf — resolved by the token's OWN address (its `Ref.ref`, if any, is a derivation source). */\n const tokenLeaf = (path: string, ref: Ref, mode: RefsMode): JsonLeaf =>\n buildLeaf(ref, safeResolve(path) ?? ref.value, mode);\n\n /** A declaration leaf — resolved by the path its `Ref.ref` points at (literal ⇒ its `value`).\n * §15: when the ref points at a STRUCTURED (shadow/transition) token — which has no single\n * literal to bake — the leaf carries that token's `struct` (its per-layer `color` stays a\n * `colors.*` ref for the consumer), so an inline declaration isn't left value-less. */\n const declLeaf = (ref: Ref, mode: RefsMode): JsonLeaf => {\n const value = ref.ref !== undefined ? safeResolve(ref.ref) ?? ref.value : ref.value;\n const leaf = buildLeaf(ref, value, mode);\n // Only when the `ref` was baked away (inline `value` mode) and no literal resulted — otherwise\n // the retained `ref` already leads the consumer to the token that carries the struct.\n if (leaf.ref === undefined && leaf.value === undefined && leaf.struct === undefined && ref.ref !== undefined) {\n const target = tokenMap[ref.ref];\n if (target?.struct !== undefined) leaf.struct = target.struct;\n }\n return leaf;\n };\n\n const mapDecls = (decls: Record<string, Ref>, mode: RefsMode): Record<string, JsonLeaf> => {\n const out: Record<string, JsonLeaf> = {};\n for (const [prop, ref] of Object.entries(decls)) out[prop] = declLeaf(ref, mode);\n return out;\n };\n\n /** Copy the present condition axes off a Model override/entry onto a JSON override. */\n const copyCondition = (\n src: {\n state?: string;\n breakpoint?: string;\n query?: JsonOverride[\"query\"];\n orientation?: JsonOverride[\"orientation\"];\n container?: string;\n size?: string;\n variant?: string;\n target?: string;\n },\n dst: JsonOverride,\n ): void => {\n if (src.state !== undefined) dst.state = src.state;\n if (src.breakpoint !== undefined) dst.breakpoint = src.breakpoint;\n if (src.query !== undefined) dst.query = src.query;\n if (src.orientation !== undefined) dst.orientation = src.orientation;\n if (src.container !== undefined) dst.container = src.container;\n if (src.size !== undefined) dst.size = src.size;\n if (src.variant !== undefined) dst.variant = src.variant;\n if (src.target !== undefined) dst.target = src.target;\n };\n\n // Assemble a rule-set with a readable key order: kind / selector / references first, then\n // declarations / overrides (independent of the Model's property insertion order).\n const assembleRuleSet = (\n head: Pick<JsonRuleSet, \"kind\" | \"selector\" | \"references\">,\n declarations: Record<string, JsonLeaf>,\n overrides: JsonOverride[],\n ): JsonRuleSet => {\n const out = {} as JsonRuleSet;\n if (head.kind) out.kind = head.kind;\n if (head.selector !== undefined) out.selector = head.selector;\n if (head.references && head.references.length) out.references = head.references;\n out.declarations = declarations;\n out.overrides = overrides;\n return out;\n };\n\n const overridesToJson = (list: RuleSet[\"overrides\"], mode: RefsMode): JsonOverride[] => {\n const overrides: JsonOverride[] = [];\n for (const ov of list) {\n const jo = {} as JsonOverride; // condition axes first, then declarations (readability)\n copyCondition(ov, jo);\n jo.declarations = ov.declarations ? mapDecls(ov.declarations, mode) : {};\n overrides.push(jo);\n }\n return overrides;\n };\n\n const ruleSetToJson = (rs: RuleSet, mode: RefsMode): JsonRuleSet => {\n const out = assembleRuleSet(\n { kind: rs.kind, selector: rs.selector, references: rs.references ? [...rs.references] : undefined },\n mapDecls(rs.declarations, mode),\n overridesToJson(rs.overrides, mode),\n );\n // §9: globals element variants (delta-only modifiers) survive as data.\n if (rs.variants && Object.keys(rs.variants).length) {\n out.variants = Object.fromEntries(\n Object.entries(rs.variants).map(([name, v]) => [\n name,\n { declarations: mapDecls(v.declarations, mode), overrides: overridesToJson(v.overrides, mode) },\n ]),\n );\n }\n return out;\n };\n\n const keyframeToJson = (kf: { steps: { stop: string; declarations: Record<string, Ref> }[] }, mode: RefsMode): JsonKeyframe => ({\n steps: kf.steps.map(s => ({ stop: s.stop, declarations: mapDecls(s.declarations, mode) })),\n });\n\n /** A merged component variant (`mergeComponentRuleSet`) → one self-contained JSON rule-set. */\n const mergedToJson = (merged: MergedRuleSet, mode: RefsMode): JsonRuleSet => {\n const out: JsonRuleSet = { kind: \"recipe\", declarations: mapDecls(merged.base, mode), overrides: [] };\n for (const [state, decls] of Object.entries(merged.states)) {\n out.overrides.push({ state, declarations: mapDecls(decls, mode) });\n }\n for (const entry of merged.responsive) {\n const jo = {} as JsonOverride;\n copyCondition(entry, jo);\n jo.declarations = mapDecls(entry.declarations, mode);\n out.overrides.push(jo);\n }\n return out;\n };\n\n // ── Bucket builders (each a flat address-keyed map; every full-doc consumer composes these) ──\n const buildTokensBucket = (subsystem?: string): Record<string, JsonLeaf> => {\n const prefix = subsystem !== undefined ? `${subsystem}.` : \"\";\n const tokens: Record<string, JsonLeaf> = {};\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (subsystem !== undefined && !path.startsWith(prefix)) continue;\n tokens[path] = tokenLeaf(path, ref, refsMode);\n }\n return tokens;\n };\n\n const buildRuleSetsBucket = (subsystem?: string): Record<string, JsonRuleSet> => {\n const ruleSets: Record<string, JsonRuleSet> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [group, rsGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const [variant, rs] of Object.entries(rsGroup)) {\n ruleSets[`${sub}.${group}.${variant}`] = ruleSetToJson(rs, refsMode);\n }\n }\n }\n return ruleSets;\n };\n\n const buildKeyframesBucket = (subsystem?: string): Record<string, JsonKeyframe> => {\n const keyframes: Record<string, JsonKeyframe> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [name, kf] of Object.entries(subModel.keyframes ?? {})) {\n keyframes[`${sub}.${name}`] = keyframeToJson(kf, refsMode);\n }\n }\n return keyframes;\n };\n\n const buildContainersBucket = (): JsonDoc[\"containers\"] => {\n if (!model.containers || !Object.keys(model.containers).length) return undefined;\n const out: NonNullable<JsonDoc[\"containers\"]> = {};\n for (const [name, c] of Object.entries(model.containers)) out[name] = { type: c.type, sizes: { ...c.sizes } };\n return out;\n };\n\n /** The whole theme as one document — the JSON analogue of the CSS adapter's `collectNodes()`. */\n const buildDoc = (): JsonDoc => {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n };\n\n const hasContent = (doc: JsonDoc): boolean => Object.keys(doc).length > 0;\n\n const join = (parts: JsonDoc[]): JsonDoc => {\n const out: JsonDoc = {};\n for (const p of parts) {\n if (p.breakpoints) out.breakpoints = { ...out.breakpoints, ...p.breakpoints };\n if (p.containers) out.containers = { ...out.containers, ...p.containers };\n if (p.tokens) out.tokens = { ...out.tokens, ...p.tokens };\n if (p.ruleSets) out.ruleSets = { ...out.ruleSets, ...p.ruleSets };\n if (p.keyframes) out.keyframes = { ...out.keyframes, ...p.keyframes };\n }\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n return `${subsystem}.${group}.${variant}`;\n },\n\n // Self-documentation: every recipe's dotted key under `ruleSets`, plus framework-neutral\n // \"read the data\" prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n recipes.push({ subsystem, group, variant, name: `${subsystem}.${group}.${variant}` });\n }\n }\n }\n return {\n format: \"json\",\n summary: [\n \"This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.\",\n 'Load it in any language or tool: `import theme from \"./theme.json\"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',\n \"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention.\",\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n const rs = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!rs) return {};\n return { ruleSets: { [`${subsystem}.${group}.${variant}`]: ruleSetToJson(rs, refsMode) } };\n },\n renderVariables(subsystem) {\n const tokens = buildTokensBucket(subsystem);\n return Object.keys(tokens).length ? { tokens } : {};\n },\n join,\n\n // Aggregators overridden (like the CSS adapter): the full doc is not a flat concat of the\n // primitives — the theme-global breakpoints/containers + keyframes land here.\n renderAllVariables(): JsonDoc {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n return doc;\n },\n renderAllRecipes(): JsonDoc {\n const doc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n },\n renderAll: buildDoc,\n\n // Runtime surface: the doc object + its pretty string, plus the plain media descriptor\n // pass-through (mirrors how the CSS adapter surfaces `theme.css` + `theme.media`).\n extend() {\n return {\n media,\n get json(): JsonDoc {\n return buildDoc();\n },\n get jsonString(): string {\n return stringify(buildDoc());\n },\n };\n },\n\n // Build-time emit — the §9 output-shape vocabulary mapped onto the doc's buckets. Plan filenames\n // are normalized to a `.json` extension (the shared plan defaults name `.css` files).\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.json\";\n return { files: { [jsonName(file)]: stringify(buildDoc()) } };\n }\n\n if (plan?.type === \"split\") {\n // Two docs under a load-order-free contract: rule-sets/keyframes vs tokens/config.\n const doc = buildDoc();\n const stylesDoc: JsonDoc = {};\n if (doc.ruleSets) stylesDoc.ruleSets = doc.ruleSets;\n if (doc.keyframes) stylesDoc.keyframes = doc.keyframes;\n const varsDoc: JsonDoc = {};\n if (doc.breakpoints) varsDoc.breakpoints = doc.breakpoints;\n if (doc.containers) varsDoc.containers = doc.containers;\n if (doc.tokens) varsDoc.tokens = doc.tokens;\n return {\n files: { [jsonName(plan.file)]: stringify(stylesDoc), [jsonName(plan.variables)]: stringify(varsDoc) },\n };\n }\n\n if (plan?.type === \"subsystem\") {\n // One pair of docs per subsystem — its tokens (variables side) + its rule-sets/keyframes\n // (styles side). Global breakpoints/containers are theme-level, not per-subsystem, so they\n // don't appear here (like CSS `@media` breakpoints, they only surface inside overrides).\n // Skip empties — the components subsystem owns no tokens → styles file only.\n const files: Record<string, string> = {};\n for (const sub of Object.keys(model.subsystems)) {\n const tokens = buildTokensBucket(sub);\n if (Object.keys(tokens).length) files[jsonName(plan.filename(sub, \"variables\"))] = stringify({ tokens });\n\n const stylesDoc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket(sub);\n if (Object.keys(ruleSets).length) stylesDoc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket(sub);\n if (Object.keys(keyframes).length) stylesDoc.keyframes = keyframes;\n if (hasContent(stylesDoc)) files[jsonName(plan.filename(sub, \"styles\"))] = stringify(stylesDoc);\n }\n return { files };\n }\n\n if (plan?.type === \"components\") {\n // The flattened/merged export: each component variant → one self-contained rule-set\n // (`mergeComponentRuleSet`). `inline` (default true) resolves values and drops refs;\n // `inline: false` keeps refs + a tree-shaken tokens file of only the referenced paths.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const leafMode: RefsMode = plan.inline ? \"value\" : \"both\";\n\n const filesByName: Record<string, Record<string, JsonRuleSet>> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const filename = jsonName(plan.filename({ group, variant }));\n (filesByName[filename] ??= {})[`components.${group}.${variant}`] = mergedToJson(merged, leafMode);\n\n if (!plan.inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n for (const [name, ruleSets] of Object.entries(filesByName)) files[name] = stringify({ ruleSets });\n\n // Tree-shaken tokens file — only the referenced paths — unless `variables: false`.\n if (!plan.inline && plan.variables !== false) {\n const tokens: Record<string, JsonLeaf> = {};\n for (const path of referencedPaths) {\n const ref = tokenMap[path];\n if (ref) tokens[path] = tokenLeaf(path, ref, \"both\");\n }\n if (Object.keys(tokens).length) files[jsonName(plan.variables)] = stringify({ tokens });\n }\n\n return { files };\n }\n\n throw new Error(`json adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["jsonName","name","endsWith","replace","options","refsMode","_a","refs","indent","_b","spec","version","bind","model","ctx","media","resolve","tokenMap","buildTokenMap","stringify","doc","JSON","safeResolve","path","buildLeaf","ref","value","mode","leaf","hasRef","undefined","fn","arg","wrap","external","struct","tokenLeaf","declLeaf","target","mapDecls","decls","out","prop","Object","entries","copyCondition","src","dst","state","breakpoint","query","orientation","container","size","variant","overridesToJson","list","overrides","ov","jo","declarations","push","ruleSetToJson","rs","head","kind","selector","references","length","assembleRuleSet","variants","keys","fromEntries","map","v","keyframeToJson","kf","steps","s","stop","mergedToJson","merged","base","states","entry","responsive","buildTokensBucket","subsystem","prefix","tokens","startsWith","buildRuleSetsBucket","ruleSets","sub","subModel","subsystems","group","rsGroup","buildKeyframesBucket","keyframes","buildContainersBucket","containers","c","type","sizes","buildDoc","breakpoints","hasContent","recipeName","describeUsage","recipes","ruleSetGroup","format","summary","renderRecipe","_c","renderVariables","join","parts","p","renderAllVariables","renderAllRecipes","renderAll","extend","json","jsonString","emit","plan","file","files","stylesDoc","varsDoc","variables","filename","componentRuleSets","components","leafMode","inline","filesByName","referencedPaths","seen","Set","mergeComponentRuleSet","_d","has","add","Error","defineAdapter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The JSON adapter — lowers the format-neutral {@link ThemeModel} to structured JSON.\n *\n * The second shipping adapter, and the proof that \"one Model, many formats\" is real: where the\n * CSS adapter's output unit is `string`, this adapter's is a {@link JsonDoc} object and `join`\n * is a bucket merge — the same four primitives + `defineAdapter` aggregators, a different `TUnit`.\n *\n * What it adds over the adapter-free `./dtcg` export (which is tokens-only): it lowers the FULL\n * Model — not just tokens, but rule-sets/recipes, states, responsive/container overrides,\n * composition-by-reference, and keyframes — keeping each `ref` as data alongside its resolved\n * value (exactly what CSS collapses into opaque `var(--…)` strings). That is recipes-as-data,\n * and it doubles as the Model + build-time emit path.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all addressing, the doc IR,\n * and value resolution live here.\n */\nimport type { Literal, Ref, RuleSet, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { AdapterSpec, PreviewDescriptor, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type {\n JsonAdapterOptions,\n JsonDoc,\n JsonKeyframe,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\nexport type {\n JsonAdapterOptions,\n JsonContainer,\n JsonDoc,\n JsonKeyframe,\n JsonKeyframeStep,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\n/** The JSON adapter's output unit — a document fragment (see {@link JsonDoc}). */\nexport type JsonUnit = JsonDoc;\n\n/** Normalize an emitted filename's extension to `.json` (plan defaults are CSS-centric: `theme.css`,\n * `variables.css`, …). Any existing extension is swapped; a bare name gains `.json`. */\nconst jsonName = (name: string): string =>\n name.endsWith(\".json\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.json`;\n\nexport const createJsonAdapter = (options: JsonAdapterOptions = {}): ThemeAdapter<JsonUnit> => {\n const refsMode: RefsMode = options.refs ?? \"both\";\n const indent = options.indent ?? 2;\n\n const spec: AdapterSpec<JsonUnit> = {\n name: \"json\",\n version: 1,\n // No `allowedStates`: JSON renders any state name as a data key — it owns no selector knowledge\n // (contrast the CSS adapter's CSS_KNOWN_STATES). Core then does no state validation for this adapter.\n bind(model: ThemeModel, ctx: RenderContext) {\n const { media, resolve } = ctx;\n // The flat `path -> Ref` token map (base + variants + extras), shared by the tokens bucket,\n // renderVariables, and the components tree-shake — the same map that backs `theme.tokens`.\n const tokenMap = buildTokenMap(model);\n\n const stringify = (doc: JsonDoc): string => JSON.stringify(doc, null, indent);\n\n /** Resolve a token path to its literal, swallowing a resolver throw (defensive — a well-formed\n * Model resolves everything; falls back to the Ref's cached `value`). */\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /** Build a leaf from a `Ref` + its already-resolved literal, honoring the ref mode. */\n const buildLeaf = (ref: Ref, value: Literal | undefined, mode: RefsMode): JsonLeaf => {\n const leaf: JsonLeaf = {};\n const hasRef = ref.ref !== undefined;\n if (mode !== \"value\" && hasRef) {\n leaf.ref = ref.ref;\n if (ref.fn !== undefined) leaf.fn = ref.fn;\n if (ref.arg !== undefined) leaf.arg = ref.arg;\n }\n if (mode !== \"value\" && ref.wrap !== undefined) leaf.wrap = ref.wrap;\n if (ref.external !== undefined) leaf.external = ref.external; // §W6b — parent-var passthrough\n // `value` in both/value modes; in path mode only for a literal (no ref to stand in for it).\n if ((mode !== \"path\" || !hasRef) && value !== undefined) leaf.value = value;\n // §15: a structured (shadow/transition) value carries as data — the format-neutral shape a\n // future RN adapter lowers; its per-layer `color` stays a `colors.*` ref for the consumer.\n if (ref.struct !== undefined) leaf.struct = ref.struct;\n return leaf;\n };\n\n /** A token leaf — resolved by the token's OWN address (its `Ref.ref`, if any, is a derivation source). */\n const tokenLeaf = (path: string, ref: Ref, mode: RefsMode): JsonLeaf =>\n buildLeaf(ref, safeResolve(path) ?? ref.value, mode);\n\n /** A declaration leaf — resolved by the path its `Ref.ref` points at (literal ⇒ its `value`).\n * §15: when the ref points at a STRUCTURED (shadow/transition) token — which has no single\n * literal to bake — the leaf carries that token's `struct` (its per-layer `color` stays a\n * `colors.*` ref for the consumer), so an inline declaration isn't left value-less. */\n const declLeaf = (ref: Ref, mode: RefsMode): JsonLeaf => {\n const value = ref.ref !== undefined ? safeResolve(ref.ref) ?? ref.value : ref.value;\n const leaf = buildLeaf(ref, value, mode);\n // Only when the `ref` was baked away (inline `value` mode) and no literal resulted — otherwise\n // the retained `ref` already leads the consumer to the token that carries the struct.\n if (leaf.ref === undefined && leaf.value === undefined && leaf.struct === undefined && ref.ref !== undefined) {\n const target = tokenMap[ref.ref];\n if (target?.struct !== undefined) leaf.struct = target.struct;\n }\n return leaf;\n };\n\n const mapDecls = (decls: Record<string, Ref>, mode: RefsMode): Record<string, JsonLeaf> => {\n const out: Record<string, JsonLeaf> = {};\n for (const [prop, ref] of Object.entries(decls)) out[prop] = declLeaf(ref, mode);\n return out;\n };\n\n /** Copy the present condition axes off a Model override/entry onto a JSON override. */\n const copyCondition = (\n src: {\n state?: string;\n breakpoint?: string;\n query?: JsonOverride[\"query\"];\n orientation?: JsonOverride[\"orientation\"];\n container?: string;\n size?: string;\n variant?: string;\n target?: string;\n },\n dst: JsonOverride,\n ): void => {\n if (src.state !== undefined) dst.state = src.state;\n if (src.breakpoint !== undefined) dst.breakpoint = src.breakpoint;\n if (src.query !== undefined) dst.query = src.query;\n if (src.orientation !== undefined) dst.orientation = src.orientation;\n if (src.container !== undefined) dst.container = src.container;\n if (src.size !== undefined) dst.size = src.size;\n if (src.variant !== undefined) dst.variant = src.variant;\n if (src.target !== undefined) dst.target = src.target;\n };\n\n // Assemble a rule-set with a readable key order: kind / selector / references first, then\n // declarations / overrides (independent of the Model's property insertion order).\n const assembleRuleSet = (\n head: Pick<JsonRuleSet, \"kind\" | \"selector\" | \"references\">,\n declarations: Record<string, JsonLeaf>,\n overrides: JsonOverride[],\n ): JsonRuleSet => {\n const out = {} as JsonRuleSet;\n if (head.kind) out.kind = head.kind;\n if (head.selector !== undefined) out.selector = head.selector;\n if (head.references && head.references.length) out.references = head.references;\n out.declarations = declarations;\n out.overrides = overrides;\n return out;\n };\n\n const overridesToJson = (list: RuleSet[\"overrides\"], mode: RefsMode): JsonOverride[] => {\n const overrides: JsonOverride[] = [];\n for (const ov of list) {\n const jo = {} as JsonOverride; // condition axes first, then declarations (readability)\n copyCondition(ov, jo);\n jo.declarations = ov.declarations ? mapDecls(ov.declarations, mode) : {};\n overrides.push(jo);\n }\n return overrides;\n };\n\n const ruleSetToJson = (rs: RuleSet, mode: RefsMode): JsonRuleSet => {\n const out = assembleRuleSet(\n { kind: rs.kind, selector: rs.selector, references: rs.references ? [...rs.references] : undefined },\n mapDecls(rs.declarations, mode),\n overridesToJson(rs.overrides, mode),\n );\n // §9: globals element variants (delta-only modifiers) survive as data.\n if (rs.variants && Object.keys(rs.variants).length) {\n out.variants = Object.fromEntries(\n Object.entries(rs.variants).map(([name, v]) => [\n name,\n { declarations: mapDecls(v.declarations, mode), overrides: overridesToJson(v.overrides, mode) },\n ]),\n );\n }\n return out;\n };\n\n const keyframeToJson = (kf: { steps: { stop: string; declarations: Record<string, Ref> }[] }, mode: RefsMode): JsonKeyframe => ({\n steps: kf.steps.map(s => ({ stop: s.stop, declarations: mapDecls(s.declarations, mode) })),\n });\n\n /** A merged component variant (`mergeComponentRuleSet`) → one self-contained JSON rule-set. */\n const mergedToJson = (merged: MergedRuleSet, mode: RefsMode): JsonRuleSet => {\n const out: JsonRuleSet = { kind: \"recipe\", declarations: mapDecls(merged.base, mode), overrides: [] };\n for (const [state, decls] of Object.entries(merged.states)) {\n out.overrides.push({ state, declarations: mapDecls(decls, mode) });\n }\n for (const entry of merged.responsive) {\n const jo = {} as JsonOverride;\n copyCondition(entry, jo);\n jo.declarations = mapDecls(entry.declarations, mode);\n out.overrides.push(jo);\n }\n return out;\n };\n\n // ── Bucket builders (each a flat address-keyed map; every full-doc consumer composes these) ──\n const buildTokensBucket = (subsystem?: string): Record<string, JsonLeaf> => {\n const prefix = subsystem !== undefined ? `${subsystem}.` : \"\";\n const tokens: Record<string, JsonLeaf> = {};\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (subsystem !== undefined && !path.startsWith(prefix)) continue;\n tokens[path] = tokenLeaf(path, ref, refsMode);\n }\n return tokens;\n };\n\n const buildRuleSetsBucket = (subsystem?: string): Record<string, JsonRuleSet> => {\n const ruleSets: Record<string, JsonRuleSet> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [group, rsGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const [variant, rs] of Object.entries(rsGroup)) {\n ruleSets[`${sub}.${group}.${variant}`] = ruleSetToJson(rs, refsMode);\n }\n }\n }\n return ruleSets;\n };\n\n const buildKeyframesBucket = (subsystem?: string): Record<string, JsonKeyframe> => {\n const keyframes: Record<string, JsonKeyframe> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [name, kf] of Object.entries(subModel.keyframes ?? {})) {\n keyframes[`${sub}.${name}`] = keyframeToJson(kf, refsMode);\n }\n }\n return keyframes;\n };\n\n const buildContainersBucket = (): JsonDoc[\"containers\"] => {\n if (!model.containers || !Object.keys(model.containers).length) return undefined;\n const out: NonNullable<JsonDoc[\"containers\"]> = {};\n for (const [name, c] of Object.entries(model.containers)) out[name] = { type: c.type, sizes: { ...c.sizes } };\n return out;\n };\n\n /** The whole theme as one document — the JSON analogue of the CSS adapter's `collectNodes()`. */\n const buildDoc = (): JsonDoc => {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n };\n\n const hasContent = (doc: JsonDoc): boolean => Object.keys(doc).length > 0;\n\n const join = (parts: JsonDoc[]): JsonDoc => {\n const out: JsonDoc = {};\n for (const p of parts) {\n if (p.breakpoints) out.breakpoints = { ...out.breakpoints, ...p.breakpoints };\n if (p.containers) out.containers = { ...out.containers, ...p.containers };\n if (p.tokens) out.tokens = { ...out.tokens, ...p.tokens };\n if (p.ruleSets) out.ruleSets = { ...out.ruleSets, ...p.ruleSets };\n if (p.keyframes) out.keyframes = { ...out.keyframes, ...p.keyframes };\n }\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n return `${subsystem}.${group}.${variant}`;\n },\n\n // Preview (§20): JSON is data, not a rendered form — there is nothing for a browser to load.\n // The token plates are the whole point of the page for this target.\n describePreview(): PreviewDescriptor {\n return {\n stylesheets: [],\n unavailable:\n \"This target emits a JSON document — data, with no rendered form. Token values below \" +\n \"are exact; recipes are listed by the dotted key they carry under `ruleSets`.\",\n };\n },\n\n // Self-documentation: every recipe's dotted key under `ruleSets`, plus framework-neutral\n // \"read the data\" prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n recipes.push({ subsystem, group, variant, name: `${subsystem}.${group}.${variant}` });\n }\n }\n }\n return {\n format: \"json\",\n summary: [\n \"This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.\",\n 'Load it in any language or tool: `import theme from \"./theme.json\"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',\n \"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention.\",\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n const rs = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!rs) return {};\n return { ruleSets: { [`${subsystem}.${group}.${variant}`]: ruleSetToJson(rs, refsMode) } };\n },\n renderVariables(subsystem) {\n const tokens = buildTokensBucket(subsystem);\n return Object.keys(tokens).length ? { tokens } : {};\n },\n join,\n\n // Aggregators overridden (like the CSS adapter): the full doc is not a flat concat of the\n // primitives — the theme-global breakpoints/containers + keyframes land here.\n renderAllVariables(): JsonDoc {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n return doc;\n },\n renderAllRecipes(): JsonDoc {\n const doc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n },\n renderAll: buildDoc,\n\n // Runtime surface: the doc object + its pretty string, plus the plain media descriptor\n // pass-through (mirrors how the CSS adapter surfaces `theme.css` + `theme.media`).\n extend() {\n return {\n media,\n get json(): JsonDoc {\n return buildDoc();\n },\n get jsonString(): string {\n return stringify(buildDoc());\n },\n };\n },\n\n // Build-time emit — the §9 output-shape vocabulary mapped onto the doc's buckets. Plan filenames\n // are normalized to a `.json` extension (the shared plan defaults name `.css` files).\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.json\";\n return { files: { [jsonName(file)]: stringify(buildDoc()) } };\n }\n\n if (plan?.type === \"split\") {\n // Two docs under a load-order-free contract: rule-sets/keyframes vs tokens/config.\n const doc = buildDoc();\n const stylesDoc: JsonDoc = {};\n if (doc.ruleSets) stylesDoc.ruleSets = doc.ruleSets;\n if (doc.keyframes) stylesDoc.keyframes = doc.keyframes;\n const varsDoc: JsonDoc = {};\n if (doc.breakpoints) varsDoc.breakpoints = doc.breakpoints;\n if (doc.containers) varsDoc.containers = doc.containers;\n if (doc.tokens) varsDoc.tokens = doc.tokens;\n return {\n files: { [jsonName(plan.file)]: stringify(stylesDoc), [jsonName(plan.variables)]: stringify(varsDoc) },\n };\n }\n\n if (plan?.type === \"subsystem\") {\n // One pair of docs per subsystem — its tokens (variables side) + its rule-sets/keyframes\n // (styles side). Global breakpoints/containers are theme-level, not per-subsystem, so they\n // don't appear here (like CSS `@media` breakpoints, they only surface inside overrides).\n // Skip empties — the components subsystem owns no tokens → styles file only.\n const files: Record<string, string> = {};\n for (const sub of Object.keys(model.subsystems)) {\n const tokens = buildTokensBucket(sub);\n if (Object.keys(tokens).length) files[jsonName(plan.filename(sub, \"variables\"))] = stringify({ tokens });\n\n const stylesDoc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket(sub);\n if (Object.keys(ruleSets).length) stylesDoc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket(sub);\n if (Object.keys(keyframes).length) stylesDoc.keyframes = keyframes;\n if (hasContent(stylesDoc)) files[jsonName(plan.filename(sub, \"styles\"))] = stringify(stylesDoc);\n }\n return { files };\n }\n\n if (plan?.type === \"components\") {\n // The flattened/merged export: each component variant → one self-contained rule-set\n // (`mergeComponentRuleSet`). `inline` (default true) resolves values and drops refs;\n // `inline: false` keeps refs + a tree-shaken tokens file of only the referenced paths.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const leafMode: RefsMode = plan.inline ? \"value\" : \"both\";\n\n const filesByName: Record<string, Record<string, JsonRuleSet>> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const filename = jsonName(plan.filename({ group, variant }));\n (filesByName[filename] ??= {})[`components.${group}.${variant}`] = mergedToJson(merged, leafMode);\n\n if (!plan.inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n for (const [name, ruleSets] of Object.entries(filesByName)) files[name] = stringify({ ruleSets });\n\n // Tree-shaken tokens file — only the referenced paths — unless `variables: false`.\n if (!plan.inline && plan.variables !== false) {\n const tokens: Record<string, JsonLeaf> = {};\n for (const path of referencedPaths) {\n const ref = tokenMap[path];\n if (ref) tokens[path] = tokenLeaf(path, ref, \"both\");\n }\n if (Object.keys(tokens).length) files[jsonName(plan.variables)] = stringify({ tokens });\n }\n\n return { files };\n }\n\n throw new Error(`json adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["jsonName","name","endsWith","replace","options","refsMode","_a","refs","indent","_b","spec","version","bind","model","ctx","media","resolve","tokenMap","buildTokenMap","stringify","doc","JSON","safeResolve","path","buildLeaf","ref","value","mode","leaf","hasRef","undefined","fn","arg","wrap","external","struct","tokenLeaf","declLeaf","target","mapDecls","decls","out","prop","Object","entries","copyCondition","src","dst","state","breakpoint","query","orientation","container","size","variant","overridesToJson","list","overrides","ov","jo","declarations","push","ruleSetToJson","rs","head","kind","selector","references","length","assembleRuleSet","variants","keys","fromEntries","map","v","keyframeToJson","kf","steps","s","stop","mergedToJson","merged","base","states","entry","responsive","buildTokensBucket","subsystem","prefix","tokens","startsWith","buildRuleSetsBucket","ruleSets","sub","subModel","subsystems","group","rsGroup","buildKeyframesBucket","keyframes","buildContainersBucket","containers","c","type","sizes","buildDoc","breakpoints","hasContent","recipeName","describePreview","stylesheets","unavailable","describeUsage","recipes","ruleSetGroup","format","summary","renderRecipe","_c","renderVariables","join","parts","p","renderAllVariables","renderAllRecipes","renderAll","extend","json","jsonString","emit","plan","file","files","stylesDoc","varsDoc","variables","filename","componentRuleSets","components","leafMode","inline","filesByName","referencedPaths","seen","Set","mergeComponentRuleSet","_d","has","add","Error","defineAdapter"],"mappings":"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"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineAdapter as e,buildTokenMap as t,mergeComponentRuleSet as s}from"@theme-registry/refract";const r=e=>e.endsWith(".json")?e:`${e.replace(/\.[^./]+$/,"")}.json`,n=(n={})=>{var o,i;const a=null!==(o=n.refs)&&void 0!==o?o:"both",c=null!==(i=n.indent)&&void 0!==i?i:2,l={name:"json",version:1,bind(e,n){const{media:o,resolve:i}=n,l=t(e),
|
|
1
|
+
import{defineAdapter as e,buildTokenMap as t,mergeComponentRuleSet as s}from"@theme-registry/refract";const r=e=>e.endsWith(".json")?e:`${e.replace(/\.[^./]+$/,"")}.json`,n=(n={})=>{var o,i;const a=null!==(o=n.refs)&&void 0!==o?o:"both",c=null!==(i=n.indent)&&void 0!==i?i:2,l={name:"json",version:1,bind(e,n){const{media:o,resolve:i}=n,l=t(e),d=e=>JSON.stringify(e,null,c),u=e=>{try{return i(e)}catch{return}},f=(e,t,s)=>{const r={},n=void 0!==e.ref;return"value"!==s&&n&&(r.ref=e.ref,void 0!==e.fn&&(r.fn=e.fn),void 0!==e.arg&&(r.arg=e.arg)),"value"!==s&&void 0!==e.wrap&&(r.wrap=e.wrap),void 0!==e.external&&(r.external=e.external),"path"===s&&n||void 0===t||(r.value=t),void 0!==e.struct&&(r.struct=e.struct),r},v=(e,t,s)=>{var r;return f(t,null!==(r=u(e))&&void 0!==r?r:t.value,s)},b=(e,t)=>{var s;const r=void 0!==e.ref&&null!==(s=u(e.ref))&&void 0!==s?s:e.value,n=f(e,r,t);if(void 0===n.ref&&void 0===n.value&&void 0===n.struct&&void 0!==e.ref){const t=l[e.ref];void 0!==(null==t?void 0:t.struct)&&(n.struct=t.struct)}return n},k=(e,t)=>{const s={};for(const[r,n]of Object.entries(e))s[r]=b(n,t);return s},y=(e,t)=>{void 0!==e.state&&(t.state=e.state),void 0!==e.breakpoint&&(t.breakpoint=e.breakpoint),void 0!==e.query&&(t.query=e.query),void 0!==e.orientation&&(t.orientation=e.orientation),void 0!==e.container&&(t.container=e.container),void 0!==e.size&&(t.size=e.size),void 0!==e.variant&&(t.variant=e.variant),void 0!==e.target&&(t.target=e.target)},p=(e,t)=>{const s=[];for(const r of e){const e={};y(r,e),e.declarations=r.declarations?k(r.declarations,t):{},s.push(e)}return s},m=(e,t)=>{const s=((e,t,s)=>{const r={};return e.kind&&(r.kind=e.kind),void 0!==e.selector&&(r.selector=e.selector),e.references&&e.references.length&&(r.references=e.references),r.declarations=t,r.overrides=s,r})({kind:e.kind,selector:e.selector,references:e.references?[...e.references]:void 0},k(e.declarations,t),p(e.overrides,t));return e.variants&&Object.keys(e.variants).length&&(s.variants=Object.fromEntries(Object.entries(e.variants).map(([e,s])=>[e,{declarations:k(s.declarations,t),overrides:p(s.overrides,t)}]))),s},h=(e,t)=>({steps:e.steps.map(e=>({stop:e.stop,declarations:k(e.declarations,t)}))}),j=(e,t)=>{const s={kind:"recipe",declarations:k(e.base,t),overrides:[]};for(const[r,n]of Object.entries(e.states))s.overrides.push({state:r,declarations:k(n,t)});for(const r of e.responsive){const e={};y(r,e),e.declarations=k(r.declarations,t),s.overrides.push(e)}return s},g=e=>{const t=void 0!==e?`${e}.`:"",s={};for(const[r,n]of Object.entries(l))(void 0===e||r.startsWith(t))&&(s[r]=v(r,n,a));return s},O=t=>{var s;const r={};for(const[n,o]of Object.entries(e.subsystems))if(void 0===t||n===t)for(const[e,t]of Object.entries(null!==(s=o.ruleSets)&&void 0!==s?s:{}))for(const[s,o]of Object.entries(t))r[`${n}.${e}.${s}`]=m(o,a);return r},S=t=>{var s;const r={};for(const[n,o]of Object.entries(e.subsystems))if(void 0===t||n===t)for(const[e,t]of Object.entries(null!==(s=o.keyframes)&&void 0!==s?s:{}))r[`${n}.${e}`]=h(t,a);return r},$=()=>{if(!e.containers||!Object.keys(e.containers).length)return;const t={};for(const[s,r]of Object.entries(e.containers))t[s]={type:r.type,sizes:{...r.sizes}};return t},w=()=>{const t={breakpoints:{...e.breakpoints}},s=$();s&&(t.containers=s);const r=g();Object.keys(r).length&&(t.tokens=r);const n=O();Object.keys(n).length&&(t.ruleSets=n);const o=S();return Object.keys(o).length&&(t.keyframes=o),t},x=e=>Object.keys(e).length>0;return{recipeName:(e,t,s)=>`${e}.${t}.${s}`,describePreview:()=>({stylesheets:[],unavailable:"This target emits a JSON document — data, with no rendered form. Token values below are exact; recipes are listed by the dotted key they carry under `ruleSets`."}),describeUsage(){var t;const s=[];for(const[r,n]of Object.entries(e.subsystems))for(const[e,o]of Object.entries(null!==(t=n.ruleSets)&&void 0!==t?t:{}))for(const t of Object.keys(o))s.push({subsystem:r,group:e,variant:t,name:`${r}.${e}.${t}`});return{format:"json",summary:["This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.",'Load it in any language or tool: `import theme from "./theme.json"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention."],recipes:s}},renderRecipe(t,s,r){var n,o,i;const c=null===(i=null===(o=null===(n=e.subsystems[t])||void 0===n?void 0:n.ruleSets)||void 0===o?void 0:o[s])||void 0===i?void 0:i[r];return c?{ruleSets:{[`${t}.${s}.${r}`]:m(c,a)}}:{}},renderVariables(e){const t=g(e);return Object.keys(t).length?{tokens:t}:{}},join:e=>{const t={};for(const s of e)s.breakpoints&&(t.breakpoints={...t.breakpoints,...s.breakpoints}),s.containers&&(t.containers={...t.containers,...s.containers}),s.tokens&&(t.tokens={...t.tokens,...s.tokens}),s.ruleSets&&(t.ruleSets={...t.ruleSets,...s.ruleSets}),s.keyframes&&(t.keyframes={...t.keyframes,...s.keyframes});return t},renderAllVariables(){const t={breakpoints:{...e.breakpoints}},s=$();s&&(t.containers=s);const r=g();return Object.keys(r).length&&(t.tokens=r),t},renderAllRecipes(){const e={},t=O();Object.keys(t).length&&(e.ruleSets=t);const s=S();return Object.keys(s).length&&(e.keyframes=s),e},renderAll:w,extend:()=>({media:o,get json(){return w()},get jsonString(){return d(w())}}),emit(t){var n,o,i,a;const c=null!==(n=null==t?void 0:t.type)&&void 0!==n?n:"single";if("single"===c){const e="single"===(null==t?void 0:t.type)?t.file:"theme.json";return{files:{[r(e)]:d(w())}}}if("split"===(null==t?void 0:t.type)){const e=w(),s={};e.ruleSets&&(s.ruleSets=e.ruleSets),e.keyframes&&(s.keyframes=e.keyframes);const n={};return e.breakpoints&&(n.breakpoints=e.breakpoints),e.containers&&(n.containers=e.containers),e.tokens&&(n.tokens=e.tokens),{files:{[r(t.file)]:d(s),[r(t.variables)]:d(n)}}}if("subsystem"===(null==t?void 0:t.type)){const s={};for(const n of Object.keys(e.subsystems)){const e=g(n);Object.keys(e).length&&(s[r(t.filename(n,"variables"))]=d({tokens:e}));const o={},i=O(n);Object.keys(i).length&&(o.ruleSets=i);const a=S(n);Object.keys(a).length&&(o.keyframes=a),x(o)&&(s[r(t.filename(n,"styles"))]=d(o))}return{files:s}}if("components"===(null==t?void 0:t.type)){const n=null!==(i=null===(o=e.subsystems.components)||void 0===o?void 0:o.ruleSets)&&void 0!==i?i:{},c=t.inline?"value":"both",u={},f=[],b=new Set;for(const[o,i]of Object.entries(n))for(const n of Object.keys(i)){const i=s(e,o,n),l=r(t.filename({group:o,variant:n}));if((null!==(a=u[l])&&void 0!==a?a:u[l]={})[`components.${o}.${n}`]=j(i,c),!t.inline)for(const e of i.referencedPaths)b.has(e)||(b.add(e),f.push(e))}const k={};for(const[e,t]of Object.entries(u))k[e]=d({ruleSets:t});if(!t.inline&&!1!==t.variables){const e={};for(const t of f){const s=l[t];s&&(e[t]=v(t,s,"both"))}Object.keys(e).length&&(k[r(t.variables)]=d({tokens:e}))}return{files:k}}throw new Error(`json adapter: emit mode '${c}' not yet implemented`)}}}};return e(l)};export{n as createJsonAdapter};
|
|
2
2
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The JSON adapter — lowers the format-neutral {@link ThemeModel} to structured JSON.\n *\n * The second shipping adapter, and the proof that \"one Model, many formats\" is real: where the\n * CSS adapter's output unit is `string`, this adapter's is a {@link JsonDoc} object and `join`\n * is a bucket merge — the same four primitives + `defineAdapter` aggregators, a different `TUnit`.\n *\n * What it adds over the adapter-free `./dtcg` export (which is tokens-only): it lowers the FULL\n * Model — not just tokens, but rule-sets/recipes, states, responsive/container overrides,\n * composition-by-reference, and keyframes — keeping each `ref` as data alongside its resolved\n * value (exactly what CSS collapses into opaque `var(--…)` strings). That is recipes-as-data,\n * and it doubles as the Model + build-time emit path.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all addressing, the doc IR,\n * and value resolution live here.\n */\nimport type { Literal, Ref, RuleSet, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { AdapterSpec, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type {\n JsonAdapterOptions,\n JsonDoc,\n JsonKeyframe,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\nexport type {\n JsonAdapterOptions,\n JsonContainer,\n JsonDoc,\n JsonKeyframe,\n JsonKeyframeStep,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\n/** The JSON adapter's output unit — a document fragment (see {@link JsonDoc}). */\nexport type JsonUnit = JsonDoc;\n\n/** Normalize an emitted filename's extension to `.json` (plan defaults are CSS-centric: `theme.css`,\n * `variables.css`, …). Any existing extension is swapped; a bare name gains `.json`. */\nconst jsonName = (name: string): string =>\n name.endsWith(\".json\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.json`;\n\nexport const createJsonAdapter = (options: JsonAdapterOptions = {}): ThemeAdapter<JsonUnit> => {\n const refsMode: RefsMode = options.refs ?? \"both\";\n const indent = options.indent ?? 2;\n\n const spec: AdapterSpec<JsonUnit> = {\n name: \"json\",\n version: 1,\n // No `allowedStates`: JSON renders any state name as a data key — it owns no selector knowledge\n // (contrast the CSS adapter's CSS_KNOWN_STATES). Core then does no state validation for this adapter.\n bind(model: ThemeModel, ctx: RenderContext) {\n const { media, resolve } = ctx;\n // The flat `path -> Ref` token map (base + variants + extras), shared by the tokens bucket,\n // renderVariables, and the components tree-shake — the same map that backs `theme.tokens`.\n const tokenMap = buildTokenMap(model);\n\n const stringify = (doc: JsonDoc): string => JSON.stringify(doc, null, indent);\n\n /** Resolve a token path to its literal, swallowing a resolver throw (defensive — a well-formed\n * Model resolves everything; falls back to the Ref's cached `value`). */\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /** Build a leaf from a `Ref` + its already-resolved literal, honoring the ref mode. */\n const buildLeaf = (ref: Ref, value: Literal | undefined, mode: RefsMode): JsonLeaf => {\n const leaf: JsonLeaf = {};\n const hasRef = ref.ref !== undefined;\n if (mode !== \"value\" && hasRef) {\n leaf.ref = ref.ref;\n if (ref.fn !== undefined) leaf.fn = ref.fn;\n if (ref.arg !== undefined) leaf.arg = ref.arg;\n }\n if (mode !== \"value\" && ref.wrap !== undefined) leaf.wrap = ref.wrap;\n if (ref.external !== undefined) leaf.external = ref.external; // §W6b — parent-var passthrough\n // `value` in both/value modes; in path mode only for a literal (no ref to stand in for it).\n if ((mode !== \"path\" || !hasRef) && value !== undefined) leaf.value = value;\n // §15: a structured (shadow/transition) value carries as data — the format-neutral shape a\n // future RN adapter lowers; its per-layer `color` stays a `colors.*` ref for the consumer.\n if (ref.struct !== undefined) leaf.struct = ref.struct;\n return leaf;\n };\n\n /** A token leaf — resolved by the token's OWN address (its `Ref.ref`, if any, is a derivation source). */\n const tokenLeaf = (path: string, ref: Ref, mode: RefsMode): JsonLeaf =>\n buildLeaf(ref, safeResolve(path) ?? ref.value, mode);\n\n /** A declaration leaf — resolved by the path its `Ref.ref` points at (literal ⇒ its `value`).\n * §15: when the ref points at a STRUCTURED (shadow/transition) token — which has no single\n * literal to bake — the leaf carries that token's `struct` (its per-layer `color` stays a\n * `colors.*` ref for the consumer), so an inline declaration isn't left value-less. */\n const declLeaf = (ref: Ref, mode: RefsMode): JsonLeaf => {\n const value = ref.ref !== undefined ? safeResolve(ref.ref) ?? ref.value : ref.value;\n const leaf = buildLeaf(ref, value, mode);\n // Only when the `ref` was baked away (inline `value` mode) and no literal resulted — otherwise\n // the retained `ref` already leads the consumer to the token that carries the struct.\n if (leaf.ref === undefined && leaf.value === undefined && leaf.struct === undefined && ref.ref !== undefined) {\n const target = tokenMap[ref.ref];\n if (target?.struct !== undefined) leaf.struct = target.struct;\n }\n return leaf;\n };\n\n const mapDecls = (decls: Record<string, Ref>, mode: RefsMode): Record<string, JsonLeaf> => {\n const out: Record<string, JsonLeaf> = {};\n for (const [prop, ref] of Object.entries(decls)) out[prop] = declLeaf(ref, mode);\n return out;\n };\n\n /** Copy the present condition axes off a Model override/entry onto a JSON override. */\n const copyCondition = (\n src: {\n state?: string;\n breakpoint?: string;\n query?: JsonOverride[\"query\"];\n orientation?: JsonOverride[\"orientation\"];\n container?: string;\n size?: string;\n variant?: string;\n target?: string;\n },\n dst: JsonOverride,\n ): void => {\n if (src.state !== undefined) dst.state = src.state;\n if (src.breakpoint !== undefined) dst.breakpoint = src.breakpoint;\n if (src.query !== undefined) dst.query = src.query;\n if (src.orientation !== undefined) dst.orientation = src.orientation;\n if (src.container !== undefined) dst.container = src.container;\n if (src.size !== undefined) dst.size = src.size;\n if (src.variant !== undefined) dst.variant = src.variant;\n if (src.target !== undefined) dst.target = src.target;\n };\n\n // Assemble a rule-set with a readable key order: kind / selector / references first, then\n // declarations / overrides (independent of the Model's property insertion order).\n const assembleRuleSet = (\n head: Pick<JsonRuleSet, \"kind\" | \"selector\" | \"references\">,\n declarations: Record<string, JsonLeaf>,\n overrides: JsonOverride[],\n ): JsonRuleSet => {\n const out = {} as JsonRuleSet;\n if (head.kind) out.kind = head.kind;\n if (head.selector !== undefined) out.selector = head.selector;\n if (head.references && head.references.length) out.references = head.references;\n out.declarations = declarations;\n out.overrides = overrides;\n return out;\n };\n\n const overridesToJson = (list: RuleSet[\"overrides\"], mode: RefsMode): JsonOverride[] => {\n const overrides: JsonOverride[] = [];\n for (const ov of list) {\n const jo = {} as JsonOverride; // condition axes first, then declarations (readability)\n copyCondition(ov, jo);\n jo.declarations = ov.declarations ? mapDecls(ov.declarations, mode) : {};\n overrides.push(jo);\n }\n return overrides;\n };\n\n const ruleSetToJson = (rs: RuleSet, mode: RefsMode): JsonRuleSet => {\n const out = assembleRuleSet(\n { kind: rs.kind, selector: rs.selector, references: rs.references ? [...rs.references] : undefined },\n mapDecls(rs.declarations, mode),\n overridesToJson(rs.overrides, mode),\n );\n // §9: globals element variants (delta-only modifiers) survive as data.\n if (rs.variants && Object.keys(rs.variants).length) {\n out.variants = Object.fromEntries(\n Object.entries(rs.variants).map(([name, v]) => [\n name,\n { declarations: mapDecls(v.declarations, mode), overrides: overridesToJson(v.overrides, mode) },\n ]),\n );\n }\n return out;\n };\n\n const keyframeToJson = (kf: { steps: { stop: string; declarations: Record<string, Ref> }[] }, mode: RefsMode): JsonKeyframe => ({\n steps: kf.steps.map(s => ({ stop: s.stop, declarations: mapDecls(s.declarations, mode) })),\n });\n\n /** A merged component variant (`mergeComponentRuleSet`) → one self-contained JSON rule-set. */\n const mergedToJson = (merged: MergedRuleSet, mode: RefsMode): JsonRuleSet => {\n const out: JsonRuleSet = { kind: \"recipe\", declarations: mapDecls(merged.base, mode), overrides: [] };\n for (const [state, decls] of Object.entries(merged.states)) {\n out.overrides.push({ state, declarations: mapDecls(decls, mode) });\n }\n for (const entry of merged.responsive) {\n const jo = {} as JsonOverride;\n copyCondition(entry, jo);\n jo.declarations = mapDecls(entry.declarations, mode);\n out.overrides.push(jo);\n }\n return out;\n };\n\n // ── Bucket builders (each a flat address-keyed map; every full-doc consumer composes these) ──\n const buildTokensBucket = (subsystem?: string): Record<string, JsonLeaf> => {\n const prefix = subsystem !== undefined ? `${subsystem}.` : \"\";\n const tokens: Record<string, JsonLeaf> = {};\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (subsystem !== undefined && !path.startsWith(prefix)) continue;\n tokens[path] = tokenLeaf(path, ref, refsMode);\n }\n return tokens;\n };\n\n const buildRuleSetsBucket = (subsystem?: string): Record<string, JsonRuleSet> => {\n const ruleSets: Record<string, JsonRuleSet> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [group, rsGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const [variant, rs] of Object.entries(rsGroup)) {\n ruleSets[`${sub}.${group}.${variant}`] = ruleSetToJson(rs, refsMode);\n }\n }\n }\n return ruleSets;\n };\n\n const buildKeyframesBucket = (subsystem?: string): Record<string, JsonKeyframe> => {\n const keyframes: Record<string, JsonKeyframe> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [name, kf] of Object.entries(subModel.keyframes ?? {})) {\n keyframes[`${sub}.${name}`] = keyframeToJson(kf, refsMode);\n }\n }\n return keyframes;\n };\n\n const buildContainersBucket = (): JsonDoc[\"containers\"] => {\n if (!model.containers || !Object.keys(model.containers).length) return undefined;\n const out: NonNullable<JsonDoc[\"containers\"]> = {};\n for (const [name, c] of Object.entries(model.containers)) out[name] = { type: c.type, sizes: { ...c.sizes } };\n return out;\n };\n\n /** The whole theme as one document — the JSON analogue of the CSS adapter's `collectNodes()`. */\n const buildDoc = (): JsonDoc => {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n };\n\n const hasContent = (doc: JsonDoc): boolean => Object.keys(doc).length > 0;\n\n const join = (parts: JsonDoc[]): JsonDoc => {\n const out: JsonDoc = {};\n for (const p of parts) {\n if (p.breakpoints) out.breakpoints = { ...out.breakpoints, ...p.breakpoints };\n if (p.containers) out.containers = { ...out.containers, ...p.containers };\n if (p.tokens) out.tokens = { ...out.tokens, ...p.tokens };\n if (p.ruleSets) out.ruleSets = { ...out.ruleSets, ...p.ruleSets };\n if (p.keyframes) out.keyframes = { ...out.keyframes, ...p.keyframes };\n }\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n return `${subsystem}.${group}.${variant}`;\n },\n\n // Self-documentation: every recipe's dotted key under `ruleSets`, plus framework-neutral\n // \"read the data\" prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n recipes.push({ subsystem, group, variant, name: `${subsystem}.${group}.${variant}` });\n }\n }\n }\n return {\n format: \"json\",\n summary: [\n \"This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.\",\n 'Load it in any language or tool: `import theme from \"./theme.json\"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',\n \"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention.\",\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n const rs = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!rs) return {};\n return { ruleSets: { [`${subsystem}.${group}.${variant}`]: ruleSetToJson(rs, refsMode) } };\n },\n renderVariables(subsystem) {\n const tokens = buildTokensBucket(subsystem);\n return Object.keys(tokens).length ? { tokens } : {};\n },\n join,\n\n // Aggregators overridden (like the CSS adapter): the full doc is not a flat concat of the\n // primitives — the theme-global breakpoints/containers + keyframes land here.\n renderAllVariables(): JsonDoc {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n return doc;\n },\n renderAllRecipes(): JsonDoc {\n const doc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n },\n renderAll: buildDoc,\n\n // Runtime surface: the doc object + its pretty string, plus the plain media descriptor\n // pass-through (mirrors how the CSS adapter surfaces `theme.css` + `theme.media`).\n extend() {\n return {\n media,\n get json(): JsonDoc {\n return buildDoc();\n },\n get jsonString(): string {\n return stringify(buildDoc());\n },\n };\n },\n\n // Build-time emit — the §9 output-shape vocabulary mapped onto the doc's buckets. Plan filenames\n // are normalized to a `.json` extension (the shared plan defaults name `.css` files).\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.json\";\n return { files: { [jsonName(file)]: stringify(buildDoc()) } };\n }\n\n if (plan?.type === \"split\") {\n // Two docs under a load-order-free contract: rule-sets/keyframes vs tokens/config.\n const doc = buildDoc();\n const stylesDoc: JsonDoc = {};\n if (doc.ruleSets) stylesDoc.ruleSets = doc.ruleSets;\n if (doc.keyframes) stylesDoc.keyframes = doc.keyframes;\n const varsDoc: JsonDoc = {};\n if (doc.breakpoints) varsDoc.breakpoints = doc.breakpoints;\n if (doc.containers) varsDoc.containers = doc.containers;\n if (doc.tokens) varsDoc.tokens = doc.tokens;\n return {\n files: { [jsonName(plan.file)]: stringify(stylesDoc), [jsonName(plan.variables)]: stringify(varsDoc) },\n };\n }\n\n if (plan?.type === \"subsystem\") {\n // One pair of docs per subsystem — its tokens (variables side) + its rule-sets/keyframes\n // (styles side). Global breakpoints/containers are theme-level, not per-subsystem, so they\n // don't appear here (like CSS `@media` breakpoints, they only surface inside overrides).\n // Skip empties — the components subsystem owns no tokens → styles file only.\n const files: Record<string, string> = {};\n for (const sub of Object.keys(model.subsystems)) {\n const tokens = buildTokensBucket(sub);\n if (Object.keys(tokens).length) files[jsonName(plan.filename(sub, \"variables\"))] = stringify({ tokens });\n\n const stylesDoc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket(sub);\n if (Object.keys(ruleSets).length) stylesDoc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket(sub);\n if (Object.keys(keyframes).length) stylesDoc.keyframes = keyframes;\n if (hasContent(stylesDoc)) files[jsonName(plan.filename(sub, \"styles\"))] = stringify(stylesDoc);\n }\n return { files };\n }\n\n if (plan?.type === \"components\") {\n // The flattened/merged export: each component variant → one self-contained rule-set\n // (`mergeComponentRuleSet`). `inline` (default true) resolves values and drops refs;\n // `inline: false` keeps refs + a tree-shaken tokens file of only the referenced paths.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const leafMode: RefsMode = plan.inline ? \"value\" : \"both\";\n\n const filesByName: Record<string, Record<string, JsonRuleSet>> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const filename = jsonName(plan.filename({ group, variant }));\n (filesByName[filename] ??= {})[`components.${group}.${variant}`] = mergedToJson(merged, leafMode);\n\n if (!plan.inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n for (const [name, ruleSets] of Object.entries(filesByName)) files[name] = stringify({ ruleSets });\n\n // Tree-shaken tokens file — only the referenced paths — unless `variables: false`.\n if (!plan.inline && plan.variables !== false) {\n const tokens: Record<string, JsonLeaf> = {};\n for (const path of referencedPaths) {\n const ref = tokenMap[path];\n if (ref) tokens[path] = tokenLeaf(path, ref, \"both\");\n }\n if (Object.keys(tokens).length) files[jsonName(plan.variables)] = stringify({ tokens });\n }\n\n return { files };\n }\n\n throw new Error(`json adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["jsonName","name","endsWith","replace","createJsonAdapter","options","refsMode","_a","refs","indent","_b","spec","version","bind","model","ctx","media","resolve","tokenMap","buildTokenMap","stringify","doc","JSON","safeResolve","path","buildLeaf","ref","value","mode","leaf","hasRef","undefined","fn","arg","wrap","external","struct","tokenLeaf","declLeaf","target","mapDecls","decls","out","prop","Object","entries","copyCondition","src","dst","state","breakpoint","query","orientation","container","size","variant","overridesToJson","list","overrides","ov","jo","declarations","push","ruleSetToJson","rs","head","kind","selector","references","length","assembleRuleSet","variants","keys","fromEntries","map","v","keyframeToJson","kf","steps","s","stop","mergedToJson","merged","base","states","entry","responsive","buildTokensBucket","subsystem","prefix","tokens","startsWith","buildRuleSetsBucket","ruleSets","sub","subModel","subsystems","group","rsGroup","buildKeyframesBucket","keyframes","buildContainersBucket","containers","c","type","sizes","buildDoc","breakpoints","hasContent","recipeName","describeUsage","recipes","ruleSetGroup","format","summary","renderRecipe","_c","renderVariables","join","parts","p","renderAllVariables","renderAllRecipes","renderAll","extend","json","jsonString","emit","plan","file","files","stylesDoc","varsDoc","variables","filename","componentRuleSets","components","leafMode","inline","filesByName","referencedPaths","seen","Set","mergeComponentRuleSet","_d","has","add","Error","defineAdapter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The JSON adapter — lowers the format-neutral {@link ThemeModel} to structured JSON.\n *\n * The second shipping adapter, and the proof that \"one Model, many formats\" is real: where the\n * CSS adapter's output unit is `string`, this adapter's is a {@link JsonDoc} object and `join`\n * is a bucket merge — the same four primitives + `defineAdapter` aggregators, a different `TUnit`.\n *\n * What it adds over the adapter-free `./dtcg` export (which is tokens-only): it lowers the FULL\n * Model — not just tokens, but rule-sets/recipes, states, responsive/container overrides,\n * composition-by-reference, and keyframes — keeping each `ref` as data alongside its resolved\n * value (exactly what CSS collapses into opaque `var(--…)` strings). That is recipes-as-data,\n * and it doubles as the Model + build-time emit path.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all addressing, the doc IR,\n * and value resolution live here.\n */\nimport type { Literal, Ref, RuleSet, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { AdapterSpec, PreviewDescriptor, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type {\n JsonAdapterOptions,\n JsonDoc,\n JsonKeyframe,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\nexport type {\n JsonAdapterOptions,\n JsonContainer,\n JsonDoc,\n JsonKeyframe,\n JsonKeyframeStep,\n JsonLeaf,\n JsonOverride,\n JsonRuleSet,\n RefsMode,\n} from \"./types\";\n\n/** The JSON adapter's output unit — a document fragment (see {@link JsonDoc}). */\nexport type JsonUnit = JsonDoc;\n\n/** Normalize an emitted filename's extension to `.json` (plan defaults are CSS-centric: `theme.css`,\n * `variables.css`, …). Any existing extension is swapped; a bare name gains `.json`. */\nconst jsonName = (name: string): string =>\n name.endsWith(\".json\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.json`;\n\nexport const createJsonAdapter = (options: JsonAdapterOptions = {}): ThemeAdapter<JsonUnit> => {\n const refsMode: RefsMode = options.refs ?? \"both\";\n const indent = options.indent ?? 2;\n\n const spec: AdapterSpec<JsonUnit> = {\n name: \"json\",\n version: 1,\n // No `allowedStates`: JSON renders any state name as a data key — it owns no selector knowledge\n // (contrast the CSS adapter's CSS_KNOWN_STATES). Core then does no state validation for this adapter.\n bind(model: ThemeModel, ctx: RenderContext) {\n const { media, resolve } = ctx;\n // The flat `path -> Ref` token map (base + variants + extras), shared by the tokens bucket,\n // renderVariables, and the components tree-shake — the same map that backs `theme.tokens`.\n const tokenMap = buildTokenMap(model);\n\n const stringify = (doc: JsonDoc): string => JSON.stringify(doc, null, indent);\n\n /** Resolve a token path to its literal, swallowing a resolver throw (defensive — a well-formed\n * Model resolves everything; falls back to the Ref's cached `value`). */\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /** Build a leaf from a `Ref` + its already-resolved literal, honoring the ref mode. */\n const buildLeaf = (ref: Ref, value: Literal | undefined, mode: RefsMode): JsonLeaf => {\n const leaf: JsonLeaf = {};\n const hasRef = ref.ref !== undefined;\n if (mode !== \"value\" && hasRef) {\n leaf.ref = ref.ref;\n if (ref.fn !== undefined) leaf.fn = ref.fn;\n if (ref.arg !== undefined) leaf.arg = ref.arg;\n }\n if (mode !== \"value\" && ref.wrap !== undefined) leaf.wrap = ref.wrap;\n if (ref.external !== undefined) leaf.external = ref.external; // §W6b — parent-var passthrough\n // `value` in both/value modes; in path mode only for a literal (no ref to stand in for it).\n if ((mode !== \"path\" || !hasRef) && value !== undefined) leaf.value = value;\n // §15: a structured (shadow/transition) value carries as data — the format-neutral shape a\n // future RN adapter lowers; its per-layer `color` stays a `colors.*` ref for the consumer.\n if (ref.struct !== undefined) leaf.struct = ref.struct;\n return leaf;\n };\n\n /** A token leaf — resolved by the token's OWN address (its `Ref.ref`, if any, is a derivation source). */\n const tokenLeaf = (path: string, ref: Ref, mode: RefsMode): JsonLeaf =>\n buildLeaf(ref, safeResolve(path) ?? ref.value, mode);\n\n /** A declaration leaf — resolved by the path its `Ref.ref` points at (literal ⇒ its `value`).\n * §15: when the ref points at a STRUCTURED (shadow/transition) token — which has no single\n * literal to bake — the leaf carries that token's `struct` (its per-layer `color` stays a\n * `colors.*` ref for the consumer), so an inline declaration isn't left value-less. */\n const declLeaf = (ref: Ref, mode: RefsMode): JsonLeaf => {\n const value = ref.ref !== undefined ? safeResolve(ref.ref) ?? ref.value : ref.value;\n const leaf = buildLeaf(ref, value, mode);\n // Only when the `ref` was baked away (inline `value` mode) and no literal resulted — otherwise\n // the retained `ref` already leads the consumer to the token that carries the struct.\n if (leaf.ref === undefined && leaf.value === undefined && leaf.struct === undefined && ref.ref !== undefined) {\n const target = tokenMap[ref.ref];\n if (target?.struct !== undefined) leaf.struct = target.struct;\n }\n return leaf;\n };\n\n const mapDecls = (decls: Record<string, Ref>, mode: RefsMode): Record<string, JsonLeaf> => {\n const out: Record<string, JsonLeaf> = {};\n for (const [prop, ref] of Object.entries(decls)) out[prop] = declLeaf(ref, mode);\n return out;\n };\n\n /** Copy the present condition axes off a Model override/entry onto a JSON override. */\n const copyCondition = (\n src: {\n state?: string;\n breakpoint?: string;\n query?: JsonOverride[\"query\"];\n orientation?: JsonOverride[\"orientation\"];\n container?: string;\n size?: string;\n variant?: string;\n target?: string;\n },\n dst: JsonOverride,\n ): void => {\n if (src.state !== undefined) dst.state = src.state;\n if (src.breakpoint !== undefined) dst.breakpoint = src.breakpoint;\n if (src.query !== undefined) dst.query = src.query;\n if (src.orientation !== undefined) dst.orientation = src.orientation;\n if (src.container !== undefined) dst.container = src.container;\n if (src.size !== undefined) dst.size = src.size;\n if (src.variant !== undefined) dst.variant = src.variant;\n if (src.target !== undefined) dst.target = src.target;\n };\n\n // Assemble a rule-set with a readable key order: kind / selector / references first, then\n // declarations / overrides (independent of the Model's property insertion order).\n const assembleRuleSet = (\n head: Pick<JsonRuleSet, \"kind\" | \"selector\" | \"references\">,\n declarations: Record<string, JsonLeaf>,\n overrides: JsonOverride[],\n ): JsonRuleSet => {\n const out = {} as JsonRuleSet;\n if (head.kind) out.kind = head.kind;\n if (head.selector !== undefined) out.selector = head.selector;\n if (head.references && head.references.length) out.references = head.references;\n out.declarations = declarations;\n out.overrides = overrides;\n return out;\n };\n\n const overridesToJson = (list: RuleSet[\"overrides\"], mode: RefsMode): JsonOverride[] => {\n const overrides: JsonOverride[] = [];\n for (const ov of list) {\n const jo = {} as JsonOverride; // condition axes first, then declarations (readability)\n copyCondition(ov, jo);\n jo.declarations = ov.declarations ? mapDecls(ov.declarations, mode) : {};\n overrides.push(jo);\n }\n return overrides;\n };\n\n const ruleSetToJson = (rs: RuleSet, mode: RefsMode): JsonRuleSet => {\n const out = assembleRuleSet(\n { kind: rs.kind, selector: rs.selector, references: rs.references ? [...rs.references] : undefined },\n mapDecls(rs.declarations, mode),\n overridesToJson(rs.overrides, mode),\n );\n // §9: globals element variants (delta-only modifiers) survive as data.\n if (rs.variants && Object.keys(rs.variants).length) {\n out.variants = Object.fromEntries(\n Object.entries(rs.variants).map(([name, v]) => [\n name,\n { declarations: mapDecls(v.declarations, mode), overrides: overridesToJson(v.overrides, mode) },\n ]),\n );\n }\n return out;\n };\n\n const keyframeToJson = (kf: { steps: { stop: string; declarations: Record<string, Ref> }[] }, mode: RefsMode): JsonKeyframe => ({\n steps: kf.steps.map(s => ({ stop: s.stop, declarations: mapDecls(s.declarations, mode) })),\n });\n\n /** A merged component variant (`mergeComponentRuleSet`) → one self-contained JSON rule-set. */\n const mergedToJson = (merged: MergedRuleSet, mode: RefsMode): JsonRuleSet => {\n const out: JsonRuleSet = { kind: \"recipe\", declarations: mapDecls(merged.base, mode), overrides: [] };\n for (const [state, decls] of Object.entries(merged.states)) {\n out.overrides.push({ state, declarations: mapDecls(decls, mode) });\n }\n for (const entry of merged.responsive) {\n const jo = {} as JsonOverride;\n copyCondition(entry, jo);\n jo.declarations = mapDecls(entry.declarations, mode);\n out.overrides.push(jo);\n }\n return out;\n };\n\n // ── Bucket builders (each a flat address-keyed map; every full-doc consumer composes these) ──\n const buildTokensBucket = (subsystem?: string): Record<string, JsonLeaf> => {\n const prefix = subsystem !== undefined ? `${subsystem}.` : \"\";\n const tokens: Record<string, JsonLeaf> = {};\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (subsystem !== undefined && !path.startsWith(prefix)) continue;\n tokens[path] = tokenLeaf(path, ref, refsMode);\n }\n return tokens;\n };\n\n const buildRuleSetsBucket = (subsystem?: string): Record<string, JsonRuleSet> => {\n const ruleSets: Record<string, JsonRuleSet> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [group, rsGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const [variant, rs] of Object.entries(rsGroup)) {\n ruleSets[`${sub}.${group}.${variant}`] = ruleSetToJson(rs, refsMode);\n }\n }\n }\n return ruleSets;\n };\n\n const buildKeyframesBucket = (subsystem?: string): Record<string, JsonKeyframe> => {\n const keyframes: Record<string, JsonKeyframe> = {};\n for (const [sub, subModel] of Object.entries(model.subsystems)) {\n if (subsystem !== undefined && sub !== subsystem) continue;\n for (const [name, kf] of Object.entries(subModel.keyframes ?? {})) {\n keyframes[`${sub}.${name}`] = keyframeToJson(kf, refsMode);\n }\n }\n return keyframes;\n };\n\n const buildContainersBucket = (): JsonDoc[\"containers\"] => {\n if (!model.containers || !Object.keys(model.containers).length) return undefined;\n const out: NonNullable<JsonDoc[\"containers\"]> = {};\n for (const [name, c] of Object.entries(model.containers)) out[name] = { type: c.type, sizes: { ...c.sizes } };\n return out;\n };\n\n /** The whole theme as one document — the JSON analogue of the CSS adapter's `collectNodes()`. */\n const buildDoc = (): JsonDoc => {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n };\n\n const hasContent = (doc: JsonDoc): boolean => Object.keys(doc).length > 0;\n\n const join = (parts: JsonDoc[]): JsonDoc => {\n const out: JsonDoc = {};\n for (const p of parts) {\n if (p.breakpoints) out.breakpoints = { ...out.breakpoints, ...p.breakpoints };\n if (p.containers) out.containers = { ...out.containers, ...p.containers };\n if (p.tokens) out.tokens = { ...out.tokens, ...p.tokens };\n if (p.ruleSets) out.ruleSets = { ...out.ruleSets, ...p.ruleSets };\n if (p.keyframes) out.keyframes = { ...out.keyframes, ...p.keyframes };\n }\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n return `${subsystem}.${group}.${variant}`;\n },\n\n // Preview (§20): JSON is data, not a rendered form — there is nothing for a browser to load.\n // The token plates are the whole point of the page for this target.\n describePreview(): PreviewDescriptor {\n return {\n stylesheets: [],\n unavailable:\n \"This target emits a JSON document — data, with no rendered form. Token values below \" +\n \"are exact; recipes are listed by the dotted key they carry under `ruleSets`.\",\n };\n },\n\n // Self-documentation: every recipe's dotted key under `ruleSets`, plus framework-neutral\n // \"read the data\" prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n recipes.push({ subsystem, group, variant, name: `${subsystem}.${group}.${variant}` });\n }\n }\n }\n return {\n format: \"json\",\n summary: [\n \"This theme is emitted as a JSON document: a `tokens` bucket (the theme's values) plus a `ruleSets` map (the recipes), each keyed by `subsystem.group.variant`.\",\n 'Load it in any language or tool: `import theme from \"./theme.json\"` (or `require`). It carries no framework binding — read the token values and recipe declarations directly.',\n \"Each recipe below is addressed by its dotted key under `ruleSets`; token paths follow the same `subsystem.group.variant` convention.\",\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n const rs = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!rs) return {};\n return { ruleSets: { [`${subsystem}.${group}.${variant}`]: ruleSetToJson(rs, refsMode) } };\n },\n renderVariables(subsystem) {\n const tokens = buildTokensBucket(subsystem);\n return Object.keys(tokens).length ? { tokens } : {};\n },\n join,\n\n // Aggregators overridden (like the CSS adapter): the full doc is not a flat concat of the\n // primitives — the theme-global breakpoints/containers + keyframes land here.\n renderAllVariables(): JsonDoc {\n const doc: JsonDoc = { breakpoints: { ...model.breakpoints } };\n const containers = buildContainersBucket();\n if (containers) doc.containers = containers;\n const tokens = buildTokensBucket();\n if (Object.keys(tokens).length) doc.tokens = tokens;\n return doc;\n },\n renderAllRecipes(): JsonDoc {\n const doc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket();\n if (Object.keys(ruleSets).length) doc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket();\n if (Object.keys(keyframes).length) doc.keyframes = keyframes;\n return doc;\n },\n renderAll: buildDoc,\n\n // Runtime surface: the doc object + its pretty string, plus the plain media descriptor\n // pass-through (mirrors how the CSS adapter surfaces `theme.css` + `theme.media`).\n extend() {\n return {\n media,\n get json(): JsonDoc {\n return buildDoc();\n },\n get jsonString(): string {\n return stringify(buildDoc());\n },\n };\n },\n\n // Build-time emit — the §9 output-shape vocabulary mapped onto the doc's buckets. Plan filenames\n // are normalized to a `.json` extension (the shared plan defaults name `.css` files).\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.json\";\n return { files: { [jsonName(file)]: stringify(buildDoc()) } };\n }\n\n if (plan?.type === \"split\") {\n // Two docs under a load-order-free contract: rule-sets/keyframes vs tokens/config.\n const doc = buildDoc();\n const stylesDoc: JsonDoc = {};\n if (doc.ruleSets) stylesDoc.ruleSets = doc.ruleSets;\n if (doc.keyframes) stylesDoc.keyframes = doc.keyframes;\n const varsDoc: JsonDoc = {};\n if (doc.breakpoints) varsDoc.breakpoints = doc.breakpoints;\n if (doc.containers) varsDoc.containers = doc.containers;\n if (doc.tokens) varsDoc.tokens = doc.tokens;\n return {\n files: { [jsonName(plan.file)]: stringify(stylesDoc), [jsonName(plan.variables)]: stringify(varsDoc) },\n };\n }\n\n if (plan?.type === \"subsystem\") {\n // One pair of docs per subsystem — its tokens (variables side) + its rule-sets/keyframes\n // (styles side). Global breakpoints/containers are theme-level, not per-subsystem, so they\n // don't appear here (like CSS `@media` breakpoints, they only surface inside overrides).\n // Skip empties — the components subsystem owns no tokens → styles file only.\n const files: Record<string, string> = {};\n for (const sub of Object.keys(model.subsystems)) {\n const tokens = buildTokensBucket(sub);\n if (Object.keys(tokens).length) files[jsonName(plan.filename(sub, \"variables\"))] = stringify({ tokens });\n\n const stylesDoc: JsonDoc = {};\n const ruleSets = buildRuleSetsBucket(sub);\n if (Object.keys(ruleSets).length) stylesDoc.ruleSets = ruleSets;\n const keyframes = buildKeyframesBucket(sub);\n if (Object.keys(keyframes).length) stylesDoc.keyframes = keyframes;\n if (hasContent(stylesDoc)) files[jsonName(plan.filename(sub, \"styles\"))] = stringify(stylesDoc);\n }\n return { files };\n }\n\n if (plan?.type === \"components\") {\n // The flattened/merged export: each component variant → one self-contained rule-set\n // (`mergeComponentRuleSet`). `inline` (default true) resolves values and drops refs;\n // `inline: false` keeps refs + a tree-shaken tokens file of only the referenced paths.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const leafMode: RefsMode = plan.inline ? \"value\" : \"both\";\n\n const filesByName: Record<string, Record<string, JsonRuleSet>> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const filename = jsonName(plan.filename({ group, variant }));\n (filesByName[filename] ??= {})[`components.${group}.${variant}`] = mergedToJson(merged, leafMode);\n\n if (!plan.inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n for (const [name, ruleSets] of Object.entries(filesByName)) files[name] = stringify({ ruleSets });\n\n // Tree-shaken tokens file — only the referenced paths — unless `variables: false`.\n if (!plan.inline && plan.variables !== false) {\n const tokens: Record<string, JsonLeaf> = {};\n for (const path of referencedPaths) {\n const ref = tokenMap[path];\n if (ref) tokens[path] = tokenLeaf(path, ref, \"both\");\n }\n if (Object.keys(tokens).length) files[jsonName(plan.variables)] = stringify({ tokens });\n }\n\n return { files };\n }\n\n throw new Error(`json adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["jsonName","name","endsWith","replace","createJsonAdapter","options","refsMode","_a","refs","indent","_b","spec","version","bind","model","ctx","media","resolve","tokenMap","buildTokenMap","stringify","doc","JSON","safeResolve","path","buildLeaf","ref","value","mode","leaf","hasRef","undefined","fn","arg","wrap","external","struct","tokenLeaf","declLeaf","target","mapDecls","decls","out","prop","Object","entries","copyCondition","src","dst","state","breakpoint","query","orientation","container","size","variant","overridesToJson","list","overrides","ov","jo","declarations","push","ruleSetToJson","rs","head","kind","selector","references","length","assembleRuleSet","variants","keys","fromEntries","map","v","keyframeToJson","kf","steps","s","stop","mergedToJson","merged","base","states","entry","responsive","buildTokensBucket","subsystem","prefix","tokens","startsWith","buildRuleSetsBucket","ruleSets","sub","subModel","subsystems","group","rsGroup","buildKeyframesBucket","keyframes","buildContainersBucket","containers","c","type","sizes","buildDoc","breakpoints","hasContent","recipeName","describePreview","stylesheets","unavailable","describeUsage","recipes","ruleSetGroup","format","summary","renderRecipe","_c","renderVariables","join","parts","p","renderAllVariables","renderAllRecipes","renderAll","extend","json","jsonString","emit","plan","file","files","stylesDoc","varsDoc","variables","filename","componentRuleSets","components","leafMode","inline","filesByName","referencedPaths","seen","Set","mergeComponentRuleSet","_d","has","add","Error","defineAdapter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theme-registry/refract-json",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "The JSON output adapter for @theme-registry/refract — lowers a ThemeModel to a structured JSON document.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Petyo Stoyanov",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"./package.json": "./package.json"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@theme-registry/refract": "^0.1.
|
|
35
|
+
"@theme-registry/refract": "^0.1.8"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@rollup/plugin-terser": "^0.4.4",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
43
43
|
"typescript": "^5.4.2",
|
|
44
44
|
"vitest": "^4.1.10",
|
|
45
|
-
"@theme-registry/refract": "^0.1.
|
|
45
|
+
"@theme-registry/refract": "^0.1.8",
|
|
46
46
|
"@theme-registry/theme-fixtures": "^0.0.0"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|