@lightspeed/crane 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,179 @@
1
+ # Changelog
2
+
3
+ ## 1.2.1 - 2025-04-17
4
+
5
+ ### Added
6
+
7
+ - Add support for 'Divider' configuration type for custom sections.
8
+
9
+ ### Changed
10
+
11
+ - Update versions of 'unbuild' and 'axios' dependencies.
12
+ - Clean up unused package dependencies for the reference custom section.
13
+
14
+ ### Fixed
15
+
16
+ - Fix preview image name of the example header.
17
+ - Fix reference custom section to respect the global design configurations.
18
+ - Display CLI help instructions consistently.
19
+
20
+ ## 1.2.0 - 2025-03-07
21
+
22
+ ### Added
23
+
24
+ - **Breaking:** Add a maximum server file size restriction during 'build' execution.
25
+ - Move 'header & footer' functionality from experimental to the core feature list.
26
+ - Add usage example of all the missing available configuration types to the reference section.
27
+ - Add compressed source code bundle to 'deployment' process.
28
+
29
+ ### Changed
30
+
31
+ - Update error message display upon asset deployment to be more descriptive.
32
+
33
+ ### Fixed
34
+
35
+ - Fix 'shared' folder generation while creating sections, headers and footers.
36
+ - Fix section showcase validation during the 'build' execution in case of empty content and design configurations.
37
+ - Fix validation rules around newly generated section, header and footer.
38
+ - Fix the external content usage of the 'Language Selector' component in headers and footers.
39
+
40
+ ## 1.1.3 - 2025-02-03
41
+
42
+ ### Added
43
+
44
+ - **Header & Footer (experimental):** add support for 'Made With' component in footers.
45
+ - **Header & Footer (experimental):** add validation to custom header and footer setting files during 'build' execution.
46
+ - **Header & Footer (experimental):** add individual header and footer resource initialisation to the CLI options.
47
+ - **Header & Footer (experimental):** add support for external content for headers and footers.
48
+ - **Header & Footer (experimental):** implement mandatory content settings for custom headers and footers.
49
+ - Add validation to custom section setting files during 'build' execution.
50
+ - Add two new reference custom templates.
51
+
52
+ ### Changed
53
+
54
+ - Update progress bar for deployment to monitor upload speed.
55
+ - Make externalization default during 'build' process.
56
+ - Enhance client-side performance by enabling code splitting.
57
+ - Improve 'BUTTON' configuration type's interface.
58
+
59
+ ### Fixed
60
+
61
+ - **Header & Footer (experimental):** fix showcase URL for headers and footers.
62
+ - Fix the need to manually install 'vite:terser' as a dependency for the 'build' process.
63
+ - Fix template name prompt for names containing numbers.
64
+ - Fix 'BUTTON' configuration type validation during 'build'.
65
+
66
+ ## 1.1.2 - 2025-01-09
67
+
68
+ ### Added
69
+
70
+ - **Header & Footer (experimental):** add support for 'Language Selector' component in headers and footers.
71
+ - **Header & Footer (experimental):** add support for 'Logo' component in headers.
72
+ - **Header & Footer (experimental):** add support for 'Navigation' component in headers.
73
+ - **Header & Footer (experimental):** add support for 'Account' component in headers.
74
+ - **Header & Footer (experimental):** add support for 'Legal Pages' component in footers.
75
+
76
+ ### Fixed
77
+
78
+ - Fix showcase overrides for images in case of the 'DECK' configuration element.
79
+
80
+ ## 1.1.1 - 2024-12-10
81
+
82
+ ### Added
83
+
84
+ - **Header & Footer (experimental):** add support for 'Report Abuse' component in footers.
85
+ - **Header & Footer (experimental):** add support for 'Cart' component in headers.
86
+ - **Header & Footer (experimental):** add support for 'Search' component in headers.
87
+ - **Header & Footer (experimental):** include header and footer generation in template initialisation.
88
+ - Add compression and minification to 'build' process.
89
+ - Add new 'DECK' configuration element to custom sections.
90
+
91
+ ### Fixed
92
+
93
+ - Fix 'BUTTON' configuration element with 'GO_TO_PAGE' type.
94
+
95
+ ## 1.1.0 - 2024-11-07
96
+
97
+ ### Added
98
+
99
+ - **Header & Footer (experimental):** add skeleton folder structure for custom reference header and footer.
100
+ - Perform a clean operation of the 'dist' folder during the 'build' command.
101
+ - Add support for deployment of high number of sections at one time.
102
+ - Add a progress bar for the deployment process.
103
+ - Add retry mechanism for recoverable errors during the section deployment.
104
+ - Update template descriptor to include optional showcase ID.
105
+ - Add optional custom template url to use for template previews.
106
+ - Add optional showcase overrides to template descriptor.
107
+
108
+ ### Changed
109
+
110
+ - Update section validation to make layout descriptor file optional.
111
+ - Change error message display upon failed deployment.
112
+
113
+ ### Fixed
114
+
115
+ - Update failed command executions to return the proper exit code.
116
+
117
+ ## 1.0.3 - 2024-09-24
118
+
119
+ ### Added
120
+
121
+ - Add Layout support.
122
+
123
+ ### Fixed
124
+
125
+ - Apply line breaks and multiple spaces to 'TEXTAREA' types.
126
+
127
+ ## 1.0.2 - 2024-09-12
128
+
129
+ ### Added
130
+
131
+ - Add the possibility to specify a cover image for the created templates.
132
+ - Add 'test_site_id' to the template descriptor.
133
+ - Impose file size restriction during build execution.
134
+
135
+ ### Changed
136
+
137
+ - Update 'build' and 'deploy' flows to include the template assets.
138
+
139
+ ### Fixed
140
+
141
+ - Fix logic regarding determining correct 'BUTTON' type.
142
+ - Fix deployment on Windows machines.
143
+
144
+ ## 1.0.1 - 2024-08-08
145
+
146
+ ### Added
147
+
148
+ - Add font support for design configurations.
149
+ - Clean 'dist' folder before every 'build' command execution.
150
+ - Add licensing.
151
+
152
+ ### Fixed
153
+
154
+ - Fix handling of thumbnails for reference custom section.
155
+ - Fix version increment in case of failed deployment.
156
+ - Fix application creation with same name to avoid overriding an existing version.
157
+
158
+ ## 1.0.0 - 2024-07-29
159
+
160
+ ### Added
161
+
162
+ - Add reference section for third party developers.
163
+
164
+ ## 0.1.1 - 2024-07-22
165
+
166
+ ### Added
167
+
168
+ - Include a README.md file.
169
+
170
+ ## 0.1.0 - 2024-07-22
171
+
172
+ ### Changed
173
+
174
+ - Include template descriptor in 'deploy' command.
175
+ - Standardize CLI commands.
176
+
177
+ ## 0.0.1-beta.24 - 2024-05-13
178
+
179
+ _Last beta release._
package/bin/crane.js CHANGED
@@ -1,2 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import('../dist/cli.mjs');
2
+ import { run } from '../dist/cli.mjs';
3
+
4
+ run();
package/dist/app.d.mts CHANGED
@@ -20,14 +20,51 @@ interface AppBaseState<C, D> {
20
20
  readonly data: AppBaseData<C, D>;
21
21
  }
22
22
 
23
+ interface GlobalColors {
24
+ title?: Color;
25
+ body?: Color;
26
+ button?: Color;
27
+ link?: Color;
28
+ background?: Color;
29
+ }
30
+ interface GlobalFonts {
31
+ title: string;
32
+ body: string;
33
+ }
34
+ interface GlobalTextSize {
35
+ title: number;
36
+ subtitle: number;
37
+ body: number;
38
+ }
39
+ interface GlobalButtonSize {
40
+ small: number;
41
+ medium: number;
42
+ large: number;
43
+ }
44
+ type AppearanceEffectType = 'none' | 'fade-in' | 'fade-in-up';
45
+ interface GlobalLayout {
46
+ maxWidth: number;
47
+ tileMargin: number;
48
+ appearanceEffect: AppearanceEffectType;
49
+ }
50
+ interface GlobalDesign {
51
+ color?: GlobalColors;
52
+ fontFamily?: GlobalFonts;
53
+ textSize?: GlobalTextSize;
54
+ buttonSize?: GlobalButtonSize;
55
+ layout?: GlobalLayout;
56
+ customCss?: string;
57
+ }
58
+
23
59
  interface VueBaseProps<CONTENT, DESIGN> {
24
- init: (app: App<Element>, contextValue: AppBaseContext, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData) => void;
25
- update: (app: App<Element>, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData) => void;
60
+ init: (app: App<Element>, contextValue: AppBaseContext, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData, globalDesignValue: GlobalDesign) => void;
61
+ update: (app: App<Element>, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData, globalDesignValue: GlobalDesign) => void;
26
62
  readonly context: Ref<AppBaseContext>;
27
63
  readonly content: Ref<CONTENT>;
28
64
  readonly design: Ref<DESIGN>;
29
65
  readonly defaults: Ref<Record<string, unknown>>;
30
66
  readonly site: Ref<SiteContent>;
67
+ readonly globalDesign: Ref<GlobalDesign>;
31
68
  }
32
69
  declare function useVueBaseProps<CONTENT, DESIGN>(): VueBaseProps<CONTENT, DESIGN>;
33
70
 
@@ -168,6 +205,15 @@ declare function useDeckElementContent<CONTENT>(elementName: keyof CONTENT): {
168
205
  declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes, contentElementName: string): {
169
206
  hasContent: boolean;
170
207
  value: string | undefined;
208
+ } | {
209
+ hasContent: boolean;
210
+ lowResolutionMobileImage: string;
211
+ highResolutionMobileImage: string;
212
+ lowResolutionDesktopImage: string;
213
+ highResolutionDesktopImage: string;
214
+ } | {
215
+ hasContent: boolean;
216
+ value: boolean | undefined;
171
217
  } | {
172
218
  title: string | undefined;
173
219
  type: ActionLinkType | undefined;
@@ -180,15 +226,6 @@ declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes,
180
226
  hasTitle: boolean;
181
227
  hasLink: boolean;
182
228
  performAction: (() => void) | undefined;
183
- } | {
184
- hasContent: boolean;
185
- lowResolutionMobileImage: string;
186
- highResolutionMobileImage: string;
187
- lowResolutionDesktopImage: string;
188
- highResolutionDesktopImage: string;
189
- } | {
190
- hasContent: boolean;
191
- value: boolean | undefined;
192
229
  } | undefined;
193
230
 
