@flxbl-dev/cli 0.1.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 (135) hide show
  1. package/README.md +185 -0
  2. package/bin/flxbl +5 -0
  3. package/dist/codegen/client-generator.d.ts +6 -0
  4. package/dist/codegen/client-generator.d.ts.map +1 -0
  5. package/dist/codegen/client-generator.js +46 -0
  6. package/dist/codegen/client-generator.js.map +1 -0
  7. package/dist/codegen/codegen-pipeline.d.ts +23 -0
  8. package/dist/codegen/codegen-pipeline.d.ts.map +1 -0
  9. package/dist/codegen/codegen-pipeline.js +61 -0
  10. package/dist/codegen/codegen-pipeline.js.map +1 -0
  11. package/dist/codegen/enum-generator.d.ts +6 -0
  12. package/dist/codegen/enum-generator.d.ts.map +1 -0
  13. package/dist/codegen/enum-generator.js +40 -0
  14. package/dist/codegen/enum-generator.js.map +1 -0
  15. package/dist/codegen/index-generator.d.ts +8 -0
  16. package/dist/codegen/index-generator.d.ts.map +1 -0
  17. package/dist/codegen/index-generator.js +23 -0
  18. package/dist/codegen/index-generator.js.map +1 -0
  19. package/dist/codegen/query-types-generator.d.ts +8 -0
  20. package/dist/codegen/query-types-generator.d.ts.map +1 -0
  21. package/dist/codegen/query-types-generator.js +30 -0
  22. package/dist/codegen/query-types-generator.js.map +1 -0
  23. package/dist/codegen/relationship-generator.d.ts +6 -0
  24. package/dist/codegen/relationship-generator.d.ts.map +1 -0
  25. package/dist/codegen/relationship-generator.js +40 -0
  26. package/dist/codegen/relationship-generator.js.map +1 -0
  27. package/dist/codegen/schema-fetcher.d.ts +27 -0
  28. package/dist/codegen/schema-fetcher.d.ts.map +1 -0
  29. package/dist/codegen/schema-fetcher.js +42 -0
  30. package/dist/codegen/schema-fetcher.js.map +1 -0
  31. package/dist/codegen/type-generator.d.ts +13 -0
  32. package/dist/codegen/type-generator.d.ts.map +1 -0
  33. package/dist/codegen/type-generator.js +62 -0
  34. package/dist/codegen/type-generator.js.map +1 -0
  35. package/dist/commands/data.d.ts +6 -0
  36. package/dist/commands/data.d.ts.map +1 -0
  37. package/dist/commands/data.js +85 -0
  38. package/dist/commands/data.js.map +1 -0
  39. package/dist/commands/dev.d.ts +6 -0
  40. package/dist/commands/dev.d.ts.map +1 -0
  41. package/dist/commands/dev.js +81 -0
  42. package/dist/commands/dev.js.map +1 -0
  43. package/dist/commands/generate.d.ts +13 -0
  44. package/dist/commands/generate.d.ts.map +1 -0
  45. package/dist/commands/generate.js +69 -0
  46. package/dist/commands/generate.js.map +1 -0
  47. package/dist/commands/init.d.ts +6 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +82 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/login.d.ts +6 -0
  52. package/dist/commands/login.d.ts.map +1 -0
  53. package/dist/commands/login.js +68 -0
  54. package/dist/commands/login.js.map +1 -0
  55. package/dist/commands/logout.d.ts +6 -0
  56. package/dist/commands/logout.d.ts.map +1 -0
  57. package/dist/commands/logout.js +33 -0
  58. package/dist/commands/logout.js.map +1 -0
  59. package/dist/commands/schema/create.d.ts +6 -0
  60. package/dist/commands/schema/create.d.ts.map +1 -0
  61. package/dist/commands/schema/create.js +466 -0
  62. package/dist/commands/schema/create.js.map +1 -0
  63. package/dist/commands/schema/delete.d.ts +6 -0
  64. package/dist/commands/schema/delete.d.ts.map +1 -0
  65. package/dist/commands/schema/delete.js +50 -0
  66. package/dist/commands/schema/delete.js.map +1 -0
  67. package/dist/commands/schema/diff.d.ts +6 -0
  68. package/dist/commands/schema/diff.d.ts.map +1 -0
  69. package/dist/commands/schema/diff.js +144 -0
  70. package/dist/commands/schema/diff.js.map +1 -0
  71. package/dist/commands/schema/export.d.ts +6 -0
  72. package/dist/commands/schema/export.d.ts.map +1 -0
  73. package/dist/commands/schema/export.js +120 -0
  74. package/dist/commands/schema/export.js.map +1 -0
  75. package/dist/commands/schema/index.d.ts +8 -0
  76. package/dist/commands/schema/index.d.ts.map +1 -0
  77. package/dist/commands/schema/index.js +32 -0
  78. package/dist/commands/schema/index.js.map +1 -0
  79. package/dist/commands/schema/migrate.d.ts +6 -0
  80. package/dist/commands/schema/migrate.d.ts.map +1 -0
  81. package/dist/commands/schema/migrate.js +70 -0
  82. package/dist/commands/schema/migrate.js.map +1 -0
  83. package/dist/commands/schema/schema-file.d.ts +43 -0
  84. package/dist/commands/schema/schema-file.d.ts.map +1 -0
  85. package/dist/commands/schema/schema-file.js +106 -0
  86. package/dist/commands/schema/schema-file.js.map +1 -0
  87. package/dist/commands/schema/show.d.ts +15 -0
  88. package/dist/commands/schema/show.d.ts.map +1 -0
  89. package/dist/commands/schema/show.js +100 -0
  90. package/dist/commands/schema/show.js.map +1 -0
  91. package/dist/commands/schema/template.d.ts +6 -0
  92. package/dist/commands/schema/template.d.ts.map +1 -0
  93. package/dist/commands/schema/template.js +110 -0
  94. package/dist/commands/schema/template.js.map +1 -0
  95. package/dist/commands/schema/validation.d.ts +87 -0
  96. package/dist/commands/schema/validation.d.ts.map +1 -0
  97. package/dist/commands/schema/validation.js +281 -0
  98. package/dist/commands/schema/validation.js.map +1 -0
  99. package/dist/commands/schema/versions.d.ts +6 -0
  100. package/dist/commands/schema/versions.d.ts.map +1 -0
  101. package/dist/commands/schema/versions.js +64 -0
  102. package/dist/commands/schema/versions.js.map +1 -0
  103. package/dist/commands/whoami.d.ts +6 -0
  104. package/dist/commands/whoami.d.ts.map +1 -0
  105. package/dist/commands/whoami.js +58 -0
  106. package/dist/commands/whoami.js.map +1 -0
  107. package/dist/config/loader.d.ts +23 -0
  108. package/dist/config/loader.d.ts.map +1 -0
  109. package/dist/config/loader.js +47 -0
  110. package/dist/config/loader.js.map +1 -0
  111. package/dist/config/types.d.ts +24 -0
  112. package/dist/config/types.d.ts.map +1 -0
  113. package/dist/config/types.js +5 -0
  114. package/dist/config/types.js.map +1 -0
  115. package/dist/index.d.ts +6 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +33 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/ui/logger.d.ts +16 -0
  120. package/dist/ui/logger.d.ts.map +1 -0
  121. package/dist/ui/logger.js +18 -0
  122. package/dist/ui/logger.js.map +1 -0
  123. package/dist/ui/prompts.d.ts +6 -0
  124. package/dist/ui/prompts.d.ts.map +1 -0
  125. package/dist/ui/prompts.js +6 -0
  126. package/dist/ui/prompts.js.map +1 -0
  127. package/dist/ui/table.d.ts +11 -0
  128. package/dist/ui/table.d.ts.map +1 -0
  129. package/dist/ui/table.js +25 -0
  130. package/dist/ui/table.js.map +1 -0
  131. package/dist/watcher/schema-watcher.d.ts +30 -0
  132. package/dist/watcher/schema-watcher.d.ts.map +1 -0
  133. package/dist/watcher/schema-watcher.js +53 -0
  134. package/dist/watcher/schema-watcher.js.map +1 -0
  135. package/package.json +62 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * flxbl schema show — Display active schema information
