@ikas/storefront-cmd 4.0.0-alpha.49 → 4.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/ikas.cjs +2 -1
  2. package/package.json +6 -6
  3. package/{build/index.d.ts → src/index.ts} +4 -3
  4. package/src/scripts/generators/api/index.ts +27 -0
  5. package/src/scripts/generators/api/info.ts +47 -0
  6. package/src/scripts/generators/components/index.ts +244 -0
  7. package/src/scripts/generators/config/content.ts +168 -0
  8. package/src/scripts/generators/config/index.ts +106 -0
  9. package/{build/scripts/generators/index.d.ts → src/scripts/generators/index.ts} +6 -6
  10. package/src/scripts/generators/pages/index.ts +102 -0
  11. package/src/scripts/generators/pages/info.ts +161 -0
  12. package/src/scripts/generators/theme/index.ts +63 -0
  13. package/src/scripts/generators/types/index.ts +520 -0
  14. package/src/scripts/ikas.ts +45 -0
  15. package/src/scripts/theme-build/index.ts +99 -0
  16. package/src/utils/fs.ts +93 -0
  17. package/src/utils/helper.ts +20 -0
  18. package/build/_virtual/_cloneBuffer.js +0 -1
  19. package/build/_virtual/_commonjsHelpers.js +0 -1
  20. package/build/_virtual/_nodeUtil.js +0 -1
  21. package/build/_virtual/isBuffer.js +0 -1
  22. package/build/index.js +0 -1
  23. package/build/scripts/generators/api/index.d.ts +0 -5
  24. package/build/scripts/generators/api/index.js +0 -1
  25. package/build/scripts/generators/api/info.d.ts +0 -12
  26. package/build/scripts/generators/api/info.js +0 -1
  27. package/build/scripts/generators/components/index.d.ts +0 -11
  28. package/build/scripts/generators/components/index.js +0 -1
  29. package/build/scripts/generators/config/content.d.ts +0 -58
  30. package/build/scripts/generators/config/content.js +0 -1
  31. package/build/scripts/generators/config/index.d.ts +0 -9
  32. package/build/scripts/generators/config/index.js +0 -1
  33. package/build/scripts/generators/pages/index.d.ts +0 -7
  34. package/build/scripts/generators/pages/index.js +0 -1
  35. package/build/scripts/generators/pages/info.d.ts +0 -14
  36. package/build/scripts/generators/pages/info.js +0 -1
  37. package/build/scripts/generators/theme/index.d.ts +0 -6
  38. package/build/scripts/generators/theme/index.js +0 -1
  39. package/build/scripts/generators/types/index.d.ts +0 -19
  40. package/build/scripts/generators/types/index.js +0 -1
  41. package/build/scripts/ikas.d.ts +0 -1
  42. package/build/scripts/theme-build/index.d.ts +0 -3
  43. package/build/scripts/theme-build/index.js +0 -1
  44. package/build/utils/fs.d.ts +0 -28
  45. package/build/utils/fs.js +0 -1
  46. package/build/utils/helper.d.ts +0 -2
  47. package/build/utils/helper.js +0 -1