194
231
  declare function useLogoElementContent<CONTENT>(): {
@@ -346,4 +383,5 @@ interface InstantsiteJSAPI {
346
383
 
347
384
  declare function useInstantsiteJsApi(): InstantsiteJSAPI | undefined;
348
385
 
349
- export { type ButtonContent, type Card, type Deck, EditorTypes, type ImageContent, type InputBoxContent, type SelectBoxContent, type TextAreaContent, type ToggleContent, createVueClientApp, createVueServerApp, useBackgroundElementDesign, useButtonElementContent, useButtonElementDesign, useDeckElementContent, useImageElementContent, useImageElementDesign, useInputboxElementContent, useInstantsiteJsApi, useLayoutElementDesign, useLogoElementContent, useLogoElementDesign, useMenuElementContent, useNavigationMenuElementContent, useSelectboxElementContent, useSelectboxElementDesign, useTextElementDesign, useTextareaElementContent, useTextareaElementDesign, useToggleElementContent, useToggleElementDesign, useVueBaseProps };
386
+ export { EditorTypes, createVueClientApp, createVueServerApp, useBackgroundElementDesign, useButtonElementContent, useButtonElementDesign, useDeckElementContent, useImageElementContent, useImageElementDesign, useInputboxElementContent, useInstantsiteJsApi, useLayoutElementDesign, useLogoElementContent, useLogoElementDesign, useMenuElementContent, useNavigationMenuElementContent, useSelectboxElementContent, useSelectboxElementDesign, useTextElementDesign, useTextareaElementContent, useTextareaElementDesign, useToggleElementContent, useToggleElementDesign, useVueBaseProps };
387
+ export type { ButtonContent, Card, Deck, ImageContent, InputBoxContent, SelectBoxContent, TextAreaContent, ToggleContent };
package/dist/app.d.ts CHANGED
@@ -20,14 +20,51 @@ interface AppBaseState<C, D> {
20
20
  readonly data: AppBaseData<C, D>;
21
21
  }
22
22
 
23
+ interface GlobalColors {
24
+ title?: Color;
25
+ body?: Color;
26
+ button?: Color;
27
+ link?: Color;
28
+ background?: Color;
29
+ }
30
+ interface GlobalFonts {
31
+ title: string;
32
+ body: string;
33
+ }
34
+ interface GlobalTextSize {
35
+ title: number;
36
+ subtitle: number;
37
+ body: number;
38
+ }
39
+ interface GlobalButtonSize {
40
+ small: number;
41
+ medium: number;
42
+ large: number;
43
+ }
44
+ type AppearanceEffectType = 'none' | 'fade-in' | 'fade-in-up';
45
+ interface GlobalLayout {
46
+ maxWidth: number;
47
+ tileMargin: number;
48
+ appearanceEffect: AppearanceEffectType;
49
+ }
50
+ interface GlobalDesign {
51
+ color?: GlobalColors;
52
+ fontFamily?: GlobalFonts;
53
+ textSize?: GlobalTextSize;
54
+ buttonSize?: GlobalButtonSize;
55
+ layout?: GlobalLayout;
56
+ customCss?: string;
57
+ }
58
+
23
59
  interface VueBaseProps<CONTENT, DESIGN> {
24
- init: (app: App<Element>, contextValue: AppBaseContext, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData) => void;
25
- update: (app: App<Element>, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData) => void;
60
+ init: (app: App<Element>, contextValue: AppBaseContext, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData, globalDesignValue: GlobalDesign) => void;
61
+ update: (app: App<Element>, contentValue: CONTENT, designValue: DESIGN, defaultsValue: Record<string, unknown>, externalContent: ExternalContentData, globalDesignValue: GlobalDesign) => void;
26
62
  readonly context: Ref<AppBaseContext>;
27
63
  readonly content: Ref<CONTENT>;
28
64
  readonly design: Ref<DESIGN>;
29
65
  readonly defaults: Ref<Record<string, unknown>>;
30
66
  readonly site: Ref<SiteContent>;
67
+ readonly globalDesign: Ref<GlobalDesign>;
31
68
  }
32
69
  declare function useVueBaseProps<CONTENT, DESIGN>(): VueBaseProps<CONTENT, DESIGN>;
33
70
 
@@ -168,6 +205,15 @@ declare function useDeckElementContent<CONTENT>(elementName: keyof CONTENT): {
168
205
  declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes, contentElementName: string): {
169
206
  hasContent: boolean;
170
207
  value: string | undefined;
208
+ } | {
209
+ hasContent: boolean;
210
+ lowResolutionMobileImage: string;
211
+ highResolutionMobileImage: string;
212
+ lowResolutionDesktopImage: string;
213
+ highResolutionDesktopImage: string;
214
+ } | {
215
+ hasContent: boolean;
216
+ value: boolean | undefined;
171
217
  } | {
172
218
  title: string | undefined;
173
219
  type: ActionLinkType | undefined;
@@ -180,15 +226,6 @@ declare function getReactiveRef(card: Card | undefined, editorType: EditorTypes,
180
226
  hasTitle: boolean;
181
227
  hasLink: boolean;
182
228
  performAction: (() => void) | undefined;
183
- } | {
184
- hasContent: boolean;
185
- lowResolutionMobileImage: string;
186
- highResolutionMobileImage: string;
187
- lowResolutionDesktopImage: string;
188
- highResolutionDesktopImage: string;
189
- } | {
190
- hasContent: boolean;
191
- value: boolean | undefined;
192
229
  } | undefined;
193
230
 
194
231
  declare function useLogoElementContent<CONTENT>(): {
@@ -346,4 +383,5 @@ interface InstantsiteJSAPI {
346
383
 
347
384
  declare function useInstantsiteJsApi(): InstantsiteJSAPI | undefined;
348
385
 
349
- export { type ButtonContent, type Card, type Deck, EditorTypes, type ImageContent, type InputBoxContent, type SelectBoxContent, type TextAreaContent, type ToggleContent, createVueClientApp, createVueServerApp, useBackgroundElementDesign, useButtonElementContent, useButtonElementDesign, useDeckElementContent, useImageElementContent, useImageElementDesign, useInputboxElementContent, useInstantsiteJsApi, useLayoutElementDesign, useLogoElementContent, useLogoElementDesign, useMenuElementContent, useNavigationMenuElementContent, useSelectboxElementContent, useSelectboxElementDesign, useTextElementDesign, useTextareaElementContent, useTextareaElementDesign, useToggleElementContent, useToggleElementDesign, useVueBaseProps };
386
+ export { EditorTypes, createVueClientApp, createVueServerApp, useBackgroundElementDesign, useButtonElementContent, useButtonElementDesign, useDeckElementContent, useImageElementContent, useImageElementDesign, useInputboxElementContent, useInstantsiteJsApi, useLayoutElementDesign, useLogoElementContent, useLogoElementDesign, useMenuElementContent, useNavigationMenuElementContent, useSelectboxElementContent, useSelectboxElementDesign, useTextElementDesign, useTextareaElementContent, useTextareaElementDesign, useToggleElementContent, useToggleElementDesign, useVueBaseProps };
387
+ export type { ButtonContent, Card, Deck, ImageContent, InputBoxContent, SelectBoxContent, TextAreaContent, ToggleContent };
package/dist/app.mjs CHANGED
@@ -1 +1 @@
1
- import{getCurrentInstance as N,ref as E,computed as i,reactive as d,createSSRApp as B}from"vue";import{renderToString as M}from"vue/server-renderer";const y=new Map;function s(){const e=(r,l,a,v,g,u)=>{y.set(r._uid,{context:E(l),content:E(a),design:E(v),defaults:E(g),site:E(u?.site??{})})},n=(r,l,a,v,g)=>{const u=y.get(r._uid);u!==void 0&&(u.content.value=l,u.design.value=a,u.defaults.value=v,u.site.value=g.site??{})},t=N()?.appContext.app._uid??-1,o=y.get(t);return{init:e,update:n,context:o?.context,content:o?.content,design:o?.design,defaults:o?.defaults,site:o?.site}}function O(e,n){const t=s(),o=i(()=>n!==void 0?n:t.content.value);return K(o,e)}function K(e,n){const t=i(()=>{const l=e.value[n];if(l!==void 0){if(typeof l=="string")return l;throw new Error(`Element ${n} is not inputbox`)}}),o=i(()=>t.value!==void 0),r=i(()=>t.value);return d({hasContent:o,value:r})}function C(e,n){const t=s(),o=i(()=>n!==void 0?n:t.content.value);return P(o,e)}function P(e,n){const t=i(()=>{const l=e.value[n];if(l!==void 0){if(typeof l=="string")return l;throw new Error(`Element ${n} is not textarea`)}}),o=i(()=>t.value!==void 0),r=i(()=>t.value);return d({hasContent:o,value:r})}const b={HYPER_LINK:"HYPER_LINK",SCROLL_TO_TILE:"SCROLL_TO_TILE",MAIL_LINK:"MAIL_LINK",TEL_LINK:"TEL_LINK",GO_TO_STORE:"GO_TO_STORE",GO_TO_STORE_LINK:"GO_TO_STORE_LINK",GO_TO_PAGE:"GO_TO_PAGE"};function U(e){if("tileId"in e)return e.tileId;if("tileIdForScroll"in e)return e.tileIdForScroll}function X(e){if("pageId"in e)return e.pageId;if("pageIdForNavigate"in e)return e.pageIdForNavigate}function F(e){if("pageUrl"in e)return e.pageUrl;switch(X(e)){case"products":return"/products";case"cart":return"/cart";case"account":return"/account";case"search":return"/search";case"home":default:return"/"}}const x=(e,n)=>{if(!e||n)return;const{type:t,link:o,email:r,phone:l}=e,a=F(e);switch(t){case b.HYPER_LINK:if(o)return()=>window.open(o,"_blank");break;case b.GO_TO_STORE:case b.GO_TO_STORE_LINK:return()=>window.open("/products","_self");case b.MAIL_LINK:if(r)return()=>window.open(`mailto:${r}`,"_self");break;case b.TEL_LINK:if(l)return()=>window.open(`tel:${l}`,"_self");break;case b.SCROLL_TO_TILE:if(typeof document<"u")return()=>{const v=U(e);document.getElementById(`tile-${v}`)?.scrollIntoView()};break;case b.GO_TO_PAGE:if(a)return()=>window.open(a,"_self");break;default:console.error(`Unknown type of ActionLink: ${t}`)}};function V(e){return"title"in e&&"type"in e}function H(e,n,t){const o=i(()=>{const _=e.value[n];if(_!==void 0){if(V(_))return _;throw new Error(`Element ${n} is not action link`)}}),r=i(()=>o.value?.title),l=i(()=>o.value?.type),a=i(()=>o.value?.link),v=i(()=>o.value?.email),g=i(()=>o.value?.phone),u=i(()=>o.value?.tileId?`tile-${o.value?.tileId}`:null),c=i(()=>o.value?.type==="GO_TO_STORE_LINK"?"products":o.value?.pageId),f=i(()=>o.value?.pageUrl),m=i(()=>!!r.value),$=i(()=>!!a.value),D=x(o.value,t);return d({title:r,type:l,link:a,email:v,phone:g,tileDivId:u,pageId:c,pageUrl:f,hasTitle:m,hasLink:$,performAction:D})}function L(e,n){const t=s(),o=i(()=>!!t.site?.value?.isPreviewMode),r=i(()=>n!==void 0?n:t.content.value!==void 0?t.content.value:{});return H(r,e,o.value)}function W(e){return"bucket"in e&&"borderInfo"in e&&"set"in e}function w(e,n){const t=new RegExp(/^https?:\/\//);return e!=null&&t.test(e)?e:`${n}/${e}`}function k(e,n){const t=s(),o=i(()=>n!==void 0?n:t.content.value);return Y(o,e)}function Y(e,n){const t=i(()=>{const u=e.value[n];if(u!==void 0){if(W(u))return u;throw new Error(`Element ${n} is not image`)}}),o=i(()=>t.value===void 0?"":s().context.value.imageBuckets?.[t.value?.bucket]),r=i(()=>t.value!==void 0),l=i(()=>w(t.value?.set?.["cropped-webp-100x200"]?.url,o.value)),a=i(()=>w(t.value?.set?.["cropped-webp-1000x2000"]?.url,o.value)),v=i(()=>w(t.value?.set?.["webp-200x200"]?.url,o.value)),g=i(()=>w(t.value?.set?.["webp-2000x2000"]?.url,o.value));return d({hasContent:r,lowResolutionMobileImage:l,highResolutionMobileImage:a,lowResolutionDesktopImage:v,highResolutionDesktopImage:g})}function j(e){return"enabled"in e}function R(e,n){const t=s(),o=i(()=>n!==void 0?n:t.content.value);return J(o,e)}function J(e,n){const t=i(()=>{const l=e.value[n];if(l!==void 0){if(j(l))return l;throw new Error(`Element ${n} is not toggle`)}}),o=i(()=>t.value!==void 0),r=i(()=>t.value?.enabled);return d({hasContent:o,value:r})}function A(e,n){const t=s(),o=i(()=>n!==void 0?n:t.content.value);return q(o,e)}function q(e,n){const t=i(()=>{const l=e.value[n];if(l!==void 0){if(typeof l=="string")return l;throw new Error(`Element ${n} is not selectbox`)}}),o=i(()=>t.value!==void 0),r=i(()=>t.value);return d({hasContent:o,value:r})}function Q(e){return e!==null&&"items"in e}function G(e){const n=s(),t=i(()=>{const a=n.content.value[e];if(a!==void 0){if(Q(a))return a;throw new Error(`Element ${e} is not an menu`)}}),o=i(()=>!!n.site?.value?.isPreviewMode),r=i(()=>t.value!==void 0),l=i(()=>t.value?.items?t.value.items.map(a=>({...a,performAction:x(a,o.value)})):[]);return d({hasContent:r,items:l})}const Z="menu";function ee(){return G(Z)}var S=(e=>(e.INPUTBOX="INPUTBOX",e.TEXTAREA="TEXTAREA",e.BUTTON="BUTTON",e.IMAGE="IMAGE",e.TOGGLE="TOGGLE",e.SELECTBOX="SELECTBOX",e))(S||{});function te(e){if(typeof e!="object"||e===null)return!1;const n=e;return Array.isArray(n.cards)&&n.cards.every(t=>typeof t.settings=="object"&&t.settings!==null)}function ne(e){const n=s(),t=i(()=>{const l=n.content.value[e];if(l!==void 0){if(te(l))return l;throw new Error(`Element ${e} is not of DECK type`)}}),o=i(()=>t.value!==void 0&&t.value.cards.length>0),r=i(()=>t.value?.cards);return d({hasContent:o,cards:r,getReactiveRef:oe})}function oe(e,n,t){if(e==null)throw Error("Could not get a reactive ref for undefined Card");const o=e.settings[t];if(o===void 0)return o;switch(n){case"TEXTAREA":return C(t,e.settings);case"INPUTBOX":return O(t,e.settings);case"SELECTBOX":return A(t,e.settings);case"IMAGE":return k(t,e.settings);case"TOGGLE":return R(t,e.settings);case"BUTTON":return L(t,e.settings);default:return}}function ie(e){return"type"in e&&("text"in e||"image"in e)}function T(e,n){const t=new RegExp(/^https?:\/\//);return e!==void 0&&t.test(e)?e:`${n}/${e}`}function re(){const e=s(),n=i(()=>{const a=e.content.value.logo;if(a!==void 0){if(ie(a))return a;throw new Error("Element logo is not LOGO")}}),t=i(()=>n.value?.type),o=i(()=>n.value?.text),r=i(()=>n.value?.image===void 0?"":e.context.value.imageBuckets?.[n.value.image.bucket]),l=i(()=>({lowResolutionMobileImage:T(n.value?.image?.set?.["cropped-webp-100x200"]?.url,r.value),highResolutionMobileImage:T(n.value?.image?.set?.["cropped-webp-1000x2000"]?.url,r.value),lowResolutionDesktopImage:T(n.value?.image?.set?.["webp-200x200"]?.url,r.value),highResolutionDesktopImage:T(n.value?.image?.set?.["webp-2000x2000"]?.url,r.value)}));return d({type:t,text:o,image:l})}function I(e,n){if(n===void 0)return;if(!n.startsWith("global."))return n;const t=n.split(".").at(2);if(t!==void 0)return e.fontFamily[t]}function h(e,n){if(n===void 0)return;if(typeof n!="string"||!n.startsWith("global."))return n;const t=n.split(".").at(2);if(t!==void 0)return e.textSize[t]}function p(e,n){if(n===void 0)return;if(typeof n!="string"||!n.startsWith("global."))return n;const t=n.split(".").at(2);if(t!==void 0)return e.color[t]}function le(e){const n=s(),t=i(()=>{const u=n.design.value[e],c=n.defaults.value[e],f=n.context.value.globalDesign;return{font:u?.font?.replaceAll("_"," ")??I(f,c?.font),size:u?.size??h(f,c?.size),bold:u?.bold??c?.bold,italic:u?.italic??c?.italic,color:u?.color??p(f,c?.color),visible:u?.visible??c?.visible??!1}}),o=i(()=>t.value?.font),r=i(()=>t.value?.size),l=i(()=>t.value?.bold),a=i(()=>t.value?.italic),v=i(()=>t.value?.color),g=i(()=>t.value?.visible);return d({font:o,size:r,bold:l,italic:a,color:v,visible:g})}function ae(e){const n=s(),t=i(()=>{const c=n.design.value[e],f=n.defaults.value[e],m=n.context.value.globalDesign;return{font:c?.font?.replaceAll("_"," ")??I(m,f?.font),size:c?.size??h(m,f?.size),bold:c?.bold??f?.bold,italic:c?.italic??f?.italic,color:c?.color??p(m,f?.color),visible:c?.visible??f?.visible??!1,whiteSpace:"pre-wrap"}}),o=i(()=>t.value?.font),r=i(()=>t.value?.size),l=i(()=>t.value?.bold),a=i(()=>t.value?.italic),v=i(()=>t.value?.color),g=i(()=>t.value?.visible),u=i(()=>t.value?.whiteSpace);return d({font:o,size:r,bold:l,italic:a,color:v,visible:g,whiteSpace:u})}function ue(e){const n=s(),t=i(()=>{const u=n.design.value[e],c=n.defaults.value[e],f=n.context.value.globalDesign;return{appearance:u?.appearance??c?.appearance,font:u?.font??I(f,c?.font),size:u?.size??c?.size,style:u?.style??c?.style,color:u?.color??p(f,c?.color),visible:u?.visible??c?.visible??!1}}),o=i(()=>t.value?.appearance),r=i(()=>t.value?.font),l=i(()=>t.value?.size),a=i(()=>t.value?.style),v=i(()=>t.value?.color),g=i(()=>t.value?.visible);return d({appearance:o,font:r,size:l,style:a,color:v,visible:g})}function se(e){const n=s(),t=i(()=>{const l=n.design.value[e],a=n.defaults.value[e],v=n.context.value.globalDesign;return{overlay:{type:l?.overlay?.type??a?.overlay?.type,solid:{color:l?.overlay?.solid?.color??p(v,a?.overlay?.solid?.color)},gradient:{fromColor:l?.overlay?.gradient?.fromColor??p(v,a?.overlay?.gradient?.fromColor),toColor:l?.overlay?.gradient?.toColor??p(v,a?.overlay?.gradient?.toColor)}},visible:l?.visible??a?.visible??!1}}),o=i(()=>t.value?.overlay),r=i(()=>t.value?.visible);return d({overlay:o,visible:r})}function ce(e){const n=s(),t=i(()=>{const r=n.design.value[e],l=n.defaults.value[e];return{enabled:r?.enabled??l?.enabled}}),o=i(()=>t.value?.enabled);return d({enabled:o})}function ve(e){const n=s(),t=i(()=>{const r=n.design.value[e],l=n.defaults.value[e];return{value:r?.value??l?.value}}),o=i(()=>t.value?.value);return d({value:o})}function de(e){const n=s(),t=i(()=>{const r=n.design.value[e],l=n.defaults.value[e],a=n.context.value.globalDesign;return{background:{type:r?.background?.type??l?.background?.type,solid:{color:r?.background?.solid?.color??p(a,l?.background?.solid?.color)},gradient:{fromColor:r?.background?.gradient?.fromColor??p(a,l?.background?.gradient?.fromColor),toColor:r?.background?.gradient?.toColor??p(a,l?.background?.gradient?.toColor)}}}}),o=i(()=>t.value?.background);return d({background:o})}function fe(){const e=s(),n=i(()=>e.design.value.layout),t=i(()=>n.value);return d({layout:t})}function ge(e,n){return{visible:n?.visible??!1,width:n?.width??1,color:p(e,n?.color)}}function pe(){const e=s();return i(()=>{const n=e.design.value.logo,t=e.defaults.value.logo,o=e.context.value.globalDesign;return{font:n?.font?.replaceAll("_"," ")??I(o,t?.font),size:n?.size??h(o,t?.size),bold:n?.bold??t?.bold,italic:n?.italic??t?.italic,color:n?.color??p(o,t?.color),visible:n?.visible??t?.visible??!1,spacing:n?.spacing??t?.spacing??0,capitalization:n?.capitalization??t?.capitalization??"none",frame:n?.frame??ge(o,t?.frame)}})}function z(e){return{app:B(e)}}function be(e,n){return{init:()=>{const{app:t}=z(e);return n?.init?.(t),{render:async(o,r)=>(s().init(t,o,r.content,r.design,r.defaults,r.externalContent),n?.render?.(t,o,r),{html:await M(t,{context:o}),state:{context:o,data:r}})}}}}function me(e,n){return{init:()=>{const{app:t}=z(e);return n?.init?.(t),{mount:(o,r)=>{s().init(t,r.context,r.data.content,r.data.design,r.data.defaults,r.data.externalContent),n?.mount?.(t,o,r),t.mount(o)},update:o=>{s().update(t,o.data.content,o.data.design,o.data.defaults,o.data.externalContent),n?.update?.(t,o)},unmount:()=>{n?.unmount?.(t),t.unmount()}}}}}function Ee(){return globalThis.window.instantsite}export{S as EditorTypes,me as createVueClientApp,be as createVueServerApp,de as useBackgroundElementDesign,L as useButtonElementContent,ue as useButtonElementDesign,ne as useDeckElementContent,k as useImageElementContent,se as useImageElementDesign,O as useInputboxElementContent,Ee as useInstantsiteJsApi,fe as useLayoutElementDesign,re as useLogoElementContent,pe as useLogoElementDesign,G as useMenuElementContent,ee as useNavigationMenuElementContent,A as useSelectboxElementContent,ve as useSelectboxElementDesign,le as useTextElementDesign,C as useTextareaElementContent,ae as useTextareaElementDesign,R as useToggleElementContent,ce as useToggleElementDesign,s as useVueBaseProps};
1
+ import{getCurrentInstance as K,ref as m,computed as i,reactive as d,createSSRApp as P}from"vue";import{renderToString as U}from"vue/server-renderer";const y=new Map;function c(){const e=(l,r,a,v,g,s,u)=>{y.set(l._uid,{context:m(r),content:m(a),design:m(v),defaults:m(g),site:m(s?.site??{}),globalDesign:m(u)})},n=(l,r,a,v,g,s)=>{const u=y.get(l._uid);u!==void 0&&(u.content.value=r,u.design.value=a,u.defaults.value=v,u.site.value=g.site??{},u.globalDesign.value=s)},t=K()?.appContext.app._uid??-1,o=y.get(t);return{init:e,update:n,context:o?.context,content:o?.content,design:o?.design,defaults:o?.defaults,site:o?.site,globalDesign:o?.globalDesign}}function O(e,n){const t=c(),o=i(()=>n!==void 0?n:t.content.value);return X(o,e)}function X(e,n){const t=i(()=>{const r=e.value[n];if(r!==void 0){if(typeof r=="string")return r;throw new Error(`Element ${n} is not inputbox`)}}),o=i(()=>t.value!==void 0),l=i(()=>t.value);return d({hasContent:o,value:l})}function C(e,n){const t=c(),o=i(()=>n!==void 0?n:t.content.value);return F(o,e)}function F(e,n){const t=i(()=>{const r=e.value[n];if(r!==void 0){if(typeof r=="string")return r;throw new Error(`Element ${n} is not textarea`)}}),o=i(()=>t.value!==void 0),l=i(()=>t.value);return d({hasContent:o,value:l})}const b={HYPER_LINK:"HYPER_LINK",SCROLL_TO_TILE:"SCROLL_TO_TILE",MAIL_LINK:"MAIL_LINK",TEL_LINK:"TEL_LINK",GO_TO_STORE:"GO_TO_STORE",GO_TO_STORE_LINK:"GO_TO_STORE_LINK",GO_TO_PAGE:"GO_TO_PAGE"};function W(e){if("tileId"in e)return e.tileId;if("tileIdForScroll"in e)return e.tileIdForScroll}function V(e){if("pageId"in e)return e.pageId;if("pageIdForNavigate"in e)return e.pageIdForNavigate}function H(e){if("pageUrl"in e)return e.pageUrl;switch(V(e)){case"products":return"/products";case"cart":return"/cart";case"account":return"/account";case"search":return"/search";case"home":default:return"/"}}const L=(e,n)=>{if(!e||n)return;const{type:t,link:o,email:l,phone:r}=e,a=H(e);switch(t){case b.HYPER_LINK:if(o)return()=>window.open(o,"_blank");break;case b.GO_TO_STORE:case b.GO_TO_STORE_LINK:return()=>window.open("/products","_self");case b.MAIL_LINK:if(l)return()=>window.open(`mailto:${l}`,"_self");break;case b.TEL_LINK:if(r)return()=>window.open(`tel:${r}`,"_self");break;case b.SCROLL_TO_TILE:if(typeof document<"u")return()=>{const v=W(e);document.getElementById(`tile-${v}`)?.scrollIntoView()};break;case b.GO_TO_PAGE:if(a)return()=>window.open(a,"_self");break;default:console.error(`Unknown type of ActionLink: ${t}`)}};function Y(e){return"title"in e&&"type"in e}function j(e,n,t){const o=i(()=>{const I=e.value[n];if(I!==void 0){if(Y(I))return I;throw new Error(`Element ${n} is not action link`)}}),l=i(()=>o.value?.title),r=i(()=>o.value?.type),a=i(()=>o.value?.link),v=i(()=>o.value?.email),g=i(()=>o.value?.phone),s=i(()=>o.value?.tileId?`tile-${o.value?.tileId}`:null),u=i(()=>o.value?.type==="GO_TO_STORE_LINK"?"products":o.value?.pageId),f=i(()=>o.value?.pageUrl),E=i(()=>!!l.value),B=i(()=>!!a.value),M=L(o.value,t);return d({title:l,type:r,link:a,email:v,phone:g,tileDivId:s,pageId:u,pageUrl:f,hasTitle:E,hasLink:B,performAction:M})}function x(e,n){const t=c(),o=i(()=>!!t.site?.value?.isPreviewMode),l=i(()=>n!==void 0?n:t.content.value!==void 0?t.content.value:{});return j(l,e,o.value)}function J(e){return"bucket"in e&&"borderInfo"in e&&"set"in e}function w(e,n){const t=new RegExp(/^https?:\/\//);return e!=null&&t.test(e)?e:`${n}/${e}`}function k(e,n){const t=c(),o=i(()=>n!==void 0?n:t.content.value);return q(o,e)}function q(e,n){const t=i(()=>{const s=e.value[n];if(s!==void 0){if(J(s))return s;throw new Error(`Element ${n} is not image`)}}),o=i(()=>t.value===void 0?"":c().context.value.imageBuckets?.[t.value?.bucket]),l=i(()=>t.value!==void 0),r=i(()=>w(t.value?.set?.["cropped-webp-100x200"]?.url,o.value)),a=i(()=>w(t.value?.set?.["cropped-webp-1000x2000"]?.url,o.value)),v=i(()=>w(t.value?.set?.["webp-200x200"]?.url,o.value)),g=i(()=>w(t.value?.set?.["webp-2000x2000"]?.url,o.value));return d({hasContent:l,lowResolutionMobileImage:r,highResolutionMobileImage:a,lowResolutionDesktopImage:v,highResolutionDesktopImage:g})}function Q(e){return"enabled"in e}function D(e,n){const t=c(),o=i(()=>n!==void 0?n:t.content.value);return Z(o,e)}function Z(e,n){const t=i(()=>{const r=e.value[n];if(r!==void 0){if(Q(r))return r;throw new Error(`Element ${n} is not toggle`)}}),o=i(()=>t.value!==void 0),l=i(()=>t.value?.enabled);return d({hasContent:o,value:l})}function R(e,n){const t=c(),o=i(()=>n!==void 0?n:t.content.value);return ee(o,e)}function ee(e,n){const t=i(()=>{const r=e.value[n];if(r!==void 0){if(typeof r=="string")return r;throw new Error(`Element ${n} is not selectbox`)}}),o=i(()=>t.value!==void 0),l=i(()=>t.value);return d({hasContent:o,value:l})}function te(e){return e!==null&&"items"in e}function A(e){const n=c(),t=i(()=>{const a=n.content.value[e];if(a!==void 0){if(te(a))return a;throw new Error(`Element ${e} is not an menu`)}}),o=i(()=>!!n.site?.value?.isPreviewMode),l=i(()=>t.value!==void 0),r=i(()=>t.value?.items?t.value.items.map(a=>({...a,performAction:L(a,o.value)})):[]);return d({hasContent:l,items:r})}const ne="menu";function oe(){return A(ne)}var G=(e=>(e.INPUTBOX="INPUTBOX",e.TEXTAREA="TEXTAREA",e.BUTTON="BUTTON",e.IMAGE="IMAGE",e.TOGGLE="TOGGLE",e.SELECTBOX="SELECTBOX",e))(G||{});function ie(e){if(typeof e!="object"||e===null)return!1;const n=e;return Array.isArray(n.cards)&&n.cards.every(t=>typeof t.settings=="object"&&t.settings!==null)}function le(e){const n=c(),t=i(()=>{const r=n.content.value[e];if(r!==void 0){if(ie(r))return r;throw new Error(`Element ${e} is not of DECK type`)}}),o=i(()=>t.value!==void 0&&t.value.cards.length>0),l=i(()=>t.value?.cards);return d({hasContent:o,cards:l,getReactiveRef:re})}function re(e,n,t){if(e==null)throw Error("Could not get a reactive ref for undefined Card");const o=e.settings[t];if(o===void 0)return o;switch(n){case"TEXTAREA":return C(t,e.settings);case"INPUTBOX":return O(t,e.settings);case"SELECTBOX":return R(t,e.settings);case"IMAGE":return k(t,e.settings);case"TOGGLE":return D(t,e.settings);case"BUTTON":return x(t,e.settings);default:return}}function ae(e){return"type"in e&&("text"in e||"image"in e)}function T(e,n){const t=new RegExp(/^https?:\/\//);return e!==void 0&&t.test(e)?e:`${n}/${e}`}function ue(){const e=c(),n=i(()=>{const a=e.content.value.logo;if(a!==void 0){if(ae(a))return a;throw new Error("Element logo is not LOGO")}}),t=i(()=>n.value?.type),o=i(()=>n.value?.text),l=i(()=>n.value?.image===void 0?"":e.context.value.imageBuckets?.[n.value.image.bucket]),r=i(()=>({lowResolutionMobileImage:T(n.value?.image?.set?.["cropped-webp-100x200"]?.url,l.value),highResolutionMobileImage:T(n.value?.image?.set?.["cropped-webp-1000x2000"]?.url,l.value),lowResolutionDesktopImage:T(n.value?.image?.set?.["webp-200x200"]?.url,l.value),highResolutionDesktopImage:T(n.value?.image?.set?.["webp-2000x2000"]?.url,l.value)}));return d({type:t,text:o,image:r})}function S(e,n){if(n===void 0)return;if(!n.startsWith("global."))return n.replaceAll("_"," ");const t=n.split(".").at(2);if(t!==void 0)return e.fontFamily?e.fontFamily[t].replaceAll("_"," "):void 0}function h(e,n,t){return n?S(e,n):S(e,t)}function $(e,n){if(n===void 0)return;if(typeof n!="string"||!n.startsWith("global."))return n;const t=n.split(".").at(2);if(t!==void 0)return e.textSize?e.textSize[t]:void 0}function _(e,n,t){return n?$(e,n):$(e,t)}function z(e,n){if(n===void 0)return;if(typeof n!="string"||!n.startsWith("global."))return n;const t=n.split(".").at(2);if(t!==void 0)return e.color?e.color[t]:void 0}function p(e,n,t){return n?z(e,n):z(e,t)}function se(e,n,t){return{visible:n?.visible??t?.visible??!1,width:n?.width??t?.width??1,color:p(e,n?.color,t?.color)}}function ce(e){const n=c(),t=i(()=>{const s=n.design.value[e],u=n.defaults.value[e],f=n.globalDesign.value;return{font:h(f,s?.font,u?.font),size:_(f,s?.size,u?.size),bold:s?.bold??u?.bold,italic:s?.italic??u?.italic,color:p(f,s?.color,u?.color),visible:s?.visible??u?.visible??!1}}),o=i(()=>t.value?.font),l=i(()=>t.value?.size),r=i(()=>t.value?.bold),a=i(()=>t.value?.italic),v=i(()=>t.value?.color),g=i(()=>t.value?.visible);return d({font:o,size:l,bold:r,italic:a,color:v,visible:g})}function ve(e){const n=c(),t=i(()=>{const u=n.design.value[e],f=n.defaults.value[e],E=n.globalDesign.value;return{font:h(E,u?.font,f?.font),size:_(E,u?.size,f?.size),bold:u?.bold??f?.bold,italic:u?.italic??f?.italic,color:p(E,u?.color,f?.color),visible:u?.visible??f?.visible??!1,whiteSpace:"pre-wrap"}}),o=i(()=>t.value?.font),l=i(()=>t.value?.size),r=i(()=>t.value?.bold),a=i(()=>t.value?.italic),v=i(()=>t.value?.color),g=i(()=>t.value?.visible),s=i(()=>t.value?.whiteSpace);return d({font:o,size:l,bold:r,italic:a,color:v,visible:g,whiteSpace:s})}function de(e){const n=c(),t=i(()=>{const s=n.design.value[e],u=n.defaults.value[e],f=n.globalDesign.value;return{appearance:s?.appearance??u?.appearance,font:h(f,s?.font,u?.font),size:s?.size??u?.size,style:s?.style??u?.style,color:p(f,s?.color,u?.color),visible:s?.visible??u?.visible??!1}}),o=i(()=>t.value?.appearance),l=i(()=>t.value?.font),r=i(()=>t.value?.size),a=i(()=>t.value?.style),v=i(()=>t.value?.color),g=i(()=>t.value?.visible);return d({appearance:o,font:l,size:r,style:a,color:v,visible:g})}function fe(e){const n=c(),t=i(()=>{const r=n.design.value[e],a=n.defaults.value[e],v=n.globalDesign.value;return{overlay:{type:r?.overlay?.type??a?.overlay?.type,solid:{color:p(v,r?.overlay?.solid?.color,a?.overlay?.solid?.color)},gradient:{fromColor:p(v,r?.overlay?.gradient?.fromColor,a?.overlay?.gradient?.fromColor),toColor:p(v,r?.overlay?.gradient?.toColor,a?.overlay?.gradient?.toColor)}},visible:r?.visible??a?.visible??!1}}),o=i(()=>t.value?.overlay),l=i(()=>t.value?.visible);return d({overlay:o,visible:l})}function ge(e){const n=c(),t=i(()=>{const l=n.design.value[e],r=n.defaults.value[e];return{enabled:l?.enabled??r?.enabled}}),o=i(()=>t.value?.enabled);return d({enabled:o})}function pe(e){const n=c(),t=i(()=>{const l=n.design.value[e],r=n.defaults.value[e];return{value:l?.value??r?.value}}),o=i(()=>t.value?.value);return d({value:o})}function be(e){const n=c(),t=i(()=>{const l=n.design.value[e],r=n.defaults.value[e],a=n.globalDesign.value;return{background:{type:l?.background?.type??r?.background?.type,solid:{color:p(a,l?.background?.solid?.color,r?.background?.solid?.color)},gradient:{fromColor:p(a,l?.background?.gradient?.fromColor,r?.background?.gradient?.fromColor),toColor:p(a,l?.background?.gradient?.toColor,r?.background?.gradient?.toColor)}}}}),o=i(()=>t.value?.background);return d({background:o})}function me(){const e=c(),n=i(()=>e.design.value.layout),t=i(()=>n.value);return d({layout:t})}function Ee(){const e=c();return i(()=>{const n=e.design.value.logo,t=e.defaults.value.logo,o=e.globalDesign.value;return{font:h(o,n?.font,t?.font),size:_(o,n?.size,t?.size),bold:n?.bold??t?.bold,italic:n?.italic??t?.italic,color:p(o,n?.color,t?.color),visible:n?.visible??t?.visible??!1,spacing:n?.spacing??t?.spacing??0,capitalization:n?.capitalization??t?.capitalization??"none",frame:se(o,n?.frame,t?.frame)}})}function N(e){return{app:P(e)}}function we(e,n){return{init:()=>{const{app:t}=N(e);return n?.init?.(t),{render:async(o,l)=>(c().init(t,o,l.content,l.design,l.defaults,l.externalContent,o.globalDesign),n?.render?.(t,o,l),{html:await U(t,{context:o}),state:{context:o,data:l}})}}}}function Te(e,n){return{init:()=>{const{app:t}=N(e);return n?.init?.(t),{mount:(o,l)=>{c().init(t,l.context,l.data.content,l.data.design,l.data.defaults,l.data.externalContent,l.context.globalDesign),n?.mount?.(t,o,l),t.mount(o)},update:o=>{c().update(t,o.data.content,o.data.design,o.data.defaults,o.data.externalContent,o.context.globalDesign),n?.update?.(t,o)},unmount:()=>{n?.unmount?.(t),t.unmount()}}}}}function he(){return globalThis.window.instantsite}export{G as EditorTypes,Te as createVueClientApp,we as createVueServerApp,be as useBackgroundElementDesign,x as useButtonElementContent,de as useButtonElementDesign,le as useDeckElementContent,k as useImageElementContent,fe as useImageElementDesign,O as useInputboxElementContent,he as useInstantsiteJsApi,me as useLayoutElementDesign,ue as useLogoElementContent,Ee as useLogoElementDesign,A as useMenuElementContent,oe as useNavigationMenuElementContent,R as useSelectboxElementContent,pe as useSelectboxElementDesign,ce as useTextElementDesign,C as useTextareaElementContent,ve as useTextareaElementDesign,D as useToggleElementContent,ge as useToggleElementDesign,c as useVueBaseProps};
package/dist/cli.d.mts CHANGED
@@ -1,2 +1,3 @@
1
+ declare function run(): void;
1
2
 
2
- export { }
3
+ export { run };
package/dist/cli.d.ts CHANGED
@@ -1,2 +1,3 @@
1
+ declare function run(): void;
1
2
 
2
- export { }
3
+ export { run };
package/dist/cli.mjs CHANGED
@@ -1,10 +1,8 @@
1
- import yo from"cac";import*as X from"path";import m,{resolve as l,parse as I,dirname as mo,sep as go}from"path";import{red as ho,yellow as $o,green as L}from"kolorist";import pe from"prompts";import E from"node:fs";import v from"node:path";import T from"node:process";import{fileURLToPath as x}from"node:url";import*as K from"fs";import g,{existsSync as A,rename as bo,unlink as Eo,statSync as To,promises as Y,writeFileSync as Oo,createReadStream as So}from"fs";import jo from"adm-zip";import{glob as h,globSync as le}from"glob";import{build as de,defineConfig as fe}from"vite";import{builtinModules as ue}from"module";import ye from"@vitejs/plugin-vue";import Z from"vite-tsconfig-paths";import{viteExternalsPlugin as wo}from"vite-plugin-externals";import vo from"vite-plugin-compression";import Ao from"vite-plugin-checker";import Do from"ajv/dist/2020.js";import Co from"ajv-formats";import*as d from"process";import _o from"process";import{pathToFileURL as N}from"url";import Io from"node:zlib";import{promisify as No}from"node:util";import{readFile as me}from"fs/promises";import Lo,{AxiosError as ge}from"axios";import{inc as xo}from"semver";import{ConcurrencyManager as Po}from"axios-concurrency";import Fo from"tinycolor2";import Ro from"cli-progress";function he(e,t){K.statSync(e).isDirectory()?(K.mkdirSync(t,{recursive:!0}),K.readdirSync(e).forEach(o=>{const s=X.resolve(e,o),n=X.resolve(t,o);he(s,n)})):K.copyFileSync(e,t)}function C(e,t,o,s){const n=X.join(e,s?.[o]??o);he(X.join(t,o),n)}function k(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(ho(e)),warn:e=>console.log($o(e)),info:e=>console.log(L(e))},P="_temp",$="dist/sections",W="dist/headers",Q="dist/footers",F="dist/templates",$e=2*1024*1024,be=300*1024;function ee(e){return!!e}function Ee(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}const ko="Resource name can only contain alphanumeric characters, dashes, and underscores";function Go(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:ko}}function Mo(e){return e===!0?!0:typeof e=="string"&&e.trim().length===0}async function Bo(e){try{const t=e,o=T.cwd(),s=v.join(o,t),n=["templates","headers","footers","reference"],r={_gitignore:".gitignore"};E.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)):E.mkdirSync(s);const i=v.resolve(x(import.meta.url),"../..","template");E.readdirSync(i).filter(p=>p!=="package.json").filter(p=>!n.includes(p)).forEach(async p=>C(s,i,p,r));const c=JSON.parse(E.readFileSync(v.join(i,"package.json"),"utf-8"));c.name=e;const y=v.join(s,"package.json");E.writeFileSync(y,`${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 te(e,t,o,s){try{const n=T.cwd(),r=m.join(n,t);g.existsSync(r)||g.mkdirSync(r);const i=m.join(n,t,o);g.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)):g.mkdirSync(i);const c=m.resolve(x(import.meta.url),"../..",e);g.readdirSync(c).forEach(async y=>C(i,c,y)),a.info(`${s} ${o} created`)}catch(n){a.error(`Error while creating ${s}: ${n.message}`),T.exit(1)}}function Te(e){const t=T.cwd(),o=m.resolve(x(import.meta.url),"../..",`template/${e}`),s=m.join(t,e);g.existsSync(s)||(g.mkdirSync(s),g.readdirSync(o).forEach(async n=>C(s,o,n)))}function Uo(e,t,o){if(!g.existsSync(o)){g.copyFileSync(t,o);return}const s=g.readFileSync(t),n=g.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 Oe(e,t){const o=g.readdirSync(e,{withFileTypes:!0});g.existsSync(t)||g.mkdirSync(t,{recursive:!0}),o.forEach(s=>{const n=m.join(e,s.name),r=m.join(t,s.name);s.isDirectory()?Oe(n,r):Uo(s,n,r)})}function oe(){try{const e=T.cwd(),t=m.join(e,"shared"),o=m.resolve(x(import.meta.url),"../..","template/shared");if(!g.existsSync(o))return;Oe(o,t)}catch(e){a.error(`Error while processing shared folder: ${e.message}`),T.exit(1)}}async function qo(e){oe(),te("template/sections/example-section","sections",e,"Section")}async function zo(e){try{const t=T.cwd(),o=v.join(t,"templates"),s={"template.ts":`${e}.ts`};E.existsSync(o)?E.existsSync(v.join(o,`${e}.ts`))&&(a.error(`Template with the name: ${e} already exists. If you'd like to override it, delete previous version first`),T.exit(1)):E.mkdirSync(o);const n=v.resolve(x(import.meta.url),"../..","template/templates");E.readdirSync(n).forEach(async r=>C(o,n,r,s)),Te("headers"),Te("footers"),a.info(`Template descriptor file [${e}.ts] has been created`)}catch(t){a.error(`Error while creating template descriptors: ${t.message}`),T.exit(1)}}async function Xo(){try{const e=T.cwd(),t=v.resolve(x(import.meta.url),"../../","template/reference"),o=E.readdirSync(t);let s=!1;for(const n of o){const r=v.join(t,n),i=v.join(e,n);E.existsSync(i)||E.mkdirSync(i,{recursive:!0});const c=E.readdirSync(r),y=E.readdirSync(i);if(n==="shared"){c.forEach(p=>{C(i,r,p)});continue}for(const p of c){if(p==="assets"){C(i,r,p);continue}if(y.includes(p)){const{name:_}=await pe({type:"text",name:"name",message:`The "${p}" already exists in ${n} directory: provide a new name to keep both or press Esc to skip this one.`});_?(C(i,r,p,{[p]:_}),s=!0):a.info(`Skipped: ${p}`)}else C(i,r,p)}}a.info("Reference templates have been added to the app"),s&&a.warn("Some files or folders were renamed to avoid conflicts. Temlate files may need to be updated to reflect these changes.")}catch(e){a.error(`Error while creating template descriptors: ${e.message}`),T.exit(1)}}var b=(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.TemplateAsset=6]="TemplateAsset",e))(b||{}),j=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.Misc=2]="Misc",e))(j||{});const Ko=()=>vo({ext:".gz",algorithm:"gzip",deleteOriginFile:!0}),Se=()=>{const e=process.env.npm_lifecycle_event;return Ao({typescript:!0,vueTsc:!1,eslint:{lintCommand:`eslint --max-warnings=0 "./sections/**/*.{js,ts,vue}" --cache --cache-location "./build/eslintcache/${e}.json"`}})},Ho="/* EXTERNAL_IMPORTS_START */",Vo="/* EXTERNAL_IMPORTS_END */",Jo=()=>({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=Ho+i+Vo,y=s.code.replace(n,"");s.code=c+y}}}}}),Yo={[j.Server]:[ye(),Z(),Jo(),Ko()],[j.Client]:[ye(),Z(),Se(),wo({vue:"EcVue"})],[j.Misc]:[Z(),Se()]};var se=(e=>(e.SECTION="SECTION",e.HEADER="HEADER",e.FOOTER="FOOTER",e))(se||{});const f={SECTION:{source:"sections",dist:"dist/sections"},HEADER:{source:"headers",dist:"dist/headers"},FOOTER:{source:"footers",dist:"dist/footers"}};function G(e){return A(`${W}/${e}`)?"HEADER":A(`${Q}/${e}`)?"FOOTER":"SECTION"}function Zo(e){const t=G(e);return f[t].dist}const je={"process.env":{NODE_ENV:"production"}},Wo=[...ue,...ue.map(e=>`node:${e}`)],Qo=[/@vue\/compiler-dom/,/@vue\/runtime-dom/,/@vue\/server-renderer/,/@vue\/compiler-ssr/,/@vue\/shared/],D={[b.Server]:{pluginType:j.Server,define:je,ssr:!0,ssrOptions:{noExternal:!0},outDir:(e,t)=>`./${f[t].dist}/${e}/js/main/server`,externalOption:[...Wo,...Qo],entryFileNames:"server.js",inlineDynamicImports:!0},[b.Client]:{pluginType:j.Client,define:je,ssr:!1,outDir:(e,t)=>`./${f[t].dist}/${e}/js/main/client`,entryFileNames:"client.js",assetFileNames:"assets/[name].[ext]",chunkFileNames:"chunks/[name].js",inlineDynamicImports:!1},[b.SectionSetting]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${f[t].dist}/${e}/js/settings`,entryFileNames:"[name].mjs"},[b.SectionShowcase]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${f[t].dist}/${e}/js/showcases`,entryFileNames:"[name].mjs"},[b.SectionAsset]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${f[t].dist}/${e}/assets`,assetFileNames:"[name].[ext]"},[b.TemplateDescriptor]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${F}/js`,entryFileNames:`[name]${P}.mjs`},[b.TemplateAsset]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${F}/assets`,assetFileNames:"[name].[ext]"}};function es(e){switch(typeof e){case"string":return[l(process.cwd(),e)];case"object":return e.map(t=>l(process.cwd(),t));default:return[]}}function we(e,t,o,s){const n=D[o].define,r=D[o].ssrOptions,i=D[o].entryFileNames,c=D[o].chunkFileNames,y=D[o].assetFileNames,p=D[o].inlineDynamicImports,_=D[o].externalOption;return{plugins:Yo[D[o].pluginType],...n!=null&&{define:n},...r!=null&&{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:{..._!=null&&{external:_},preserveEntrySignatures:"strict",input:es(t),output:{validate:!0,inlineDynamicImports:p,...i!=null&&{entryFileNames:i},...c!=null&&{chunkFileNames:c},...y!=null&&{assetFileNames:y}}}}}}const ve="https://json-schema.org/draft/2020-12/schema",Ae="https://lightspeedhq.com/template-default.schema.json",De="Default Section",Ce="Default section for a Custom Template",_e="object",Ie={"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}},ts={$schema:ve,$id:Ae,title:De,description:Ce,type:_e,$defs:Ie},os={__proto__:null,$defs:Ie,$id:Ae,$schema:ve,default:ts,description:Ce,title:De,type:_e},Ne="https://json-schema.org/draft/2020-12/schema",Le="https://lightspeedhq.com/template-custom.schema.json",xe="Custom Section",Pe="Custom section for a Custom Template",Fe="object",Re={"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}},ss={$schema:Ne,$id:Le,title:xe,description:Pe,type:Fe,$defs:Re},ns={__proto__:null,$defs:Re,$id:Le,$schema:Ne,default:ss,description:Pe,title:xe,type:Fe},ke="https://json-schema.org/draft/2020-12/schema",Ge="https://lightspeedhq.com/template-custom-content.schema.json",Me="Custom Section :: Content Configuration",Be="Content tab configuration of a Custom Section for a Custom Template",Ue="object",qe={input_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"INPUTBOX"},text:{type:"string"}},required:["type","text"],additionalProperties:!1},text_area:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TEXTAREA"},text:{type:"string"}},required:["type","text"],additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"BUTTON"},title:{type:"string"},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"},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",type:"string"},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"]}},rs={$schema:ke,$id:Ge,title:Me,description:Be,type:Ue,$defs:qe},is={__proto__:null,$defs:qe,$id:Ge,$schema:ke,default:rs,description:Be,title:Me,type:Ue},ze="https://json-schema.org/draft/2020-12/schema",Xe="https://lightspeedhq.com/template-custom-design.schema.json",Ke="Custom Section :: Design Configuration",He="Design tab configuration of a Custom Section for a Custom Template",Ve="object",Je={text:{type:"object",properties:{type:{description:"Type of the text",type:"string",const:"TEXT"},font:{description:"Default font for the text",type:"string"},size:{description:"Default size for the text",type:"integer",minimum:1,exclusiveMaximum:50},bold:{description:"Default boldness for the text",type:"boolean"},italic:{description:"Default italic style for the text",type:"boolean"},color:{description:"Default color for the text",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},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:{description:"Default color for the button",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"}},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",type:"array",items:{type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},minItems:2,maxItems:2}}},else:{properties:{color:{description:"Default color for the image",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"}}}},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:"Default style for the background",type:"string",enum:["COLOR","GRADIENT"]}},if:{properties:{style:{const:"GRADIENT"}}},then:{properties:{color:{description:"Default colors for the image",type:"array",items:{type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},minItems:2,maxItems:2}}},else:{properties:{color:{description:"Default color for the image",type:"string"}}}},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:{description:"Default size for the text logo",type:"integer",minimum:1,exclusiveMaximum:50},bold:{description:"Default boldness for the text logo",type:"boolean"},italic:{description:"Default italic style for the text logo",type:"boolean"},color:{description:"Default color for the text logo",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"},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:{description:"Default color for the frame on text logo",type:"string",pattern:"^#([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"}},required:["visible","width","color"],additionalProperties:!1}},additionalProperties:!1}},as={$schema:ze,$id:Xe,title:Ke,description:He,type:Ve,$defs:Je},cs={__proto__:null,$defs:Je,$id:Xe,$schema:ze,default:as,description:He,title:Ke,type:Ve},Ye="https://json-schema.org/draft/2020-12/schema",Ze="https://lightspeedhq.com/section-content.schema.json",We="Custom Section - Content",Qe="The content of a custom section",et="object",tt={"^.*$":{type:"object",properties:{type:{type:"string",enum:["INPUTBOX","TEXTAREA","BUTTON","IMAGE","TOGGLE","SELECTBOX","INFO","DECK","MENU","NAVIGATION_MENU","LOGO"]}},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"}}]}},ot={Inputbox:{type:"object",properties:{type:{const:"INPUTBOX"},label:{type:"string"},placeholder:{type:"string"},defaults:{$ref:"#/$defs/InputboxDefaults"}},required:["type","label","placeholder"]},Textarea:{type:"object",properties:{type:{const:"TEXTAREA"},label:{type:"string"},placeholder:{type:"string"},defaults:{$ref:"#/$defs/TextareaDefaults"}},required:["type","label","placeholder"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{type:"string"},defaults:{$ref:"#/$defs/ButtonDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{type:"string"},defaults:{$ref:"#/$defs/ImageDefaults"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{type:"string"},description:{type:"string"},defaults:{$ref:"#/$defs/ToggleDefaults"}},required:["type","label","description"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{type:"string"},placeholder:{type:"string"},description:{type:"string"},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:{type:"string"}},required:["type"]},NavigationMenu:{type:"object",properties:{type:{const:"NAVIGATION_MENU"}},required:["type"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{type:"string"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},label:{type:"string"},description:{type:"string"},button:{$ref:"#/$defs/InfoEditorButton"},defaults:{$ref:"#/$defs/InfoDefaults"}},required:["type","label","description"]},InputboxDefaults:{type:"object",properties:{text:{type:"string"}},required:["text"]},TextareaDefaults:{type:"object",properties:{text:{type:"string"}},required:["text"]},ButtonDefaults:{type:"object",properties:{title:{type:"string"},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:{type:"object",additionalProperties:{type:"string"}},button:{$ref:"#/$defs/InfoButtonDefaults"}}},SelectboxOption:{type:"object",properties:{label:{type:"string"},value:{type:"string"}}},InfoEditorButton:{type:"object",properties:{label:{type:"string"},link:{type:"string"}}},InfoButtonDefaults:{type:"object",properties:{title:{type:"string"},link:{type:"string",minLength:0}}},Deck:{type:"object",properties:{cards:{description:"Cards of the content configuration element",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}}}}}},st=!1,ps={$schema:Ye,$id:Ze,title:We,description:Qe,type:et,patternProperties:tt,$defs:ot,additionalProperties:st},nt={__proto__:null,$defs:ot,$id:Ze,$schema:Ye,additionalProperties:st,default:ps,description:Qe,patternProperties:tt,title:We,type:et},rt="https://json-schema.org/draft/2020-12/schema",it="https://lightspeedhq.com/sections/section-translation.schema.json",at="Custom Section - Translations",ct="The translation of the section's labels",pt="object",lt={"^[a-z]{2}$":{type:"object",patternProperties:{"^\\$.*$":{type:"string"}},additionalProperties:!1}},dt=!1,ls={$schema:rt,$id:it,title:at,description:ct,type:pt,patternProperties:lt,additionalProperties:dt},ft={__proto__:null,$id:it,$schema:rt,additionalProperties:dt,default:ls,description:ct,patternProperties:lt,title:at,type:pt},ut="https://json-schema.org/draft/2020-12/schema",yt="https://lightspeedhq.com/section-design.schema.json",mt="Custom Section - Design",gt="The design of a custom section",ht="object",$t={"^.*$":{type:"object",properties:{type:{type:"string",enum:["TEXT","IMAGE","BUTTON","BACKGROUND","TOGGLE","COLOR_PICKER","RATING","SELECTBOX","SOCIAL_PROFILES","LOGO","INFO"]}},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"}}},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"}}],additionalProperties:!0}},bt={Text:{type:"object",properties:{type:{const:"TEXT"},label:{type:"string"},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:{type:"string"},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:{type:"string"},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:{type:"string"},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:{type:"string"},description:{type:"string"},defaults:{$ref:"#/$defs/ToggleDesignDefaults"}},required:["type","label"]},Color:{type:"object",properties:{type:{const:"COLOR_PICKER"},label:{type:"string"},description:{type:"string"},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:{type:"string"},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:{type:"string"},description:{type:"string"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label"]},SocialProfile:{type:"object",properties:{type:{const:"SOCIAL_PROFILES"},label:{type:"string"},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:{type:"string"},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},TextDesignDefaults:{type:"object",properties:{font:{type:"string"},size:{oneOf:[{type:"integer"},{type:"string"}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{type:"string"},visible:{type:"boolean"}},required:[]},ImageDesignDefaults:{type:"object",properties:{overlay:{type:"string"},visible:{type:"boolean"}},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:{type:"string"},visible:{type:"boolean"}},required:[]},BackgroundDesignDefaults:{type:"object",properties:{appearance:{$ref:"section-commons.schema.json#/$defs/Background"}},required:[]},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:[{type:"integer"},{type:"string"}]},bold:{type:"boolean"},italic:{type:"boolean"},color:{type:"string"},visible:{type:"boolean"}},required:[]},SelectboxOption:{type:"object",properties:{value:{type:"string"},label:{type:"string"}},required:[]}},ds={$schema:ut,$id:yt,title:mt,description:gt,type:ht,patternProperties:$t,$defs:bt},Et={__proto__:null,$defs:bt,$id:yt,$schema:ut,default:ds,description:gt,patternProperties:$t,title:mt,type:ht},Tt="https://json-schema.org/draft/2020-12/schema",Ot="https://lightspeedhq.com/section-commons.schema.json",St="Custom Section - Content",jt="The content of a custom section",wt="object",vt={Image:{type:"object",properties:{set:{type:"object",additionalProperties:{$ref:"#/$defs/ImageInfo"}},borderInfo:{$ref:"#/$defs/BorderInfo"},bucket:{type:"string"}},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"}}}},At=!1,fs={$schema:Tt,$id:Ot,title:St,description:jt,type:wt,$defs:vt,additionalProperties:At},us={__proto__:null,$defs:vt,$id:Ot,$schema:Tt,additionalProperties:At,default:fs,description:jt,title:St,type:wt},Dt="https://json-schema.org/draft/2020-12/schema",Ct="https://lightspeedhq.com/section-showcase.schema.json",_t="Custom Section - Showcase settings",It="The setting of a showcase",Nt="object",Lt=["showcaseId","previewImage"],xt=[{properties:{showcaseId:{description:"Showcase id of the section",type:"string"},previewImage:{$ref:"section-commons.schema.json#/$defs/Image"}}},{$ref:"../showcase_overrides.schema.json"}],ys={$schema:Dt,$id:Ct,title:_t,description:It,type:Nt,required:Lt,allOf:xt},Pt={__proto__:null,$id:Ct,$schema:Dt,allOf:xt,default:ys,description:It,required:Lt,title:_t,type:Nt},Ft="https://json-schema.org/draft/2020-12/schema",Rt="https://lightspeedhq.com/template.schema.json",kt="Custom Template",Gt="A custom template enclosing the necessary custom and default blocks",Mt="object",Bt={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},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}},Ut=["metadata","sections"],ms={$schema:Ft,$id:Rt,title:kt,description:Gt,type:Mt,properties:Bt,required:Ut},qt={__proto__:null,$id:Rt,$schema:Ft,default:ms,description:Gt,properties:Bt,required:Ut,title:kt,type:Mt},zt="https://json-schema.org/draft/2020-12/schema",Xt="https://lightspeedhq.com/showcase_overrides.schema.json",Kt="Showcase overrides",Ht="Overrides for the showcase",Vt="object",Jt={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",type:"string"}},gs={$schema:zt,$id:Xt,title:Kt,description:Ht,type:Vt,properties:Jt},hs={__proto__:null,$id:Xt,$schema:zt,default:gs,description:Ht,properties:Jt,title:Kt,type:Vt};var M=(e=>(e.CONTENT="Content",e.DESIGN="Design",e))(M||{});const $s={menu:{type:"NAVIGATION_MENU"},logo:{type:"LOGO"}},bs={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 Yt(e){switch(e){case se.HEADER:return $s;default:return{}}}function Zt(e){switch(e){case se.HEADER:return bs;default:return{}}}function Es({validationType:e,sectionType:t}){switch(e){case M.CONTENT:return Yt(t);case M.DESIGN:return Zt(t);default:return{}}}function Ts(e){return Object.keys(e).length===0}function Os({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 Ss({type:e,mandatorySettings:t}){return Object.keys(t).find(o=>t[o].type===e)}function js({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).forEach(([s,n])=>{const r=Ss({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 ws({type:e,mandatorySettings:t}){return Object.keys(t).findLast(o=>t[o].type===e)}function vs({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=ws({type:r,mandatorySettings:t});o.push({instancePath:i,keyword:"duplicate-type",message:`Editor type "${r}" can only be used once.`})}}),o}function As(e,t){const{sectionSettings:o,sectionType:s}=t,n=Es({validationType:e,sectionType:s});return n===void 0||Ts(n)?[]:[...Os({sectionSettings:o,mandatorySettings:n}),...js({sectionSettings:o,mandatorySettings:n}),...vs({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))(u||{});const H={[u.Server]:{type:"server_js_compressed",fileName:"server.js.gz",isSingleton:!0,toPath:(e,t)=>`${f[t].dist}/${e}/js/main/server/`},[u.Client]:{type:"client_js",fileName:"client.js",isSingleton:!1,toPath:(e,t)=>`${f[t].dist}/${e}/js/main/client/`},[u.ClientChunks]:{type:"client_js_chunks",isSingleton:!1,toPath:(e,t)=>`${f[t].dist}/${e}/js/main/client/chunks/`,fileName:"*"},[u.ClientAsset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:(e,t)=>`${f[t].dist}/${e}/js/main/client/assets/`},[u.Asset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:(e,t)=>`${f[t].dist}/${e}/assets/`},[u.TemplateAsset]:{type:"template_assets",fileName:"*",isSingleton:!1,toPath:()=>`${F}/assets/`},[u.Dependency]:{type:"dependencies",fileName:"package.json",isSingleton:!0,toPath:()=>{}},[u.SourceCode]:{type:"source_code",fileName:"source-code.zip",isSingleton:!0,toPath:()=>{}}},B=[us,Et,nt,Pt,qt,os,ns,is,cs,hs];function U(e,t){const o=new Do({allErrors:!0,schemas:e});return Co(o),o.compile(t)}function Ds(){return U(B,qt)}function Wt(e){return e.map(t=>({instancePath:t.instancePath,message:t.message??"",keyword:t.keyword}))}const Cs=e=>(()=>{const t=Zo(e.name),o=t.split("/").pop()?.toLowerCase();return[{source:`./${o}/${e.name}/settings/content.ts`,dist:m.resolve(`${t}/${e.name}/js/settings/content`),ajv:U(B,nt),validationType:M.CONTENT,sectionName:e.name},{source:`./${o}/${e.name}/settings/design.ts`,dist:m.resolve(`${t}/${e.name}/js/settings/design`),ajv:U(B,Et),validationType:M.DESIGN,sectionName:e.name},{source:`./${o}/${e.name}/settings/translations.ts`,dist:m.resolve(`${t}/${e.name}/js/settings/translations`),ajv:U(B,ft)},...e.showcaseEntryPoints.map(s=>({source:`./${o}/${e.name}/showcases/${I(s).name}.ts`,dist:m.resolve(`${t}/${e.name}/js/showcases/${I(s).name}`),ajv:U(B,s.indexOf("translations")===-1?Pt:ft)}))]})();function _s(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,y)=>c===y.findIndex(p=>`${i.instancePath}${i.message}${i.keyword}`==`${p.instancePath}${p.message}${p.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||"-"}`)})})}async function V(e,t){try{const o=l(_o.cwd(),t?`${e}${P}.mjs`:`${e}.mjs`);return(await import(N(o).href)).default}catch{throw new Error(`File [${e}${P}.mjs] is either invalid or undefined`)}}function Is(e,t){if(e.validationType===void 0||e.sectionName===void 0)return[];const{sectionName:o,validationType:s}=e,n=G(o);return[...As(s,{sectionSettings:t,sectionType:n})]}async function Ns(e){const t=await V(e.dist,!1),o={},s=[];e.ajv(t)||s.push(...Wt(e.ajv.errors??[]));const n=Is(e,t);return n.length>0&&s.push(...n),s.length>0&&(o[e.source]=s),o}async function Ls(e){const t=No(Io.gunzip),o=await g.promises.readFile(e);return(await t(o)).length}async function xs(e,t){const o=H[u.Server],s=m.resolve(`${o.toPath(e,t)}${o.fileName}`),n=await Ls(s);if(n>be)throw a.error(`Size of individual server file must not exceed threshold [${k(be)}]!`),a.error(`${`File: ${s}`.padEnd(s.length+10)}| ${k(n)}`),new Error("Invalid server file size")}function Ps(e){const t=e.reduce((o,s)=>{const n=To(s);return n.size>$e&&(o[s]=k(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 [${k($e)}]!`);for(const s in t)a.error(`${`File: ${s}`.padEnd(o+10)}| ${t[s]}`);throw new Error("Invalid asset file size")}}function Fs(e,t,o,s){const n={};return e(t)&&s===void 0?bo(`${o}${P}.mjs`,`${o}.mjs`,()=>{}):(Eo(`${o}${P}.mjs`,()=>{}),n[m.resolve(`./templates/${I(o).name}.ts`)]=[...Wt(e.errors??[]),...s??[]]),n}async function Rs(e){const t=[];for(const o of e.sections){const s=e.sections.indexOf(o);if(s===0){const n=o.id==="header"&&o.type==="default",r=A(`${W}/${o.id}`);!n&&!r&&t.push({instancePath:`/sections/${s}/id`,message:"The first section must be a `header`",keyword:"required"})}else if(s===e.sections.length-1){const n=o.id==="footer"&&o.type==="default",r=A(`${Q}/${o.id}`);!n&&!r&&t.push({instancePath:`/sections/${s}/id`,message:"The last section must be a `footer`",keyword:"required"})}else if(o.type==="custom")if(!A(`${$}/${o.id}`))t.push({instancePath:`/sections/${s}/id`,message:"Custom section must have a corresponding block defined",keyword:"required"});else{if(o.content!==void 0)if(!A(`${$}/${o.id}/js/settings/content.mjs`))t.push({instancePath:`/sections/${s}/content`,message:"Content descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await V(`${$}/${o.id}/js/settings/content`,!1),r=new Set(Object.keys(n));Object.keys(o.content).every(i=>r.has(i))||t.push({instancePath:`/sections/${s}/content`,message:"Content descriptor must be a subset of the default content descriptor",keyword:"type"})}if(o.design!==void 0)if(!A(`${$}/${o.id}/js/settings/design.mjs`))t.push({instancePath:`/sections/${s}/design`,message:"Design descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await V(`${$}/${o.id}/js/settings/design`,!1),r=new Set(Object.keys(n));Object.keys(o.design).every(i=>r.has(i))||t.push({instancePath:`/sections/${s}/design`,message:"Design descriptor must be a subset of the default design descriptor",keyword:"type"})}o.showcase_id!==void 0&&(A(`${$}/${o.id}/js/showcases/${o.showcase_id}.mjs`)||t.push({instancePath:`/sections/${s}/showcase-id`,message:"Custom section must have a corresponding showcase defined in case showcase_id is specified",keyword:"required"}))}}return t.length===0?void 0:t}function ks(e){return Object.entries(f).find(t=>t[1].source===e)?.[0]}async function Gs(){const e=await h("**/server.{js,ts}",{ignore:["node_modules/**","dist/**"]});return Promise.all(e.map(async t=>{const o=mo(t).split(go),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 h(`**/${s}/client.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await h(`**/${s}/settings/content.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await h(`**/${s}/settings/design.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),y=await h(`**/${s}/settings/layout.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),p=await h(`**/${s}/settings/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),_=await h(`**/${s}/showcases/*.{js,ts}`,{ignore:["node_modules/**","dist/**",`**/${s}/showcases/translations.{js,ts}`]}),fo=await h(`**/${s}/showcases/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),uo=await h(`**/${s}/assets/*`,{ignore:["node_modules/**","dist/**"]});return{name:s,type:ks(n),serverEntrypoint:t,clientEntrypoint:r.at(0),contentSettingsEntrypoint:i.at(0),designSettingsEntrypoint:c.at(0),layoutSettingsEntrypoint:y.at(0),settingsTranslationsEntrypoint:p.at(0),showcasesEntrypoints:_,showcasesTranslationsEntrypoint:fo.at(0),assetsEntrypoints:uo}}))}async function Ms(){const e=await h("./templates/**.{js,ts}",{ignore:["node_modules/**","dist/**"]}),t=await h("./templates/assets/*",{ignore:["node_modules/**","dist/**"]});return{templates:e,assets:t}}async function R(e,t,o,s="SECTION"){t.length!==0&&await de({configFile:!1,...fe(we(e,t,o,s))})}function Bs(){return Promise.all([Y.rm("dist",{recursive:!0,force:!0}),Y.rm("source-code",{recursive:!0,force:!0}),Y.rm("source-code.zip",{force:!0})])}async function Us(e){return Ps(e.assetEntryPoints),await de({configFile:!1,...fe(we(e.name,e.serverEntrypoint,b.Server,e.type))}),await xs(e.name,e.type),await R(e.name,e.clientEntrypoint,b.Client,e.type),await R(e.name,e.settingsEntryPoints,b.SectionSetting,e.type),await R(e.name,e.showcaseEntryPoints,b.SectionShowcase,e.type),await R(e.name,e.assetEntryPoints,b.SectionAsset,e.type),await Cs(e).reduce(async(t,o)=>{const s=await t,n=await Ns(o);return{...s,...n}},Promise.resolve({}))}async function qs(e){return e.reduce(async(t,o)=>{const s=await t,n=await Us(o);return{...s,...n}},Promise.resolve({}))}async function zs(){const e=await Ms();if(e.templates.length===0)return{};const t=await Ds();return await R(void 0,e.assets,b.TemplateAsset),await R(void 0,e.templates,b.TemplateDescriptor),e.templates.reduce(async(o,s)=>{const n=await o,r=`${F}/js/${I(s).name}`,i=await V(r,!0);return{...n,...Fs(t,i,r,await Rs(i))}},Promise.resolve({}))}async function Xs(){const e=new jo,t=["node_modules/**/*","dist/**/*","build/**/*",".git/**/*","**/assets/**/*","crane.config.json"],o=await h("**/*",{cwd:l(process.cwd()),ignore:t,dot:!0,nodir:!0});try{o.forEach(r=>{const i=l(process.cwd(),r);e.addLocalFile(i,I(r).dir)});const s=H[u.SourceCode].fileName,n=l(process.cwd(),s);await e.writeZipPromise(n)}catch(s){throw a.error("Error while zipping source files"),s}}async function Ks(){await Bs();try{const e=await Gs().then(o=>o.map(s=>({name:s.name,type:s.type,serverEntrypoint:s.serverEntrypoint,clientEntrypoint:[s.clientEntrypoint].filter(ee).flat(),settingsEntryPoints:[s.contentSettingsEntrypoint,s.designSettingsEntrypoint,s.layoutSettingsEntrypoint,s.settingsTranslationsEntrypoint].filter(ee),showcaseEntryPoints:[...s.showcasesEntrypoints??[],s.showcasesTranslationsEntrypoint].filter(ee),assetEntryPoints:s.assetsEntrypoints??[]}))),t={...await qs(e),...await zs()};Object.keys(t).length===0?(await Xs(),a.info("Build successful. For deploy run: npx @lightspeed/crane@latest deploy")):(a.error("Error during build:"),_s(t))}catch(e){a.error(`Error while building: ${e.message}`),process.exit(1)}}function ne(e,t){return Object.keys(e).reduce((o,s)=>{const n=e[s],r=t[s];return Ee(n)&&Ee(r)?o[s]=ne(n,r):o[s]=n,o},{...t})}function Hs({contentSettings:e,sectionType:t}){const o=Yt(t);return ne(e,o)}function Vs({designSettings:e,sectionType:t}){const o=Zt(t);return ne(e,o)}function re(e){if(e!==void 0)return e.startsWith("global.")?{type:"GLOBAL_FONT",font:e}:{type:"PRESET_FONT",font:e}}function w(e){if(e===void 0)return;if(e.startsWith("global."))return{type:"GLOBAL_COLOR",raw:e};const t=Fo(e);return{type:"STRUCTURED_COLOR",raw:e,hex:t.toHex8String(),hsl:t.toHsl(),rgba:t.toRgb(),auto:!1}}function Qt(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 Js={COLOR:"COLOR",GRADIENT:"GRADIENT"};function Ys(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";default:throw new Error(`Unknown background type: ${e}. Right options: ${Object.keys(Js)}`)}}function Zs(e){const t=e.style,o=e.color,s=Array.isArray(o)?o:[o,o];return e.background={type:Ys(t),solid:{color:w(s.at(0))},gradient:{fromColor:w(s.at(0)),toColor:w(s.at(1))}},e.style=void 0,e.color=void 0,e}const Ws={SOLID:"SOLID",OUTLINE:"OUTLINE",TEXT:"TEXT"};function Qs(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(Ws)}`)}}const en={SMALL:"SMALL",MEDIUM:"MEDIUM",LARGE:"LARGE"};function tn(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(en)}`)}}const on={ROUND_CORNER:"ROUND_CORNER",RECTANGLE:"RECTANGLE",PILL:"PILL"};function sn(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(on)}`)}}function nn(e){const t=e.appearance;t!==void 0&&(e.appearance=Qs(t));const o=e.size;o!==void 0&&(e.size=tn(o));const s=e.shape;s!==void 0&&(e.style=sn(s),e.shape=void 0);const n=e.font;e.font=re(n);const r=e.color;return e.color=w(r),e}const rn={COLOR:"COLOR",GRADIENT:"GRADIENT",NONE:"NONE"};function an(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(rn)}`)}}function cn(e){const t=e.overlay,o=e.color,s=Array.isArray(o)?o:[o,o];return e.overlay={type:an(t),solid:{color:w(s.at(0))},gradient:{fromColor:w(s.at(0)),toColor:w(s.at(1))}},e.color=void 0,e}function pn(e){const t=e.font;e.font=re(t);const o=e.color;e.color=w(o);const s=e.size;return e.size=Qt(s),e}function ln(e){const t=e.color;return e.color=w(t),e}function dn(e){const t=e.font;e.font=re(t);const o=e.color;e.color=w(o);const s=e.size;if(e.size=Qt(s),e.frame!==void 0){const n=e.frame.color;e.frame.color=w(n)}return e}function ie(e,t){switch(e){case"TEXT":{pn(t);break}case"BUTTON":{nn(t);break}case"IMAGE":{cn(t);break}case"BACKGROUND":{Zs(t);break}case"COLOR_PICKER":{ln(t);break}case"LOGO":{dn(t);break}case"TOGGLE":case"SELECTBOX":break;default:throw new Error(`Unknown design editor type: ${e}`)}return t}function fn(e){Object.keys(e).forEach(t=>{const o=e[t],s=o.type;ie(s,o.defaults)})}function un(e){e.forEach(t=>{t.type!==void 0&&t.defaults!==void 0&&(ie(t.type,t.defaults),t.defaults.type=t.type)})}function eo(e){Object.keys(e).forEach(t=>{const o=e[t],s=o.type;ie(s,o)})}const yn=e=>`\x1B[32m${e}\x1B[0m`,mn=(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:`${k(o.value/i,2)}/s`})},gn=()=>new Ro.SingleBar({format:`|${yn("{bar}")}| {status} || {percentage}% || {value}/{total} Files || Speed: {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591"}),hn="https://blockbuster.ecwid.com",$n="/api/v1/custom-apps/resources/sections/upload",bn="/api/v1/custom-apps/resources/templates/upload",En="/api/v1/custom-apps/manifests/sections",Tn="/api/v1/custom-apps/manifests/templates",On=5,Sn=3,jn=[u.Server,u.Client,u.ClientChunks,u.ClientAsset,u.Asset],wn=[u.Dependency,u.TemplateAsset,u.SourceCode],J={DEFAULT:"Error while deploying:",ASSET_FILES_UPLOAD:"Error while uploading asset files:",MANIFEST_DEPLOYMENT:"Error while deploying manifest file:",DISTRIBUTION_FOLDER_NOT_FOUND:e=>`Distribution folder [${e}] not found, please execute the build command first.`},vn={value:0},S=gn();let to=Date.now();async function An(){const e=await me(l(d.cwd(),"crane.config.json")),t=JSON.parse(e.toString());return{appClientId:t.app_client_id,appSecretKey:btoa(t.app_secret_key)}}function Dn(e){return typeof e=="object"&&e!==null&&"version"in e&&typeof e.version=="string"}async function Cn(){const e=l(d.cwd(),"package.json"),t=await me(e),o=JSON.parse(t.toString());if(Dn(o))return o;throw new Error(`Package file located at path: ${e} does not contain a version field`)}async function _n(e){const t=xo(e.version,"patch");if(t===null)throw Error("Error while incrementing app version");e.version=t,Oo(l(d.cwd(),"package.json"),`${JSON.stringify(e,null,2)}
3
- `)}function q(e,t){if(e&&typeof e=="object"){const o=e;for(const s in o){const n=o[s];typeof n=="string"&&n.startsWith("$")&&(o[s]=Rn(t,n)),typeof n=="object"&&q(n,t)}}}async function In(e,t,o=$){try{const s=l(d.cwd(),`${o}/${e}/js/settings/content.mjs`),n=(await import(N(s).href)).default,r=G(e),i=Hs({contentSettings:n,sectionType:r});return q(i,t),i}catch{throw new Error(`Content descriptor for section [${e}] is either invalid or undefined`)}}async function Nn(e,t,o=$){try{const s=l(d.cwd(),`${o}/${e}/js/settings/design.mjs`),n=(await import(N(s).href)).default,r=G(e),i=Vs({designSettings:n,sectionType:r});return fn(i),q(i,t),i}catch(s){const n=s;throw new Error(`Design settings is invalid or undefined. Error ${n.stack}`)}}async function Ln(e,t,o=$){try{const s=await h("*.mjs",{cwd:l(d.cwd(),`${o}/${e}/js/showcases/`),ignore:"**/translations.mjs"});return Promise.all(s.map(async n=>{const r=l(d.cwd(),`${o}/${e}/js/showcases/${n}`),i=(await import(N(r).href)).default;return eo(i.design),q(i,t),i}))}catch(s){throw new Error(`Showcases is invalid or undefined. Error ${s}`)}}async function xn(e,t=$){try{const o=l(d.cwd(),`${t}/${e}/js/settings/layout.mjs`);if(!A(o))return[];const s=(await import(N(o).href)).default;return s.forEach(n=>un(n.selectedDesignSettings)),s}catch{throw new Error(`Layout descriptor for section [${e}] is either invalid or undefined`)}}function Pn(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}async function oo(e){const t=l(d.cwd(),e),o=(await import(N(t).href)).default;return Pn(o)}async function Fn(e,t=$){return oo(`${t}/${e}/js/settings/translations.mjs`)}async function so(e,t=$){return oo(`${t}/${e}/js/showcases/translations.mjs`)}function Rn(e,t){if(!t)return;const o=e[t];return o===void 0?{en:t}:o}async function ae(e,t){const o=await Fn(e,f[t].dist),s=await so(e,f[t].dist),n=await In(e,o,f[t].dist),r=await Nn(e,o,f[t].dist),i=await Ln(e,s,f[t].dist),c=await xn(e,f[t].dist);return{id:e,type:t,name:{en:e},contentEditors:n,designEditors:r,layouts:c,showcases:i}}async function kn(){const e=await h("*/",{cwd:l(d.cwd(),`${$}/`)}),t=await h("*/",{cwd:l(d.cwd(),`${W}/`)}),o=await h("*/",{cwd:l(d.cwd(),`${Q}/`)});return Promise.all([...e.map(async s=>ae(s,"SECTION")),...t.map(async s=>ae(s,"HEADER")),...o.map(async s=>ae(s,"FOOTER"))])}async function Gn(e){try{return(await import(N(l(d.cwd(),e)).href)).default}catch{throw new Error(`Template descriptor [${e}] is either invalid or undefined`)}}async function Mn(){const e=await h(`${F}/js/**.mjs`,{ignore:[`${F}/js/**${P}.mjs`]});return Promise.all(e.map(async t=>{const o=await Gn(t),s=o.sections.filter(n=>n.type==="custom");for(const n of s){const r=G(n.id),i=await so(n.id,f[r].dist);n.showcase_overrides!==void 0&&(q(n.showcase_overrides,i),eo(n.showcase_overrides.design))}return{id:`${I(d.cwd()).name.replace(/[^a-zA-Z0-9]/g,"_")}_${I(t).name}`,descriptor:o}}))}function no(e,t){const o=e.pathContext,s=o.toPath(e.currentSection,t),n=s===void 0?le(o.fileName):le(o.fileName,{cwd:l(d.cwd(),s),ignore:o.ignore});return(o.isSingleton?n.splice(0):n).map(r=>({url:r,subType:t,context:e}))}function Bn(e){return e instanceof ge&&(e.code==="ECONNRESET"||e.response?.status!==void 0&&e.response?.status>=500&&e.response?.status<600)}function ro(e,t){return e<Sn&&Bn(t)}async function io(e){await new Promise(t=>{setTimeout(t,2**e*500)})}function ao(e,t,o,s){const n={value:0},r=e.config.app.templates.length>0?bn:$n;return e.config.axios.post(r,{file:So(l(d.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},...!["dependencies","source_code"].includes(e.pathContext.type)&&{fileName:t}},headers:{"Content-Type":"multipart/form-data",Authorization:`Bearer ${e.config.app.crane.appSecretKey}`},onUploadProgress:i=>mn(i,S,vn,n,to)}).then(i=>(S.increment(),i)).catch(async i=>{if(ro(s,i))return await io(s),ao(e,t,o,s+1);throw S.increment(),i})}function Un(e){return S.start(e.length+1,0,{speed:"N/A",status:"Deployment in progress"}),e.map(t=>{const o=t.context,s=o.pathContext.toPath(o.currentSection,t.subType);return ao(o,t.url,s,0)})}function qn(e){const t=e.app.sections.flatMap(s=>jn.flatMap(n=>{const r={config:e,currentSection:s.id,pathContext:H[n]};return no(r,s.type)})),o=wn.flatMap(s=>no({config:e,pathContext:H[s]},"SECTION"));return Un([...t,...o])}function zn(e){return e.includes(`
4
- `)}function Xn(e,t,o){return e.split(`
1
+ import go from"cac";import*as V from"path";import g,{resolve as l,parse as C,dirname as ho,sep as $o}from"path";import{red as bo,yellow as Eo,green as N}from"kolorist";import ce from"prompts";import m from"node:fs";import S from"node:path";import b from"node:process";import{fileURLToPath as _}from"node:url";import*as K from"fs";import h,{existsSync as v,rename as To,unlink as Oo,statSync as So,promises as Y,writeFileSync as wo,createReadStream as jo}from"fs";import{pathToFileURL as pe}from"url";import*as f from"process";import{platform as Do}from"process";import vo from"adm-zip";import{glob as $,globSync as le}from"glob";import{build as de,defineConfig as fe}from"vite";import{builtinModules as ue}from"module";import ye from"@vitejs/plugin-vue";import Z from"vite-tsconfig-paths";import{viteExternalsPlugin as Ao}from"vite-plugin-externals";import Io from"vite-plugin-compression";import Co from"vite-plugin-checker";import No from"ajv/dist/2020.js";import _o from"ajv-formats";import xo from"node:zlib";import{promisify as ko}from"node:util";import{readFile as me}from"fs/promises";import Lo,{AxiosError as ge}from"axios";import{inc as Po}from"semver";import{ConcurrencyManager as Fo}from"axios-concurrency";import Ro from"tinycolor2";import Go from"cli-progress";function he(e,t){K.statSync(e).isDirectory()?(K.mkdirSync(t,{recursive:!0}),K.readdirSync(e).forEach(o=>{const s=V.resolve(e,o),n=V.resolve(t,o);he(s,n)})):K.copyFileSync(e,t)}function I(e,t,o,s){const n=V.join(e,s?.[o]??o);he(V.join(t,o),n)}function R(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(bo(e)),warn:e=>console.log(Eo(e)),info:e=>console.log(N(e))},x="_temp",E="dist/sections",W="dist/headers",Q="dist/footers",k="dist/templates",$e=2*1024*1024,be=300*1024;function ee(e){return!!e}function Ee(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}const Mo="Resource name can only contain alphanumeric characters, dashes, and underscores";function Bo(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:Mo}}function qo(e){return e===!0?!0:typeof e=="string"&&e.trim().length===0}async function H(e,t){try{const o=l(process.cwd(),t?`${e}${x}.mjs`:`${e}.mjs`);return(await import(pe(o).href)).default}catch{throw new Error(`File [${e}${x}.mjs] is either invalid or undefined`)}}function Uo(e){return Do==="win32"?e.replace(/\//g,"\\"):e}function Te(e,t){const o=e.split(t);let s="";for(;o.length;){const n=o.join(t),r=m.lstatSync(n||t);if(r.isSymbolicLink()){const i=m.readlinkSync(n),c=S.resolve(S.dirname(n),i);return Te(c,t)}if(r.isDirectory()){const i=`${n}${t}package.json`;if(m.existsSync(i)){s=i;break}}o.pop()}return s}function zo(){const e=Uo("/"),t=Te(b.argv[1],e);return t!==""?JSON.parse(m.readFileSync(t,"utf8")):{}}async function Xo(e){try{const t=e,o=b.cwd(),s=S.join(o,t),n=["templates","headers","footers","reference"],r={_gitignore:".gitignore"};m.existsSync(s)?(a.error(`App with the name: ${e} already exists. If you'd like to override it, delete previous version first`),b.exit(1)):m.mkdirSync(s);const i=S.resolve(_(import.meta.url),"../..","template");m.readdirSync(i).filter(O=>O!=="package.json").filter(O=>!n.includes(O)).forEach(async O=>I(s,i,O,r));const c=JSON.parse(m.readFileSync(S.join(i,"package.json"),"utf-8"));c.name=e;const d=zo();d.version&&(c.dependencies["@lightspeed/crane"]=d.version),d.dependencies["@lightspeed/eslint-config-crane"]&&(c.dependencies["@lightspeed/eslint-config-crane"]=d.dependencies["@lightspeed/eslint-config-crane"]);const p=S.join(s,"package.json");m.writeFileSync(p,`${JSON.stringify(c,null,2)}
2
+ `),a.info(`App ${e} created`)}catch(t){a.error(`Error while creating app: ${t.message}`),b.exit(1)}}function te(e,t,o,s){try{const n=b.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`),b.exit(1)):h.mkdirSync(i);const c=g.resolve(_(import.meta.url),"../..",e);h.readdirSync(c).forEach(async d=>I(i,c,d)),a.info(`${s} ${o} created`)}catch(n){a.error(`Error while creating ${s}: ${n.message}`),b.exit(1)}}function Oe(e){const t=b.cwd(),o=g.resolve(_(import.meta.url),"../..",`template/${e}`),s=g.join(t,e);h.existsSync(s)||(h.mkdirSync(s),h.readdirSync(o).forEach(async n=>I(s,o,n)))}function Vo(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 Se(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()?Se(n,r):Vo(s,n,r)})}function oe(){try{const e=b.cwd(),t=g.join(e,"shared"),o=g.resolve(_(import.meta.url),"../..","template/shared");if(!h.existsSync(o))return;Se(o,t)}catch(e){a.error(`Error while processing shared folder: ${e.message}`),b.exit(1)}}async function Ko(e){oe(),te("template/sections/example-section","sections",e,"Section")}async function Ho(e){try{const t=b.cwd(),o=S.join(t,"templates"),s={"template.ts":`${e}.ts`};m.existsSync(o)?m.existsSync(S.join(o,`${e}.ts`))&&(a.error(`Template with the name: ${e} already exists. If you'd like to override it, delete previous version first`),b.exit(1)):m.mkdirSync(o);const n=S.resolve(_(import.meta.url),"../..","template/templates");m.readdirSync(n).forEach(async r=>I(o,n,r,s)),Oe("headers"),Oe("footers"),a.info(`Template descriptor file [${e}.ts] has been created`)}catch(t){a.error(`Error while creating template descriptors: ${t.message}`),b.exit(1)}}async function Jo(){try{const e=b.cwd(),t=S.resolve(_(import.meta.url),"../../","template/reference"),o=m.readdirSync(t);let s=!1;for(const n of o){const r=S.join(t,n),i=S.join(e,n);m.existsSync(i)||m.mkdirSync(i,{recursive:!0});const c=m.readdirSync(r),d=m.readdirSync(i);if(n==="shared"){c.forEach(p=>{I(i,r,p)});continue}for(const p of c){if(p==="assets"){I(i,r,p);continue}if(d.includes(p)){const{name:O}=await ce({type:"text",name:"name",message:`The "${p}" already exists in ${n} directory: provide a new name to keep both or press Esc to skip this one.`});O?(I(i,r,p,{[p]:O}),s=!0):a.info(`Skipped: ${p}`)}else I(i,r,p)}}a.info("Reference templates have been added to the app"),s&&a.warn("Some files or folders were renamed to avoid conflicts. Temlate files may need to be updated to reflect these changes.")}catch(e){a.error(`Error while creating template descriptors: ${e.message}`),b.exit(1)}}var T=(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.TemplateAsset=6]="TemplateAsset",e))(T||{}),j=(e=>(e[e.Server=0]="Server",e[e.Client=1]="Client",e[e.Misc=2]="Misc",e))(j||{});const Yo=()=>Io({ext:".gz",algorithm:"gzip",deleteOriginFile:!0}),we=()=>{const e=process.env.npm_lifecycle_event;return Co({typescript:!0,vueTsc:!1,eslint:{lintCommand:`eslint --max-warnings=0 "./sections/**/*.{js,ts,vue}" --cache --cache-location "./build/eslintcache/${e}.json"`}})},Zo="/* EXTERNAL_IMPORTS_START */",Wo="/* EXTERNAL_IMPORTS_END */",Qo=()=>({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=Zo+i+Wo,d=s.code.replace(n,"");s.code=c+d}}}}}),es={[j.Server]:[ye(),Z(),Qo(),Yo()],[j.Client]:[ye(),Z(),we(),Ao({vue:"EcVue"})],[j.Misc]:[Z(),we()]};var se=(e=>(e.SECTION="SECTION",e.HEADER="HEADER",e.FOOTER="FOOTER",e))(se||{});const u={SECTION:{source:"sections",dist:"dist/sections"},HEADER:{source:"headers",dist:"dist/headers"},FOOTER:{source:"footers",dist:"dist/footers"}};function G(e){return v(`${W}/${e}`)?"HEADER":v(`${Q}/${e}`)?"FOOTER":"SECTION"}function ts(e){const t=G(e);return u[t].dist}const je={"process.env":{NODE_ENV:"production"}},os=[...ue,...ue.map(e=>`node:${e}`)],ss=[/@vue\/compiler-dom/,/@vue\/runtime-dom/,/@vue\/server-renderer/,/@vue\/compiler-ssr/,/@vue\/shared/],A={[T.Server]:{pluginType:j.Server,define:je,ssr:!0,ssrOptions:{noExternal:!0},outDir:(e,t)=>`./${u[t].dist}/${e}/js/main/server`,externalOption:[...os,...ss],entryFileNames:"server.js",inlineDynamicImports:!0},[T.Client]:{pluginType:j.Client,define:je,ssr:!1,outDir:(e,t)=>`./${u[t].dist}/${e}/js/main/client`,entryFileNames:"client.js",assetFileNames:"assets/[name].[ext]",chunkFileNames:"chunks/[name].js",inlineDynamicImports:!1},[T.SectionSetting]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${u[t].dist}/${e}/js/settings`,entryFileNames:"[name].mjs"},[T.SectionShowcase]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${u[t].dist}/${e}/js/showcases`,entryFileNames:"[name].mjs"},[T.SectionAsset]:{pluginType:j.Misc,ssr:!1,outDir:(e,t)=>`./${u[t].dist}/${e}/assets`,assetFileNames:"[name].[ext]"},[T.TemplateDescriptor]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${k}/js`,entryFileNames:`[name]${x}.mjs`},[T.TemplateAsset]:{pluginType:j.Misc,ssr:!1,outDir:()=>`./${k}/assets`,assetFileNames:"[name].[ext]"}};function ns(e){switch(typeof e){case"string":return[l(process.cwd(),e)];case"object":return e.map(t=>l(process.cwd(),t));default:return[]}}function De(e,t,o,s){const n=A[o].define,r=A[o].ssrOptions,i=A[o].entryFileNames,c=A[o].chunkFileNames,d=A[o].assetFileNames,p=A[o].inlineDynamicImports,O=A[o].externalOption;return{plugins:es[A[o].pluginType],...n!=null&&{define:n},...r!=null&&{ssr:r},resolve:{alias:{"@":"/src"}},css:{preprocessorOptions:{scss:{api:"modern-compiler"}}},build:{ssr:A[o].ssr,outDir:A[o].outDir(e,s),emptyOutDir:!0,minify:"terser",terserOptions:{compress:{drop_console:!1}},rollupOptions:{...O!=null&&{external:O},preserveEntrySignatures:"strict",input:ns(t),output:{validate:!0,inlineDynamicImports:p,...i!=null&&{entryFileNames:i},...c!=null&&{chunkFileNames:c},...d!=null&&{assetFileNames:d}}}}}}const ve="https://json-schema.org/draft/2020-12/schema",Ae="https://lightspeedhq.com/template-default.schema.json",Ie="Default Section",Ce="Default section for a Custom Template",Ne="object",_e={"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}},rs={$schema:ve,$id:Ae,title:Ie,description:Ce,type:Ne,$defs:_e},is={__proto__:null,$defs:_e,$id:Ae,$schema:ve,default:rs,description:Ce,title:Ie,type:Ne},xe="https://json-schema.org/draft/2020-12/schema",ke="https://lightspeedhq.com/template-custom.schema.json",Le="Custom Section",Pe="Custom section for a Custom Template",Fe="object",Re={"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}},as={$schema:xe,$id:ke,title:Le,description:Pe,type:Fe,$defs:Re},cs={__proto__:null,$defs:Re,$id:ke,$schema:xe,default:as,description:Pe,title:Le,type:Fe},Ge="https://json-schema.org/draft/2020-12/schema",Me="https://lightspeedhq.com/template-custom-content.schema.json",Be="Custom Section :: Content Configuration",qe="Content tab configuration of a Custom Section for a Custom Template",Ue="object",ze={input_box:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"INPUTBOX"},text:{type:"string"}},required:["type","text"],additionalProperties:!1},text_area:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"TEXTAREA"},text:{type:"string"}},required:["type","text"],additionalProperties:!1},button:{type:"object",properties:{type:{description:"Type of the content configuration element",type:"string",const:"BUTTON"},title:{type:"string"},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"},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",type:"string"},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"]}},ps={$schema:Ge,$id:Me,title:Be,description:qe,type:Ue,$defs:ze},ls={__proto__:null,$defs:ze,$id:Me,$schema:Ge,default:ps,description:qe,title:Be,type:Ue},Xe="https://json-schema.org/draft/2020-12/schema",Ve="https://lightspeedhq.com/template-custom-design.schema.json",Ke="Custom Section :: Design Configuration",He="Design tab configuration of a Custom Section for a Custom Template",Je="object",Ye={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}},ds={$schema:Xe,$id:Ve,title:Ke,description:He,type:Je,$defs:Ye},fs={__proto__:null,$defs:Ye,$id:Ve,$schema:Xe,default:ds,description:He,title:Ke,type:Je},Ze="https://json-schema.org/draft/2020-12/schema",We="https://lightspeedhq.com/section-content.schema.json",Qe="Custom Section - Content",et="The content of a custom section",tt="object",ot={"^.*$":{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"}}]}},st={Inputbox:{type:"object",properties:{type:{const:"INPUTBOX"},label:{type:"string"},placeholder:{type:"string"},defaults:{$ref:"#/$defs/InputboxDefaults"}},required:["type","label","placeholder"]},Textarea:{type:"object",properties:{type:{const:"TEXTAREA"},label:{type:"string"},placeholder:{type:"string"},defaults:{$ref:"#/$defs/TextareaDefaults"}},required:["type","label","placeholder"]},Button:{type:"object",properties:{type:{const:"BUTTON"},label:{type:"string"},defaults:{$ref:"#/$defs/ButtonDefaults"}},required:["type","label"]},Image:{type:"object",properties:{type:{const:"IMAGE"},label:{type:"string"},defaults:{$ref:"#/$defs/ImageDefaults"}},required:["type","label"]},Toggle:{type:"object",properties:{type:{const:"TOGGLE"},label:{type:"string"},description:{type:"string"},defaults:{$ref:"#/$defs/ToggleDefaults"}},required:["type","label","description"]},Selectbox:{type:"object",properties:{type:{const:"SELECTBOX"},label:{type:"string"},placeholder:{type:"string"},description:{type:"string"},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:{type:"string"}},required:["type"]},NavigationMenu:{type:"object",properties:{type:{const:"NAVIGATION_MENU"}},required:["type"]},Logo:{type:"object",properties:{type:{const:"LOGO"},label:{type:"string"}},required:["type"]},Info:{type:"object",properties:{type:{const:"INFO"},label:{type:"string"},description:{type:"string"},button:{$ref:"#/$defs/InfoEditorButton"},defaults:{$ref:"#/$defs/InfoDefaults"}},required:["type","label","description"]},Divider:{type:"object",properties:{type:{const:"DIVIDER"},label:{type:"string"}},required:["type","label"]},InputboxDefaults:{type:"object",properties:{text:{type:"string"}},required:["text"]},TextareaDefaults:{type:"object",properties:{text:{type:"string"}},required:["text"]},ButtonDefaults:{type:"object",properties:{title:{type:"string"},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:{type:"object",additionalProperties:{type:"string"}},button:{$ref:"#/$defs/InfoButtonDefaults"}}},SelectboxOption:{type:"object",properties:{label:{type:"string"},value:{type:"string"}}},InfoEditorButton:{type:"object",properties:{label:{type:"string"},link:{type:"string"}}},InfoButtonDefaults:{type:"object",properties:{title:{type:"string"},link:{type:"string",minLength:0}}},Deck:{type:"object",properties:{cards:{description:"Cards of the content configuration element",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}}}}}},nt=!1,us={$schema:Ze,$id:We,title:Qe,description:et,type:tt,patternProperties:ot,$defs:st,additionalProperties:nt},rt={__proto__:null,$defs:st,$id:We,$schema:Ze,additionalProperties:nt,default:us,description:et,patternProperties:ot,title:Qe,type:tt},it="https://json-schema.org/draft/2020-12/schema",at="https://lightspeedhq.com/sections/section-translation.schema.json",ct="Custom Section - Translations",pt="The translation of the section's labels",lt="object",dt={"^[a-z]{2}$":{type:"object",patternProperties:{"^\\$.*$":{type:"string"}},additionalProperties:!1}},ft=!1,ys={$schema:it,$id:at,title:ct,description:pt,type:lt,patternProperties:dt,additionalProperties:ft},ut={__proto__:null,$id:at,$schema:it,additionalProperties:ft,default:ys,description:pt,patternProperties:dt,title:ct,type:lt},yt="https://json-schema.org/draft/2020-12/schema",mt="https://lightspeedhq.com/section-design.schema.json",gt="Custom Section - Design",ht="The design of a custom section",$t="object",bt={"^.*$":{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"}}},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}},Et={Text:{type:"object",properties:{type:{const:"TEXT"},label:{type:"string"},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:{type:"string"},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:{type:"string"},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:{type:"string"},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:{type:"string"},description:{type:"string"},defaults:{$ref:"#/$defs/ToggleDesignDefaults"}},required:["type","label"]},Color:{type:"object",properties:{type:{const:"COLOR_PICKER"},label:{type:"string"},description:{type:"string"},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:{type:"string"},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:{type:"string"},description:{type:"string"},options:{type:"array",items:{$ref:"#/$defs/SelectboxOption"}},defaults:{$ref:"#/$defs/SelectboxDefaults"}},required:["type","label"]},SocialProfile:{type:"object",properties:{type:{const:"SOCIAL_PROFILES"},label:{type:"string"},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:{type:"string"},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:{type:"string"}},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:{type:"string"}},required:[]}},ms={$schema:yt,$id:mt,title:gt,description:ht,type:$t,patternProperties:bt,$defs:Et},Tt={__proto__:null,$defs:Et,$id:mt,$schema:yt,default:ms,description:ht,patternProperties:bt,title:gt,type:$t},Ot="https://json-schema.org/draft/2020-12/schema",St="https://lightspeedhq.com/section-commons.schema.json",wt="Custom Section - Content",jt="The content of a custom section",Dt="object",vt={Image:{type:"object",properties:{set:{type:"object",additionalProperties:{$ref:"#/$defs/ImageInfo"}},borderInfo:{$ref:"#/$defs/BorderInfo"},bucket:{type:"string"}},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"}}}},At=!1,gs={$schema:Ot,$id:St,title:wt,description:jt,type:Dt,$defs:vt,additionalProperties:At},hs={__proto__:null,$defs:vt,$id:St,$schema:Ot,additionalProperties:At,default:gs,description:jt,title:wt,type:Dt},It="https://json-schema.org/draft/2020-12/schema",Ct="https://lightspeedhq.com/section-showcase.schema.json",Nt="Custom Section - Showcase settings",_t="The setting of a showcase",xt="object",kt=["showcaseId","previewImage"],Lt=[{properties:{showcaseId:{description:"Showcase id of the section",type:"string"},previewImage:{$ref:"section-commons.schema.json#/$defs/Image"}}},{$ref:"../showcase_overrides.schema.json"}],$s={$schema:It,$id:Ct,title:Nt,description:_t,type:xt,required:kt,allOf:Lt},Pt={__proto__:null,$id:Ct,$schema:It,allOf:Lt,default:$s,description:_t,required:kt,title:Nt,type:xt},Ft="https://json-schema.org/draft/2020-12/schema",Rt="https://lightspeedhq.com/template.schema.json",Gt="Custom Template",Mt="A custom template enclosing the necessary custom and default blocks",Bt="object",qt={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}},Ut=["metadata","sections"],bs={$schema:Ft,$id:Rt,title:Gt,description:Mt,type:Bt,properties:qt,required:Ut},zt={__proto__:null,$id:Rt,$schema:Ft,default:bs,description:Mt,properties:qt,required:Ut,title:Gt,type:Bt},Xt="https://json-schema.org/draft/2020-12/schema",Vt="https://lightspeedhq.com/showcase_overrides.schema.json",Kt="Showcase overrides",Ht="Overrides for the showcase",Jt="object",Yt={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",type:"string"}},Es={$schema:Xt,$id:Vt,title:Kt,description:Ht,type:Jt,properties:Yt},Ts={__proto__:null,$id:Vt,$schema:Xt,default:Es,description:Ht,properties:Yt,title:Kt,type:Jt};var M=(e=>(e.CONTENT="Content",e.DESIGN="Design",e))(M||{});const Os={menu:{type:"NAVIGATION_MENU"},logo:{type:"LOGO"}},Ss={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 Zt(e){switch(e){case se.HEADER:return Os;default:return{}}}function Wt(e){switch(e){case se.HEADER:return Ss;default:return{}}}function ws({validationType:e,sectionType:t}){switch(e){case M.CONTENT:return Zt(t);case M.DESIGN:return Wt(t);default:return{}}}function js(e){return Object.keys(e).length===0}function Ds({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 vs({type:e,mandatorySettings:t}){return Object.keys(t).find(o=>t[o].type===e)}function As({sectionSettings:e,mandatorySettings:t}){const o=[];return Object.entries(e).forEach(([s,n])=>{const r=vs({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 Is({type:e,mandatorySettings:t}){return Object.keys(t).findLast(o=>t[o].type===e)}function Cs({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=Is({type:r,mandatorySettings:t});o.push({instancePath:i,keyword:"duplicate-type",message:`Editor type "${r}" can only be used once.`})}}),o}function Ns(e,t){const{sectionSettings:o,sectionType:s}=t,n=ws({validationType:e,sectionType:s});return n===void 0||js(n)?[]:[...Ds({sectionSettings:o,mandatorySettings:n}),...As({sectionSettings:o,mandatorySettings:n}),...Cs({sectionSettings:o,mandatorySettings:n})]}var y=(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))(y||{});const J={[y.Server]:{type:"server_js_compressed",fileName:"server.js.gz",isSingleton:!0,toPath:(e,t)=>`${u[t].dist}/${e}/js/main/server/`},[y.Client]:{type:"client_js",fileName:"client.js",isSingleton:!1,toPath:(e,t)=>`${u[t].dist}/${e}/js/main/client/`},[y.ClientChunks]:{type:"client_js_chunks",isSingleton:!1,toPath:(e,t)=>`${u[t].dist}/${e}/js/main/client/chunks/`,fileName:"*"},[y.ClientAsset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:(e,t)=>`${u[t].dist}/${e}/js/main/client/assets/`},[y.Asset]:{type:"assets",fileName:"*",isSingleton:!1,toPath:(e,t)=>`${u[t].dist}/${e}/assets/`},[y.TemplateAsset]:{type:"template_assets",fileName:"*",isSingleton:!1,toPath:()=>`${k}/assets/`},[y.Dependency]:{type:"dependencies",fileName:"package.json",isSingleton:!0,toPath:()=>{}},[y.SourceCode]:{type:"source_code",fileName:"source-code.zip",isSingleton:!0,toPath:()=>{}}},B=[hs,Tt,rt,Pt,zt,is,cs,ls,fs,Ts];function q(e,t){const o=new No({allErrors:!0,schemas:e});return _o(o),o.getSchema(t.$id)||o.compile(t)}function _s(){return q(B,zt)}function Qt(e){return e.map(t=>({instancePath:t.instancePath,message:t.message??"",keyword:t.keyword}))}const xs=e=>(()=>{const t=ts(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:q(B,rt),validationType:M.CONTENT,sectionName:e.name},{source:`./${o}/${e.name}/settings/design.ts`,dist:g.resolve(`${t}/${e.name}/js/settings/design`),ajv:q(B,Tt),validationType:M.DESIGN,sectionName:e.name},{source:`./${o}/${e.name}/settings/translations.ts`,dist:g.resolve(`${t}/${e.name}/js/settings/translations`),ajv:q(B,ut)},...e.showcaseEntryPoints.map(s=>({source:`./${o}/${e.name}/showcases/${C(s).name}.ts`,dist:g.resolve(`${t}/${e.name}/js/showcases/${C(s).name}`),ajv:q(B,s.indexOf("translations")===-1?Pt:ut)}))]})();function ks(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,d)=>c===d.findIndex(p=>`${i.instancePath}${i.message}${i.keyword}`==`${p.instancePath}${p.message}${p.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 Ls(e,t){if(e.validationType===void 0||e.sectionName===void 0)return[];const{sectionName:o,validationType:s}=e,n=G(o);return[...Ns(s,{sectionSettings:t,sectionType:n})]}async function Ps(e){const t=await H(e.dist,!1),o={},s=[];e.ajv(t)||s.push(...Qt(e.ajv.errors??[]));const n=Ls(e,t);return n.length>0&&s.push(...n),s.length>0&&(o[e.source]=s),o}async function Fs(e){const t=ko(xo.gunzip),o=await h.promises.readFile(e);return(await t(o)).length}async function Rs(e,t){const o=J[y.Server],s=g.resolve(`${o.toPath(e,t)}${o.fileName}`),n=await Fs(s);if(n>be)throw a.error(`Size of individual server file must not exceed threshold [${R(be)}]!`),a.error(`${`File: ${s}`.padEnd(s.length+10)}| ${R(n)}`),new Error("Invalid server file size")}function Gs(e){const t=e.reduce((o,s)=>{const n=So(s);return n.size>$e&&(o[s]=R(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 [${R($e)}]!`);for(const s in t)a.error(`${`File: ${s}`.padEnd(o+10)}| ${t[s]}`);throw new Error("Invalid asset file size")}}function Ms(e,t,o,s){const n={};return e(t)&&s===void 0?To(`${o}${x}.mjs`,`${o}.mjs`,()=>{}):(Oo(`${o}${x}.mjs`,()=>{}),n[g.resolve(`./templates/${C(o).name}.ts`)]=[...Qt(e.errors??[]),...s??[]]),n}async function Bs(e){const t=[];for(const o of e.sections){const s=e.sections.indexOf(o);if(s===0){const n=o.id==="header"&&o.type==="default",r=v(`${W}/${o.id}`);!n&&!r&&t.push({instancePath:`/sections/${s}/id`,message:"The first section must be a `header`",keyword:"required"})}else if(s===e.sections.length-1){const n=o.id==="footer"&&o.type==="default",r=v(`${Q}/${o.id}`);!n&&!r&&t.push({instancePath:`/sections/${s}/id`,message:"The last section must be a `footer`",keyword:"required"})}else if(o.type==="custom")if(!v(`${E}/${o.id}`))t.push({instancePath:`/sections/${s}/id`,message:"Custom section must have a corresponding block defined",keyword:"required"});else{if(o.content!==void 0)if(!v(`${E}/${o.id}/js/settings/content.mjs`))t.push({instancePath:`/sections/${s}/content`,message:"Content descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await H(`${E}/${o.id}/js/settings/content`,!1),r=new Set(Object.keys(n));Object.keys(o.content).every(i=>r.has(i))||t.push({instancePath:`/sections/${s}/content`,message:"Content descriptor must be a subset of the default content descriptor",keyword:"type"})}if(o.design!==void 0)if(!v(`${E}/${o.id}/js/settings/design.mjs`))t.push({instancePath:`/sections/${s}/design`,message:"Design descriptor is overridden, please provide a default descriptor in the block's settings folder",keyword:"required"});else{const n=await H(`${E}/${o.id}/js/settings/design`,!1),r=new Set(Object.keys(n));Object.keys(o.design).every(i=>r.has(i))||t.push({instancePath:`/sections/${s}/design`,message:"Design descriptor must be a subset of the default design descriptor",keyword:"type"})}o.showcase_id!==void 0&&(v(`${E}/${o.id}/js/showcases/${o.showcase_id}.mjs`)||t.push({instancePath:`/sections/${s}/showcase-id`,message:"Custom section must have a corresponding showcase defined in case showcase_id is specified",keyword:"required"}))}}return t.length===0?void 0:t}function qs(e){return Object.entries(u).find(t=>t[1].source===e)?.[0]}async function Us(){const e=await $("**/server.{js,ts}",{ignore:["node_modules/**","dist/**"]});return Promise.all(e.map(async t=>{const o=ho(t).split($o),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 $(`**/${s}/client.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),i=await $(`**/${s}/settings/content.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),c=await $(`**/${s}/settings/design.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),d=await $(`**/${s}/settings/layout.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),p=await $(`**/${s}/settings/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),O=await $(`**/${s}/showcases/*.{js,ts}`,{ignore:["node_modules/**","dist/**",`**/${s}/showcases/translations.{js,ts}`]}),yo=await $(`**/${s}/showcases/translations.{js,ts}`,{ignore:["node_modules/**","dist/**"]}),mo=await $(`**/${s}/assets/*`,{ignore:["node_modules/**","dist/**"]});return{name:s,type:qs(n),serverEntrypoint:t,clientEntrypoint:r.at(0),contentSettingsEntrypoint:i.at(0),designSettingsEntrypoint:c.at(0),layoutSettingsEntrypoint:d.at(0),settingsTranslationsEntrypoint:p.at(0),showcasesEntrypoints:O,showcasesTranslationsEntrypoint:yo.at(0),assetsEntrypoints:mo}}))}async function zs(){const e=await $("./templates/**.{js,ts}",{ignore:["node_modules/**","dist/**"]}),t=await $("./templates/assets/*",{ignore:["node_modules/**","dist/**"]});return{templates:e,assets:t}}async function L(e,t,o,s="SECTION"){t.length!==0&&await de({configFile:!1,...fe(De(e,t,o,s))})}function Xs(){return Promise.all([Y.rm("dist",{recursive:!0,force:!0}),Y.rm("source-code",{recursive:!0,force:!0}),Y.rm("source-code.zip",{force:!0})])}async function Vs(e){return Gs(e.assetEntryPoints),await de({configFile:!1,...fe(De(e.name,e.serverEntrypoint,T.Server,e.type))}),await Rs(e.name,e.type),await L(e.name,e.clientEntrypoint,T.Client,e.type),await L(e.name,e.settingsEntryPoints,T.SectionSetting,e.type),await L(e.name,e.showcaseEntryPoints,T.SectionShowcase,e.type),await L(e.name,e.assetEntryPoints,T.SectionAsset,e.type),await xs(e).reduce(async(t,o)=>{const s=await t,n=await Ps(o);return{...s,...n}},Promise.resolve({}))}async function Ks(e){return e.reduce(async(t,o)=>{const s=await t,n=await Vs(o);return{...s,...n}},Promise.resolve({}))}async function Hs(){const e=await zs();if(e.templates.length===0)return{};const t=await _s();return await L(void 0,e.assets,T.TemplateAsset),await L(void 0,e.templates,T.TemplateDescriptor),e.templates.reduce(async(o,s)=>{const n=await o,r=`${k}/js/${C(s).name}`,i=await H(r,!0);return{...n,...Ms(t,i,r,await Bs(i))}},Promise.resolve({}))}async function Js(){const e=new vo,t=["node_modules/**/*","dist/**/*","build/**/*",".git/**/*","**/assets/**/*","crane.config.json"],o=await $("**/*",{cwd:l(process.cwd()),ignore:t,dot:!0,nodir:!0});try{o.forEach(r=>{const i=l(process.cwd(),r);e.addLocalFile(i,C(r).dir)});const s=J[y.SourceCode].fileName,n=l(process.cwd(),s);await e.writeZipPromise(n)}catch(s){throw a.error("Error while zipping source files"),s}}async function Ys(){await Xs();try{const e=await Us().then(o=>o.map(s=>({name:s.name,type:s.type,serverEntrypoint:s.serverEntrypoint,clientEntrypoint:[s.clientEntrypoint].filter(ee).flat(),settingsEntryPoints:[s.contentSettingsEntrypoint,s.designSettingsEntrypoint,s.layoutSettingsEntrypoint,s.settingsTranslationsEntrypoint].filter(ee),showcaseEntryPoints:[...s.showcasesEntrypoints??[],s.showcasesTranslationsEntrypoint].filter(ee),assetEntryPoints:s.assetsEntrypoints??[]}))),t={...await Ks(e),...await Hs()};Object.keys(t).length===0?(await Js(),a.info("Build successful. For deploy run: npx @lightspeed/crane@latest deploy")):(a.error("Error during build:"),ks(t))}catch(e){a.error(`Error while building: ${e.message}`),process.exit(1)}}function ne(e,t){return Object.keys(e).reduce((o,s)=>{const n=e[s],r=t[s];return Ee(n)&&Ee(r)?o[s]=ne(n,r):o[s]=n,o},{...t})}function Zs({contentSettings:e,sectionType:t}){const o=Zt(t);return ne(e,o)}function Ws({designSettings:e,sectionType:t}){const o=Wt(t);return ne(e,o)}function re(e){if(e!==void 0)return e.startsWith("global.")?{type:"GLOBAL_FONT",font:e}:{type:"PRESET_FONT",font:e}}function D(e){if(e===void 0)return;if(e.startsWith("global."))return{type:"GLOBAL_COLOR",raw:e};const t=Ro(e);return{type:"STRUCTURED_COLOR",raw:e,hex:t.toHex8String(),hsl:t.toHsl(),rgba:t.toRgb(),auto:!1}}function eo(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 Qs={COLOR:"COLOR",GRADIENT:"GRADIENT"};function en(e){switch(e){case"COLOR":return"solid";case"GRADIENT":return"gradient";default:throw new Error(`Unknown background type: ${e}. Right options: ${Object.keys(Qs)}`)}}function tn(e){const t=e.style,o=e.color,s=Array.isArray(o)?o:[o,o];return e.background={type:en(t),solid:{color:D(s.at(0))},gradient:{fromColor:D(s.at(0)),toColor:D(s.at(1))}},e.style=void 0,e.color=void 0,e}const on={SOLID:"SOLID",OUTLINE:"OUTLINE",TEXT:"TEXT"};function sn(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(on)}`)}}const nn={SMALL:"SMALL",MEDIUM:"MEDIUM",LARGE:"LARGE"};function rn(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(nn)}`)}}const an={ROUND_CORNER:"ROUND_CORNER",RECTANGLE:"RECTANGLE",PILL:"PILL"};function cn(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(an)}`)}}function pn(e){const t=e.appearance;t!==void 0&&(e.appearance=sn(t));const o=e.size;o!==void 0&&(e.size=rn(o));const s=e.shape;s!==void 0&&(e.style=cn(s),e.shape=void 0);const n=e.font;e.font=re(n);const r=e.color;return e.color=D(r),e}const ln={COLOR:"COLOR",GRADIENT:"GRADIENT",NONE:"NONE"};function dn(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(ln)}`)}}function fn(e){const t=e.overlay,o=e.color,s=Array.isArray(o)?o:[o,o];return e.overlay={type:dn(t),solid:{color:D(s.at(0))},gradient:{fromColor:D(s.at(0)),toColor:D(s.at(1))}},e.color=void 0,e}function un(e){const t=e.font;e.font=re(t);const o=e.color;e.color=D(o);const s=e.size;return e.size=eo(s),e}function yn(e){const t=e.color;return e.color=D(t),e}function mn(e){const t=e.font;e.font=re(t);const o=e.color;e.color=D(o);const s=e.size;if(e.size=eo(s),e.frame!==void 0){const n=e.frame.color;e.frame.color=D(n)}return e}function ie(e,t){switch(e){case"TEXT":{un(t);break}case"BUTTON":{pn(t);break}case"IMAGE":{fn(t);break}case"BACKGROUND":{tn(t);break}case"COLOR_PICKER":{yn(t);break}case"LOGO":{mn(t);break}case"TOGGLE":case"DIVIDER":case"SELECTBOX":break;default:throw new Error(`Unknown design editor type: ${e}`)}return t}function gn(e){Object.keys(e).forEach(t=>{const o=e[t];o.type!=="DIVIDER"&&ie(o.type,o.defaults)})}function hn(e){e.forEach(t=>{t.type!==void 0&&t.defaults!==void 0&&(ie(t.type,t.defaults),t.defaults.type=t.type)})}function to(e){Object.keys(e).forEach(t=>{const o=e[t],s=o.type;ie(s,o)})}const $n=e=>`\x1B[32m${e}\x1B[0m`,bn=(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:`${R(o.value/i,2)}/s`})},En=()=>new Go.SingleBar({format:`|${$n("{bar}")}| {status} || {percentage}% || {value}/{total} Files || Speed: {speed}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591"}),Tn="https://blockbuster.ecwid.com",On="/api/v1/custom-apps/resources/sections/upload",Sn="/api/v1/custom-apps/resources/templates/upload",wn="/api/v1/custom-apps/manifests/sections",jn="/api/v1/custom-apps/manifests/templates",Dn=5,vn=3,An=[y.Server,y.Client,y.ClientChunks,y.ClientAsset,y.Asset],In=[y.Dependency,y.TemplateAsset,y.SourceCode],P={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.`};async function F(e){return(await import(pe(e).href)).default}function Cn(e,t){if(!t)return;const o=e[t];return o===void 0?{en:t}:o}function Nn(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 U(e,t){if(e&&typeof e=="object"){const o=e;for(const s in o){const n=o[s];typeof n=="string"&&n.startsWith("$")&&(o[s]=Cn(t,n)),typeof n=="object"&&U(n,t)}}}async function oo(e){await new Promise(t=>{setTimeout(t,e)})}const _n={value:0},w=En();let so=Date.now();const no=e=>2**e*500;async function xn(){const e=await me(l(f.cwd(),"crane.config.json")),t=JSON.parse(e.toString());return{appClientId:t.app_client_id,appSecretKey:btoa(t.app_secret_key)}}function kn(e){return typeof e=="object"&&e!==null&&"version"in e&&typeof e.version=="string"}async function Ln(){const e=l(f.cwd(),"package.json"),t=await me(e),o=JSON.parse(t.toString());if(kn(o))return o;throw new Error(`Package file located at path: ${e} does not contain a version field`)}async function Pn(e){const t=Po(e.version,"patch");if(t===null)throw Error("Error while incrementing app version");e.version=t,wo(l(f.cwd(),"package.json"),`${JSON.stringify(e,null,2)}
3
+ `)}async function Fn(e,t,o=E){try{const s=l(f.cwd(),`${o}/${e}/js/settings/content.mjs`),n=await F(s),r=G(e),i=Zs({contentSettings:n,sectionType:r});return U(i,t),i}catch{throw new Error(`Content descriptor for section [${e}] is either invalid or undefined`)}}async function Rn(e,t,o=E){try{const s=l(f.cwd(),`${o}/${e}/js/settings/design.mjs`),n=await F(s),r=G(e),i=Ws({designSettings:n,sectionType:r});return gn(i),U(i,t),i}catch(s){const n=s;throw new Error(`Design settings is invalid or undefined. Error ${n.stack}`)}}async function Gn(e,t,o=E){try{const s=await $("*.mjs",{cwd:l(f.cwd(),`${o}/${e}/js/showcases/`),ignore:"**/translations.mjs"});return Promise.all(s.map(async n=>{const r=l(f.cwd(),`${o}/${e}/js/showcases/${n}`),i=await F(r);return to(i.design),U(i,t),i}))}catch(s){throw new Error(`Showcases is invalid or undefined. Error ${s}`)}}async function Mn(e,t=E){try{const o=l(f.cwd(),`${t}/${e}/js/settings/layout.mjs`);if(!v(o))return[];const s=await F(o);return s.forEach(n=>hn(n.selectedDesignSettings)),s}catch{throw new Error(`Layout descriptor for section [${e}] is either invalid or undefined`)}}async function ro(e){const t=l(f.cwd(),e),o=await F(t);return Nn(o)}async function Bn(e,t=E){return ro(`${t}/${e}/js/settings/translations.mjs`)}async function io(e,t=E){return ro(`${t}/${e}/js/showcases/translations.mjs`)}async function ae(e,t){const o=await Bn(e,u[t].dist),s=await io(e,u[t].dist),n=await Fn(e,o,u[t].dist),r=await Rn(e,o,u[t].dist),i=await Gn(e,s,u[t].dist),c=await Mn(e,u[t].dist);return{id:e,type:t,name:{en:e},contentEditors:n,designEditors:r,layouts:c,showcases:i}}async function qn(){const e=await $("*/",{cwd:l(f.cwd(),`${E}/`)}),t=await $("*/",{cwd:l(f.cwd(),`${W}/`)}),o=await $("*/",{cwd:l(f.cwd(),`${Q}/`)});return Promise.all([...e.map(async s=>ae(s,"SECTION")),...t.map(async s=>ae(s,"HEADER")),...o.map(async s=>ae(s,"FOOTER"))])}async function Un(e){try{return await F(l(f.cwd(),e))}catch{throw new Error(`Template descriptor [${e}] is either invalid or undefined`)}}async function zn(e){const t=await $(`${k}/js/**.mjs`,{ignore:[`${k}/js/**${x}.mjs`]});return Promise.all(t.map(async o=>{const s=await Un(o),n=s.sections.filter(r=>r.type==="custom");for(const r of n){const i=G(r.id),c=await io(r.id,u[i].dist);r.showcase_overrides!==void 0&&(U(r.showcase_overrides,c),to(r.showcase_overrides.design))}return{id:`${e}_${C(o).name}`,descriptor:s}}))}function ao(e,t){const o=e.pathContext,s=o.toPath(e.currentSection,t),n=s===void 0?le(o.fileName):le(o.fileName,{cwd:l(f.cwd(),s),ignore:o.ignore});return(o.isSingleton?n.splice(0):n).map(r=>({url:r,subType:t,context:e}))}function Xn(e){return e instanceof ge&&(e.code==="ECONNRESET"||e.response?.status!==void 0&&e.response?.status>=500&&e.response?.status<600)}function co(e,t){return e<vn&&Xn(t)}function po(e,t,o,s){const n={value:0},r=e.config.app.templates.length>0?Sn:On;return e.config.axios.post(r,{file:jo(l(f.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},...!["dependencies","source_code"].includes(e.pathContext.type)&&{fileName:t}},headers:{"Content-Type":"multipart/form-data",Authorization:`Bearer ${e.config.app.crane.appSecretKey}`},onUploadProgress:i=>bn(i,w,_n,n,so)}).then(i=>(w.increment(),i)).catch(async i=>{if(co(s,i))return await oo(no(s)),po(e,t,o,s+1);throw w.increment(),i})}function Vn(e){return w.start(e.length+1,0,{speed:"N/A",status:"Deployment in progress"}),e.map(t=>{const o=t.context,s=o.pathContext.toPath(o.currentSection,t.subType);return po(o,t.url,s,0)})}function Kn(e){const t=e.app.sections.flatMap(s=>An.flatMap(n=>{const r={config:e,currentSection:s.id,pathContext:J[n]};return ao(r,s.type)})),o=In.flatMap(s=>ao({config:e,pathContext:J[s]},"SECTION"));return Vn([...t,...o])}function Hn(e){return e.includes(`
4
+ `)}function Jn(e,t,o){return e.split(`
5
5
  `).map((s,n)=>n>=o?t+s:s).join(`
6
- `)}function ce(e,t){const o=[];if(e instanceof ge){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=zn(r.errorMessage)?Xn(r.errorMessage," ",1):r.errorMessage;o.push(` Error Message: ${i}`)}}const s=o.length>0?o.join(`
6
+ `)}function z(e,t){const o=[];if(e instanceof ge){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=Hn(r.errorMessage)?Jn(r.errorMessage," ",1):r.errorMessage;o.push(` Error Message: ${i}`)}}const s=o.length>0?o.join(`
7
7
  `):e?.message??"Unknown error";if(!t||t.length===0)return s;const n=o.length>0?`
8
- `:" ";return`${t}${n}${s}`}async function co(e,t=0){const o=e.app.templates.length>0?Tn:En;return e.axios.post(o,{version:e.app.packageJson.version,name:"Custom Block App",blocks:e.app.sections,templates:e.app.templates,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(ro(t,s))return await io(t),co(e,t+1);throw s})}async function Kn(e){try{A(l(d.cwd(),$))||(a.error(J.DISTRIBUTION_FOLDER_NOT_FOUND($)),d.exit(1));const t=e??hn;a.info("Custom application deployment :: Started");const o=Lo.create({baseURL:t});Po(o,On),a.info("Loading configuration files ...");const s=await Promise.all([An(),Cn(),kn(),Mn()]).then(([i,c,y,p])=>({axios:o,app:{crane:i,packageJson:c,sections:y,templates:p}}));a.info("Uploading files ..."),to=Date.now(),await Promise.all(qn(s)).catch(i=>{S.stop(),a.error(ce(i,J.ASSET_FILES_UPLOAD)),d.exit(1)}).finally(()=>{S.increment(),S.stop()}),S.update({speed:"N/A",status:"Finalising deployment"}),await co(s).catch(i=>{S.stop(),a.error(ce(i,J.MANIFEST_DEPLOYMENT)),d.exit(1)}).finally(()=>{S.increment(),S.stop()});const n=s.app.sections.map(i=>i.id),r=s.app.packageJson.version;a.info(`Custom application deployment :: Successful
9
- Current app version: ${r}
10
- Deployed sections: ${n.join(", ")}`),await _n(s.app.packageJson),s.app.templates.length>0&&a.info(`Deployed templates: ${s.app.templates.map(i=>i.id).join(", ")}`)}catch(t){S.stop(),a.error(ce(t,J.DEFAULT)),d.exit(1)}}const Hn="1.1.3";async function Vn(e){oe(),te("template/headers/example-header","headers",e,"Header")}async function Jn(e){oe(),te("template/footers/example-footer","footers",e,"Footer")}const O=yo("crane");function po(e){if(Mo(e))return console.log("Please specify a name for your resource."),!1;const{isValid:t,errorMessage:o}=Go(e);return o&&console.log(o),t}async function lo(e,t,o,s){const n=(await pe({type:"text",name:"name",message:`Please specify a name for your ${e}:`})).name;if(n===void 0)return console.log(`You can use ${t} to directly specify the name of the ${e}.`),O.outputHelp();const r=m.basename(n);return po(r)?o(r,s):lo(e,t,o,s)}async function z(e,t,o,s,n){if(s!==void 0)if(!po(s))await lo(e,t,o);else{const r=m.basename(s.toString());await o(r,n)}}function Yn(){O.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. "),O.command("build","Builds your resource code").action(Ks),O.command("deploy","Deploys your resource code into Ecwid"),O.on("command:*",()=>{console.error("Invalid command: %s",O.args.join(" ")),O.outputHelp(),process.exit(1)}),O.on("command:init",async({cli:{options:e}})=>{const{app:t,section:o,header:s,footer:n,template:r,customHeadersFooters:i,referenceTemplate:c}=e,y=!!i;await z("app",L("init --app <name>"),Bo,t),await z("section",L("init --section <name>"),qo,o),await z("header",L("init --header <name>"),Vn,s),await z("footer",L("init --footer <name>"),Jn,n),await z("template",L("init --template <name>"),zo,r,y),c&&Xo()}),O.on("command:deploy",()=>Kn(O.options.url)),O.help(),O.usage("<action> <resource>"),O.version(Hn),O.parse()}try{Yn()}catch(e){console.error(e)}
8
+ `:" ";return`${t}${n}${s}`}async function lo(e,t=0){const o=e.app.templates.length>0?jn:wn;return e.axios.post(o,{version:e.app.packageJson.version,name:"Custom Block App",blocks:e.app.sections,templates:e.app.templates,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(co(t,s))return await oo(no(t)),lo(e,t+1);throw s})}async function Yn(e){try{if(!v(l(f.cwd(),E)))throw new Error(P.DISTRIBUTION_FOLDER_NOT_FOUND(E));const t=e??Tn;a.info("Custom application deployment :: Started");const o=Lo.create({baseURL:t});Fo(o,Dn),a.info("Loading configuration files ...");const s=await Promise.all([xn(),Ln(),qn()]).then(async([i,c,d])=>({axios:o,app:{crane:i,packageJson:c,sections:d,templates:await zn(i.appClientId)}}));a.info("Uploading files ..."),so=Date.now(),await Promise.all(Kn(s)).catch(i=>{w.stop(),i.response?.status===404?a.error(z(i,P.DEPRECATED_VERSION_DEPLOYMENT)):a.error(z(i,P.ASSET_FILES_UPLOAD)),f.exit(1)}).finally(()=>{w.increment(),w.stop()}),w.update({speed:"N/A",status:"Finalising deployment"}),await lo(s).catch(i=>{w.stop(),i.response?.status===404?a.error(z(i,P.DEPRECATED_VERSION_DEPLOYMENT)):a.error(z(i,P.MANIFEST_DEPLOYMENT)),f.exit(1)}).finally(()=>{w.increment(),w.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 Pn(s.app.packageJson),s.app.templates.length>0&&a.info(`Deployed templates: ${s.app.templates.map(i=>i.id).join(", ")}`)}catch(t){w.stop(),a.error(z(t,P.DEFAULT)),f.exit(1)}}const Zn="1.2.0";async function Wn(e){oe(),te("template/headers/example-header","headers",e,"Header")}async function Qn(e){oe(),te("template/footers/example-footer","footers",e,"Footer")}const er={deploy:["url"]};function tr(e,t){return e.options.length!==0&&Object.keys(t).length===1}function or(e){return e.includes("-h")||e.includes("--help")}function sr(e,t){return Object.keys(t).some(o=>o!=="--"&&!e.hasOption(o)&&!er[e.rawName]?.includes(o))}function nr(e){return e.length!==0}function rr(e,t,o){return e.matchedCommand!==void 0&&(tr(e.matchedCommand,o)||or(e.rawArgs)||sr(e.matchedCommand,e.options)||nr(t))}function ir(e,t,o){e.matchedCommand&&!rr(e,t,o)?e.runMatchedCommand():e.outputHelp()}function fo(e){if(qo(e))return console.log("Please specify a name for your resource."),!1;const{isValid:t,errorMessage:o}=Bo(e);return o&&console.log(o),t}async function uo(e,t,o,s,n){const r=(await ce({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=g.basename(r);return fo(i)?s(i,n):uo(e,t,o,s,n)}async function X(e,t,o,s,n,r){if(n!==void 0)if(!fo(n))await uo(e,t,o,s);else{const i=g.basename(n.toString());await s(i,r)}}async function ar(e,t){try{const{app:o,section:s,header:n,footer:r,template:i,customHeadersFooters:c,referenceTemplate:d}=e,p=!!c;await X(t,"app",N("init --app <name>"),Xo,o),await X(t,"section",N("init --section <name>"),Ko,s),await X(t,"header",N("init --header <name>"),Wn,n),await X(t,"footer",N("init --footer <name>"),Qn,r),await X(t,"template",N("init --template <name>"),Ho,i,p),d&&await Jo()}catch(o){a.error(`Error while executing init operation: ${o.message}`),process.exit(1)}}function cr(){try{const e=go("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. ").action(async o=>ar(o,e)),e.command("build","Builds your resource code").action(Ys),e.command("deploy","Deploys your resource code").allowUnknownOptions().action(()=>Yn(e.options.url)),e.version(Zn),e.usage("<action> <resource>");const t=e.parse(process.argv,{run:!1});ir(e,t.args,t.options)}catch(e){a.error(`Error while parsing input: ${e.message}`),process.exit(1)}}export{cr as run};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightspeed/crane",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "type": "module",
5
5
  "bin": "bin/crane.js",
6
6
  "main": "./dist/app.mjs",
@@ -19,7 +19,8 @@
19
19
  "bin",
20
20
  "dist",
21
21
  "template",
22
- "types.d.ts"
22
+ "types.d.ts",
23
+ "CHANGELOG.md"
23
24
  ],
24
25
  "scripts": {
25
26
  "dev": "unbuild --stub",
@@ -59,7 +60,7 @@
59
60
  "adm-zip": "^0.5.16",
60
61
  "ajv": "^8.12.0",
61
62
  "ajv-formats": "^2.1.1",
62
- "axios": "^1.7.7",
63
+ "axios": "^1.8.2",
63
64
  "axios-concurrency": "^1.0.4",
64
65
  "cac": "^6.7.14",
65
66
  "cli-progress": "^3.12.0",
@@ -87,6 +88,9 @@
87
88
  "eslint": {
88
89
  "file-entry-cache": "8.0.0"
89
90
  },
91
+ "axios-concurrency": {
92
+ "axios": "1.8.2"
93
+ },
90
94
  "magic-string": "0.30.10",
91
95
  "glob": "^9.3.5",
92
96
  "stylus": "^0.63.0"
@@ -3,7 +3,7 @@ export default {
3
3
  previewImage: {
4
4
  set: {
5
5
  ORIGINAL: {
6
- url: 'custom_section_showcase_2_preview.png',
6
+ url: 'example_header_showcase_1_preview.png',
7
7
  },
8
8
  },
9
9
  },
@@ -7,10 +7,9 @@
7
7
  "deploy": "crane build && crane deploy"
8
8
  },
9
9
  "dependencies": {
10
- "@lightspeed/crane": "1.2.0",
11
- "@lightspeed/eslint-config-crane": "1.0.2",
12
- "vue": "^3.4.0",
13
- "@ecwid/sdk": "^0.8.0"
10
+ "@lightspeed/crane": "latest",
11
+ "@lightspeed/eslint-config-crane": "latest",
12
+ "vue": "^3.4.0"
14
13
  },
15
14
  "engines": {
16
15
  "node": ">=20"
@@ -9,7 +9,10 @@ export default {
9
9
  label: '$label.section_description.label',
10
10
  placeholder: '$label.section_description.placeholder',
11
11
  },
12
-
12
+ divider: {
13
+ type: 'DIVIDER',
14
+ label: '$label.divider.label',
15
+ },
13
16
  images: {
14
17
  type: 'DECK',
15
18
  label: '$label.images.deck_title',
@@ -27,6 +27,10 @@ export default {
27
27
  visible: true,
28
28
  },
29
29
  },
30
+ divider: {
31
+ type: 'DIVIDER',
32
+ label: '$label.divider.label',
33
+ },
30
34
  image_text: {
31
35
  type: 'TEXT',
32
36
  label: '$label.image_text.label',
package/types.d.ts CHANGED
@@ -367,6 +367,7 @@ type MapEditorDesignTypes = {
367
367
  readonly BACKGROUND: string;
368
368
  readonly COLOR_PICKER: string;
369
369
  readonly LOGO: string;
370
+ readonly DIVIDER: string;
370
371
  };
371
372
 
372
373
  interface TextDesignEditor {
@@ -416,15 +417,21 @@ interface LogoDesignEditor {
416
417
  defaults: Record<string, unknown>;
417
418
  }
418
419
 
420
+ interface DividerDesignEditor {
421
+ readonly type: 'DIVIDER';
422
+ readonly label: string | Record<string, string>;
423
+ }
424
+
419
425
  type DesignEditor =
420
- TextDesignEditor
421
- | ButtonDesignEditor
422
- | ImageDesignEditor
423
- | ToggleDesignEditor
424
- | SelectboxDesignEditor
425
- | BackgroundDesignEditor
426
- | ColorPickerDesignEditor
427
- | LogoDesignEditor;
426
+ TextDesignEditor
427
+ | ButtonDesignEditor
428
+ | ImageDesignEditor
429
+ | ToggleDesignEditor
430
+ | SelectboxDesignEditor
431
+ | BackgroundDesignEditor
432
+ | ColorPickerDesignEditor
433
+ | LogoDesignEditor
434
+ | DividerDesignEditor;
428
435
 
429
436
  type InferDesignType<T extends Record<string, DesignEditor>> = {
430
437
  readonly [P in keyof T]: MapEditorDesignTypes[T[P]['type']]