@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,144 @@
1
+ /**
2
+ * flxbl schema diff — Compare a local JSON schema file against the remote active schema
3
+ */
4
+ import { log, spinner, chalk } from '../../ui/logger.js';
5
+ import { loadFlxblConfig } from '../../config/loader.js';
6
+ import { resolveAuth, fetchActiveSchema } from '../../codegen/schema-fetcher.js';
7
+ import { parseSchemaFile } from './schema-file.js';
8
+ import { detectBreakingChanges } from './validation.js';
9
+ export function registerDiffCommand(parent) {
10
+ parent
11
+ .command('diff <file>')
12
+ .description('Compare a local schema file against the remote active schema')
13
+ .option('--schema-id <id>', 'Compare against a specific schema by ID')
14
+ .option('--instance <url>', 'FLXBL instance URL')
15
+ .option('--api-key <key>', 'API key for authentication')
16
+ .action(diffAction);
17
+ }
18
+ async function diffAction(file, opts) {
19
+ const loaded = await loadFlxblConfig();
20
+ const config = loaded?.config;
21
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
22
+ if (!instanceUrl) {
23
+ log.error('No FLXBL instance URL configured.');
24
+ process.exit(1);
25
+ }
26
+ // Parse local file
27
+ let localRequest;
28
+ try {
29
+ localRequest = parseSchemaFile(file);
30
+ }
31
+ catch (error) {
32
+ log.error(error instanceof Error ? error.message : String(error));
33
+ process.exit(1);
34
+ }
35
+ const s = spinner('Fetching remote schema...').start();
36
+ try {
37
+ const { client } = await resolveAuth({
38
+ apiKey: opts.apiKey,
39
+ instanceUrl,
40
+ });
41
+ let remote;
42
+ if (opts.schemaId) {
43
+ remote = await client.getSchema(opts.schemaId, {
44
+ includeEntities: true,
45
+ includeFields: true,
46
+ includeRelationships: true,
47
+ });
48
+ }
49
+ else {
50
+ remote = await fetchActiveSchema(client);
51
+ }
52
+ s.stop();
53
+ log.plain(`\nComparing ${chalk.bold(file)} vs ${chalk.bold(remote.name)} v${remote.version}\n`);
54
+ const localEntities = localRequest.entities || [];
55
+ const localRelationships = localRequest.relationships || [];
56
+ // Entity-level diff
57
+ const remoteEntityNames = new Set(remote.entities.map((e) => e.name));
58
+ const localEntityNames = new Set(localEntities.map((e) => e.name));
59
+ let hasChanges = false;
60
+ // Added entities
61
+ for (const entity of localEntities) {
62
+ if (!remoteEntityNames.has(entity.name)) {
63
+ log.plain(chalk.green(` + Entity: ${entity.name} (${entity.fields.length} fields)`));
64
+ hasChanges = true;
65
+ }
66
+ }
67
+ // Removed entities
68
+ for (const entity of remote.entities) {
69
+ if (!localEntityNames.has(entity.name)) {
70
+ log.plain(chalk.red(` - Entity: ${entity.name}`));
71
+ hasChanges = true;
72
+ }
73
+ }
74
+ // Modified entities (field-level diff)
75
+ for (const localEntity of localEntities) {
76
+ const remoteEntity = remote.entities.find((e) => e.name === localEntity.name);
77
+ if (!remoteEntity)
78
+ continue;
79
+ const remoteFieldNames = new Set(remoteEntity.fields.map((f) => f.name));
80
+ const localFieldNames = new Set(localEntity.fields.map((f) => f.name));
81
+ const entityChanges = [];
82
+ for (const field of localEntity.fields) {
83
+ if (!remoteFieldNames.has(field.name)) {
84
+ entityChanges.push(chalk.green(` + ${field.name}: ${field.type}`));
85
+ }
86
+ else {
87
+ const remoteField = remoteEntity.fields.find((f) => f.name === field.name);
88
+ if (remoteField.type !== field.type) {
89
+ entityChanges.push(chalk.yellow(` ~ ${field.name}: ${remoteField.type} -> ${field.type}`));
90
+ }
91
+ if (remoteField.required !== field.required) {
92
+ entityChanges.push(chalk.yellow(` ~ ${field.name}: ${remoteField.required ? 'required' : 'optional'} -> ${field.required ? 'required' : 'optional'}`));
93
+ }
94
+ }
95
+ }
96
+ for (const field of remoteEntity.fields) {
97
+ if (!localFieldNames.has(field.name)) {
98
+ entityChanges.push(chalk.red(` - ${field.name}: ${field.type}`));
99
+ }
100
+ }
101
+ if (entityChanges.length > 0) {
102
+ log.plain(chalk.yellow(` ~ Entity: ${localEntity.name}`));
103
+ for (const change of entityChanges) {
104
+ log.plain(change);
105
+ }
106
+ hasChanges = true;
107
+ }
108
+ }
109
+ // Relationship diff
110
+ const remoteRelNames = new Set(remote.relationships.map((r) => r.name));
111
+ const localRelNames = new Set(localRelationships.map((r) => r.name));
112
+ for (const rel of localRelationships) {
113
+ if (!remoteRelNames.has(rel.name)) {
114
+ log.plain(chalk.green(` + Relationship: ${rel.name} (${rel.sourceEntityName} -> ${rel.targetEntityName})`));
115
+ hasChanges = true;
116
+ }
117
+ }
118
+ for (const rel of remote.relationships) {
119
+ if (!localRelNames.has(rel.name)) {
120
+ log.plain(chalk.red(` - Relationship: ${rel.name}`));
121
+ hasChanges = true;
122
+ }
123
+ }
124
+ if (!hasChanges) {
125
+ log.success('No differences found.');
126
+ return;
127
+ }
128
+ // Breaking changes summary
129
+ const breaking = detectBreakingChanges(remote, localEntities, localRelationships);
130
+ if (breaking.length > 0) {
131
+ log.plain('');
132
+ log.warn(`${breaking.length} breaking change(s):`);
133
+ for (const bc of breaking) {
134
+ log.plain(` ${chalk.red('!')} ${bc.description}`);
135
+ }
136
+ }
137
+ }
138
+ catch (error) {
139
+ s.fail('Failed to fetch remote schema');
140
+ log.error(error instanceof Error ? error.message : String(error));
141
+ process.exit(1);
142
+ }
143
+ }
144
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/schema/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * flxbl schema export — Export schema to a clean JSON file
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerExportCommand(parent: Command): void;
6
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAS3D"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * flxbl schema export — Export schema to a clean JSON file
3
+ */
4
+ import { writeFileSync } from 'node:fs';
5
+ import { log, spinner, chalk } from '../../ui/logger.js';
6
+ import { loadFlxblConfig } from '../../config/loader.js';
7
+ import { resolveAuth, fetchActiveSchema } from '../../codegen/schema-fetcher.js';
8
+ export function registerExportCommand(parent) {
9
+ parent
10
+ .command('export')
11
+ .description('Export schema to a clean JSON file')
12
+ .option('-o, --output <path>', 'Output file path (default: stdout)')
13
+ .option('--schema-id <id>', 'Export a specific schema by ID (default: active)')
14
+ .option('--instance <url>', 'FLXBL instance URL')
15
+ .option('--api-key <key>', 'API key for authentication')
16
+ .action(exportAction);
17
+ }
18
+ async function exportAction(opts) {
19
+ const loaded = await loadFlxblConfig();
20
+ const config = loaded?.config;
21
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
22
+ if (!instanceUrl) {
23
+ log.error('No FLXBL instance URL configured.');
24
+ process.exit(1);
25
+ }
26
+ const s = spinner('Fetching schema...').start();
27
+ try {
28
+ const { client } = await resolveAuth({
29
+ apiKey: opts.apiKey,
30
+ instanceUrl,
31
+ });
32
+ let schema;
33
+ if (opts.schemaId) {
34
+ schema = await client.getSchema(opts.schemaId, {
35
+ includeEntities: true,
36
+ includeFields: true,
37
+ includeRelationships: true,
38
+ });
39
+ }
40
+ else {
41
+ schema = await fetchActiveSchema(client);
42
+ }
43
+ s.stop();
44
+ const clean = stripSchemaIds(schema);
45
+ const json = JSON.stringify(clean, null, 2);
46
+ if (opts.output) {
47
+ writeFileSync(opts.output, json + '\n', 'utf-8');
48
+ log.success(`Schema exported to ${chalk.bold(opts.output)}`);
49
+ }
50
+ else {
51
+ console.log(json);
52
+ }
53
+ }
54
+ catch (error) {
55
+ s.fail('Failed to export schema');
56
+ log.error(error instanceof Error ? error.message : String(error));
57
+ process.exit(1);
58
+ }
59
+ }
60
+ /**
61
+ * Strip internal IDs and timestamps to produce a clean, importable schema file.
62
+ */
63
+ function stripSchemaIds(schema) {
64
+ const entityMap = new Map(schema.entities.map((e) => [e.id, e.name]));
65
+ return {
66
+ name: schema.name,
67
+ version: schema.version,
68
+ description: schema.description || undefined,
69
+ entities: schema.entities.map((entity) => ({
70
+ name: entity.name,
71
+ description: entity.description || undefined,
72
+ isIdentity: entity.isIdentity || undefined,
73
+ identifierField: entity.identifierField || undefined,
74
+ fields: entity.fields.map((field) => {
75
+ const f = {
76
+ name: field.name,
77
+ type: field.type,
78
+ required: field.required,
79
+ };
80
+ if (field.description)
81
+ f.description = field.description;
82
+ if (field.enumValues && field.enumValues.length > 0)
83
+ f.enumValues = field.enumValues;
84
+ if (field.searchable)
85
+ f.searchable = field.searchable;
86
+ if (field.vectorDimensions)
87
+ f.vectorDimensions = field.vectorDimensions;
88
+ return f;
89
+ }),
90
+ })),
91
+ relationships: schema.relationships.length > 0
92
+ ? schema.relationships.map((rel) => {
93
+ const r = {
94
+ name: rel.name,
95
+ sourceEntityName: entityMap.get(rel.sourceEntityId) || rel.sourceEntityId,
96
+ targetEntityName: entityMap.get(rel.targetEntityId) || rel.targetEntityId,
97
+ cardinality: rel.cardinality,
98
+ };
99
+ if (rel.description)
100
+ r.description = rel.description;
101
+ if (rel.fields && rel.fields.length > 0) {
102
+ r.fields = rel.fields.map((f) => {
103
+ const field = {
104
+ name: f.name,
105
+ type: f.type,
106
+ required: f.required,
107
+ };
108
+ if (f.description)
109
+ field.description = f.description;
110
+ if (f.enumValues && f.enumValues.length > 0)
111
+ field.enumValues = f.enumValues;
112
+ return field;
113
+ });
114
+ }
115
+ return r;
116
+ })
117
+ : undefined,
118
+ };
119
+ }
120
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/commands/schema/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * flxbl schema — Schema management command group
3
+ *
4
+ * Running `flxbl schema` with no subcommand defaults to `show` (backward compat).
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function registerSchemaCommand(program: Command): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB5D"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * flxbl schema — Schema management command group
3
+ *
4
+ * Running `flxbl schema` with no subcommand defaults to `show` (backward compat).
5
+ */
6
+ import { registerShowCommand, showAction } from './show.js';
7
+ import { registerCreateCommand } from './create.js';
8
+ import { registerExportCommand } from './export.js';
9
+ import { registerDiffCommand } from './diff.js';
10
+ import { registerVersionsCommand } from './versions.js';
11
+ import { registerMigrateCommand } from './migrate.js';
12
+ import { registerTemplateCommand } from './template.js';
13
+ import { registerDeleteCommand } from './delete.js';
14
+ export function registerSchemaCommand(program) {
15
+ const schemaCmd = program
16
+ .command('schema')
17
+ .description('Schema management — create, show, export, diff, and more')
18
+ .action(async () => {
19
+ // Default action: show active schema in table format (backward compat)
20
+ await showAction({});
21
+ });
22
+ // Register subcommands
23
+ registerShowCommand(schemaCmd);
24
+ registerCreateCommand(schemaCmd);
25
+ registerExportCommand(schemaCmd);
26
+ registerDiffCommand(schemaCmd);
27
+ registerVersionsCommand(schemaCmd);
28
+ registerMigrateCommand(schemaCmd);
29
+ registerTemplateCommand(schemaCmd);
30
+ registerDeleteCommand(schemaCmd);
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/schema/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,uEAAuE;QACvE,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC/B,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACjC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACjC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC/B,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACnC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAClC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACnC,qBAAqB,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * flxbl schema migrate — Check migration status
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerMigrateCommand(parent: Command): void;
6
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAO5D"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * flxbl schema migrate — Check migration status
3
+ */
4
+ import { log, spinner, chalk } from '../../ui/logger.js';
5
+ import { loadFlxblConfig } from '../../config/loader.js';
6
+ import { resolveAuth } from '../../codegen/schema-fetcher.js';
7
+ export function registerMigrateCommand(parent) {
8
+ parent
9
+ .command('migrate <migrationId>')
10
+ .description('Check migration status')
11
+ .option('--instance <url>', 'FLXBL instance URL')
12
+ .option('--api-key <key>', 'API key for authentication')
13
+ .action(migrateAction);
14
+ }
15
+ async function migrateAction(migrationId, opts) {
16
+ const loaded = await loadFlxblConfig();
17
+ const config = loaded?.config;
18
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
19
+ if (!instanceUrl) {
20
+ log.error('No FLXBL instance URL configured.');
21
+ process.exit(1);
22
+ }
23
+ const s = spinner('Checking migration status...').start();
24
+ try {
25
+ const { client } = await resolveAuth({
26
+ apiKey: opts.apiKey,
27
+ instanceUrl,
28
+ });
29
+ const migration = await client.getMigrationStatus(migrationId);
30
+ s.stop();
31
+ if (!migration) {
32
+ log.warn(`Migration ${migrationId} not found.`);
33
+ return;
34
+ }
35
+ const statusColor = migration.status === 'COMPLETED'
36
+ ? chalk.green
37
+ : migration.status === 'FAILED'
38
+ ? chalk.red
39
+ : migration.status === 'IN_PROGRESS'
40
+ ? chalk.yellow
41
+ : chalk.dim;
42
+ log.plain(`Migration: ${chalk.bold(migration.id)}`);
43
+ log.plain(`Status: ${statusColor(migration.status)}`);
44
+ log.plain(`Progress: ${migration.progress}%`);
45
+ log.plain(`Nodes: ${migration.processedNodes} / ${migration.totalNodes}`);
46
+ log.plain(`Version: ${migration.fromVersion} -> ${migration.toVersion}`);
47
+ if (migration.startedAt) {
48
+ log.plain(`Started: ${new Date(migration.startedAt).toLocaleString()}`);
49
+ }
50
+ if (migration.completedAt) {
51
+ log.plain(`Completed: ${new Date(migration.completedAt).toLocaleString()}`);
52
+ }
53
+ if (migration.error) {
54
+ log.error(`Error: ${migration.error}`);
55
+ }
56
+ if (migration.breakingChanges && migration.breakingChanges.length > 0) {
57
+ log.plain('');
58
+ log.warn('Breaking changes:');
59
+ for (const bc of migration.breakingChanges) {
60
+ log.plain(` ${chalk.yellow('!')} ${bc.message}`);
61
+ }
62
+ }
63
+ }
64
+ catch (error) {
65
+ s.fail('Failed to check migration status');
66
+ log.error(error instanceof Error ? error.message : String(error));
67
+ process.exit(1);
68
+ }
69
+ }
70
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/commands/schema/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Schema file parsing — read JSON schema definitions from disk
3
+ */
4
+ import { type CreateSchemaRequest } from '@flxbl-dev/shared';
5
+ export interface SchemaFileDefinition {
6
+ name: string;
7
+ version?: string;
8
+ description?: string;
9
+ entities: Array<{
10
+ name: string;
11
+ description?: string;
12
+ isIdentity?: boolean;
13
+ identifierField?: string;
14
+ fields: Array<{
15
+ name: string;
16
+ type: string;
17
+ required?: boolean;
18
+ description?: string;
19
+ enumValues?: string[];
20
+ searchable?: boolean;
21
+ vectorDimensions?: number;
22
+ }>;
23
+ }>;
24
+ relationships?: Array<{
25
+ name: string;
26
+ sourceEntityName: string;
27
+ targetEntityName: string;
28
+ cardinality: string;
29
+ description?: string;
30
+ fields?: Array<{
31
+ name: string;
32
+ type: string;
33
+ required?: boolean;
34
+ description?: string;
35
+ enumValues?: string[];
36
+ }>;
37
+ }>;
38
+ }
39
+ /**
40
+ * Parse a JSON schema file and convert to CreateSchemaRequest DTO.
41
+ */
42
+ export declare function parseSchemaFile(filePath: string): CreateSchemaRequest;
43
+ //# sourceMappingURL=schema-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-file.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/schema-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAGL,KAAK,mBAAmB,EAIzB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,KAAK,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;YACtB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAgIrE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Schema file parsing — read JSON schema definitions from disk
3
+ */
4
+ import { readFileSync } from 'node:fs';
5
+ import { FieldType, RelationshipCardinality, } from '@flxbl-dev/shared';
6
+ /**
7
+ * Parse a JSON schema file and convert to CreateSchemaRequest DTO.
8
+ */
9
+ export function parseSchemaFile(filePath) {
10
+ let raw;
11
+ try {
12
+ raw = readFileSync(filePath, 'utf-8');
13
+ }
14
+ catch (error) {
15
+ throw new Error(`Failed to read schema file: ${error instanceof Error ? error.message : String(error)}`);
16
+ }
17
+ let definition;
18
+ try {
19
+ definition = JSON.parse(raw);
20
+ }
21
+ catch (error) {
22
+ throw new Error(`Invalid JSON in schema file: ${error instanceof Error ? error.message : String(error)}`);
23
+ }
24
+ if (!definition.name || typeof definition.name !== 'string') {
25
+ throw new Error('Schema file must have a "name" field (string).');
26
+ }
27
+ if (!definition.entities ||
28
+ !Array.isArray(definition.entities) ||
29
+ definition.entities.length === 0) {
30
+ throw new Error('Schema file must have an "entities" array with at least one entity.');
31
+ }
32
+ const entities = definition.entities.map((entity) => {
33
+ if (!entity.name)
34
+ throw new Error('Each entity must have a "name".');
35
+ if (!entity.fields || entity.fields.length === 0) {
36
+ throw new Error(`Entity "${entity.name}" must have at least one field.`);
37
+ }
38
+ const fields = entity.fields.map((field) => {
39
+ if (!field.name) {
40
+ throw new Error(`Entity "${entity.name}" has a field without a name.`);
41
+ }
42
+ if (!field.type) {
43
+ throw new Error(`Field "${field.name}" in entity "${entity.name}" must have a "type".`);
44
+ }
45
+ const validTypes = Object.values(FieldType);
46
+ if (!validTypes.includes(field.type)) {
47
+ throw new Error(`Field "${field.name}" in entity "${entity.name}" has invalid type "${field.type}". Valid types: ${validTypes.join(', ')}`);
48
+ }
49
+ return {
50
+ name: field.name,
51
+ type: field.type,
52
+ required: field.required !== false,
53
+ description: field.description,
54
+ enumValues: field.enumValues,
55
+ searchable: field.searchable,
56
+ vectorDimensions: field.vectorDimensions,
57
+ };
58
+ });
59
+ return {
60
+ name: entity.name,
61
+ description: entity.description,
62
+ fields,
63
+ isIdentity: entity.isIdentity,
64
+ identifierField: entity.identifierField,
65
+ };
66
+ });
67
+ let relationships;
68
+ if (definition.relationships && definition.relationships.length > 0) {
69
+ const validCardinalities = Object.values(RelationshipCardinality);
70
+ relationships = definition.relationships.map((rel) => {
71
+ if (!rel.name)
72
+ throw new Error('Each relationship must have a "name".');
73
+ if (!rel.sourceEntityName) {
74
+ throw new Error(`Relationship "${rel.name}" must have a "sourceEntityName".`);
75
+ }
76
+ if (!rel.targetEntityName) {
77
+ throw new Error(`Relationship "${rel.name}" must have a "targetEntityName".`);
78
+ }
79
+ if (!validCardinalities.includes(rel.cardinality)) {
80
+ throw new Error(`Relationship "${rel.name}" has invalid cardinality "${rel.cardinality}". Valid values: ${validCardinalities.join(', ')}`);
81
+ }
82
+ return {
83
+ name: rel.name,
84
+ sourceEntityName: rel.sourceEntityName,
85
+ targetEntityName: rel.targetEntityName,
86
+ cardinality: rel.cardinality,
87
+ description: rel.description,
88
+ fields: rel.fields?.map((f) => ({
89
+ name: f.name,
90
+ type: f.type,
91
+ required: f.required !== false,
92
+ description: f.description,
93
+ enumValues: f.enumValues,
94
+ })),
95
+ };
96
+ });
97
+ }
98
+ return {
99
+ name: definition.name,
100
+ version: definition.version,
101
+ description: definition.description,
102
+ entities,
103
+ relationships,
104
+ };
105
+ }
106
+ //# sourceMappingURL=schema-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-file.js","sourceRoot":"","sources":["../../../src/commands/schema/schema-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * flxbl schema show — Display active schema information
3
+ *
4
+ * Migrated from the original flat schema.ts command.
5
+ */
6
+ import type { Command } from 'commander';
7
+ import type { TenantSchema } from '@flxbl-dev/shared';
8
+ export declare function registerShowCommand(parent: Command): void;
9
+ export declare function showAction(opts: {
10
+ format?: string;
11
+ instance?: string;
12
+ apiKey?: string;
13
+ }): Promise<void>;
14
+ export declare function renderTree(schema: TenantSchema): void;
15
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/show.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAQzD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChB;AA4CD,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAwBrD"}