@carlonicora/nextjs-jsonapi 1.48.3 → 1.50.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 (41) hide show
  1. package/dist/{BlockNoteEditor-57KPRQDB.js → BlockNoteEditor-LENHWRS2.js} +6 -6
  2. package/dist/{BlockNoteEditor-57KPRQDB.js.map → BlockNoteEditor-LENHWRS2.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-GOWLYEKX.mjs → BlockNoteEditor-WLS36QIF.mjs} +2 -2
  4. package/dist/billing/index.js +299 -299
  5. package/dist/billing/index.mjs +1 -1
  6. package/dist/{chunk-4FSFLAVE.js → chunk-KWAUWJYX.js} +233 -132
  7. package/dist/chunk-KWAUWJYX.js.map +1 -0
  8. package/dist/{chunk-BSGK7GT3.mjs → chunk-VQ35TGD7.mjs} +106 -5
  9. package/dist/chunk-VQ35TGD7.mjs.map +1 -0
  10. package/dist/client/index.js +2 -2
  11. package/dist/client/index.mjs +1 -1
  12. package/dist/components/index.d.mts +2 -0
  13. package/dist/components/index.d.ts +2 -0
  14. package/dist/components/index.js +2 -2
  15. package/dist/components/index.mjs +1 -1
  16. package/dist/contexts/index.js +2 -2
  17. package/dist/contexts/index.mjs +1 -1
  18. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
  19. package/dist/scripts/generate-web-module/generator.js +42 -33
  20. package/dist/scripts/generate-web-module/generator.js.map +1 -1
  21. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -1
  22. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +8 -6
  23. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -1
  24. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +2 -0
  25. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -1
  26. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +2 -0
  27. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -1
  28. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts +1 -1
  29. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts.map +1 -1
  30. package/dist/scripts/generate-web-module/validators/json-schema-validator.js +74 -25
  31. package/dist/scripts/generate-web-module/validators/json-schema-validator.js.map +1 -1
  32. package/package.json +1 -1
  33. package/scripts/generate-web-module/generator.ts +48 -37
  34. package/scripts/generate-web-module/transformers/relationship-resolver.ts +8 -6
  35. package/scripts/generate-web-module/types/json-schema.interface.ts +2 -0
  36. package/scripts/generate-web-module/types/template-data.interface.ts +2 -0
  37. package/scripts/generate-web-module/validators/json-schema-validator.ts +79 -27
  38. package/src/shadcnui/custom/multiple-selector.tsx +123 -5
  39. package/dist/chunk-4FSFLAVE.js.map +0 -1
  40. package/dist/chunk-BSGK7GT3.mjs.map +0 -1
  41. /package/dist/{BlockNoteEditor-GOWLYEKX.mjs.map → BlockNoteEditor-WLS36QIF.mjs.map} +0 -0
@@ -160,6 +160,51 @@ function validateJsonSchema(schema) {
160
160
  severity: "warning",
161
161
  });
162
162
  }
163
+ // Validate alias format if provided (must be PascalCase)
164
+ if (rel.alias && !/^[A-Z][a-zA-Z0-9]*$/.test(rel.alias)) {
165
+ errors.push({
166
+ field: `relationships[${index}].alias`,
167
+ message: 'Alias must be PascalCase (e.g., "DestinedTo", "ReceivedBy")',
168
+ severity: "error",
169
+ });
170
+ }
171
+ });
172
+ // Check for duplicate relationship targets without alias
173
+ const nameCount = new Map();
174
+ schema.relationships.forEach((rel, index) => {
175
+ const name = rel.name;
176
+ if (!nameCount.has(name)) {
177
+ nameCount.set(name, []);
178
+ }
179
+ nameCount.get(name).push(index);
180
+ });
181
+ for (const [name, indices] of nameCount.entries()) {
182
+ if (indices.length > 1) {
183
+ for (const idx of indices) {
184
+ const rel = schema.relationships[idx];
185
+ if (!rel.alias) {
186
+ errors.push({
187
+ field: `relationships[${idx}].alias`,
188
+ message: `Relationship to "${name}" appears ${indices.length} times. All instances must have an "alias" field to avoid key collisions. Example: "alias": "DestinedTo"`,
189
+ severity: "error",
190
+ });
191
+ }
192
+ }
193
+ }
194
+ }
195
+ // Check for duplicate aliases
196
+ const aliasSet = new Set();
197
+ schema.relationships.forEach((rel, index) => {
198
+ if (rel.alias) {
199
+ if (aliasSet.has(rel.alias)) {
200
+ errors.push({
201
+ field: `relationships[${index}].alias`,
202
+ message: `Duplicate alias "${rel.alias}". Each alias must be unique.`,
203
+ severity: "error",
204
+ });
205
+ }
206
+ aliasSet.add(rel.alias);
207
+ }
163
208
  });
