@carlonicora/nextjs-jsonapi 1.2.0 → 1.3.0

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 (202) hide show
  1. package/dist/scripts/generate-web-module/generator.d.ts +15 -0
  2. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -0
  3. package/dist/scripts/generate-web-module/generator.js +320 -0
  4. package/dist/scripts/generate-web-module/generator.js.map +1 -0
  5. package/dist/scripts/generate-web-module/index.d.ts +16 -0
  6. package/dist/scripts/generate-web-module/index.d.ts.map +1 -0
  7. package/dist/scripts/generate-web-module/index.js +80 -0
  8. package/dist/scripts/generate-web-module/index.js.map +1 -0
  9. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts +14 -0
  10. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts.map +1 -0
  11. package/dist/scripts/generate-web-module/templates/components/container.template.js +124 -0
  12. package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -0
  13. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts +15 -0
  14. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts.map +1 -0
  15. package/dist/scripts/generate-web-module/templates/components/content.template.js +39 -0
  16. package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -0
  17. package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts +14 -0
  18. package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts.map +1 -0
  19. package/dist/scripts/generate-web-module/templates/components/deleter.template.js +51 -0
  20. package/dist/scripts/generate-web-module/templates/components/deleter.template.js.map +1 -0
  21. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts +14 -0
  22. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts.map +1 -0
  23. package/dist/scripts/generate-web-module/templates/components/details.template.js +109 -0
  24. package/dist/scripts/generate-web-module/templates/components/details.template.js.map +1 -0
  25. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts +14 -0
  26. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts.map +1 -0
  27. package/dist/scripts/generate-web-module/templates/components/editor.template.js +459 -0
  28. package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -0
  29. package/dist/scripts/generate-web-module/templates/components/index.d.ts +15 -0
  30. package/dist/scripts/generate-web-module/templates/components/index.d.ts.map +1 -0
  31. package/dist/scripts/generate-web-module/templates/components/index.js +29 -0
  32. package/dist/scripts/generate-web-module/templates/components/index.js.map +1 -0
  33. package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts +14 -0
  34. package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts.map +1 -0
  35. package/dist/scripts/generate-web-module/templates/components/list-container.template.js +30 -0
  36. package/dist/scripts/generate-web-module/templates/components/list-container.template.js.map +1 -0
  37. package/dist/scripts/generate-web-module/templates/components/list.template.d.ts +14 -0
  38. package/dist/scripts/generate-web-module/templates/components/list.template.d.ts.map +1 -0
  39. package/dist/scripts/generate-web-module/templates/components/list.template.js +84 -0
  40. package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -0
  41. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts +14 -0
  42. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts.map +1 -0
  43. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js +184 -0
  44. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js.map +1 -0
  45. package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts +14 -0
  46. package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts.map +1 -0
  47. package/dist/scripts/generate-web-module/templates/components/selector.template.js +199 -0
  48. package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -0
  49. package/dist/scripts/generate-web-module/templates/context.template.d.ts +14 -0
  50. package/dist/scripts/generate-web-module/templates/context.template.d.ts.map +1 -0
  51. package/dist/scripts/generate-web-module/templates/context.template.js +121 -0
  52. package/dist/scripts/generate-web-module/templates/context.template.js.map +1 -0
  53. package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts +14 -0
  54. package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts.map +1 -0
  55. package/dist/scripts/generate-web-module/templates/data/fields.template.js +55 -0
  56. package/dist/scripts/generate-web-module/templates/data/fields.template.js.map +1 -0
  57. package/dist/scripts/generate-web-module/templates/data/index.d.ts +10 -0
  58. package/dist/scripts/generate-web-module/templates/data/index.d.ts.map +1 -0
  59. package/dist/scripts/generate-web-module/templates/data/index.js +26 -0
  60. package/dist/scripts/generate-web-module/templates/data/index.js.map +1 -0
  61. package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts +14 -0
  62. package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts.map +1 -0
  63. package/dist/scripts/generate-web-module/templates/data/interface.template.js +116 -0
  64. package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -0
  65. package/dist/scripts/generate-web-module/templates/data/model.template.d.ts +14 -0
  66. package/dist/scripts/generate-web-module/templates/data/model.template.d.ts.map +1 -0
  67. package/dist/scripts/generate-web-module/templates/data/model.template.js +274 -0
  68. package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -0
  69. package/dist/scripts/generate-web-module/templates/data/service.template.d.ts +14 -0
  70. package/dist/scripts/generate-web-module/templates/data/service.template.d.ts.map +1 -0
  71. package/dist/scripts/generate-web-module/templates/data/service.template.js +168 -0
  72. package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -0
  73. package/dist/scripts/generate-web-module/templates/index.d.ts +12 -0
  74. package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -0
  75. package/dist/scripts/generate-web-module/templates/index.js +37 -0
  76. package/dist/scripts/generate-web-module/templates/index.js.map +1 -0
  77. package/dist/scripts/generate-web-module/templates/module.template.d.ts +14 -0
  78. package/dist/scripts/generate-web-module/templates/module.template.d.ts.map +1 -0
  79. package/dist/scripts/generate-web-module/templates/module.template.js +64 -0
  80. package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -0
  81. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts +14 -0
  82. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts.map +1 -0
  83. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js +65 -0
  84. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js.map +1 -0
  85. package/dist/scripts/generate-web-module/templates/pages/index.d.ts +8 -0
  86. package/dist/scripts/generate-web-module/templates/pages/index.d.ts.map +1 -0
  87. package/dist/scripts/generate-web-module/templates/pages/index.js +13 -0
  88. package/dist/scripts/generate-web-module/templates/pages/index.js.map +1 -0
  89. package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts +14 -0
  90. package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts.map +1 -0
  91. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js +37 -0
  92. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js.map +1 -0
  93. package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts +14 -0
  94. package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts.map +1 -0
  95. package/dist/scripts/generate-web-module/templates/table-hook.template.js +174 -0
  96. package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -0
  97. package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts +55 -0
  98. package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts.map +1 -0
  99. package/dist/scripts/generate-web-module/transformers/field-mapper.js +179 -0
  100. package/dist/scripts/generate-web-module/transformers/field-mapper.js.map +1 -0
  101. package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts +78 -0
  102. package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts.map +1 -0
  103. package/dist/scripts/generate-web-module/transformers/i18n-generator.js +182 -0
  104. package/dist/scripts/generate-web-module/transformers/i18n-generator.js.map +1 -0
  105. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +106 -0
  106. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -0
  107. package/dist/scripts/generate-web-module/transformers/import-resolver.js +193 -0
  108. package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -0
  109. package/dist/scripts/generate-web-module/transformers/index.d.ts +12 -0
  110. package/dist/scripts/generate-web-module/transformers/index.d.ts.map +1 -0
  111. package/dist/scripts/generate-web-module/transformers/index.js +28 -0
  112. package/dist/scripts/generate-web-module/transformers/index.js.map +1 -0
  113. package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts +60 -0
  114. package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts.map +1 -0
  115. package/dist/scripts/generate-web-module/transformers/name-transformer.js +115 -0
  116. package/dist/scripts/generate-web-module/transformers/name-transformer.js.map +1 -0
  117. package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts +57 -0
  118. package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts.map +1 -0
  119. package/dist/scripts/generate-web-module/transformers/parent-detector.js +88 -0
  120. package/dist/scripts/generate-web-module/transformers/parent-detector.js.map +1 -0
  121. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts +68 -0
  122. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -0
  123. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +219 -0
  124. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -0
  125. package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts +68 -0
  126. package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts.map +1 -0
  127. package/dist/scripts/generate-web-module/types/field-mapping.types.js +129 -0
  128. package/dist/scripts/generate-web-module/types/field-mapping.types.js.map +1 -0
  129. package/dist/scripts/generate-web-module/types/index.d.ts +9 -0
  130. package/dist/scripts/generate-web-module/types/index.d.ts.map +1 -0
  131. package/dist/scripts/generate-web-module/types/index.js +25 -0
  132. package/dist/scripts/generate-web-module/types/index.js.map +1 -0
  133. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +40 -0
  134. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -0
  135. package/dist/scripts/generate-web-module/types/json-schema.interface.js +10 -0
  136. package/dist/scripts/generate-web-module/types/json-schema.interface.js.map +1 -0
  137. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +128 -0
  138. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -0
  139. package/dist/scripts/generate-web-module/types/template-data.interface.js +9 -0
  140. package/dist/scripts/generate-web-module/types/template-data.interface.js.map +1 -0
  141. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts +29 -0
  142. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts.map +1 -0
  143. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js +153 -0
  144. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js.map +1 -0
  145. package/dist/scripts/generate-web-module/utils/file-writer.d.ts +38 -0
  146. package/dist/scripts/generate-web-module/utils/file-writer.d.ts.map +1 -0
  147. package/dist/scripts/generate-web-module/utils/file-writer.js +126 -0
  148. package/dist/scripts/generate-web-module/utils/file-writer.js.map +1 -0
  149. package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts +28 -0
  150. package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts.map +1 -0
  151. package/dist/scripts/generate-web-module/utils/i18n-updater.js +122 -0
  152. package/dist/scripts/generate-web-module/utils/i18n-updater.js.map +1 -0
  153. package/dist/scripts/generate-web-module/utils/index.d.ts +9 -0
  154. package/dist/scripts/generate-web-module/utils/index.d.ts.map +1 -0
  155. package/dist/scripts/generate-web-module/utils/index.js +20 -0
  156. package/dist/scripts/generate-web-module/utils/index.js.map +1 -0
  157. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts +46 -0
  158. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts.map +1 -0
  159. package/dist/scripts/generate-web-module/validators/json-schema-validator.js +265 -0
  160. package/dist/scripts/generate-web-module/validators/json-schema-validator.js.map +1 -0
  161. package/package.json +27 -21
  162. package/scripts/generate-web-module/generator.ts +363 -0
  163. package/scripts/generate-web-module/index.ts +49 -0
  164. package/scripts/generate-web-module/templates/components/container.template.ts +129 -0
  165. package/scripts/generate-web-module/templates/components/content.template.ts +40 -0
  166. package/scripts/generate-web-module/templates/components/deleter.template.ts +51 -0
  167. package/scripts/generate-web-module/templates/components/details.template.ts +115 -0
  168. package/scripts/generate-web-module/templates/components/editor.template.ts +495 -0
  169. package/scripts/generate-web-module/templates/components/index.ts +18 -0
  170. package/scripts/generate-web-module/templates/components/list-container.template.ts +30 -0
  171. package/scripts/generate-web-module/templates/components/list.template.ts +91 -0
  172. package/scripts/generate-web-module/templates/components/multi-selector.template.ts +184 -0
  173. package/scripts/generate-web-module/templates/components/selector.template.ts +199 -0
  174. package/scripts/generate-web-module/templates/context.template.ts +121 -0
  175. package/scripts/generate-web-module/templates/data/fields.template.ts +64 -0
  176. package/scripts/generate-web-module/templates/data/index.ts +10 -0
  177. package/scripts/generate-web-module/templates/data/interface.template.ts +136 -0
  178. package/scripts/generate-web-module/templates/data/model.template.ts +327 -0
  179. package/scripts/generate-web-module/templates/data/service.template.ts +185 -0
  180. package/scripts/generate-web-module/templates/index.ts +34 -0
  181. package/scripts/generate-web-module/templates/module.template.ts +69 -0
  182. package/scripts/generate-web-module/templates/pages/detail-page.template.ts +65 -0
  183. package/scripts/generate-web-module/templates/pages/index.ts +8 -0
  184. package/scripts/generate-web-module/templates/pages/list-page.template.ts +37 -0
  185. package/scripts/generate-web-module/templates/table-hook.template.ts +182 -0
  186. package/scripts/generate-web-module/transformers/field-mapper.ts +201 -0
  187. package/scripts/generate-web-module/transformers/i18n-generator.ts +199 -0
  188. package/scripts/generate-web-module/transformers/import-resolver.ts +250 -0
  189. package/scripts/generate-web-module/transformers/index.ts +12 -0
  190. package/scripts/generate-web-module/transformers/name-transformer.ts +115 -0
  191. package/scripts/generate-web-module/transformers/parent-detector.ts +87 -0
  192. package/scripts/generate-web-module/transformers/relationship-resolver.ts +221 -0
  193. package/scripts/generate-web-module/tsconfig.json +24 -0
  194. package/scripts/generate-web-module/types/field-mapping.types.ts +141 -0
  195. package/scripts/generate-web-module/types/index.ts +9 -0
  196. package/scripts/generate-web-module/types/json-schema.interface.ts +42 -0
  197. package/scripts/generate-web-module/types/template-data.interface.ts +164 -0
  198. package/scripts/generate-web-module/utils/bootstrapper-updater.ts +145 -0
  199. package/scripts/generate-web-module/utils/file-writer.ts +115 -0
  200. package/scripts/generate-web-module/utils/i18n-updater.ts +108 -0
  201. package/scripts/generate-web-module/utils/index.ts +9 -0
  202. package/scripts/generate-web-module/validators/json-schema-validator.ts +306 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * File Writer Utility