3
+ *
4
+ * Migrated from the original flat schema.ts command.
5
+ */
6
+ import { log, spinner, chalk } from '../../ui/logger.js';
7
+ import { renderTable } from '../../ui/table.js';
8
+ import { loadFlxblConfig } from '../../config/loader.js';
9
+ import { resolveAuth, fetchActiveSchema, } from '../../codegen/schema-fetcher.js';
10
+ export function registerShowCommand(parent) {
11
+ parent
12
+ .command('show')
13
+ .description('Display active schema information')
14
+ .option('--format <format>', 'Output format: table, tree, or json', 'table')
15
+ .option('--instance <url>', 'FLXBL instance URL')
16
+ .option('--api-key <key>', 'API key for authentication')
17
+ .action(showAction);
18
+ }
19
+ export async function showAction(opts) {
20
+ const loaded = await loadFlxblConfig();
21
+ const config = loaded?.config;
22
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
23
+ if (!instanceUrl) {
24
+ log.error('No FLXBL instance URL configured.');
25
+ process.exit(1);
26
+ }
27
+ const s = spinner('Fetching schema...').start();
28
+ try {
29
+ const { client } = await resolveAuth({
30
+ apiKey: opts.apiKey,
31
+ instanceUrl,
32
+ });
33
+ const schema = await fetchActiveSchema(client);
34
+ s.stop();
35
+ switch (opts.format) {
36
+ case 'json':
37
+ console.log(JSON.stringify(schema, null, 2));
38
+ break;
39
+ case 'tree':
40
+ renderTree(schema);
41
+ break;
42
+ default:
43
+ renderTableView(schema);
44
+ break;
45
+ }
46
+ }
47
+ catch (error) {
48
+ s.fail('Failed to fetch schema');
49
+ log.error(error instanceof Error ? error.message : String(error));
50
+ process.exit(1);
51
+ }
52
+ }
53
+ function renderTableView(schema) {
54
+ log.plain(`${chalk.bold(schema.name)} v${schema.version} ${chalk.dim(`(${schema.status})`)}`);
55
+ log.plain('');
56
+ log.plain(chalk.bold('Entities:'));
57
+ renderTable([
58
+ { header: 'Entity', key: 'name' },
59
+ { header: 'Fields', key: 'fieldCount' },
60
+ { header: 'Identity', key: 'identity' },
61
+ ], schema.entities.map((e) => ({
62
+ name: e.name,
63
+ fieldCount: e.fields.length,
64
+ identity: e.isIdentity ? chalk.green('yes') : chalk.dim('no'),
65
+ })));
66
+ if (schema.relationships.length > 0) {
67
+ log.plain('');
68
+ log.plain(chalk.bold('Relationships:'));
69
+ const entityMap = new Map(schema.entities.map((e) => [e.id, e.name]));
70
+ renderTable([
71
+ { header: 'Relationship', key: 'name' },
72
+ { header: 'Source', key: 'source' },
73
+ { header: 'Target', key: 'target' },
74
+ { header: 'Cardinality', key: 'cardinality' },
75
+ ], schema.relationships.map((r) => ({
76
+ name: r.name,
77
+ source: entityMap.get(r.sourceEntityId) || '?',
78
+ target: entityMap.get(r.targetEntityId) || '?',
79
+ cardinality: r.cardinality,
80
+ })));
81
+ }
82
+ }
83
+ export function renderTree(schema) {
84
+ log.plain(`${chalk.bold(schema.name)} v${schema.version}`);
85
+ for (let i = 0; i < schema.entities.length; i++) {
86
+ const entity = schema.entities[i];
87
+ const isLast = i === schema.entities.length - 1;
88
+ const prefix = isLast ? '└── ' : '├── ';
89
+ const childPrefix = isLast ? ' ' : '│ ';
90
+ log.plain(`${prefix}${chalk.cyan(entity.name)}${entity.isIdentity ? chalk.dim(' [identity]') : ''}`);
91
+ for (let j = 0; j < entity.fields.length; j++) {
92
+ const field = entity.fields[j];
93
+ const fIsLast = j === entity.fields.length - 1;
94
+ const fPrefix = fIsLast ? '└── ' : '├── ';
95
+ const required = field.required ? '' : chalk.dim('?');
96
+ log.plain(`${childPrefix}${fPrefix}${field.name}${required}: ${chalk.yellow(field.type)}`);
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/schema/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * flxbl schema template — Browse and create schemas from templates
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerTemplateCommand(parent: Command): void;
6
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAqB7D"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * flxbl schema template — Browse and create schemas from templates
3
+ */
4
+ import { log, spinner, chalk } from '../../ui/logger.js';
5
+ import { renderTable } from '../../ui/table.js';
6
+ import { loadFlxblConfig } from '../../config/loader.js';
7
+ import { resolveAuth } from '../../codegen/schema-fetcher.js';
8
+ export function registerTemplateCommand(parent) {
9
+ const templateCmd = parent
10
+ .command('template')
11
+ .description('Browse and create schemas from templates');
12
+ templateCmd
13
+ .command('list')
14
+ .description('List available schema templates')
15
+ .option('--instance <url>', 'FLXBL instance URL')
16
+ .option('--api-key <key>', 'API key for authentication')
17
+ .action(templateListAction);
18
+ templateCmd
19
+ .command('create <templateId>')
20
+ .description('Create and activate a schema from a template')
21
+ .option('--name <name>', 'Schema name (overrides template default)')
22
+ .option('--description <desc>', 'Schema description')
23
+ .option('--activate', 'Activate immediately after creation')
24
+ .option('--instance <url>', 'FLXBL instance URL')
25
+ .option('--api-key <key>', 'API key for authentication')
26
+ .action(templateCreateAction);
27
+ }
28
+ async function templateListAction(opts) {
29
+ const loaded = await loadFlxblConfig();
30
+ const config = loaded?.config;
31
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
32
+ if (!instanceUrl) {
33
+ log.error('No FLXBL instance URL configured.');
34
+ process.exit(1);
35
+ }
36
+ const s = spinner('Loading templates...').start();
37
+ try {
38
+ const { client } = await resolveAuth({
39
+ apiKey: opts.apiKey,
40
+ instanceUrl,
41
+ });
42
+ const templates = await client.listTemplates();
43
+ s.stop();
44
+ if (templates.length === 0) {
45
+ log.warn('No templates available.');
46
+ return;
47
+ }
48
+ renderTable([
49
+ { header: 'ID', key: 'id' },
50
+ { header: 'Name', key: 'name' },
51
+ { header: 'Category', key: 'category' },
52
+ { header: 'Complexity', key: 'complexity' },
53
+ { header: 'Entities', key: 'entities' },
54
+ { header: 'Relationships', key: 'relationships' },
55
+ { header: 'Description', key: 'description' },
56
+ ], templates.map((t) => ({
57
+ id: chalk.dim(t.id.slice(0, 8) + '...'),
58
+ name: chalk.bold(t.name),
59
+ category: t.category,
60
+ complexity: t.complexity,
61
+ entities: t.entityCount,
62
+ relationships: t.relationshipCount,
63
+ description: t.description,
64
+ })));
65
+ }
66
+ catch (error) {
67
+ s.fail('Failed to load templates');
68
+ log.error(error instanceof Error ? error.message : String(error));
69
+ process.exit(1);
70
+ }
71
+ }
72
+ async function templateCreateAction(templateId, opts) {
73
+ const loaded = await loadFlxblConfig();
74
+ const config = loaded?.config;
75
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
76
+ if (!instanceUrl) {
77
+ log.error('No FLXBL instance URL configured.');
78
+ process.exit(1);
79
+ }
80
+ const s = spinner('Creating schema from template...').start();
81
+ try {
82
+ const { client } = await resolveAuth({
83
+ apiKey: opts.apiKey,
84
+ instanceUrl,
85
+ });
86
+ const created = await client.createSchemaFromTemplate(templateId, opts.name, opts.description);
87
+ s.succeed(`Schema ${chalk.bold(created.name)} created from template`);
88
+ if (opts.activate) {
89
+ const activateSpinner = spinner('Activating schema...').start();
90
+ try {
91
+ await client.activateSchema(created.id);
92
+ activateSpinner.succeed('Schema activated');
93
+ }
94
+ catch (error) {
95
+ activateSpinner.fail('Failed to activate');
96
+ log.error(error instanceof Error ? error.message : String(error));
97
+ }
98
+ }
99
+ else {
100
+ log.dim(`Schema ID: ${created.id}`);
101
+ log.dim('Use --activate to activate immediately.');
102
+ }
103
+ }
104
+ catch (error) {
105
+ s.fail('Failed to create schema from template');
106
+ log.error(error instanceof Error ? error.message : String(error));
107
+ process.exit(1);
108
+ }
109
+ }
110
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/commands/schema/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Client-side schema validation
3
+ *
4
+ * Ported from mcp/src/tools/validate-schema.tool.ts for reuse in CLI.
5
+ */
6
+ import { type CreateSchemaEntityDto, type CreateSchemaRelationshipDto, type TenantSchema } from '@flxbl-dev/shared';
7
+ export interface ValidationIssue {
8
+ severity: 'error' | 'warning' | 'info';
9
+ category: string;
10
+ message: string;
11
+ path?: string;
12
+ }
13
+ export interface BreakingChangeInfo {
14
+ type: string;
15
+ entity: string;
16
+ field?: string;
17
+ description: string;
18
+ }
19
+ export interface ValidationResult {
20
+ valid: boolean;
21
+ errors: ValidationIssue[];
22
+ warnings: ValidationIssue[];
23
+ suggestions: ValidationIssue[];
24
+ breakingChanges: BreakingChangeInfo[];
25
+ }
26
+ export declare function validateReservedNames(entities: Array<{
27
+ name: string;
28
+ fields: Array<{
29
+ name: string;
30
+ }>;
31
+ }>): ValidationIssue[];
32
+ export declare function validateFieldTypes(entities: Array<{
33
+ name: string;
34
+ fields: Array<{
35
+ name: string;
36
+ type: string;
37
+ enumValues?: string[];
38
+ vectorDimensions?: number;
39
+ }>;
40
+ }>): ValidationIssue[];
41
+ export declare function validateRelationships(entities: Array<{
42
+ name: string;
43
+ }>, relationships?: Array<{
44
+ name: string;
45
+ sourceEntityName: string;
46
+ targetEntityName: string;
47
+ cardinality: string;
48
+ fields?: Array<{
49
+ name: string;
50
+ type: string;
51
+ }>;
52
+ }>): ValidationIssue[];
53
+ export declare function validateNamingConventions(entities: Array<{
54
+ name: string;
55
+ fields: Array<{
56
+ name: string;
57
+ }>;
58
+ }>, relationships?: Array<{
59
+ name: string;
60
+ }>): ValidationIssue[];
61
+ export declare function validateIdentityEntities(entities: Array<{
62
+ name: string;
63
+ fields: Array<{
64
+ name: string;
65
+ type: string;
66
+ required: boolean;
67
+ }>;
68
+ isIdentity?: boolean;
69
+ identifierField?: string;
70
+ }>): ValidationIssue[];
71
+ export declare function detectBreakingChanges(activeSchema: TenantSchema | null, newEntities: Array<{
72
+ name: string;
73
+ fields: Array<{
74
+ name: string;
75
+ type: string;
76
+ required: boolean;
77
+ }>;
78
+ }>, newRelationships?: Array<{
79
+ name: string;
80
+ sourceEntityName: string;
81
+ targetEntityName: string;
82
+ }>): BreakingChangeInfo[];
83
+ /**
84
+ * Run all validations against a schema definition.
85
+ */
86
+ export declare function validateSchema(entities: CreateSchemaEntityDto[], relationships?: CreateSchemaRelationshipDto[], activeSchema?: TenantSchema | null): ValidationResult;
87
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Client-side schema validation
3
+ *
4
+ * Ported from mcp/src/tools/validate-schema.tool.ts for reuse in CLI.
5
+ */
6
+ import { FieldType, RelationshipCardinality, RESERVED_ENTITY_NAMES, RESERVED_FIELD_NAMES, } from '@flxbl-dev/shared';
7
+ export function validateReservedNames(entities) {
8
+ const issues = [];
9
+ for (const entity of entities) {
10
+ if (RESERVED_ENTITY_NAMES.includes(entity.name)) {
11
+ issues.push({
12
+ severity: 'error',
13
+ category: 'Reserved Name',
14
+ message: `Entity name "${entity.name}" is reserved by GraphQL`,
15
+ path: `entities.${entity.name}`,
16
+ });
17
+ }
18
+ for (const field of entity.fields) {
19
+ if (RESERVED_FIELD_NAMES.includes(field.name)) {
20
+ issues.push({
21
+ severity: 'error',
22
+ category: 'Reserved Name',
23
+ message: `Field name "${field.name}" is reserved`,
24
+ path: `entities.${entity.name}.fields.${field.name}`,
25
+ });
26
+ }
27
+ }
28
+ }
29
+ return issues;
30
+ }
31
+ export function validateFieldTypes(entities) {
32
+ const issues = [];
33
+ const validTypes = Object.values(FieldType);
34
+ for (const entity of entities) {
35
+ for (const field of entity.fields) {
36
+ if (!validTypes.includes(field.type)) {
37
+ issues.push({
38
+ severity: 'error',
39
+ category: 'Invalid Type',
40
+ message: `Field "${field.name}" has invalid type "${field.type}". Valid types: ${validTypes.join(', ')}`,
41
+ path: `entities.${entity.name}.fields.${field.name}`,
42
+ });
43
+ }
44
+ if (field.type === 'ENUM' &&
45
+ (!field.enumValues || field.enumValues.length === 0)) {
46
+ issues.push({
47
+ severity: 'error',
48
+ category: 'Missing Enum Values',
49
+ message: `ENUM field "${field.name}" must have at least one enumValues entry`,
50
+ path: `entities.${entity.name}.fields.${field.name}`,
51
+ });
52
+ }
53
+ if (field.type === 'VECTOR') {
54
+ const dims = field.vectorDimensions;
55
+ if (dims !== undefined && (dims < 1 || dims > 4096)) {
56
+ issues.push({
57
+ severity: 'error',
58
+ category: 'Invalid Vector Dimensions',
59
+ message: `VECTOR field "${field.name}" dimensions must be between 1 and 4096, got ${dims}`,
60
+ path: `entities.${entity.name}.fields.${field.name}`,
61
+ });
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return issues;
67
+ }
68
+ export function validateRelationships(entities, relationships) {
69
+ const issues = [];
70
+ if (!relationships || relationships.length === 0) {
71
+ return issues;
72
+ }
73
+ const entityNames = new Set(entities.map((e) => e.name));
74
+ const validCardinalities = Object.values(RelationshipCardinality);
75
+ for (const rel of relationships) {
76
+ if (!entityNames.has(rel.sourceEntityName)) {
77
+ issues.push({
78
+ severity: 'error',
79
+ category: 'Invalid Reference',
80
+ message: `Relationship "${rel.name}" references non-existent source entity "${rel.sourceEntityName}"`,
81
+ path: `relationships.${rel.name}`,
82
+ });
83
+ }
84
+ if (!entityNames.has(rel.targetEntityName)) {
85
+ issues.push({
86
+ severity: 'error',
87
+ category: 'Invalid Reference',
88
+ message: `Relationship "${rel.name}" references non-existent target entity "${rel.targetEntityName}"`,
89
+ path: `relationships.${rel.name}`,
90
+ });
91
+ }
92
+ if (!validCardinalities.includes(rel.cardinality)) {
93
+ issues.push({
94
+ severity: 'error',
95
+ category: 'Invalid Cardinality',
96
+ message: `Relationship "${rel.name}" has invalid cardinality "${rel.cardinality}". Valid values: ${validCardinalities.join(', ')}`,
97
+ path: `relationships.${rel.name}`,
98
+ });
99
+ }
100
+ if (rel.fields) {
101
+ const validTypes = Object.values(FieldType);
102
+ for (const field of rel.fields) {
103
+ if (!validTypes.includes(field.type)) {
104
+ issues.push({
105
+ severity: 'error',
106
+ category: 'Invalid Type',
107
+ message: `Relationship "${rel.name}" field "${field.name}" has invalid type "${field.type}"`,
108
+ path: `relationships.${rel.name}.fields.${field.name}`,
109
+ });
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return issues;
115
+ }
116
+ export function validateNamingConventions(entities, relationships) {
117
+ const issues = [];
118
+ const pascalCaseRegex = /^[A-Z][a-zA-Z0-9]*$/;
119
+ for (const entity of entities) {
120
+ if (!pascalCaseRegex.test(entity.name)) {
121
+ issues.push({
122
+ severity: 'warning',
123
+ category: 'Naming Convention',
124
+ message: `Entity "${entity.name}" should be PascalCase (e.g., "UserProfile")`,
125
+ path: `entities.${entity.name}`,
126
+ });
127
+ }
128
+ const camelCaseRegex = /^[a-z][a-zA-Z0-9]*$/;
129
+ for (const field of entity.fields) {
130
+ if (!camelCaseRegex.test(field.name)) {
131
+ issues.push({
132
+ severity: 'warning',
133
+ category: 'Naming Convention',
134
+ message: `Field "${field.name}" should be camelCase (e.g., "firstName")`,
135
+ path: `entities.${entity.name}.fields.${field.name}`,
136
+ });
137
+ }
138
+ }
139
+ }
140
+ if (relationships) {
141
+ const screamingSnakeRegex = /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/;
142
+ for (const rel of relationships) {
143
+ if (!screamingSnakeRegex.test(rel.name)) {
144
+ issues.push({
145
+ severity: 'warning',
146
+ category: 'Naming Convention',
147
+ message: `Relationship "${rel.name}" should be SCREAMING_SNAKE_CASE (e.g., "BELONGS_TO")`,
148
+ path: `relationships.${rel.name}`,
149
+ });
150
+ }
151
+ }
152
+ }
153
+ return issues;
154
+ }
155
+ export function validateIdentityEntities(entities) {
156
+ const issues = [];
157
+ for (const entity of entities) {
158
+ if (!entity.isIdentity)
159
+ continue;
160
+ if (!entity.identifierField) {
161
+ issues.push({
162
+ severity: 'error',
163
+ category: 'Identity Configuration',
164
+ message: `Identity entity "${entity.name}" is missing identifierField. Specify which STRING field is used for login (e.g., "email").`,
165
+ path: `entities.${entity.name}`,
166
+ });
167
+ continue;
168
+ }
169
+ const identifierFieldDef = entity.fields.find((f) => f.name === entity.identifierField);
170
+ if (!identifierFieldDef) {
171
+ issues.push({
172
+ severity: 'error',
173
+ category: 'Identity Configuration',
174
+ message: `Identity entity "${entity.name}" specifies identifierField "${entity.identifierField}" but no such field exists.`,
175
+ path: `entities.${entity.name}.identifierField`,
176
+ });
177
+ }
178
+ else if (identifierFieldDef.type !== FieldType.STRING) {
179
+ issues.push({
180
+ severity: 'error',
181
+ category: 'Identity Configuration',
182
+ message: `Identity entity "${entity.name}" identifierField "${entity.identifierField}" must be type STRING, got ${identifierFieldDef.type}.`,
183
+ path: `entities.${entity.name}.fields.${entity.identifierField}`,
184
+ });
185
+ }
186
+ const hasPasswordField = entity.fields.some((f) => f.type === FieldType.PASSWORD);
187
+ if (!hasPasswordField) {
188
+ issues.push({
189
+ severity: 'error',
190
+ category: 'Identity Configuration',
191
+ message: `Identity entity "${entity.name}" must have a PASSWORD field for authentication.`,
192
+ path: `entities.${entity.name}`,
193
+ });
194
+ }
195
+ }
196
+ return issues;
197
+ }
198
+ export function detectBreakingChanges(activeSchema, newEntities, newRelationships) {
199
+ const breakingChanges = [];
200
+ if (!activeSchema) {
201
+ return breakingChanges;
202
+ }
203
+ const newEntityMap = new Map(newEntities.map((e) => [e.name, e]));
204
+ for (const activeEntity of activeSchema.entities) {
205
+ if (!newEntityMap.has(activeEntity.name)) {
206
+ breakingChanges.push({
207
+ type: 'ENTITY_REMOVED',
208
+ entity: activeEntity.name,
209
+ description: `Entity "${activeEntity.name}" will be removed. All data in this entity will be deleted.`,
210
+ });
211
+ }
212
+ }
213
+ for (const activeEntity of activeSchema.entities) {
214
+ const newEntity = newEntityMap.get(activeEntity.name);
215
+ if (!newEntity)
216
+ continue;
217
+ const newFieldMap = new Map(newEntity.fields.map((f) => [f.name, f]));
218
+ for (const activeField of activeEntity.fields) {
219
+ const newField = newFieldMap.get(activeField.name);
220
+ if (!newField) {
221
+ breakingChanges.push({
222
+ type: 'FIELD_REMOVED',
223
+ entity: activeEntity.name,
224
+ field: activeField.name,
225
+ description: `Field "${activeField.name}" will be removed from "${activeEntity.name}". Data in this field will be lost.`,
226
+ });
227
+ }
228
+ else if (newField.type !== String(activeField.type)) {
229
+ breakingChanges.push({
230
+ type: 'FIELD_TYPE_CHANGED',
231
+ entity: activeEntity.name,
232
+ field: activeField.name,
233
+ description: `Field "${activeField.name}" type changed from ${activeField.type} to ${newField.type}. Data may need migration.`,
234
+ });
235
+ }
236
+ else if (newField.required && !activeField.required) {
237
+ breakingChanges.push({
238
+ type: 'FIELD_REQUIRED_CHANGED',
239
+ entity: activeEntity.name,
240
+ field: activeField.name,
241
+ description: `Field "${activeField.name}" changed from optional to required. Existing records without this field will fail validation.`,
242
+ });
243
+ }
244
+ }
245
+ }
246
+ if (newRelationships) {
247
+ const newRelNames = new Set(newRelationships.map((r) => r.name));
248
+ for (const activeRel of activeSchema.relationships) {
249
+ if (!newRelNames.has(activeRel.name)) {
250
+ breakingChanges.push({
251
+ type: 'RELATIONSHIP_REMOVED',
252
+ entity: `${activeRel.sourceEntity?.name || activeRel.sourceEntityId} -> ${activeRel.targetEntity?.name || activeRel.targetEntityId}`,
253
+ description: `Relationship "${activeRel.name}" will be removed. Existing connections will be deleted.`,
254
+ });
255
+ }
256
+ }
257
+ }
258
+ return breakingChanges;
259
+ }
260
+ /**
261
+ * Run all validations against a schema definition.
262
+ */
263
+ export function validateSchema(entities, relationships, activeSchema) {
264
+ const allIssues = [];
265
+ allIssues.push(...validateReservedNames(entities));
266
+ allIssues.push(...validateFieldTypes(entities));
267
+ allIssues.push(...validateIdentityEntities(entities));
268
+ allIssues.push(...validateRelationships(entities, relationships));
269
+ allIssues.push(...validateNamingConventions(entities, relationships));
270
+ const breakingChanges = activeSchema
271
+ ? detectBreakingChanges(activeSchema, entities, relationships)
272
+ : [];
273
+ return {
274
+ valid: allIssues.filter((i) => i.severity === 'error').length === 0,
275
+ errors: allIssues.filter((i) => i.severity === 'error'),
276
+ warnings: allIssues.filter((i) => i.severity === 'warning'),
277
+ suggestions: allIssues.filter((i) => i.severity === 'info'),
278
+ breakingChanges,
279
+ };
280
+ }
281
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/commands/schema/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * flxbl schema versions — List all schema versions
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerVersionsCommand(parent: Command): void;
6
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/versions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAO7D"}