@spiffcommerce/theme-bridge 1.27.0 → 1.27.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/plugin.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./configurationTypes-Bt8NVGKp.cjs"),f=require("fs"),m=require("path"),y="1.27.0",h={version:y};function g(i,e,r){return e.type==="chunk"?(console.log(`chunk ${i} isEntry: ${e.isEntry}, isDynamicEntry: ${e.isDynamicEntry}, isImplicitEntry: ${e.isImplicitEntry}`),!e.isEntry&&!r?null:{type:u.ThemeFileType.Javascript,mimeType:"text/javascript",preload:!e.isEntry,filename:i}):i.endsWith(".css")?{type:u.ThemeFileType.CSS,mimeType:"text/css",filename:i}:null}function v(i){const{autoGenerateTargetFiles:e=!0,configurationSchema:r,includePreloadChunks:l=!1,targetFiles:s}=i??{};return{name:"spiff-theme-plugin",version:h.version,config(n,o){n.base!==void 0&&n.base!==""&&console.warn('You have specified a `base` in your vite configuration other than "". This value will now be overwritten.'),n.base=""},writeBundle(n,o){const a=e?Object.keys(o).map(t=>s?.some(p=>p.filename===t)?null:g(t,o[t],l)).filter(t=>t!==null):[];s&&a.push(...s);const c={launchData:{targetFiles:a},configurationSchema:r};f.writeFileSync(m.join(n.dir,"spiffTheme.json"),JSON.stringify(c,void 0,4))}}}exports.spiffThemePlugin=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./configurationTypes-Bt8NVGKp.cjs"),m=require("fs"),y=require("path"),S="1.27.1-alpha.1",b={version:S};function v(r,s,n){return s.type==="chunk"?(console.log(`chunk ${r} isEntry: ${s.isEntry}, isDynamicEntry: ${s.isDynamicEntry}, isImplicitEntry: ${s.isImplicitEntry}`),!s.isEntry&&!n?null:{type:l.ThemeFileType.Javascript,mimeType:"text/javascript",preload:!s.isEntry,filename:r}):r.endsWith(".css")?{type:l.ThemeFileType.CSS,mimeType:"text/css",filename:r}:null}function E(r){const{autoGenerateTargetFiles:s=!0,configurationSchema:n,pageSettings:e,includePreloadChunks:i=!1,targetFiles:t}=r??{};return{name:"spiff-theme-plugin",version:b.version,config(a,o){a.base!==void 0&&a.base!==""&&console.warn('You have specified a `base` in your vite configuration other than "". This value will now be overwritten.'),a.base=""},writeBundle(a,o){if(n&&e){const c=T(n,e);if(c.hasErrors)throw new Error(`Theme pages validation failed: ${JSON.stringify(c)}`)}const u=s?Object.keys(o).map(c=>t?.some(d=>d.filename===c)?null:v(c,o[c],i)).filter(c=>c!==null):[];t&&u.push(...t);const p={launchData:{targetFiles:u},configurationSchema:n,pageSettings:e};m.writeFileSync(y.join(a.dir,"spiffTheme.json"),JSON.stringify(p,void 0,4))}}}function T(r,s){const n=new Map(r.customSchemas?.map(t=>[t.name,t])??[]),e={pages:s.items.map(t=>({sections:t.sections.map(()=>({}))})),hasErrors:!1},i=new Map(s.items.map(t=>[t.key,t]));s.reorderablePageSettings&&(s.reorderablePageSettings.start?i.get(s.reorderablePageSettings.start)||(e.errors=f(e.errors,"reorderablePageSettings.start references page which does not exist"),e.hasErrors=!0):(e.errors=f(e.errors,"reorderablePageSettings.start is not set"),e.hasErrors=!0),s.reorderablePageSettings.end?i.get(s.reorderablePageSettings.end)||(e.errors=f(e.errors,"reorderablePageSettings.end references page which does not exist"),e.hasErrors=!0):(e.errors=f(e.errors,"reorderablePageSettings.end is not set"),e.hasErrors=!0));for(let t=0;t<s.items.length;t++){const a=s.items[t];a.key||(e.pages[t].pageErrors=f(e.pages[t].pageErrors,"missing key"),e.hasErrors=!0);for(let o=0;o<a.sections.length;o++){const u=a.sections[o];for(const p of u.fields){const c=w(r.fields,p,n);typeof c=="string"&&(e.pages[t].sections[o].errors=f(e.pages[t].sections[o].errors,c),e.hasErrors=!0)}}}return e}function f(r,s){return[...r??[],s]}function w(r,s,n){const e=s.split(".");let i;const t=[];for(const a of e)if(t.push(a),i){const o=$(i,a,n);if(typeof o=="string")return`error at path ${t.join(".")}: ${o}`;i=o}else{const o=h(r,a);if(!o)return`unknown root field ${a}`;i=o}return i||"provided path was empty"}function $(r,s,n){if(r.type===l.FieldType.Heading)return`heading field ${r.title} is not a type which has nested properties`;if(r.type!==l.FieldType.Object)return`field ${r.key}, of type ${r.type}, is not a type which has nested properties`;let e=[];if(r.schema){const t=g(r.schema,n);if(typeof t=="string")return`object field ${r.key} has schema errors: ${t}`}else{if(r.schema!==void 0)return`object field ${r.key} references schema via empty string`;e=r.fields}const i=h(e,s);return i||`object field ${r.key} has no property ${s}`}function h(r,s){return r.find(n=>n.type!==l.FieldType.Heading&&n.key===s)}function g(r,s){const n=s.get(r);if(!n)return`unknown schema ${r}`;let e=[];if(n.type===l.CustomSchemaType.Union)for(const i of n.schemas){const t=g(i,s);if(typeof t=="string")return t;e=[...e,...t]}else{if(n.extends)for(const i of n.extends){const t=g(i,s);if(typeof t=="string")return t;e=[...e,...t]}e=[...e,...n.fields]}return e}exports.spiffThemePlugin=E;
2
2
  //# sourceMappingURL=plugin.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","sources":["../src/rollup.ts"],"sourcesContent":["import {\n ThemeConfigurationFile,\n ThemeConfigurationLaunchDataTargetFile,\n ThemeConfigurationSchema,\n ThemeFileType,\n} from \"./configurationTypes\";\nimport { Plugin } from \"vite\";\nimport { OutputAsset, OutputChunk } from \"rollup\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport pkg from \"../package.json\";\n\nfunction mapFile(key: string, file: OutputAsset | OutputChunk, includePreload: boolean) {\n if (file.type === \"chunk\") {\n console.log(\n `chunk ${key} isEntry: ${file.isEntry}, isDynamicEntry: ${file.isDynamicEntry}, isImplicitEntry: ${file.isImplicitEntry}`,\n );\n if (!file.isEntry && !includePreload) {\n return null;\n }\n return {\n type: ThemeFileType.Javascript,\n mimeType: \"text/javascript\",\n preload: !file.isEntry,\n filename: key,\n };\n } else {\n if (key.endsWith(\".css\")) {\n return {\n type: ThemeFileType.CSS,\n mimeType: \"text/css\",\n filename: key,\n };\n }\n }\n return null;\n}\n\ninterface PluginOptions {\n /**\n * When `true`, will automatically insert files from the build into the `launchData.targetFiles` field.\n * @default true\n */\n autoGenerateTargetFiles?: boolean;\n /**\n * A configuration schema to allow installs to customize your theme.\n * @default undefined\n */\n configurationSchema?: ThemeConfigurationSchema;\n /**\n * Generates `targetFiles` entries with preload set to true. Only applies when `autoGenerateTargetFiles` is set to true.\n * By default this will only include the primary entry file(s).\n * @default false\n */\n includePreloadChunks?: boolean;\n /**\n * Manually add/override specific files.\n * @default undefined\n */\n targetFiles?: ThemeConfigurationLaunchDataTargetFile[];\n}\n\n/**\n * Automatically generates a `spiffTheme.json` file in your output directory.\n * @param opts Options to customize the generated file.\n */\nexport function spiffThemePlugin(opts?: PluginOptions): Plugin {\n const {\n autoGenerateTargetFiles = true,\n configurationSchema,\n includePreloadChunks = false,\n targetFiles,\n } = opts ?? ({} as PluginOptions);\n return {\n name: \"spiff-theme-plugin\",\n version: pkg.version,\n config(config, _env) {\n if (config.base !== undefined && config.base !== \"\") {\n console.warn(\n 'You have specified a `base` in your vite configuration other than \"\". This value will now be overwritten.',\n );\n }\n config.base = \"\";\n },\n writeBundle(this, options, bundle) {\n const files = autoGenerateTargetFiles\n ? (Object.keys(bundle)\n .map((key) => {\n // Override files will be included manually after\n if (targetFiles?.some((file) => file.filename === key)) {\n return null;\n }\n return mapFile(key, bundle[key], includePreloadChunks);\n })\n .filter((x) => x !== null) as ThemeConfigurationLaunchDataTargetFile[])\n : [];\n if (targetFiles) {\n files.push(...targetFiles);\n }\n const config: ThemeConfigurationFile = {\n launchData: {\n targetFiles: files,\n },\n configurationSchema: configurationSchema,\n };\n fs.writeFileSync(path.join(options.dir!, \"spiffTheme.json\"), JSON.stringify(config, undefined, 4));\n },\n };\n}\n"],"names":["mapFile","key","file","includePreload","ThemeFileType","spiffThemePlugin","opts","autoGenerateTargetFiles","configurationSchema","includePreloadChunks","targetFiles","pkg","config","_env","options","bundle","files","x","fs","path"],"mappings":"gMAYA,SAASA,EAAQC,EAAaC,EAAiCC,EAAyB,CACpF,OAAID,EAAK,OAAS,SACd,QAAQ,IACJ,SAASD,CAAG,aAAaC,EAAK,OAAO,qBAAqBA,EAAK,cAAc,sBAAsBA,EAAK,eAAe,EAAA,EAEvH,CAACA,EAAK,SAAW,CAACC,EACX,KAEJ,CACH,KAAMC,EAAAA,cAAc,WACpB,SAAU,kBACV,QAAS,CAACF,EAAK,QACf,SAAUD,CAAA,GAGVA,EAAI,SAAS,MAAM,EACZ,CACH,KAAMG,EAAAA,cAAc,IACpB,SAAU,WACV,SAAUH,CAAA,EAIf,IACX,CA8BO,SAASI,EAAiBC,EAA8B,CAC3D,KAAM,CACF,wBAAAC,EAA0B,GAC1B,oBAAAC,EACA,qBAAAC,EAAuB,GACvB,YAAAC,CAAA,EACAJ,GAAS,CAAA,EACb,MAAO,CACH,KAAM,qBACN,QAASK,EAAI,QACb,OAAOC,EAAQC,EAAM,CACbD,EAAO,OAAS,QAAaA,EAAO,OAAS,IAC7C,QAAQ,KACJ,2GAAA,EAGRA,EAAO,KAAO,EAClB,EACA,YAAkBE,EAASC,EAAQ,CAC/B,MAAMC,EAAQT,EACP,OAAO,KAAKQ,CAAM,EACd,IAAKd,GAEES,GAAa,KAAMR,GAASA,EAAK,WAAaD,CAAG,EAC1C,KAEJD,EAAQC,EAAKc,EAAOd,CAAG,EAAGQ,CAAoB,CACxD,EACA,OAAQQ,GAAMA,IAAM,IAAI,EAC7B,CAAA,EACFP,GACAM,EAAM,KAAK,GAAGN,CAAW,EAE7B,MAAME,EAAiC,CACnC,WAAY,CACR,YAAaI,CAAA,EAEjB,oBAAAR,CAAA,EAEJU,EAAG,cAAcC,EAAK,KAAKL,EAAQ,IAAM,iBAAiB,EAAG,KAAK,UAAUF,EAAQ,OAAW,CAAC,CAAC,CACrG,CAAA,CAER"}
