@lightspeed/crane 1.2.4 → 1.2.5
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 +11 -0
- package/README.md +6 -0
- package/dist/app.d.mts +9 -9
- package/dist/app.d.ts +9 -9
- package/dist/cli.mjs +8 -6
- package/package.json +2 -2
- package/template/preview/sections/preview.html +89 -0
- package/template/preview/shared/preview.ts +300 -0
- package/template/preview/shared/utils.ts +3 -0
- package/template/preview/vite.config.js +32 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.2.5 - 2025-07-07
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Move 'Local Preview' functionality from experimental to the core feature list.
|
|
8
|
+
- Add new CLI command to start a local development server to serve previews of custom sections.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Update version of 'vite' dependency.
|
|
13
|
+
|
|
3
14
|
## 1.2.4 - 2025-06-02
|
|
4
15
|
|
|
5
16
|
### Added
|
package/README.md
CHANGED
|
@@ -56,6 +56,12 @@ npx @lightspeed/crane@latest build
|
|
|
56
56
|
Builds the application. Upon a successful build, the following directories can be located inside the application folder: ```dist``` and ```node_modules```.
|
|
57
57
|
A prompt describing the next steps will be shown.
|
|
58
58
|
|
|
59
|
+
```
|
|
60
|
+
npx @lightspeed/crane@latest preview
|
|
61
|
+
```
|
|
62
|
+
Builds the application and starts a development server for local preview. A prompt pointing to the preview URL will be shown in the terminal, which can be accessed in a browser.
|
|
63
|
+
This command needs to be run only once, after a consecutive build and refresh of the preview browser window, the changes will be visible without the need to run this command again.
|
|
64
|
+
|
|
59
65
|
```
|
|
60
66
|
npx @lightspeed/crane@latest deploy
|
|
61
67
|
```
|
package/dist/app.d.mts
CHANGED
|
@@ -206,15 +206,6 @@ declare function useDeckElementContent<CONTENT>(elementName: keyof CONTENT): {
|
|
|
206
206
|
declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes, contentElementName: string): {
|
|
207
207
|
hasContent: boolean;
|
|
208
208
|
value: string | undefined;
|
|
209
|
-
} | {
|
|
210
|
-
hasContent: boolean;
|
|
211
|
-
lowResolutionMobileImage: string;
|
|
212
|
-
highResolutionMobileImage: string;
|
|
213
|
-
lowResolutionDesktopImage: string;
|
|
214
|
-
highResolutionDesktopImage: string;
|
|
215
|
-
} | {
|
|
216
|
-
hasContent: boolean;
|
|
217
|
-
value: boolean | undefined;
|
|
218
209
|
} | {
|
|
219
210
|
title: string | undefined;
|
|
220
211
|
type: ActionLinkType | undefined;
|
|
@@ -227,6 +218,15 @@ declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes,
|
|
|
227
218
|
hasTitle: boolean;
|
|
228
219
|
hasLink: boolean;
|
|
229
220
|
performAction: (() => void) | undefined;
|
|
221
|
+
} | {
|
|
222
|
+
hasContent: boolean;
|
|
223
|
+
value: boolean | undefined;
|
|
224
|
+
} | {
|
|
225
|
+
hasContent: boolean;
|
|
226
|
+
lowResolutionMobileImage: string;
|
|
227
|
+
highResolutionMobileImage: string;
|
|
228
|
+
lowResolutionDesktopImage: string;
|
|
229
|
+
highResolutionDesktopImage: string;
|
|
230
230
|
} | undefined;
|
|
231
231
|
|
|
232
232
|
declare function useLogoElementContent<CONTENT>(): {
|
package/dist/app.d.ts
CHANGED
|
@@ -206,15 +206,6 @@ declare function useDeckElementContent<CONTENT>(elementName: keyof CONTENT): {
|
|
|
206
206
|
declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes, contentElementName: string): {
|
|
207
207
|
hasContent: boolean;
|
|
208
208
|
value: string | undefined;
|
|
209
|
-
} | {
|
|
210
|
-
hasContent: boolean;
|
|
211
|
-
lowResolutionMobileImage: string;
|
|
212
|
-
highResolutionMobileImage: string;
|
|
213
|
-
lowResolutionDesktopImage: string;
|
|
214
|
-
highResolutionDesktopImage: string;
|
|
215
|
-
} | {
|
|
216
|
-
hasContent: boolean;
|
|
217
|
-
value: boolean | undefined;
|
|
218
209
|
} | {
|
|
219
210
|
title: string | undefined;
|
|
220
211
|
type: ActionLinkType | undefined;
|
|
@@ -227,6 +218,15 @@ declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes,
|
|
|
227
218
|
hasTitle: boolean;
|
|
228
219
|
hasLink: boolean;
|
|
229
220
|
performAction: (() => void) | undefined;
|
|
221
|
+
} | {
|
|
222
|
+
hasContent: boolean;
|
|
223
|
+
value: boolean | undefined;
|
|
224
|
+
} | {
|
|
225
|
+
hasContent: boolean;
|
|
226
|
+
lowResolutionMobileImage: string;
|
|
227
|
+
highResolutionMobileImage: string;
|
|
228
|
+
lowResolutionDesktopImage: string;
|
|
229
|
+
highResolutionDesktopImage: string;
|
|
230
230
|
} | undefined;
|
|
231
231
|
|
|
232
232
|
declare function useLogoElementContent<CONTENT>(): {
|
package/dist/cli.mjs
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
`),a.info(`App ${e} created`)}catch(t){a.error(`Error while creating app: ${t.message}`),T.exit(1)}}function re(e,t,o,s){try{const n=T.cwd(),r=g.join(n,t);h.existsSync(r)||h.mkdirSync(r);const i=g.join(n,t,o);h.existsSync(i)?(a.error(`${s} with the name: ${o} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):h.mkdirSync(i);const c=k(e);h.readdirSync(c).forEach(async l=>N(i,c,l)),a.info(`${s} ${o} created`)}catch(n){a.error(`Error while creating ${s}: ${n.message}`),T.exit(1)}}function ie(e){const t=T.cwd(),o=k(`template/${e}`),s=g.join(t,e);h.existsSync(s)||(h.mkdirSync(s),h.readdirSync(o).forEach(async n=>N(s,o,n)))}function fn(e,t,o){if(!h.existsSync(o)){h.copyFileSync(t,o);return}const s=h.readFileSync(t),n=h.readFileSync(o);s.equals(n)||a.warn(`File "${e.name}" exists but differs from template. File will be skipped, this may lead to issues.`)}function Re(e,t){const o=h.readdirSync(e,{withFileTypes:!0});h.existsSync(t)||h.mkdirSync(t,{recursive:!0}),o.forEach(s=>{const n=g.join(e,s.name),r=g.join(t,s.name);s.isDirectory()?Re(n,r):fn(s,n,r)})}function ae(){try{const e=T.cwd(),t=g.join(e,"shared"),o=k("template/shared");if(!h.existsSync(o))return;Re(o,t)}catch(e){a.error(`Error while processing shared folder: ${e.message}`),T.exit(1)}}async function un(e){ae(),re("template/sections/example-section","sections",e,"Section")}async function mn(e,t){const{targetPath:o,renameFiles:s,sourcePath:n,onTemplateCreated:r}=pn(e,t);try{const i=T.cwd(),c=P.join(i,"templates"),l=k(n),d=b.readdirSync(l);b.existsSync(c)?b.existsSync(P.join(c,o))&&(a.error(`Template with the name: ${e} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):b.mkdirSync(c),d.forEach($=>N(c,l,$,s)),ie("headers"),ie("footers"),t&&ie("layouts"),r()}catch(i){a.error(`Error while creating template descriptors: ${i.message}`),T.exit(1)}}async function yn(){try{const e=T.cwd(),t=k("template/reference"),o=b.readdirSync(t);let s=!1;for(const n of o){const r=P.join(t,n),i=P.join(e,n);b.existsSync(i)||b.mkdirSync(i,{recursive:!0});const c=b.readdirSync(r),l=b.readdirSync(i);if(n==="shared"){c.forEach(d=>{N(i,r,d)});continue}for(const d of c){if(d==="assets"){N(i,r,d);continue}if(l.includes(d)){const{name:$}=await Ee({type:"text",name:"name",message:`The "${d}" already exists in ${n} directory: provide a new name to keep both or press Esc to skip this one.`});$?(N(i,r,d,{[d]:$}),s=!0):a.info(`Skipped: ${d}`)}else N(i,r,d)}}a.info("Reference templates have been added to the app"),s&&a.warn("Some files or folders were renamed to avoid conflicts. Template files may need to be updated to reflect these changes.")}catch(e){a.error(`Error while creating template descriptors: ${e.message}`),T.exit(1)}}const Ge="https://json-schema.org/draft/2020-12/schema",Me="https://lightspeedhq.com/template-default.schema.json",Be="Default Section",qe="Default section for a Custom Template",Ue="object",ze={"default-section":{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"default"},id:{description:"Identification of the section",type:"string",pattern:"^((header|cover|announcement_bar|slider|special_offer|customer_review|company_info|shipping_payment|location|store|footer)(_\\d{3})?)$"},showcase_id:{description:"Showcase id of the section",type:"string"}},required:["type","id"],additionalProperties:!1}},gn={$schema:Ge,$id:Me,title:Be,description:qe,type:Ue,$defs:ze},Xe={__proto__:null,$defs:ze,$id:Me,$schema:Ge,default:gn,description:qe,title:Be,type:Ue},He="https://json-schema.org/draft/2020-12/schema",Ve="https://lightspeedhq.com/template-custom.schema.json",Ke="Custom Section",Ye="Custom section for a Custom Template",Je="object",We={"custom-section":{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"custom"},id:{description:"Identification of the section",type:"string"},showcase_id:{description:"Showcase id of the section",type:"string"},showcase_overrides:{$ref:"showcase_overrides.schema.json"}},required:["type","id"],additionalProperties:!1}},hn={$schema:He,$id:Ve,title:Ke,description:Ye,type:Je,$defs:We},Ze={__proto__:null,$defs:We,$id:Ve,$schema:He,default:hn,description:Ye,title:Ke,type:Je},Qe="https://json-schema.org/draft/2020-12/schema",et="https://lightspeedhq.com/template-custom-content.schema.json",tt="Custom Section :: Content Configuration",ot="Content tab configuration of a Custom Section for a Custom Template",st="object",nt={input_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"INPUTBOX"},text:{$ref:"common.schema.json#/$defs/label_type"}},required:["type","text"],additionalProperties:!1},text_area:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TEXTAREA"},text:{$ref:"common.schema.json#/$defs/label_type"}},required:["type","text"],additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"BUTTON"},title:{$ref:"common.schema.json#/$defs/label_type"},buttonType:{type:"string",enum:["SCROLL_TO_TILE","HYPER_LINK","MAIL_LINK","TEL_LINK","GO_TO_STORE_LINK","GO_TO_PAGE"]},link:{type:"string",format:"uri"},linkTarget:{type:"string"},email:{type:"string"},phone:{type:"string"},tileId:{type:"string"}},required:["type","title","buttonType"],additionalProperties:!0},image:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"IMAGE"},imageData:{type:"object",properties:{set:{type:"object",properties:{MOBILE_WEBP_LOW_RES:{type:"object"},MOBILE_WEBP_HI_RES:{type:"object"},WEBP_LOW_RES:{type:"object"},WEBP_HI_2X_RES:{type:"object"},ORIGINAL:{type:"object"}},additionalProperties:!1,minProperties:1},borderInfo:{type:"object"},bucket:{type:"string"}},required:["set"]}},required:["type"],additionalProperties:!1},toggle:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TOGGLE"},enabled:{type:"boolean"}},required:["type"],additionalProperties:!0},select_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"SELECTBOX"},value:{type:"string"}},required:["type"],additionalProperties:!0},logo:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"LOGO"},logoType:{description:"Type of the logo content",type:"string",enum:["TEXT","IMAGE"]},text:{description:"Logo content text",$ref:"common.schema.json#/$defs/label_type"},imageData:{type:"object",properties:{set:{type:"object"},borderInfo:{type:"object"},bucket:{type:"string"}},required:["set"]}},required:["type"],additionalProperties:!1},menu:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"MENU"}},required:["type"],additionalProperties:!1},deck:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"DECK"},cards:{type:"array",items:{type:"object",properties:{settings:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the settings configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/input_box"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"template-custom-content.schema.json#/$defs/text_area"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-content.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/select_box"}}]}},minProperties:1}},required:["settings"]}}},required:["type","cards"]}},$n={$schema:Qe,$id:et,title:tt,description:ot,type:st,$defs:nt},rt={__proto__:null,$defs:nt,$id:et,$schema:Qe,default:$n,description:ot,title:tt,type:st},it="https://json-schema.org/draft/2020-12/schema",at="https://lightspeedhq.com/template-custom-design.schema.json",ct="Custom Section :: Design Configuration",pt="Design tab configuration of a Custom Section for a Custom Template",lt="object",dt={text:{type:"object",properties:{type:{description:"Type of the text",type:"string",const:"TEXT"},font:{description:"Default font for the text",type:"string"},size:{oneOf:[{description:"Default size for the text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{description:"Default boldness for the text",type:"boolean"},italic:{description:"Default italic style for the text",type:"boolean"},color:{oneOf:[{description:"Default color for the text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{description:"Default visibility for the text",type:"boolean"}},additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the button",type:"string",const:"BUTTON"},font:{description:"Default font for the button",type:"string"},size:{description:"Default size for the button",type:"string",enum:["SMALL","MEDIUM","LARGE"]},appearance:{description:"Default appearance for the button",type:"string",enum:["SOLID","OUTLINE","TEXT"]},shape:{description:"Default shape for the button",type:"string",enum:["ROUND_CORNER","RECTANGLE","PILL"]},color:{oneOf:[{description:"Default color for the button",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the button",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}},additionalProperties:!1},image:{type:"object",properties:{type:{description:"Type of the image",type:"string",const:"IMAGE"},overlay:{description:"Default overlay for the image",type:"string",enum:["COLOR","GRADIENT","NONE"]}},if:{properties:{overlay:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default color for the image overlay",type:"array",items:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},toggle:{type:"object",properties:{type:{description:"Type of the toggle",type:"string",const:"TOGGLE"},enabled:{description:"Default enabled status for the toggle",type:"boolean"}},additionalProperties:!1},info:{type:"object",properties:{type:{description:"Type of the info",type:"string",const:"INFO"},font:{description:"Default font for the info",type:"string"},size:{description:"Default size for the info",type:"integer",minimum:1,exclusiveMaximum:50},bold:{description:"Default boldness for the info",type:"boolean"},italic:{description:"Default italic style for the info",type:"boolean"},color:{description:"Default color for the info",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},visible:{description:"Default visibility for the info",type:"boolean"}},required:["type"],additionalProperties:!1},select_box:{type:"object",properties:{type:{description:"Type of the checkbox",type:"string",const:"SELECTBOX"},value:{description:"Default option for the checkbox",type:"string"}},additionalProperties:!1},background:{type:"object",properties:{type:{description:"Type of the background",type:"string",const:"BACKGROUND"},style:{description:"Style of the background",type:"string",enum:["COLOR","GRADIENT"]}},if:{properties:{style:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the background",type:"array",items:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},logo:{type:"object",properties:{type:{description:"Type of the logo",type:"string",const:"LOGO"},font:{description:"Default font for the text logo",type:"string"},size:{oneOf:[{description:"Default size for the logo text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the logo text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{description:"Default boldness for the text logo",type:"boolean"},italic:{description:"Default italic style for the text logo",type:"boolean"},color:{oneOf:[{description:"Default color for the logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{description:"Default visibility for the logo",type:"boolean"},spacing:{description:"Default spacing size for the text logo",type:"integer",minimum:1,exclusiveMaximum:10},capitalization:{description:"Default capitalization style for the text logo",type:"string",enum:["none","all","small"]},frame:{description:"Default frame for the text logo",type:"object",properties:{visible:{description:"Default visibility for the frame on text logo",type:"boolean"},width:{description:"Default width size for the frame on text logo",type:"integer",minimum:1,exclusiveMaximum:50},color:{oneOf:[{description:"Default color for frame on logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for frame on logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}},required:["visible","width","color"],additionalProperties:!1}},additionalProperties:!1}},bn={$schema:it,$id:at,title:ct,description:pt,type:lt,$defs:dt},ft={__proto__:null,$defs:dt,$id:at,$schema:it,default:bn,description:pt,title:ct,type:lt},ut="https://json-schema.org/draft/2020-12/schema",mt="https://lightspeedhq.com/section-content.schema.json",yt="Custom Section - Content",gt="The content of a custom section",ht="object",$t={"^.*$":{type:"object",properties:{type:{type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX","INFO","DECK","MENU","NAVIGATION_MENU","LOGO","DIVIDER"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"#/$defs/Inputbox"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"#/$defs/Textarea"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/Button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"#/$defs/Info"}},{if:{properties:{type:{const:"DECK"}}},then:{$ref:"#/$defs/Deck"}},{if:{properties:{type:{const:"MENU"}}},then:{$ref:"#/$defs/Menu"}},{if:{properties:{type:{const:"NAVIGATION_MENU"}}},then:{$ref:"#/$defs/NavigationMenu"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"#/$defs/Logo"}},{if:{properties:{type:{const:"DIVIDER"}}},then:{$ref:"#/$defs/Divider"}}]}},bt={Inputbox:{type:"object",properties:{type:{const:"INPUTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/InputboxDefaults"}},required:["type","label","placeholder"]},Textarea:{type:"object",properties:{type:{const:"TEXTAREA"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/TextareaDefaults"}},required:["type","label","placeholder"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ButtonDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"section-commons.schema.json#/$defs/Image"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ToggleDefaults"}},required:["type","label","description"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label","placeholder","description","options"]},Menu:{type:"object",properties:{type:{const:"MENU"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type"]},NavigationMenu:{type:"object",properties:{type:{const:"NAVIGATION_MENU"}},required:["type"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},button:{$ref:"#/$defs/InfoEditorButton"},defaults:{$ref:"#/$defs/InfoDefaults"}},required:["type","label","description"]},Divider:{type:"object",properties:{type:{const:"DIVIDER"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type","label"]},InputboxDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"}},required:["text"]},TextareaDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"}},required:["text"]},ButtonDefaults:{type:"object",properties:{title:{$ref:"../common.schema.json#/$defs/label_type"},buttonType:{type:"string",enum:["SCROLL_TO_TILE","HYPER_LINK","MAIL_LINK","TEL_LINK","GO_TO_STORE_LINK","GO_TO_PAGE"]},link:{type:"string",format:"uri"},linkTarget:{type:"string"},email:{type:"string"},phone:{type:"string"},tileId:{type:"string"}},required:["title"]},ImageDefaults:{type:"object",properties:{imageData:{$ref:"section-commons.schema.json#/$defs/Image"}}},ToggleDefaults:{type:"object",properties:{enabled:{type:"boolean"}}},SelectboxDefaults:{type:"object",properties:{value:{type:"string"}}},InfoDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"},button:{$ref:"#/$defs/InfoButtonDefaults"}}},SelectboxOption:{type:"object",properties:{label:{$ref:"../common.schema.json#/$defs/label_type"},value:{type:"string"}}},InfoEditorButton:{type:"object",properties:{label:{$ref:"../common.schema.json#/$defs/label_type"},link:{type:"string"}}},InfoButtonDefaults:{type:"object",properties:{title:{$ref:"../common.schema.json#/$defs/label_type"},link:{type:"string",minLength:0}}},Deck:{type:"object",properties:{type:{const:"DECK"},cards:{description:"Cards of the content configuration element",type:"object",properties:{defaultCardContent:{type:"object",properties:{settings:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the settings configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"#/$defs/Inputbox"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"#/$defs/Textarea"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/ButtonDefaults"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}}]}},minProperties:1}}}}},label:{$ref:"../common.schema.json#/$defs/label_type"},addButtonLabel:{$ref:"../common.schema.json#/$defs/label_type"},maxCards:{type:"number"}},required:["cards","maxCards","label","addButtonLabel","type"]}},Et=!1,En={$schema:ut,$id:mt,title:yt,description:gt,type:ht,patternProperties:$t,$defs:bt,additionalProperties:Et},Tt={__proto__:null,$defs:bt,$id:mt,$schema:ut,additionalProperties:Et,default:En,description:gt,patternProperties:$t,title:yt,type:ht},jt="https://json-schema.org/draft/2020-12/schema",wt="https://lightspeedhq.com/sections/section-translation.schema.json",Ot="Custom Section - Translations",_t="The translation of the section's labels",St="object",vt={"^[a-z]{2}$":{type:"object",patternProperties:{"^\\$.*$":{type:"string"}},additionalProperties:!1}},Dt=!1,Tn={$schema:jt,$id:wt,title:Ot,description:_t,type:St,patternProperties:vt,additionalProperties:Dt},At={__proto__:null,$id:wt,$schema:jt,additionalProperties:Dt,default:Tn,description:_t,patternProperties:vt,title:Ot,type:St},It="https://json-schema.org/draft/2020-12/schema",Ct="https://lightspeedhq.com/section-design.schema.json",Pt="Custom Section - Design",Nt="The design of a custom section",Lt="object",xt={"^.*$":{type:"object",properties:{type:{type:"string",enum:["TEXT","IMAGE","BUTTON","BACKGROUND","TOGGLE","COLOR_PICKER","RATING","SELECTBOX","SOCIAL_PROFILES","LOGO","INFO","DIVIDER"]}},required:["type"],allOf:[{if:{properties:{type:{const:"TEXT"}}},then:{$ref:"#/$defs/Text"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/Button"}},{if:{properties:{type:{const:"BACKGROUND"}}},then:{$ref:"#/$defs/Background"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"COLOR_PICKER"}}},then:{$ref:"#/$defs/Color"}},{if:{properties:{type:{const:"RATING"}}},then:{$ref:"#/$defs/Rating"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}},{if:{properties:{type:{const:"SOCIAL_PROFILES"}}},then:{$ref:"#/$defs/SocialProfile"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"#/$defs/Logo"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"#/$defs/Info"}},{if:{properties:{type:{const:"DIVIDER"}}},then:{$ref:"#/$defs/Divider"}}],additionalProperties:!0}},kt={Text:{type:"object",properties:{type:{const:"TEXT"},label:{$ref:"../common.schema.json#/$defs/label_type"},sizes:{type:"array",items:{type:"integer"}},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},hideSize:{type:["boolean","null"]},defaults:{$ref:"#/$defs/TextDesignDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ImageDesignDefaults"}},required:["type","label"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAutoColor:{type:["boolean","null"]},enableAlphaColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},hideSize:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ButtonDesignDefaults"}},required:["type","label"]},Background:{type:"object",properties:{type:{const:"BACKGROUND"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},defaults:{$ref:"#/$defs/BackgroundDesignDefaults"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ToggleDesignDefaults"}},required:["type","label"]},Color:{type:"object",properties:{type:{const:"COLOR_PICKER"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ColorPickerDefaults"}},required:["type","label"]},Rating:{type:"object",properties:{type:{const:"RATING"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/RatingDefaults"}},required:["type","label"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label"]},SocialProfile:{type:"object",properties:{type:{const:"SOCIAL_PROFILES"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SocialProfilesDefaults"}},required:["type","label"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},sizes:{type:"array",items:{type:"integer"}},defaults:{$ref:"#/$defs/LogoDesignDefaults"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},text:{type:"string"},button:{type:"object",properties:{title:{type:"string"},link:{type:"string"}},additionalProperties:!0}},required:["type","text"],additionalProperties:!0},Divider:{type:"object",properties:{type:{const:"DIVIDER"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type","label"]},TextDesignDefaults:{type:"object",properties:{font:{type:"string"},size:{oneOf:[{description:"Default size for the text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{oneOf:[{description:"Default color for the text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},ImageDesignDefaults:{type:"object",properties:{overlay:{type:"string"},visible:{type:"boolean"}},if:{properties:{overlay:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the image overlay",type:"array",items:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}},required:[]},ButtonDesignDefaults:{type:"object",properties:{appearance:{type:"string",enum:["SOLID","OUTLINE","TEXT"]},font:{type:"string"},size:{type:"string",enum:["SMALL","MEDIUM","LARGE"]},style:{type:"string",enum:["round-corner","rectangle","pill"]},color:{oneOf:[{description:"Default color for the button",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the button",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},BackgroundDesignDefaults:{type:"object",properties:{type:{description:"Type of the background",type:"string",const:"BACKGROUND"},style:{description:"Style of the background",type:"string",enum:["COLOR","GRADIENT"]}},if:{properties:{style:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the background",type:"array",items:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},ToggleDesignDefaults:{type:"object",properties:{enabled:{type:"boolean"}},required:[]},ColorPickerDefaults:{type:"object",properties:{appearance:{$ref:"section-commons.schema.json#/$defs/Color"}},required:[]},RatingDefaults:{type:"object",properties:{color:{$ref:"section-commons.schema.json#/$defs/Color"},visible:{type:"boolean"},style:{type:"string"}},required:[]},SelectboxDefaults:{type:"object",properties:{value:{type:"string"}},required:[]},SocialProfilesDefaults:{type:"object",properties:{color:{$ref:"section-commons.schema.json#/$defs/Color"},visible:{type:"boolean"},appearance:{type:"string"}},required:[]},LogoDesignDefaults:{type:"object",properties:{font:{type:"string"},size:{oneOf:[{description:"Default size for the logo text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the logo text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{oneOf:[{description:"Default color for the logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},SelectboxOption:{type:"object",properties:{value:{type:"string"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:[]}},jn={$schema:It,$id:Ct,title:Pt,description:Nt,type:Lt,patternProperties:xt,$defs:kt},Ft={__proto__:null,$defs:kt,$id:Ct,$schema:It,default:jn,description:Nt,patternProperties:xt,title:Pt,type:Lt},Rt="https://json-schema.org/draft/2020-12/schema",Gt="https://lightspeedhq.com/section-commons.schema.json",Mt="Custom Section - Content",Bt="The content of a custom section",qt="object",Ut={Image:{type:"object",properties:{set:{type:"object",properties:{MOBILE_WEBP_LOW_RES:{$ref:"#/$defs/ImageInfo"},MOBILE_WEBP_HI_RES:{$ref:"#/$defs/ImageInfo"},WEBP_LOW_RES:{$ref:"#/$defs/ImageInfo"},WEBP_HI_2X_RES:{$ref:"#/$defs/ImageInfo"},ORIGINAL:{$ref:"#/$defs/ImageInfo"}},additionalProperties:!1,minProperties:1},borderInfo:{$ref:"#/$defs/BorderInfo"}},additionalProperties:!1,required:["set"]},ImageInfo:{type:"object",properties:{url:{type:"string"},width:{type:"integer",minimum:0},height:{type:"integer",minimum:0}}},BorderInfo:{type:"object",properties:{homogeneity:{type:"boolean"},color:{$ref:"#/$defs/RGBA"}}},RGBA:{type:"object",properties:{r:{type:"integer",minimum:0,maximum:255},g:{type:"integer",minimum:0,maximum:255},b:{type:"integer",minimum:0,maximum:255},a:{type:"number",format:"double",minimum:0,maximum:1}},required:["r","g","b","a"]},HSL:{type:"object",properties:{h:{type:"number",format:"double"},s:{type:"number",format:"double"},l:{type:"number",format:"double"},a:{type:"number",format:"double"}},required:["h","s","l","a"]},Overlay:{type:"object",properties:{type:{type:"string",enum:["solid","gradient","none"]},solid:{$ref:"#/$defs/Solid"},gradient:{$ref:"#/$defs/Gradient"}}},Solid:{type:"object",properties:{color:{$ref:"#/$defs/Color"}}},Gradient:{type:"object",properties:{fromColor:{$ref:"#/$defs/Color"},toColor:{$ref:"#/$defs/Color"}}},Background:{type:"object",properties:{type:{type:"string",enum:["solid","gradient"]},solid:{$ref:"#/$defs/Solid"},gradient:{$ref:"#/$defs/Gradient"}}},Color:{type:"object",properties:{raw:{type:"string"},hex:{type:"string"},auto:{type:"boolean"},rgba:{$ref:"#/$defs/RGBA"},hsl:{$ref:"#/$defs/HSL"}}}},zt=!1,wn={$schema:Rt,$id:Gt,title:Mt,description:Bt,type:qt,$defs:Ut,additionalProperties:zt},Xt={__proto__:null,$defs:Ut,$id:Gt,$schema:Rt,additionalProperties:zt,default:wn,description:Bt,title:Mt,type:qt},Ht="https://json-schema.org/draft/2020-12/schema",Vt="https://lightspeedhq.com/section-showcase.schema.json",Kt="Custom Section - Showcase settings",Yt="The setting of a showcase",Jt="object",Wt=["showcaseId","previewImage"],Zt=[{properties:{showcaseId:{description:"Showcase id of the section",type:"string"},previewImage:{$ref:"section-commons.schema.json#/$defs/Image"}}},{$ref:"../showcase_overrides.schema.json"}],On={$schema:Ht,$id:Vt,title:Kt,description:Yt,type:Jt,required:Wt,allOf:Zt},Qt={__proto__:null,$id:Vt,$schema:Ht,allOf:Zt,default:On,description:Yt,required:Wt,title:Kt,type:Jt},eo="https://json-schema.org/draft/2020-12/schema",to="https://lightspeedhq.com/template.schema.json",oo="Custom Template",so="A custom template enclosing the necessary custom and default blocks",no="object",ro={metadata:{type:"object",properties:{name:{description:"Name of the template",type:"string",minLength:2,maxLength:60},description:{description:"Short description of the template",type:"string",minLength:2,maxLength:150},preview_url:{description:"Preview url of the demo website",type:"string",format:"uri",pattern:"^(https?)://([^.]+?\\.)?(company\\.site|ecwid\\.qa)($|/[A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=]*)?$"},cover_image:{type:"object",properties:{set:{description:"Name of the image set",type:"object",patternProperties:{".*":{type:"object",properties:{url:{description:"Path to the preview image relative to the 'assets' folder for a specific resolution",type:"string"}},required:["url"],additionalProperties:!1}}}},required:["set"],additionalProperties:!1}},required:["name","description","cover_image"],additionalProperties:!1},sections:{description:"List of sections contained by this template",type:"array",items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]}},allOf:[{if:{properties:{type:{const:"default"}}},then:{$ref:"template-default.schema.json#/$defs/default-section"}},{if:{properties:{type:{const:"custom"}}},then:{$ref:"template-custom.schema.json#/$defs/custom-section"}}]},minItems:1,uniqueItems:!1}},io=["metadata","sections"],_n={$schema:eo,$id:to,title:oo,description:so,type:no,properties:ro,required:io},ao={__proto__:null,$id:to,$schema:eo,default:_n,description:so,properties:ro,required:io,title:oo,type:no},co="https://json-schema.org/draft/2020-12/schema",po="https://lightspeedhq.com/showcase_overrides.schema.json",lo="Showcase overrides",fo="Overrides for the showcase",uo="object",mo={content:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX","LOGO","DECK","MENU","NAVIGATION_MENU","INFO"]}},allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/input_box"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"template-custom-content.schema.json#/$defs/text_area"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-content.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/select_box"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"template-custom-content.schema.json#/$defs/logo"}},{if:{properties:{type:{const:"DECK"}}},then:{$ref:"template-custom-content.schema.json#/$defs/deck"}}]}}},design:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the design configuration element",type:"string",enum:["TEXT","BUTTON","IMAGE","TOGGLE","SELECTBOX","BACKGROUND","LOGO"]}},allOf:[{if:{properties:{type:{const:"TEXT"}}},then:{$ref:"template-custom-design.schema.json#/$defs/text"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-design.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-design.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-design.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-design.schema.json#/$defs/select_box"}},{if:{properties:{type:{const:"BACKGROUND"}}},then:{$ref:"template-custom-design.schema.json#/$defs/background"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"template-custom-design.schema.json#/$defs/logo"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"template-custom-design.schema.json#/$defs/info"}}]}}},layoutId:{description:"Layout ID for the showcase",type:"string"},blockName:{description:"Section name for the showcase",$ref:"common.schema.json#/$defs/label_type"}},Sn={$schema:co,$id:po,title:lo,description:fo,type:uo,properties:mo},yo={__proto__:null,$id:po,$schema:co,default:Sn,description:fo,properties:mo,title:lo,type:uo},go="https://json-schema.org/draft/2020-12/schema",ho="https://lightspeedhq.com/common.schema.json",$o="Common Type Definitions",bo="Common type definitions, used throughout other schemas",Eo="object",To={label_type:{type:"string",pattern:"^\\$.+"}},vn={$schema:go,$id:ho,title:$o,description:bo,type:Eo,$defs:To},jo={__proto__:null,$defs:To,$id:ho,$schema:go,default:vn,description:bo,title:$o,type:Eo};var ce=(e=>(e.SECTION="SECTION",e.HEADER="HEADER",e.FOOTER="FOOTER",e))(ce||{});const m={SECTION:{source:"sections",dist:"dist/sections"},HEADER:{source:"headers",dist:"dist/headers"},FOOTER:{source:"footers",dist:"dist/footers"}};function H(e){return w(`${z}/${e}`)?"HEADER":w(`${X}/${e}`)?"FOOTER":"SECTION"}function wo(e){const t=H(e);return m[t].dist}var V=(e=>(e.CONTENT="Content",e.DESIGN="Design",e))(V||{});const Dn={menu:{type:"NAVIGATION_MENU"},logo:{type:"LOGO"}},An={logo:{type:"LOGO",colors:["#FFFFFF66","#0000004D","#00000099","#64C7FF66","#F9947266","#C794CD66","#FFD17466"],sizes:[18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60],defaults:{font:"global.fontFamily.body",size:40,bold:!0,italic:!1,color:"#313131",visible:!0,spacing:2,capitalization:"all",frame:{visible:!0,width:3,color:"#313131"}}}};function Oo(e){switch(e){case ce.HEADER:return Dn;default:return{}}}function _o(e){switch(e){case ce.HEADER:return An;default:return{}}}function In({validationType:e,sectionType:t}){switch(e){case V.CONTENT:return Oo(t);case V.DESIGN:return _o(t);default:return{}}}function Cn({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).filter(([s])=>t[s]!==void 0).forEach(([s,n])=>{const r=t[s];n.type!==r.type&&o.push({instancePath:s,keyword:"type-mismatch",message:`Editor type "${n.type}" for reserved key "${s}" does not match the required type "${r.type}".`})}),o}function Pn({type:e,mandatorySettings:t}){return Object.keys(t).find(o=>t[o].type===e)}function Nn({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).forEach(([s,n])=>{const r=Pn({type:n.type,mandatorySettings:t});r&&s!==r&&o.push({instancePath:s,keyword:"key-mismatch",message:`Editor key "${s}" for overriden content type "${n.type}" does not match the required key name "${r}".`})}),o}function Ln({type:e,mandatorySettings:t}){return Object.keys(t).findLast(o=>t[o].type===e)}function xn({sectionSettings:e,mandatorySettings:t}){const o=[],s=Object.values(t).map(({type:r})=>r),n=Object.values(e).map(({type:r})=>r);return new Set(n.filter(r=>s.includes(r))).forEach(r=>{if(n.filter(i=>i===r).length>1){const i=Ln({type:r,mandatorySettings:t});o.push({instancePath:i,keyword:"duplicate-type",message:`Editor type "${r}" can only be used once.`})}}),o}function kn(e,t){const{sectionSettings:o,sectionType:s}=t,n=In({validationType:e,sectionType:s});return n===void 0||ke(n)?[]:[...Cn({sectionSettings:o,mandatorySettings:n}),...Nn({sectionSettings:o,mandatorySettings:n}),...xn({sectionSettings:o,mandatorySettings:n})]}var u=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.ClientChunks=2]="ClientChunks",e[e.ClientAsset=3]="ClientAsset",e[e.Asset=4]="Asset",e[e.TemplateAsset=5]="TemplateAsset",e[e.Dependency=6]="Dependency",e[e.SourceCode=7]="SourceCode",e[e.Layout=8]="Layout",e))(u||{}),oe=(e=>(e.PRODUCT="PRODUCT",e.CATALOG="CATALOG",e.CATEGORY="CATEGORY",e.HOME="HOME",e.CUSTOM="CUSTOM",e))(oe||{});const K={[u.Server]:{type:"server_js_compressed",fileName:"server.js.gz",isSingleton:!0,toPath:({id:e,sectionType:t})=>`${m[t].dist}/${e}/js/main/server/`},[u.Client]:{type:"client_js",fileName:"client.js",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${m[t].dist}/${e}/js/main/client/`},[u.ClientChunks]:{type:"client_js_chunks",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${m[t].dist}/${e}/js/main/client/chunks/`,fileName:"*"},[u.ClientAsset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${m[t].dist}/${e}/js/main/client/assets/`},[u.Asset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${m[t].dist}/${e}/assets/`},[u.TemplateAsset]:{type:"template_assets",fileName:"*",isSingleton:!1,toPath:()=>`${S}/assets/`},[u.Dependency]:{type:"dependencies",fileName:"package.json",isSingleton:!0,toPath:()=>{}},[u.SourceCode]:{type:"source_code",fileName:"source-code.zip",isSingleton:!0,toPath:()=>{}},[u.Layout]:{type:"layout",fileName:"index.mjs",isSingleton:!0,toPath:({id:e,layoutId:t})=>`${ne}/${e}/${t}/`}},Y=[Xt,Ft,Tt,Qt,ao,Xe,Ze,rt,ft,yo,jo];function M(e,t){const o=new Rs({allErrors:!0,schemas:e});return Gs(o),o.getSchema(t.$id)||o.compile(t)}function Fn(){return M(Y,ao)}function pe(e){return e.map(t=>({instancePath:t.instancePath,message:t.message??"",keyword:t.keyword}))}const Rn=e=>(()=>{const t=wo(e.name),o=t.split("/").pop()?.toLowerCase();return[{source:`./${o}/${e.name}/settings/content.ts`,dist:g.resolve(`${t}/${e.name}/js/settings/content`),ajv:M(Y,Tt),validationType:V.CONTENT,sectionName:e.name,type:e.type},{source:`./${o}/${e.name}/settings/design.ts`,dist:g.resolve(`${t}/${e.name}/js/settings/design`),ajv:M(Y,Ft),validationType:V.DESIGN,sectionName:e.name,type:e.type},{source:`./${o}/${e.name}/settings/translations.ts`,dist:g.resolve(`${t}/${e.name}/js/settings/translations`),ajv:M(Y,At),type:e.type},...e.showcaseEntryPoints.map(s=>({source:`./${o}/${e.name}/showcases/${F(s).name}.ts`,dist:g.resolve(`${t}/${e.name}/js/showcases/${F(s).name}`),ajv:M(Y,s.indexOf("translations")===-1?Qt:At),type:e.type,sectionName:e.name}))]})();function Gn(e){const t=n=>{const r=(n??"").split("/").filter(i=>i.length>0);return r.length===0?"$":`$${r.map(i=>`.${i}`).join("")}`};let o=0,s=0;Object.keys(e).forEach(n=>{const r=e[n];o=Math.max(o,Math.max(...r.map(i=>t(i.instancePath).length))),s=Math.max(s,Math.max(...r.map(i=>i.message.length)))}),Object.keys(e).forEach(n=>{const r=e[n].filter((i,c,l)=>c===l.findIndex(d=>`${i.instancePath}${i.message}${i.keyword}`==`${d.instancePath}${d.message}${d.keyword}`));a.error(n),r.filter(i=>i.keyword!=="if").forEach(i=>{a.error(`${t(i.instancePath).padEnd(o," ")} | ${i.message.padEnd(s," ")} | ${i.keyword||"-"}`)})})}function Mn(e,t){if(e.validationType===void 0||e.sectionName===void 0)return[];const{sectionName:o,validationType:s}=e,n=H(o);return[...kn(s,{sectionSettings:t,sectionType:n})]}function So(e,t){return qs({path:"$..set..url",json:t,resultType:"value"}).map(o=>{if(new RegExp(/^https?:\/\//).test(o))return null;const s=`${e}/assets/${o}`;return w(s)?null:{message:`Image ${o} is missing from assets folder`,keyword:"missing-asset"}}).filter(o=>o!==null)}async function Bn(e){const t=await G(e.dist,!1),o={},s=[],n=wo(e.sectionName??"").split("/").pop()?.toLowerCase();return e.ajv(t)||s.push(...pe(e.ajv.errors??[])),s.push(...Mn(e,t),...So(`${n}/${e.sectionName}`,t)),s.length>0&&(o[e.source]=s),o}async function qn(e){const t=Bs(Ms.gunzip),o=await h.promises.readFile(e);return(await t(o)).length}async function Un(e,t){const o=K[u.Server],s=g.resolve(`${o.toPath({id:e,sectionType:t})}${o.fileName}`),n=await qn(s);if(n>Ne)throw a.error(`Size of individual server file must not exceed threshold [${U(Ne)}]!`),a.error(`${`File: ${s}`.padEnd(s.length+10)}| ${U(n)}`),new Error("Invalid server file size")}function zn(e){const t=e.reduce((o,s)=>{const n=Ns(s);return n.size>Pe&&(o[s]=U(n.size)),o},{});if(Object.keys(t).length!==0){const o=Math.max(...Object.keys(t).map(s=>s.length));a.error(`Size of individual assets must not exceed threshold [${U(Pe)}]!`);for(const s in t)a.error(`${`File: ${s}`.padEnd(o+10)}| ${t[s]}`);throw new Error("Invalid asset file size")}}function Xn(e,t,o,s){const n={};return e(t)&&s===void 0?Te(`${o}${C}.mjs`,`${o}.mjs`,()=>{}):(je(`${o}${C}.mjs`,()=>{}),n[g.resolve(`./templates/${F(o).name}.ts`)]=[...pe(e.errors??[]),...s??[]]),n}var j=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.Misc=2]="Misc",e[e.Layout=3]="Layout",e))(j||{}),y=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.SectionSetting=2]="SectionSetting",e[e.SectionShowcase=3]="SectionShowcase",e[e.SectionAsset=4]="SectionAsset",e[e.TemplateDescriptor=5]="TemplateDescriptor",e[e.PageTemplateDescriptor=6]="PageTemplateDescriptor",e[e.TemplateAsset=7]="TemplateAsset",e[e.Layout=8]="Layout",e))(y||{});const vo="https://json-schema.org/draft/2020-12/schema",Do="https://lightspeedhq.com/metadata.schema.json",Ao="Custom Multi Page Template metadata",Io="Metadata of a multi page template",Co="object",Po={metadata:{type:"object",properties:{name:{description:"Name of the template",type:"string",minLength:2,maxLength:60},description:{description:"Short description of the template",type:"string",minLength:2,maxLength:150},preview_url:{description:"Preview url of the demo website",type:"string",format:"uri",pattern:"^(https?)://([^.]+?\\.)company\\.site($|/[A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=]*)?$"},cover_image:{type:"object",properties:{set:{description:"Name of the image set",type:"object",patternProperties:{".*":{type:"object",properties:{url:{description:"Path to the preview image relative to the 'assets' folder for a specific resolution",type:"string"}},required:["url"],additionalProperties:!1}}}},required:["set"],additionalProperties:!1}},required:["name","description","cover_image"],additionalProperties:!1},header:{$ref:"./header_footer.schema.json"},footer:{$ref:"./header_footer.schema.json"}},No=["metadata","header","footer"],Lo=!1,Hn={$schema:vo,$id:Do,title:Ao,description:Io,type:Co,properties:Po,required:No,additionalProperties:Lo},Vn={__proto__:null,$id:Do,$schema:vo,additionalProperties:Lo,default:Hn,description:Io,properties:Po,required:No,title:Ao,type:Co},xo="https://json-schema.org/draft/2020-12/schema",ko="https://lightspeedhq.com/header_footer.schema.json",Fo="Header/Footer definition for a page template",Ro="object",Go=["type","id"],Mo={type:{type:"string",enum:["custom","default"]},id:{type:"string"}},Bo=!1,qo=[{if:{properties:{type:{const:"default"}}},then:{properties:{id:{enum:["header","footer"]}}}}],Kn={$schema:xo,$id:ko,title:Fo,type:Ro,required:Go,properties:Mo,additionalProperties:Bo,allOf:qo},Yn={__proto__:null,$id:ko,$schema:xo,additionalProperties:Bo,allOf:qo,default:Kn,properties:Mo,required:Go,title:Fo,type:Ro},Uo="https://json-schema.org/draft/2020-12/schema",zo="https://lightspeedhq.com/page.schema.json",Xo="Homepage",Ho="Homepage enclosing the necessary custom and default blocks",Vo="object",Ko={sections:{description:"List of sections contained by this page",type:"array",items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]}},allOf:[{if:{properties:{type:{const:"custom"}}},then:{$ref:"../template-custom.schema.json#/$defs/custom-section"}},{if:{properties:{type:{const:"default"}}},then:{$ref:"../template-default.schema.json#/$defs/default-section"}},{not:{properties:{id:{enum:["header","footer"]}},required:["id"]}}]},minItems:1,uniqueItems:!1}},Yo=!1,Jo=["sections"],Jn={$schema:Uo,$id:zo,title:Xo,description:Ho,type:Vo,properties:Ko,additionalProperties:Yo,required:Jo},Wn={__proto__:null,$id:zo,$schema:Uo,additionalProperties:Yo,default:Jn,description:Ho,properties:Ko,required:Jo,title:Xo,type:Vo},Wo="https://json-schema.org/draft/2020-12/schema",Zo="https://lightspeedhq.com/page.schema.json",Qo="Custom Page",es="A custom page enclosing the necessary custom and default blocks",ts="object",os={sections:{description:"List of sections contained by this page",type:"array",minItems:1,maxItems:1,uniqueItems:!1,items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]},id:{description:"Unique identifier for the section",type:"string"}},required:["type"],allOf:[{if:{properties:{type:{const:"default"}}},then:{$ref:"./product-browser.schema.json"}},{if:{properties:{type:{const:"custom"}}},then:{$ref:"../template-custom.schema.json#/$defs/custom-section"}}]}}},ss=!1,ns=["sections"],Zn={$schema:Wo,$id:Zo,title:Qo,description:es,type:ts,properties:os,additionalProperties:ss,required:ns},le={__proto__:null,$id:Zo,$schema:Wo,additionalProperties:ss,default:Zn,description:es,properties:os,required:ns,title:Qo,type:ts},rs="https://json-schema.org/draft/2020-12/schema",is="https://lightspeedhq.com/product-browser.schema.json",as="Product Browser Section",cs="Product browser section for a custom page",ps="object",ls=[{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"default"},id:{description:"Identification of the section",type:"string",enum:["catalog","product","category"]},layout_id:{description:"Layout id of the section",type:"string"}},required:["type","id"],additionalProperties:!1}],Qn={$schema:rs,$id:is,title:as,description:cs,type:ps,allOf:ls},er={__proto__:null,$id:is,$schema:rs,allOf:ls,default:Qn,description:cs,title:as,type:ps},tr="https://blockbuster.ecwid.com",or="/api/v1/custom-apps/resources/sections/upload",sr="/api/v1/custom-apps/resources/templates/upload",nr="/api/v1/custom-apps/manifests/sections",rr="/api/v1/custom-apps/manifests/templates",ir=5,ar=3,cr=[u.Server,u.Client,u.ClientChunks,u.ClientAsset,u.Asset],pr=[u.Dependency,u.TemplateAsset,u.SourceCode],B={DEFAULT:"Error while deploying:",ASSET_FILES_UPLOAD:"Error while uploading asset files:",MANIFEST_DEPLOYMENT:"Error while deploying manifest file:",DEPRECATED_VERSION_DEPLOYMENT:"You are using a non-supported version of crane. Please update to the latest crane version to continue.",DISTRIBUTION_FOLDER_NOT_FOUND:e=>`Distribution folder [${e}] not found, please execute the build command first.`},ds={catalog:"products",category:"category",product:"product"},lr=e=>ds[e],dr=e=>e in ds,fr=[Xt,Xe,Ze,yo,ft,rt,er,Yn,jo],ur=e=>{const t=[],o={},s=(n,r,i)=>{if(!n){o[e.name]||(o[e.name]=[]),o[e.name].push({instancePath:`/templates/${e.name}/${r}`,message:`Missing file: ${r}`,keyword:"required"});return}t.push({templateName:e.name,source:n,dist:g.resolve(`dist/templates/${e.name}/${r}`),ajv:M(fr,i)})};return s(e.catalogEntrypoint,"catalog",le),s(e.productEntrypoint,"product",le),s(e.homeEntrypoint,"home",Wn),s(e.categoryEntrypoint,"category",le),s(e.configurationEntrypoint,"configuration",Vn),[t,o]};function mr(e,t){if(t.findIndex(o=>o===`${e.id}${x}${e.layout_id}`)===-1)return{instancePath:`/sections/${e.id}/layout_id`,message:`Layout "${e.layout_id}" for section "${e.id}" not found in "layouts/${e.id}/".`,keyword:"layout_not_found"}}async function yr(e,t){const o=(t??[]).map(xe);return e.sections.filter(s=>dr(s.id)).filter(s=>"layout_id"in s).map(s=>mr(s,o)).filter(s=>s!==void 0)}function gr(e){return"sections"in e}async function hr(e,t){const o=await G(e.dist,!0),s={},n=[];if(e.ajv(o)?Te(`${e.dist}${C}.mjs`,`${e.dist}.mjs`,()=>{}):(n.push(...pe(e.ajv.errors??[])),je(`${e.dist}${C}.mjs`,()=>{})),gr(o)){const r=await yr(o,t);n.push(...r)}return n.length>0&&(s[e.source]=n),s}const $r=async(e,t)=>{const[o,s]=ur(e);return(await Promise.all(o.map(n=>hr(n,t)))).reduce((n,r)=>(Object.entries(r).forEach(([i,c])=>{n[i]=n[i]?[...n[i],...c]:[...c]}),n),{...s})};async function br(e,t,o,s=E){if(t.showcase_overrides?.content!==void 0)if(!w(`${s}/${t.id}/js/settings/content.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/content`,message:"Content descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/content`,!1),r=new Set(Object.keys(n));Object.keys(t.showcase_overrides.content).every(i=>r.has(i))||e.push({instancePath:`/sections/${o}/showcase_overrides/content`,message:"Content descriptor must be a subset of the default content descriptor",keyword:"type"})}}async function Er(e,t,o,s=E){if(t.showcase_overrides?.design!==void 0)if(!w(`${s}/${t.id}/js/settings/design.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/design`,message:"Design descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/design`,!1),r=new Set(Object.keys(n));Object.keys(t.showcase_overrides.design).every(i=>r.has(i))||e.push({instancePath:`/sections/${o}/showcase_overrides/design`,message:"Design descriptor must be a subset of the default design descriptor",keyword:"type"})}}async function Tr(e,t,o,s=E){if(t.showcase_overrides?.layoutId!==void 0)if(!w(`${s}/${t.id}/js/settings/layout.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/layout`,message:"Layout id descriptor is set, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/layout`,!1);new Set(n.map(r=>r.layoutId)).has(t.showcase_overrides.layoutId)||e.push({instancePath:`/sections/${o}/showcase_overrides/layout`,message:"Layout id descriptor must be a valid id in the default layout descriptor",keyword:"type"})}}async function de(e,t,o,s=E){t.showcase_overrides!==void 0&&(await br(e,t,o,s),await Er(e,t,o,s),await Tr(e,t,o,s))}function fe(e,t,o,s=E){t.showcase_id!==void 0&&(w(`${s}/${t.id}/js/showcases/${t.showcase_id}.mjs`)||e.push({instancePath:`/sections/${o}/showcase-id`,message:"Custom section must have a corresponding showcase defined in case showcase_id is specified",keyword:"required"}))}async function jr(e,t){const o=t.id==="header"&&t.type==="default",s=w(`${z}/${t.id}`);!o&&!s&&e.push({instancePath:"/sections/0/id",message:"The first section must be a `header`",keyword:"required"}),s&&(await de(e,t,0,z),fe(e,t,0,z))}async function wr(e,t,o){const s=t.id==="footer"&&t.type==="default",n=w(`${X}/${t.id}`);!s&&!n&&e.push({instancePath:`/sections/${o}/id`,message:"The last section must be a `footer`",keyword:"required"}),n&&(await de(e,t,o,X),fe(e,t,o,X))}async function Or(e,t){t.showcase_overrides&&e.push(...So(`sections/${t.id}`,t.showcase_overrides))}async function _r(e){const t=await e.sections.reduce(async(o,s,n)=>{const r=await o;return n===0?await jr(r,s):n===e.sections.length-1?await wr(r,s,e.sections.length-1):s.type==="custom"?w(`${E}/${s.id}`)?(await de(r,s,n),fe(r,s,n),await Or(r,s)):r.push({instancePath:`/sections/${n}/id`,message:"Custom section must have a corresponding block defined",keyword:"required"}):s.type==="default"&&(s.id==="header"&&r.push({instancePath:`/sections/${n}/id`,message:"Header can only be placed as the first section",keyword:"required"}),s.id==="footer"&&r.push({instancePath:`/sections/${n}/id`,message:"Footer can only be placed as the last section",keyword:"required"})),r},Promise.resolve([]));return t.length>0?t:void 0}async function Sr(){const e=await p("./templates/*",{ignore:["templates/assets/**","templates/**.{js,ts}","node_modules/**","dist/**"]}).catch(t=>(a.error(`Error while getting page template entry points: ${t}`),[]));return Promise.all(e.map(async t=>{const o=t.split(x),s=o.pop()??"default";if(o.pop()===void 0)throw new Error("Cannot determine template with custom pages, outer directory is undefined");const n=await p(`**/${s}/configuration.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),r=await p(`**/${s}/pages/home.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await p(`**/${s}/pages/category.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await p(`**/${s}/pages/catalog.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),l=await p(`**/${s}/pages/product.{js,ts}`,{ignore:["node_modules/**","dist/**"]});return{name:s,configurationEntrypoint:n.at(0),homeEntrypoint:r.at(0),categoryEntrypoint:i.at(0),catalogEntrypoint:c.at(0),productEntrypoint:l.at(0)}}))}async function vr(){const e=await p("./templates/**.{js,ts}",{ignore:["node_modules/**","dist/**"]}),t=await p("./templates/assets/*",{ignore:["node_modules/**","dist/**"]});return{pageTemplates:await Sr(),templates:e,assets:t}}async function Dr(e){if(e.templates.length===0&&e.pageTemplates?.length===0)return{};const t=await Fn();return await L(void 0,e.assets,y.TemplateAsset),await L(void 0,e.templates,y.TemplateDescriptor),e.templates.reduce(async(o,s)=>{const n=await o,r=`${S}/js/${F(s).name}`,i=await G(r,!0);return{...n,...Xn(t,i,r,await _r(i))}},Promise.resolve({}))}async function Ar({templateBuildConfig:e,layoutEntrypoints:t}){return e.pageTemplates?.reduce(async(o,s)=>{const n=await o,r=[s.configurationEntrypoint,s.homeEntrypoint,s.categoryEntrypoint,s.catalogEntrypoint,s.productEntrypoint].filter(te);if(r.length===0)throw new Error("No entry points provided for page template");return await L(s.name,r,y.PageTemplateDescriptor),{...n,...await $r(s,t)}},Promise.resolve({}))??{}}async function Ir({layoutEntrypoints:e}){const t=await vr(),o=await Promise.all([Dr(t),Ar({templateBuildConfig:t,layoutEntrypoints:e})]);return o.some(s=>!ke(s))?o.reduce((s,n)=>({...s,...n}),{}):{}}const Cr=()=>Us({ext:".gz",algorithm:"gzip",deleteOriginFile:!0}),Pr="/* EXTERNAL_IMPORTS_START */",Nr="/* EXTERNAL_IMPORTS_END */",Lr=()=>({name:"external-imports-wrapper-plugin",enforce:"post",apply:"build",generateBundle(e,t){for(const o of Object.keys(t)){const s=t[o];if(s.type==="chunk"){const n=/import.*\?commonjs-external["'];/g,r=s.code.match(n);if(r!==null){const i=r.join(""),c=Pr+i+Nr,l=s.code.replace(n,"");s.code=c+l}}}}}),xr=()=>{const e=process.env.npm_lifecycle_event;return Hs({typescript:!0,vueTsc:!1,eslint:e==="test"?!1:{lintCommand:`eslint --max-warnings=0 "./sections/**/*.{js,ts,vue}" --cache --cache-location "./build/eslintcache/${e}.json"`}})},v={VUE:zs(),TS_CONFIG_PATHS:Xs(),CHECKER:xr()},kr={[j.Server]:[v.VUE,v.TS_CONFIG_PATHS,Lr(),Cr()],[j.Client]:[v.VUE,v.TS_CONFIG_PATHS,v.CHECKER,De({vue:"EcVue"})],[j.Misc]:[v.TS_CONFIG_PATHS,v.CHECKER],[j.Layout]:[v.VUE,v.TS_CONFIG_PATHS,v.CHECKER,De({vue:"StVue"})]},fs={"process.env":{NODE_ENV:"production"}},Fr=[...ve,...ve.map(e=>`node:${e}`)],Rr=[/@vue\/compiler-dom/,/@vue\/runtime-dom/,/@vue\/server-renderer/,/@vue\/compiler-ssr/,/@vue\/shared/],D={[y.Server]:{pluginType:j.Server,define:fs,ssr:!0,ssrOptions:{noExternal:!0},outDir:(e,t)=>`./${m[t].dist}/${e}/js/main/server`,externalOption:[...Fr,...Rr],entryFileNames:"server.js",inlineDynamicImports:!0},[y.Client]:{pluginType:j.Client,define:fs,ssr:!1,outDir:(e,t)=>`./${m[t].dist}/${e}/js/main/client`,entryFileNames:"client.js",assetFileNames:"assets/[name].[ext]",chunkFileNames:"chunks/[name].js",inlineDynamicImports:!1},[y.SectionSetting]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${m[t].dist}/${e}/js/settings`,entryFileNames:"[name].mjs"},[y.SectionShowcase]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${m[t].dist}/${e}/js/showcases`,entryFileNames:"[name].mjs"},[y.SectionAsset]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${m[t].dist}/${e}/assets`,assetFileNames:"[name].[ext]"},[y.TemplateDescriptor]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${S}/js`,entryFileNames:`[name]${C}.mjs`},[y.PageTemplateDescriptor]:{pluginType:j.Misc,ssr:!1,outDir:e=>`./${S}/${e}`,entryFileNames:`[name]${C}.mjs`},[y.TemplateAsset]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${S}/assets`,assetFileNames:"[name].[ext]"},[y.Layout]:{pluginType:j.Layout,ssr:!1,outDir:e=>`./${ne}/${e}`,entryFileNames:"index.mjs",inlineDynamicImports:!0}};function Gr(e){switch(typeof e){case"string":return[f(process.cwd(),e)];case"object":return e.map(t=>f(process.cwd(),t));default:return[]}}function us({name:e,entryPoints:t,configType:o,sectionType:s}){const n=D[o].define,r=D[o].ssrOptions,i=D[o].entryFileNames,c=D[o].chunkFileNames,l=D[o].assetFileNames,d=D[o].inlineDynamicImports,$=D[o].externalOption;return{plugins:kr[D[o].pluginType],...n!==void 0&&{define:n},...r!==void 0&&{ssr:r},resolve:{alias:{"@":"/src"}},css:{preprocessorOptions:{scss:{api:"modern-compiler"}}},build:{ssr:D[o].ssr,outDir:D[o].outDir(e,s),emptyOutDir:!0,minify:"terser",terserOptions:{compress:{drop_console:!1}},rollupOptions:{...$!==void 0&&{external:$},preserveEntrySignatures:"strict",input:Gr(t),treeshake:{moduleSideEffects:!1},output:{validate:!0,inlineDynamicImports:d,...i!==void 0&&{entryFileNames:i},...c!==void 0&&{chunkFileNames:c},...l!==void 0&&{assetFileNames:l}}}}}}async function Mr(e){const t=_e(us({name:e.name,entryPoints:e.serverEntrypoint,configType:y.Server,sectionType:e.type}));return zn(e.assetEntryPoints),await Se({configFile:!1,...t}),await Un(e.name,e.type),await L(e.name,e.clientEntrypoint,y.Client,e.type),await L(e.name,e.settingsEntryPoints,y.SectionSetting,e.type),await L(e.name,e.showcaseEntryPoints,y.SectionShowcase,e.type),await L(e.name,e.assetEntryPoints,y.SectionAsset,e.type),await Rn(e).reduce(async(o,s)=>{const n=await o,r=await Bn(s);return{...n,...r}},Promise.resolve({}))}async function Br(e){return e.reduce(async(t,o)=>{const s=await t,n=await Mr(o);return{...s,...n}},Promise.resolve({}))}function qr(e){const t=xe(e);return L(t,[e],y.Layout)}function Ur(){return p(`./${Ce}/{product,category,catalog}/*/Main.vue`,{ignore:["node_modules/**","dist/**"]})}async function zr(e){e===void 0||e.length===0||await Promise.all(e.map(qr))}function Xr(e){return Object.entries(m).find(t=>t[1].source===e)?.[0]}async function Hr(){const e=await p("**/server.{js,ts}",{ignore:["node_modules/**","dist/**","templates/**"]});return Promise.all(e.map(async t=>{const o=Is(t).split(x),s=o.pop()??"default",n=o.pop();if(n===void 0)throw new Error("Cannot determine type of section, outer directory is undefined");const r=await p(`**/${s}/client.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await p(`**/${s}/settings/content.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await p(`**/${s}/settings/design.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),l=await p(`**/${s}/settings/layout.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),d=await p(`**/${s}/settings/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),$=await p(`**/${s}/showcases/*.{js,ts}`,{ignore:["node_modules/**","dist/**",`**/${s}/showcases/translations.{js,ts}`]}),vs=await p(`**/${s}/showcases/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),Ds=await p(`**/${s}/assets/*`,{ignore:["node_modules/**","dist/**"]});return{name:s,type:Xr(n),serverEntrypoint:t,clientEntrypoint:r.at(0),contentSettingsEntrypoint:i.at(0),designSettingsEntrypoint:c.at(0),layoutSettingsEntrypoint:l.at(0),settingsTranslationsEntrypoint:d.at(0),showcasesEntrypoints:$,showcasesTranslationsEntrypoint:vs.at(0),assetsEntrypoints:Ds}}))}function Vr(){return Promise.all([se.rm("dist",{recursive:!0,force:!0}),se.rm("source-code",{recursive:!0,force:!0}),se.rm("source-code.zip",{force:!0})])}async function Kr(){const e=new Fs,t=["node_modules/**/*","dist/**/*","build/**/*",".git/**/*","**/assets/**/*","crane.config.json"],o=await p("**/*",{cwd:f(process.cwd()),ignore:t,dot:!0,nodir:!0});try{o.forEach(r=>{const i=f(process.cwd(),r);e.addLocalFile(i,F(r).dir)});const s=K[u.SourceCode].fileName,n=f(process.cwd(),s);await e.writeZipPromise(n)}catch(s){throw a.error("Error while zipping source files"),s}}async function Yr(e=!1){await Vr();try{const t=await Ur(),o=await Hr().then(n=>n.map(r=>({name:r.name,type:r.type,serverEntrypoint:r.serverEntrypoint,clientEntrypoint:[r.clientEntrypoint].filter(te).flat(),settingsEntryPoints:[r.contentSettingsEntrypoint,r.designSettingsEntrypoint,r.layoutSettingsEntrypoint,r.settingsTranslationsEntrypoint].filter(te),showcaseEntryPoints:[...r.showcasesEntrypoints??[],r.showcasesTranslationsEntrypoint].filter(te),assetEntryPoints:r.assetsEntrypoints??[]}))),s={...await Br(o),...await Ir({layoutEntrypoints:t})};Object.keys(s).length===0?(await zr(t),await Kr(),a.info("Build successful. For deploy run: npx @lightspeed/crane@latest deploy")):(a.error("Error during build:"),Gn(s))}catch(t){a.error(`Error while building: ${t.message}`),process.exit(1)}}async function L(e,t,o,s="SECTION"){if(t.length!==0){const n=_e(us({name:e,entryPoints:t,configType:o,sectionType:s}));await Se({configFile:!1,...n})}}const Jr=e=>`\x1B[32m${e}\x1B[0m`,Wr=(e,t,o,s,n)=>{if(!e.total)return;const{loaded:r}=e,i=(Date.now()-n)/1e3;o.value+=r-s.value,s.value=r,t.update({speed:`${U(o.value/i,2)}/s`})},Zr=()=>new Js.SingleBar({format:`|${Jr("{bar}")}| {status} || {percentage}% || {value}/{total} Files || Speed: {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591"});function ue(e,t){return Object.keys(e).reduce((o,s)=>{const n=e[s],r=t[s];return Le(n)&&Le(r)?o[s]=ue(n,r):o[s]=n,o},{...t})}function Qr({contentSettings:e,sectionType:t}){const o=Oo(t);return ue(e,o)}function ei({designSettings:e,sectionType:t}){const o=_o(t);return ue(e,o)}function me(e){if(e!==void 0)return e.startsWith("global.")?{type:"GLOBAL_FONT",font:e}:{type:"PRESET_FONT",font:e}}function _(e){if(e===void 0)return;if(e.startsWith("global."))return{type:"GLOBAL_COLOR",raw:e};const t=Ws(e);return{type:"STRUCTURED_COLOR",raw:e,hex:t.toHex8String(),hsl:t.toHsl(),rgba:t.toRgb(),auto:!1}}function ms(e){if(e!==void 0)return typeof e=="string"&&e.startsWith("global.")?{type:"GLOBAL_TEXT_SIZE",size:e}:{type:"NUMERIC_TEXT_SIZE",size:Number(e)}}const ti={COLOR:"COLOR",GRADIENT:"GRADIENT"};function oi(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";default:throw new Error(`Unknown background type: ${e}. Right options: ${Object.keys(ti)}`)}}function si(e){const t=e.style,o=e.color,s=Array.isArray(o)?o:[o,o];return e.background={type:oi(t),solid:{color:_(s.at(0))},gradient:{fromColor:_(s.at(0)),toColor:_(s.at(1))}},e.style=void 0,e.color=void 0,e}const ni={SOLID:"SOLID",OUTLINE:"OUTLINE",TEXT:"TEXT"};function ri(e){switch(e){case"SOLID":return"solid-button";case"OUTLINE":return"outline-button";case"TEXT":return"text-link";default:throw new Error(`Unknown button appearance: ${e}. Right options: ${Object.keys(ni)}`)}}const ii={SMALL:"SMALL",MEDIUM:"MEDIUM",LARGE:"LARGE"};function ai(e){switch(e){case"SMALL":return"small";case"MEDIUM":return"medium";case"LARGE":return"large";default:throw new Error(`Unknown button size: ${e}. Right options: ${Object.keys(ii)}`)}}const ci={ROUND_CORNER:"ROUND_CORNER",RECTANGLE:"RECTANGLE",PILL:"PILL"};function pi(e){switch(e){case"ROUND_CORNER":return"round-corner";case"RECTANGLE":return"rectangle";case"PILL":return"pill";default:throw new Error(`Unknown button shape: ${e}. Right options: ${Object.keys(ci)}`)}}function li(e){const t=e.appearance;t!==void 0&&(e.appearance=ri(t));const o=e.size;o!==void 0&&(e.size=ai(o));const s=e.shape;s!==void 0&&(e.style=pi(s),e.shape=void 0);const n=e.font;e.font=me(n);const r=e.color;return e.color=_(r),e}const di={COLOR:"COLOR",GRADIENT:"GRADIENT",NONE:"NONE"};function fi(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";case"NONE":return"none";default:throw new Error(`Unknown image overlay type: ${e}. Right options: ${Object.keys(di)}`)}}function ui(e){const t=e.overlay,o=e.color,s=Array.isArray(o)?o:[o,o];return e.overlay={type:fi(t),solid:{color:_(s.at(0))},gradient:{fromColor:_(s.at(0)),toColor:_(s.at(1))}},e.color=void 0,e}function mi(e){const t=e.font;e.font=me(t);const o=e.color;e.color=_(o);const s=e.size;return e.size=ms(s),e}function yi(e){const t=e.color;return e.color=_(t),e}function gi(e){const t=e.font;e.font=me(t);const o=e.color;e.color=_(o);const s=e.size;if(e.size=ms(s),e.frame!==void 0){const n=e.frame.color;e.frame.color=_(n)}return e}function ye(e,t){switch(e){case"TEXT":{mi(t);break}case"BUTTON":{li(t);break}case"IMAGE":{ui(t);break}case"BACKGROUND":{si(t);break}case"COLOR_PICKER":{yi(t);break}case"LOGO":{gi(t);break}case"TOGGLE":case"DIVIDER":case"SELECTBOX":break;default:throw new Error(`Unknown design editor type: ${e}`)}return t}function hi(e){Object.keys(e).forEach(t=>{const o=e[t];o.type!=="DIVIDER"&&ye(o.type,o.defaults)})}function $i(e){e.forEach(t=>{t.type!==void 0&&t.defaults!==void 0&&(ye(t.type,t.defaults),t.defaults.type=t.type)})}function ys(e){Object.keys(e).forEach(t=>{const o=e[t],s=o.type;ye(s,o)})}function bi(e,t){if(!t)return;const o=e[t];return o===void 0?{en:t}:o}function Ei(e){const t={};for(const o in e){const s=e[o];for(const n in s){const r=t[n],i=s[n];if(r===void 0){const c={};c[o]=i,t[n]=c}else r[o]=i}}return t}function J(e,t){if(!e||typeof e!="object")return;const o=e;for(const s in o){const n=o[s];typeof n=="string"&&n.startsWith("$")&&!Array.isArray(e)?o[s]=bi(t,n):typeof n=="object"&&J(n,t)}}async function q(e){return(await import(we(e).href)).default}async function Ti(e,t,o=E){try{const s=f(I.cwd(),`${o}/${e}/js/settings/content.mjs`),n=await q(s),r=H(e),i=Qr({contentSettings:n,sectionType:r});return J(i,t),i}catch{throw new Error(`Content descriptor for section [${e}] is either invalid or undefined`)}}async function ji(e,t,o=E){try{const s=f(I.cwd(),`${o}/${e}/js/settings/design.mjs`),n=await q(s),r=H(e),i=ei({designSettings:n,sectionType:r});return hi(i),J(i,t),i}catch(s){const n=s;throw new Error(`Design settings is invalid or undefined. Error ${n.stack}`)}}async function wi(e,t,o=E){try{const s=await p("*.mjs",{cwd:f(I.cwd(),`${o}/${e}/js/showcases/`),ignore:"**/translations.mjs"});return Promise.all(s.map(async n=>{const r=f(I.cwd(),`${o}/${e}/js/showcases/${n}`),i=await q(r);return ys(i.design),J(i,t),i}))}catch(s){throw new Error(`Showcases is invalid or undefined. Error ${s}`)}}async function Oi(e,t=E){try{const o=f(I.cwd(),`${t}/${e}/js/settings/layout.mjs`);if(!w(o))return[];const s=await q(o);return s.forEach(n=>$i(n.selectedDesignSettings)),s}catch{throw new Error(`Layout descriptor for section [${e}] is either invalid or undefined`)}}async function gs(e){const t=f(I.cwd(),e),o=await q(t);return Ei(o)}async function _i(e,t=E){return gs(`${t}/${e}/js/settings/translations.mjs`)}async function hs(e,t=E){return gs(`${t}/${e}/js/showcases/translations.mjs`)}async function ge(e,t){const o=await _i(e,m[t].dist),s=await hs(e,m[t].dist),n=await Ti(e,o,m[t].dist),r=await ji(e,o,m[t].dist),i=await wi(e,s,m[t].dist),c=await Oi(e,m[t].dist);return{id:e,type:t,name:{en:e},contentEditors:n,designEditors:r,layouts:c,showcases:i}}async function Si(){const e=await p("*/",{cwd:f(I.cwd(),`${E}/`)}),t=await p("*/",{cwd:f(I.cwd(),`${z}/`)}),o=await p("*/",{cwd:f(I.cwd(),`${X}/`)});return Promise.all([...e.map(async s=>ge(s,"SECTION")),...t.map(async s=>ge(s,"HEADER")),...o.map(async s=>ge(s,"FOOTER"))])}async function he(e){if(!e||e.type!=="custom")return;const t=H(e.id),o=await hs(e.id,m[t].dist);e.showcase_overrides!==void 0&&(J(e.showcase_overrides,o),e.showcase_overrides.design&&ys(e.showcase_overrides.design))}async function $s(e){const t=e.filter(o=>o.type==="custom");await Promise.all(t.map(o=>he(o)))}const vi=new Map([["catalog","product-details"],["product","storefront-product"],["category","storefront-category"]]);async function $e(e){try{return await q(f(process.cwd(),e))}catch{throw new Error(`Template file [${e}] is either invalid or undefined`)}}async function Di(e){const t=await p(`${S}/js/**.mjs`,{ignore:[`${S}/js/**${C}.mjs`]});return Promise.all(t.map(async o=>{const s=await $e(o);return await $s(s.sections),{id:`${e}_${F(o).name}`,descriptor:s}}))}function Ai(e){return e in oe?oe[e]:oe.CUSTOM}function Ii(e){return e.map(t=>({...t,id:vi.get(t.id)??t.id}))}async function Ci(e){const t=await p(`${S}/${e}/*.mjs`,{ignore:[`${S}/${e}/configuration*.mjs`]});return Promise.all(t.map(async o=>{const{sections:s}=await $e(o),n=tn(o);return await $s(s),{sections:Ii(s),id:n,type:Ai(n.toUpperCase())}}))}async function Pi(e){const t=await p(`${S}/**/configuration*.mjs`,{});return Promise.all(t.map(async o=>{const s=await $e(o);await he(s.header),await he(s.footer);const n=g.basename(g.dirname(o)),r=await Ci(n);return{id:`${e}_${n}`,descriptor:{...s,pages:r}}}))}async function Ni(e){return[...await Di(e),...await Pi(e)]}async function bs(e){await new Promise(t=>setTimeout(t,e))}function Li(e){const[t,o]=e.split(x),s=lr(t);return{id:o,sectionId:t,pageId:s}}function xi(e){return e.split(x).length===2}async function ki(){return(await p("*/*",{cwd:f(process.cwd(),ne)})).filter(xi).map(Li)}const Fi={value:0},O=Zr();let Es=Date.now();const Ts=e=>2**e*500;async function Ri(){const e=await Ae(f(A.cwd(),"crane.config.json")),t=JSON.parse(e.toString());return{appClientId:t.app_client_id,appSecretKey:btoa(t.app_secret_key)}}function Gi(e){return typeof e=="object"&&e!==null&&"version"in e&&typeof e.version=="string"}async function Mi(){const e=f(A.cwd(),"package.json"),t=await Ae(e),o=JSON.parse(t.toString());if(Gi(o))return o;throw new Error(`Package file located at path: ${e} does not contain a version field`)}async function Bi(e){const t=Ks(e.version,"patch");if(t===null)throw Error("Error while incrementing app version");e.version=t,Ls(f(A.cwd(),"package.json"),`${JSON.stringify(e,null,2)}
|
|
3
|
-
|
|
4
|
-
`)}function
|
|
1
|
+
import Is from"cac";import*as Q from"path";import y,{sep as k,resolve as f,parse as F,dirname as Cs}from"path";import{red as Ps,yellow as Ns,green as R}from"kolorist";import Te from"prompts";import b from"node:fs";import P from"node:path";import T from"node:process";import*as ee from"fs";import u,{existsSync as j,statSync as Ls,rename as we,unlink as je,promises as se,writeFileSync as xs,createReadStream as ks}from"fs";import{pathToFileURL as Oe}from"url";import{fileURLToPath as Fs}from"node:url";import Rs from"adm-zip";import{glob as p,globSync as Se}from"glob";import{defineConfig as _e,build as ne,createServer as Gs}from"vite";import Ms from"ajv/dist/2020.js";import Bs from"ajv-formats";import qs from"node:zlib";import{promisify as Us}from"node:util";import{JSONPath as zs}from"jsonpath-plus";import{builtinModules as ve}from"module";import{viteExternalsPlugin as De}from"vite-plugin-externals";import Xs from"vite-plugin-compression";import Hs from"@vitejs/plugin-vue";import Vs from"vite-tsconfig-paths";import Ks from"vite-plugin-checker";import{readFile as Ae}from"fs/promises";import Ys,{AxiosError as Ie}from"axios";import{inc as Js}from"semver";import*as A from"process";import I from"process";import{ConcurrencyManager as Ws}from"axios-concurrency";import Zs from"cli-progress";import Qs from"tinycolor2";function U(e,t=2){if(!+e)return"0 Bytes";const o=1024,s=t<0?0:t,n=["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],r=Math.floor(Math.log(e)/Math.log(o));return`${parseFloat((e/o**r).toFixed(s))} ${n[r]}`}const a={error:e=>console.log(Ps(e)),warn:e=>console.log(Ns(e)),info:e=>console.log(R(e))},C="_temp",E="dist/sections",z="dist/headers",X="dist/footers",_="dist/templates",Ce="layouts",re=`dist/${Ce}`,Pe=2*1024*1024,Ne=300*1024;function te(e){return!!e}function Le(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function xe(e){return e.split(k).slice(1,-1).join(k)}const en="Resource name can only contain alphanumeric characters, dashes, and underscores";function tn(e){if(typeof e=="string"||typeof e=="number"){const t=/^[a-zA-Z0-9_-]+$/.test(e.toString());if(t)return{isValid:t,errorMessage:null}}return{isValid:!1,errorMessage:en}}function on(e){return e===!0?!0:typeof e=="string"&&e.trim().length===0}async function G(e,t){try{const o=f(process.cwd(),t?`${e}${C}.mjs`:`${e}.mjs`);return(await import(Oe(o).href)).default}catch{throw new Error(`File [${e}${C}.mjs] is either invalid or undefined`)}}function ke(e){return Object.keys(e).length===0}function sn(e){return y.parse(e).name}var nn=(e=>(e.SingleFile="single-file",e.MultiPage="multi-page",e))(nn||{});function Fe(e,t){ee.statSync(e).isDirectory()?(ee.mkdirSync(t,{recursive:!0}),ee.readdirSync(e).forEach(o=>{const s=Q.resolve(e,o),n=Q.resolve(t,o);Fe(s,n)})):ee.copyFileSync(e,t)}function N(e,t,o,s){const n=Q.join(e,s?.[o]??o);Fe(Q.join(t,o),n)}function rn(e){return e?"multi-page":"single-file"}function an(e,t){return e==="single-file"?{"template.ts":`${t}.ts`}:{"example-template":`${t}`}}function cn(e,t){return e==="single-file"?`${t}.ts`:t}function pn(e){return e==="single-file"?"template/templates":"template/page-templates"}function ln(e,t){return e==="single-file"?()=>a.info(`Template descriptor file [${t}.ts] has been created`):()=>a.info(`Template [${t}] with pages structure named has been created`)}function dn(e,t){const o=rn(t),s=an(o,e),n=cn(o,e),r=pn(o),i=ln(o,e);return{renameFiles:s,targetPath:n,sourcePath:r,onTemplateCreated:i}}function L(e){return P.resolve(Fs(import.meta.url),"../..",e)}function fn(){const e=L("package.json");return e!==""?JSON.parse(b.readFileSync(e,"utf8")):{}}async function un(e){try{const t=e,o=T.cwd(),s=P.join(o,t),n=["templates","headers","footers","reference","page-templates","layouts"],r={_gitignore:".gitignore"};b.existsSync(s)?(a.error(`App with the name: ${e} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):b.mkdirSync(s);const i=L("template");b.readdirSync(i).filter($=>$!=="package.json").filter($=>!n.includes($)).forEach(async $=>N(s,i,$,r));const c=JSON.parse(b.readFileSync(P.join(i,"package.json"),"utf-8"));c.name=e;const l=fn();l.version&&(c.dependencies["@lightspeed/crane"]=l.version),l.dependencies["@lightspeed/eslint-config-crane"]&&(c.dependencies["@lightspeed/eslint-config-crane"]=l.dependencies["@lightspeed/eslint-config-crane"]);const d=P.join(s,"package.json");b.writeFileSync(d,`${JSON.stringify(c,null,2)}
|
|
2
|
+
`),a.info(`App ${e} created`)}catch(t){a.error(`Error while creating app: ${t.message}`),T.exit(1)}}function ie(e,t,o,s){try{const n=T.cwd(),r=y.join(n,t);u.existsSync(r)||u.mkdirSync(r);const i=y.join(n,t,o);u.existsSync(i)?(a.error(`${s} with the name: ${o} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):u.mkdirSync(i);const c=L(e);u.readdirSync(c).forEach(async l=>N(i,c,l)),a.info(`${s} ${o} created`)}catch(n){a.error(`Error while creating ${s}: ${n.message}`),T.exit(1)}}function ae(e){const t=T.cwd(),o=L(`template/${e}`),s=y.join(t,e);u.existsSync(s)||(u.mkdirSync(s),u.readdirSync(o).forEach(async n=>N(s,o,n)))}function mn(e,t,o){if(!u.existsSync(o)){u.copyFileSync(t,o);return}const s=u.readFileSync(t),n=u.readFileSync(o);s.equals(n)||a.warn(`File "${e.name}" exists but differs from template. File will be skipped, this may lead to issues.`)}function Re(e,t){const o=u.readdirSync(e,{withFileTypes:!0});u.existsSync(t)||u.mkdirSync(t,{recursive:!0}),o.forEach(s=>{const n=y.join(e,s.name),r=y.join(t,s.name);s.isDirectory()?Re(n,r):mn(s,n,r)})}function ce(){try{const e=T.cwd(),t=y.join(e,"shared"),o=L("template/shared");if(!u.existsSync(o))return;Re(o,t)}catch(e){a.error(`Error while processing shared folder: ${e.message}`),T.exit(1)}}async function yn(e){ce(),ie("template/sections/example-section","sections",e,"Section")}async function gn(e,t){const{targetPath:o,renameFiles:s,sourcePath:n,onTemplateCreated:r}=dn(e,t);try{const i=T.cwd(),c=P.join(i,"templates"),l=L(n),d=b.readdirSync(l);b.existsSync(c)?b.existsSync(P.join(c,o))&&(a.error(`Template with the name: ${e} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):b.mkdirSync(c),d.forEach($=>N(c,l,$,s)),ae("headers"),ae("footers"),t&&ae("layouts"),r()}catch(i){a.error(`Error while creating template descriptors: ${i.message}`),T.exit(1)}}async function hn(){try{const e=T.cwd(),t=L("template/reference"),o=b.readdirSync(t);let s=!1;for(const n of o){const r=P.join(t,n),i=P.join(e,n);b.existsSync(i)||b.mkdirSync(i,{recursive:!0});const c=b.readdirSync(r),l=b.readdirSync(i);if(n==="shared"){c.forEach(d=>{N(i,r,d)});continue}for(const d of c){if(d==="assets"){N(i,r,d);continue}if(l.includes(d)){const{name:$}=await Te({type:"text",name:"name",message:`The "${d}" already exists in ${n} directory: provide a new name to keep both or press Esc to skip this one.`});$?(N(i,r,d,{[d]:$}),s=!0):a.info(`Skipped: ${d}`)}else N(i,r,d)}}a.info("Reference templates have been added to the app"),s&&a.warn("Some files or folders were renamed to avoid conflicts. Template files may need to be updated to reflect these changes.")}catch(e){a.error(`Error while creating template descriptors: ${e.message}`),T.exit(1)}}const Ge="https://json-schema.org/draft/2020-12/schema",Me="https://lightspeedhq.com/template-default.schema.json",Be="Default Section",qe="Default section for a Custom Template",Ue="object",ze={"default-section":{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"default"},id:{description:"Identification of the section",type:"string",pattern:"^((header|cover|announcement_bar|slider|special_offer|customer_review|company_info|shipping_payment|location|store|footer)(_\\d{3})?)$"},showcase_id:{description:"Showcase id of the section",type:"string"}},required:["type","id"],additionalProperties:!1}},$n={$schema:Ge,$id:Me,title:Be,description:qe,type:Ue,$defs:ze},Xe={__proto__:null,$defs:ze,$id:Me,$schema:Ge,default:$n,description:qe,title:Be,type:Ue},He="https://json-schema.org/draft/2020-12/schema",Ve="https://lightspeedhq.com/template-custom.schema.json",Ke="Custom Section",Ye="Custom section for a Custom Template",Je="object",We={"custom-section":{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"custom"},id:{description:"Identification of the section",type:"string"},showcase_id:{description:"Showcase id of the section",type:"string"},showcase_overrides:{$ref:"showcase_overrides.schema.json"}},required:["type","id"],additionalProperties:!1}},bn={$schema:He,$id:Ve,title:Ke,description:Ye,type:Je,$defs:We},Ze={__proto__:null,$defs:We,$id:Ve,$schema:He,default:bn,description:Ye,title:Ke,type:Je},Qe="https://json-schema.org/draft/2020-12/schema",et="https://lightspeedhq.com/template-custom-content.schema.json",tt="Custom Section :: Content Configuration",ot="Content tab configuration of a Custom Section for a Custom Template",st="object",nt={input_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"INPUTBOX"},text:{$ref:"common.schema.json#/$defs/label_type"}},required:["type","text"],additionalProperties:!1},text_area:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TEXTAREA"},text:{$ref:"common.schema.json#/$defs/label_type"}},required:["type","text"],additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"BUTTON"},title:{$ref:"common.schema.json#/$defs/label_type"},buttonType:{type:"string",enum:["SCROLL_TO_TILE","HYPER_LINK","MAIL_LINK","TEL_LINK","GO_TO_STORE_LINK","GO_TO_PAGE"]},link:{type:"string",format:"uri"},linkTarget:{type:"string"},email:{type:"string"},phone:{type:"string"},tileId:{type:"string"}},required:["type","title","buttonType"],additionalProperties:!0},image:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"IMAGE"},imageData:{type:"object",properties:{set:{type:"object",properties:{MOBILE_WEBP_LOW_RES:{type:"object"},MOBILE_WEBP_HI_RES:{type:"object"},WEBP_LOW_RES:{type:"object"},WEBP_HI_2X_RES:{type:"object"},ORIGINAL:{type:"object"}},additionalProperties:!1,minProperties:1},borderInfo:{type:"object"},bucket:{type:"string"}},required:["set"]}},required:["type"],additionalProperties:!1},toggle:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TOGGLE"},enabled:{type:"boolean"}},required:["type"],additionalProperties:!0},select_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"SELECTBOX"},value:{type:"string"}},required:["type"],additionalProperties:!0},logo:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"LOGO"},logoType:{description:"Type of the logo content",type:"string",enum:["TEXT","IMAGE"]},text:{description:"Logo content text",$ref:"common.schema.json#/$defs/label_type"},imageData:{type:"object",properties:{set:{type:"object"},borderInfo:{type:"object"},bucket:{type:"string"}},required:["set"]}},required:["type"],additionalProperties:!1},menu:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"MENU"}},required:["type"],additionalProperties:!1},deck:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"DECK"},cards:{type:"array",items:{type:"object",properties:{settings:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the settings configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/input_box"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"template-custom-content.schema.json#/$defs/text_area"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-content.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/select_box"}}]}},minProperties:1}},required:["settings"]}}},required:["type","cards"]}},En={$schema:Qe,$id:et,title:tt,description:ot,type:st,$defs:nt},rt={__proto__:null,$defs:nt,$id:et,$schema:Qe,default:En,description:ot,title:tt,type:st},it="https://json-schema.org/draft/2020-12/schema",at="https://lightspeedhq.com/template-custom-design.schema.json",ct="Custom Section :: Design Configuration",pt="Design tab configuration of a Custom Section for a Custom Template",lt="object",dt={text:{type:"object",properties:{type:{description:"Type of the text",type:"string",const:"TEXT"},font:{description:"Default font for the text",type:"string"},size:{oneOf:[{description:"Default size for the text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{description:"Default boldness for the text",type:"boolean"},italic:{description:"Default italic style for the text",type:"boolean"},color:{oneOf:[{description:"Default color for the text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{description:"Default visibility for the text",type:"boolean"}},additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the button",type:"string",const:"BUTTON"},font:{description:"Default font for the button",type:"string"},size:{description:"Default size for the button",type:"string",enum:["SMALL","MEDIUM","LARGE"]},appearance:{description:"Default appearance for the button",type:"string",enum:["SOLID","OUTLINE","TEXT"]},shape:{description:"Default shape for the button",type:"string",enum:["ROUND_CORNER","RECTANGLE","PILL"]},color:{oneOf:[{description:"Default color for the button",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the button",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}},additionalProperties:!1},image:{type:"object",properties:{type:{description:"Type of the image",type:"string",const:"IMAGE"},overlay:{description:"Default overlay for the image",type:"string",enum:["COLOR","GRADIENT","NONE"]}},if:{properties:{overlay:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default color for the image overlay",type:"array",items:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},toggle:{type:"object",properties:{type:{description:"Type of the toggle",type:"string",const:"TOGGLE"},enabled:{description:"Default enabled status for the toggle",type:"boolean"}},additionalProperties:!1},info:{type:"object",properties:{type:{description:"Type of the info",type:"string",const:"INFO"},font:{description:"Default font for the info",type:"string"},size:{description:"Default size for the info",type:"integer",minimum:1,exclusiveMaximum:50},bold:{description:"Default boldness for the info",type:"boolean"},italic:{description:"Default italic style for the info",type:"boolean"},color:{description:"Default color for the info",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},visible:{description:"Default visibility for the info",type:"boolean"}},required:["type"],additionalProperties:!1},select_box:{type:"object",properties:{type:{description:"Type of the checkbox",type:"string",const:"SELECTBOX"},value:{description:"Default option for the checkbox",type:"string"}},additionalProperties:!1},background:{type:"object",properties:{type:{description:"Type of the background",type:"string",const:"BACKGROUND"},style:{description:"Style of the background",type:"string",enum:["COLOR","GRADIENT"]}},if:{properties:{style:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the background",type:"array",items:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},logo:{type:"object",properties:{type:{description:"Type of the logo",type:"string",const:"LOGO"},font:{description:"Default font for the text logo",type:"string"},size:{oneOf:[{description:"Default size for the logo text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the logo text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{description:"Default boldness for the text logo",type:"boolean"},italic:{description:"Default italic style for the text logo",type:"boolean"},color:{oneOf:[{description:"Default color for the logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{description:"Default visibility for the logo",type:"boolean"},spacing:{description:"Default spacing size for the text logo",type:"integer",minimum:1,exclusiveMaximum:10},capitalization:{description:"Default capitalization style for the text logo",type:"string",enum:["none","all","small"]},frame:{description:"Default frame for the text logo",type:"object",properties:{visible:{description:"Default visibility for the frame on text logo",type:"boolean"},width:{description:"Default width size for the frame on text logo",type:"integer",minimum:1,exclusiveMaximum:50},color:{oneOf:[{description:"Default color for frame on logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for frame on logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}},required:["visible","width","color"],additionalProperties:!1}},additionalProperties:!1}},Tn={$schema:it,$id:at,title:ct,description:pt,type:lt,$defs:dt},ft={__proto__:null,$defs:dt,$id:at,$schema:it,default:Tn,description:pt,title:ct,type:lt},ut="https://json-schema.org/draft/2020-12/schema",mt="https://lightspeedhq.com/section-content.schema.json",yt="Custom Section - Content",gt="The content of a custom section",ht="object",$t={"^.*$":{type:"object",properties:{type:{type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX","INFO","DECK","MENU","NAVIGATION_MENU","LOGO","DIVIDER"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"#/$defs/Inputbox"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"#/$defs/Textarea"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/Button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"#/$defs/Info"}},{if:{properties:{type:{const:"DECK"}}},then:{$ref:"#/$defs/Deck"}},{if:{properties:{type:{const:"MENU"}}},then:{$ref:"#/$defs/Menu"}},{if:{properties:{type:{const:"NAVIGATION_MENU"}}},then:{$ref:"#/$defs/NavigationMenu"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"#/$defs/Logo"}},{if:{properties:{type:{const:"DIVIDER"}}},then:{$ref:"#/$defs/Divider"}}]}},bt={Inputbox:{type:"object",properties:{type:{const:"INPUTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/InputboxDefaults"}},required:["type","label","placeholder"]},Textarea:{type:"object",properties:{type:{const:"TEXTAREA"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/TextareaDefaults"}},required:["type","label","placeholder"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ButtonDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"section-commons.schema.json#/$defs/Image"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ToggleDefaults"}},required:["type","label","description"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},placeholder:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label","placeholder","description","options"]},Menu:{type:"object",properties:{type:{const:"MENU"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type"]},NavigationMenu:{type:"object",properties:{type:{const:"NAVIGATION_MENU"}},required:["type"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},button:{$ref:"#/$defs/InfoEditorButton"},defaults:{$ref:"#/$defs/InfoDefaults"}},required:["type","label","description"]},Divider:{type:"object",properties:{type:{const:"DIVIDER"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type","label"]},InputboxDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"}},required:["text"]},TextareaDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"}},required:["text"]},ButtonDefaults:{type:"object",properties:{title:{$ref:"../common.schema.json#/$defs/label_type"},buttonType:{type:"string",enum:["SCROLL_TO_TILE","HYPER_LINK","MAIL_LINK","TEL_LINK","GO_TO_STORE_LINK","GO_TO_PAGE"]},link:{type:"string",format:"uri"},linkTarget:{type:"string"},email:{type:"string"},phone:{type:"string"},tileId:{type:"string"}},required:["title"]},ImageDefaults:{type:"object",properties:{imageData:{$ref:"section-commons.schema.json#/$defs/Image"}}},ToggleDefaults:{type:"object",properties:{enabled:{type:"boolean"}}},SelectboxDefaults:{type:"object",properties:{value:{type:"string"}}},InfoDefaults:{type:"object",properties:{text:{$ref:"../common.schema.json#/$defs/label_type"},button:{$ref:"#/$defs/InfoButtonDefaults"}}},SelectboxOption:{type:"object",properties:{label:{$ref:"../common.schema.json#/$defs/label_type"},value:{type:"string"}}},InfoEditorButton:{type:"object",properties:{label:{$ref:"../common.schema.json#/$defs/label_type"},link:{type:"string"}}},InfoButtonDefaults:{type:"object",properties:{title:{$ref:"../common.schema.json#/$defs/label_type"},link:{type:"string",minLength:0}}},Deck:{type:"object",properties:{type:{const:"DECK"},cards:{description:"Cards of the content configuration element",type:"object",properties:{defaultCardContent:{type:"object",properties:{settings:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the settings configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX"]}},required:["type"],allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"#/$defs/Inputbox"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"#/$defs/Textarea"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/ButtonDefaults"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}}]}},minProperties:1}}}}},label:{$ref:"../common.schema.json#/$defs/label_type"},addButtonLabel:{$ref:"../common.schema.json#/$defs/label_type"},maxCards:{type:"number"}},required:["cards","maxCards","label","addButtonLabel","type"]}},Et=!1,wn={$schema:ut,$id:mt,title:yt,description:gt,type:ht,patternProperties:$t,$defs:bt,additionalProperties:Et},Tt={__proto__:null,$defs:bt,$id:mt,$schema:ut,additionalProperties:Et,default:wn,description:gt,patternProperties:$t,title:yt,type:ht},wt="https://json-schema.org/draft/2020-12/schema",jt="https://lightspeedhq.com/sections/section-translation.schema.json",Ot="Custom Section - Translations",St="The translation of the section's labels",_t="object",vt={"^[a-z]{2}$":{type:"object",patternProperties:{"^\\$.*$":{type:"string"}},additionalProperties:!1}},Dt=!1,jn={$schema:wt,$id:jt,title:Ot,description:St,type:_t,patternProperties:vt,additionalProperties:Dt},At={__proto__:null,$id:jt,$schema:wt,additionalProperties:Dt,default:jn,description:St,patternProperties:vt,title:Ot,type:_t},It="https://json-schema.org/draft/2020-12/schema",Ct="https://lightspeedhq.com/section-design.schema.json",Pt="Custom Section - Design",Nt="The design of a custom section",Lt="object",xt={"^.*$":{type:"object",properties:{type:{type:"string",enum:["TEXT","IMAGE","BUTTON","BACKGROUND","TOGGLE","COLOR_PICKER","RATING","SELECTBOX","SOCIAL_PROFILES","LOGO","INFO","DIVIDER"]}},required:["type"],allOf:[{if:{properties:{type:{const:"TEXT"}}},then:{$ref:"#/$defs/Text"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"#/$defs/Image"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"#/$defs/Button"}},{if:{properties:{type:{const:"BACKGROUND"}}},then:{$ref:"#/$defs/Background"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"#/$defs/Toggle"}},{if:{properties:{type:{const:"COLOR_PICKER"}}},then:{$ref:"#/$defs/Color"}},{if:{properties:{type:{const:"RATING"}}},then:{$ref:"#/$defs/Rating"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"#/$defs/Selectbox"}},{if:{properties:{type:{const:"SOCIAL_PROFILES"}}},then:{$ref:"#/$defs/SocialProfile"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"#/$defs/Logo"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"#/$defs/Info"}},{if:{properties:{type:{const:"DIVIDER"}}},then:{$ref:"#/$defs/Divider"}}],additionalProperties:!0}},kt={Text:{type:"object",properties:{type:{const:"TEXT"},label:{$ref:"../common.schema.json#/$defs/label_type"},sizes:{type:"array",items:{type:"integer"}},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},hideSize:{type:["boolean","null"]},defaults:{$ref:"#/$defs/TextDesignDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ImageDesignDefaults"}},required:["type","label"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAutoColor:{type:["boolean","null"]},enableAlphaColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},hideSize:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ButtonDesignDefaults"}},required:["type","label"]},Background:{type:"object",properties:{type:{const:"BACKGROUND"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},defaults:{$ref:"#/$defs/BackgroundDesignDefaults"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},defaults:{$ref:"#/$defs/ToggleDesignDefaults"}},required:["type","label"]},Color:{type:"object",properties:{type:{const:"COLOR_PICKER"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},defaults:{$ref:"#/$defs/ColorPickerDefaults"}},required:["type","label"]},Rating:{type:"object",properties:{type:{const:"RATING"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},hideVisibleToggle:{type:["boolean","null"]},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/RatingDefaults"}},required:["type","label"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{$ref:"../common.schema.json#/$defs/label_type"},description:{$ref:"../common.schema.json#/$defs/label_type"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label"]},SocialProfile:{type:"object",properties:{type:{const:"SOCIAL_PROFILES"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},enableAlphaColor:{type:["boolean","null"]},enableAutoColor:{type:["boolean","null"]},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SocialProfilesDefaults"}},required:["type","label"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{$ref:"../common.schema.json#/$defs/label_type"},colors:{type:"array",items:{type:"string",pattern:"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"}},sizes:{type:"array",items:{type:"integer"}},defaults:{$ref:"#/$defs/LogoDesignDefaults"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},text:{type:"string"},button:{type:"object",properties:{title:{type:"string"},link:{type:"string"}},additionalProperties:!0}},required:["type","text"],additionalProperties:!0},Divider:{type:"object",properties:{type:{const:"DIVIDER"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:["type","label"]},TextDesignDefaults:{type:"object",properties:{font:{type:"string"},size:{oneOf:[{description:"Default size for the text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{oneOf:[{description:"Default color for the text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},ImageDesignDefaults:{type:"object",properties:{overlay:{type:"string"},visible:{type:"boolean"}},if:{properties:{overlay:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the image overlay",type:"array",items:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the image overlay",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the image overlay",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}},required:[]},ButtonDesignDefaults:{type:"object",properties:{appearance:{type:"string",enum:["SOLID","OUTLINE","TEXT"]},font:{type:"string"},size:{type:"string",enum:["SMALL","MEDIUM","LARGE"]},style:{type:"string",enum:["round-corner","rectangle","pill"]},color:{oneOf:[{description:"Default color for the button",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the button",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},BackgroundDesignDefaults:{type:"object",properties:{type:{description:"Type of the background",type:"string",const:"BACKGROUND"},style:{description:"Style of the background",type:"string",enum:["COLOR","GRADIENT"]}},if:{properties:{style:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the background",type:"array",items:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},minItems:2,maxItems:2}}},else:{properties:{color:{oneOf:[{description:"Default color for the background",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the background",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]}}}},ToggleDesignDefaults:{type:"object",properties:{enabled:{type:"boolean"}},required:[]},ColorPickerDefaults:{type:"object",properties:{appearance:{$ref:"section-commons.schema.json#/$defs/Color"}},required:[]},RatingDefaults:{type:"object",properties:{color:{$ref:"section-commons.schema.json#/$defs/Color"},visible:{type:"boolean"},style:{type:"string"}},required:[]},SelectboxDefaults:{type:"object",properties:{value:{type:"string"}},required:[]},SocialProfilesDefaults:{type:"object",properties:{color:{$ref:"section-commons.schema.json#/$defs/Color"},visible:{type:"boolean"},appearance:{type:"string"}},required:[]},LogoDesignDefaults:{type:"object",properties:{font:{type:"string"},size:{oneOf:[{description:"Default size for the logo text",type:"integer",minimum:1,exclusiveMaximum:50},{description:"Default global size string for the logo text",type:"string",enum:["global.textSize.title","global.textSize.subtitle","global.textSize.body"]}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{oneOf:[{description:"Default color for the logo text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},{description:"Default global color string for the logo text",type:"string",enum:["global.color.title","global.color.body","global.color.button","global.color.link","global.color.background"]}]},visible:{type:"boolean"}},required:[]},SelectboxOption:{type:"object",properties:{value:{type:"string"},label:{$ref:"../common.schema.json#/$defs/label_type"}},required:[]}},On={$schema:It,$id:Ct,title:Pt,description:Nt,type:Lt,patternProperties:xt,$defs:kt},Ft={__proto__:null,$defs:kt,$id:Ct,$schema:It,default:On,description:Nt,patternProperties:xt,title:Pt,type:Lt},Rt="https://json-schema.org/draft/2020-12/schema",Gt="https://lightspeedhq.com/section-commons.schema.json",Mt="Custom Section - Content",Bt="The content of a custom section",qt="object",Ut={Image:{type:"object",properties:{set:{type:"object",properties:{MOBILE_WEBP_LOW_RES:{$ref:"#/$defs/ImageInfo"},MOBILE_WEBP_HI_RES:{$ref:"#/$defs/ImageInfo"},WEBP_LOW_RES:{$ref:"#/$defs/ImageInfo"},WEBP_HI_2X_RES:{$ref:"#/$defs/ImageInfo"},ORIGINAL:{$ref:"#/$defs/ImageInfo"}},additionalProperties:!1,minProperties:1},borderInfo:{$ref:"#/$defs/BorderInfo"}},additionalProperties:!1,required:["set"]},ImageInfo:{type:"object",properties:{url:{type:"string"},width:{type:"integer",minimum:0},height:{type:"integer",minimum:0}}},BorderInfo:{type:"object",properties:{homogeneity:{type:"boolean"},color:{$ref:"#/$defs/RGBA"}}},RGBA:{type:"object",properties:{r:{type:"integer",minimum:0,maximum:255},g:{type:"integer",minimum:0,maximum:255},b:{type:"integer",minimum:0,maximum:255},a:{type:"number",format:"double",minimum:0,maximum:1}},required:["r","g","b","a"]},HSL:{type:"object",properties:{h:{type:"number",format:"double"},s:{type:"number",format:"double"},l:{type:"number",format:"double"},a:{type:"number",format:"double"}},required:["h","s","l","a"]},Overlay:{type:"object",properties:{type:{type:"string",enum:["solid","gradient","none"]},solid:{$ref:"#/$defs/Solid"},gradient:{$ref:"#/$defs/Gradient"}}},Solid:{type:"object",properties:{color:{$ref:"#/$defs/Color"}}},Gradient:{type:"object",properties:{fromColor:{$ref:"#/$defs/Color"},toColor:{$ref:"#/$defs/Color"}}},Background:{type:"object",properties:{type:{type:"string",enum:["solid","gradient"]},solid:{$ref:"#/$defs/Solid"},gradient:{$ref:"#/$defs/Gradient"}}},Color:{type:"object",properties:{raw:{type:"string"},hex:{type:"string"},auto:{type:"boolean"},rgba:{$ref:"#/$defs/RGBA"},hsl:{$ref:"#/$defs/HSL"}}}},zt=!1,Sn={$schema:Rt,$id:Gt,title:Mt,description:Bt,type:qt,$defs:Ut,additionalProperties:zt},Xt={__proto__:null,$defs:Ut,$id:Gt,$schema:Rt,additionalProperties:zt,default:Sn,description:Bt,title:Mt,type:qt},Ht="https://json-schema.org/draft/2020-12/schema",Vt="https://lightspeedhq.com/section-showcase.schema.json",Kt="Custom Section - Showcase settings",Yt="The setting of a showcase",Jt="object",Wt=["showcaseId","previewImage"],Zt=[{properties:{showcaseId:{description:"Showcase id of the section",type:"string"},previewImage:{$ref:"section-commons.schema.json#/$defs/Image"}}},{$ref:"../showcase_overrides.schema.json"}],_n={$schema:Ht,$id:Vt,title:Kt,description:Yt,type:Jt,required:Wt,allOf:Zt},Qt={__proto__:null,$id:Vt,$schema:Ht,allOf:Zt,default:_n,description:Yt,required:Wt,title:Kt,type:Jt},eo="https://json-schema.org/draft/2020-12/schema",to="https://lightspeedhq.com/template.schema.json",oo="Custom Template",so="A custom template enclosing the necessary custom and default blocks",no="object",ro={metadata:{type:"object",properties:{name:{description:"Name of the template",type:"string",minLength:2,maxLength:60},description:{description:"Short description of the template",type:"string",minLength:2,maxLength:150},preview_url:{description:"Preview url of the demo website",type:"string",format:"uri",pattern:"^(https?)://([^.]+?\\.)?(company\\.site|ecwid\\.qa)($|/[A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=]*)?$"},cover_image:{type:"object",properties:{set:{description:"Name of the image set",type:"object",patternProperties:{".*":{type:"object",properties:{url:{description:"Path to the preview image relative to the 'assets' folder for a specific resolution",type:"string"}},required:["url"],additionalProperties:!1}}}},required:["set"],additionalProperties:!1}},required:["name","description","cover_image"],additionalProperties:!1},sections:{description:"List of sections contained by this template",type:"array",items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]}},allOf:[{if:{properties:{type:{const:"default"}}},then:{$ref:"template-default.schema.json#/$defs/default-section"}},{if:{properties:{type:{const:"custom"}}},then:{$ref:"template-custom.schema.json#/$defs/custom-section"}}]},minItems:1,uniqueItems:!1}},io=["metadata","sections"],vn={$schema:eo,$id:to,title:oo,description:so,type:no,properties:ro,required:io},ao={__proto__:null,$id:to,$schema:eo,default:vn,description:so,properties:ro,required:io,title:oo,type:no},co="https://json-schema.org/draft/2020-12/schema",po="https://lightspeedhq.com/showcase_overrides.schema.json",lo="Showcase overrides",fo="Overrides for the showcase",uo="object",mo={content:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX","LOGO","DECK","MENU","NAVIGATION_MENU","INFO"]}},allOf:[{if:{properties:{type:{const:"INPUTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/input_box"}},{if:{properties:{type:{const:"TEXTAREA"}}},then:{$ref:"template-custom-content.schema.json#/$defs/text_area"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-content.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-content.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-content.schema.json#/$defs/select_box"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"template-custom-content.schema.json#/$defs/logo"}},{if:{properties:{type:{const:"DECK"}}},then:{$ref:"template-custom-content.schema.json#/$defs/deck"}}]}}},design:{type:"object",patternProperties:{".*":{type:"object",properties:{type:{description:"Type of the design configuration element",type:"string",enum:["TEXT","BUTTON","IMAGE","TOGGLE","SELECTBOX","BACKGROUND","LOGO"]}},allOf:[{if:{properties:{type:{const:"TEXT"}}},then:{$ref:"template-custom-design.schema.json#/$defs/text"}},{if:{properties:{type:{const:"BUTTON"}}},then:{$ref:"template-custom-design.schema.json#/$defs/button"}},{if:{properties:{type:{const:"IMAGE"}}},then:{$ref:"template-custom-design.schema.json#/$defs/image"}},{if:{properties:{type:{const:"TOGGLE"}}},then:{$ref:"template-custom-design.schema.json#/$defs/toggle"}},{if:{properties:{type:{const:"SELECTBOX"}}},then:{$ref:"template-custom-design.schema.json#/$defs/select_box"}},{if:{properties:{type:{const:"BACKGROUND"}}},then:{$ref:"template-custom-design.schema.json#/$defs/background"}},{if:{properties:{type:{const:"LOGO"}}},then:{$ref:"template-custom-design.schema.json#/$defs/logo"}},{if:{properties:{type:{const:"INFO"}}},then:{$ref:"template-custom-design.schema.json#/$defs/info"}}]}}},layoutId:{description:"Layout ID for the showcase",type:"string"},blockName:{description:"Section name for the showcase",$ref:"common.schema.json#/$defs/label_type"}},Dn={$schema:co,$id:po,title:lo,description:fo,type:uo,properties:mo},yo={__proto__:null,$id:po,$schema:co,default:Dn,description:fo,properties:mo,title:lo,type:uo},go="https://json-schema.org/draft/2020-12/schema",ho="https://lightspeedhq.com/common.schema.json",$o="Common Type Definitions",bo="Common type definitions, used throughout other schemas",Eo="object",To={label_type:{type:"string",pattern:"^\\$.+"}},An={$schema:go,$id:ho,title:$o,description:bo,type:Eo,$defs:To},wo={__proto__:null,$defs:To,$id:ho,$schema:go,default:An,description:bo,title:$o,type:Eo};var pe=(e=>(e.SECTION="SECTION",e.HEADER="HEADER",e.FOOTER="FOOTER",e))(pe||{});const g={SECTION:{source:"sections",dist:"dist/sections"},HEADER:{source:"headers",dist:"dist/headers"},FOOTER:{source:"footers",dist:"dist/footers"}};function H(e){return j(`${z}/${e}`)?"HEADER":j(`${X}/${e}`)?"FOOTER":"SECTION"}function jo(e){const t=H(e);return g[t].dist}var V=(e=>(e.CONTENT="Content",e.DESIGN="Design",e))(V||{});const In={menu:{type:"NAVIGATION_MENU"},logo:{type:"LOGO"}},Cn={logo:{type:"LOGO",colors:["#FFFFFF66","#0000004D","#00000099","#64C7FF66","#F9947266","#C794CD66","#FFD17466"],sizes:[18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60],defaults:{font:"global.fontFamily.body",size:40,bold:!0,italic:!1,color:"#313131",visible:!0,spacing:2,capitalization:"all",frame:{visible:!0,width:3,color:"#313131"}}}};function Oo(e){switch(e){case pe.HEADER:return In;default:return{}}}function So(e){switch(e){case pe.HEADER:return Cn;default:return{}}}function Pn({validationType:e,sectionType:t}){switch(e){case V.CONTENT:return Oo(t);case V.DESIGN:return So(t);default:return{}}}function Nn({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).filter(([s])=>t[s]!==void 0).forEach(([s,n])=>{const r=t[s];n.type!==r.type&&o.push({instancePath:s,keyword:"type-mismatch",message:`Editor type "${n.type}" for reserved key "${s}" does not match the required type "${r.type}".`})}),o}function Ln({type:e,mandatorySettings:t}){return Object.keys(t).find(o=>t[o].type===e)}function xn({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).forEach(([s,n])=>{const r=Ln({type:n.type,mandatorySettings:t});r&&s!==r&&o.push({instancePath:s,keyword:"key-mismatch",message:`Editor key "${s}" for overriden content type "${n.type}" does not match the required key name "${r}".`})}),o}function kn({type:e,mandatorySettings:t}){return Object.keys(t).findLast(o=>t[o].type===e)}function Fn({sectionSettings:e,mandatorySettings:t}){const o=[],s=Object.values(t).map(({type:r})=>r),n=Object.values(e).map(({type:r})=>r);return new Set(n.filter(r=>s.includes(r))).forEach(r=>{if(n.filter(i=>i===r).length>1){const i=kn({type:r,mandatorySettings:t});o.push({instancePath:i,keyword:"duplicate-type",message:`Editor type "${r}" can only be used once.`})}}),o}function Rn(e,t){const{sectionSettings:o,sectionType:s}=t,n=Pn({validationType:e,sectionType:s});return n===void 0||ke(n)?[]:[...Nn({sectionSettings:o,mandatorySettings:n}),...xn({sectionSettings:o,mandatorySettings:n}),...Fn({sectionSettings:o,mandatorySettings:n})]}var m=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.ClientChunks=2]="ClientChunks",e[e.ClientAsset=3]="ClientAsset",e[e.Asset=4]="Asset",e[e.TemplateAsset=5]="TemplateAsset",e[e.Dependency=6]="Dependency",e[e.SourceCode=7]="SourceCode",e[e.Layout=8]="Layout",e))(m||{}),oe=(e=>(e.PRODUCT="PRODUCT",e.CATALOG="CATALOG",e.CATEGORY="CATEGORY",e.HOME="HOME",e.CUSTOM="CUSTOM",e))(oe||{});const K={[m.Server]:{type:"server_js_compressed",fileName:"server.js.gz",isSingleton:!0,toPath:({id:e,sectionType:t})=>`${g[t].dist}/${e}/js/main/server/`},[m.Client]:{type:"client_js",fileName:"client.js",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${g[t].dist}/${e}/js/main/client/`},[m.ClientChunks]:{type:"client_js_chunks",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${g[t].dist}/${e}/js/main/client/chunks/`,fileName:"*"},[m.ClientAsset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${g[t].dist}/${e}/js/main/client/assets/`},[m.Asset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:({id:e,sectionType:t})=>`${g[t].dist}/${e}/assets/`},[m.TemplateAsset]:{type:"template_assets",fileName:"*",isSingleton:!1,toPath:()=>`${_}/assets/`},[m.Dependency]:{type:"dependencies",fileName:"package.json",isSingleton:!0,toPath:()=>{}},[m.SourceCode]:{type:"source_code",fileName:"source-code.zip",isSingleton:!0,toPath:()=>{}},[m.Layout]:{type:"layout",fileName:"index.mjs",isSingleton:!0,toPath:({id:e,layoutId:t})=>`${re}/${e}/${t}/`}},Y=[Xt,Ft,Tt,Qt,ao,Xe,Ze,rt,ft,yo,wo];function M(e,t){const o=new Ms({allErrors:!0,schemas:e});return Bs(o),o.getSchema(t.$id)||o.compile(t)}function Gn(){return M(Y,ao)}function le(e){return e.map(t=>({instancePath:t.instancePath,message:t.message??"",keyword:t.keyword}))}const Mn=e=>(()=>{const t=jo(e.name),o=t.split("/").pop()?.toLowerCase();return[{source:`./${o}/${e.name}/settings/content.ts`,dist:y.resolve(`${t}/${e.name}/js/settings/content`),ajv:M(Y,Tt),validationType:V.CONTENT,sectionName:e.name,type:e.type},{source:`./${o}/${e.name}/settings/design.ts`,dist:y.resolve(`${t}/${e.name}/js/settings/design`),ajv:M(Y,Ft),validationType:V.DESIGN,sectionName:e.name,type:e.type},{source:`./${o}/${e.name}/settings/translations.ts`,dist:y.resolve(`${t}/${e.name}/js/settings/translations`),ajv:M(Y,At),type:e.type},...e.showcaseEntryPoints.map(s=>({source:`./${o}/${e.name}/showcases/${F(s).name}.ts`,dist:y.resolve(`${t}/${e.name}/js/showcases/${F(s).name}`),ajv:M(Y,s.indexOf("translations")===-1?Qt:At),type:e.type,sectionName:e.name}))]})();function Bn(e){const t=n=>{const r=(n??"").split("/").filter(i=>i.length>0);return r.length===0?"$":`$${r.map(i=>`.${i}`).join("")}`};let o=0,s=0;Object.keys(e).forEach(n=>{const r=e[n];o=Math.max(o,Math.max(...r.map(i=>t(i.instancePath).length))),s=Math.max(s,Math.max(...r.map(i=>i.message.length)))}),Object.keys(e).forEach(n=>{const r=e[n].filter((i,c,l)=>c===l.findIndex(d=>`${i.instancePath}${i.message}${i.keyword}`==`${d.instancePath}${d.message}${d.keyword}`));a.error(n),r.filter(i=>i.keyword!=="if").forEach(i=>{a.error(`${t(i.instancePath).padEnd(o," ")} | ${i.message.padEnd(s," ")} | ${i.keyword||"-"}`)})})}function qn(e,t){if(e.validationType===void 0||e.sectionName===void 0)return[];const{sectionName:o,validationType:s}=e,n=H(o);return[...Rn(s,{sectionSettings:t,sectionType:n})]}function _o(e,t){return zs({path:"$..set..url",json:t,resultType:"value"}).map(o=>{if(new RegExp(/^https?:\/\//).test(o))return null;const s=`${e}/assets/${o}`;return j(s)?null:{message:`Image ${o} is missing from assets folder`,keyword:"missing-asset"}}).filter(o=>o!==null)}async function Un(e){const t=await G(e.dist,!1),o={},s=[],n=jo(e.sectionName??"").split("/").pop()?.toLowerCase();return e.ajv(t)||s.push(...le(e.ajv.errors??[])),s.push(...qn(e,t),..._o(`${n}/${e.sectionName}`,t)),s.length>0&&(o[e.source]=s),o}async function zn(e){const t=Us(qs.gunzip),o=await u.promises.readFile(e);return(await t(o)).length}async function Xn(e,t){const o=K[m.Server],s=y.resolve(`${o.toPath({id:e,sectionType:t})}${o.fileName}`),n=await zn(s);if(n>Ne)throw a.error(`Size of individual server file must not exceed threshold [${U(Ne)}]!`),a.error(`${`File: ${s}`.padEnd(s.length+10)}| ${U(n)}`),new Error("Invalid server file size")}function Hn(e){const t=e.reduce((o,s)=>{const n=Ls(s);return n.size>Pe&&(o[s]=U(n.size)),o},{});if(Object.keys(t).length!==0){const o=Math.max(...Object.keys(t).map(s=>s.length));a.error(`Size of individual assets must not exceed threshold [${U(Pe)}]!`);for(const s in t)a.error(`${`File: ${s}`.padEnd(o+10)}| ${t[s]}`);throw new Error("Invalid asset file size")}}function Vn(e,t,o,s){const n={};return e(t)&&s===void 0?we(`${o}${C}.mjs`,`${o}.mjs`,()=>{}):(je(`${o}${C}.mjs`,()=>{}),n[y.resolve(`./templates/${F(o).name}.ts`)]=[...le(e.errors??[]),...s??[]]),n}var w=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.Misc=2]="Misc",e[e.Layout=3]="Layout",e))(w||{}),h=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.SectionSetting=2]="SectionSetting",e[e.SectionShowcase=3]="SectionShowcase",e[e.SectionAsset=4]="SectionAsset",e[e.TemplateDescriptor=5]="TemplateDescriptor",e[e.PageTemplateDescriptor=6]="PageTemplateDescriptor",e[e.TemplateAsset=7]="TemplateAsset",e[e.Layout=8]="Layout",e))(h||{});const vo="https://json-schema.org/draft/2020-12/schema",Do="https://lightspeedhq.com/metadata.schema.json",Ao="Custom Multi Page Template metadata",Io="Metadata of a multi page template",Co="object",Po={metadata:{type:"object",properties:{name:{description:"Name of the template",type:"string",minLength:2,maxLength:60},description:{description:"Short description of the template",type:"string",minLength:2,maxLength:150},preview_url:{description:"Preview url of the demo website",type:"string",format:"uri",pattern:"^(https?)://([^.]+?\\.)company\\.site($|/[A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=]*)?$"},cover_image:{type:"object",properties:{set:{description:"Name of the image set",type:"object",patternProperties:{".*":{type:"object",properties:{url:{description:"Path to the preview image relative to the 'assets' folder for a specific resolution",type:"string"}},required:["url"],additionalProperties:!1}}}},required:["set"],additionalProperties:!1}},required:["name","description","cover_image"],additionalProperties:!1},header:{$ref:"./header_footer.schema.json"},footer:{$ref:"./header_footer.schema.json"}},No=["metadata","header","footer"],Lo=!1,Kn={$schema:vo,$id:Do,title:Ao,description:Io,type:Co,properties:Po,required:No,additionalProperties:Lo},Yn={__proto__:null,$id:Do,$schema:vo,additionalProperties:Lo,default:Kn,description:Io,properties:Po,required:No,title:Ao,type:Co},xo="https://json-schema.org/draft/2020-12/schema",ko="https://lightspeedhq.com/header_footer.schema.json",Fo="Header/Footer definition for a page template",Ro="object",Go=["type","id"],Mo={type:{type:"string",enum:["custom","default"]},id:{type:"string"}},Bo=!1,qo=[{if:{properties:{type:{const:"default"}}},then:{properties:{id:{enum:["header","footer"]}}}}],Jn={$schema:xo,$id:ko,title:Fo,type:Ro,required:Go,properties:Mo,additionalProperties:Bo,allOf:qo},Wn={__proto__:null,$id:ko,$schema:xo,additionalProperties:Bo,allOf:qo,default:Jn,properties:Mo,required:Go,title:Fo,type:Ro},Uo="https://json-schema.org/draft/2020-12/schema",zo="https://lightspeedhq.com/page.schema.json",Xo="Homepage",Ho="Homepage enclosing the necessary custom and default blocks",Vo="object",Ko={sections:{description:"List of sections contained by this page",type:"array",items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]}},allOf:[{if:{properties:{type:{const:"custom"}}},then:{$ref:"../template-custom.schema.json#/$defs/custom-section"}},{if:{properties:{type:{const:"default"}}},then:{$ref:"../template-default.schema.json#/$defs/default-section"}},{not:{properties:{id:{enum:["header","footer"]}},required:["id"]}}]},minItems:1,uniqueItems:!1}},Yo=!1,Jo=["sections"],Zn={$schema:Uo,$id:zo,title:Xo,description:Ho,type:Vo,properties:Ko,additionalProperties:Yo,required:Jo},Qn={__proto__:null,$id:zo,$schema:Uo,additionalProperties:Yo,default:Zn,description:Ho,properties:Ko,required:Jo,title:Xo,type:Vo},Wo="https://json-schema.org/draft/2020-12/schema",Zo="https://lightspeedhq.com/page.schema.json",Qo="Custom Page",es="A custom page enclosing the necessary custom and default blocks",ts="object",os={sections:{description:"List of sections contained by this page",type:"array",minItems:1,maxItems:1,uniqueItems:!1,items:{type:"object",properties:{type:{description:"Type of the section",type:"string",enum:["custom","default"]},id:{description:"Unique identifier for the section",type:"string"}},required:["type"],allOf:[{if:{properties:{type:{const:"default"}}},then:{$ref:"./product-browser.schema.json"}},{if:{properties:{type:{const:"custom"}}},then:{$ref:"../template-custom.schema.json#/$defs/custom-section"}}]}}},ss=!1,ns=["sections"],er={$schema:Wo,$id:Zo,title:Qo,description:es,type:ts,properties:os,additionalProperties:ss,required:ns},de={__proto__:null,$id:Zo,$schema:Wo,additionalProperties:ss,default:er,description:es,properties:os,required:ns,title:Qo,type:ts},rs="https://json-schema.org/draft/2020-12/schema",is="https://lightspeedhq.com/product-browser.schema.json",as="Product Browser Section",cs="Product browser section for a custom page",ps="object",ls=[{type:"object",properties:{type:{description:"Type of the section",type:"string",const:"default"},id:{description:"Identification of the section",type:"string",enum:["catalog","product","category"]},layout_id:{description:"Layout id of the section",type:"string"}},required:["type","id"],additionalProperties:!1}],tr={$schema:rs,$id:is,title:as,description:cs,type:ps,allOf:ls},or={__proto__:null,$id:is,$schema:rs,allOf:ls,default:tr,description:cs,title:as,type:ps},sr="https://blockbuster.ecwid.com",nr="/api/v1/custom-apps/resources/sections/upload",rr="/api/v1/custom-apps/resources/templates/upload",ir="/api/v1/custom-apps/manifests/sections",ar="/api/v1/custom-apps/manifests/templates",cr=5,pr=3,lr=[m.Server,m.Client,m.ClientChunks,m.ClientAsset,m.Asset],dr=[m.Dependency,m.TemplateAsset,m.SourceCode],B={DEFAULT:"Error while deploying:",ASSET_FILES_UPLOAD:"Error while uploading asset files:",MANIFEST_DEPLOYMENT:"Error while deploying manifest file:",DEPRECATED_VERSION_DEPLOYMENT:"You are using a non-supported version of crane. Please update to the latest crane version to continue.",DISTRIBUTION_FOLDER_NOT_FOUND:e=>`Distribution folder [${e}] not found, please execute the build command first.`},ds={catalog:"products",category:"category",product:"product"},fr=e=>ds[e],ur=e=>e in ds,mr=[Xt,Xe,Ze,yo,ft,rt,or,Wn,wo],yr=e=>{const t=[],o={},s=(n,r,i)=>{if(!n){o[e.name]||(o[e.name]=[]),o[e.name].push({instancePath:`/templates/${e.name}/${r}`,message:`Missing file: ${r}`,keyword:"required"});return}t.push({templateName:e.name,source:n,dist:y.resolve(`dist/templates/${e.name}/${r}`),ajv:M(mr,i)})};return s(e.catalogEntrypoint,"catalog",de),s(e.productEntrypoint,"product",de),s(e.homeEntrypoint,"home",Qn),s(e.categoryEntrypoint,"category",de),s(e.configurationEntrypoint,"configuration",Yn),[t,o]};function gr(e,t){if(t.findIndex(o=>o===`${e.id}${k}${e.layout_id}`)===-1)return{instancePath:`/sections/${e.id}/layout_id`,message:`Layout "${e.layout_id}" for section "${e.id}" not found in "layouts/${e.id}/".`,keyword:"layout_not_found"}}async function hr(e,t){const o=(t??[]).map(xe);return e.sections.filter(s=>ur(s.id)).filter(s=>"layout_id"in s).map(s=>gr(s,o)).filter(s=>s!==void 0)}function $r(e){return"sections"in e}async function br(e,t){const o=await G(e.dist,!0),s={},n=[];if(e.ajv(o)?we(`${e.dist}${C}.mjs`,`${e.dist}.mjs`,()=>{}):(n.push(...le(e.ajv.errors??[])),je(`${e.dist}${C}.mjs`,()=>{})),$r(o)){const r=await hr(o,t);n.push(...r)}return n.length>0&&(s[e.source]=n),s}const Er=async(e,t)=>{const[o,s]=yr(e);return(await Promise.all(o.map(n=>br(n,t)))).reduce((n,r)=>(Object.entries(r).forEach(([i,c])=>{n[i]=n[i]?[...n[i],...c]:[...c]}),n),{...s})};async function Tr(e,t,o,s=E){if(t.showcase_overrides?.content!==void 0)if(!j(`${s}/${t.id}/js/settings/content.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/content`,message:"Content descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/content`,!1),r=new Set(Object.keys(n));Object.keys(t.showcase_overrides.content).every(i=>r.has(i))||e.push({instancePath:`/sections/${o}/showcase_overrides/content`,message:"Content descriptor must be a subset of the default content descriptor",keyword:"type"})}}async function wr(e,t,o,s=E){if(t.showcase_overrides?.design!==void 0)if(!j(`${s}/${t.id}/js/settings/design.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/design`,message:"Design descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/design`,!1),r=new Set(Object.keys(n));Object.keys(t.showcase_overrides.design).every(i=>r.has(i))||e.push({instancePath:`/sections/${o}/showcase_overrides/design`,message:"Design descriptor must be a subset of the default design descriptor",keyword:"type"})}}async function jr(e,t,o,s=E){if(t.showcase_overrides?.layoutId!==void 0)if(!j(`${s}/${t.id}/js/settings/layout.mjs`))e.push({instancePath:`/sections/${o}/showcase_overrides/layout`,message:"Layout id descriptor is set, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await G(`${s}/${t.id}/js/settings/layout`,!1);new Set(n.map(r=>r.layoutId)).has(t.showcase_overrides.layoutId)||e.push({instancePath:`/sections/${o}/showcase_overrides/layout`,message:"Layout id descriptor must be a valid id in the default layout descriptor",keyword:"type"})}}async function fe(e,t,o,s=E){t.showcase_overrides!==void 0&&(await Tr(e,t,o,s),await wr(e,t,o,s),await jr(e,t,o,s))}function ue(e,t,o,s=E){t.showcase_id!==void 0&&(j(`${s}/${t.id}/js/showcases/${t.showcase_id}.mjs`)||e.push({instancePath:`/sections/${o}/showcase-id`,message:"Custom section must have a corresponding showcase defined in case showcase_id is specified",keyword:"required"}))}async function Or(e,t){const o=t.id==="header"&&t.type==="default",s=j(`${z}/${t.id}`);!o&&!s&&e.push({instancePath:"/sections/0/id",message:"The first section must be a `header`",keyword:"required"}),s&&(await fe(e,t,0,z),ue(e,t,0,z))}async function Sr(e,t,o){const s=t.id==="footer"&&t.type==="default",n=j(`${X}/${t.id}`);!s&&!n&&e.push({instancePath:`/sections/${o}/id`,message:"The last section must be a `footer`",keyword:"required"}),n&&(await fe(e,t,o,X),ue(e,t,o,X))}async function _r(e,t){t.showcase_overrides&&e.push(..._o(`sections/${t.id}`,t.showcase_overrides))}async function vr(e){const t=await e.sections.reduce(async(o,s,n)=>{const r=await o;return n===0?await Or(r,s):n===e.sections.length-1?await Sr(r,s,e.sections.length-1):s.type==="custom"?j(`${E}/${s.id}`)?(await fe(r,s,n),ue(r,s,n),await _r(r,s)):r.push({instancePath:`/sections/${n}/id`,message:"Custom section must have a corresponding block defined",keyword:"required"}):s.type==="default"&&(s.id==="header"&&r.push({instancePath:`/sections/${n}/id`,message:"Header can only be placed as the first section",keyword:"required"}),s.id==="footer"&&r.push({instancePath:`/sections/${n}/id`,message:"Footer can only be placed as the last section",keyword:"required"})),r},Promise.resolve([]));return t.length>0?t:void 0}async function Dr(){const e=await p("./templates/*",{ignore:["templates/assets/**","templates/**.{js,ts}","node_modules/**","dist/**"]}).catch(t=>(a.error(`Error while getting page template entry points: ${t}`),[]));return Promise.all(e.map(async t=>{const o=t.split(k),s=o.pop()??"default";if(o.pop()===void 0)throw new Error("Cannot determine template with custom pages, outer directory is undefined");const n=await p(`**/${s}/configuration.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),r=await p(`**/${s}/pages/home.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await p(`**/${s}/pages/category.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await p(`**/${s}/pages/catalog.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),l=await p(`**/${s}/pages/product.{js,ts}`,{ignore:["node_modules/**","dist/**"]});return{name:s,configurationEntrypoint:n.at(0),homeEntrypoint:r.at(0),categoryEntrypoint:i.at(0),catalogEntrypoint:c.at(0),productEntrypoint:l.at(0)}}))}async function Ar(){const e=await p("./templates/**.{js,ts}",{ignore:["node_modules/**","dist/**"]}),t=await p("./templates/assets/*",{ignore:["node_modules/**","dist/**"]});return{pageTemplates:await Dr(),templates:e,assets:t}}async function Ir(e){if(e.templates.length===0&&e.pageTemplates?.length===0)return{};const t=await Gn();return await x(void 0,e.assets,h.TemplateAsset),await x(void 0,e.templates,h.TemplateDescriptor),e.templates.reduce(async(o,s)=>{const n=await o,r=`${_}/js/${F(s).name}`,i=await G(r,!0);return{...n,...Vn(t,i,r,await vr(i))}},Promise.resolve({}))}async function Cr({templateBuildConfig:e,layoutEntrypoints:t}){return e.pageTemplates?.reduce(async(o,s)=>{const n=await o,r=[s.configurationEntrypoint,s.homeEntrypoint,s.categoryEntrypoint,s.catalogEntrypoint,s.productEntrypoint].filter(te);if(r.length===0)throw new Error("No entry points provided for page template");return await x(s.name,r,h.PageTemplateDescriptor),{...n,...await Er(s,t)}},Promise.resolve({}))??{}}async function Pr({layoutEntrypoints:e}){const t=await Ar(),o=await Promise.all([Ir(t),Cr({templateBuildConfig:t,layoutEntrypoints:e})]);return o.some(s=>!ke(s))?o.reduce((s,n)=>({...s,...n}),{}):{}}const Nr=()=>Xs({ext:".gz",algorithm:"gzip",deleteOriginFile:!0}),Lr="/* EXTERNAL_IMPORTS_START */",xr="/* EXTERNAL_IMPORTS_END */",kr=()=>({name:"external-imports-wrapper-plugin",enforce:"post",apply:"build",generateBundle(e,t){for(const o of Object.keys(t)){const s=t[o];if(s.type==="chunk"){const n=/import.*\?commonjs-external["'];/g,r=s.code.match(n);if(r!==null){const i=r.join(""),c=Lr+i+xr,l=s.code.replace(n,"");s.code=c+l}}}}}),Fr=()=>{const e=process.env.npm_lifecycle_event;return Ks({typescript:!0,vueTsc:!1,eslint:e==="test"?!1:{lintCommand:`eslint --max-warnings=0 "./sections/**/*.{js,ts,vue}" --cache --cache-location "./build/eslintcache/${e}.json"`}})},v={VUE:Hs(),TS_CONFIG_PATHS:Vs(),CHECKER:Fr()},Rr={[w.Server]:[v.VUE,v.TS_CONFIG_PATHS,kr(),Nr()],[w.Client]:[v.VUE,v.TS_CONFIG_PATHS,v.CHECKER,De({vue:"EcVue"})],[w.Misc]:[v.TS_CONFIG_PATHS,v.CHECKER],[w.Layout]:[v.VUE,v.TS_CONFIG_PATHS,v.CHECKER,De({vue:"StVue"})]},fs={"process.env":{NODE_ENV:"production"}},Gr=[...ve,...ve.map(e=>`node:${e}`)],Mr=[/@vue\/compiler-dom/,/@vue\/runtime-dom/,/@vue\/server-renderer/,/@vue\/compiler-ssr/,/@vue\/shared/],D={[h.Server]:{pluginType:w.Server,define:fs,ssr:!0,ssrOptions:{noExternal:!0},outDir:(e,t)=>`./${g[t].dist}/${e}/js/main/server`,externalOption:[...Gr,...Mr],entryFileNames:"server.js",inlineDynamicImports:!0},[h.Client]:{pluginType:w.Client,define:fs,ssr:!1,outDir:(e,t)=>`./${g[t].dist}/${e}/js/main/client`,entryFileNames:"client.js",assetFileNames:"assets/[name].[ext]",chunkFileNames:"chunks/[name].js",inlineDynamicImports:!1},[h.SectionSetting]:{pluginType:w.Misc,ssr:!1,outDir:(e,t)=>`./${g[t].dist}/${e}/js/settings`,entryFileNames:"[name].mjs"},[h.SectionShowcase]:{pluginType:w.Misc,ssr:!1,outDir:(e,t)=>`./${g[t].dist}/${e}/js/showcases`,entryFileNames:"[name].mjs"},[h.SectionAsset]:{pluginType:w.Misc,ssr:!1,outDir:(e,t)=>`./${g[t].dist}/${e}/assets`,assetFileNames:"[name].[ext]"},[h.TemplateDescriptor]:{pluginType:w.Misc,ssr:!1,outDir:()=>`./${_}/js`,entryFileNames:`[name]${C}.mjs`},[h.PageTemplateDescriptor]:{pluginType:w.Misc,ssr:!1,outDir:e=>`./${_}/${e}`,entryFileNames:`[name]${C}.mjs`},[h.TemplateAsset]:{pluginType:w.Misc,ssr:!1,outDir:()=>`./${_}/assets`,assetFileNames:"[name].[ext]"},[h.Layout]:{pluginType:w.Layout,ssr:!1,outDir:e=>`./${re}/${e}`,entryFileNames:"index.mjs",inlineDynamicImports:!0}};function Br(e){switch(typeof e){case"string":return[f(process.cwd(),e)];case"object":return e.map(t=>f(process.cwd(),t));default:return[]}}function us({name:e,entryPoints:t,configType:o,sectionType:s}){const n=D[o].define,r=D[o].ssrOptions,i=D[o].entryFileNames,c=D[o].chunkFileNames,l=D[o].assetFileNames,d=D[o].inlineDynamicImports,$=D[o].externalOption;return{plugins:Rr[D[o].pluginType],...n!==void 0&&{define:n},...r!==void 0&&{ssr:r},resolve:{alias:{"@":"/src"}},css:{preprocessorOptions:{scss:{api:"modern-compiler"}}},build:{ssr:D[o].ssr,outDir:D[o].outDir(e,s),emptyOutDir:!0,minify:"terser",terserOptions:{compress:{drop_console:!1}},rollupOptions:{...$!==void 0&&{external:$},preserveEntrySignatures:"strict",input:Br(t),treeshake:{moduleSideEffects:!1},output:{validate:!0,inlineDynamicImports:d,...i!==void 0&&{entryFileNames:i},...c!==void 0&&{chunkFileNames:c},...l!==void 0&&{assetFileNames:l}}}}}}async function qr(e){const t=_e(us({name:e.name,entryPoints:e.serverEntrypoint,configType:h.Server,sectionType:e.type}));return Hn(e.assetEntryPoints),await ne({configFile:!1,...t}),await Xn(e.name,e.type),await x(e.name,e.clientEntrypoint,h.Client,e.type),await x(e.name,e.settingsEntryPoints,h.SectionSetting,e.type),await x(e.name,e.showcaseEntryPoints,h.SectionShowcase,e.type),await x(e.name,e.assetEntryPoints,h.SectionAsset,e.type),await Mn(e).reduce(async(o,s)=>{const n=await o,r=await Un(s);return{...n,...r}},Promise.resolve({}))}async function Ur(e){return e.reduce(async(t,o)=>{const s=await t,n=await qr(o);return{...s,...n}},Promise.resolve({}))}function zr(e){const t=xe(e);return x(t,[e],h.Layout)}function Xr(){return p(`./${Ce}/{product,category,catalog}/*/Main.vue`,{ignore:["node_modules/**","dist/**"]})}async function Hr(e){e===void 0||e.length===0||await Promise.all(e.map(zr))}function Vr(e){return Object.entries(g).find(t=>t[1].source===e)?.[0]}async function Kr(){const e=await p("**/server.{js,ts}",{ignore:["node_modules/**","dist/**","templates/**"]});return Promise.all(e.map(async t=>{const o=Cs(t).split(k),s=o.pop()??"default",n=o.pop();if(n===void 0)throw new Error("Cannot determine type of section, outer directory is undefined");const r=await p(`**/${s}/client.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await p(`**/${s}/settings/content.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await p(`**/${s}/settings/design.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),l=await p(`**/${s}/settings/layout.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),d=await p(`**/${s}/settings/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),$=await p(`**/${s}/showcases/*.{js,ts}`,{ignore:["node_modules/**","dist/**",`**/${s}/showcases/translations.{js,ts}`]}),Ds=await p(`**/${s}/showcases/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),As=await p(`**/${s}/assets/*`,{ignore:["node_modules/**","dist/**"]});return{name:s,type:Vr(n),serverEntrypoint:t,clientEntrypoint:r.at(0),contentSettingsEntrypoint:i.at(0),designSettingsEntrypoint:c.at(0),layoutSettingsEntrypoint:l.at(0),settingsTranslationsEntrypoint:d.at(0),showcasesEntrypoints:$,showcasesTranslationsEntrypoint:Ds.at(0),assetsEntrypoints:As}}))}function Yr(){return Promise.all([se.rm("dist",{recursive:!0,force:!0}),se.rm("source-code",{recursive:!0,force:!0}),se.rm("source-code.zip",{force:!0})])}async function Jr(){const e=new Rs,t=["node_modules/**/*","dist/**/*","build/**/*",".git/**/*","**/assets/**/*","crane.config.json"],o=await p("**/*",{cwd:f(process.cwd()),ignore:t,dot:!0,nodir:!0});try{o.forEach(r=>{const i=f(process.cwd(),r);e.addLocalFile(i,F(r).dir)});const s=K[m.SourceCode].fileName,n=f(process.cwd(),s);await e.writeZipPromise(n)}catch(s){throw a.error("Error while zipping source files"),s}}async function ms(){await Yr();try{const e=await Xr(),t=await Kr().then(s=>s.map(n=>({name:n.name,type:n.type,serverEntrypoint:n.serverEntrypoint,clientEntrypoint:[n.clientEntrypoint].filter(te).flat(),settingsEntryPoints:[n.contentSettingsEntrypoint,n.designSettingsEntrypoint,n.layoutSettingsEntrypoint,n.settingsTranslationsEntrypoint].filter(te),showcaseEntryPoints:[...n.showcasesEntrypoints??[],n.showcasesTranslationsEntrypoint].filter(te),assetEntryPoints:n.assetsEntrypoints??[]}))),o={...await Ur(t),...await Pr({layoutEntrypoints:e})};Object.keys(o).length===0?(await Hr(e),await Jr(),a.info(`Build successful:
|
|
3
|
+
For preview run: npx @lightspeed/crane@latest preview
|
|
4
|
+
For deploy run: npx @lightspeed/crane@latest deploy`)):(a.error("Error during build:"),Bn(o))}catch(e){a.error(`Error while building: ${e.message}`),process.exit(1)}}async function x(e,t,o,s="SECTION"){if(t.length!==0){const n=_e(us({name:e,entryPoints:t,configType:o,sectionType:s}));await ne({configFile:!1,...n})}}const Wr=e=>`\x1B[32m${e}\x1B[0m`,Zr=(e,t,o,s,n)=>{if(!e.total)return;const{loaded:r}=e,i=(Date.now()-n)/1e3;o.value+=r-s.value,s.value=r,t.update({speed:`${U(o.value/i,2)}/s`})},Qr=()=>new Zs.SingleBar({format:`|${Wr("{bar}")}| {status} || {percentage}% || {value}/{total} Files || Speed: {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591"});function me(e,t){return Object.keys(e).reduce((o,s)=>{const n=e[s],r=t[s];return Le(n)&&Le(r)?o[s]=me(n,r):o[s]=n,o},{...t})}function ei({contentSettings:e,sectionType:t}){const o=Oo(t);return me(e,o)}function ti({designSettings:e,sectionType:t}){const o=So(t);return me(e,o)}function ye(e){if(e!==void 0)return e.startsWith("global.")?{type:"GLOBAL_FONT",font:e}:{type:"PRESET_FONT",font:e}}function S(e){if(e===void 0)return;if(e.startsWith("global."))return{type:"GLOBAL_COLOR",raw:e};const t=Qs(e);return{type:"STRUCTURED_COLOR",raw:e,hex:t.toHex8String(),hsl:t.toHsl(),rgba:t.toRgb(),auto:!1}}function ys(e){if(e!==void 0)return typeof e=="string"&&e.startsWith("global.")?{type:"GLOBAL_TEXT_SIZE",size:e}:{type:"NUMERIC_TEXT_SIZE",size:Number(e)}}const oi={COLOR:"COLOR",GRADIENT:"GRADIENT"};function si(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";default:throw new Error(`Unknown background type: ${e}. Right options: ${Object.keys(oi)}`)}}function ni(e){const t=e.style,o=e.color,s=Array.isArray(o)?o:[o,o];return e.background={type:si(t),solid:{color:S(s.at(0))},gradient:{fromColor:S(s.at(0)),toColor:S(s.at(1))}},e.style=void 0,e.color=void 0,e}const ri={SOLID:"SOLID",OUTLINE:"OUTLINE",TEXT:"TEXT"};function ii(e){switch(e){case"SOLID":return"solid-button";case"OUTLINE":return"outline-button";case"TEXT":return"text-link";default:throw new Error(`Unknown button appearance: ${e}. Right options: ${Object.keys(ri)}`)}}const ai={SMALL:"SMALL",MEDIUM:"MEDIUM",LARGE:"LARGE"};function ci(e){switch(e){case"SMALL":return"small";case"MEDIUM":return"medium";case"LARGE":return"large";default:throw new Error(`Unknown button size: ${e}. Right options: ${Object.keys(ai)}`)}}const pi={ROUND_CORNER:"ROUND_CORNER",RECTANGLE:"RECTANGLE",PILL:"PILL"};function li(e){switch(e){case"ROUND_CORNER":return"round-corner";case"RECTANGLE":return"rectangle";case"PILL":return"pill";default:throw new Error(`Unknown button shape: ${e}. Right options: ${Object.keys(pi)}`)}}function di(e){const t=e.appearance;t!==void 0&&(e.appearance=ii(t));const o=e.size;o!==void 0&&(e.size=ci(o));const s=e.shape;s!==void 0&&(e.style=li(s),e.shape=void 0);const n=e.font;e.font=ye(n);const r=e.color;return e.color=S(r),e}const fi={COLOR:"COLOR",GRADIENT:"GRADIENT",NONE:"NONE"};function ui(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";case"NONE":return"none";default:throw new Error(`Unknown image overlay type: ${e}. Right options: ${Object.keys(fi)}`)}}function mi(e){const t=e.overlay,o=e.color,s=Array.isArray(o)?o:[o,o];return e.overlay={type:ui(t),solid:{color:S(s.at(0))},gradient:{fromColor:S(s.at(0)),toColor:S(s.at(1))}},e.color=void 0,e}function yi(e){const t=e.font;e.font=ye(t);const o=e.color;e.color=S(o);const s=e.size;return e.size=ys(s),e}function gi(e){const t=e.color;return e.color=S(t),e}function hi(e){const t=e.font;e.font=ye(t);const o=e.color;e.color=S(o);const s=e.size;if(e.size=ys(s),e.frame!==void 0){const n=e.frame.color;e.frame.color=S(n)}return e}function ge(e,t){switch(e){case"TEXT":{yi(t);break}case"BUTTON":{di(t);break}case"IMAGE":{mi(t);break}case"BACKGROUND":{ni(t);break}case"COLOR_PICKER":{gi(t);break}case"LOGO":{hi(t);break}case"TOGGLE":case"DIVIDER":case"SELECTBOX":break;default:throw new Error(`Unknown design editor type: ${e}`)}return t}function $i(e){Object.keys(e).forEach(t=>{const o=e[t];o.type!=="DIVIDER"&&ge(o.type,o.defaults)})}function bi(e){e.forEach(t=>{t.type!==void 0&&t.defaults!==void 0&&(ge(t.type,t.defaults),t.defaults.type=t.type)})}function gs(e){Object.keys(e).forEach(t=>{const o=e[t],s=o.type;ge(s,o)})}function Ei(e,t){if(!t)return;const o=e[t];return o===void 0?{en:t}:o}function Ti(e){const t={};for(const o in e){const s=e[o];for(const n in s){const r=t[n],i=s[n];if(r===void 0){const c={};c[o]=i,t[n]=c}else r[o]=i}}return t}function J(e,t){if(!e||typeof e!="object")return;const o=e;for(const s in o){const n=o[s];typeof n=="string"&&n.startsWith("$")&&!Array.isArray(e)?o[s]=Ei(t,n):typeof n=="object"&&J(n,t)}}async function q(e){return(await import(Oe(e).href)).default}async function wi(e,t,o=E){try{const s=f(I.cwd(),`${o}/${e}/js/settings/content.mjs`),n=await q(s),r=H(e),i=ei({contentSettings:n,sectionType:r});return J(i,t),i}catch{throw new Error(`Content descriptor for section [${e}] is either invalid or undefined`)}}async function ji(e,t,o=E){try{const s=f(I.cwd(),`${o}/${e}/js/settings/design.mjs`),n=await q(s),r=H(e),i=ti({designSettings:n,sectionType:r});return $i(i),J(i,t),i}catch(s){const n=s;throw new Error(`Design settings is invalid or undefined. Error ${n.stack}`)}}async function Oi(e,t,o=E){try{const s=await p("*.mjs",{cwd:f(I.cwd(),`${o}/${e}/js/showcases/`),ignore:"**/translations.mjs"});return Promise.all(s.map(async n=>{const r=f(I.cwd(),`${o}/${e}/js/showcases/${n}`),i=await q(r);return gs(i.design),J(i,t),i}))}catch(s){throw new Error(`Showcases is invalid or undefined. Error ${s}`)}}async function Si(e,t=E){try{const o=f(I.cwd(),`${t}/${e}/js/settings/layout.mjs`);if(!j(o))return[];const s=await q(o);return s.forEach(n=>bi(n.selectedDesignSettings)),s}catch{throw new Error(`Layout descriptor for section [${e}] is either invalid or undefined`)}}async function hs(e){const t=f(I.cwd(),e),o=await q(t);return Ti(o)}async function _i(e,t=E){return hs(`${t}/${e}/js/settings/translations.mjs`)}async function $s(e,t=E){return hs(`${t}/${e}/js/showcases/translations.mjs`)}async function he(e,t){const o=await _i(e,g[t].dist),s=await $s(e,g[t].dist),n=await wi(e,o,g[t].dist),r=await ji(e,o,g[t].dist),i=await Oi(e,s,g[t].dist),c=await Si(e,g[t].dist);return{id:e,type:t,name:{en:e},contentEditors:n,designEditors:r,layouts:c,showcases:i}}async function vi(){const e=await p("*/",{cwd:f(I.cwd(),`${E}/`)}),t=await p("*/",{cwd:f(I.cwd(),`${z}/`)}),o=await p("*/",{cwd:f(I.cwd(),`${X}/`)});return Promise.all([...e.map(async s=>he(s,"SECTION")),...t.map(async s=>he(s,"HEADER")),...o.map(async s=>he(s,"FOOTER"))])}async function $e(e){if(!e||e.type!=="custom")return;const t=H(e.id),o=await $s(e.id,g[t].dist);e.showcase_overrides!==void 0&&(J(e.showcase_overrides,o),e.showcase_overrides.design&&gs(e.showcase_overrides.design))}async function bs(e){const t=e.filter(o=>o.type==="custom");await Promise.all(t.map(o=>$e(o)))}const Di=new Map([["catalog","product-details"],["product","storefront-product"],["category","storefront-category"]]);async function be(e){try{return await q(f(process.cwd(),e))}catch{throw new Error(`Template file [${e}] is either invalid or undefined`)}}async function Ai(e){const t=await p(`${_}/js/**.mjs`,{ignore:[`${_}/js/**${C}.mjs`]});return Promise.all(t.map(async o=>{const s=await be(o);return await bs(s.sections),{id:`${e}_${F(o).name}`,descriptor:s}}))}function Ii(e){return e in oe?oe[e]:oe.CUSTOM}function Ci(e){return e.map(t=>({...t,id:Di.get(t.id)??t.id}))}async function Pi(e){const t=await p(`${_}/${e}/*.mjs`,{ignore:[`${_}/${e}/configuration*.mjs`]});return Promise.all(t.map(async o=>{const{sections:s}=await be(o),n=sn(o);return await bs(s),{sections:Ci(s),id:n,type:Ii(n.toUpperCase())}}))}async function Ni(e){const t=await p(`${_}/**/configuration*.mjs`,{});return Promise.all(t.map(async o=>{const s=await be(o);await $e(s.header),await $e(s.footer);const n=y.basename(y.dirname(o)),r=await Pi(n);return{id:`${e}_${n}`,descriptor:{...s,pages:r}}}))}async function Li(e){return[...await Ai(e),...await Ni(e)]}async function Es(e){await new Promise(t=>setTimeout(t,e))}function xi(e){const[t,o]=e.split(k),s=fr(t);return{id:o,sectionId:t,pageId:s}}function ki(e){return e.split(k).length===2}async function Fi(){return(await p("*/*",{cwd:f(process.cwd(),re)})).filter(ki).map(xi)}const Ri={value:0},O=Qr();let Ts=Date.now();const ws=e=>2**e*500;async function Gi(){const e=await Ae(f(A.cwd(),"crane.config.json")),t=JSON.parse(e.toString());return{appClientId:t.app_client_id,appSecretKey:btoa(t.app_secret_key)}}function Mi(e){return typeof e=="object"&&e!==null&&"version"in e&&typeof e.version=="string"}async function Bi(){const e=f(A.cwd(),"package.json"),t=await Ae(e),o=JSON.parse(t.toString());if(Mi(o))return o;throw new Error(`Package file located at path: ${e} does not contain a version field`)}async function qi(e){const t=Js(e.version,"patch");if(t===null)throw Error("Error while incrementing app version");e.version=t,xs(f(A.cwd(),"package.json"),`${JSON.stringify(e,null,2)}
|
|
5
|
+
`)}function Ee({deploymentContext:e,sectionType:t="SECTION"}){const o=e.pathContext,s=o.toPath({id:e.currentSection,sectionType:t,layoutId:e.layoutId}),n=s===void 0?Se(o.fileName):Se(o.fileName,{cwd:f(A.cwd(),s),ignore:o.ignore});return(o.isSingleton?n.splice(0):n).map(r=>({url:r,sectionType:t,context:e}))}function Ui(e){return e instanceof Ie&&(e.code==="ECONNRESET"||e.response?.status!==void 0&&e.response?.status>=500&&e.response?.status<600)}function js(e,t){return e<pr&&Ui(t)}function Os(e,t,o,s){const n={value:0},r=e.config.app.templates.length>0?rr:nr;return e.config.axios.post(r,{file:ks(f(A.cwd(),o!==void 0?o+t:t))},{params:{appClientId:e.config.app.crane.appClientId,type:e.pathContext.type,version:e.config.app.packageJson.version,...e.currentSection!==void 0&&{block:e.currentSection},...e.layoutId!==void 0&&{layoutId:e.layoutId},...!["dependencies","source_code"].includes(e.pathContext.type)&&{fileName:t}},headers:{"Content-Type":"multipart/form-data",Authorization:`Bearer ${e.config.app.crane.appSecretKey}`},onUploadProgress:i=>Zr(i,O,Ri,n,Ts)}).then(i=>(O.increment(),i)).catch(async i=>{if(js(s,i))return await Es(ws(s)),Os(e,t,o,s+1);throw O.increment(),i})}function zi(e){return O.start(e.length+1,0,{speed:"N/A",status:"Deployment in progress"}),e.map(t=>{const o=t.context,s=o.pathContext.toPath({id:o.currentSection,sectionType:t.sectionType,layoutId:o.layoutId});return Os(o,t.url,s,0)})}function Xi(e){const t=e.app.sections.flatMap(n=>lr.flatMap(r=>{const i={config:e,currentSection:n.id,pathContext:K[r]};return Ee({deploymentContext:i,sectionType:n.type})})),o=dr.flatMap(n=>{const r={config:e,pathContext:K[n]};return Ee({deploymentContext:r,sectionType:"SECTION"})}),s=e.app.layouts.flatMap(n=>{const r={config:e,pathContext:K[m.Layout],currentSection:n.sectionId,layoutId:n.id};return Ee({deploymentContext:r})});return zi([...t,...o,...s])}function Hi(e){return e.includes(`
|
|
6
|
+
`)}function Vi(e,t,o){return e.split(`
|
|
5
7
|
`).map((s,n)=>n>=o?t+s:s).join(`
|
|
6
|
-
`)}function W(e,t){const o=[];if(e instanceof Ie){e.response?.status!==void 0&&o.push(` HTTP Status Code: ${e.response.status}`);const r=e.response?.data;if(r?.errorCode&&o.push(` Error Code: ${r.errorCode}`),r?.errorMessage){const i=
|
|
8
|
+
`)}function W(e,t){const o=[];if(e instanceof Ie){e.response?.status!==void 0&&o.push(` HTTP Status Code: ${e.response.status}`);const r=e.response?.data;if(r?.errorCode&&o.push(` Error Code: ${r.errorCode}`),r?.errorMessage){const i=Hi(r.errorMessage)?Vi(r.errorMessage," ",1):r.errorMessage;o.push(` Error Message: ${i}`)}}const s=o.length>0?o.join(`
|
|
7
9
|
`):e?.message??"Unknown error";if(!t||t.length===0)return s;const n=o.length>0?`
|
|
8
|
-
`:" ";return`${t}${n}${s}`}async function
|
|
10
|
+
`:" ";return`${t}${n}${s}`}async function Ss(e,t=0){const o=e.app.templates.length>0?ar:ir;return e.axios.post(o,{version:e.app.packageJson.version,name:"Custom Block App",blocks:e.app.sections,templates:e.app.templates,layouts:e.app.layouts,compressionEnabled:!0,externalizationEnabled:!0,vueVersion:e.app.packageJson.dependencies.vue},{params:{appClientId:e.app.crane.appClientId},headers:{Authorization:`Bearer ${e.app.crane.appSecretKey}`}}).catch(async s=>{if(js(t,s))return await Es(ws(t)),Ss(e,t+1);throw s})}async function Ki(e){try{if(!j(f(A.cwd(),E)))throw new Error(B.DISTRIBUTION_FOLDER_NOT_FOUND(E));const t=e??sr;a.info("Custom application deployment :: Started");const o=Ys.create({baseURL:t});Ws(o,cr),a.info("Loading configuration files ...");const s=await Promise.all([Gi(),Bi(),vi(),Fi()]).then(async([i,c,l,d])=>({axios:o,app:{crane:i,packageJson:c,sections:l,layouts:d,templates:await Li(i.appClientId)}}));a.info("Uploading files ..."),Ts=Date.now(),await Promise.all(Xi(s)).catch(i=>{O.stop(),i.response?.status===404?a.error(W(i,B.DEPRECATED_VERSION_DEPLOYMENT)):a.error(W(i,B.ASSET_FILES_UPLOAD)),A.exit(1)}).finally(()=>{O.increment(),O.stop()}),O.update({speed:"N/A",status:"Finalising deployment"}),await Ss(s).catch(i=>{O.stop(),i.response?.status===404?a.error(W(i,B.DEPRECATED_VERSION_DEPLOYMENT)):a.error(W(i,B.MANIFEST_DEPLOYMENT)),A.exit(1)}).finally(()=>{O.increment(),O.stop()});const n=s.app.sections.map(i=>i.id),r=s.app.packageJson.version;a.info("Custom application deployment :: Successful"),a.info(`Current app version: ${r}`),a.info(`Deployed sections: ${n.join(", ")}`),await qi(s.app.packageJson),s.app.templates.length>0&&a.info(`Deployed templates: ${s.app.templates.map(i=>i.id).join(", ")}`)}catch(t){O.stop(),a.error(W(t,B.DEFAULT)),A.exit(1)}}const Yi="1.2.4";async function Ji(e){ce(),ie("template/headers/example-header","headers",e,"Header")}async function Wi(e){ce(),ie("template/footers/example-footer","footers",e,"Footer")}const Zi={deploy:["url"],init:["customStorefrontPages"],build:["generatePreview"]};function Qi(e,t){return e.options.length!==0&&Object.keys(t).length===1}function ea(e){return e.includes("-h")||e.includes("--help")}function ta(e,t){return Object.keys(t).some(o=>o!=="--"&&!e.hasOption(o)&&!Zi[e.rawName]?.includes(o))}function oa(e){return e.length!==0}function sa(e,t,o){return e.matchedCommand!==void 0&&(Qi(e.matchedCommand,o)||ea(e.rawArgs)||ta(e.matchedCommand,e.options)||oa(t))}function na(e,t,o){e.matchedCommand&&!sa(e,t,o)?e.runMatchedCommand():e.outputHelp()}async function ra(e,t){const o=f(`${e}/shared/preview.ts`);await ne({build:{lib:{entry:o,formats:["es"],fileName:()=>"preview.js"},outDir:f(t),emptyOutDir:!1,rollupOptions:{output:{entryFileNames:"preview.js"}},target:"esnext"}})}async function ia(){const e="preview",t=`${e}/shared`,o="vite.config.js",s=`${e}/sections`,n=`${s}/preview.html`;[e,s].forEach(i=>{u.existsSync(i)||u.mkdirSync(i,{recursive:!0})});const r=L("template/preview");u.existsSync(`${e}/${o}`)||u.copyFileSync(`${r}/${o}`,`${e}/${o}`),u.existsSync(n)||u.copyFileSync(`${r}/sections/preview.html`,n),u.existsSync(t)||(u.mkdirSync(t),await ra(r,t))}async function aa(){const e=y.resolve(process.cwd(),"preview/vite.config.js"),t=await Gs({configFile:e,root:process.cwd()});return await t.listen(),t}async function ca(){return await ms(),ia(),aa()}function _s(e){if(on(e))return console.log("Please specify a name for your resource."),!1;const{isValid:t,errorMessage:o}=tn(e);return o&&console.log(o),t}async function vs(e,t,o,s,n){const r=(await Te({type:"text",name:"name",message:`Please specify a name for your ${t}:`})).name;if(r===void 0)return console.log(`You can use ${o} to directly specify the name of the ${t}.`),e.outputHelp();const i=y.basename(r);return _s(i)?s(i,n):vs(e,t,o,s,n)}async function Z(e,t,o,s,n,r){if(n!==void 0)if(!_s(n))await vs(e,t,o,s);else{const i=y.basename(n.toString());await s(i,r)}}async function pa(e,t){try{const{app:o,section:s,header:n,footer:r,template:i,customStorefrontPages:c,referenceTemplate:l}=e,d=!!c;await Z(t,"app",R("init --app <name>"),un,o),await Z(t,"section",R("init --section <name>"),yn,s),await Z(t,"header",R("init --header <name>"),Ji,n),await Z(t,"footer",R("init --footer <name>"),Wi,r),await Z(t,"template",R("init --template <name>"),gn,i,d),l&&await hn()}catch(o){a.error(`Error while executing init operation: ${o.message}`),process.exit(1)}}function la(){try{const e=Is("crane");e.option("-h, --help","Display this message"),e.command("init","Initialize a new resource in the form of a directory.").option("--app [name]","Creates an app folder inside your current directory.").option("--section [name]","Creates the files necessary for one custom section with the given name, this can be repeated for each section.").option("--header [name]","Creates the files necessary for one custom header with the given name, this can be repeated for each header.").option("--footer [name]","Creates the files necessary for one custom footer with the given name, this can be repeated for each footer.").option("--template [name]","Creates the directory and files necessary to build a custom template inside your app folder.").option("--reference-template","Adds files necessary for the reference templates inside your app folder. ").allowUnknownOptions().action(async o=>pa(o,e)),e.command("build","Builds your resource code").allowUnknownOptions().action(()=>ms()),e.command("preview","Runs a local server to preview resources").allowUnknownOptions().action(()=>ca()),e.command("deploy","Deploys your resource code").allowUnknownOptions().action(()=>Ki(e.options.url)),e.version(Yi),e.usage("<action> <resource>");const t=e.parse(process.argv,{run:!1});na(e,t.args,t.options)}catch(e){a.error(`Error while parsing input: ${e.message}`),process.exit(1)}}export{la as run};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightspeed/crane",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "bin/crane.js",
|
|
6
6
|
"main": "./dist/app.mjs",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"terser": "^5.35.0",
|
|
83
83
|
"tinycolor2": "^1.6.0",
|
|
84
84
|
"typescript": "5.4.5",
|
|
85
|
-
"vite": "^
|
|
85
|
+
"vite": "^6.3.5",
|
|
86
86
|
"vite-plugin-checker": "^0.6.1",
|
|
87
87
|
"vite-plugin-compression": "^0.5.1",
|
|
88
88
|
"vite-plugin-externals": "^0.6.2",
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Section Preview</title>
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
|
|
8
|
+
<!-- Vue 3 -->
|
|
9
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3.2.33/dist/vue.global.prod.js"></script>
|
|
10
|
+
|
|
11
|
+
<!-- Bootstrap and Fonts -->
|
|
12
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
13
|
+
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
|
|
14
|
+
|
|
15
|
+
<style>
|
|
16
|
+
.top-bar {
|
|
17
|
+
position: fixed;
|
|
18
|
+
top: 0;
|
|
19
|
+
left: 0;
|
|
20
|
+
right: 0;
|
|
21
|
+
background-color: #fff;
|
|
22
|
+
border-bottom: 1px solid #dee2e6;
|
|
23
|
+
padding: 12px 20px;
|
|
24
|
+
z-index: 1000;
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 12px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.label-text {
|
|
31
|
+
font-size: 30px;
|
|
32
|
+
margin: 0;
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
35
|
+
</head>
|
|
36
|
+
<body>
|
|
37
|
+
|
|
38
|
+
<!-- Top Bar -->
|
|
39
|
+
<div class="top-bar">
|
|
40
|
+
<span class="label-text">Section Preview |</span>
|
|
41
|
+
<select id="showcaseDropdown" class="form-select w-auto"></select>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<!-- Main Content -->
|
|
45
|
+
<div id="app"></div>
|
|
46
|
+
<div id="blanket"></div>
|
|
47
|
+
|
|
48
|
+
<!-- SSR Mocking -->
|
|
49
|
+
<script type="module">
|
|
50
|
+
window.EcVue = {
|
|
51
|
+
...window.Vue,
|
|
52
|
+
ssrUtils: {
|
|
53
|
+
ensureValidVNode: vnode => vnode,
|
|
54
|
+
},
|
|
55
|
+
ssrContextKey: Symbol('ssrContextKey'),
|
|
56
|
+
initDirectivesForSSR: () => {},
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<!-- Main Script -->
|
|
61
|
+
<script type="module">
|
|
62
|
+
import { renderShowcase, dropdownOptions, setDistFolderPath } from "../shared/preview.js";
|
|
63
|
+
|
|
64
|
+
setDistFolderPath("../../../dist");
|
|
65
|
+
|
|
66
|
+
const showcaseModules = import.meta.glob('../../dist/sections/*/js/showcases/*.mjs');
|
|
67
|
+
const select = document.getElementById('showcaseDropdown');
|
|
68
|
+
const showCaseOptions = dropdownOptions(showcaseModules);
|
|
69
|
+
|
|
70
|
+
for (const { value, label } of showCaseOptions) {
|
|
71
|
+
const option = document.createElement('option');
|
|
72
|
+
option.value = value;
|
|
73
|
+
option.textContent = label;
|
|
74
|
+
select.appendChild(option);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
select.addEventListener('change', async (e) => {
|
|
78
|
+
const [sectionName, showcaseId] = e.target.value.split(':');
|
|
79
|
+
renderShowcase(sectionName, showcaseId);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Render initial showcase
|
|
83
|
+
if (select.value) {
|
|
84
|
+
const [sectionName, showcaseId] = select.value.split(':');
|
|
85
|
+
renderShowcase(sectionName, showcaseId);
|
|
86
|
+
}
|
|
87
|
+
</script>
|
|
88
|
+
</body>
|
|
89
|
+
</html>
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { loadModule} from "./utils.ts";
|
|
4
|
+
|
|
5
|
+
let distFolderPath: string | null = null;
|
|
6
|
+
|
|
7
|
+
export function setDistFolderPath(path: string): void {
|
|
8
|
+
distFolderPath = path;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface HSLColor {
|
|
12
|
+
h: number;
|
|
13
|
+
s: number;
|
|
14
|
+
l: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface RGBAColor {
|
|
18
|
+
r: number;
|
|
19
|
+
g: number;
|
|
20
|
+
b: number;
|
|
21
|
+
a: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface ColorObject {
|
|
25
|
+
hex: string;
|
|
26
|
+
hsl: HSLColor;
|
|
27
|
+
rgba: RGBAColor;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function hexToColorObject(hex: string): ColorObject {
|
|
31
|
+
const match = /^#?([0-9a-fA-F]{6})$/.exec(hex);
|
|
32
|
+
if (!match) throw new Error("Invalid hex color format");
|
|
33
|
+
const cleanHex = match[1].toLowerCase();
|
|
34
|
+
const r = parseInt(cleanHex.substring(0, 2), 16);
|
|
35
|
+
const g = parseInt(cleanHex.substring(2, 4), 16);
|
|
36
|
+
const b = parseInt(cleanHex.substring(4, 6), 16);
|
|
37
|
+
const a = 255;
|
|
38
|
+
const rNorm = r / 255, gNorm = g / 255, bNorm = b / 255;
|
|
39
|
+
const max = Math.max(rNorm, gNorm, bNorm), min = Math.min(rNorm, gNorm, bNorm);
|
|
40
|
+
const delta = max - min;
|
|
41
|
+
let h = 0, s = 0, l = (max + min) / 2;
|
|
42
|
+
if (delta !== 0) {
|
|
43
|
+
s = delta / (1 - Math.abs(2 * l - 1));
|
|
44
|
+
switch (max) {
|
|
45
|
+
case rNorm: h = ((gNorm - bNorm) / delta) % 6; break;
|
|
46
|
+
case gNorm: h = (bNorm - rNorm) / delta + 2; break;
|
|
47
|
+
case bNorm: h = (rNorm - gNorm) / delta + 4; break;
|
|
48
|
+
}
|
|
49
|
+
h *= 60;
|
|
50
|
+
if (h < 0) h += 360;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
hex: `#${cleanHex}${a.toString(16).padStart(2, '0')}`,
|
|
54
|
+
hsl: { h: Math.round(h), s: +(s * 100).toFixed(1), l: +(l * 100).toFixed(1) },
|
|
55
|
+
rgba: { r, g, b, a: 1 },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function updateHexColors(obj: any): any {
|
|
60
|
+
// Matches either 3-digit (#RGB) or 6-digit (#RRGGBB) hex
|
|
61
|
+
const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
|
|
62
|
+
|
|
63
|
+
function recurse(value: any): any {
|
|
64
|
+
if (Array.isArray(value)) return value.map(recurse);
|
|
65
|
+
if (value && typeof value === 'object') {
|
|
66
|
+
for (const key in value) {
|
|
67
|
+
const v = value[key];
|
|
68
|
+
if (key === 'color' && typeof v === 'string' && hexRegex.test(v)) {
|
|
69
|
+
// If it’s a 3-digit hex, expand it to 6 digits
|
|
70
|
+
const expanded = v.replace(
|
|
71
|
+
/^#?([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/,
|
|
72
|
+
(_m, r, g, b) => `#${r}${r}${g}${g}${b}${b}`
|
|
73
|
+
);
|
|
74
|
+
value[key] = hexToColorObject(expanded);
|
|
75
|
+
} else {
|
|
76
|
+
value[key] = recurse(v);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
return recurse(obj);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const replaceGlobalFont = (obj: any, font: string): void => {
|
|
86
|
+
Object.entries(obj).forEach(([k, v]) => {
|
|
87
|
+
if (v && typeof v === 'object') {
|
|
88
|
+
replaceGlobalFont(v, font);
|
|
89
|
+
} else if (k === 'font' && v === 'global.fontFamily.body') {
|
|
90
|
+
obj[k] = font;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
function overrideSettingsFromShowcase(content: any, showcases: any): any {
|
|
96
|
+
return Object.fromEntries(Object.entries(content).map(([k, v]) => [k, showcases[k] ?? v]));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function mergeDesign(
|
|
100
|
+
design: Record<string, any>,
|
|
101
|
+
showcase: Record<string, any>
|
|
102
|
+
): Record<string, any> {
|
|
103
|
+
const result: Record<string, any> = { ...design };
|
|
104
|
+
|
|
105
|
+
Object.keys(design).forEach((key) => {
|
|
106
|
+
if (key in showcase) {
|
|
107
|
+
const base = design[key];
|
|
108
|
+
const override = showcase[key];
|
|
109
|
+
|
|
110
|
+
if (
|
|
111
|
+
base !== null && override !== null &&
|
|
112
|
+
typeof base === 'object' && typeof override === 'object' &&
|
|
113
|
+
!Array.isArray(base) && !Array.isArray(override)
|
|
114
|
+
) {
|
|
115
|
+
// shallow merge nested objects
|
|
116
|
+
result[key] = { ...base, ...override };
|
|
117
|
+
} else {
|
|
118
|
+
// replace with showcase value (covers primitives & arrays)
|
|
119
|
+
result[key] = override;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function designTransformer(design: Record<string, any>, showCaseDesign: Record<string, any> ): Record<string, any> {
|
|
128
|
+
const parsedDesign: Record<string, any> = {};
|
|
129
|
+
const parsedShowcaseDesign: Record<string, any> = {};
|
|
130
|
+
Object.entries(design).forEach(([key, comp]) => {
|
|
131
|
+
parsedDesign[key] = comp?.defaults;
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
Object.entries(showCaseDesign).forEach(([key, comp]) => {
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
136
|
+
const { type, ...withoutType } = comp;
|
|
137
|
+
parsedShowcaseDesign[key] = type == 'TEXT' ? { ... withoutType, visible: true} : withoutType
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
let overridenDesign = mergeDesign(parsedDesign, parsedShowcaseDesign)
|
|
141
|
+
overridenDesign = updateHexColors(overridenDesign);
|
|
142
|
+
replaceGlobalFont(overridenDesign, 'Roboto');
|
|
143
|
+
return overridenDesign;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function processImage(component: any, sectionName: string, key: string): Record<string, any> {
|
|
147
|
+
const assetLocation = `${distFolderPath}/sections/${sectionName}/assets/`;
|
|
148
|
+
const set = component.defaults?.set || component.imageData?.set;
|
|
149
|
+
const newSet = {
|
|
150
|
+
'cropped-webp-100x200': { url: assetLocation + set.MOBILE_WEBP_LOW_RES.url },
|
|
151
|
+
'cropped-webp-1000x2000': { url: assetLocation + set.MOBILE_WEBP_HI_RES.url },
|
|
152
|
+
'webp-200x200': { url: assetLocation + set.WEBP_LOW_RES.url },
|
|
153
|
+
'webp-2000x2000': { url: assetLocation + set.WEBP_HI_2X_RES.url },
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
[key]: {
|
|
157
|
+
set: newSet,
|
|
158
|
+
...(component.imageData?.borderInfo && { borderInfo: component.imageData.borderInfo }),
|
|
159
|
+
...(component.imageData && { bucket: {} })
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function processComponent(key: string, component: any, translations: any, sectionName?: string): any {
|
|
165
|
+
if (!component?.type) return '';
|
|
166
|
+
switch (component.type) {
|
|
167
|
+
case 'INPUTBOX':
|
|
168
|
+
case 'TEXTAREA': {
|
|
169
|
+
const text = component?.defaults?.text ?? component?.text ?? component?.placeholder;
|
|
170
|
+
return { [key]: translations[text] };
|
|
171
|
+
}
|
|
172
|
+
case 'DIVIDER':
|
|
173
|
+
return { [key]: translations[component.label] };
|
|
174
|
+
case 'DECK': {
|
|
175
|
+
const defaultSettings = component.cards?.defaultCardContent?.settings;
|
|
176
|
+
if (defaultSettings) {
|
|
177
|
+
const result: Record<string, any> = {};
|
|
178
|
+
Object.entries(defaultSettings).forEach(([k, c]) => {
|
|
179
|
+
Object.assign(result, processComponent(k, c, translations));
|
|
180
|
+
});
|
|
181
|
+
return { [key]: result };
|
|
182
|
+
} else {
|
|
183
|
+
const cards = component.cards.map((card: any) => {
|
|
184
|
+
const cardContent: Record<string, any> = {};
|
|
185
|
+
Object.entries(card.settings).forEach(([k, c]) => {
|
|
186
|
+
Object.assign(cardContent, processComponent(k, c, translations, sectionName));
|
|
187
|
+
});
|
|
188
|
+
return { settings: cardContent };
|
|
189
|
+
});
|
|
190
|
+
return { [key]: { cards } };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
case 'BUTTON': {
|
|
194
|
+
const button = component.defaults || component;
|
|
195
|
+
return {
|
|
196
|
+
[key]: {
|
|
197
|
+
title: translations[button.title],
|
|
198
|
+
type: button.buttonType,
|
|
199
|
+
link: button.link,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
case 'TOGGLE':
|
|
204
|
+
return { [key]: component.defaults };
|
|
205
|
+
case 'SELECTBOX':
|
|
206
|
+
return { [key]: component.defaults.value };
|
|
207
|
+
case 'IMAGE':
|
|
208
|
+
return processImage(component, sectionName!, key);
|
|
209
|
+
default:
|
|
210
|
+
console.warn(`Unknown type: ${component.type}`);
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function getContentToRender(
|
|
216
|
+
content: any,
|
|
217
|
+
showcase: any,
|
|
218
|
+
contentTranslations: any,
|
|
219
|
+
showcaseTranslations: any,
|
|
220
|
+
sectionName: string
|
|
221
|
+
): any {
|
|
222
|
+
const parsedContent = Object.entries(content).reduce((acc, [k, c]) => {
|
|
223
|
+
return { ...acc, ...processComponent(k, c, contentTranslations, sectionName) };
|
|
224
|
+
}, {});
|
|
225
|
+
|
|
226
|
+
const parsedShowcase = Object.entries(showcase).reduce((acc, [k, c]) => {
|
|
227
|
+
return { ...acc, ...processComponent(k, c, showcaseTranslations, sectionName) };
|
|
228
|
+
}, {});
|
|
229
|
+
|
|
230
|
+
return overrideSettingsFromShowcase(parsedContent, parsedShowcase);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function dropdownOptions(showcaseModules: Record<string, any>): Array<{ value: string; label: string }> {
|
|
234
|
+
return Object.keys(showcaseModules).map(path => {
|
|
235
|
+
const match = path.match(/\/sections\/([^/]+)\/js\/showcases\/(\d+)\.mjs$/);
|
|
236
|
+
if (!match) return null;
|
|
237
|
+
return {
|
|
238
|
+
value: `${match[1]}:${match[2]}`,
|
|
239
|
+
label: `${match[1]}: showcase ${match[2]}`,
|
|
240
|
+
};
|
|
241
|
+
}).filter(Boolean) as Array<{ value: string; label: string }>;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function loadSectionCss(sectionName: string): void {
|
|
245
|
+
const link = document.createElement('link');
|
|
246
|
+
link.rel = 'stylesheet';
|
|
247
|
+
link.href = `${distFolderPath}/sections/${sectionName}/js/main/client/assets/client.css`;
|
|
248
|
+
document.head.appendChild(link);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export async function renderShowcase(sectionName: string, showcaseId: string): Promise<void> {
|
|
252
|
+
const client = await loadModule(`${distFolderPath}/sections/${sectionName}/js/main/client/client.js`);
|
|
253
|
+
const content = await loadModule(`${distFolderPath}/sections/${sectionName}/js/settings/content.mjs`);
|
|
254
|
+
const contentTranslations = await loadModule(`${distFolderPath}/sections/${sectionName}/js/settings/translations.mjs`);
|
|
255
|
+
const showcaseTranslations = await loadModule(`${distFolderPath}/sections/${sectionName}/js/showcases/translations.mjs`);
|
|
256
|
+
const showcase = await loadModule(`${distFolderPath}/sections/${sectionName}/js/showcases/${showcaseId}.mjs`);
|
|
257
|
+
const design = await loadModule(`${distFolderPath}/sections/${sectionName}/js/settings/design.mjs`);
|
|
258
|
+
|
|
259
|
+
const { mount } = client.default.init();
|
|
260
|
+
|
|
261
|
+
const ovveridenDesign = designTransformer(design.default, showcase.default.design || {});
|
|
262
|
+
|
|
263
|
+
loadSectionCss(sectionName);
|
|
264
|
+
|
|
265
|
+
const backgroundDesign = {
|
|
266
|
+
background: {
|
|
267
|
+
background: {
|
|
268
|
+
type: 'solid',
|
|
269
|
+
solid: {
|
|
270
|
+
color: {
|
|
271
|
+
raw: '#F9F9F9',
|
|
272
|
+
hex: '#F9F9F9',
|
|
273
|
+
rgba: { r: 19, g: 19, b: 19, a: 1.0 },
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
color: 'global.color.background',
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
const overriddenContent = getContentToRender(
|
|
282
|
+
content.default,
|
|
283
|
+
showcase.default.content || {},
|
|
284
|
+
contentTranslations.default.en,
|
|
285
|
+
showcaseTranslations.default.en,
|
|
286
|
+
sectionName
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
mount('#app', {
|
|
290
|
+
context: {
|
|
291
|
+
globalDesign: { color: 'global.color.background' },
|
|
292
|
+
},
|
|
293
|
+
data: {
|
|
294
|
+
content: overriddenContent,
|
|
295
|
+
design: { ...ovveridenDesign, ...backgroundDesign },
|
|
296
|
+
defaults: {},
|
|
297
|
+
background: {},
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
root: '.',
|
|
5
|
+
server: {
|
|
6
|
+
fs: { strict: false },
|
|
7
|
+
},
|
|
8
|
+
plugins: [
|
|
9
|
+
{
|
|
10
|
+
name: 'print-preview-url',
|
|
11
|
+
configureServer(server) {
|
|
12
|
+
server.httpServer?.once('listening', () => {
|
|
13
|
+
const baseUrl = `http://localhost:${server.config.server.port || 5173}`;
|
|
14
|
+
console.log("Preview URL: ", baseUrl + '/preview/sections/preview.html\n');
|
|
15
|
+
console.log('🛑 Press Ctrl+C to stop the local server 🛑\n');
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'no-vite-cache',
|
|
21
|
+
configureServer(server) {
|
|
22
|
+
// invalidate caches so that after build when user refreshes the page, the latest .mjs files are fetched
|
|
23
|
+
server.middlewares.use((req, res, next) => {
|
|
24
|
+
if (req.url?.includes('/sections/')) {
|
|
25
|
+
server.moduleGraph.invalidateAll();
|
|
26
|
+
}
|
|
27
|
+
next();
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
});
|