@numueg/theme-sdk 0.13.0 → 0.13.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/CHANGELOG.md +25 -0
- package/dist/{chunk-H7RGDWSU.cjs → chunk-3ZJW5EIE.cjs} +3 -3
- package/dist/{chunk-H7RGDWSU.cjs.map → chunk-3ZJW5EIE.cjs.map} +1 -1
- package/dist/{chunk-ZYZZG4JR.mjs → chunk-VZO2WMEM.mjs} +13 -4
- package/dist/chunk-VZO2WMEM.mjs.map +1 -0
- package/dist/{chunk-V3JDQXD3.cjs → chunk-WNMFED3F.cjs} +13 -4
- package/dist/chunk-WNMFED3F.cjs.map +1 -0
- package/dist/{chunk-QPXMBK5U.mjs → chunk-X2YWGRRG.mjs} +3 -3
- package/dist/{chunk-QPXMBK5U.mjs.map → chunk-X2YWGRRG.mjs.map} +1 -1
- package/dist/index.cjs +81 -74
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +14 -7
- package/dist/index.mjs.map +1 -1
- package/dist/v2-compat.cjs +6 -6
- package/dist/v2-compat.mjs +1 -1
- package/dist/validation.cjs +11 -11
- package/dist/validation.mjs +1 -1
- package/dist/verify.cjs +3 -3
- package/dist/verify.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-V3JDQXD3.cjs.map +0 -1
- package/dist/chunk-ZYZZG4JR.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validation/index.ts"],"names":[],"mappings":"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","file":"chunk-QPXMBK5U.mjs","sourcesContent":["/**\n * Shared theme-contract validators — the single source of truth.\n *\n * This module is PURE: it imports only types (erased at compile time) and\n * has no React/DOM/fs dependencies, so the same logic runs in the CLI, the\n * Vite plugin, and (re-implemented) the backend. Callers parse JSON files\n * themselves and pass plain objects in; these functions never touch disk.\n *\n * The goal is that \"builds green\" implies \"matches the contract\": every\n * place a theme can drift from what the storefront expects is checked here\n * once, instead of being re-derived (and drifting) in each tool.\n */\n\nimport type { SectionSchema, SettingDefinition } from \"../types/theme\";\n\n/**\n * The theme CONTRACT version — bumped only on a breaking change to what a\n * built theme must look like (manifest shape, required emitted artifacts,\n * section/setting semantics). The plugin stamps this into the built\n * manifest/import-map; the host refuses bundles whose contract version it\n * doesn't support. Distinct from the npm SDK version (`SDK_VERSION`), which\n * moves on every release including non-breaking ones.\n */\nexport const THEME_CONTRACT_VERSION = 1;\n\n/** npm version of this SDK build (inlined by tsup `define`). Informational. */\ndeclare const __SDK_VERSION__: string | undefined;\nexport const SDK_VERSION: string =\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0\";\n\nexport interface ValidationIssue {\n level: \"error\" | \"warning\";\n /** Stable machine code, e.g. \"manifest.version.invalid\". */\n code: string;\n message: string;\n /** Dotted path or file hint, e.g. \"presets.templates.home\" or \"hero.json\". */\n path?: string;\n}\n\nexport interface ValidationResult {\n /** True when there are zero error-level issues. */\n valid: boolean;\n issues: ValidationIssue[];\n}\n\n/**\n * Page templates the storefront routes to. A theme that omits a REQUIRED\n * template still works (the host falls back to its built-in), so a miss is\n * a warning, not an error — but tooling can elevate it with --strict.\n */\nexport const REQUIRED_TEMPLATES = [\n \"home\",\n \"product\",\n \"collection\",\n \"cart\",\n \"page\",\n \"search\",\n \"404\",\n] as const;\n\nexport const KNOWN_TEMPLATES: ReadonlySet<string> = new Set([\n ...REQUIRED_TEMPLATES,\n \"blog\",\n \"article\",\n \"policies\",\n \"password\",\n \"account\",\n \"checkout\",\n]);\n\n/** Setting types the V3 customizer renders. Unknown types warn (forward-compat). */\nexport const KNOWN_SETTING_TYPES: ReadonlySet<string> = new Set([\n \"text\", \"textarea\", \"richtext\", \"number\", \"range\", \"color\", \"checkbox\",\n \"select\", \"radio\", \"font\", \"image_picker\", \"url\", \"product\", \"product_list\",\n \"collection\", \"collection_list\", \"header\", \"paragraph\", \"html\", \"date\",\n \"time\", \"video_picker\", \"color_scheme\", \"page_picker\", \"blog_picker\",\n \"link_list_picker\", \"variant_picker\", \"file_upload\", \"icon_picker\", \"icon\",\n]);\n\n/** Setting types that are presentational (no value) — `id`/`label` optional. */\nconst PRESENTATIONAL_SETTING_TYPES: ReadonlySet<string> = new Set([\n \"header\", \"paragraph\", \"html\",\n]);\n\n// ── Primitives ────────────────────────────────────────────────────\n\nconst SECTION_TYPE_RE = /^[a-z][a-z0-9_-]*$/;\nconst THEME_ID_RE = /^[a-z0-9][a-z0-9_-]*[a-z0-9]$/;\n// Pragmatic semver (major.minor.patch + optional -prerelease / +build).\nconst SEMVER_RE =\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$/;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isNonEmptyString(v: unknown): v is string {\n return typeof v === \"string\" && v.trim().length > 0;\n}\n\nclass IssueBag {\n readonly issues: ValidationIssue[] = [];\n err(code: string, message: string, path?: string) {\n this.issues.push({ level: \"error\", code, message, path });\n }\n warn(code: string, message: string, path?: string) {\n this.issues.push({ level: \"warning\", code, message, path });\n }\n result(): ValidationResult {\n return {\n valid: !this.issues.some((i) => i.level === \"error\"),\n issues: this.issues,\n };\n }\n}\n\n/** Pull the section types referenced by a manifest's presets. */\nfunction collectPresetSectionTypes(manifest: Record<string, unknown>): Set<string> {\n const types = new Set<string>();\n const presets = manifest.presets;\n if (!isObject(presets)) return types;\n const buckets = [presets.templates, presets.section_groups];\n for (const bucket of buckets) {\n if (!isObject(bucket)) continue;\n for (const entry of Object.values(bucket)) {\n if (!isObject(entry)) continue;\n const sections = entry.sections;\n // sections may be an array of instances OR a map id -> instance.\n const instances = Array.isArray(sections)\n ? sections\n : isObject(sections)\n ? Object.values(sections)\n : [];\n for (const inst of instances) {\n if (isObject(inst) && isNonEmptyString(inst.type)) types.add(inst.type);\n }\n }\n }\n return types;\n}\n\n// ── Setting / schema validation ───────────────────────────────────\n\nfunction validateSettingInto(\n bag: IssueBag,\n setting: unknown,\n pathPrefix: string,\n seenIds: Set<string>,\n) {\n if (!isObject(setting)) {\n bag.err(\"schema.setting.invalid\", \"Setting must be an object.\", pathPrefix);\n return;\n }\n const type = setting.type;\n if (!isNonEmptyString(type)) {\n bag.err(\"schema.setting.type.missing\", \"Setting is missing a `type`.\", pathPrefix);\n } else if (!KNOWN_SETTING_TYPES.has(type)) {\n bag.warn(\n \"schema.setting.type.unknown\",\n `Unknown setting type \"${type}\" — the customizer will fall back to a text input.`,\n pathPrefix,\n );\n }\n const presentational =\n isNonEmptyString(type) && PRESENTATIONAL_SETTING_TYPES.has(type);\n if (!presentational) {\n if (!isNonEmptyString(setting.id)) {\n bag.err(\"schema.setting.id.missing\", \"Setting is missing an `id`.\", pathPrefix);\n } else {\n if (seenIds.has(setting.id)) {\n bag.err(\n \"schema.setting.id.duplicate\",\n `Duplicate setting id \"${setting.id}\".`,\n pathPrefix,\n );\n }\n seenIds.add(setting.id);\n }\n if (!isNonEmptyString(setting.label)) {\n bag.warn(\"schema.setting.label.missing\", \"Setting has no `label`.\", pathPrefix);\n }\n }\n // select / radio need options.\n if (type === \"select\" || type === \"radio\") {\n const options = setting.options;\n if (!Array.isArray(options) || options.length === 0) {\n bag.err(\n \"schema.setting.options.missing\",\n `\"${type}\" setting \"${String(setting.id)}\" must declare a non-empty \\`options\\` array.`,\n pathPrefix,\n );\n }\n }\n // range needs bounds.\n if (type === \"range\") {\n if (typeof setting.min !== \"number\" || typeof setting.max !== \"number\") {\n bag.err(\n \"schema.setting.range.bounds\",\n `\"range\" setting \"${String(setting.id)}\" must declare numeric \\`min\\` and \\`max\\`.`,\n pathPrefix,\n );\n } else if (setting.min >= setting.max) {\n bag.err(\n \"schema.setting.range.order\",\n `\"range\" setting \"${String(setting.id)}\" has min >= max.`,\n pathPrefix,\n );\n }\n }\n}\n\n/**\n * Validate one section schema (the parsed schemas/sections/<type>.json).\n * When `filenameType` is given, enforces the component-filename = schema-type\n * convention by requiring `schema.type` to equal it.\n */\nexport function validateSectionSchema(\n schema: unknown,\n opts: { filenameType?: string } = {},\n): ValidationResult {\n const bag = new IssueBag();\n const where = opts.filenameType ? `${opts.filenameType}.json` : \"section schema\";\n if (!isObject(schema)) {\n bag.err(\"schema.invalid\", \"Section schema must be a JSON object.\", where);\n return bag.result();\n }\n const type = schema.type;\n if (!isNonEmptyString(type)) {\n bag.err(\"schema.type.missing\", \"Section schema is missing a `type`.\", where);\n } else {\n if (!SECTION_TYPE_RE.test(type)) {\n bag.err(\n \"schema.type.format\",\n `Section type \"${type}\" must match ${SECTION_TYPE_RE} (lowercase, start with a letter).`,\n where,\n );\n }\n if (opts.filenameType && type !== opts.filenameType) {\n bag.err(\n \"schema.type.filename_mismatch\",\n `Schema type \"${type}\" must equal its filename \"${opts.filenameType}\" (component-filename = schema-type convention).`,\n where,\n );\n }\n }\n if (!isNonEmptyString(schema.name)) {\n bag.err(\"schema.name.missing\", \"Section schema is missing a `name`.\", where);\n }\n if (schema.settings === undefined) {\n bag.warn(\"schema.settings.missing\", \"Section schema has no `settings`.\", where);\n } else if (!Array.isArray(schema.settings)) {\n bag.err(\"schema.settings.invalid\", \"`settings` must be an array.\", where);\n } else {\n const seen = new Set<string>();\n schema.settings.forEach((s, i) =>\n validateSettingInto(bag, s, `${where}.settings[${i}]`, seen),\n );\n }\n // Nested block schemas (shallow — type + settings shape).\n if (schema.blocks !== undefined) {\n if (!Array.isArray(schema.blocks)) {\n bag.err(\"schema.blocks.invalid\", \"`blocks` must be an array.\", where);\n } else {\n schema.blocks.forEach((b, i) => {\n if (!isObject(b) || !isNonEmptyString(b.type)) {\n bag.err(\"schema.block.type.missing\", `Block[${i}] is missing a \\`type\\`.`, where);\n return;\n }\n if (!SECTION_TYPE_RE.test(b.type)) {\n bag.err(\n \"schema.block.type.format\",\n `Block type \"${b.type}\" must match ${SECTION_TYPE_RE}.`,\n where,\n );\n }\n if (Array.isArray(b.settings)) {\n const seen = new Set<string>();\n b.settings.forEach((s, j) =>\n validateSettingInto(bag, s, `${where}.blocks[${i}].settings[${j}]`, seen),\n );\n }\n });\n }\n }\n return bag.result();\n}\n\n/**\n * Instance conformance: check a settings object (from a preset or a merchant\n * customization) against its section schema. Unknown keys warn (harmless at\n * runtime — ignored); invalid values (bad select option, out-of-range,\n * wrong primitive) error.\n */\nexport function validateSettingsAgainstSchema(\n settings: unknown,\n schema: Pick<SectionSchema, \"settings\" | \"type\">,\n pathPrefix = \"settings\",\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(settings)) {\n bag.err(\"instance.settings.invalid\", \"Section settings must be an object.\", pathPrefix);\n return bag.result();\n }\n const defs = Array.isArray(schema.settings) ? schema.settings : [];\n const byId = new Map<string, SettingDefinition>();\n for (const d of defs) if (isNonEmptyString(d?.id)) byId.set(d.id, d);\n\n for (const [key, value] of Object.entries(settings)) {\n const def = byId.get(key);\n if (!def) {\n bag.warn(\n \"instance.setting.unknown\",\n `Setting \"${key}\" is not declared in the \"${String(schema.type)}\" schema.`,\n `${pathPrefix}.${key}`,\n );\n continue;\n }\n if (value === null || value === undefined) continue;\n const p = `${pathPrefix}.${key}`;\n if ((def.type === \"select\" || def.type === \"radio\") && Array.isArray(def.options)) {\n const allowed = def.options.map((o) => o.value);\n if (typeof value === \"string\" && !allowed.includes(value)) {\n bag.err(\n \"instance.setting.option.invalid\",\n `\"${key}\" = \"${value}\" is not one of: ${allowed.join(\", \")}.`,\n p,\n );\n }\n }\n if (def.type === \"range\" && typeof value === \"number\") {\n if (typeof def.min === \"number\" && value < def.min) {\n bag.err(\"instance.setting.range.under\", `\"${key}\" = ${value} is below min ${def.min}.`, p);\n }\n if (typeof def.max === \"number\" && value > def.max) {\n bag.err(\"instance.setting.range.over\", `\"${key}\" = ${value} is above max ${def.max}.`, p);\n }\n }\n if ((def.type === \"checkbox\") && typeof value !== \"boolean\") {\n bag.warn(\"instance.setting.type.mismatch\", `\"${key}\" should be a boolean.`, p);\n }\n if ((def.type === \"number\" || def.type === \"range\") && typeof value !== \"number\") {\n bag.warn(\"instance.setting.type.mismatch\", `\"${key}\" should be a number.`, p);\n }\n }\n return bag.result();\n}\n\n// ── Manifest validation ───────────────────────────────────────────\n\n/** Core manifest field checks shared by source (theme.json) and built manifests. */\nfunction validateManifestCore(bag: IssueBag, m: Record<string, unknown>) {\n if (!isNonEmptyString(m.id)) {\n bag.err(\"manifest.id.missing\", \"theme.json is missing `id`.\", \"id\");\n } else if (!THEME_ID_RE.test(m.id)) {\n bag.err(\n \"manifest.id.format\",\n `Theme id \"${m.id}\" must be lowercase alphanumeric with dashes/underscores (no leading/trailing separator).`,\n \"id\",\n );\n }\n // name: string or bilingual object { en|default, ... }.\n const name = m.name;\n const nameOk =\n isNonEmptyString(name) ||\n (isObject(name) && Object.values(name).some((v) => isNonEmptyString(v)));\n if (!nameOk) {\n bag.err(\"manifest.name.missing\", \"theme.json is missing a non-empty `name`.\", \"name\");\n }\n if (!isNonEmptyString(m.version)) {\n bag.err(\"manifest.version.missing\", \"theme.json is missing `version`.\", \"version\");\n } else if (!SEMVER_RE.test(m.version)) {\n bag.err(\"manifest.version.invalid\", `Version \"${m.version}\" is not valid semver.`, \"version\");\n }\n if (!isNonEmptyString(m.author)) {\n bag.err(\"manifest.author.missing\", \"theme.json is missing `author`.\", \"author\");\n }\n if (m.min_sdk_version !== undefined && !SEMVER_RE.test(String(m.min_sdk_version))) {\n bag.warn(\"manifest.min_sdk_version.invalid\", \"`min_sdk_version` is not valid semver.\", \"min_sdk_version\");\n }\n}\n\n/**\n * Validate a source theme manifest (parsed theme.json).\n *\n * `ctx.sectionTypes` — the set of section types the theme actually ships\n * (from schemas/sections/*.json). When provided, every section type\n * referenced by a preset must be present, and missing required templates\n * are surfaced as warnings.\n */\nexport function validateManifest(\n manifest: unknown,\n ctx: { sectionTypes?: ReadonlySet<string> } = {},\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(manifest)) {\n bag.err(\"manifest.invalid\", \"theme.json must be a JSON object.\", \"theme.json\");\n return bag.result();\n }\n validateManifestCore(bag, manifest);\n\n const presets = manifest.presets;\n if (!isObject(presets) || Object.keys(presets).length === 0) {\n bag.warn(\"manifest.presets.empty\", \"theme.json has no presets — merchants start with an empty page.\", \"presets\");\n } else {\n // Every referenced section type must resolve to a shipped schema.\n if (ctx.sectionTypes) {\n for (const type of collectPresetSectionTypes(manifest)) {\n if (!ctx.sectionTypes.has(type)) {\n bag.err(\n \"manifest.preset.unknown_section\",\n `Preset references section type \"${type}\" with no schemas/sections/${type}.json.`,\n \"presets\",\n );\n }\n }\n }\n // Required-template coverage (warning).\n const templates = isObject(presets.templates) ? presets.templates : {};\n for (const t of REQUIRED_TEMPLATES) {\n if (!(t in templates)) {\n bag.warn(\n \"manifest.template.missing\",\n `No preset for required template \"${t}\" — the storefront will fall back to its built-in.`,\n `presets.templates.${t}`,\n );\n }\n }\n }\n return bag.result();\n}\n\n/**\n * Server-side gate: validate the artifacts the plugin emits — dist/manifest.json\n * (the embedded built manifest, including section_schemas) and dist/import-map.json\n * (the federation + contract-version descriptor). This is what the backend should\n * run on upload/submit, since it can't run the source build.\n *\n * `opts.hostContractVersion` — when given, refuses bundles whose\n * `contract_version` the host doesn't support.\n */\nexport function validateBuiltManifest(\n builtManifest: unknown,\n importMap?: unknown,\n opts: { hostContractVersion?: number } = {},\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(builtManifest)) {\n bag.err(\"built.invalid\", \"manifest.json must be a JSON object.\", \"manifest.json\");\n return bag.result();\n }\n validateManifestCore(bag, builtManifest);\n\n // section_schemas must cover every type the presets reference.\n const schemas = builtManifest.section_schemas;\n const shipped = new Set<string>(isObject(schemas) ? Object.keys(schemas) : []);\n if (!isObject(schemas)) {\n bag.warn(\"built.section_schemas.missing\", \"manifest.json has no `section_schemas`.\", \"section_schemas\");\n }\n for (const type of collectPresetSectionTypes(builtManifest)) {\n if (!shipped.has(type)) {\n bag.err(\n \"built.preset.unknown_section\",\n `Preset references section type \"${type}\" not present in section_schemas.`,\n \"presets\",\n );\n }\n }\n // Each shipped schema must itself be valid.\n if (isObject(schemas)) {\n for (const [type, schema] of Object.entries(schemas)) {\n const r = validateSectionSchema(schema, { filenameType: type });\n for (const issue of r.issues) bag.issues.push(issue);\n }\n }\n if (!isNonEmptyString(builtManifest.plugin_version)) {\n bag.warn(\"built.plugin_version.missing\", \"manifest.json has no `plugin_version`.\", \"plugin_version\");\n }\n\n // Contract-version compatibility from the import map.\n if (importMap !== undefined) {\n if (!isObject(importMap)) {\n bag.err(\"importmap.invalid\", \"import-map.json must be a JSON object.\", \"import-map.json\");\n } else {\n const cv = importMap.contract_version;\n if (typeof cv !== \"number\") {\n bag.warn(\n \"importmap.contract_version.missing\",\n \"import-map.json has no numeric `contract_version` — built by an older plugin.\",\n \"contract_version\",\n );\n } else if (\n typeof opts.hostContractVersion === \"number\" &&\n cv > opts.hostContractVersion\n ) {\n bag.err(\n \"importmap.contract_version.incompatible\",\n `Theme built for contract v${cv}; this platform supports up to v${opts.hostContractVersion}.`,\n \"contract_version\",\n );\n }\n }\n }\n return bag.result();\n}\n\n/** Convenience: merge several results into one. */\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\n const issues = results.flatMap((r) => r.issues);\n return { valid: !issues.some((i) => i.level === \"error\"), issues };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/validation/index.ts"],"names":[],"mappings":"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","file":"chunk-X2YWGRRG.mjs","sourcesContent":["/**\n * Shared theme-contract validators — the single source of truth.\n *\n * This module is PURE: it imports only types (erased at compile time) and\n * has no React/DOM/fs dependencies, so the same logic runs in the CLI, the\n * Vite plugin, and (re-implemented) the backend. Callers parse JSON files\n * themselves and pass plain objects in; these functions never touch disk.\n *\n * The goal is that \"builds green\" implies \"matches the contract\": every\n * place a theme can drift from what the storefront expects is checked here\n * once, instead of being re-derived (and drifting) in each tool.\n */\n\nimport type { SectionSchema, SettingDefinition } from \"../types/theme\";\n\n/**\n * The theme CONTRACT version — bumped only on a breaking change to what a\n * built theme must look like (manifest shape, required emitted artifacts,\n * section/setting semantics). The plugin stamps this into the built\n * manifest/import-map; the host refuses bundles whose contract version it\n * doesn't support. Distinct from the npm SDK version (`SDK_VERSION`), which\n * moves on every release including non-breaking ones.\n */\nexport const THEME_CONTRACT_VERSION = 1;\n\n/** npm version of this SDK build (inlined by tsup `define`). Informational. */\ndeclare const __SDK_VERSION__: string | undefined;\nexport const SDK_VERSION: string =\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0\";\n\nexport interface ValidationIssue {\n level: \"error\" | \"warning\";\n /** Stable machine code, e.g. \"manifest.version.invalid\". */\n code: string;\n message: string;\n /** Dotted path or file hint, e.g. \"presets.templates.home\" or \"hero.json\". */\n path?: string;\n}\n\nexport interface ValidationResult {\n /** True when there are zero error-level issues. */\n valid: boolean;\n issues: ValidationIssue[];\n}\n\n/**\n * Page templates the storefront routes to. A theme that omits a REQUIRED\n * template still works (the host falls back to its built-in), so a miss is\n * a warning, not an error — but tooling can elevate it with --strict.\n */\nexport const REQUIRED_TEMPLATES = [\n \"home\",\n \"product\",\n \"collection\",\n \"cart\",\n \"page\",\n \"search\",\n \"404\",\n] as const;\n\nexport const KNOWN_TEMPLATES: ReadonlySet<string> = new Set([\n ...REQUIRED_TEMPLATES,\n \"blog\",\n \"article\",\n \"policies\",\n \"password\",\n \"account\",\n \"checkout\",\n]);\n\n/** Setting types the V3 customizer renders. Unknown types warn (forward-compat). */\nexport const KNOWN_SETTING_TYPES: ReadonlySet<string> = new Set([\n \"text\", \"textarea\", \"richtext\", \"number\", \"range\", \"color\", \"checkbox\",\n \"select\", \"radio\", \"font\", \"image_picker\", \"url\", \"product\", \"product_list\",\n \"collection\", \"collection_list\", \"header\", \"paragraph\", \"html\", \"date\",\n \"time\", \"video_picker\", \"color_scheme\", \"page_picker\", \"blog_picker\",\n \"link_list_picker\", \"variant_picker\", \"file_upload\", \"icon_picker\", \"icon\",\n]);\n\n/** Setting types that are presentational (no value) — `id`/`label` optional. */\nconst PRESENTATIONAL_SETTING_TYPES: ReadonlySet<string> = new Set([\n \"header\", \"paragraph\", \"html\",\n]);\n\n// ── Primitives ────────────────────────────────────────────────────\n\nconst SECTION_TYPE_RE = /^[a-z][a-z0-9_-]*$/;\nconst THEME_ID_RE = /^[a-z0-9][a-z0-9_-]*[a-z0-9]$/;\n// Pragmatic semver (major.minor.patch + optional -prerelease / +build).\nconst SEMVER_RE =\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$/;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isNonEmptyString(v: unknown): v is string {\n return typeof v === \"string\" && v.trim().length > 0;\n}\n\nclass IssueBag {\n readonly issues: ValidationIssue[] = [];\n err(code: string, message: string, path?: string) {\n this.issues.push({ level: \"error\", code, message, path });\n }\n warn(code: string, message: string, path?: string) {\n this.issues.push({ level: \"warning\", code, message, path });\n }\n result(): ValidationResult {\n return {\n valid: !this.issues.some((i) => i.level === \"error\"),\n issues: this.issues,\n };\n }\n}\n\n/** Pull the section types referenced by a manifest's presets. */\nfunction collectPresetSectionTypes(manifest: Record<string, unknown>): Set<string> {\n const types = new Set<string>();\n const presets = manifest.presets;\n if (!isObject(presets)) return types;\n const buckets = [presets.templates, presets.section_groups];\n for (const bucket of buckets) {\n if (!isObject(bucket)) continue;\n for (const entry of Object.values(bucket)) {\n if (!isObject(entry)) continue;\n const sections = entry.sections;\n // sections may be an array of instances OR a map id -> instance.\n const instances = Array.isArray(sections)\n ? sections\n : isObject(sections)\n ? Object.values(sections)\n : [];\n for (const inst of instances) {\n if (isObject(inst) && isNonEmptyString(inst.type)) types.add(inst.type);\n }\n }\n }\n return types;\n}\n\n// ── Setting / schema validation ───────────────────────────────────\n\nfunction validateSettingInto(\n bag: IssueBag,\n setting: unknown,\n pathPrefix: string,\n seenIds: Set<string>,\n) {\n if (!isObject(setting)) {\n bag.err(\"schema.setting.invalid\", \"Setting must be an object.\", pathPrefix);\n return;\n }\n const type = setting.type;\n if (!isNonEmptyString(type)) {\n bag.err(\"schema.setting.type.missing\", \"Setting is missing a `type`.\", pathPrefix);\n } else if (!KNOWN_SETTING_TYPES.has(type)) {\n bag.warn(\n \"schema.setting.type.unknown\",\n `Unknown setting type \"${type}\" — the customizer will fall back to a text input.`,\n pathPrefix,\n );\n }\n const presentational =\n isNonEmptyString(type) && PRESENTATIONAL_SETTING_TYPES.has(type);\n if (!presentational) {\n if (!isNonEmptyString(setting.id)) {\n bag.err(\"schema.setting.id.missing\", \"Setting is missing an `id`.\", pathPrefix);\n } else {\n if (seenIds.has(setting.id)) {\n bag.err(\n \"schema.setting.id.duplicate\",\n `Duplicate setting id \"${setting.id}\".`,\n pathPrefix,\n );\n }\n seenIds.add(setting.id);\n }\n if (!isNonEmptyString(setting.label)) {\n bag.warn(\"schema.setting.label.missing\", \"Setting has no `label`.\", pathPrefix);\n }\n }\n // select / radio need options.\n if (type === \"select\" || type === \"radio\") {\n const options = setting.options;\n if (!Array.isArray(options) || options.length === 0) {\n bag.err(\n \"schema.setting.options.missing\",\n `\"${type}\" setting \"${String(setting.id)}\" must declare a non-empty \\`options\\` array.`,\n pathPrefix,\n );\n }\n }\n // range needs bounds.\n if (type === \"range\") {\n if (typeof setting.min !== \"number\" || typeof setting.max !== \"number\") {\n bag.err(\n \"schema.setting.range.bounds\",\n `\"range\" setting \"${String(setting.id)}\" must declare numeric \\`min\\` and \\`max\\`.`,\n pathPrefix,\n );\n } else if (setting.min >= setting.max) {\n bag.err(\n \"schema.setting.range.order\",\n `\"range\" setting \"${String(setting.id)}\" has min >= max.`,\n pathPrefix,\n );\n }\n }\n}\n\n/**\n * Validate one section schema (the parsed schemas/sections/<type>.json).\n * When `filenameType` is given, enforces the component-filename = schema-type\n * convention by requiring `schema.type` to equal it.\n */\nexport function validateSectionSchema(\n schema: unknown,\n opts: { filenameType?: string } = {},\n): ValidationResult {\n const bag = new IssueBag();\n const where = opts.filenameType ? `${opts.filenameType}.json` : \"section schema\";\n if (!isObject(schema)) {\n bag.err(\"schema.invalid\", \"Section schema must be a JSON object.\", where);\n return bag.result();\n }\n const type = schema.type;\n if (!isNonEmptyString(type)) {\n bag.err(\"schema.type.missing\", \"Section schema is missing a `type`.\", where);\n } else {\n if (!SECTION_TYPE_RE.test(type)) {\n bag.err(\n \"schema.type.format\",\n `Section type \"${type}\" must match ${SECTION_TYPE_RE} (lowercase, start with a letter).`,\n where,\n );\n }\n if (opts.filenameType && type !== opts.filenameType) {\n bag.err(\n \"schema.type.filename_mismatch\",\n `Schema type \"${type}\" must equal its filename \"${opts.filenameType}\" (component-filename = schema-type convention).`,\n where,\n );\n }\n }\n if (!isNonEmptyString(schema.name)) {\n bag.err(\"schema.name.missing\", \"Section schema is missing a `name`.\", where);\n }\n if (schema.settings === undefined) {\n bag.warn(\"schema.settings.missing\", \"Section schema has no `settings`.\", where);\n } else if (!Array.isArray(schema.settings)) {\n bag.err(\"schema.settings.invalid\", \"`settings` must be an array.\", where);\n } else {\n const seen = new Set<string>();\n schema.settings.forEach((s, i) =>\n validateSettingInto(bag, s, `${where}.settings[${i}]`, seen),\n );\n }\n // Nested block schemas (shallow — type + settings shape).\n if (schema.blocks !== undefined) {\n if (!Array.isArray(schema.blocks)) {\n bag.err(\"schema.blocks.invalid\", \"`blocks` must be an array.\", where);\n } else {\n schema.blocks.forEach((b, i) => {\n if (!isObject(b) || !isNonEmptyString(b.type)) {\n bag.err(\"schema.block.type.missing\", `Block[${i}] is missing a \\`type\\`.`, where);\n return;\n }\n if (!SECTION_TYPE_RE.test(b.type)) {\n bag.err(\n \"schema.block.type.format\",\n `Block type \"${b.type}\" must match ${SECTION_TYPE_RE}.`,\n where,\n );\n }\n if (Array.isArray(b.settings)) {\n const seen = new Set<string>();\n b.settings.forEach((s, j) =>\n validateSettingInto(bag, s, `${where}.blocks[${i}].settings[${j}]`, seen),\n );\n }\n });\n }\n }\n return bag.result();\n}\n\n/**\n * Instance conformance: check a settings object (from a preset or a merchant\n * customization) against its section schema. Unknown keys warn (harmless at\n * runtime — ignored); invalid values (bad select option, out-of-range,\n * wrong primitive) error.\n */\nexport function validateSettingsAgainstSchema(\n settings: unknown,\n schema: Pick<SectionSchema, \"settings\" | \"type\">,\n pathPrefix = \"settings\",\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(settings)) {\n bag.err(\"instance.settings.invalid\", \"Section settings must be an object.\", pathPrefix);\n return bag.result();\n }\n const defs = Array.isArray(schema.settings) ? schema.settings : [];\n const byId = new Map<string, SettingDefinition>();\n for (const d of defs) if (isNonEmptyString(d?.id)) byId.set(d.id, d);\n\n for (const [key, value] of Object.entries(settings)) {\n const def = byId.get(key);\n if (!def) {\n bag.warn(\n \"instance.setting.unknown\",\n `Setting \"${key}\" is not declared in the \"${String(schema.type)}\" schema.`,\n `${pathPrefix}.${key}`,\n );\n continue;\n }\n if (value === null || value === undefined) continue;\n const p = `${pathPrefix}.${key}`;\n if ((def.type === \"select\" || def.type === \"radio\") && Array.isArray(def.options)) {\n const allowed = def.options.map((o) => o.value);\n if (typeof value === \"string\" && !allowed.includes(value)) {\n bag.err(\n \"instance.setting.option.invalid\",\n `\"${key}\" = \"${value}\" is not one of: ${allowed.join(\", \")}.`,\n p,\n );\n }\n }\n if (def.type === \"range\" && typeof value === \"number\") {\n if (typeof def.min === \"number\" && value < def.min) {\n bag.err(\"instance.setting.range.under\", `\"${key}\" = ${value} is below min ${def.min}.`, p);\n }\n if (typeof def.max === \"number\" && value > def.max) {\n bag.err(\"instance.setting.range.over\", `\"${key}\" = ${value} is above max ${def.max}.`, p);\n }\n }\n if ((def.type === \"checkbox\") && typeof value !== \"boolean\") {\n bag.warn(\"instance.setting.type.mismatch\", `\"${key}\" should be a boolean.`, p);\n }\n if ((def.type === \"number\" || def.type === \"range\") && typeof value !== \"number\") {\n bag.warn(\"instance.setting.type.mismatch\", `\"${key}\" should be a number.`, p);\n }\n }\n return bag.result();\n}\n\n// ── Manifest validation ───────────────────────────────────────────\n\n/** Core manifest field checks shared by source (theme.json) and built manifests. */\nfunction validateManifestCore(bag: IssueBag, m: Record<string, unknown>) {\n if (!isNonEmptyString(m.id)) {\n bag.err(\"manifest.id.missing\", \"theme.json is missing `id`.\", \"id\");\n } else if (!THEME_ID_RE.test(m.id)) {\n bag.err(\n \"manifest.id.format\",\n `Theme id \"${m.id}\" must be lowercase alphanumeric with dashes/underscores (no leading/trailing separator).`,\n \"id\",\n );\n }\n // name: string or bilingual object { en|default, ... }.\n const name = m.name;\n const nameOk =\n isNonEmptyString(name) ||\n (isObject(name) && Object.values(name).some((v) => isNonEmptyString(v)));\n if (!nameOk) {\n bag.err(\"manifest.name.missing\", \"theme.json is missing a non-empty `name`.\", \"name\");\n }\n if (!isNonEmptyString(m.version)) {\n bag.err(\"manifest.version.missing\", \"theme.json is missing `version`.\", \"version\");\n } else if (!SEMVER_RE.test(m.version)) {\n bag.err(\"manifest.version.invalid\", `Version \"${m.version}\" is not valid semver.`, \"version\");\n }\n if (!isNonEmptyString(m.author)) {\n bag.err(\"manifest.author.missing\", \"theme.json is missing `author`.\", \"author\");\n }\n if (m.min_sdk_version !== undefined && !SEMVER_RE.test(String(m.min_sdk_version))) {\n bag.warn(\"manifest.min_sdk_version.invalid\", \"`min_sdk_version` is not valid semver.\", \"min_sdk_version\");\n }\n}\n\n/**\n * Validate a source theme manifest (parsed theme.json).\n *\n * `ctx.sectionTypes` — the set of section types the theme actually ships\n * (from schemas/sections/*.json). When provided, every section type\n * referenced by a preset must be present, and missing required templates\n * are surfaced as warnings.\n */\nexport function validateManifest(\n manifest: unknown,\n ctx: { sectionTypes?: ReadonlySet<string> } = {},\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(manifest)) {\n bag.err(\"manifest.invalid\", \"theme.json must be a JSON object.\", \"theme.json\");\n return bag.result();\n }\n validateManifestCore(bag, manifest);\n\n const presets = manifest.presets;\n if (!isObject(presets) || Object.keys(presets).length === 0) {\n bag.warn(\"manifest.presets.empty\", \"theme.json has no presets — merchants start with an empty page.\", \"presets\");\n } else {\n // Every referenced section type must resolve to a shipped schema.\n if (ctx.sectionTypes) {\n for (const type of collectPresetSectionTypes(manifest)) {\n if (!ctx.sectionTypes.has(type)) {\n bag.err(\n \"manifest.preset.unknown_section\",\n `Preset references section type \"${type}\" with no schemas/sections/${type}.json.`,\n \"presets\",\n );\n }\n }\n }\n // Required-template coverage (warning).\n const templates = isObject(presets.templates) ? presets.templates : {};\n for (const t of REQUIRED_TEMPLATES) {\n if (!(t in templates)) {\n bag.warn(\n \"manifest.template.missing\",\n `No preset for required template \"${t}\" — the storefront will fall back to its built-in.`,\n `presets.templates.${t}`,\n );\n }\n }\n }\n return bag.result();\n}\n\n/**\n * Server-side gate: validate the artifacts the plugin emits — dist/manifest.json\n * (the embedded built manifest, including section_schemas) and dist/import-map.json\n * (the federation + contract-version descriptor). This is what the backend should\n * run on upload/submit, since it can't run the source build.\n *\n * `opts.hostContractVersion` — when given, refuses bundles whose\n * `contract_version` the host doesn't support.\n */\nexport function validateBuiltManifest(\n builtManifest: unknown,\n importMap?: unknown,\n opts: { hostContractVersion?: number } = {},\n): ValidationResult {\n const bag = new IssueBag();\n if (!isObject(builtManifest)) {\n bag.err(\"built.invalid\", \"manifest.json must be a JSON object.\", \"manifest.json\");\n return bag.result();\n }\n validateManifestCore(bag, builtManifest);\n\n // section_schemas must cover every type the presets reference.\n const schemas = builtManifest.section_schemas;\n const shipped = new Set<string>(isObject(schemas) ? Object.keys(schemas) : []);\n if (!isObject(schemas)) {\n bag.warn(\"built.section_schemas.missing\", \"manifest.json has no `section_schemas`.\", \"section_schemas\");\n }\n for (const type of collectPresetSectionTypes(builtManifest)) {\n if (!shipped.has(type)) {\n bag.err(\n \"built.preset.unknown_section\",\n `Preset references section type \"${type}\" not present in section_schemas.`,\n \"presets\",\n );\n }\n }\n // Each shipped schema must itself be valid.\n if (isObject(schemas)) {\n for (const [type, schema] of Object.entries(schemas)) {\n const r = validateSectionSchema(schema, { filenameType: type });\n for (const issue of r.issues) bag.issues.push(issue);\n }\n }\n if (!isNonEmptyString(builtManifest.plugin_version)) {\n bag.warn(\"built.plugin_version.missing\", \"manifest.json has no `plugin_version`.\", \"plugin_version\");\n }\n\n // Contract-version compatibility from the import map.\n if (importMap !== undefined) {\n if (!isObject(importMap)) {\n bag.err(\"importmap.invalid\", \"import-map.json must be a JSON object.\", \"import-map.json\");\n } else {\n const cv = importMap.contract_version;\n if (typeof cv !== \"number\") {\n bag.warn(\n \"importmap.contract_version.missing\",\n \"import-map.json has no numeric `contract_version` — built by an older plugin.\",\n \"contract_version\",\n );\n } else if (\n typeof opts.hostContractVersion === \"number\" &&\n cv > opts.hostContractVersion\n ) {\n bag.err(\n \"importmap.contract_version.incompatible\",\n `Theme built for contract v${cv}; this platform supports up to v${opts.hostContractVersion}.`,\n \"contract_version\",\n );\n }\n }\n }\n return bag.result();\n}\n\n/** Convenience: merge several results into one. */\nexport function mergeResults(...results: ValidationResult[]): ValidationResult {\n const issues = results.flatMap((r) => r.issues);\n return { valid: !issues.some((i) => i.level === \"error\"), issues };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkTBSNHHFH_cjs = require('./chunk-TBSNHHFH.cjs');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var chunk3ZJW5EIE_cjs = require('./chunk-3ZJW5EIE.cjs');
|
|
5
|
+
var chunkWNMFED3F_cjs = require('./chunk-WNMFED3F.cjs');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var client = require('react-dom/client');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -10,23 +10,23 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
10
10
|
// src/types/theme.ts
|
|
11
11
|
var MAX_BLOCK_DEPTH = 5;
|
|
12
12
|
function useProduct() {
|
|
13
|
-
const ctx = react.useContext(
|
|
13
|
+
const ctx = react.useContext(chunkWNMFED3F_cjs.ProductContext);
|
|
14
14
|
if (!ctx) throw new Error("useProduct must be used within ProductProvider");
|
|
15
15
|
return ctx;
|
|
16
16
|
}
|
|
17
17
|
function useProductOptional() {
|
|
18
|
-
return react.useContext(
|
|
18
|
+
return react.useContext(chunkWNMFED3F_cjs.ProductContext);
|
|
19
19
|
}
|
|
20
20
|
function useCollection() {
|
|
21
|
-
const ctx = react.useContext(
|
|
21
|
+
const ctx = react.useContext(chunkWNMFED3F_cjs.CollectionContext);
|
|
22
22
|
if (!ctx) throw new Error("useCollection must be used within CollectionProvider");
|
|
23
23
|
return ctx;
|
|
24
24
|
}
|
|
25
25
|
function useCollectionOptional() {
|
|
26
|
-
return react.useContext(
|
|
26
|
+
return react.useContext(chunkWNMFED3F_cjs.CollectionContext);
|
|
27
27
|
}
|
|
28
28
|
function useListingHeading(options = {}) {
|
|
29
|
-
const collection = react.useContext(
|
|
29
|
+
const collection = react.useContext(chunkWNMFED3F_cjs.CollectionContext);
|
|
30
30
|
const clean = (v) => typeof v === "string" && v.trim() !== "" ? v.trim() : "";
|
|
31
31
|
const collectionName = clean(collection?.name);
|
|
32
32
|
const collectionDescription = clean(
|
|
@@ -40,12 +40,12 @@ function useListingHeading(options = {}) {
|
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
function useCart() {
|
|
43
|
-
const ctx = react.useContext(
|
|
43
|
+
const ctx = react.useContext(chunkWNMFED3F_cjs.CartContext);
|
|
44
44
|
if (!ctx) throw new Error("useCart must be used within NuMuProvider");
|
|
45
45
|
return ctx;
|
|
46
46
|
}
|
|
47
47
|
function useCurrentTemplate() {
|
|
48
|
-
return react.useContext(
|
|
48
|
+
return react.useContext(chunkWNMFED3F_cjs.CurrentTemplateContext);
|
|
49
49
|
}
|
|
50
50
|
function isMetafield(value) {
|
|
51
51
|
return typeof value === "object" && value !== null && typeof value.namespace === "string" && typeof value.key === "string";
|
|
@@ -59,9 +59,9 @@ function pageMetafields(data) {
|
|
|
59
59
|
return [];
|
|
60
60
|
}
|
|
61
61
|
function useMetafields(owner) {
|
|
62
|
-
const product = react.useContext(
|
|
63
|
-
const collection = react.useContext(
|
|
64
|
-
const page = react.useContext(
|
|
62
|
+
const product = react.useContext(chunkWNMFED3F_cjs.ProductContext);
|
|
63
|
+
const collection = react.useContext(chunkWNMFED3F_cjs.CollectionContext);
|
|
64
|
+
const page = react.useContext(chunkWNMFED3F_cjs.PageContext);
|
|
65
65
|
switch (owner) {
|
|
66
66
|
case "product":
|
|
67
67
|
return product?.metafields ?? [];
|
|
@@ -78,7 +78,7 @@ function useMetafield(owner, namespace, key) {
|
|
|
78
78
|
return fields.find((m) => m.namespace === namespace && m.key === key) ?? null;
|
|
79
79
|
}
|
|
80
80
|
function pageData() {
|
|
81
|
-
return react.useContext(
|
|
81
|
+
return react.useContext(chunkWNMFED3F_cjs.PageContext)?.data;
|
|
82
82
|
}
|
|
83
83
|
function useBlogs() {
|
|
84
84
|
const data = pageData();
|
|
@@ -111,7 +111,7 @@ function useSectionOptional() {
|
|
|
111
111
|
}
|
|
112
112
|
var EMPTY = Object.freeze([]);
|
|
113
113
|
function useSectionGroup(group) {
|
|
114
|
-
const settings = react.useContext(
|
|
114
|
+
const settings = react.useContext(chunkWNMFED3F_cjs.ThemeSettingsContext);
|
|
115
115
|
return react.useMemo(() => {
|
|
116
116
|
const grp = settings?.section_groups?.[group];
|
|
117
117
|
if (!grp || !Array.isArray(grp.order) || grp.order.length === 0) {
|
|
@@ -128,8 +128,8 @@ function useSectionGroup(group) {
|
|
|
128
128
|
}, [settings, group]);
|
|
129
129
|
}
|
|
130
130
|
function useCurrency() {
|
|
131
|
-
const ctx = react.useContext(
|
|
132
|
-
const shop =
|
|
131
|
+
const ctx = react.useContext(chunkWNMFED3F_cjs.CurrencyContext);
|
|
132
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
133
133
|
const fallback = react.useMemo(() => {
|
|
134
134
|
const ccy = shop?.currency || "EGP";
|
|
135
135
|
return {
|
|
@@ -149,8 +149,8 @@ function useCurrency() {
|
|
|
149
149
|
|
|
150
150
|
// src/hooks/useMoney.ts
|
|
151
151
|
function useMoney(currencyOverride) {
|
|
152
|
-
const { formatMoney: formatMoney2 } =
|
|
153
|
-
const shop =
|
|
152
|
+
const { formatMoney: formatMoney2 } = chunkWNMFED3F_cjs.useLocalization();
|
|
153
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
154
154
|
const { selected, base, autoConvert, convert } = useCurrency();
|
|
155
155
|
return (amount) => {
|
|
156
156
|
const shouldConvert = autoConvert && !currencyOverride && !!selected && selected !== base;
|
|
@@ -198,7 +198,7 @@ function unwrap(json) {
|
|
|
198
198
|
return json;
|
|
199
199
|
}
|
|
200
200
|
function useOrders() {
|
|
201
|
-
const customer =
|
|
201
|
+
const customer = chunkWNMFED3F_cjs.useCustomer();
|
|
202
202
|
const [orders, setOrders] = react.useState([]);
|
|
203
203
|
const [loading, setLoading] = react.useState(false);
|
|
204
204
|
const [error, setError] = react.useState(null);
|
|
@@ -245,7 +245,7 @@ function useOrders() {
|
|
|
245
245
|
};
|
|
246
246
|
}
|
|
247
247
|
function useOrder(id) {
|
|
248
|
-
const customer =
|
|
248
|
+
const customer = chunkWNMFED3F_cjs.useCustomer();
|
|
249
249
|
const [order, setOrder] = react.useState(null);
|
|
250
250
|
const [loading, setLoading] = react.useState(false);
|
|
251
251
|
const [error, setError] = react.useState(null);
|
|
@@ -308,7 +308,7 @@ async function readBody(res) {
|
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
function useCustomerAddresses() {
|
|
311
|
-
const customer =
|
|
311
|
+
const customer = chunkWNMFED3F_cjs.useCustomer();
|
|
312
312
|
const [addresses, setAddresses] = react.useState([]);
|
|
313
313
|
const [loading, setLoading] = react.useState(false);
|
|
314
314
|
const [error, setError] = react.useState(null);
|
|
@@ -471,8 +471,8 @@ function toNavigationItem(raw, locale) {
|
|
|
471
471
|
};
|
|
472
472
|
}
|
|
473
473
|
function useNavigation(handle, options) {
|
|
474
|
-
const navMap = react.useContext(
|
|
475
|
-
const localization = react.useContext(
|
|
474
|
+
const navMap = react.useContext(chunkWNMFED3F_cjs.NavigationContext);
|
|
475
|
+
const localization = react.useContext(chunkWNMFED3F_cjs.LocalizationContext);
|
|
476
476
|
const locale = localization?.locale ?? "en";
|
|
477
477
|
const hostProvidedAny = !!navMap && Object.keys(navMap).length > 0;
|
|
478
478
|
const rawItems = handle ? navMap?.[handle] : void 0;
|
|
@@ -667,9 +667,11 @@ function dispatchAnalyticsEvent(eventName, payload = {}) {
|
|
|
667
667
|
}
|
|
668
668
|
const step = EVENT_TO_FUNNEL_STEP[eventName] ?? null;
|
|
669
669
|
const customerId = readCustomerId();
|
|
670
|
+
const pageUrl = typeof window !== "undefined" ? window.location.href : void 0;
|
|
670
671
|
const body = step ? {
|
|
671
672
|
event_id: eventId,
|
|
672
673
|
path: window.location.pathname,
|
|
674
|
+
page_url: pageUrl,
|
|
673
675
|
fingerprint: getFingerprint(),
|
|
674
676
|
step,
|
|
675
677
|
step_data: payload,
|
|
@@ -680,6 +682,7 @@ function dispatchAnalyticsEvent(eventName, payload = {}) {
|
|
|
680
682
|
event: eventName,
|
|
681
683
|
payload,
|
|
682
684
|
event_id: eventId,
|
|
685
|
+
page_url: pageUrl,
|
|
683
686
|
ts: Date.now(),
|
|
684
687
|
attribution: readAttribution() ?? void 0,
|
|
685
688
|
customer_id: customerId ?? void 0
|
|
@@ -878,7 +881,7 @@ function useCachedResource(key, fetcher, options) {
|
|
|
878
881
|
|
|
879
882
|
// src/hooks/useApp.ts
|
|
880
883
|
function useApp(slug) {
|
|
881
|
-
const shop =
|
|
884
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
882
885
|
const key = slug ? `numu:app:${shop.id}:${slug}` : "";
|
|
883
886
|
const fetcher = react.useCallback(
|
|
884
887
|
async (signal) => {
|
|
@@ -1153,7 +1156,7 @@ function offerBeatsRegularPrice(offer, unitPriceMajor) {
|
|
|
1153
1156
|
function useProductSizeChart(productOverride) {
|
|
1154
1157
|
const ctxProduct = useProductOptional();
|
|
1155
1158
|
const product = productOverride ?? ctxProduct;
|
|
1156
|
-
const shop =
|
|
1159
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
1157
1160
|
const storeSettings = shop?.settings;
|
|
1158
1161
|
return react.useMemo(
|
|
1159
1162
|
() => resolveSizeChart(product?.attributes, storeSettings),
|
|
@@ -2214,13 +2217,13 @@ function NuMuProvider({
|
|
|
2214
2217
|
convertCurrency
|
|
2215
2218
|
]
|
|
2216
2219
|
);
|
|
2217
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2220
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.ShopContext.Provider, { value: store, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.ThemeSettingsContext.Provider, { value: themeSettings, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.CurrentTemplateContext.Provider, { value: currentTemplate, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.PageContext.Provider, { value: pageValue, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.LocalizationContext.Provider, { value: localization, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.CurrencyContext.Provider, { value: currencyValue, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.CartContext.Provider, { value: cartValue, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.CustomerContext.Provider, { value: customerState, children: /* @__PURE__ */ jsxRuntime.jsx(CustomerActionsContext.Provider, { value: customerActions, children: /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.NavigationContext.Provider, { value: navigation ?? {}, children }) }) }) }) }) }) }) }) }) });
|
|
2218
2221
|
}
|
|
2219
2222
|
function ProductProvider({ product, children }) {
|
|
2220
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2223
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.ProductContext.Provider, { value: product, children });
|
|
2221
2224
|
}
|
|
2222
2225
|
function CollectionProvider({ collection, children }) {
|
|
2223
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2226
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkWNMFED3F_cjs.CollectionContext.Provider, { value: collection, children });
|
|
2224
2227
|
}
|
|
2225
2228
|
|
|
2226
2229
|
// src/utils/logoStyle.ts
|
|
@@ -2559,8 +2562,8 @@ function Money({
|
|
|
2559
2562
|
className,
|
|
2560
2563
|
as = "span"
|
|
2561
2564
|
}) {
|
|
2562
|
-
const { formatMoney: formatMoney2 } =
|
|
2563
|
-
const shop =
|
|
2565
|
+
const { formatMoney: formatMoney2 } = chunkWNMFED3F_cjs.useLocalization();
|
|
2566
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
2564
2567
|
const { selected, base, autoConvert, convert } = useCurrency();
|
|
2565
2568
|
const shouldConvert = autoConvert && !currency && !!selected && selected !== base;
|
|
2566
2569
|
const ccy = shouldConvert ? selected : currency || shop?.currency;
|
|
@@ -2607,16 +2610,20 @@ function applyImageTransform(t, fit = "cover") {
|
|
|
2607
2610
|
return style;
|
|
2608
2611
|
}
|
|
2609
2612
|
var clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
2613
|
+
function hostHonorsCropParams() {
|
|
2614
|
+
return globalThis.__NUMU_CF_IMAGE_RESIZING__ === true;
|
|
2615
|
+
}
|
|
2610
2616
|
function focalSrc(url, options = {}) {
|
|
2611
2617
|
if (!url) return "";
|
|
2612
2618
|
if (url.startsWith("data:") || /[?&](fp-x|fp-y)=/.test(url)) return url;
|
|
2619
|
+
const crop = hostHonorsCropParams();
|
|
2613
2620
|
const p = new URLSearchParams();
|
|
2614
2621
|
p.set("url", url);
|
|
2615
2622
|
if (options.width) p.set("w", String(Math.round(options.width)));
|
|
2616
|
-
if (options.focal?.x != null) p.set("fp-x", String(clamp01(options.focal.x)));
|
|
2617
|
-
if (options.focal?.y != null) p.set("fp-y", String(clamp01(options.focal.y)));
|
|
2618
|
-
if (options.aspect) p.set("ar", options.aspect);
|
|
2619
|
-
if (options.fit) p.set("fit", options.fit);
|
|
2623
|
+
if (crop && options.focal?.x != null) p.set("fp-x", String(clamp01(options.focal.x)));
|
|
2624
|
+
if (crop && options.focal?.y != null) p.set("fp-y", String(clamp01(options.focal.y)));
|
|
2625
|
+
if (crop && options.aspect) p.set("ar", options.aspect);
|
|
2626
|
+
if (crop && options.fit) p.set("fit", options.fit);
|
|
2620
2627
|
if (options.quality) p.set("q", String(Math.min(100, Math.max(1, Math.round(options.quality)))));
|
|
2621
2628
|
if (options.format) p.set("f", options.format.toLowerCase());
|
|
2622
2629
|
return `/api/image-transform?${p.toString()}`;
|
|
@@ -2827,8 +2834,8 @@ function Logo({
|
|
|
2827
2834
|
style,
|
|
2828
2835
|
fallback
|
|
2829
2836
|
}) {
|
|
2830
|
-
const settings =
|
|
2831
|
-
const shop =
|
|
2837
|
+
const settings = chunkWNMFED3F_cjs.useThemeSettings();
|
|
2838
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
2832
2839
|
const g = settings?.global_settings ?? {};
|
|
2833
2840
|
const url = str(src) || str(g.logo_url) || shop?.logo_url || "";
|
|
2834
2841
|
const resolvedShape = shape || str(g.logo_shape) || "none";
|
|
@@ -2864,7 +2871,7 @@ function requestNavigate(href) {
|
|
|
2864
2871
|
return !window.dispatchEvent(event);
|
|
2865
2872
|
}
|
|
2866
2873
|
function Link({ to, children, onClick, ...rest }) {
|
|
2867
|
-
const shop =
|
|
2874
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
2868
2875
|
const isAbsolute = ABSOLUTE_URL.test(to);
|
|
2869
2876
|
let href = to;
|
|
2870
2877
|
if (!isAbsolute && shop && !to.startsWith("/")) {
|
|
@@ -3443,8 +3450,8 @@ function LocaleSwitcher({
|
|
|
3443
3450
|
onSelect,
|
|
3444
3451
|
render
|
|
3445
3452
|
}) {
|
|
3446
|
-
const shop =
|
|
3447
|
-
const { locale } =
|
|
3453
|
+
const shop = chunkWNMFED3F_cjs.useShop();
|
|
3454
|
+
const { locale } = chunkWNMFED3F_cjs.useLocalization();
|
|
3448
3455
|
const available = shop.available_locales || [];
|
|
3449
3456
|
const list = available.length > 0 ? available : shop.default_language === "en" ? ["en"] : Array.from(/* @__PURE__ */ new Set([shop.default_language, "en"]));
|
|
3450
3457
|
const labelFor = react.useCallback((code) => {
|
|
@@ -3862,9 +3869,9 @@ function resolveSettingsMap(settings, ctx) {
|
|
|
3862
3869
|
return out;
|
|
3863
3870
|
}
|
|
3864
3871
|
function useResolvedSettings(instance) {
|
|
3865
|
-
const product = react.useContext(
|
|
3866
|
-
const collection = react.useContext(
|
|
3867
|
-
const store = react.useContext(
|
|
3872
|
+
const product = react.useContext(chunkWNMFED3F_cjs.ProductContext);
|
|
3873
|
+
const collection = react.useContext(chunkWNMFED3F_cjs.CollectionContext);
|
|
3874
|
+
const store = react.useContext(chunkWNMFED3F_cjs.ShopContext);
|
|
3868
3875
|
const ctx = react.useMemo(
|
|
3869
3876
|
() => ({ product, collection, store }),
|
|
3870
3877
|
[product, collection, store]
|
|
@@ -4088,131 +4095,131 @@ Object.defineProperty(exports, "resolveThemeSettings", {
|
|
|
4088
4095
|
});
|
|
4089
4096
|
Object.defineProperty(exports, "KNOWN_SETTING_TYPES", {
|
|
4090
4097
|
enumerable: true,
|
|
4091
|
-
get: function () { return
|
|
4098
|
+
get: function () { return chunk3ZJW5EIE_cjs.KNOWN_SETTING_TYPES; }
|
|
4092
4099
|
});
|
|
4093
4100
|
Object.defineProperty(exports, "KNOWN_TEMPLATES", {
|
|
4094
4101
|
enumerable: true,
|
|
4095
|
-
get: function () { return
|
|
4102
|
+
get: function () { return chunk3ZJW5EIE_cjs.KNOWN_TEMPLATES; }
|
|
4096
4103
|
});
|
|
4097
4104
|
Object.defineProperty(exports, "REQUIRED_TEMPLATES", {
|
|
4098
4105
|
enumerable: true,
|
|
4099
|
-
get: function () { return
|
|
4106
|
+
get: function () { return chunk3ZJW5EIE_cjs.REQUIRED_TEMPLATES; }
|
|
4100
4107
|
});
|
|
4101
4108
|
Object.defineProperty(exports, "SDK_VERSION", {
|
|
4102
4109
|
enumerable: true,
|
|
4103
|
-
get: function () { return
|
|
4110
|
+
get: function () { return chunk3ZJW5EIE_cjs.SDK_VERSION; }
|
|
4104
4111
|
});
|
|
4105
4112
|
Object.defineProperty(exports, "THEME_CONTRACT_VERSION", {
|
|
4106
4113
|
enumerable: true,
|
|
4107
|
-
get: function () { return
|
|
4114
|
+
get: function () { return chunk3ZJW5EIE_cjs.THEME_CONTRACT_VERSION; }
|
|
4108
4115
|
});
|
|
4109
4116
|
Object.defineProperty(exports, "mergeResults", {
|
|
4110
4117
|
enumerable: true,
|
|
4111
|
-
get: function () { return
|
|
4118
|
+
get: function () { return chunk3ZJW5EIE_cjs.mergeResults; }
|
|
4112
4119
|
});
|
|
4113
4120
|
Object.defineProperty(exports, "validateBuiltManifest", {
|
|
4114
4121
|
enumerable: true,
|
|
4115
|
-
get: function () { return
|
|
4122
|
+
get: function () { return chunk3ZJW5EIE_cjs.validateBuiltManifest; }
|
|
4116
4123
|
});
|
|
4117
4124
|
Object.defineProperty(exports, "validateManifest", {
|
|
4118
4125
|
enumerable: true,
|
|
4119
|
-
get: function () { return
|
|
4126
|
+
get: function () { return chunk3ZJW5EIE_cjs.validateManifest; }
|
|
4120
4127
|
});
|
|
4121
4128
|
Object.defineProperty(exports, "validateSectionSchema", {
|
|
4122
4129
|
enumerable: true,
|
|
4123
|
-
get: function () { return
|
|
4130
|
+
get: function () { return chunk3ZJW5EIE_cjs.validateSectionSchema; }
|
|
4124
4131
|
});
|
|
4125
4132
|
Object.defineProperty(exports, "validateSettingsAgainstSchema", {
|
|
4126
4133
|
enumerable: true,
|
|
4127
|
-
get: function () { return
|
|
4134
|
+
get: function () { return chunk3ZJW5EIE_cjs.validateSettingsAgainstSchema; }
|
|
4128
4135
|
});
|
|
4129
4136
|
Object.defineProperty(exports, "CartContext", {
|
|
4130
4137
|
enumerable: true,
|
|
4131
|
-
get: function () { return
|
|
4138
|
+
get: function () { return chunkWNMFED3F_cjs.CartContext; }
|
|
4132
4139
|
});
|
|
4133
4140
|
Object.defineProperty(exports, "CollectionContext", {
|
|
4134
4141
|
enumerable: true,
|
|
4135
|
-
get: function () { return
|
|
4142
|
+
get: function () { return chunkWNMFED3F_cjs.CollectionContext; }
|
|
4136
4143
|
});
|
|
4137
4144
|
Object.defineProperty(exports, "CurrencyContext", {
|
|
4138
4145
|
enumerable: true,
|
|
4139
|
-
get: function () { return
|
|
4146
|
+
get: function () { return chunkWNMFED3F_cjs.CurrencyContext; }
|
|
4140
4147
|
});
|
|
4141
4148
|
Object.defineProperty(exports, "CustomerContext", {
|
|
4142
4149
|
enumerable: true,
|
|
4143
|
-
get: function () { return
|
|
4150
|
+
get: function () { return chunkWNMFED3F_cjs.CustomerContext; }
|
|
4144
4151
|
});
|
|
4145
4152
|
Object.defineProperty(exports, "LocalizationContext", {
|
|
4146
4153
|
enumerable: true,
|
|
4147
|
-
get: function () { return
|
|
4154
|
+
get: function () { return chunkWNMFED3F_cjs.LocalizationContext; }
|
|
4148
4155
|
});
|
|
4149
4156
|
Object.defineProperty(exports, "NavigationContext", {
|
|
4150
4157
|
enumerable: true,
|
|
4151
|
-
get: function () { return
|
|
4158
|
+
get: function () { return chunkWNMFED3F_cjs.NavigationContext; }
|
|
4152
4159
|
});
|
|
4153
4160
|
Object.defineProperty(exports, "PageContext", {
|
|
4154
4161
|
enumerable: true,
|
|
4155
|
-
get: function () { return
|
|
4162
|
+
get: function () { return chunkWNMFED3F_cjs.PageContext; }
|
|
4156
4163
|
});
|
|
4157
4164
|
Object.defineProperty(exports, "ProductContext", {
|
|
4158
4165
|
enumerable: true,
|
|
4159
|
-
get: function () { return
|
|
4166
|
+
get: function () { return chunkWNMFED3F_cjs.ProductContext; }
|
|
4160
4167
|
});
|
|
4161
4168
|
Object.defineProperty(exports, "ShopContext", {
|
|
4162
4169
|
enumerable: true,
|
|
4163
|
-
get: function () { return
|
|
4170
|
+
get: function () { return chunkWNMFED3F_cjs.ShopContext; }
|
|
4164
4171
|
});
|
|
4165
4172
|
Object.defineProperty(exports, "ThemeSettingsContext", {
|
|
4166
4173
|
enumerable: true,
|
|
4167
|
-
get: function () { return
|
|
4174
|
+
get: function () { return chunkWNMFED3F_cjs.ThemeSettingsContext; }
|
|
4168
4175
|
});
|
|
4169
4176
|
Object.defineProperty(exports, "useCollections", {
|
|
4170
4177
|
enumerable: true,
|
|
4171
|
-
get: function () { return
|
|
4178
|
+
get: function () { return chunkWNMFED3F_cjs.useCollections; }
|
|
4172
4179
|
});
|
|
4173
4180
|
Object.defineProperty(exports, "useCustomer", {
|
|
4174
4181
|
enumerable: true,
|
|
4175
|
-
get: function () { return
|
|
4182
|
+
get: function () { return chunkWNMFED3F_cjs.useCustomer; }
|
|
4176
4183
|
});
|
|
4177
4184
|
Object.defineProperty(exports, "useDirection", {
|
|
4178
4185
|
enumerable: true,
|
|
4179
|
-
get: function () { return
|
|
4186
|
+
get: function () { return chunkWNMFED3F_cjs.useDirection; }
|
|
4180
4187
|
});
|
|
4181
4188
|
Object.defineProperty(exports, "useFieldTranslation", {
|
|
4182
4189
|
enumerable: true,
|
|
4183
|
-
get: function () { return
|
|
4190
|
+
get: function () { return chunkWNMFED3F_cjs.useFieldTranslation; }
|
|
4184
4191
|
});
|
|
4185
4192
|
Object.defineProperty(exports, "useLocale", {
|
|
4186
4193
|
enumerable: true,
|
|
4187
|
-
get: function () { return
|
|
4194
|
+
get: function () { return chunkWNMFED3F_cjs.useLocale; }
|
|
4188
4195
|
});
|
|
4189
4196
|
Object.defineProperty(exports, "useLocalization", {
|
|
4190
4197
|
enumerable: true,
|
|
4191
|
-
get: function () { return
|
|
4198
|
+
get: function () { return chunkWNMFED3F_cjs.useLocalization; }
|
|
4192
4199
|
});
|
|
4193
4200
|
Object.defineProperty(exports, "useNumberFormat", {
|
|
4194
4201
|
enumerable: true,
|
|
4195
|
-
get: function () { return
|
|
4202
|
+
get: function () { return chunkWNMFED3F_cjs.useNumberFormat; }
|
|
4196
4203
|
});
|
|
4197
4204
|
Object.defineProperty(exports, "usePage", {
|
|
4198
4205
|
enumerable: true,
|
|
4199
|
-
get: function () { return
|
|
4206
|
+
get: function () { return chunkWNMFED3F_cjs.usePage; }
|
|
4200
4207
|
});
|
|
4201
4208
|
Object.defineProperty(exports, "useProducts", {
|
|
4202
4209
|
enumerable: true,
|
|
4203
|
-
get: function () { return
|
|
4210
|
+
get: function () { return chunkWNMFED3F_cjs.useProducts; }
|
|
4204
4211
|
});
|
|
4205
4212
|
Object.defineProperty(exports, "useShop", {
|
|
4206
4213
|
enumerable: true,
|
|
4207
|
-
get: function () { return
|
|
4214
|
+
get: function () { return chunkWNMFED3F_cjs.useShop; }
|
|
4208
4215
|
});
|
|
4209
4216
|
Object.defineProperty(exports, "useThemeSettings", {
|
|
4210
4217
|
enumerable: true,
|
|
4211
|
-
get: function () { return
|
|
4218
|
+
get: function () { return chunkWNMFED3F_cjs.useThemeSettings; }
|
|
4212
4219
|
});
|
|
4213
4220
|
Object.defineProperty(exports, "useTranslation", {
|
|
4214
4221
|
enumerable: true,
|
|
4215
|
-
get: function () { return
|
|
4222
|
+
get: function () { return chunkWNMFED3F_cjs.useTranslation; }
|
|
4216
4223
|
});
|
|
4217
4224
|
exports.AddToCartButton = AddToCartButton;
|
|
4218
4225
|
exports.Block = Block;
|