1
+ {"version":3,"file":"plugin.cjs","sources":["../src/rollup.ts"],"sourcesContent":["import {\n CustomSchemaType,\n FieldType,\n ThemeConfigurationFile,\n ThemeConfigurationLaunchDataTargetFile,\n ThemeConfigurationPageItem,\n ThemeConfigurationPageSettings,\n ThemeConfigurationSchema,\n ThemeConfigurationSchemaCustomSchema,\n ThemeConfigurationSchemaField,\n ThemeFileType,\n} from \"./configurationTypes\";\nimport { Plugin } from \"vite\";\nimport { OutputAsset, OutputChunk } from \"rollup\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport pkg from \"../package.json\";\n\nfunction mapFile(key: string, file: OutputAsset | OutputChunk, includePreload: boolean) {\n if (file.type === \"chunk\") {\n console.log(\n `chunk ${key} isEntry: ${file.isEntry}, isDynamicEntry: ${file.isDynamicEntry}, isImplicitEntry: ${file.isImplicitEntry}`,\n );\n if (!file.isEntry && !includePreload) {\n return null;\n }\n return {\n type: ThemeFileType.Javascript,\n mimeType: \"text/javascript\",\n preload: !file.isEntry,\n filename: key,\n };\n } else {\n if (key.endsWith(\".css\")) {\n return {\n type: ThemeFileType.CSS,\n mimeType: \"text/css\",\n filename: key,\n };\n }\n }\n return null;\n}\n\nexport interface PluginOptions {\n /**\n * When `true`, will automatically insert files from the build into the `launchData.targetFiles` field.\n * @default true\n */\n autoGenerateTargetFiles?: boolean;\n /**\n * A configuration schema to allow installs to customize your theme.\n * @default undefined\n */\n configurationSchema?: ThemeConfigurationSchema;\n /**\n * Options for changing how your theme configuration is displayed to users.\n * This is ignored if `configurationSchema` is not provided.\n * @default undefined.\n */\n pageSettings?: ThemeConfigurationPageSettings;\n /**\n * Generates `targetFiles` entries with preload set to true. Only applies when `autoGenerateTargetFiles` is set to true.\n * By default this will only include the primary entry file(s).\n * @default false\n */\n includePreloadChunks?: boolean;\n /**\n * Manually add/override specific files.\n * @default undefined\n */\n targetFiles?: ThemeConfigurationLaunchDataTargetFile[];\n}\n\n/**\n * Automatically generates a `spiffTheme.json` file in your output directory.\n * @param opts Options to customize the generated file.\n */\nexport function spiffThemePlugin(opts?: PluginOptions): Plugin {\n const {\n autoGenerateTargetFiles = true,\n configurationSchema,\n pageSettings: pages,\n includePreloadChunks = false,\n targetFiles,\n } = opts ?? ({} as PluginOptions);\n return {\n name: \"spiff-theme-plugin\",\n version: pkg.version,\n config(config, _env) {\n if (config.base !== undefined && config.base !== \"\") {\n console.warn(\n 'You have specified a `base` in your vite configuration other than \"\". This value will now be overwritten.',\n );\n }\n config.base = \"\";\n },\n writeBundle(this, options, bundle) {\n if (configurationSchema && pages) {\n const validationResult = validateThemePages(configurationSchema, pages);\n if (validationResult.hasErrors) {\n throw new Error(`Theme pages validation failed: ${JSON.stringify(validationResult)}`);\n }\n }\n\n const files = autoGenerateTargetFiles\n ? (Object.keys(bundle)\n .map((key) => {\n // Override files will be included manually after\n if (targetFiles?.some((file) => file.filename === key)) {\n return null;\n }\n return mapFile(key, bundle[key], includePreloadChunks);\n })\n .filter((x) => x !== null) as ThemeConfigurationLaunchDataTargetFile[])\n : [];\n if (targetFiles) {\n files.push(...targetFiles);\n }\n const config: ThemeConfigurationFile = {\n launchData: {\n targetFiles: files,\n },\n configurationSchema: configurationSchema,\n pageSettings: pages,\n };\n fs.writeFileSync(path.join(options.dir!, \"spiffTheme.json\"), JSON.stringify(config, undefined, 4));\n },\n };\n}\n\ninterface pageError {\n sections: { errors?: string[] }[];\n pageErrors?: string[];\n}\n\ninterface validationErrors {\n pages: pageError[];\n errors?: string[];\n hasErrors: boolean;\n}\n\nfunction validateThemePages(\n configurationSchema: ThemeConfigurationSchema,\n pages: ThemeConfigurationPageSettings,\n): validationErrors {\n const schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema> = new Map(\n configurationSchema.customSchemas?.map((it) => [it.name, it]) ?? [],\n );\n\n const result: validationErrors = {\n pages: pages.items.map((p) => ({ sections: p.sections.map(() => ({})) })),\n hasErrors: false,\n };\n const pageKeyLookup = new Map<string, ThemeConfigurationPageItem>(pages.items.map((p) => [p.key, p]));\n if (pages.reorderablePageSettings) {\n if (!pages.reorderablePageSettings.start) {\n result.errors = append(result.errors, \"reorderablePageSettings.start is not set\");\n result.hasErrors = true;\n } else if (!pageKeyLookup.get(pages.reorderablePageSettings.start)) {\n result.errors = append(result.errors, \"reorderablePageSettings.start references page which does not exist\");\n result.hasErrors = true;\n }\n if (!pages.reorderablePageSettings.end) {\n result.errors = append(result.errors, \"reorderablePageSettings.end is not set\");\n result.hasErrors = true;\n } else if (!pageKeyLookup.get(pages.reorderablePageSettings.end)) {\n result.errors = append(result.errors, \"reorderablePageSettings.end references page which does not exist\");\n result.hasErrors = true;\n }\n }\n for (let pageIndex = 0; pageIndex < pages.items.length; pageIndex++) {\n const page = pages.items[pageIndex];\n if (!page.key) {\n result.pages[pageIndex].pageErrors = append(result.pages[pageIndex].pageErrors, `missing key`);\n result.hasErrors = true;\n }\n for (let sectionIndex = 0; sectionIndex < page.sections.length; sectionIndex++) {\n const section = page.sections[sectionIndex];\n for (const field of section.fields) {\n const found = getPath(configurationSchema.fields, field, schemaLookup);\n if (typeof found === \"string\") {\n result.pages[pageIndex].sections[sectionIndex].errors = append(\n result.pages[pageIndex].sections[sectionIndex].errors,\n found,\n );\n result.hasErrors = true;\n }\n }\n }\n }\n return result;\n}\n\nfunction append<T>(existing: T[] | undefined, item: T): T[] {\n return [...(existing ?? []), item];\n}\n\nfunction getPath(\n rootFields: ThemeConfigurationSchemaField[],\n path: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField | string {\n const split = path.split(\".\");\n let field: ThemeConfigurationSchemaField | undefined;\n const currentChain: string[] = [];\n for (const key of split) {\n currentChain.push(key);\n if (!field) {\n // Search the root\n const result = findField(rootFields, key);\n if (!result) {\n return `unknown root field ${key}`;\n }\n field = result;\n } else {\n const result = getNestedField(field, key, schemaLookup);\n if (typeof result === \"string\") {\n return `error at path ${currentChain.join(\".\")}: ${result}`;\n }\n field = result;\n }\n }\n if (!field) {\n return \"provided path was empty\";\n }\n return field;\n}\n\nfunction getNestedField(\n field: ThemeConfigurationSchemaField,\n key: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField | string {\n if (field.type === FieldType.Heading) {\n return `heading field ${field.title} is not a type which has nested properties`;\n }\n if (field.type !== FieldType.Object) {\n return `field ${field.key}, of type ${field.type}, is not a type which has nested properties`;\n }\n let fields: ThemeConfigurationSchemaField[] = [];\n if (field.schema) {\n const result = getFieldsForCustomSchema(field.schema, schemaLookup);\n if (typeof result === \"string\") {\n return `object field ${field.key} has schema errors: ${result}`;\n }\n } else if (field.schema !== undefined) {\n return `object field ${field.key} references schema via empty string`;\n } else {\n fields = field.fields;\n }\n\n const found = findField(fields, key);\n if (!found) {\n return `object field ${field.key} has no property ${key}`;\n }\n return found;\n}\n\nfunction findField(fields: ThemeConfigurationSchemaField[], key: string): ThemeConfigurationSchemaField | undefined {\n return fields.find((it) => it.type !== FieldType.Heading && it.key === key);\n}\n\nfunction getFieldsForCustomSchema(\n schemaName: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField[] | string {\n const schema = schemaLookup.get(schemaName);\n if (!schema) {\n return `unknown schema ${schemaName}`;\n }\n let fields: ThemeConfigurationSchemaField[] = [];\n if (schema.type === CustomSchemaType.Union) {\n for (const item of schema.schemas) {\n const result = getFieldsForCustomSchema(item, schemaLookup);\n if (typeof result === \"string\") {\n return result;\n }\n fields = [...fields, ...result];\n }\n } else {\n // Object type\n if (schema.extends) {\n for (const item of schema.extends) {\n const result = getFieldsForCustomSchema(item, schemaLookup);\n if (typeof result === \"string\") {\n return result;\n }\n fields = [...fields, ...result];\n }\n }\n fields = [...fields, ...schema.fields];\n }\n return fields;\n}\n"],"names":["mapFile","key","file","includePreload","ThemeFileType","spiffThemePlugin","opts","autoGenerateTargetFiles","configurationSchema","pages","includePreloadChunks","targetFiles","pkg","config","_env","options","bundle","validationResult","validateThemePages","files","x","fs","path","schemaLookup","it","result","p","pageKeyLookup","append","pageIndex","page","sectionIndex","section","field","found","getPath","existing","item","rootFields","split","currentChain","getNestedField","findField","FieldType","fields","getFieldsForCustomSchema","schemaName","schema","CustomSchemaType"],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -1,52 +1,149 @@
1
- import { T as l } from "./configurationTypes-6D808idm.js";
2
- import p from "fs";
3
- import f from "path";
4
- const h = "1.27.0", y = {
5
- version: h
1
+ import { T as h, F as p, C as y } from "./configurationTypes-6D808idm.js";
2
+ import E from "fs";
3
+ import S from "path";
4
+ const b = "1.27.1-alpha.1", v = {
5
+ version: b
6
6
  };
7
- function v(i, e, r) {
8
- return e.type === "chunk" ? (console.log(
9
- `chunk ${i} isEntry: ${e.isEntry}, isDynamicEntry: ${e.isDynamicEntry}, isImplicitEntry: ${e.isImplicitEntry}`
10
- ), !e.isEntry && !r ? null : {
11
- type: l.Javascript,
7
+ function w(r, s, n) {
8
+ return s.type === "chunk" ? (console.log(
9
+ `chunk ${r} isEntry: ${s.isEntry}, isDynamicEntry: ${s.isDynamicEntry}, isImplicitEntry: ${s.isImplicitEntry}`
10
+ ), !s.isEntry && !n ? null : {
11
+ type: h.Javascript,
12
12
  mimeType: "text/javascript",
13
- preload: !e.isEntry,
14
- filename: i
15
- }) : i.endsWith(".css") ? {
16
- type: l.CSS,
13
+ preload: !s.isEntry,
14
+ filename: r
15
+ }) : r.endsWith(".css") ? {
16
+ type: h.CSS,
17
17
  mimeType: "text/css",
18
- filename: i
18
+ filename: r
19
19
  } : null;
20
20
  }
21
- function E(i) {
21
+ function x(r) {
22
22
  const {
23
- autoGenerateTargetFiles: e = !0,
24
- configurationSchema: r,
25
- includePreloadChunks: u = !1,
26
- targetFiles: s
27
- } = i ?? {};
23
+ autoGenerateTargetFiles: s = !0,
24
+ configurationSchema: n,
25
+ pageSettings: e,
26
+ includePreloadChunks: i = !1,
27
+ targetFiles: t
28
+ } = r ?? {};
28
29
  return {
29
30
  name: "spiff-theme-plugin",
30
- version: y.version,
31
- config(n, o) {
32
- n.base !== void 0 && n.base !== "" && console.warn(
31
+ version: v.version,
32
+ config(a, o) {
33
+ a.base !== void 0 && a.base !== "" && console.warn(
33
34
  'You have specified a `base` in your vite configuration other than "". This value will now be overwritten.'
34
- ), n.base = "";
35
+ ), a.base = "";
35
36
  },
36
- writeBundle(n, o) {
37
- const a = e ? Object.keys(o).map((t) => s?.some((m) => m.filename === t) ? null : v(t, o[t], u)).filter((t) => t !== null) : [];
38
- s && a.push(...s);
39
- const c = {
37
+ writeBundle(a, o) {
38
+ if (n && e) {
39
+ const c = $(n, e);
40
+ if (c.hasErrors)
41
+ throw new Error(`Theme pages validation failed: ${JSON.stringify(c)}`);
42
+ }
43
+ const l = s ? Object.keys(o).map((c) => t?.some((m) => m.filename === c) ? null : w(c, o[c], i)).filter((c) => c !== null) : [];
44
+ t && l.push(...t);
45
+ const u = {
40
46
  launchData: {
41
- targetFiles: a
47
+ targetFiles: l
42
48
  },
43
- configurationSchema: r
49
+ configurationSchema: n,
50
+ pageSettings: e
44
51
  };
45
- p.writeFileSync(f.join(n.dir, "spiffTheme.json"), JSON.stringify(c, void 0, 4));
52
+ E.writeFileSync(S.join(a.dir, "spiffTheme.json"), JSON.stringify(u, void 0, 4));
46
53
  }
47
54
  };
48
55
  }
56
+ function $(r, s) {
57
+ const n = new Map(
58
+ r.customSchemas?.map((t) => [t.name, t]) ?? []
59
+ ), e = {
60
+ pages: s.items.map((t) => ({ sections: t.sections.map(() => ({})) })),
61
+ hasErrors: !1
62
+ }, i = new Map(s.items.map((t) => [t.key, t]));
63
+ s.reorderablePageSettings && (s.reorderablePageSettings.start ? i.get(s.reorderablePageSettings.start) || (e.errors = f(e.errors, "reorderablePageSettings.start references page which does not exist"), e.hasErrors = !0) : (e.errors = f(e.errors, "reorderablePageSettings.start is not set"), e.hasErrors = !0), s.reorderablePageSettings.end ? i.get(s.reorderablePageSettings.end) || (e.errors = f(e.errors, "reorderablePageSettings.end references page which does not exist"), e.hasErrors = !0) : (e.errors = f(e.errors, "reorderablePageSettings.end is not set"), e.hasErrors = !0));
64
+ for (let t = 0; t < s.items.length; t++) {
65
+ const a = s.items[t];
66
+ a.key || (e.pages[t].pageErrors = f(e.pages[t].pageErrors, "missing key"), e.hasErrors = !0);
67
+ for (let o = 0; o < a.sections.length; o++) {
68
+ const l = a.sections[o];
69
+ for (const u of l.fields) {
70
+ const c = P(r.fields, u, n);
71
+ typeof c == "string" && (e.pages[t].sections[o].errors = f(
72
+ e.pages[t].sections[o].errors,
73
+ c
74
+ ), e.hasErrors = !0);
75
+ }
76
+ }
77
+ }
78
+ return e;
79
+ }
80
+ function f(r, s) {
81
+ return [...r ?? [], s];
82
+ }
83
+ function P(r, s, n) {
84
+ const e = s.split(".");
85
+ let i;
86
+ const t = [];
87
+ for (const a of e)
88
+ if (t.push(a), i) {
89
+ const o = T(i, a, n);
90
+ if (typeof o == "string")
91
+ return `error at path ${t.join(".")}: ${o}`;
92
+ i = o;
93
+ } else {
94
+ const o = d(r, a);
95
+ if (!o)
96
+ return `unknown root field ${a}`;
97
+ i = o;
98
+ }
99
+ return i || "provided path was empty";
100
+ }
101
+ function T(r, s, n) {
102
+ if (r.type === p.Heading)
103
+ return `heading field ${r.title} is not a type which has nested properties`;
104
+ if (r.type !== p.Object)
105
+ return `field ${r.key}, of type ${r.type}, is not a type which has nested properties`;
106
+ let e = [];
107
+ if (r.schema) {
108
+ const t = g(r.schema, n);
109
+ if (typeof t == "string")
110
+ return `object field ${r.key} has schema errors: ${t}`;
111
+ } else {
112
+ if (r.schema !== void 0)
113
+ return `object field ${r.key} references schema via empty string`;
114
+ e = r.fields;
115
+ }
116
+ const i = d(e, s);
117
+ return i || `object field ${r.key} has no property ${s}`;
118
+ }
119
+ function d(r, s) {
120
+ return r.find((n) => n.type !== p.Heading && n.key === s);
121
+ }
122
+ function g(r, s) {
123
+ const n = s.get(r);
124
+ if (!n)
125
+ return `unknown schema ${r}`;
126
+ let e = [];
127
+ if (n.type === y.Union)
128
+ for (const i of n.schemas) {
129
+ const t = g(i, s);
130
+ if (typeof t == "string")
131
+ return t;
132
+ e = [...e, ...t];
133
+ }
134
+ else {
135
+ if (n.extends)
136
+ for (const i of n.extends) {
137
+ const t = g(i, s);
138
+ if (typeof t == "string")
139
+ return t;
140
+ e = [...e, ...t];
141
+ }
142
+ e = [...e, ...n.fields];
143
+ }
144
+ return e;
145
+ }
49
146
  export {
50
- E as spiffThemePlugin
147
+ x as spiffThemePlugin
51
148
  };
52
149
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../src/rollup.ts"],"sourcesContent":["import {\n ThemeConfigurationFile,\n ThemeConfigurationLaunchDataTargetFile,\n ThemeConfigurationSchema,\n ThemeFileType,\n} from \"./configurationTypes\";\nimport { Plugin } from \"vite\";\nimport { OutputAsset, OutputChunk } from \"rollup\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport pkg from \"../package.json\";\n\nfunction mapFile(key: string, file: OutputAsset | OutputChunk, includePreload: boolean) {\n if (file.type === \"chunk\") {\n console.log(\n `chunk ${key} isEntry: ${file.isEntry}, isDynamicEntry: ${file.isDynamicEntry}, isImplicitEntry: ${file.isImplicitEntry}`,\n );\n if (!file.isEntry && !includePreload) {\n return null;\n }\n return {\n type: ThemeFileType.Javascript,\n mimeType: \"text/javascript\",\n preload: !file.isEntry,\n filename: key,\n };\n } else {\n if (key.endsWith(\".css\")) {\n return {\n type: ThemeFileType.CSS,\n mimeType: \"text/css\",\n filename: key,\n };\n }\n }\n return null;\n}\n\ninterface PluginOptions {\n /**\n * When `true`, will automatically insert files from the build into the `launchData.targetFiles` field.\n * @default true\n */\n autoGenerateTargetFiles?: boolean;\n /**\n * A configuration schema to allow installs to customize your theme.\n * @default undefined\n */\n configurationSchema?: ThemeConfigurationSchema;\n /**\n * Generates `targetFiles` entries with preload set to true. Only applies when `autoGenerateTargetFiles` is set to true.\n * By default this will only include the primary entry file(s).\n * @default false\n */\n includePreloadChunks?: boolean;\n /**\n * Manually add/override specific files.\n * @default undefined\n */\n targetFiles?: ThemeConfigurationLaunchDataTargetFile[];\n}\n\n/**\n * Automatically generates a `spiffTheme.json` file in your output directory.\n * @param opts Options to customize the generated file.\n */\nexport function spiffThemePlugin(opts?: PluginOptions): Plugin {\n const {\n autoGenerateTargetFiles = true,\n configurationSchema,\n includePreloadChunks = false,\n targetFiles,\n } = opts ?? ({} as PluginOptions);\n return {\n name: \"spiff-theme-plugin\",\n version: pkg.version,\n config(config, _env) {\n if (config.base !== undefined && config.base !== \"\") {\n console.warn(\n 'You have specified a `base` in your vite configuration other than \"\". This value will now be overwritten.',\n );\n }\n config.base = \"\";\n },\n writeBundle(this, options, bundle) {\n const files = autoGenerateTargetFiles\n ? (Object.keys(bundle)\n .map((key) => {\n // Override files will be included manually after\n if (targetFiles?.some((file) => file.filename === key)) {\n return null;\n }\n return mapFile(key, bundle[key], includePreloadChunks);\n })\n .filter((x) => x !== null) as ThemeConfigurationLaunchDataTargetFile[])\n : [];\n if (targetFiles) {\n files.push(...targetFiles);\n }\n const config: ThemeConfigurationFile = {\n launchData: {\n targetFiles: files,\n },\n configurationSchema: configurationSchema,\n };\n fs.writeFileSync(path.join(options.dir!, \"spiffTheme.json\"), JSON.stringify(config, undefined, 4));\n },\n };\n}\n"],"names":["mapFile","key","file","includePreload","ThemeFileType","spiffThemePlugin","opts","autoGenerateTargetFiles","configurationSchema","includePreloadChunks","targetFiles","pkg","config","_env","options","bundle","files","x","fs","path"],"mappings":";;;;;;AAYA,SAASA,EAAQC,GAAaC,GAAiCC,GAAyB;AACpF,SAAID,EAAK,SAAS,WACd,QAAQ;AAAA,IACJ,SAASD,CAAG,aAAaC,EAAK,OAAO,qBAAqBA,EAAK,cAAc,sBAAsBA,EAAK,eAAe;AAAA,EAAA,GAEvH,CAACA,EAAK,WAAW,CAACC,IACX,OAEJ;AAAA,IACH,MAAMC,EAAc;AAAA,IACpB,UAAU;AAAA,IACV,SAAS,CAACF,EAAK;AAAA,IACf,UAAUD;AAAA,EAAA,KAGVA,EAAI,SAAS,MAAM,IACZ;AAAA,IACH,MAAMG,EAAc;AAAA,IACpB,UAAU;AAAA,IACV,UAAUH;AAAA,EAAA,IAIf;AACX;AA8BO,SAASI,EAAiBC,GAA8B;AAC3D,QAAM;AAAA,IACF,yBAAAC,IAA0B;AAAA,IAC1B,qBAAAC;AAAA,IACA,sBAAAC,IAAuB;AAAA,IACvB,aAAAC;AAAA,EAAA,IACAJ,KAAS,CAAA;AACb,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAASK,EAAI;AAAA,IACb,OAAOC,GAAQC,GAAM;AACjB,MAAID,EAAO,SAAS,UAAaA,EAAO,SAAS,MAC7C,QAAQ;AAAA,QACJ;AAAA,MAAA,GAGRA,EAAO,OAAO;AAAA,IAClB;AAAA,IACA,YAAkBE,GAASC,GAAQ;AAC/B,YAAMC,IAAQT,IACP,OAAO,KAAKQ,CAAM,EACd,IAAI,CAACd,MAEES,GAAa,KAAK,CAACR,MAASA,EAAK,aAAaD,CAAG,IAC1C,OAEJD,EAAQC,GAAKc,EAAOd,CAAG,GAAGQ,CAAoB,CACxD,EACA,OAAO,CAACQ,MAAMA,MAAM,IAAI,IAC7B,CAAA;AACN,MAAIP,KACAM,EAAM,KAAK,GAAGN,CAAW;AAE7B,YAAME,IAAiC;AAAA,QACnC,YAAY;AAAA,UACR,aAAaI;AAAA,QAAA;AAAA,QAEjB,qBAAAR;AAAA,MAAA;AAEJ,MAAAU,EAAG,cAAcC,EAAK,KAAKL,EAAQ,KAAM,iBAAiB,GAAG,KAAK,UAAUF,GAAQ,QAAW,CAAC,CAAC;AAAA,IACrG;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"plugin.js","sources":["../src/rollup.ts"],"sourcesContent":["import {\n CustomSchemaType,\n FieldType,\n ThemeConfigurationFile,\n ThemeConfigurationLaunchDataTargetFile,\n ThemeConfigurationPageItem,\n ThemeConfigurationPageSettings,\n ThemeConfigurationSchema,\n ThemeConfigurationSchemaCustomSchema,\n ThemeConfigurationSchemaField,\n ThemeFileType,\n} from \"./configurationTypes\";\nimport { Plugin } from \"vite\";\nimport { OutputAsset, OutputChunk } from \"rollup\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport pkg from \"../package.json\";\n\nfunction mapFile(key: string, file: OutputAsset | OutputChunk, includePreload: boolean) {\n if (file.type === \"chunk\") {\n console.log(\n `chunk ${key} isEntry: ${file.isEntry}, isDynamicEntry: ${file.isDynamicEntry}, isImplicitEntry: ${file.isImplicitEntry}`,\n );\n if (!file.isEntry && !includePreload) {\n return null;\n }\n return {\n type: ThemeFileType.Javascript,\n mimeType: \"text/javascript\",\n preload: !file.isEntry,\n filename: key,\n };\n } else {\n if (key.endsWith(\".css\")) {\n return {\n type: ThemeFileType.CSS,\n mimeType: \"text/css\",\n filename: key,\n };\n }\n }\n return null;\n}\n\nexport interface PluginOptions {\n /**\n * When `true`, will automatically insert files from the build into the `launchData.targetFiles` field.\n * @default true\n */\n autoGenerateTargetFiles?: boolean;\n /**\n * A configuration schema to allow installs to customize your theme.\n * @default undefined\n */\n configurationSchema?: ThemeConfigurationSchema;\n /**\n * Options for changing how your theme configuration is displayed to users.\n * This is ignored if `configurationSchema` is not provided.\n * @default undefined.\n */\n pageSettings?: ThemeConfigurationPageSettings;\n /**\n * Generates `targetFiles` entries with preload set to true. Only applies when `autoGenerateTargetFiles` is set to true.\n * By default this will only include the primary entry file(s).\n * @default false\n */\n includePreloadChunks?: boolean;\n /**\n * Manually add/override specific files.\n * @default undefined\n */\n targetFiles?: ThemeConfigurationLaunchDataTargetFile[];\n}\n\n/**\n * Automatically generates a `spiffTheme.json` file in your output directory.\n * @param opts Options to customize the generated file.\n */\nexport function spiffThemePlugin(opts?: PluginOptions): Plugin {\n const {\n autoGenerateTargetFiles = true,\n configurationSchema,\n pageSettings: pages,\n includePreloadChunks = false,\n targetFiles,\n } = opts ?? ({} as PluginOptions);\n return {\n name: \"spiff-theme-plugin\",\n version: pkg.version,\n config(config, _env) {\n if (config.base !== undefined && config.base !== \"\") {\n console.warn(\n 'You have specified a `base` in your vite configuration other than \"\". This value will now be overwritten.',\n );\n }\n config.base = \"\";\n },\n writeBundle(this, options, bundle) {\n if (configurationSchema && pages) {\n const validationResult = validateThemePages(configurationSchema, pages);\n if (validationResult.hasErrors) {\n throw new Error(`Theme pages validation failed: ${JSON.stringify(validationResult)}`);\n }\n }\n\n const files = autoGenerateTargetFiles\n ? (Object.keys(bundle)\n .map((key) => {\n // Override files will be included manually after\n if (targetFiles?.some((file) => file.filename === key)) {\n return null;\n }\n return mapFile(key, bundle[key], includePreloadChunks);\n })\n .filter((x) => x !== null) as ThemeConfigurationLaunchDataTargetFile[])\n : [];\n if (targetFiles) {\n files.push(...targetFiles);\n }\n const config: ThemeConfigurationFile = {\n launchData: {\n targetFiles: files,\n },\n configurationSchema: configurationSchema,\n pageSettings: pages,\n };\n fs.writeFileSync(path.join(options.dir!, \"spiffTheme.json\"), JSON.stringify(config, undefined, 4));\n },\n };\n}\n\ninterface pageError {\n sections: { errors?: string[] }[];\n pageErrors?: string[];\n}\n\ninterface validationErrors {\n pages: pageError[];\n errors?: string[];\n hasErrors: boolean;\n}\n\nfunction validateThemePages(\n configurationSchema: ThemeConfigurationSchema,\n pages: ThemeConfigurationPageSettings,\n): validationErrors {\n const schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema> = new Map(\n configurationSchema.customSchemas?.map((it) => [it.name, it]) ?? [],\n );\n\n const result: validationErrors = {\n pages: pages.items.map((p) => ({ sections: p.sections.map(() => ({})) })),\n hasErrors: false,\n };\n const pageKeyLookup = new Map<string, ThemeConfigurationPageItem>(pages.items.map((p) => [p.key, p]));\n if (pages.reorderablePageSettings) {\n if (!pages.reorderablePageSettings.start) {\n result.errors = append(result.errors, \"reorderablePageSettings.start is not set\");\n result.hasErrors = true;\n } else if (!pageKeyLookup.get(pages.reorderablePageSettings.start)) {\n result.errors = append(result.errors, \"reorderablePageSettings.start references page which does not exist\");\n result.hasErrors = true;\n }\n if (!pages.reorderablePageSettings.end) {\n result.errors = append(result.errors, \"reorderablePageSettings.end is not set\");\n result.hasErrors = true;\n } else if (!pageKeyLookup.get(pages.reorderablePageSettings.end)) {\n result.errors = append(result.errors, \"reorderablePageSettings.end references page which does not exist\");\n result.hasErrors = true;\n }\n }\n for (let pageIndex = 0; pageIndex < pages.items.length; pageIndex++) {\n const page = pages.items[pageIndex];\n if (!page.key) {\n result.pages[pageIndex].pageErrors = append(result.pages[pageIndex].pageErrors, `missing key`);\n result.hasErrors = true;\n }\n for (let sectionIndex = 0; sectionIndex < page.sections.length; sectionIndex++) {\n const section = page.sections[sectionIndex];\n for (const field of section.fields) {\n const found = getPath(configurationSchema.fields, field, schemaLookup);\n if (typeof found === \"string\") {\n result.pages[pageIndex].sections[sectionIndex].errors = append(\n result.pages[pageIndex].sections[sectionIndex].errors,\n found,\n );\n result.hasErrors = true;\n }\n }\n }\n }\n return result;\n}\n\nfunction append<T>(existing: T[] | undefined, item: T): T[] {\n return [...(existing ?? []), item];\n}\n\nfunction getPath(\n rootFields: ThemeConfigurationSchemaField[],\n path: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField | string {\n const split = path.split(\".\");\n let field: ThemeConfigurationSchemaField | undefined;\n const currentChain: string[] = [];\n for (const key of split) {\n currentChain.push(key);\n if (!field) {\n // Search the root\n const result = findField(rootFields, key);\n if (!result) {\n return `unknown root field ${key}`;\n }\n field = result;\n } else {\n const result = getNestedField(field, key, schemaLookup);\n if (typeof result === \"string\") {\n return `error at path ${currentChain.join(\".\")}: ${result}`;\n }\n field = result;\n }\n }\n if (!field) {\n return \"provided path was empty\";\n }\n return field;\n}\n\nfunction getNestedField(\n field: ThemeConfigurationSchemaField,\n key: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField | string {\n if (field.type === FieldType.Heading) {\n return `heading field ${field.title} is not a type which has nested properties`;\n }\n if (field.type !== FieldType.Object) {\n return `field ${field.key}, of type ${field.type}, is not a type which has nested properties`;\n }\n let fields: ThemeConfigurationSchemaField[] = [];\n if (field.schema) {\n const result = getFieldsForCustomSchema(field.schema, schemaLookup);\n if (typeof result === \"string\") {\n return `object field ${field.key} has schema errors: ${result}`;\n }\n } else if (field.schema !== undefined) {\n return `object field ${field.key} references schema via empty string`;\n } else {\n fields = field.fields;\n }\n\n const found = findField(fields, key);\n if (!found) {\n return `object field ${field.key} has no property ${key}`;\n }\n return found;\n}\n\nfunction findField(fields: ThemeConfigurationSchemaField[], key: string): ThemeConfigurationSchemaField | undefined {\n return fields.find((it) => it.type !== FieldType.Heading && it.key === key);\n}\n\nfunction getFieldsForCustomSchema(\n schemaName: string,\n schemaLookup: Map<string, ThemeConfigurationSchemaCustomSchema>,\n): ThemeConfigurationSchemaField[] | string {\n const schema = schemaLookup.get(schemaName);\n if (!schema) {\n return `unknown schema ${schemaName}`;\n }\n let fields: ThemeConfigurationSchemaField[] = [];\n if (schema.type === CustomSchemaType.Union) {\n for (const item of schema.schemas) {\n const result = getFieldsForCustomSchema(item, schemaLookup);\n if (typeof result === \"string\") {\n return result;\n }\n fields = [...fields, ...result];\n }\n } else {\n // Object type\n if (schema.extends) {\n for (const item of schema.extends) {\n const result = getFieldsForCustomSchema(item, schemaLookup);\n if (typeof result === \"string\") {\n return result;\n }\n fields = [...fields, ...result];\n }\n }\n fields = [...fields, ...schema.fields];\n }\n return fields;\n}\n"],"names":["mapFile","key","file","includePreload","ThemeFileType","spiffThemePlugin","opts","autoGenerateTargetFiles","configurationSchema","pages","includePreloadChunks","targetFiles","pkg","config","_env","options","bundle","validationResult","validateThemePages","files","x","fs","path","schemaLookup","it","result","p","pageKeyLookup","append","pageIndex","page","sectionIndex","section","field","found","getPath","existing","item","rootFields","split","currentChain","getNestedField","findField","FieldType","fields","getFieldsForCustomSchema","schemaName","schema","CustomSchemaType"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/theme-bridge",
3
- "version": "1.27.0",
3
+ "version": "1.27.1-alpha.1",
4
4
  "type": "module",
5
5
  "author": "SpiffCommerce",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  }
34
34
  },
35
35
  "dependencies": {
36
- "@spiffcommerce/core": "^44.11.2"
36
+ "@spiffcommerce/core": "^44.12.3"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@repo/core": "*"