@@ -0,0 +1,520 @@
1
+ import {
2
+ IkasThemeJson,
3
+ IkasThemeJsonComponent,
4
+ IkasThemeJsonComponentProp,
5
+ IkasThemeJsonComponentPropType,
6
+ IkasThemeJsonCustomData,
7
+ } from "@ikas/storefront-models";
8
+ import path from "path";
9
+ import { createFile, deleteDirContent } from "../../../utils/fs";
10
+ import _uniq from "lodash/uniq";
11
+
12
+ type File = {
13
+ content: string;
14
+ imports: string[];
15
+ internalCustomDatas: IkasThemeJsonCustomData[];
16
+ };
17
+
18
+ export class CustomDataTypesGenerator {
19
+ static async generate(themeJson: IkasThemeJson) {
20
+ await deleteDirContent(
21
+ path.join(process.cwd(), "src", "components", "__generated__", "types")
22
+ );
23
+ const file: File = {
24
+ content: "",
25
+ imports: [],
26
+ internalCustomDatas: [],
27
+ };
28
+
29
+ try {
30
+ themeJson.customData.forEach((customData) => {
31
+ CustomDataTypesGenerator.generateAllCustomDataTypes(
32
+ customData,
33
+ file,
34
+ themeJson
35
+ );
36
+ });
37
+
38
+ let lengthBefore = 0;
39
+ let lengthAfter = 0;
40
+
41
+ do {
42
+ lengthBefore = file.internalCustomDatas.length;
43
+ file.internalCustomDatas.forEach((customData) => {
44
+ CustomDataTypesGenerator.generateAllCustomDataTypes(
45
+ customData,
46
+ file,
47
+ themeJson
48
+ );
49
+ });
50
+ lengthAfter = file.internalCustomDatas.length;
51
+
52
+ if (lengthAfter !== lengthBefore) {
53
+ file.internalCustomDatas = file.internalCustomDatas.splice(
54
+ lengthBefore,
55
+ lengthAfter
56
+ );
57
+ }
58
+ } while (lengthBefore !== lengthAfter);
59
+
60
+ await PropTypeGenarator.generate(themeJson, file);
61
+
62
+ const generatedFolderPath = path.join(
63
+ process.cwd(),
64
+ "src",
65
+ "components",
66
+ "__generated__"
67
+ );
68
+
69
+ file.imports = _uniq(file.imports);
70
+ let importStr = `import {\r\n`;
71
+ file.imports.forEach((i) => {
72
+ importStr += `\t${i},\r\n`;
73
+ });
74
+ importStr += `} from "@ikas/storefront"\r\n\r\n`;
75
+
76
+ const finalFile = importStr + file.content;
77
+
78
+ return await createFile(generatedFolderPath, "types.ts", finalFile);
79
+ } catch (error) {
80
+ console.log(error);
81
+ return false;
82
+ }
83
+ }
84
+
85
+ static generateAllCustomDataTypes(
86
+ customData: IkasThemeJsonCustomData,
87
+ file: File,
88
+ themeJson: IkasThemeJson
89
+ ) {
90
+ const isEnum = customData.type === IkasThemeJsonComponentPropType.ENUM;
91
+ const exportTypeStr = `export ${
92
+ isEnum ? "enum" : "type"
93
+ } ${CustomDataTypesGenerator.generateTypeName(customData)}${
94
+ isEnum ? "" : " = "
95
+ }{ \r\n`;
96
+
97
+ const closeExportTypeStr = `};\r\n\r\n`;
98
+
99
+ if (
100
+ (customData.type === IkasThemeJsonComponentPropType.DYNAMIC_LIST ||
101
+ customData.type === IkasThemeJsonComponentPropType.STATIC_LIST) &&
102
+ customData.nestedData
103
+ ) {
104
+ CustomDataTypesGenerator.generateAllCustomDataTypes(
105
+ customData.nestedData[0],
106
+ file,
107
+ themeJson
108
+ );
109
+ } else if (
110
+ customData.type === IkasThemeJsonComponentPropType.ENUM &&
111
+ !!customData.enumOptions
112
+ ) {
113
+ file.content += exportTypeStr;
114
+ customData.enumOptions.forEach((enumOption) => {
115
+ let leftValue = enumOption.value;
116
+
117
+ if (enumOption.value && !isNaN(parseInt(enumOption.value))) {
118
+ leftValue = "_" + enumOption.value;
119
+ }
120
+
121
+ file.content += `\t"${leftValue}" = "${enumOption?.value}",`;
122
+ file.content += `\r\n`;
123
+ });
124
+ file.content += closeExportTypeStr;
125
+ } else {
126
+ file.content += exportTypeStr;
127
+ if (!!customData.nestedData) {
128
+ customData.nestedData.forEach((nestedData) => {
129
+ CustomDataTypesGenerator.genenateCustomDataType(
130
+ nestedData,
131
+ file,
132
+ themeJson
133
+ );
134
+ file.content += `\r\n`;
135
+ });
136
+ }
137
+
138
+ file.content += closeExportTypeStr;
139
+ }
140
+ }
141
+
142
+ static genenateCustomDataType(
143
+ customData: IkasThemeJsonCustomData,
144
+ file: File,
145
+ themeJson: IkasThemeJson
146
+ ) {
147
+ const type = CustomDataTypesGenerator.getType(customData, file, themeJson);
148
+
149
+ if (customData.key && customData.key[0].match(/^\d/)) {
150
+ customData.key = "_" + customData.key;
151
+ }
152
+
153
+ file.content += `\t${customData.key}${
154
+ !customData.isRequired ? "?" : ""
155
+ }: ${type}${
156
+ [
157
+ IkasThemeJsonComponentPropType.DYNAMIC_LIST,
158
+ IkasThemeJsonComponentPropType.STATIC_LIST,
159
+ ].includes(customData.type)
160
+ ? "[]"
161
+ : ""
162
+ }${customData.type === IkasThemeJsonComponentPropType.ENUM ? "," : ";"}`;
163
+ }
164
+
165
+ static getType(
166
+ customData: IkasThemeJsonCustomData,
167
+ file: File,
168
+ themeJson: IkasThemeJson
169
+ ) {
170
+ let type = "";
171
+ switch (customData.type) {
172
+ case IkasThemeJsonComponentPropType.TEXT:
173
+ case IkasThemeJsonComponentPropType.RICH_TEXT:
174
+ case IkasThemeJsonComponentPropType.COLOR:
175
+ type = "string";
176
+ break;
177
+ case IkasThemeJsonComponentPropType.BOOLEAN:
178
+ type = "boolean";
179
+ break;
180
+ case IkasThemeJsonComponentPropType.IMAGE:
181
+ type = "IkasImage";
182
+ file.imports.push(type);
183
+ break;
184
+ case IkasThemeJsonComponentPropType.IMAGE_LIST:
185
+ type = "IkasImage[]";
186
+ file.imports.push("IkasImage");
187
+ break;
188
+ case IkasThemeJsonComponentPropType.LINK:
189
+ type = "IkasNavigationLink";
190
+ file.imports.push(type);
191
+ break;
192
+ case IkasThemeJsonComponentPropType.LIST_OF_LINK:
193
+ type = "IkasNavigationLink[]";
194
+ file.imports.push("IkasNavigationLink");
195
+ break;
196
+ case IkasThemeJsonComponentPropType.PRODUCT_DETAIL:
197
+ type = "IkasProduct";
198
+ file.imports.push(type);
199
+ break;
200
+ case IkasThemeJsonComponentPropType.PRODUCT_LIST:
201
+ type = "IkasProductList";
202
+ file.imports.push("IkasProductList");
203
+ break;
204
+ case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE:
205
+ type = "IkasProductAttribute";
206
+ file.imports.push(type);
207
+ break;
208
+ case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE_LIST:
209
+ type = "IkasProductAttribute[]";
210
+ file.imports.push("IkasProductAttribute");
211
+ break;
212
+
213
+ case IkasThemeJsonComponentPropType.BRAND:
214
+ type = "IkasBrand";
215
+ file.imports.push(type);
216
+ break;
217
+ case IkasThemeJsonComponentPropType.BRAND_LIST:
218
+ type = "IkasBrandList";
219
+ file.imports.push(type);
220
+ break;
221
+ case IkasThemeJsonComponentPropType.CATEGORY:
222
+ type = "IkasCategory";
223
+ file.imports.push(type);
224
+ break;
225
+ case IkasThemeJsonComponentPropType.CATEGORY_LIST:
226
+ type = "IkasCategoryList";
227
+ file.imports.push(type);
228
+ break;
229
+ case IkasThemeJsonComponentPropType.CUSTOM:
230
+ const cd = themeJson.customData.find(
231
+ (cd) => cd.id === customData.customDataId
232
+ );
233
+ if (cd) type = CustomDataTypesGenerator.generateTypeName(cd);
234
+ break;
235
+ case IkasThemeJsonComponentPropType.COMPONENT:
236
+ type = "IkasComponentRenderer";
237
+ file.imports.push(type);
238
+ break;
239
+ case IkasThemeJsonComponentPropType.COMPONENT_LIST:
240
+ type = "IkasComponentRenderer[]";
241
+ file.imports.push("IkasComponentRenderer");
242
+ break;
243
+ case IkasThemeJsonComponentPropType.BLOG:
244
+ type = "IkasBlog";
245
+ file.imports.push(type);
246
+ break;
247
+ case IkasThemeJsonComponentPropType.BLOG_LIST:
248
+ type = "IkasBlogList";
249
+ file.imports.push(type);
250
+ break;
251
+ case IkasThemeJsonComponentPropType.BLOG_CATEGORY:
252
+ type = "IkasBlogCategory";
253
+ file.imports.push(type);
254
+ break;
255
+ case IkasThemeJsonComponentPropType.BLOG_CATEGORY_LIST:
256
+ type = "IkasBlogCategoryList";
257
+ file.imports.push(type);
258
+ break;
259
+ case IkasThemeJsonComponentPropType.RAFFLE:
260
+ type = "IkasRaffle";
261
+ file.imports.push(type);
262
+ break;
263
+ case IkasThemeJsonComponentPropType.RAFFLE_LIST:
264
+ type = "IkasRaffleList";
265
+ file.imports.push(type);
266
+ break;
267
+ case IkasThemeJsonComponentPropType.SLIDER:
268
+ type = "IkasSlider";
269
+ file.imports.push(type);
270
+ break;
271
+
272
+ case IkasThemeJsonComponentPropType.ENUM:
273
+ type = CustomDataTypesGenerator.generateTypeName(customData);
274
+ if (!file.content.includes(`export enum ${type}`)) {
275
+ file.internalCustomDatas.push(customData);
276
+ }
277
+ break;
278
+ case IkasThemeJsonComponentPropType.OBJECT:
279
+ type = CustomDataTypesGenerator.generateTypeName(customData);
280
+ break;
281
+ case IkasThemeJsonComponentPropType.DYNAMIC_LIST:
282
+ case IkasThemeJsonComponentPropType.STATIC_LIST:
283
+ if (customData.nestedData) {
284
+ if (
285
+ customData.nestedData[0].type ===
286
+ IkasThemeJsonComponentPropType.OBJECT ||
287
+ customData.nestedData[0].type ===
288
+ IkasThemeJsonComponentPropType.ENUM
289
+ ) {
290
+ type = CustomDataTypesGenerator.generateTypeName(
291
+ customData.nestedData[0]
292
+ );
293
+ if (!file.content.includes(`export type ${type}`)) {
294
+ file.internalCustomDatas.push(customData.nestedData[0]);
295
+ }
296
+ } else {
297
+ type = CustomDataTypesGenerator.getType(
298
+ customData.nestedData[0],
299
+ file,
300
+ themeJson
301
+ );
302
+ }
303
+ }
304
+
305
+ break;
306
+ default:
307
+ break;
308
+ }
309
+ return type;
310
+ }
311
+
312
+ static generateTypeName(customData: IkasThemeJsonCustomData) {
313
+ if (customData.typescriptName) return customData.typescriptName;
314
+
315
+ let displayName = customData.name || "";
316
+ displayName = displayName.replace(/\s/g, ""); // removes whitespace
317
+ displayName = displayName.replace(/\W/g, ""); // removes non-alphabetic characters
318
+
319
+ if (displayName[0].match(/^\d/)) displayName = "_" + displayName; // if first char is a number add (_)
320
+ if (customData.type === IkasThemeJsonComponentPropType.ENUM)
321
+ displayName += "Enum";
322
+
323
+ return displayName;
324
+ }
325
+ }
326
+
327
+ export class PropTypeGenarator {
328
+ static async generate(themeJson: IkasThemeJson, file: File) {
329
+ const components = themeJson.components;
330
+ components.forEach((component) => {
331
+ if (component.props.length > 0 && component.id !== "checkout") {
332
+ file.content += `export type ${PropTypeGenarator.generatePropTypeName(
333
+ component
334
+ )}Props = {\n`;
335
+ component.props.forEach((prop) => {
336
+ file.content += `\t${prop.name}: ${PropTypeGenarator.getType(
337
+ prop,
338
+ themeJson,
339
+ file
340
+ )};\n`;
341
+ });
342
+
343
+ file.content += `};\r\n\r\n`;
344
+ }
345
+ });
346
+ }
347
+
348
+ static getType(
349
+ prop: IkasThemeJsonComponentProp,
350
+ themeJson: IkasThemeJson,
351
+ file: File
352
+ ) {
353
+ let type = "";
354
+ switch (prop.type) {
355
+ case IkasThemeJsonComponentPropType.TEXT:
356
+ case IkasThemeJsonComponentPropType.RICH_TEXT:
357
+ case IkasThemeJsonComponentPropType.COLOR:
358
+ type = "string";
359
+ break;
360
+ case IkasThemeJsonComponentPropType.BOOLEAN:
361
+ type = "boolean";
362
+ break;
363
+ case IkasThemeJsonComponentPropType.IMAGE:
364
+ type = "IkasImage";
365
+ file.imports.push(type);
366
+ break;
367
+ case IkasThemeJsonComponentPropType.IMAGE_LIST:
368
+ type = "IkasImage[]";
369
+ file.imports.push("IkasImage");
370
+ break;
371
+ case IkasThemeJsonComponentPropType.LINK:
372
+ type = "IkasNavigationLink";
373
+ file.imports.push(type);
374
+ break;
375
+ case IkasThemeJsonComponentPropType.LIST_OF_LINK:
376
+ type = "IkasNavigationLink[]";
377
+ file.imports.push("IkasNavigationLink");
378
+ break;
379
+ case IkasThemeJsonComponentPropType.PRODUCT_DETAIL:
380
+ type = "IkasProduct";
381
+ file.imports.push(type);
382
+ break;
383
+ case IkasThemeJsonComponentPropType.PRODUCT_LIST:
384
+ type = "IkasProductList";
385
+ file.imports.push("IkasProductList");
386
+ break;
387
+ case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE:
388
+ type = "IkasProductAttribute";
389
+ file.imports.push(type);
390
+ break;
391
+ case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE_LIST:
392
+ type = "IkasProductAttribute[]";
393
+ file.imports.push("IkasProductAttribute");
394
+ break;
395
+
396
+ case IkasThemeJsonComponentPropType.BRAND:
397
+ type = "IkasBrand";
398
+ file.imports.push(type);
399
+ break;
400
+ case IkasThemeJsonComponentPropType.BRAND_LIST:
401
+ type = "IkasBrandList";
402
+ file.imports.push(type);
403
+ break;
404
+ case IkasThemeJsonComponentPropType.CATEGORY:
405
+ type = "IkasCategory";
406
+ file.imports.push(type);
407
+ break;
408
+ case IkasThemeJsonComponentPropType.CATEGORY_LIST:
409
+ type = "IkasCategoryList";
410
+ file.imports.push(type);
411
+ break;
412
+ case IkasThemeJsonComponentPropType.CUSTOM:
413
+ const cd = themeJson.customData.find(
414
+ (cd) => cd.id === prop.customDataId
415
+ );
416
+
417
+ if (cd) {
418
+ type = CustomDataTypesGenerator.getType(cd, file, themeJson);
419
+ if (
420
+ cd.type === IkasThemeJsonComponentPropType.DYNAMIC_LIST ||
421
+ cd.type === IkasThemeJsonComponentPropType.STATIC_LIST
422
+ ) {
423
+ type += "[]";
424
+ }
425
+ }
426
+ break;
427
+ case IkasThemeJsonComponentPropType.COMPONENT:
428
+ type = "IkasComponentRenderer";
429
+ file.imports.push(type);
430
+ break;
431
+ case IkasThemeJsonComponentPropType.COMPONENT_LIST:
432
+ type = "IkasComponentRenderer[]";
433
+ file.imports.push("IkasComponentRenderer");
434
+ break;
435
+ case IkasThemeJsonComponentPropType.BLOG:
436
+ type = "IkasBlog";
437
+ file.imports.push(type);
438
+ break;
439
+ case IkasThemeJsonComponentPropType.BLOG_LIST:
440
+ type = "IkasBlogList";
441
+ file.imports.push(type);
442
+ break;
443
+ case IkasThemeJsonComponentPropType.BLOG_CATEGORY:
444
+ type = "IkasBlogCategory";
445
+ file.imports.push(type);
446
+ break;
447
+ case IkasThemeJsonComponentPropType.BLOG_CATEGORY_LIST:
448
+ type = "IkasBlogCategoryList";
449
+ file.imports.push(type);
450
+ break;
451
+ case IkasThemeJsonComponentPropType.RAFFLE:
452
+ type = "IkasRaffle";
453
+ file.imports.push(type);
454
+ break;
455
+ case IkasThemeJsonComponentPropType.RAFFLE_LIST:
456
+ type = "IkasRaffleList";
457
+ file.imports.push(type);
458
+ break;
459
+ case IkasThemeJsonComponentPropType.SLIDER:
460
+ type = "IkasSlider";
461
+ file.imports.push(type);
462
+ break;
463
+
464
+ // case IkasThemeJsonComponentPropType.ENUM:
465
+ // const enumCd = themeJson.customData.find(
466
+ // (cd) => cd.id === prop.customDataId
467
+ // );
468
+ // if (enumCd) type = CustomDataTypesGenerator.generateTypeName(enumCd);
469
+ // break;
470
+ // case IkasThemeJsonComponentPropType.DYNAMIC_LIST:
471
+ // case IkasThemeJsonComponentPropType.STATIC_LIST:
472
+ // const listCD = themeJson.customData.find(
473
+ // (cd) => cd.id === prop.customDataId
474
+ // );
475
+ // if (listCD?.nestedData) {
476
+ // if (
477
+ // listCD.nestedData[0].type === IkasThemeJsonComponentPropType.OBJECT ||
478
+ // listCD.nestedData[0].type === IkasThemeJsonComponentPropType.ENUM
479
+ // ) {
480
+ // type = CustomDataTypesGenerator.generateTypeName(
481
+ // listCD.nestedData[0]
482
+ // );
483
+ // if (!file.content.includes(`export type ${type}`)) {
484
+ // file.internalCustomDatas.push(listCD.nestedData[0]);
485
+ // }
486
+ // } else {
487
+ // type = CustomDataTypesGenerator.getType(
488
+ // listCD.nestedData[0],
489
+ // file,
490
+ // themeJson
491
+ // );
492
+ // }
493
+ // console.log("nesteddata custom type", type);
494
+ // }
495
+
496
+ // break;
497
+ default:
498
+ break;
499
+ }
500
+
501
+ return type;
502
+ }
503
+
504
+ static generatePropTypeName(component: IkasThemeJsonComponent) {
505
+ if (component.displayName === "") return;
506
+
507
+ const propName = component.dir || "";
508
+ const pieces = propName.split("-");
509
+ let _propName = "";
510
+
511
+ pieces.forEach(
512
+ (piece, index) =>
513
+ (_propName += piece.charAt(0).toUpperCase() + piece.slice(1))
514
+ );
515
+
516
+ if (_propName[0].match(/^\d/)) _propName = "_" + _propName;
517
+
518
+ return _propName;
519
+ }
520
+ }
@@ -0,0 +1,45 @@
1
+ import commandLineArgs from "command-line-args";
2
+ import { APIGenerator } from "./generators/api";
3
+ import { ConfigGenerator, ENV } from "./generators/config";
4
+ import { ThemeJsonGenerator } from "./generators/theme";
5
+ import { ComponentImportsGenerator } from "./generators/components";
6
+ import { PageGenerator } from "./generators/pages";
7
+ import { CustomDataTypesGenerator } from "./generators/types";
8
+
9
+ async function run() {
10
+ const optionDefinitions = [
11
+ { name: "generate", alias: "g", type: Boolean },
12
+ { name: "dev", alias: "d", type: Boolean },
13
+ ];
14
+
15
+ const options = commandLineArgs(optionDefinitions);
16
+
17
+ if (options.generate) {
18
+ const isDev = !!options.dev;
19
+ const isSuccess = await generate(isDev ? "dev" : "prod");
20
+
21
+ if (isSuccess) {
22
+ console.log("Project files generated successfully!");
23
+ } else {
24
+ console.log("Project files generate failed!");
25
+ }
26
+ }
27
+ }
28
+
29
+ async function generate(env: ENV) {
30
+ let themeJson = await ThemeJsonGenerator.getTheme();
31
+
32
+ if (!themeJson) await ThemeJsonGenerator.generateInitialThemeJsonFile();
33
+ themeJson = await ThemeJsonGenerator.getTheme();
34
+
35
+ return (
36
+ (await ThemeJsonGenerator.generate(themeJson)) &&
37
+ (await ComponentImportsGenerator.generate(themeJson)) &&
38
+ (await PageGenerator.generate()) &&
39
+ (await APIGenerator.generate()) &&
40
+ (await ConfigGenerator.generate(env)) &&
41
+ (await CustomDataTypesGenerator.generate(themeJson))
42
+ );
43
+ }
44
+
45
+ run();
@@ -0,0 +1,99 @@
1
+ import { IkasThemeJson, IkasThemeJsonPage } from "@ikas/storefront-models";
2
+ import _cloneDeep from "lodash/cloneDeep";
3
+ import {
4
+ ComponentImportsGenerator,
5
+ ConfigGenerator,
6
+ CustomDataTypesGenerator,
7
+ PageGenerator,
8
+ } from "../generators";
9
+
10
+ export function shouldDeploy(
11
+ oldThemeJson: IkasThemeJson,
12
+ newThemeJson: IkasThemeJson
13
+ ) {
14
+ if (
15
+ oldThemeJson.pages.some(
16
+ (page) => !newThemeJson.pages.find((p) => p.id === page.id)
17
+ ) ||
18
+ newThemeJson.pages.some(
19
+ (page) => !oldThemeJson.pages.find((p) => p.id === page.id)
20
+ )
21
+ )
22
+ return true;
23
+
24
+ return oldThemeJson.pages.some((page) => {
25
+ const comparedPage = newThemeJson.pages.find((p) => p.id === page.id);
26
+
27
+ const allOldPageComponents = page.components;
28
+ if (page.specifications?.length) {
29
+ page.specifications.forEach((specification) => {
30
+ allOldPageComponents.push(...specification.components);
31
+ });
32
+ }
33
+
34
+ const allNewPageComponents = comparedPage?.components || [];
35
+ if (comparedPage?.specifications?.length) {
36
+ comparedPage.specifications.forEach((specification) => {
37
+ allNewPageComponents.push(...specification.components);
38
+ });
39
+ }
40
+
41
+ const addedPageComponents = allOldPageComponents.filter(
42
+ (pageComponent) =>
43
+ !allNewPageComponents.find(
44
+ (compagedPageComponent) =>
45
+ pageComponent.componentId === compagedPageComponent.componentId
46
+ )
47
+ );
48
+
49
+ const deletedPageComponents = allNewPageComponents.filter(
50
+ (pageComponent) =>
51
+ !allOldPageComponents.find(
52
+ (compagedPageComponent) =>
53
+ pageComponent.componentId === compagedPageComponent.componentId
54
+ )
55
+ );
56
+
57
+ return !!addedPageComponents.length || !!deletedPageComponents.length;
58
+ });
59
+ }
60
+
61
+ export async function generate(
62
+ themeJsonList: IkasThemeJson[],
63
+ env: "dev" | "prod"
64
+ ) {
65
+ const _themeJsonList = _cloneDeep(themeJsonList);
66
+ const themeJson: IkasThemeJson = {
67
+ components: [],
68
+ pages: [],
69
+ customData: [],
70
+ name: "",
71
+ settings: {} as any,
72
+ };
73
+
74
+ themeJson.components = _themeJsonList[0].components;
75
+ themeJson.customData = _themeJsonList[0].customData;
76
+
77
+ _themeJsonList.forEach((_themeJson) => {
78
+ _themeJson.pages.forEach((_page) => {
79
+ const existingPage = themeJson.pages.find((p) => p.type === _page.type);
80
+
81
+ const page: IkasThemeJsonPage = existingPage || _page;
82
+ page.components.push(..._page.components);
83
+
84
+ if (!page.specifications) page.specifications = [];
85
+ page.specifications.push(...(_page.specifications || []));
86
+
87
+ if (!existingPage) {
88
+ themeJson.pages.push(page);
89
+ }
90
+ });
91
+ });
92
+
93
+ return (
94
+ (await ComponentImportsGenerator.generate(themeJson)) &&
95
+ (await PageGenerator.generate()) &&
96
+ (await CustomDataTypesGenerator.generate(themeJson)) &&
97
+ (await ConfigGenerator.generate(env))
98
+ );
99
+ }