@sudajs/theme-engine 0.0.2
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/ai/slots.d.ts +33 -0
- package/dist/ai/slots.d.ts.map +1 -0
- package/dist/ai/slots.js +139 -0
- package/dist/ai/slots.js.map +1 -0
- package/dist/assets.d.ts +42 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +36 -0
- package/dist/assets.js.map +1 -0
- package/dist/cms/apply-bindings.d.ts +9 -0
- package/dist/cms/apply-bindings.d.ts.map +1 -0
- package/dist/cms/apply-bindings.js +128 -0
- package/dist/cms/apply-bindings.js.map +1 -0
- package/dist/cms/get-context.d.ts +9 -0
- package/dist/cms/get-context.d.ts.map +1 -0
- package/dist/cms/get-context.js +13 -0
- package/dist/cms/get-context.js.map +1 -0
- package/dist/cms/index.d.ts +4 -0
- package/dist/cms/index.d.ts.map +1 -0
- package/dist/cms/index.js +4 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/cms/types.d.ts +116 -0
- package/dist/cms/types.d.ts.map +1 -0
- package/dist/cms/types.js +2 -0
- package/dist/cms/types.js.map +1 -0
- package/dist/components/base-blocks.d.ts +13 -0
- package/dist/components/base-blocks.d.ts.map +1 -0
- package/dist/components/base-blocks.js +157 -0
- package/dist/components/base-blocks.js.map +1 -0
- package/dist/components/containers.d.ts +8 -0
- package/dist/components/containers.d.ts.map +1 -0
- package/dist/components/containers.js +142 -0
- package/dist/components/containers.js.map +1 -0
- package/dist/components/index.d.ts +11 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/interactive.client.d.ts +12 -0
- package/dist/components/interactive.client.d.ts.map +1 -0
- package/dist/components/interactive.client.js +43 -0
- package/dist/components/interactive.client.js.map +1 -0
- package/dist/components/metadata.d.ts +20 -0
- package/dist/components/metadata.d.ts.map +1 -0
- package/dist/components/metadata.js +9 -0
- package/dist/components/metadata.js.map +1 -0
- package/dist/components/shared-fields.d.ts +11 -0
- package/dist/components/shared-fields.d.ts.map +1 -0
- package/dist/components/shared-fields.js +37 -0
- package/dist/components/shared-fields.js.map +1 -0
- package/dist/editor/context.d.ts +79 -0
- package/dist/editor/context.d.ts.map +1 -0
- package/dist/editor/context.js +12 -0
- package/dist/editor/context.js.map +1 -0
- package/dist/editor/index.d.ts +5 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +5 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/overrides.d.ts +3 -0
- package/dist/editor/overrides.d.ts.map +1 -0
- package/dist/editor/overrides.js +379 -0
- package/dist/editor/overrides.js.map +1 -0
- package/dist/editor/theme-editor.d.ts +46 -0
- package/dist/editor/theme-editor.d.ts.map +1 -0
- package/dist/editor/theme-editor.js +169 -0
- package/dist/editor/theme-editor.js.map +1 -0
- package/dist/editor/unified-editor.d.ts +25 -0
- package/dist/editor/unified-editor.d.ts.map +1 -0
- package/dist/editor/unified-editor.js +229 -0
- package/dist/editor/unified-editor.js.map +1 -0
- package/dist/editor/use-theme-runtime.d.ts +8 -0
- package/dist/editor/use-theme-runtime.d.ts.map +1 -0
- package/dist/editor/use-theme-runtime.js +77 -0
- package/dist/editor/use-theme-runtime.js.map +1 -0
- package/dist/fields/basic-fields.d.ts +14 -0
- package/dist/fields/basic-fields.d.ts.map +1 -0
- package/dist/fields/basic-fields.js +46 -0
- package/dist/fields/basic-fields.js.map +1 -0
- package/dist/fields/color-field.d.ts +3 -0
- package/dist/fields/color-field.d.ts.map +1 -0
- package/dist/fields/color-field.js +97 -0
- package/dist/fields/color-field.js.map +1 -0
- package/dist/fields/color-scheme-field.d.ts +81 -0
- package/dist/fields/color-scheme-field.d.ts.map +1 -0
- package/dist/fields/color-scheme-field.js +234 -0
- package/dist/fields/color-scheme-field.js.map +1 -0
- package/dist/fields/index.d.ts +6 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +4 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/media-field.d.ts +10 -0
- package/dist/fields/media-field.d.ts.map +1 -0
- package/dist/fields/media-field.js +495 -0
- package/dist/fields/media-field.js.map +1 -0
- package/dist/fields/normalize-config.d.ts +3 -0
- package/dist/fields/normalize-config.d.ts.map +1 -0
- package/dist/fields/normalize-config.js +81 -0
- package/dist/fields/normalize-config.js.map +1 -0
- package/dist/fields/range-field.d.ts +9 -0
- package/dist/fields/range-field.d.ts.map +1 -0
- package/dist/fields/range-field.js +53 -0
- package/dist/fields/range-field.js.map +1 -0
- package/dist/fields/spacing-field.d.ts +7 -0
- package/dist/fields/spacing-field.d.ts.map +1 -0
- package/dist/fields/spacing-field.js +40 -0
- package/dist/fields/spacing-field.js.map +1 -0
- package/dist/fields/suda-fields.d.ts +45 -0
- package/dist/fields/suda-fields.d.ts.map +1 -0
- package/dist/fields/suda-fields.js +91 -0
- package/dist/fields/suda-fields.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +47 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +39 -0
- package/dist/manifest.js.map +1 -0
- package/dist/registry/filesystem.d.ts +27 -0
- package/dist/registry/filesystem.d.ts.map +1 -0
- package/dist/registry/filesystem.js +162 -0
- package/dist/registry/filesystem.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/render/chrome.d.ts +18 -0
- package/dist/render/chrome.d.ts.map +1 -0
- package/dist/render/chrome.js +36 -0
- package/dist/render/chrome.js.map +1 -0
- package/dist/render/index.d.ts +4 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +4 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/render.d.ts +21 -0
- package/dist/render/render.d.ts.map +1 -0
- package/dist/render/render.js +50 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/slot.d.ts +14 -0
- package/dist/render/slot.d.ts.map +1 -0
- package/dist/render/slot.js +14 -0
- package/dist/render/slot.js.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +10 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +16 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +171 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
const BORDER = "1px solid var(--puck-color-grey-09, #dcdcdc)";
|
|
4
|
+
const CONTROL_HEIGHT = 28;
|
|
5
|
+
const numberInputStyle = {
|
|
6
|
+
height: CONTROL_HEIGHT,
|
|
7
|
+
padding: "0 6px",
|
|
8
|
+
border: BORDER,
|
|
9
|
+
borderRadius: 4,
|
|
10
|
+
fontSize: 12,
|
|
11
|
+
background: "var(--puck-color-white, #fff)",
|
|
12
|
+
color: "var(--puck-color-black, #111)",
|
|
13
|
+
boxSizing: "border-box",
|
|
14
|
+
width: 56,
|
|
15
|
+
textAlign: "right",
|
|
16
|
+
};
|
|
17
|
+
function RangeFieldRender({ value, onChange, options, unit, }) {
|
|
18
|
+
const current = value ?? options.min;
|
|
19
|
+
return (_jsxs("div", { "data-suda-field-layout": "inline", style: {
|
|
20
|
+
display: "flex",
|
|
21
|
+
alignItems: "center",
|
|
22
|
+
gap: 6,
|
|
23
|
+
width: 160,
|
|
24
|
+
}, children: [_jsx("input", { type: "range", min: options.min, max: options.max, step: options.step, value: current, style: {
|
|
25
|
+
flex: 1,
|
|
26
|
+
height: 4,
|
|
27
|
+
cursor: "pointer",
|
|
28
|
+
accentColor: "var(--puck-color-azure-05, #1f6feb)",
|
|
29
|
+
}, onChange: (event) => onChange(Number(event.target.value)) }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 0, flexShrink: 0 }, children: [_jsx("input", { type: "number", min: options.min, max: options.max, step: options.step, value: current, style: numberInputStyle, onChange: (event) => onChange(Number(event.target.value)) }), unit ? (_jsx("span", { style: {
|
|
30
|
+
fontSize: 11,
|
|
31
|
+
color: "var(--puck-color-grey-04, #666)",
|
|
32
|
+
padding: "0 4px",
|
|
33
|
+
userSelect: "none",
|
|
34
|
+
}, children: unit })) : null] })] }));
|
|
35
|
+
}
|
|
36
|
+
export function rangeField(label, options = {}) {
|
|
37
|
+
const resolved = {
|
|
38
|
+
min: options.min ?? 0,
|
|
39
|
+
max: options.max ?? 100,
|
|
40
|
+
step: options.step ?? 1,
|
|
41
|
+
};
|
|
42
|
+
const unit = options.unit;
|
|
43
|
+
const field = {
|
|
44
|
+
type: "custom",
|
|
45
|
+
metadata: { sudaField: "range", ...resolved, ...(unit !== undefined ? { unit } : {}) },
|
|
46
|
+
render: ({ value, onChange }) => (_jsx(RangeFieldRender, { value: value, onChange: onChange, options: resolved, unit: unit })),
|
|
47
|
+
};
|
|
48
|
+
if (label !== undefined) {
|
|
49
|
+
field.label = label;
|
|
50
|
+
}
|
|
51
|
+
return field;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=range-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range-field.js","sourceRoot":"","sources":["../../src/fields/range-field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CustomField } from "@puckeditor/core";
|
|
2
|
+
/**
|
|
3
|
+
* A Puck custom field for a CSS length value (e.g. `16px`, `1.5rem`). Stores a
|
|
4
|
+
* single string combining amount and unit.
|
|
5
|
+
*/
|
|
6
|
+
export declare function spacingField(label?: string): CustomField<string>;
|
|
7
|
+
//# sourceMappingURL=spacing-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spacing-field.d.ts","sourceRoot":"","sources":["../../src/fields/spacing-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA6DpD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAShE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
const UNITS = ["px", "rem", "em", "%", "vw", "vh"];
|
|
4
|
+
const wrapStyle = { display: "flex", gap: 8 };
|
|
5
|
+
const controlStyle = {
|
|
6
|
+
height: 28,
|
|
7
|
+
padding: "0 8px",
|
|
8
|
+
border: "1px solid var(--puck-color-grey-09, #dcdcdc)",
|
|
9
|
+
borderRadius: 4,
|
|
10
|
+
};
|
|
11
|
+
function parseValue(value) {
|
|
12
|
+
const match = /^(-?\d*\.?\d+)\s*([a-z%]*)$/i.exec((value ?? "").trim());
|
|
13
|
+
if (!match) {
|
|
14
|
+
return { amount: "", unit: "px" };
|
|
15
|
+
}
|
|
16
|
+
const unit = UNITS.includes(match[2] ?? "") ? match[2] : "px";
|
|
17
|
+
return { amount: match[1] ?? "", unit };
|
|
18
|
+
}
|
|
19
|
+
function SpacingFieldRender({ value, onChange, }) {
|
|
20
|
+
const { amount, unit } = parseValue(value);
|
|
21
|
+
const emit = (nextAmount, nextUnit) => {
|
|
22
|
+
onChange(nextAmount === "" ? "" : `${nextAmount}${nextUnit}`);
|
|
23
|
+
};
|
|
24
|
+
return (_jsxs("div", { style: wrapStyle, children: [_jsx("input", { type: "number", step: "any", style: { ...controlStyle, flex: 1 }, value: amount, onChange: (event) => emit(event.target.value, unit) }), _jsx("select", { style: controlStyle, value: unit, onChange: (event) => emit(amount, event.target.value), children: UNITS.map((option) => (_jsx("option", { value: option, children: option }, option))) })] }));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A Puck custom field for a CSS length value (e.g. `16px`, `1.5rem`). Stores a
|
|
28
|
+
* single string combining amount and unit.
|
|
29
|
+
*/
|
|
30
|
+
export function spacingField(label) {
|
|
31
|
+
const field = {
|
|
32
|
+
type: "custom",
|
|
33
|
+
render: ({ value, onChange }) => _jsx(SpacingFieldRender, { value: value, onChange: onChange }),
|
|
34
|
+
};
|
|
35
|
+
if (label !== undefined) {
|
|
36
|
+
field.label = label;
|
|
37
|
+
}
|
|
38
|
+
return field;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=spacing-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spacing-field.js","sourceRoot":"","sources":["../../src/fields/spacing-field.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKb,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAG5D,MAAM,SAAS,GAAwB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAEnE,MAAM,YAAY,GAAwB;IACxC,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,8CAA8C;IACtD,YAAY,EAAE,CAAC;CAChB,CAAC;AAEF,SAAS,UAAU,CAAC,KAAyB;IAC3C,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,IAAI,GAAI,KAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,CAAC,UAAkB,EAAE,QAAc,EAAQ,EAAE;QACxD,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,KAAK,EAAE,SAAS,aACnB,gBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GACnD,EACF,iBACE,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAa,CAAC,YAE5D,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACrB,iBAAqB,KAAK,EAAE,MAAM,YAC/B,MAAM,IADI,MAAM,CAEV,CACV,CAAC,GACK,IACL,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,KAAK,GAAwB;QACjC,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI;KAC1F,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { BaseField, Field as PuckField } from "@puckeditor/core";
|
|
2
|
+
import { type MenuItem, type SelectOption } from "./basic-fields";
|
|
3
|
+
import { type MediaFieldKind } from "./media-field";
|
|
4
|
+
/**
|
|
5
|
+
* Discriminator literal for every Suda-extended field type. Passed through
|
|
6
|
+
* Puck's `FieldsExtension` slot so themes can declare these alongside Puck's
|
|
7
|
+
* built-in field types using the same `{ type, label, ... }` shape.
|
|
8
|
+
*/
|
|
9
|
+
export type SudaFieldType = "url" | "icon" | "font" | "menu" | "color" | "range" | "spacing" | "media" | "image" | "video";
|
|
10
|
+
/**
|
|
11
|
+
* Single non-distributive interface describing every Suda-extended field
|
|
12
|
+
* declaration. Kept as one interface (not a union of per-type interfaces) so
|
|
13
|
+
* that when Puck's `Fields<Props, UserField>` mapped type evaluates
|
|
14
|
+
* `UserField extends { type: PropertyKey } ? ... : ...`, it does NOT distribute
|
|
15
|
+
* over a union and force `arrayFields`/`objectFields` props into a single
|
|
16
|
+
* branch. Per-field optional members (`placeholder`, `options`, `kind`,
|
|
17
|
+
* `min/max/step/unit`) are kept loose; runtime normalisation (`normalizeSudaField`)
|
|
18
|
+
* is the source of truth for which keys apply to which `type`.
|
|
19
|
+
*/
|
|
20
|
+
export interface SudaFieldExtension extends BaseField {
|
|
21
|
+
type: SudaFieldType;
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
options?: SelectOption[];
|
|
24
|
+
kind?: MediaFieldKind;
|
|
25
|
+
min?: number;
|
|
26
|
+
max?: number;
|
|
27
|
+
step?: number;
|
|
28
|
+
unit?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
export type SudaFieldValueMap = {
|
|
32
|
+
url: string;
|
|
33
|
+
icon: string;
|
|
34
|
+
font: string;
|
|
35
|
+
menu: MenuItem[];
|
|
36
|
+
color: string;
|
|
37
|
+
range: number;
|
|
38
|
+
spacing: string;
|
|
39
|
+
media: string;
|
|
40
|
+
image: string;
|
|
41
|
+
video: string;
|
|
42
|
+
};
|
|
43
|
+
export type SudaField<Value = unknown> = PuckField<Value, SudaFieldExtension> | SudaFieldExtension;
|
|
44
|
+
export declare function normalizeSudaField<Value>(field: SudaField<Value>): PuckField<Value>;
|
|
45
|
+
//# sourceMappingURL=suda-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suda-fields.d.ts","sourceRoot":"","sources":["../../src/fields/suda-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAIhE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAEZ;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,KAAK,GAAG,OAAO,IACjC,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC,GACpC,kBAAkB,CAAC;AAmCvB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CA8DnF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { fontField, iconField, menuField, urlField, } from "./basic-fields";
|
|
2
|
+
import { colorField } from "./color-field";
|
|
3
|
+
import { mediaField } from "./media-field";
|
|
4
|
+
import { rangeField } from "./range-field";
|
|
5
|
+
import { spacingField } from "./spacing-field";
|
|
6
|
+
function applyBaseField(target, source) {
|
|
7
|
+
if (source.label !== undefined) {
|
|
8
|
+
target.label = source.label;
|
|
9
|
+
}
|
|
10
|
+
if (source.labelIcon !== undefined) {
|
|
11
|
+
target.labelIcon = source.labelIcon;
|
|
12
|
+
}
|
|
13
|
+
if (source.metadata !== undefined) {
|
|
14
|
+
target.metadata = { ...target.metadata, ...source.metadata };
|
|
15
|
+
}
|
|
16
|
+
if (source.visible !== undefined) {
|
|
17
|
+
target.visible = source.visible;
|
|
18
|
+
}
|
|
19
|
+
return target;
|
|
20
|
+
}
|
|
21
|
+
function rangeOptions(field) {
|
|
22
|
+
const options = {};
|
|
23
|
+
if (field.min !== undefined) {
|
|
24
|
+
options.min = field.min;
|
|
25
|
+
}
|
|
26
|
+
if (field.max !== undefined) {
|
|
27
|
+
options.max = field.max;
|
|
28
|
+
}
|
|
29
|
+
if (field.step !== undefined) {
|
|
30
|
+
options.step = field.step;
|
|
31
|
+
}
|
|
32
|
+
if (field.unit !== undefined) {
|
|
33
|
+
options.unit = field.unit;
|
|
34
|
+
}
|
|
35
|
+
return options;
|
|
36
|
+
}
|
|
37
|
+
export function normalizeSudaField(field) {
|
|
38
|
+
switch (field.type) {
|
|
39
|
+
case "url": {
|
|
40
|
+
const normalized = urlField(field.label);
|
|
41
|
+
if (field.placeholder !== undefined) {
|
|
42
|
+
normalized.placeholder = field.placeholder;
|
|
43
|
+
}
|
|
44
|
+
return applyBaseField(normalized, field);
|
|
45
|
+
}
|
|
46
|
+
case "icon": {
|
|
47
|
+
const normalized = iconField(field.label);
|
|
48
|
+
if (field.placeholder !== undefined) {
|
|
49
|
+
normalized.placeholder = field.placeholder;
|
|
50
|
+
}
|
|
51
|
+
return applyBaseField(normalized, field);
|
|
52
|
+
}
|
|
53
|
+
case "font":
|
|
54
|
+
return applyBaseField(fontField(field.label, field.options), field);
|
|
55
|
+
case "menu":
|
|
56
|
+
return applyBaseField(menuField(field.label), field);
|
|
57
|
+
case "color":
|
|
58
|
+
return applyBaseField(colorField(field.label), field);
|
|
59
|
+
case "range":
|
|
60
|
+
return applyBaseField(rangeField(field.label, rangeOptions(field)), field);
|
|
61
|
+
case "spacing":
|
|
62
|
+
return applyBaseField(spacingField(field.label), field);
|
|
63
|
+
case "media": {
|
|
64
|
+
const options = {};
|
|
65
|
+
if (field.kind !== undefined) {
|
|
66
|
+
options.kind = field.kind;
|
|
67
|
+
}
|
|
68
|
+
if (field.description !== undefined) {
|
|
69
|
+
options.description = field.description;
|
|
70
|
+
}
|
|
71
|
+
return applyBaseField(mediaField(field.label, options), field);
|
|
72
|
+
}
|
|
73
|
+
case "image": {
|
|
74
|
+
const imageOptions = { kind: "image" };
|
|
75
|
+
if (field.description !== undefined) {
|
|
76
|
+
imageOptions.description = field.description;
|
|
77
|
+
}
|
|
78
|
+
return applyBaseField(mediaField(field.label, imageOptions), field);
|
|
79
|
+
}
|
|
80
|
+
case "video": {
|
|
81
|
+
const videoOptions = { kind: "video" };
|
|
82
|
+
if (field.description !== undefined) {
|
|
83
|
+
videoOptions.description = field.description;
|
|
84
|
+
}
|
|
85
|
+
return applyBaseField(mediaField(field.label, videoOptions), field);
|
|
86
|
+
}
|
|
87
|
+
default:
|
|
88
|
+
return field;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=suda-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suda-fields.js","sourceRoot":"","sources":["../../src/fields/suda-fields.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./manifest";
|
|
3
|
+
export * from "./registry";
|
|
4
|
+
export * from "./ai/slots";
|
|
5
|
+
export * from "./assets";
|
|
6
|
+
export * from "./cms/index";
|
|
7
|
+
export * from "./fields/index";
|
|
8
|
+
export * from "./components/index";
|
|
9
|
+
export * from "./editor/index";
|
|
10
|
+
export { extractLayoutChrome, type LayoutChrome } from "./render/chrome";
|
|
11
|
+
export { getPageSlot, THEME_PAGE_SLOT } from "./render/slot";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Contracts (universal)
|
|
2
|
+
export * from "./types";
|
|
3
|
+
export * from "./manifest";
|
|
4
|
+
export * from "./registry";
|
|
5
|
+
export * from "./ai/slots";
|
|
6
|
+
export * from "./assets";
|
|
7
|
+
export * from "./cms/index";
|
|
8
|
+
// Editor building blocks (client-safe)
|
|
9
|
+
export * from "./fields/index";
|
|
10
|
+
export * from "./components/index";
|
|
11
|
+
export * from "./editor/index";
|
|
12
|
+
// Layout chrome helpers (universal/pure)
|
|
13
|
+
export { extractLayoutChrome } from "./render/chrome";
|
|
14
|
+
export { getPageSlot, THEME_PAGE_SLOT } from "./render/slot";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAE5B,uCAAuC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,yCAAyC;AACzC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ThemeManifest } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Validates the serialisable part of a theme. Kept in sync with
|
|
5
|
+
* {@link ThemeManifest} so the CLI, registry and runtime all agree on shape.
|
|
6
|
+
*
|
|
7
|
+
* The validated output is cast to {@link ThemeManifest}: Zod models optional
|
|
8
|
+
* fields as `T | undefined`, which is intentionally narrower than the contract
|
|
9
|
+
* under `exactOptionalPropertyTypes`, so we assert the (compatible) shape.
|
|
10
|
+
*/
|
|
11
|
+
export declare const themeManifestSchema: z.ZodObject<{
|
|
12
|
+
key: z.ZodString;
|
|
13
|
+
name: z.ZodString;
|
|
14
|
+
version: z.ZodString;
|
|
15
|
+
description: z.ZodOptional<z.ZodString>;
|
|
16
|
+
preview: z.ZodOptional<z.ZodString>;
|
|
17
|
+
author: z.ZodOptional<z.ZodString>;
|
|
18
|
+
categories: z.ZodArray<z.ZodEnum<["business", "blog", "portfolio", "ecommerce", "landing", "other"]>, "many">;
|
|
19
|
+
minEngineVersion: z.ZodString;
|
|
20
|
+
entry: z.ZodString;
|
|
21
|
+
clientEntry: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
entry: string;
|
|
24
|
+
key: string;
|
|
25
|
+
categories: ("business" | "blog" | "portfolio" | "ecommerce" | "landing" | "other")[];
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
minEngineVersion: string;
|
|
29
|
+
description?: string | undefined;
|
|
30
|
+
preview?: string | undefined;
|
|
31
|
+
author?: string | undefined;
|
|
32
|
+
clientEntry?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
entry: string;
|
|
35
|
+
key: string;
|
|
36
|
+
categories: ("business" | "blog" | "portfolio" | "ecommerce" | "landing" | "other")[];
|
|
37
|
+
name: string;
|
|
38
|
+
version: string;
|
|
39
|
+
minEngineVersion: string;
|
|
40
|
+
description?: string | undefined;
|
|
41
|
+
preview?: string | undefined;
|
|
42
|
+
author?: string | undefined;
|
|
43
|
+
clientEntry?: string | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export declare function parseThemeManifest(input: unknown): ThemeManifest;
|
|
46
|
+
export declare function safeParseThemeManifest(input: unknown): z.SafeParseReturnType<unknown, ThemeManifest>;
|
|
47
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAW7C;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc9B,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAEhE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAE/C"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const themeCategorySchema = z.enum([
|
|
3
|
+
"business",
|
|
4
|
+
"blog",
|
|
5
|
+
"portfolio",
|
|
6
|
+
"ecommerce",
|
|
7
|
+
"landing",
|
|
8
|
+
"other",
|
|
9
|
+
]);
|
|
10
|
+
/**
|
|
11
|
+
* Validates the serialisable part of a theme. Kept in sync with
|
|
12
|
+
* {@link ThemeManifest} so the CLI, registry and runtime all agree on shape.
|
|
13
|
+
*
|
|
14
|
+
* The validated output is cast to {@link ThemeManifest}: Zod models optional
|
|
15
|
+
* fields as `T | undefined`, which is intentionally narrower than the contract
|
|
16
|
+
* under `exactOptionalPropertyTypes`, so we assert the (compatible) shape.
|
|
17
|
+
*/
|
|
18
|
+
export const themeManifestSchema = z.object({
|
|
19
|
+
key: z
|
|
20
|
+
.string()
|
|
21
|
+
.min(1)
|
|
22
|
+
.regex(/^[a-z0-9][a-z0-9-]*$/, "key must be kebab-case"),
|
|
23
|
+
name: z.string().min(1),
|
|
24
|
+
version: z.string().min(1),
|
|
25
|
+
description: z.string().optional(),
|
|
26
|
+
preview: z.string().optional(),
|
|
27
|
+
author: z.string().optional(),
|
|
28
|
+
categories: z.array(themeCategorySchema).min(1),
|
|
29
|
+
minEngineVersion: z.string().min(1),
|
|
30
|
+
entry: z.string().min(1),
|
|
31
|
+
clientEntry: z.string().min(1).optional(),
|
|
32
|
+
});
|
|
33
|
+
export function parseThemeManifest(input) {
|
|
34
|
+
return themeManifestSchema.parse(input);
|
|
35
|
+
}
|
|
36
|
+
export function safeParseThemeManifest(input) {
|
|
37
|
+
return themeManifestSchema.safeParse(input);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACjC,UAAU;IACV,MAAM;IACN,WAAW;IACX,WAAW;IACX,SAAS;IACT,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,KAAK,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;IAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAkB,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAc;IAEd,OAAO,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAkD,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ThemeRegistry } from "../registry";
|
|
2
|
+
import type { ResolvedTheme, ThemeManifest } from "../types";
|
|
3
|
+
export interface FileSystemThemeRegistryOptions {
|
|
4
|
+
/** Directories containing one subdirectory per theme artifact/source checkout. */
|
|
5
|
+
roots: string[];
|
|
6
|
+
/** Public API prefix that serves theme files, e.g. `/api/themes`. */
|
|
7
|
+
publicBasePath?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Runtime registry backed by theme artifact files. Apps use this instead of
|
|
11
|
+
* importing theme packages so new themes can be installed/published without
|
|
12
|
+
* rebuilding the app bundle.
|
|
13
|
+
*/
|
|
14
|
+
export declare class FileSystemThemeRegistry implements ThemeRegistry {
|
|
15
|
+
private readonly options;
|
|
16
|
+
private records;
|
|
17
|
+
constructor(options: FileSystemThemeRegistryOptions);
|
|
18
|
+
list(): Promise<ThemeManifest[]>;
|
|
19
|
+
has(key: string): Promise<boolean>;
|
|
20
|
+
resolve(key: string, version?: string): Promise<ResolvedTheme | null>;
|
|
21
|
+
resolveAssetPath(key: string, version: string, relativePath: string): Promise<string | null>;
|
|
22
|
+
resolveClientEntryPath(key: string, version: string): Promise<string | null>;
|
|
23
|
+
private loadRecords;
|
|
24
|
+
private discoverRecords;
|
|
25
|
+
private createRuntime;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/registry/filesystem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAA6B,MAAM,UAAU,CAAC;AAExF,MAAM,WAAW,8BAA8B;IAC7C,kFAAkF;IAClF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAyED;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAG/C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,OAAO,CAA+C;gBAEjC,OAAO,EAAE,8BAA8B;IAE9D,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAKhC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAkBrE,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAWpE,WAAW;YAKX,eAAe;YAuBf,aAAa;CAuB5B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
// Theme artifacts only exist at runtime. The native import wrapper keeps app
|
|
5
|
+
// bundlers from statically resolving artifact paths into workspace/site bundles.
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval -- Preserve runtime file URL imports from TS/bundler static rewrites.
|
|
7
|
+
const nativeImport = new Function("specifier", "return import(specifier)");
|
|
8
|
+
function isMissingDynamicImportCallback(error) {
|
|
9
|
+
return (error instanceof Error &&
|
|
10
|
+
"code" in error &&
|
|
11
|
+
error.code === "ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING");
|
|
12
|
+
}
|
|
13
|
+
async function runtimeImport(modulePath) {
|
|
14
|
+
try {
|
|
15
|
+
return await nativeImport(modulePath);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (!isMissingDynamicImportCallback(error)) {
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
return import(/* @vite-ignore */ modulePath);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function toPublicPath(...segments) {
|
|
25
|
+
return segments
|
|
26
|
+
.map((segment) => segment.replace(/^\/+|\/+$/g, ""))
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join("/");
|
|
29
|
+
}
|
|
30
|
+
function cacheBust(pathname, version) {
|
|
31
|
+
return `${pathname}?v=${encodeURIComponent(version)}`;
|
|
32
|
+
}
|
|
33
|
+
function resolveClientEntryPathFromManifest(rootPath, manifest) {
|
|
34
|
+
const relativeClientEntry = manifest.clientEntry ?? "dist/runtime.client.js";
|
|
35
|
+
const safeRelativePath = relativeClientEntry.replace(/^\/+/, "");
|
|
36
|
+
return path.join(rootPath, safeRelativePath);
|
|
37
|
+
}
|
|
38
|
+
async function pathExists(filePath) {
|
|
39
|
+
try {
|
|
40
|
+
await stat(filePath);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function importThemeModule(serverEntryPath) {
|
|
48
|
+
// Use runtime dynamic import so bundlers do not try to statically resolve
|
|
49
|
+
// theme artifact paths that only exist at runtime.
|
|
50
|
+
const imported = await runtimeImport(pathToFileURL(serverEntryPath).href);
|
|
51
|
+
if (!imported.default?.manifest) {
|
|
52
|
+
throw new Error(`Theme artifact at ${serverEntryPath} does not export a ThemeModule default export.`);
|
|
53
|
+
}
|
|
54
|
+
return imported.default;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Runtime registry backed by theme artifact files. Apps use this instead of
|
|
58
|
+
* importing theme packages so new themes can be installed/published without
|
|
59
|
+
* rebuilding the app bundle.
|
|
60
|
+
*/
|
|
61
|
+
export class FileSystemThemeRegistry {
|
|
62
|
+
options;
|
|
63
|
+
records = null;
|
|
64
|
+
constructor(options) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
}
|
|
67
|
+
async list() {
|
|
68
|
+
const records = await this.loadRecords();
|
|
69
|
+
return records.map((record) => record.module.manifest);
|
|
70
|
+
}
|
|
71
|
+
async has(key) {
|
|
72
|
+
const records = await this.loadRecords();
|
|
73
|
+
return records.some((record) => record.module.manifest.key === key);
|
|
74
|
+
}
|
|
75
|
+
async resolve(key, version) {
|
|
76
|
+
const records = await this.loadRecords();
|
|
77
|
+
const record = records.find((candidate) => {
|
|
78
|
+
const manifest = candidate.module.manifest;
|
|
79
|
+
return manifest.key === key && (version === undefined || manifest.version === version);
|
|
80
|
+
});
|
|
81
|
+
if (!record) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const manifest = record.module.manifest;
|
|
85
|
+
return {
|
|
86
|
+
manifest,
|
|
87
|
+
module: record.module,
|
|
88
|
+
runtime: await this.createRuntime(record),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async resolveAssetPath(key, version, relativePath) {
|
|
92
|
+
const resolved = await this.resolve(key, version);
|
|
93
|
+
const rootPath = resolved?.runtime?.rootPath;
|
|
94
|
+
if (!rootPath) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const safeRelativePath = relativePath.replace(/^\/+/, "");
|
|
98
|
+
const assetPath = path.resolve(rootPath, safeRelativePath);
|
|
99
|
+
const normalizedRoot = path.resolve(rootPath) + path.sep;
|
|
100
|
+
if (!assetPath.startsWith(normalizedRoot)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return (await pathExists(assetPath)) ? assetPath : null;
|
|
104
|
+
}
|
|
105
|
+
async resolveClientEntryPath(key, version) {
|
|
106
|
+
const resolved = await this.resolve(key, version);
|
|
107
|
+
const rootPath = resolved?.runtime?.rootPath;
|
|
108
|
+
const manifest = resolved?.manifest;
|
|
109
|
+
if (!rootPath || !manifest) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const clientEntryPath = resolveClientEntryPathFromManifest(rootPath, manifest);
|
|
113
|
+
return (await pathExists(clientEntryPath)) ? clientEntryPath : null;
|
|
114
|
+
}
|
|
115
|
+
async loadRecords() {
|
|
116
|
+
this.records ??= this.discoverRecords();
|
|
117
|
+
return this.records;
|
|
118
|
+
}
|
|
119
|
+
async discoverRecords() {
|
|
120
|
+
const records = [];
|
|
121
|
+
for (const root of this.options.roots) {
|
|
122
|
+
if (!(await pathExists(root))) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const children = await readdir(root, { withFileTypes: true });
|
|
126
|
+
for (const child of children) {
|
|
127
|
+
if (!child.isDirectory()) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const rootPath = path.join(root, child.name);
|
|
131
|
+
const serverEntryPath = path.join(rootPath, "dist", "index.js");
|
|
132
|
+
if (!(await pathExists(serverEntryPath))) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const module = await importThemeModule(serverEntryPath);
|
|
136
|
+
records.push({ rootPath, serverEntryPath, module });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return records;
|
|
140
|
+
}
|
|
141
|
+
async createRuntime(record) {
|
|
142
|
+
const { key, version } = record.module.manifest;
|
|
143
|
+
const runtime = {
|
|
144
|
+
rootPath: record.rootPath,
|
|
145
|
+
serverEntryPath: record.serverEntryPath,
|
|
146
|
+
};
|
|
147
|
+
const basePath = this.options.publicBasePath;
|
|
148
|
+
if (basePath) {
|
|
149
|
+
const prefix = `/${toPublicPath(basePath, key, version)}`;
|
|
150
|
+
const stylesheetPath = path.join(record.rootPath, "styles.css");
|
|
151
|
+
const clientEntryPath = resolveClientEntryPathFromManifest(record.rootPath, record.module.manifest);
|
|
152
|
+
if (await pathExists(stylesheetPath)) {
|
|
153
|
+
runtime.stylesheetUrl = cacheBust(`${prefix}/assets/styles.css`, version);
|
|
154
|
+
}
|
|
155
|
+
if (await pathExists(clientEntryPath)) {
|
|
156
|
+
runtime.clientEntryUrl = cacheBust(`${prefix}/runtime/client`, version);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return runtime;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/registry/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ResolvedTheme, ThemeManifest } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves themes by key/version. Implementations load theme artifacts at
|
|
4
|
+
* runtime (filesystem cache, S3-backed cache, marketplace registry, etc.). Apps
|
|
5
|
+
* must not import concrete theme packages or source code.
|
|
6
|
+
*/
|
|
7
|
+
export interface ThemeRegistry {
|
|
8
|
+
list(): Promise<ThemeManifest[]>;
|
|
9
|
+
has(key: string): Promise<boolean>;
|
|
10
|
+
/** Resolve a theme. `version` defaults to the registry's latest for `key`. */
|
|
11
|
+
resolve(key: string, version?: string): Promise<ResolvedTheme | null>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,8EAA8E;IAC9E,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;CACvE"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":""}
|