@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.
- package/README.md +185 -0
- package/bin/flxbl +5 -0
- package/dist/codegen/client-generator.d.ts +6 -0
- package/dist/codegen/client-generator.d.ts.map +1 -0
- package/dist/codegen/client-generator.js +46 -0
- package/dist/codegen/client-generator.js.map +1 -0
- package/dist/codegen/codegen-pipeline.d.ts +23 -0
- package/dist/codegen/codegen-pipeline.d.ts.map +1 -0
- package/dist/codegen/codegen-pipeline.js +61 -0
- package/dist/codegen/codegen-pipeline.js.map +1 -0
- package/dist/codegen/enum-generator.d.ts +6 -0
- package/dist/codegen/enum-generator.d.ts.map +1 -0
- package/dist/codegen/enum-generator.js +40 -0
- package/dist/codegen/enum-generator.js.map +1 -0
- package/dist/codegen/index-generator.d.ts +8 -0
- package/dist/codegen/index-generator.d.ts.map +1 -0
- package/dist/codegen/index-generator.js +23 -0
- package/dist/codegen/index-generator.js.map +1 -0
- package/dist/codegen/query-types-generator.d.ts +8 -0
- package/dist/codegen/query-types-generator.d.ts.map +1 -0
- package/dist/codegen/query-types-generator.js +30 -0
- package/dist/codegen/query-types-generator.js.map +1 -0
- package/dist/codegen/relationship-generator.d.ts +6 -0
- package/dist/codegen/relationship-generator.d.ts.map +1 -0
- package/dist/codegen/relationship-generator.js +40 -0
- package/dist/codegen/relationship-generator.js.map +1 -0
- package/dist/codegen/schema-fetcher.d.ts +27 -0
- package/dist/codegen/schema-fetcher.d.ts.map +1 -0
- package/dist/codegen/schema-fetcher.js +42 -0
- package/dist/codegen/schema-fetcher.js.map +1 -0
- package/dist/codegen/type-generator.d.ts +13 -0
- package/dist/codegen/type-generator.d.ts.map +1 -0
- package/dist/codegen/type-generator.js +62 -0
- package/dist/codegen/type-generator.js.map +1 -0
- package/dist/commands/data.d.ts +6 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +85 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +81 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate.d.ts +13 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +69 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +82 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +68 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/schema/create.d.ts +6 -0
- package/dist/commands/schema/create.d.ts.map +1 -0
- package/dist/commands/schema/create.js +466 -0
- package/dist/commands/schema/create.js.map +1 -0
- package/dist/commands/schema/delete.d.ts +6 -0
- package/dist/commands/schema/delete.d.ts.map +1 -0
- package/dist/commands/schema/delete.js +50 -0
- package/dist/commands/schema/delete.js.map +1 -0
- package/dist/commands/schema/diff.d.ts +6 -0
- package/dist/commands/schema/diff.d.ts.map +1 -0
- package/dist/commands/schema/diff.js +144 -0
- package/dist/commands/schema/diff.js.map +1 -0
- package/dist/commands/schema/export.d.ts +6 -0
- package/dist/commands/schema/export.d.ts.map +1 -0
- package/dist/commands/schema/export.js +120 -0
- package/dist/commands/schema/export.js.map +1 -0
- package/dist/commands/schema/index.d.ts +8 -0
- package/dist/commands/schema/index.d.ts.map +1 -0
- package/dist/commands/schema/index.js +32 -0
- package/dist/commands/schema/index.js.map +1 -0
- package/dist/commands/schema/migrate.d.ts +6 -0
- package/dist/commands/schema/migrate.d.ts.map +1 -0
- package/dist/commands/schema/migrate.js +70 -0
- package/dist/commands/schema/migrate.js.map +1 -0
- package/dist/commands/schema/schema-file.d.ts +43 -0
- package/dist/commands/schema/schema-file.d.ts.map +1 -0
- package/dist/commands/schema/schema-file.js +106 -0
- package/dist/commands/schema/schema-file.js.map +1 -0
- package/dist/commands/schema/show.d.ts +15 -0
- package/dist/commands/schema/show.d.ts.map +1 -0
- package/dist/commands/schema/show.js +100 -0
- package/dist/commands/schema/show.js.map +1 -0
- package/dist/commands/schema/template.d.ts +6 -0
- package/dist/commands/schema/template.d.ts.map +1 -0
- package/dist/commands/schema/template.js +110 -0
- package/dist/commands/schema/template.js.map +1 -0
- package/dist/commands/schema/validation.d.ts +87 -0
- package/dist/commands/schema/validation.d.ts.map +1 -0
- package/dist/commands/schema/validation.js +281 -0
- package/dist/commands/schema/validation.js.map +1 -0
- package/dist/commands/schema/versions.d.ts +6 -0
- package/dist/commands/schema/versions.d.ts.map +1 -0
- package/dist/commands/schema/versions.js +64 -0
- package/dist/commands/schema/versions.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +47 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +24 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/logger.d.ts +16 -0
- package/dist/ui/logger.d.ts.map +1 -0
- package/dist/ui/logger.js +18 -0
- package/dist/ui/logger.js.map +1 -0
- package/dist/ui/prompts.d.ts +6 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +6 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/table.d.ts +11 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +25 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/watcher/schema-watcher.d.ts +30 -0
- package/dist/watcher/schema-watcher.d.ts.map +1 -0
- package/dist/watcher/schema-watcher.js +53 -0
- package/dist/watcher/schema-watcher.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/codegen/type-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAwBpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CA6BnE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Generator — generates entities.ts and create-dtos.ts
|
|
3
|
+
*/
|
|
4
|
+
import { FieldType, fieldTypeToTypeScript, } from '@flxbl-dev/shared';
|
|
5
|
+
/**
|
|
6
|
+
* Generates TypeScript interfaces for each entity.
|
|
7
|
+
*/
|
|
8
|
+
export function generateEntityTypes(entities) {
|
|
9
|
+
const lines = [
|
|
10
|
+
'// Auto-generated by @flxbl-dev/cli — DO NOT EDIT',
|
|
11
|
+
'// Re-run `flxbl generate` to regenerate',
|
|
12
|
+
'',
|
|
13
|
+
];
|
|
14
|
+
for (const entity of entities) {
|
|
15
|
+
lines.push(`export interface ${entity.name} {`);
|
|
16
|
+
lines.push(` id: string;`);
|
|
17
|
+
for (const field of entity.fields) {
|
|
18
|
+
const tsType = resolveFieldType(field);
|
|
19
|
+
const optional = !field.required ? '?' : '';
|
|
20
|
+
lines.push(` ${field.name}${optional}: ${tsType};`);
|
|
21
|
+
}
|
|
22
|
+
lines.push(` createdAt: string;`);
|
|
23
|
+
lines.push(` updatedAt: string;`);
|
|
24
|
+
lines.push(`}`);
|
|
25
|
+
lines.push('');
|
|
26
|
+
}
|
|
27
|
+
return lines.join('\n');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generates Create/Update DTO interfaces for each entity.
|
|
31
|
+
*/
|
|
32
|
+
export function generateCreateDtos(entities) {
|
|
33
|
+
const lines = [
|
|
34
|
+
'// Auto-generated by @flxbl-dev/cli — DO NOT EDIT',
|
|
35
|
+
'// Re-run `flxbl generate` to regenerate',
|
|
36
|
+
'',
|
|
37
|
+
];
|
|
38
|
+
for (const entity of entities) {
|
|
39
|
+
// Exclude PASSWORD fields from Create inputs (they go through identity endpoints)
|
|
40
|
+
const creatableFields = entity.fields.filter((f) => f.type !== FieldType.PASSWORD);
|
|
41
|
+
// Create input
|
|
42
|
+
lines.push(`export interface Create${entity.name}Input {`);
|
|
43
|
+
for (const field of creatableFields) {
|
|
44
|
+
const tsType = resolveFieldType(field);
|
|
45
|
+
const optional = !field.required ? '?' : '';
|
|
46
|
+
lines.push(` ${field.name}${optional}: ${tsType};`);
|
|
47
|
+
}
|
|
48
|
+
lines.push(`}`);
|
|
49
|
+
lines.push('');
|
|
50
|
+
// Update input (all fields optional)
|
|
51
|
+
lines.push(`export type Update${entity.name}Input = Partial<Create${entity.name}Input>;`);
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
function resolveFieldType(field) {
|
|
57
|
+
if (field.type === FieldType.ENUM && field.enumValues && field.enumValues.length > 0) {
|
|
58
|
+
return field.enumValues.map((v) => `'${v}'`).join(' | ');
|
|
59
|
+
}
|
|
60
|
+
return fieldTypeToTypeScript(field.type);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=type-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../src/codegen/type-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG1D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl data <entity> — Terminal table view of entity data
|
|
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 registerDataCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('data <entity>')
|
|
11
|
+
.description('Query and display entity data in the terminal')
|
|
12
|
+
.option('-l, --limit <n>', 'Maximum number of records', '20')
|
|
13
|
+
.option('-w, --where <json>', 'JSON filter (e.g., \'{"status": "active"}\')')
|
|
14
|
+
.option('-f, --fields <fields>', 'Comma-separated list of fields to display')
|
|
15
|
+
.option('--format <format>', 'Output format: table or json', 'table')
|
|
16
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
17
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
18
|
+
.action(async (entity, 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(`Querying ${entity}...`).start();
|
|
27
|
+
try {
|
|
28
|
+
const { client } = await resolveAuth({
|
|
29
|
+
apiKey: opts.apiKey,
|
|
30
|
+
instanceUrl,
|
|
31
|
+
});
|
|
32
|
+
const limit = parseInt(opts.limit || '20', 10);
|
|
33
|
+
let where;
|
|
34
|
+
if (opts.where) {
|
|
35
|
+
try {
|
|
36
|
+
where = JSON.parse(opts.where);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
s.fail('Invalid --where JSON');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const select = opts.fields
|
|
44
|
+
? opts.fields.split(',').map((f) => f.trim())
|
|
45
|
+
: undefined;
|
|
46
|
+
const result = await client.queryEntities(entity, {
|
|
47
|
+
where,
|
|
48
|
+
select,
|
|
49
|
+
limit,
|
|
50
|
+
includeCount: true,
|
|
51
|
+
});
|
|
52
|
+
s.stop();
|
|
53
|
+
if (result.items.length === 0) {
|
|
54
|
+
log.warn(`No ${entity} records found.`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (opts.format === 'json') {
|
|
58
|
+
console.log(JSON.stringify(result.items, null, 2));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Table format
|
|
62
|
+
const firstItem = result.items[0];
|
|
63
|
+
const keys = select || Object.keys(firstItem);
|
|
64
|
+
renderTable(keys.map((key) => ({
|
|
65
|
+
header: key,
|
|
66
|
+
key,
|
|
67
|
+
formatter: (v) => {
|
|
68
|
+
if (v === null || v === undefined)
|
|
69
|
+
return chalk.dim('null');
|
|
70
|
+
if (typeof v === 'object')
|
|
71
|
+
return JSON.stringify(v);
|
|
72
|
+
return String(v);
|
|
73
|
+
},
|
|
74
|
+
})), result.items);
|
|
75
|
+
const countInfo = result.count !== undefined ? ` of ${result.count}` : '';
|
|
76
|
+
log.dim(`${result.items.length}${countInfo} records`);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
s.fail(`Failed to query ${entity}`);
|
|
80
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4FzD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl dev — Watch mode: initial generate + auto-regen on schema changes
|
|
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 { runCodegenPipeline } from '../codegen/codegen-pipeline.js';
|
|
8
|
+
import { SchemaWatcher } from '../watcher/schema-watcher.js';
|
|
9
|
+
export function registerDevCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('dev')
|
|
12
|
+
.description('Watch for schema changes and auto-regenerate SDK')
|
|
13
|
+
.option('--poll-interval <ms>', 'Poll interval in milliseconds', '3000')
|
|
14
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
15
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
const loaded = await loadFlxblConfig();
|
|
18
|
+
const config = loaded?.config;
|
|
19
|
+
const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
|
|
20
|
+
const outputDir = config?.outputDir || './flxbl/_generated';
|
|
21
|
+
const pollInterval = parseInt(opts.pollInterval || '', 10) || config?.dev?.pollInterval || 3000;
|
|
22
|
+
if (!instanceUrl) {
|
|
23
|
+
log.error('No FLXBL instance URL. Set FLXBL_INSTANCE_URL, run `flxbl init`, or pass --instance.');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const s = spinner('Starting dev mode...').start();
|
|
27
|
+
try {
|
|
28
|
+
const { client } = await resolveAuth({
|
|
29
|
+
apiKey: opts.apiKey,
|
|
30
|
+
instanceUrl,
|
|
31
|
+
});
|
|
32
|
+
// Initial generate
|
|
33
|
+
const schema = await fetchActiveSchema(client);
|
|
34
|
+
s.text = `Generating SDK from schema v${schema.version}...`;
|
|
35
|
+
const codegenOpts = {
|
|
36
|
+
outputDir,
|
|
37
|
+
format: config?.codegen?.format || 'interface',
|
|
38
|
+
includeRelationships: config?.codegen?.includeRelationships ?? true,
|
|
39
|
+
includeQueryTypes: config?.codegen?.includeQueryTypes ?? true,
|
|
40
|
+
};
|
|
41
|
+
const result = runCodegenPipeline(schema, codegenOpts);
|
|
42
|
+
s.succeed(`Generated ${result.files.length} files (schema v${schema.version})`);
|
|
43
|
+
// Start watching
|
|
44
|
+
log.info(`Watching for schema changes (poll every ${pollInterval}ms)... ${chalk.dim('Press Ctrl+C to stop')}`);
|
|
45
|
+
const watcher = new SchemaWatcher({
|
|
46
|
+
client,
|
|
47
|
+
pollInterval,
|
|
48
|
+
onSchemaChange: async (newSchema) => {
|
|
49
|
+
const ws = spinner(`Schema changed to v${newSchema.version}, regenerating...`).start();
|
|
50
|
+
try {
|
|
51
|
+
const newResult = runCodegenPipeline(newSchema, codegenOpts);
|
|
52
|
+
ws.succeed(`Regenerated ${newResult.files.length} files (schema v${newSchema.version})`);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
ws.fail('Regeneration failed');
|
|
56
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
onError: (error) => {
|
|
60
|
+
log.warn(`Poll error: ${error.message}`);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
watcher.setInitialState(schema);
|
|
64
|
+
watcher.start();
|
|
65
|
+
// Graceful shutdown
|
|
66
|
+
const cleanup = () => {
|
|
67
|
+
watcher.stop();
|
|
68
|
+
log.dim('\nStopped watching.');
|
|
69
|
+
process.exit(0);
|
|
70
|
+
};
|
|
71
|
+
process.on('SIGINT', cleanup);
|
|
72
|
+
process.on('SIGTERM', cleanup);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
s.fail('Dev mode failed');
|
|
76
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl generate — Generate typed SDK from active schema
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
export interface GenerateFlags {
|
|
6
|
+
output?: string;
|
|
7
|
+
format?: 'interface' | 'zod';
|
|
8
|
+
instance?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function registerGenerateCommand(program: Command): void;
|
|
12
|
+
export declare function runGenerate(opts: GenerateFlags): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB9D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDpE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl generate — Generate typed SDK from 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 { runCodegenPipeline } from '../codegen/codegen-pipeline.js';
|
|
8
|
+
export function registerGenerateCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('generate')
|
|
11
|
+
.description('Generate typed SDK from your active schema')
|
|
12
|
+
.option('-o, --output <dir>', 'Output directory')
|
|
13
|
+
.option('--format <format>', 'Output format: interface or zod', 'interface')
|
|
14
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
15
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
await runGenerate(opts);
|
|
18
|
+
});
|
|
19
|
+
// `flxbl pull` is an alias for `flxbl generate`
|
|
20
|
+
program
|
|
21
|
+
.command('pull')
|
|
22
|
+
.description('Alias for `generate` — pull and generate typed SDK')
|
|
23
|
+
.option('-o, --output <dir>', 'Output directory')
|
|
24
|
+
.option('--format <format>', 'Output format: interface or zod', 'interface')
|
|
25
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
26
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
27
|
+
.action(async (opts) => {
|
|
28
|
+
await runGenerate(opts);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function runGenerate(opts) {
|
|
32
|
+
// Load config file
|
|
33
|
+
const loaded = await loadFlxblConfig();
|
|
34
|
+
const config = loaded?.config;
|
|
35
|
+
const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
|
|
36
|
+
const outputDir = opts.output || config?.outputDir || './flxbl/_generated';
|
|
37
|
+
const format = opts.format || config?.codegen?.format || 'interface';
|
|
38
|
+
if (!instanceUrl) {
|
|
39
|
+
log.error('No FLXBL instance URL. Set FLXBL_INSTANCE_URL, run `flxbl init`, or pass --instance.');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const s = spinner('Fetching active schema...').start();
|
|
43
|
+
try {
|
|
44
|
+
const { client } = await resolveAuth({
|
|
45
|
+
apiKey: opts.apiKey,
|
|
46
|
+
instanceUrl,
|
|
47
|
+
});
|
|
48
|
+
const schema = await fetchActiveSchema(client);
|
|
49
|
+
s.text = `Generating SDK from schema v${schema.version}...`;
|
|
50
|
+
const codegenOpts = {
|
|
51
|
+
outputDir,
|
|
52
|
+
format,
|
|
53
|
+
includeRelationships: config?.codegen?.includeRelationships ?? true,
|
|
54
|
+
includeQueryTypes: config?.codegen?.includeQueryTypes ?? true,
|
|
55
|
+
};
|
|
56
|
+
const result = runCodegenPipeline(schema, codegenOpts);
|
|
57
|
+
s.succeed(`Generated ${chalk.bold(String(result.files.length))} files in ${chalk.cyan(outputDir)}`);
|
|
58
|
+
log.dim(` ${result.entityCount} entities, ${result.relationshipCount} relationships (schema v${schema.version})`);
|
|
59
|
+
for (const file of result.files) {
|
|
60
|
+
log.dim(` ${chalk.dim('+')} ${file}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
s.fail('Code generation failed');
|
|
65
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E1D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl init — Scaffold flxbl.config.ts and run initial generate
|
|
3
|
+
*/
|
|
4
|
+
import { writeFileSync, existsSync } from 'node:fs';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { log, chalk } from '../ui/logger.js';
|
|
7
|
+
import { input, select, confirm } from '../ui/prompts.js';
|
|
8
|
+
import { CONFIG_FILENAMES } from '../config/loader.js';
|
|
9
|
+
export function registerInitCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('init')
|
|
12
|
+
.description('Initialize a FLXBL project — scaffolds flxbl.config.ts')
|
|
13
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
14
|
+
.option('--output-dir <path>', 'Output directory for generated SDK')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
// Check if config already exists
|
|
17
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
18
|
+
if (existsSync(resolve(process.cwd(), filename))) {
|
|
19
|
+
log.warn(`${filename} already exists. Skipping init.`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const instanceUrl = opts.instance ||
|
|
24
|
+
process.env.FLXBL_INSTANCE_URL ||
|
|
25
|
+
(await input({
|
|
26
|
+
message: 'FLXBL instance URL:',
|
|
27
|
+
default: 'http://localhost:3000',
|
|
28
|
+
validate: (v) => {
|
|
29
|
+
try {
|
|
30
|
+
new URL(v);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return 'Must be a valid URL';
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
}));
|
|
38
|
+
const outputDir = opts.outputDir ||
|
|
39
|
+
(await input({
|
|
40
|
+
message: 'Output directory for generated SDK:',
|
|
41
|
+
default: './flxbl/_generated',
|
|
42
|
+
}));
|
|
43
|
+
const format = await select({
|
|
44
|
+
message: 'Code generation format:',
|
|
45
|
+
choices: [
|
|
46
|
+
{ name: 'TypeScript interfaces', value: 'interface' },
|
|
47
|
+
{ name: 'Zod schemas', value: 'zod' },
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
const configContent = `import type { FlxblConfig } from '@flxbl-dev/cli';
|
|
51
|
+
|
|
52
|
+
export default {
|
|
53
|
+
instanceUrl: '${instanceUrl.replace(/\/$/, '')}',
|
|
54
|
+
outputDir: '${outputDir}',
|
|
55
|
+
codegen: {
|
|
56
|
+
format: '${format}',
|
|
57
|
+
includeRelationships: true,
|
|
58
|
+
includeQueryTypes: true,
|
|
59
|
+
},
|
|
60
|
+
dev: {
|
|
61
|
+
pollInterval: 3000,
|
|
62
|
+
},
|
|
63
|
+
} satisfies FlxblConfig;
|
|
64
|
+
`;
|
|
65
|
+
const configPath = resolve(process.cwd(), 'flxbl.config.ts');
|
|
66
|
+
writeFileSync(configPath, configContent, 'utf-8');
|
|
67
|
+
log.success(`Created ${chalk.bold('flxbl.config.ts')}`);
|
|
68
|
+
log.dim(`Instance: ${instanceUrl}`);
|
|
69
|
+
log.dim(`Output: ${outputDir}`);
|
|
70
|
+
const shouldGenerate = await confirm({
|
|
71
|
+
message: 'Run initial code generation now?',
|
|
72
|
+
default: true,
|
|
73
|
+
});
|
|
74
|
+
if (shouldGenerate) {
|
|
75
|
+
log.info('Running `flxbl generate`...');
|
|
76
|
+
// Dynamic import to avoid circular deps
|
|
77
|
+
const { runGenerate } = await import('./generate.js');
|
|
78
|
+
await runGenerate({});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB3D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl login — Authenticate with a FLXBL instance
|
|
3
|
+
*/
|
|
4
|
+
import { AuthManager, TokenStore, AuthenticationError, } from '@flxbl-dev/shared';
|
|
5
|
+
import { log, spinner } from '../ui/logger.js';
|
|
6
|
+
import { input, password } from '../ui/prompts.js';
|
|
7
|
+
export function registerLoginCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('login')
|
|
10
|
+
.description('Authenticate with a FLXBL instance')
|
|
11
|
+
.option('--api-key <key>', 'Authenticate using an API key')
|
|
12
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
const instanceUrl = opts.instance ||
|
|
15
|
+
process.env.FLXBL_INSTANCE_URL;
|
|
16
|
+
if (!instanceUrl) {
|
|
17
|
+
const url = await input({
|
|
18
|
+
message: 'FLXBL instance URL:',
|
|
19
|
+
default: 'https://api.flxbl.dev',
|
|
20
|
+
validate: (v) => {
|
|
21
|
+
try {
|
|
22
|
+
new URL(v);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return 'Must be a valid URL';
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
return doLogin(url, opts.apiKey);
|
|
31
|
+
}
|
|
32
|
+
await doLogin(instanceUrl, opts.apiKey);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function doLogin(instanceUrl, apiKey) {
|
|
36
|
+
const cleanUrl = instanceUrl.replace(/\/$/, '');
|
|
37
|
+
// API key mode
|
|
38
|
+
if (apiKey || process.env.FLXBL_API_KEY) {
|
|
39
|
+
const key = apiKey || process.env.FLXBL_API_KEY;
|
|
40
|
+
log.success(`Authenticated via API key to ${cleanUrl}`);
|
|
41
|
+
log.dim('API key auth is stateless — no token stored.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Interactive JWT mode
|
|
45
|
+
const email = await input({ message: 'Email:' });
|
|
46
|
+
const pass = await password({ message: 'Password:' });
|
|
47
|
+
const s = spinner('Logging in...').start();
|
|
48
|
+
try {
|
|
49
|
+
const tokenStore = new TokenStore();
|
|
50
|
+
const authManager = new AuthManager(cleanUrl, tokenStore);
|
|
51
|
+
const stored = await authManager.login(email, pass);
|
|
52
|
+
s.succeed(`Logged in as ${stored.email}`);
|
|
53
|
+
log.dim(`Tenant: ${stored.tenantId}`);
|
|
54
|
+
log.dim(`Token expires: ${new Date(stored.expiresAt).toLocaleString()}`);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
s.fail('Login failed');
|
|
58
|
+
if (error instanceof AuthenticationError) {
|
|
59
|
+
log.error(error.message);
|
|
60
|
+
log.dim(error.actionableHint);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
64
|
+
}
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC5D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl logout — Remove stored credentials
|
|
3
|
+
*/
|
|
4
|
+
import { TokenStore } from '@flxbl-dev/shared';
|
|
5
|
+
import { log } from '../ui/logger.js';
|
|
6
|
+
export function registerLogoutCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('logout')
|
|
9
|
+
.description('Remove stored credentials')
|
|
10
|
+
.option('--instance <url>', 'FLXBL instance URL (removes only that instance)')
|
|
11
|
+
.option('--all', 'Remove all stored tokens')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const tokenStore = new TokenStore();
|
|
14
|
+
if (opts.all) {
|
|
15
|
+
await tokenStore.clearAll();
|
|
16
|
+
log.success('All stored credentials removed.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL;
|
|
20
|
+
if (!instanceUrl) {
|
|
21
|
+
log.error('No instance specified. Use --instance <url> or set FLXBL_INSTANCE_URL.');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const removed = await tokenStore.removeToken(instanceUrl);
|
|
25
|
+
if (removed) {
|
|
26
|
+
log.success(`Credentials removed for ${instanceUrl}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
log.warn(`No stored credentials found for ${instanceUrl}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA0C,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5B,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GACf,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAElD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CACP,wEAAwE,CACzE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/schema/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAS3D"}
|