@eide/uniformgen 0.1.3 → 0.1.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.
@@ -100,20 +100,20 @@ export async function login(options) {
100
100
  reject(new Error('Invalid state parameter'));
101
101
  return;
102
102
  }
103
- // Derive admin URL from API URL (api-dev.eide.app -> admin-dev.eide.app)
103
+ // Derive main URL from API URL (api.foir.build -> foir.build)
104
104
  const apiHost = new URL(options.apiUrl).host;
105
- const adminHost = apiHost.replace(/^api/, 'admin');
106
- const adminUrl = `https://${adminHost}`;
105
+ const mainHost = apiHost.replace(/^api\./, '');
106
+ const mainUrl = `https://${mainHost}`;
107
107
  res.writeHead(200, { 'Content-Type': 'text/html' });
108
108
  res.end(`
109
109
  <html>
110
110
  <head>
111
- <meta http-equiv="refresh" content="2;url=${adminUrl}">
111
+ <meta http-equiv="refresh" content="2;url=${mainUrl}">
112
112
  </head>
113
113
  <body style="font-family: system-ui; text-align: center; padding: 50px;">
114
114
  <h1>Authentication successful!</h1>
115
- <p>Redirecting to admin panel...</p>
116
- <p style="color: #666; font-size: 14px;">If not redirected, <a href="${adminUrl}">click here</a>.</p>
115
+ <p>Redirecting...</p>
116
+ <p style="color: #666; font-size: 14px;">If not redirected, <a href="${mainUrl}">click here</a>.</p>
117
117
  </body>
118
118
  </html>
119
119
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAaA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmVD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJ9D"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAaA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmXD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8J9D"}
@@ -41,17 +41,46 @@ async function fetchRemoteSchemas(apiUrl, accessToken, tenantId, projectId) {
41
41
  `,
42
42
  }),
43
43
  });