4
+ *
5
+ * Handles file writing with conflict detection and directory creation.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.writeFile = writeFile;
42
+ exports.writeFiles = writeFiles;
43
+ exports.printResults = printResults;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * Write a single file to disk
48
+ *
49
+ * @param file - Generated file data
50
+ * @param options - Write options
51
+ * @returns Write result
52
+ */
53
+ function writeFile(file, options = {}) {
54
+ const { dryRun = false, force = false } = options;
55
+ const existed = fs.existsSync(file.path);
56
+ if (dryRun) {
57
+ return {
58
+ path: file.path,
59
+ status: "dry-run",
60
+ existed,
61
+ };
62
+ }
63
+ // Check if file exists and we're not forcing
64
+ if (existed && !force) {
65
+ return {
66
+ path: file.path,
67
+ status: "skipped",
68
+ existed: true,
69
+ };
70
+ }
71
+ // Create directory if needed
72
+ const dir = path.dirname(file.path);
73
+ if (!fs.existsSync(dir)) {
74
+ fs.mkdirSync(dir, { recursive: true });
75
+ }
76
+ // Write the file
77
+ fs.writeFileSync(file.path, file.content, "utf-8");
78
+ return {
79
+ path: file.path,
80
+ status: existed ? "updated" : "created",
81
+ existed,
82
+ };
83
+ }
84
+ /**
85
+ * Write multiple files to disk
86
+ *
87
+ * @param files - Array of generated files
88
+ * @param options - Write options
89
+ * @returns Array of write results
90
+ */
91
+ function writeFiles(files, options = {}) {
92
+ return files.map((file) => writeFile(file, options));
93
+ }
94
+ /**
95
+ * Print write results to console
96
+ *
97
+ * @param results - Array of write results
98
+ */
99
+ function printResults(results) {
100
+ const grouped = {
101
+ created: results.filter((r) => r.status === "created"),
102
+ updated: results.filter((r) => r.status === "updated"),
103
+ skipped: results.filter((r) => r.status === "skipped"),
104
+ dryRun: results.filter((r) => r.status === "dry-run"),
105
+ };
106
+ if (grouped.dryRun.length > 0) {
107
+ console.log("\n📋 DRY RUN - Files that would be created:");
108
+ grouped.dryRun.forEach((r) => {
109
+ console.log(` ${r.existed ? "🔄" : "✨"} ${r.path}`);
110
+ });
111
+ }
112
+ if (grouped.created.length > 0) {
113
+ console.log("\n✨ Created files:");
114
+ grouped.created.forEach((r) => console.log(` ${r.path}`));
115
+ }
116
+ if (grouped.updated.length > 0) {
117
+ console.log("\n🔄 Updated files:");
118
+ grouped.updated.forEach((r) => console.log(` ${r.path}`));
119
+ }
120
+ if (grouped.skipped.length > 0) {
121
+ console.log("\n⏭️ Skipped (already exist, use --force to overwrite):");
122
+ grouped.skipped.forEach((r) => console.log(` ${r.path}`));
123
+ }
124
+ console.log(`\nTotal: ${results.length} files (${grouped.created.length} created, ${grouped.updated.length} updated, ${grouped.skipped.length} skipped)`);
125
+ }
126
+ //# sourceMappingURL=file-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/utils/file-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * i18n Updater
3
+ *
4
+ * Updates the messages/en.json file with new module translations.
5
+ */
6
+ import { FrontendTemplateData } from "../types/template-data.interface";
7
+ export interface I18nUpdateResult {
8
+ success: boolean;
9
+ message: string;
10
+ alreadyExists?: boolean;
11
+ }
12
+ /**
13
+ * Update messages/en.json with new module translations
14
+ *
15
+ * @param data - Frontend template data
16
+ * @param webBasePath - Base path to web app
17
+ * @param dryRun - Whether to perform a dry run
18
+ * @returns Update result
19
+ */
20
+ export declare function updateI18n(data: FrontendTemplateData, webBasePath: string, dryRun?: boolean): I18nUpdateResult;
21
+ /**
22
+ * Preview the i18n messages that would be added
23
+ *
24
+ * @param data - Frontend template data
25
+ * @returns Preview of messages
26
+ */
27
+ export declare function previewI18nMessages(data: FrontendTemplateData): string;
28
+ //# sourceMappingURL=i18n-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-updater.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/utils/i18n-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAKxE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,oBAAoB,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,OAAe,GACtB,gBAAgB,CAkElB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /**
3
+ * i18n Updater
4
+ *
5
+ * Updates the messages/en.json file with new module translations.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.updateI18n = updateI18n;
42
+ exports.previewI18nMessages = previewI18nMessages;
43
+ const fs = __importStar(require("fs"));
44
+ const i18n_generator_1 = require("../transformers/i18n-generator");
45
+ const MESSAGES_PATH = "apps/web/messages/en.json";
46
+ /**
47
+ * Update messages/en.json with new module translations
48
+ *
49
+ * @param data - Frontend template data
50
+ * @param webBasePath - Base path to web app
51
+ * @param dryRun - Whether to perform a dry run
52
+ * @returns Update result
53
+ */
54
+ function updateI18n(data, webBasePath, dryRun = false) {
55
+ const { names, i18nKeys } = data;
56
+ const messagesPath = `${webBasePath}/${MESSAGES_PATH}`;
57
+ // Check if file exists
58
+ if (!fs.existsSync(messagesPath)) {
59
+ return {
60
+ success: false,
61
+ message: `Messages file not found at ${messagesPath}`,
62
+ };
63
+ }
64
+ const content = fs.readFileSync(messagesPath, "utf-8");
65
+ let messages;
66
+ try {
67
+ messages = JSON.parse(content);
68
+ }
69
+ catch (e) {
70
+ return {
71
+ success: false,
72
+ message: `Failed to parse messages/en.json: ${e}`,
73
+ };
74
+ }
75
+ // Check if module already exists in features
76
+ if (messages.features && messages.features[names.camelCase]) {
77
+ return {
78
+ success: true,
79
+ message: `Module ${names.camelCase} already exists in messages/en.json`,
80
+ alreadyExists: true,
81
+ };
82
+ }
83
+ // Build the i18n messages for this module
84
+ const moduleMessages = (0, i18n_generator_1.buildI18nMessages)(i18nKeys);
85
+ // Add to features section
86
+ if (!messages.features) {
87
+ messages.features = {};
88
+ }
89
+ messages.features[names.camelCase] = moduleMessages.features[i18nKeys.moduleName];
90
+ // Add to types section (if not exists)
91
+ if (!messages.types) {
92
+ messages.types = {};
93
+ }
94
+ const typesKey = Object.keys(moduleMessages.types)[0];
95
+ if (typesKey && !messages.types[names.pluralCamel]) {
96
+ messages.types[names.pluralCamel] = moduleMessages.types[typesKey];
97
+ }
98
+ if (dryRun) {
99
+ return {
100
+ success: true,
101
+ message: `[DRY RUN] Would update messages/en.json with ${names.camelCase} translations`,
102
+ };
103
+ }
104
+ // Write updated content with proper formatting
105
+ const updatedContent = JSON.stringify(messages, null, 2);
106
+ fs.writeFileSync(messagesPath, updatedContent, "utf-8");
107
+ return {
108
+ success: true,
109
+ message: `Updated messages/en.json with ${names.camelCase} translations`,
110
+ };
111
+ }
112
+ /**
113
+ * Preview the i18n messages that would be added
114
+ *
115
+ * @param data - Frontend template data
116
+ * @returns Preview of messages
117
+ */
118
+ function previewI18nMessages(data) {
119
+ const moduleMessages = (0, i18n_generator_1.buildI18nMessages)(data.i18nKeys);
120
+ return JSON.stringify(moduleMessages, null, 2);
121
+ }
122
+ //# sourceMappingURL=i18n-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-updater.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/utils/i18n-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utils Index
3
+ *
4
+ * Exports all utility functions.
5
+ */
6
+ export { writeFile, writeFiles, printResults, type WriteOptions, type WriteResult } from "./file-writer";
7
+ export { updateBootstrapper, generateImportStatement, generateModuleEntry, type BootstrapperUpdateResult } from "./bootstrapper-updater";
8
+ export { updateI18n, previewI18nMessages, type I18nUpdateResult } from "./i18n-updater";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACzI,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Utils Index
4
+ *
5
+ * Exports all utility functions.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.previewI18nMessages = exports.updateI18n = exports.generateModuleEntry = exports.generateImportStatement = exports.updateBootstrapper = exports.printResults = exports.writeFiles = exports.writeFile = void 0;
9
+ var file_writer_1 = require("./file-writer");
10
+ Object.defineProperty(exports, "writeFile", { enumerable: true, get: function () { return file_writer_1.writeFile; } });
11
+ Object.defineProperty(exports, "writeFiles", { enumerable: true, get: function () { return file_writer_1.writeFiles; } });
12
+ Object.defineProperty(exports, "printResults", { enumerable: true, get: function () { return file_writer_1.printResults; } });
13
+ var bootstrapper_updater_1 = require("./bootstrapper-updater");
14
+ Object.defineProperty(exports, "updateBootstrapper", { enumerable: true, get: function () { return bootstrapper_updater_1.updateBootstrapper; } });
15
+ Object.defineProperty(exports, "generateImportStatement", { enumerable: true, get: function () { return bootstrapper_updater_1.generateImportStatement; } });
16
+ Object.defineProperty(exports, "generateModuleEntry", { enumerable: true, get: function () { return bootstrapper_updater_1.generateModuleEntry; } });
17
+ var i18n_updater_1 = require("./i18n-updater");
18
+ Object.defineProperty(exports, "updateI18n", { enumerable: true, get: function () { return i18n_updater_1.updateI18n; } });
19
+ Object.defineProperty(exports, "previewI18nMessages", { enumerable: true, get: function () { return i18n_updater_1.previewI18nMessages; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/utils/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAAyG;AAAhG,wGAAA,SAAS,OAAA;AAAE,yGAAA,UAAU,OAAA;AAAE,2GAAA,YAAY,OAAA;AAC5C,+DAAyI;AAAhI,0HAAA,kBAAkB,OAAA;AAAE,+HAAA,uBAAuB,OAAA;AAAE,2HAAA,mBAAmB,OAAA;AACzE,+CAAwF;AAA/E,0GAAA,UAAU,OAAA;AAAE,mHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * JSON Schema Validator
3
+ *
4
+ * Validates JSON module definition files for the frontend generator.
5
+ * Note: Backend-specific fields (toNode, relationshipName) are warnings, not errors.
6
+ */
7
+ import { JsonModuleDefinition } from "../types/json-schema.interface";
8
+ export interface ValidationError {
9
+ field: string;
10
+ message: string;
11
+ severity: "error" | "warning";
12
+ }
13
+ /**
14
+ * Validate JSON module definition for frontend generation
15
+ *
16
+ * @param schema - JSON module definition
17
+ * @returns Array of validation errors (empty if valid)
18
+ */
19
+ export declare function validateJsonSchema(schema: any): ValidationError[];
20
+ /**
21
+ * Format validation errors for display
22
+ *
23
+ * @param errors - Validation errors
24
+ * @returns Formatted error message
25
+ */
26
+ export declare function formatValidationErrors(errors: ValidationError[]): string;
27
+ /**
28
+ * Validation result interface
29
+ */
30
+ export interface ValidationResult {
31
+ data: JsonModuleDefinition | null;
32
+ errors: string[];
33
+ warnings: string[];
34
+ }
35
+ /**
36
+ * Validate and parse JSON file from path
37
+ *
38
+ * @param filePath - Path to JSON file
39
+ * @returns Validation result with data, errors, and warnings
40
+ */
41
+ export declare function parseAndValidate(filePath: string): ValidationResult;
42
+ /**
43
+ * Check if validation result passed (no errors)
44
+ */
45
+ export declare function validationPassed(result: ValidationResult): boolean;
46
+ //# sourceMappingURL=json-schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-validator.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/validators/json-schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAgKjE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CA6BxE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CA+DnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAElE"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ /**
3
+ * JSON Schema Validator
4
+ *
5
+ * Validates JSON module definition files for the frontend generator.
6
+ * Note: Backend-specific fields (toNode, relationshipName) are warnings, not errors.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.validateJsonSchema = validateJsonSchema;
10
+ exports.formatValidationErrors = formatValidationErrors;
11
+ exports.parseAndValidate = parseAndValidate;
12
+ exports.validationPassed = validationPassed;
13
+ /**
14
+ * Validate JSON module definition for frontend generation
15
+ *
16
+ * @param schema - JSON module definition
17
+ * @returns Array of validation errors (empty if valid)
18
+ */
19
+ function validateJsonSchema(schema) {
20
+ const errors = [];
21
+ // Required fields
22
+ const required = ["moduleName", "endpointName", "targetDir"];
23
+ for (const field of required) {
24
+ if (!schema[field]) {
25
+ errors.push({
26
+ field,
27
+ message: `${field} is required`,
28
+ severity: "error",
29
+ });
30
+ }
31
+ }
32
+ // Module name format (PascalCase)
33
+ if (schema.moduleName && !/^[A-Z][a-zA-Z0-9]*$/.test(schema.moduleName)) {
34
+ errors.push({
35
+ field: "moduleName",
36
+ message: 'Must be PascalCase (e.g., "Comment", "Discussion")',
37
+ severity: "error",
38
+ });
39
+ }
40
+ // Endpoint format (kebab-case plural)
41
+ if (schema.endpointName && !/^[a-z][a-z0-9-]*$/.test(schema.endpointName)) {
42
+ errors.push({
43
+ field: "endpointName",
44
+ message: 'Must be kebab-case (e.g., "comments", "discussions")',
45
+ severity: "error",
46
+ });
47
+ }
48
+ // Target directory validation
49
+ if (schema.targetDir && !["features", "foundations"].includes(schema.targetDir)) {
50
+ errors.push({
51
+ field: "targetDir",
52
+ message: 'Must be either "features" or "foundations"',
53
+ severity: "error",
54
+ });
55
+ }
56
+ // Module ID validation (required for frontend)
57
+ if (!schema.moduleId) {
58
+ errors.push({
59
+ field: "moduleId",
60
+ message: "moduleId is required for frontend module registration",
61
+ severity: "error",
62
+ });
63
+ }
64
+ else if (!/^[a-f0-9-]{36}$/i.test(schema.moduleId)) {
65
+ errors.push({
66
+ field: "moduleId",
67
+ message: "moduleId must be a valid UUID",
68
+ severity: "warning",
69
+ });
70
+ }
71
+ // Fields validation
72
+ if (schema.fields && Array.isArray(schema.fields)) {
73
+ schema.fields.forEach((field, index) => {
74
+ if (!field.name) {
75
+ errors.push({
76
+ field: `fields[${index}].name`,
77
+ message: "Field name is required",
78
+ severity: "error",
79
+ });
80
+ }
81
+ if (!field.type) {
82
+ errors.push({
83
+ field: `fields[${index}].type`,
84
+ message: "Field type is required",
85
+ severity: "error",
86
+ });
87
+ }
88
+ if (field.nullable === undefined) {
89
+ errors.push({
90
+ field: `fields[${index}].nullable`,
91
+ message: "Field nullable flag is required",
92
+ severity: "error",
93
+ });
94
+ }
95
+ // Validate known types
96
+ const validTypes = ["string", "number", "boolean", "date", "any"];
97
+ if (field.type && !validTypes.includes(field.type)) {
98
+ errors.push({
99
+ field: `fields[${index}].type`,
100
+ message: `Unknown type "${field.type}". Valid types: ${validTypes.join(", ")}`,
101
+ severity: "warning",
102
+ });
103
+ }
104
+ });
105
+ }
106
+ // Relationships validation
107
+ if (schema.relationships && Array.isArray(schema.relationships)) {
108
+ schema.relationships.forEach((rel, index) => {
109
+ if (!rel.name) {
110
+ errors.push({
111
+ field: `relationships[${index}].name`,
112
+ message: "Relationship name is required",
113
+ severity: "error",
114
+ });
115
+ }
116
+ if (!rel.directory) {
117
+ errors.push({
118
+ field: `relationships[${index}].directory`,
119
+ message: "Relationship directory is required",
120
+ severity: "error",
121
+ });
122
+ }
123
+ // Directory should be features or foundations
124
+ if (rel.directory && !["features", "foundations"].includes(rel.directory)) {
125
+ errors.push({
126
+ field: `relationships[${index}].directory`,
127
+ message: 'Relationship directory should be "features" or "foundations"',
128
+ severity: "warning",
129
+ });
130
+ }
131
+ if (rel.single === undefined) {
132
+ errors.push({
133
+ field: `relationships[${index}].single`,
134
+ message: "Relationship single flag is required",
135
+ severity: "error",
136
+ });
137
+ }
138
+ if (rel.nullable === undefined) {
139
+ errors.push({
140
+ field: `relationships[${index}].nullable`,
141
+ message: "Relationship nullable flag is required",
142
+ severity: "error",
143
+ });
144
+ }
145
+ // Backend-specific fields are warnings only (not used in frontend)
146
+ if (!rel.relationshipName) {
147
+ errors.push({
148
+ field: `relationships[${index}].relationshipName`,
149
+ message: "relationshipName missing (backend-specific, not used in frontend)",
150
+ severity: "warning",
151
+ });
152
+ }
153
+ if (rel.toNode === undefined) {
154
+ errors.push({
155
+ field: `relationships[${index}].toNode`,
156
+ message: "toNode missing (backend-specific, not used in frontend)",
157
+ severity: "warning",
158
+ });
159
+ }
160
+ });
161
+ }
162
+ return errors;
163
+ }
164
+ /**
165
+ * Format validation errors for display
166
+ *
167
+ * @param errors - Validation errors
168
+ * @returns Formatted error message
169
+ */
170
+ function formatValidationErrors(errors) {
171
+ if (errors.length === 0) {
172
+ return "No validation errors";
173
+ }
174
+ const errorCount = errors.filter((e) => e.severity === "error").length;
175
+ const warningCount = errors.filter((e) => e.severity === "warning").length;
176
+ const lines = [];
177
+ if (errorCount > 0) {
178
+ lines.push(`\n❌ ${errorCount} error(s):`);
179
+ errors
180
+ .filter((e) => e.severity === "error")
181
+ .forEach((error) => {
182
+ lines.push(` • ${error.field}: ${error.message}`);
183
+ });
184
+ }
185
+ if (warningCount > 0) {
186
+ lines.push(`\n⚠️ ${warningCount} warning(s):`);
187
+ errors
188
+ .filter((e) => e.severity === "warning")
189
+ .forEach((error) => {
190
+ lines.push(` • ${error.field}: ${error.message}`);
191
+ });
192
+ }
193
+ return lines.join("\n");
194
+ }
195
+ /**
196
+ * Validate and parse JSON file from path
197
+ *
198
+ * @param filePath - Path to JSON file
199
+ * @returns Validation result with data, errors, and warnings
200
+ */
201
+ function parseAndValidate(filePath) {
202
+ const result = {
203
+ data: null,
204
+ errors: [],
205
+ warnings: [],
206
+ };
207
+ // Read file
208
+ let content;
209
+ try {
210
+ const fs = require("fs");
211
+ if (!fs.existsSync(filePath)) {
212
+ result.errors.push(`File not found: ${filePath}`);
213
+ return result;
214
+ }
215
+ content = fs.readFileSync(filePath, "utf-8");
216
+ }
217
+ catch (e) {
218
+ result.errors.push(`Failed to read file: ${e.message}`);
219
+ return result;
220
+ }
221
+ // Parse JSON
222
+ let schema;
223
+ try {
224
+ schema = JSON.parse(content);
225
+ }
226
+ catch (e) {
227
+ result.errors.push(`Invalid JSON: ${e.message}`);
228
+ return result;
229
+ }
230
+ // Handle array format (for bulk import compatibility)
231
+ if (Array.isArray(schema)) {
232
+ if (schema.length === 0) {
233
+ result.errors.push("JSON array is empty");
234
+ return result;
235
+ }
236
+ if (schema.length > 1) {
237
+ result.warnings.push(`JSON file contains ${schema.length} definitions. Only processing the first one.`);
238
+ }
239
+ schema = schema[0];
240
+ }
241
+ // Validate
242
+ const validationErrors = validateJsonSchema(schema);
243
+ // Separate errors and warnings
244
+ validationErrors.forEach((ve) => {
245
+ const msg = `${ve.field}: ${ve.message}`;
246
+ if (ve.severity === "error") {
247
+ result.errors.push(msg);
248
+ }
249
+ else {
250
+ result.warnings.push(msg);
251
+ }
252
+ });
253
+ // Only set data if validation passed
254
+ if (result.errors.length === 0) {
255
+ result.data = schema;
256
+ }
257
+ return result;
258
+ }
259
+ /**
260
+ * Check if validation result passed (no errors)
261
+ */
262
+ function validationPassed(result) {
263
+ return result.errors.length === 0 && result.data !== null;
264
+ }
265
+ //# sourceMappingURL=json-schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-validator.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/validators/json-schema-validator.ts"],"names":[],"mappings":"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"}