164
209
  }
165
210
  return errors;
@@ -230,32 +275,36 @@ function parseAndValidate(filePath) {
230
275
  result.errors.push(`Invalid JSON: ${e.message}`);
231
276
  return result;
232
277
  }
233
- // Handle array format (for bulk import compatibility)
234
- if (Array.isArray(schema)) {
235
- if (schema.length === 0) {
236
- result.errors.push("JSON array is empty");
237
- return result;
238
- }
239
- if (schema.length > 1) {
240
- result.warnings.push(`JSON file contains ${schema.length} definitions. Only processing the first one.`);
241
- }
242
- schema = schema[0];
278
+ // Normalize to array
279
+ const schemas = Array.isArray(schema) ? schema : [schema];
280
+ if (schemas.length === 0) {
281
+ result.errors.push("JSON array is empty");
282
+ return result;
243
283
  }
244
- // Validate
245
- const validationErrors = validateJsonSchema(schema);
246
- // Separate errors and warnings
247
- validationErrors.forEach((ve) => {
248
- const msg = `${ve.field}: ${ve.message}`;
249
- if (ve.severity === "error") {
250
- result.errors.push(msg);
251
- }
252
- else {
253
- result.warnings.push(msg);
284
+ // Validate each definition
285
+ const validSchemas = [];
286
+ for (let i = 0; i < schemas.length; i++) {
287
+ const item = schemas[i];
288
+ const prefix = schemas.length > 1 ? `[${i}] ` : "";
289
+ const validationErrors = validateJsonSchema(item);
290
+ let hasErrors = false;
291
+ validationErrors.forEach((ve) => {
292
+ const msg = `${prefix}${ve.field}: ${ve.message}`;
293
+ if (ve.severity === "error") {
294
+ result.errors.push(msg);
295
+ hasErrors = true;
296
+ }
297
+ else {
298
+ result.warnings.push(msg);
299
+ }
300
+ });
301
+ if (!hasErrors) {
302
+ validSchemas.push(item);
254
303
  }
255
- });
256
- // Only set data if validation passed
257
- if (result.errors.length === 0) {
258
- result.data = schema;
304
+ }
305
+ // Only set data if at least one schema passed validation
306
+ if (result.errors.length === 0 && validSchemas.length > 0) {
307
+ result.data = validSchemas;
259
308
  }
260
309
  return result;
261
310
  }
@@ -263,6 +312,6 @@ function parseAndValidate(filePath) {
263
312
  * Check if validation result passed (no errors)
264
313
  */
265
314
  function validationPassed(result) {
266
- return result.errors.length === 0 && result.data !== null;
315
+ return result.errors.length === 0 && result.data !== null && result.data.length > 0;
267
316
  }
268
317
  //# sourceMappingURL=json-schema-validator.js.map
@@ -1 +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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"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "1.48.3",
3
+ "version": "1.50.0",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -66,24 +66,11 @@ export async function generateWebModule(options: GenerateWebModuleOptions): Prom
66
66
  validation.warnings.forEach((w) => console.info(` - ${w}`));
67
67
  }
68
68
 
69
- const schema = validation.data!;
70
- console.info(` ✅ Schema valid: ${schema.moduleName}`);
71
-
72
- // Step 2: Build template data
73
- console.info("\n🔨 Building template data...");
74
- const templateData = buildTemplateData(schema);
75
- console.info(` Module: ${templateData.names.pascalCase}`);
76
- console.info(` Target: ${templateData.targetDir}`);
77
- console.info(` Extends Content: ${templateData.extendsContent}`);
78
- console.info(` Fields: ${templateData.fields.length}`);
79
- console.info(` Relationships: ${templateData.relationships.length}`);
80
-
81
- // Step 3: Generate all files
82
- console.info("\n📝 Generating files...");
83
- const files = generateAllFiles(templateData, schema);
84
- console.info(` Generated ${files.length} file templates`);
85
-
86
- // Step 4: Determine web base path
69
+ const schemas = validation.data!;
70
+ const total = schemas.length;
71
+ console.info(` ✅ ${total} schema(s) valid`);
72
+
73
+ // Determine web base path once
87
74
  const webBasePath = findWebBasePath(jsonPath);
88
75
  if (!webBasePath) {
89
76
  console.error("\n❌ Could not determine web app base path");
@@ -91,29 +78,53 @@ export async function generateWebModule(options: GenerateWebModuleOptions): Prom
91
78
  }
92
79
  console.info(` Web base path: ${webBasePath}`);
93
80
 
94
- // Step 5: Write files
95
- console.info("\n💾 Writing files...");
96
- const results = writeFiles(files, { dryRun, force });
97
- printResults(results);
98
-
99
- // Step 6: Update Bootstrapper (unless --no-register)
100
- if (!noRegister) {
101
- console.info("\n🔧 Updating Bootstrapper.ts...");
102
- const bootstrapResult = updateBootstrapper(templateData, webBasePath, dryRun);
103
- console.info(` ${bootstrapResult.success ? "✅" : "❌"} ${bootstrapResult.message}`);
104
- }
81
+ for (let i = 0; i < total; i++) {
82
+ const schema = schemas[i];
83
+ console.info(`\n📦 Processing module ${i + 1}/${total}: ${schema.moduleName}`);
84
+ console.info(`${"─".repeat(50)}`);
85
+
86
+ // Step 2: Build template data
87
+ console.info("🔨 Building template data...");
88
+ const templateData = buildTemplateData(schema);
89
+ console.info(` Module: ${templateData.names.pascalCase}`);
90
+ console.info(` Target: ${templateData.targetDir}`);
91
+ console.info(` Extends Content: ${templateData.extendsContent}`);
92
+ console.info(` Fields: ${templateData.fields.length}`);
93
+ console.info(` Relationships: ${templateData.relationships.length}`);
94
+
95
+ // Step 3: Generate all files
96
+ console.info("\n📝 Generating files...");
97
+ const files = generateAllFiles(templateData, schema);
98
+ console.info(` Generated ${files.length} file templates`);
99
+
100
+ // Step 5: Write files
101
+ console.info("\n💾 Writing files...");
102
+ const results = writeFiles(files, { dryRun, force });
103
+ printResults(results);
104
+
105
+ // Step 6: Update Bootstrapper (unless --no-register)
106
+ if (!noRegister) {
107
+ console.info("\n🔧 Updating Bootstrapper.ts...");
108
+ const bootstrapResult = updateBootstrapper(templateData, webBasePath, dryRun);
109
+ console.info(` ${bootstrapResult.success ? "✅" : "❌"} ${bootstrapResult.message}`);
110
+ }
105
111
 
106
- // Step 7: Update i18n for all languages (unless --no-register)
107
- if (!noRegister) {
108
- const languages = schema.languages || ["en"];
109
- console.info(`\n🌐 Updating i18n for ${languages.length} language(s)...`);
110
- for (const language of languages) {
111
- const i18nResult = updateI18n(templateData, webBasePath, language, dryRun);
112
- console.info(` ${i18nResult.success ? "✅" : "❌"} ${i18nResult.message}`);
112
+ // Step 7: Update i18n for all languages (unless --no-register)
113
+ if (!noRegister) {
114
+ const languages = schema.languages || ["en"];
115
+ console.info(`\n🌐 Updating i18n for ${languages.length} language(s)...`);
116
+ for (const language of languages) {
117
+ const i18nResult = updateI18n(templateData, webBasePath, language, dryRun);
118
+ console.info(` ${i18nResult.success ? "✅" : "❌"} ${i18nResult.message}`);
119
+ }
113
120
  }
121
+
122
+ console.info(`\n✅ ${schema.moduleName} generation complete!`);
114
123
  }
115
124
 
116
- console.info("\n✅ Generation complete!");
125
+ // Final summary
126
+ console.info(`\n${"═".repeat(50)}`);
127
+ console.info(`✅ All done! ${total} module(s) generated successfully.`);
117
128
 
118
129
  if (dryRun) {
119
130
  console.info("\n📝 This was a dry run. No files were actually written.");
@@ -37,7 +37,7 @@ export function isFoundationImport(directory: string): boolean {
37
37
  */
38
38
  export function resolveRelationship(rel: JsonRelationshipDefinition): FrontendRelationship {
39
39
  const isAuthor = rel.variant === AUTHOR_VARIANT;
40
- const effectiveName = rel.variant || rel.name;
40
+ const effectiveName = rel.alias || rel.variant || rel.name;
41
41
  const effectiveNameLower = toCamelCase(effectiveName);
42
42
  const modelKebab = toKebabCase(rel.name);
43
43
 
@@ -56,12 +56,13 @@ export function resolveRelationship(rel: JsonRelationshipDefinition): FrontendRe
56
56
  // Selector component name
57
57
  // Foundation components use MultiSelect, generated modules use MultiSelector
58
58
  let selectorComponent: string;
59
+ const selectorBaseName = rel.alias || rel.name;
59
60
  if (rel.single) {
60
- selectorComponent = `${rel.name}Selector`;
61
+ selectorComponent = `${selectorBaseName}Selector`;
61
62
  } else {
62
63
  selectorComponent = isFoundationImport(rel.directory)
63
- ? `${rel.name}MultiSelect`
64
- : `${rel.name}MultiSelector`;
64
+ ? `${selectorBaseName}MultiSelect`
65
+ : `${selectorBaseName}MultiSelector`;
65
66
  }
66
67
 
67
68
  // Zod schema
@@ -105,6 +106,7 @@ export function resolveRelationship(rel: JsonRelationshipDefinition): FrontendRe
105
106
  return {
106
107
  name: rel.name,
107
108
  variant: rel.variant,
109
+ alias: rel.alias,
108
110
  directory: rel.directory,
109
111
  single: rel.single,
110
112
  nullable: rel.nullable,
@@ -157,7 +159,7 @@ export function mapDirectoryToWebPath(directory: string): string {
157
159
  */
158
160
  export function generateServiceMethods(relationships: FrontendRelationship[]): RelationshipServiceMethod[] {
159
161
  return relationships.map((rel) => {
160
- const effectiveName = rel.variant || rel.name;
162
+ const effectiveName = rel.alias || rel.variant || rel.name;
161
163
  return {
162
164
  methodName: `findManyBy${toPascalCase(effectiveName)}`,
163
165
  paramName: `${toCamelCase(effectiveName)}Id`,
@@ -230,7 +232,7 @@ export function getRelationshipFormJsx(rel: FrontendRelationship, moduleName: st
230
232
  * @returns Expression for default value
231
233
  */
232
234
  export function getDefaultValueExpression(rel: FrontendRelationship, modelVarName: string): string {
233
- const propertyName = rel.variant ? toCamelCase(rel.variant) : toCamelCase(rel.name);
235
+ const propertyName = rel.alias ? toCamelCase(rel.alias) : rel.variant ? toCamelCase(rel.variant) : toCamelCase(rel.name);
234
236
  const pluralPropertyName = pluralize(propertyName);
235
237
 
236
238
  if (rel.single) {
@@ -21,6 +21,8 @@ export interface JsonFieldDefinition {
21
21
  export interface JsonRelationshipDefinition {
22
22
  name: string;
23
23
  variant?: string;
24
+ /** PascalCase alias for disambiguation when multiple relationships target the same entity (e.g., "DestinedPerson") */
25
+ alias?: string;
24
26
  directory: string;
25
27
  single: boolean;
26
28
  relationshipName: string; // Backend-specific, ignored in frontend
@@ -49,6 +49,8 @@ export type FormComponentType =
49
49
  export interface FrontendRelationship {
50
50
  name: string; // e.g., "User"
51
51
  variant?: string; // e.g., "Author"
52
+ /** PascalCase alias for disambiguation when multiple relationships target the same entity */
53
+ alias?: string;
52
54
  directory: string; // e.g., "foundations"
53
55
  single: boolean;
54
56
  nullable: boolean;
@@ -178,6 +178,55 @@ export function validateJsonSchema(schema: any): ValidationError[] {
178
178
  severity: "warning",
179
179
  });
180
180
  }
181
+
182
+ // Validate alias format if provided (must be PascalCase)
183
+ if (rel.alias && !/^[A-Z][a-zA-Z0-9]*$/.test(rel.alias)) {
184
+ errors.push({
185
+ field: `relationships[${index}].alias`,
186
+ message: 'Alias must be PascalCase (e.g., "DestinedTo", "ReceivedBy")',
187
+ severity: "error",
188
+ });
189
+ }
190
+ });
191
+
192
+ // Check for duplicate relationship targets without alias
193
+ const nameCount = new Map<string, number[]>();
194
+ schema.relationships.forEach((rel: any, index: number) => {
195
+ const name = rel.name;
196
+ if (!nameCount.has(name)) {
197
+ nameCount.set(name, []);
198
+ }
199
+ nameCount.get(name)!.push(index);
200
+ });
201
+
202
+ for (const [name, indices] of nameCount.entries()) {
203
+ if (indices.length > 1) {
204
+ for (const idx of indices) {
205
+ const rel = schema.relationships[idx];
206
+ if (!rel.alias) {
207
+ errors.push({
208
+ field: `relationships[${idx}].alias`,
209
+ message: `Relationship to "${name}" appears ${indices.length} times. All instances must have an "alias" field to avoid key collisions. Example: "alias": "DestinedTo"`,
210
+ severity: "error",
211
+ });
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ // Check for duplicate aliases
218
+ const aliasSet = new Set<string>();
219
+ schema.relationships.forEach((rel: any, index: number) => {
220
+ if (rel.alias) {
221
+ if (aliasSet.has(rel.alias)) {
222
+ errors.push({
223
+ field: `relationships[${index}].alias`,
224
+ message: `Duplicate alias "${rel.alias}". Each alias must be unique.`,
225
+ severity: "error",
226
+ });
227
+ }
228
+ aliasSet.add(rel.alias);
229
+ }
181
230
  });
182
231
  }
183
232
 
@@ -225,7 +274,7 @@ export function formatValidationErrors(errors: ValidationError[]): string {
225
274
  * Validation result interface
226
275
  */
227
276
  export interface ValidationResult {
228
- data: JsonModuleDefinition | null;
277
+ data: JsonModuleDefinition[] | null;
229
278
  errors: string[];
230
279
  warnings: string[];
231
280
  }
@@ -266,36 +315,39 @@ export function parseAndValidate(filePath: string): ValidationResult {
266
315
  return result;
267
316
  }
268
317
 
269
- // Handle array format (for bulk import compatibility)
270
- if (Array.isArray(schema)) {
271
- if (schema.length === 0) {
272
- result.errors.push("JSON array is empty");
273
- return result;
274
- }
275
- if (schema.length > 1) {
276
- result.warnings.push(
277
- `JSON file contains ${schema.length} definitions. Only processing the first one.`
278
- );
279
- }
280
- schema = schema[0];
318
+ // Normalize to array
319
+ const schemas: any[] = Array.isArray(schema) ? schema : [schema];
320
+ if (schemas.length === 0) {
321
+ result.errors.push("JSON array is empty");
322
+ return result;
281
323
  }
282
324
 
283
- // Validate
284
- const validationErrors = validateJsonSchema(schema);
325
+ // Validate each definition
326
+ const validSchemas: JsonModuleDefinition[] = [];
327
+ for (let i = 0; i < schemas.length; i++) {
328
+ const item = schemas[i];
329
+ const prefix = schemas.length > 1 ? `[${i}] ` : "";
330
+ const validationErrors = validateJsonSchema(item);
331
+
332
+ let hasErrors = false;
333
+ validationErrors.forEach((ve) => {
334
+ const msg = `${prefix}${ve.field}: ${ve.message}`;
335
+ if (ve.severity === "error") {
336
+ result.errors.push(msg);
337
+ hasErrors = true;
338
+ } else {
339
+ result.warnings.push(msg);
340
+ }
341
+ });
285
342
 
286
- // Separate errors and warnings
287
- validationErrors.forEach((ve) => {
288
- const msg = `${ve.field}: ${ve.message}`;
289
- if (ve.severity === "error") {
290
- result.errors.push(msg);
291
- } else {
292
- result.warnings.push(msg);
343
+ if (!hasErrors) {
344
+ validSchemas.push(item as JsonModuleDefinition);
293
345
  }
294
- });
346
+ }
295
347
 
296
- // Only set data if validation passed
297
- if (result.errors.length === 0) {
298
- result.data = schema as JsonModuleDefinition;
348
+ // Only set data if at least one schema passed validation
349
+ if (result.errors.length === 0 && validSchemas.length > 0) {
350
+ result.data = validSchemas;
299
351
  }
300
352
 
301
353
  return result;
@@ -305,5 +357,5 @@ export function parseAndValidate(filePath: string): ValidationResult {
305
357
  * Check if validation result passed (no errors)
306
358
  */
307
359
  export function validationPassed(result: ValidationResult): boolean {
308
- return result.errors.length === 0 && result.data !== null;
360
+ return result.errors.length === 0 && result.data !== null && result.data.length > 0;
309
361
  }