44
- if (!response.ok) {
45
- const errorText = await response.text().catch(() => 'No response body');
44
+ // Parse response body regardless of status code
45
+ // GraphQL can return errors with 200 or 500 status
46
+ const responseText = await response.text().catch(() => 'No response body');
47
+ let result;
48
+ try {
49
+ result = JSON.parse(responseText);
50
+ }
51
+ catch {
46
52
  console.error(`[Debug] API URL: ${apiUrl}`);
47
53
  console.error(`[Debug] Response status: ${response.status}`);
48
- console.error(`[Debug] Response body: ${errorText.substring(0, 500)}`);
49
- throw new Error(`Failed to fetch schemas: ${response.statusText}`);
54
+ console.error(`[Debug] Response body: ${responseText.substring(0, 500)}`);
55
+ throw new Error(`Failed to fetch schemas: Invalid JSON response`);
50
56
  }
51
- const result = (await response.json());
57
+ // Check for GraphQL errors
52
58
  if (result.errors && result.errors.length > 0) {
59
+ const firstError = result.errors[0];
60
+ const errorCode = firstError?.extensions?.code;
61
+ const errorMessage = firstError?.message ?? 'Unknown error';
62
+ console.error(`[Debug] API URL: ${apiUrl}`);
63
+ console.error(`[Debug] Response status: ${response.status}`);
53
64
  console.error(`[Debug] GraphQL errors:`, JSON.stringify(result.errors, null, 2));
54
- throw new Error(`GraphQL error: ${result.errors[0]?.message ?? 'Unknown error'}`);
65
+ // Provide helpful hints for common errors
66
+ if (errorCode === 'UNAUTHENTICATED' || errorMessage.includes('Session expired')) {
67
+ throw new Error(`Authentication failed: ${errorMessage}\n` +
68
+ `Your session may have expired. Run 'uniformgen login' to re-authenticate.`);
69
+ }
70
+ if (errorMessage === 'Unexpected error.' || errorMessage === 'Unexpected error') {
71
+ throw new Error(`Server error: The API returned an unexpected error.\n` +
72
+ `This may be a temporary issue. If it persists, check:\n` +
73
+ ` - Your session is valid (run 'uniformgen login')\n` +
74
+ ` - The API is accessible at ${apiUrl}\n` +
75
+ ` - You have access to the selected project`);
76
+ }
77
+ throw new Error(`GraphQL error: ${errorMessage}`);
78
+ }
79
+ // Check HTTP status after checking for GraphQL errors
80
+ if (!response.ok && !result.data) {
81
+ console.error(`[Debug] API URL: ${apiUrl}`);
82
+ console.error(`[Debug] Response status: ${response.status}`);
83
+ throw new Error(`Failed to fetch schemas: ${response.statusText}`);
55
84
  }
56
85
  const models = new Map();
57
86
  for (const model of result.data?.entityModels?.items ?? []) {
@@ -241,6 +270,15 @@ export async function push(options) {
241
270
  console.log('No project selected. Run `uniformgen select-project` first.');
242
271
  process.exit(1);
243
272
  }
273
+ // Validate that accessToken looks like a session token, not an API key
274
+ // Session tokens are typically UUIDs or similar, not prefixed with pk_/sk_
275
+ if (credentials.accessToken.startsWith('pk_') || credentials.accessToken.startsWith('sk_')) {
276
+ console.log(chalk.red('Error: Invalid access token format.'));
277
+ console.log(chalk.yellow('Your credentials file contains an API key instead of a session token.\n' +
278
+ 'This can happen if credentials were manually edited.\n\n' +
279
+ 'To fix this, run `uniformgen logout` then `uniformgen login` to get fresh credentials.'));
280
+ process.exit(1);
281
+ }
244
282
  console.log(`Syncing schemas to project: ${credentials.selectedProject.name}\n`);
245
283
  // Load local schemas
246
284
  console.log(`Loading schemas from ${options.schemasDir}...`);
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAgEA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyX9D"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAgEA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmY9D"}
@@ -69,10 +69,21 @@ export async function sync(options) {
69
69
  if (entityModels.length > 0) {
70
70
  const modelsDir = join(config.output.types, 'models');
71
71
  for (const model of entityModels) {
72
- files.push({
73
- path: join(modelsDir, `${model.key}.ts`),
74
- content: generateEntityModelTypes(model, entityModels),
75
- });
72
+ try {
73
+ files.push({
74
+ path: join(modelsDir, `${model.key}.ts`),
75
+ content: generateEntityModelTypes(model, entityModels),
76
+ });
77
+ }
78
+ catch (error) {
79
+ console.error(chalk.red(`\nError generating types for model: ${model.key}`));
80
+ console.error(chalk.gray(` Model name: ${model.name}`));
81
+ console.error(chalk.gray(` Fields: ${model.fields?.length ?? 0}`));
82
+ if (model.fields?.length > 0) {
83
+ console.error(chalk.gray(` Field keys: ${model.fields.map(f => f.key).join(', ')}`));
84
+ }
85
+ throw error;
86
+ }
76
87
  }
77
88
  files.push({
78
89
  path: join(modelsDir, 'index.ts'),
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-schemas.d.ts","sourceRoot":"","sources":["../../src/fetcher/fetch-schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-schemas.d.ts","sourceRoot":"","sources":["../../src/fetcher/fetch-schemas.ts"],"names":[],"mappings":"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"}
@@ -41,12 +41,14 @@ function getInternalGraphQLEndpoint(apiUrl) {
41
41
  * Extracts CMS config from extensions.cms (flattened structure)
42
42
  */
43
43
  function transformEntityModel(raw) {
44
+ // Defensive: metadata might be null/undefined in some edge cases
45
+ const metadata = raw.metadata ?? {};
44
46
  return {
45
47
  key: raw.key,
46
- name: raw.metadata.name,
47
- pluralName: raw.metadata.pluralName,
48
- description: raw.metadata.description,
49
- category: raw.metadata.category,
48
+ name: metadata.name ?? raw.key, // Fall back to key if name is missing
49
+ pluralName: metadata.pluralName,
50
+ description: metadata.description,
51
+ category: metadata.category,
50
52
  tier: raw.schema?.tier ?? 2, // Default to tier 2 (versioned, no variants)
51
53
  editorMode: raw.editorMode,
52
54
  fields: raw.schema?.fields || [],
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/generators/admin/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CA0VR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CAkJR"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/generators/admin/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CA4VR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CAmJR"}
@@ -22,12 +22,14 @@ export function generateAdminQueriesReact(model, _allModels) {
22
22
  const pluralName = model.pluralName
23
23
  ? toCamelCase(model.pluralName.replace(/\s+/g, ''))
24
24
  : `${camelName}s`;
25
+ // Use model.name with fallback for JSDoc comments
26
+ const displayName = model.name ?? model.key;
25
27
  const lines = [];
26
28
  // File header
27
29
  lines.push(`/**`);
28
- lines.push(` * ${model.name} - Admin Query Hooks`);
30
+ lines.push(` * ${displayName} - Admin Query Hooks`);
29
31
  lines.push(` *`);
30
- lines.push(` * React hooks for querying ${model.name} records in admin UIs.`);
32
+ lines.push(` * React hooks for querying ${displayName} records in admin UIs.`);
31
33
  lines.push(` *`);
32
34
  lines.push(` * @generated by UniformGen - DO NOT EDIT MANUALLY`);
33
35
  lines.push(` */`);
@@ -52,7 +54,7 @@ export function generateAdminQueriesReact(model, _allModels) {
52
54
  lines.push(`} from './types/${model.key}.js';`);
53
55
  lines.push('');
54
56
  // List result interface
55
- lines.push(`/** List result for ${model.name} records */`);
57
+ lines.push(`/** List result for ${displayName} records */`);
56
58
  lines.push(`export interface ${typeName}ListResult {`);
57
59
  lines.push(` items: ${typeName}Record[];`);
58
60
  lines.push(` total: number;`);
@@ -231,7 +233,7 @@ export function generateAdminQueriesReact(model, _allModels) {
231
233
  lines.push('');
232
234
  // use{Model}Records hook
233
235
  lines.push(`/**`);
234
- lines.push(` * List ${model.name} records with optional filtering`);
236
+ lines.push(` * List ${displayName} records with optional filtering`);
235
237
  lines.push(` *`);
236
238
  lines.push(` * @example`);
237
239
  lines.push(` * const { ${pluralName}, loading } = use${typeName}Records({`);
@@ -281,7 +283,7 @@ export function generateAdminQueriesReact(model, _allModels) {
281
283
  lines.push('');
282
284
  // use{Model}Record hook
283
285
  lines.push(`/**`);
284
- lines.push(` * Get a single ${model.name} record with all variants`);
286
+ lines.push(` * Get a single ${displayName} record with all variants`);
285
287
  lines.push(` *`);
286
288
  lines.push(` * @example`);
287
289
  lines.push(` * const { ${camelName}, loading } = use${typeName}Record('record-id');`);
@@ -309,7 +311,7 @@ export function generateAdminQueriesReact(model, _allModels) {
309
311
  lines.push('');
310
312
  // use{Model}Versions hook
311
313
  lines.push(`/**`);
312
- lines.push(` * Get version history for a ${model.name} variant`);
314
+ lines.push(` * Get version history for a ${displayName} variant`);
313
315
  lines.push(` *`);
314
316
  lines.push(` * @example`);
315
317
  lines.push(` * const { versions, loading } = use${typeName}Versions('variant-id', { limit: 10 });`);
@@ -349,12 +351,13 @@ export function generateAdminQueriesRemix(model, _allModels) {
349
351
  return '';
350
352
  }
351
353
  const typeName = toPascalCase(model.key);
354
+ const displayName = model.name ?? model.key;
352
355
  const lines = [];
353
356
  // File header
354
357
  lines.push(`/**`);
355
- lines.push(` * ${model.name} - Admin Query Functions`);
358
+ lines.push(` * ${displayName} - Admin Query Functions`);
356
359
  lines.push(` *`);
357
- lines.push(` * Server-side functions for querying ${model.name} records.`);
360
+ lines.push(` * Server-side functions for querying ${displayName} records.`);
358
361
  lines.push(` * Use in Remix loaders or Hydrogen server functions.`);
359
362
  lines.push(` *`);
360
363
  lines.push(` * @generated by UniformGen - DO NOT EDIT MANUALLY`);
@@ -384,7 +387,7 @@ export function generateAdminQueriesRemix(model, _allModels) {
384
387
  lines.push(`}`);
385
388
  lines.push('');
386
389
  // List result interface
387
- lines.push(`/** List result for ${model.name} records */`);
390
+ lines.push(`/** List result for ${displayName} records */`);
388
391
  lines.push(`export interface ${typeName}ListResult {`);
389
392
  lines.push(` items: ${typeName}Record[];`);
390
393
  lines.push(` total: number;`);
@@ -438,7 +441,7 @@ export function generateAdminQueriesRemix(model, _allModels) {
438
441
  lines.push(`// ============================================================================`);
439
442
  lines.push('');
440
443
  lines.push(`/**`);
441
- lines.push(` * List ${model.name} records`);
444
+ lines.push(` * List ${displayName} records`);
442
445
  lines.push(` */`);
443
446
  lines.push(`export async function list${typeName}Records(`);
444
447
  lines.push(` client: GraphQLClient,`);
@@ -454,7 +457,7 @@ export function generateAdminQueriesRemix(model, _allModels) {
454
457
  lines.push(`}`);
455
458
  lines.push('');
456
459
  lines.push(`/**`);
457
- lines.push(` * Get a single ${model.name} record with variants`);
460
+ lines.push(` * Get a single ${displayName} record with variants`);
458
461
  lines.push(` */`);
459
462
  lines.push(`export async function get${typeName}Record(client: GraphQLClient, id: string): Promise<${typeName}RecordWithVariants | null> {`);
460
463
  lines.push(` const result = await client.request<{ entityRecord: any }>(GET_${typeName.toUpperCase()}_RECORD, { id });`);
@@ -462,7 +465,7 @@ export function generateAdminQueriesRemix(model, _allModels) {
462
465
  lines.push(`}`);
463
466
  lines.push('');
464
467
  lines.push(`/**`);
465
- lines.push(` * Get version history for a ${model.name} variant`);
468
+ lines.push(` * Get version history for a ${displayName} variant`);
466
469
  lines.push(` */`);
467
470
  lines.push(`export async function get${typeName}Versions(`);
468
471
  lines.push(` client: GraphQLClient,`);
@@ -1 +1 @@
1
- {"version":3,"file":"entity-models.d.ts","sourceRoot":"","sources":["../../../src/generators/documents/entity-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkFvE"}
1
+ {"version":3,"file":"entity-models.d.ts","sourceRoot":"","sources":["../../../src/generators/documents/entity-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAmFvE"}
@@ -8,7 +8,8 @@ export function generateEntityModelDocuments(model) {
8
8
  const pluralName = model.pluralName
9
9
  ? toPascalCase(model.pluralName.replace(/\s+/g, ''))
10
10
  : `${typeName}s`;
11
- return `# Generated GraphQL operations for ${model.name}
11
+ const displayName = model.name ?? model.key;
12
+ return `# Generated GraphQL operations for ${displayName}
12
13
  # @generated by UniformGen - DO NOT EDIT MANUALLY
13
14
 
14
15
  fragment ${typeName}Fields on EntityRecord {
@@ -1 +1 @@
1
- {"version":3,"file":"entity-models.d.ts","sourceRoot":"","sources":["../../../src/generators/types/entity-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,gCAAgC,CAAC;AA+B/E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACvB,MAAM,CAiCR;AA6ND;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsBvE"}
1
+ {"version":3,"file":"entity-models.d.ts","sourceRoot":"","sources":["../../../src/generators/types/entity-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,gCAAgC,CAAC;AA+B/E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACvB,MAAM,CAiCR;AA8ND;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsBvE"}
@@ -89,9 +89,10 @@ function generateConfigObject(model, fields, configName) {
89
89
  lines.push(` * @generated from entity model '${model.key}'`);
90
90
  lines.push(' */');
91
91
  // Config object
92
+ const escapedName = (model.name ?? model.key).replace(/'/g, "\\'");
92
93
  lines.push(`export const ${configName} = {`);
93
94
  lines.push(` key: '${model.key}',`);
94
- lines.push(` name: '${model.name.replace(/'/g, "\\'")}',`);
95
+ lines.push(` name: '${escapedName}',`);
95
96
  if (model.description) {
96
97
  lines.push(` description: '${model.description.replace(/'/g, "\\'")}',`);
97
98
  }