@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,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl schema versions — List all schema versions
|
|
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 registerVersionsCommand(parent) {
|
|
9
|
+
parent
|
|
10
|
+
.command('versions')
|
|
11
|
+
.description('List all schema versions')
|
|
12
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
13
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
14
|
+
.action(versionsAction);
|
|
15
|
+
}
|
|
16
|
+
async function versionsAction(opts) {
|
|
17
|
+
const loaded = await loadFlxblConfig();
|
|
18
|
+
const config = loaded?.config;
|
|
19
|
+
const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
|
|
20
|
+
if (!instanceUrl) {
|
|
21
|
+
log.error('No FLXBL instance URL configured.');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const s = spinner('Fetching schema versions...').start();
|
|
25
|
+
try {
|
|
26
|
+
const { client } = await resolveAuth({
|
|
27
|
+
apiKey: opts.apiKey,
|
|
28
|
+
instanceUrl,
|
|
29
|
+
});
|
|
30
|
+
const schemas = await client.listSchemas({
|
|
31
|
+
includeEntities: true,
|
|
32
|
+
includeFields: false,
|
|
33
|
+
includeRelationships: false,
|
|
34
|
+
});
|
|
35
|
+
s.stop();
|
|
36
|
+
if (schemas.length === 0) {
|
|
37
|
+
log.warn('No schemas found.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
renderTable([
|
|
41
|
+
{ header: 'Version', key: 'version' },
|
|
42
|
+
{ header: 'Name', key: 'name' },
|
|
43
|
+
{ header: 'Status', key: 'status' },
|
|
44
|
+
{ header: 'Entities', key: 'entityCount' },
|
|
45
|
+
{ header: 'Created', key: 'created' },
|
|
46
|
+
], schemas.map((s) => ({
|
|
47
|
+
version: s.version,
|
|
48
|
+
name: s.name,
|
|
49
|
+
status: s.status === 'ACTIVE'
|
|
50
|
+
? chalk.green(s.status)
|
|
51
|
+
: s.status === 'MIGRATION_FAILED'
|
|
52
|
+
? chalk.red(s.status)
|
|
53
|
+
: chalk.dim(s.status),
|
|
54
|
+
entityCount: s.entities.length,
|
|
55
|
+
created: new Date(s.createdAt).toLocaleDateString(),
|
|
56
|
+
})));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
s.fail('Failed to fetch schema versions');
|
|
60
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../src/commands/schema/versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D5D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flxbl whoami — Display current authentication status
|
|
3
|
+
*/
|
|
4
|
+
import { AuthManager, TokenStore, } from '@flxbl-dev/shared';
|
|
5
|
+
import { log, spinner, chalk } from '../ui/logger.js';
|
|
6
|
+
export function registerWhoamiCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('whoami')
|
|
9
|
+
.description('Display current authentication status')
|
|
10
|
+
.option('--instance <url>', 'FLXBL instance URL')
|
|
11
|
+
.option('--api-key <key>', 'API key for authentication')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL;
|
|
14
|
+
const apiKey = opts.apiKey || process.env.FLXBL_API_KEY;
|
|
15
|
+
if (!instanceUrl) {
|
|
16
|
+
// Show all stored tokens
|
|
17
|
+
const tokenStore = new TokenStore();
|
|
18
|
+
const tokens = await tokenStore.listTokens();
|
|
19
|
+
if (tokens.length === 0) {
|
|
20
|
+
log.warn('Not logged in to any FLXBL instance.');
|
|
21
|
+
log.dim('Run `flxbl login` to authenticate.');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
log.info('Stored credentials:');
|
|
25
|
+
for (const t of tokens) {
|
|
26
|
+
const status = t.isExpired ? chalk.red('expired') : chalk.green('valid');
|
|
27
|
+
log.plain(` ${chalk.bold(t.instanceUrl)} — ${t.email} [${status}]`);
|
|
28
|
+
}
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const s = spinner('Checking authentication...').start();
|
|
32
|
+
const tokenStore = new TokenStore();
|
|
33
|
+
const authManager = new AuthManager(instanceUrl, tokenStore);
|
|
34
|
+
if (apiKey) {
|
|
35
|
+
authManager.setApiKey(apiKey);
|
|
36
|
+
}
|
|
37
|
+
const state = await authManager.getAuthState();
|
|
38
|
+
if (!state.isAuthenticated) {
|
|
39
|
+
s.fail('Not authenticated');
|
|
40
|
+
log.dim(`Instance: ${instanceUrl}`);
|
|
41
|
+
log.dim('Run `flxbl login` to authenticate.');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
// Validate the token is still good
|
|
45
|
+
const profile = await authManager.validateToken();
|
|
46
|
+
if (!profile) {
|
|
47
|
+
s.fail('Token is expired or invalid');
|
|
48
|
+
log.dim('Run `flxbl login` to re-authenticate.');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
s.succeed(`Authenticated as ${chalk.bold(profile.email)}`);
|
|
52
|
+
log.dim(`Instance: ${instanceUrl}`);
|
|
53
|
+
log.dim(`Tenant: ${profile.tenant.name} (${profile.tenantId})`);
|
|
54
|
+
log.dim(`User ID: ${profile.id}`);
|
|
55
|
+
log.dim(`Method: ${state.method}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file loader
|
|
3
|
+
*
|
|
4
|
+
* Walks up directory tree to find flxbl.config.ts / flxbl.config.js
|
|
5
|
+
* Uses jiti for TypeScript config loading without compilation.
|
|
6
|
+
*/
|
|
7
|
+
import type { FlxblConfig } from './types.js';
|
|
8
|
+
declare const CONFIG_FILENAMES: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Walks up from `startDir` to find a config file.
|
|
11
|
+
* Returns the full path to the config file, or null if not found.
|
|
12
|
+
*/
|
|
13
|
+
declare function findConfigFile(startDir: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Loads and returns the FLXBL config.
|
|
16
|
+
* Returns null if no config file is found.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadFlxblConfig(startDir?: string): Promise<{
|
|
19
|
+
config: FlxblConfig;
|
|
20
|
+
configPath: string;
|
|
21
|
+
} | null>;
|
|
22
|
+
export { findConfigFile, CONFIG_FILENAMES };
|
|
23
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAA,MAAM,gBAAgB,UAA6D,CAAC;AAEpF;;;GAGG;AACH,iBAAS,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBvD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAY7D;AAED,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file loader
|
|
3
|
+
*
|
|
4
|
+
* Walks up directory tree to find flxbl.config.ts / flxbl.config.js
|
|
5
|
+
* Uses jiti for TypeScript config loading without compilation.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { resolve, dirname } from 'node:path';
|
|
9
|
+
const CONFIG_FILENAMES = ['flxbl.config.ts', 'flxbl.config.js', 'flxbl.config.mjs'];
|
|
10
|
+
/**
|
|
11
|
+
* Walks up from `startDir` to find a config file.
|
|
12
|
+
* Returns the full path to the config file, or null if not found.
|
|
13
|
+
*/
|
|
14
|
+
function findConfigFile(startDir) {
|
|
15
|
+
let dir = resolve(startDir);
|
|
16
|
+
const root = dirname(dir);
|
|
17
|
+
while (true) {
|
|
18
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
19
|
+
const candidate = resolve(dir, filename);
|
|
20
|
+
if (existsSync(candidate)) {
|
|
21
|
+
return candidate;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const parent = dirname(dir);
|
|
25
|
+
if (parent === dir)
|
|
26
|
+
break; // reached filesystem root
|
|
27
|
+
dir = parent;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Loads and returns the FLXBL config.
|
|
33
|
+
* Returns null if no config file is found.
|
|
34
|
+
*/
|
|
35
|
+
export async function loadFlxblConfig(startDir = process.cwd()) {
|
|
36
|
+
const configPath = findConfigFile(startDir);
|
|
37
|
+
if (!configPath)
|
|
38
|
+
return null;
|
|
39
|
+
// Use jiti for TypeScript config loading
|
|
40
|
+
const { createJiti } = await import('jiti');
|
|
41
|
+
const jiti = createJiti(configPath, { interopDefault: true });
|
|
42
|
+
const mod = await jiti.import(configPath);
|
|
43
|
+
const config = ('default' in mod && mod.default ? mod.default : mod);
|
|
44
|
+
return { config, configPath };
|
|
45
|
+
}
|
|
46
|
+
export { findConfigFile, CONFIG_FILENAMES };
|
|
47
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,gBAAgB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AAEpF;;;GAGG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,CAAC,0BAA0B;QACrD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAEhC,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,yCAAyC;IACzC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAA4C,CAAC;IACrF,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAgB,CAAC;IAEpF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI configuration file types
|
|
3
|
+
*/
|
|
4
|
+
export interface FlxblConfig {
|
|
5
|
+
/** URL of the FLXBL instance */
|
|
6
|
+
instanceUrl: string;
|
|
7
|
+
/** Output directory for generated SDK (default: ./flxbl/_generated) */
|
|
8
|
+
outputDir?: string;
|
|
9
|
+
/** Code generation options */
|
|
10
|
+
codegen?: {
|
|
11
|
+
/** Output format: 'interface' for plain TS interfaces, 'zod' for Zod schemas */
|
|
12
|
+
format?: 'interface' | 'zod';
|
|
13
|
+
/** Include relationship type definitions (default: true) */
|
|
14
|
+
includeRelationships?: boolean;
|
|
15
|
+
/** Include query type helpers (default: true) */
|
|
16
|
+
includeQueryTypes?: boolean;
|
|
17
|
+
};
|
|
18
|
+
/** Dev mode options */
|
|
19
|
+
dev?: {
|
|
20
|
+
/** Poll interval for schema changes in ms (default: 3000) */
|
|
21
|
+
pollInterval?: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,OAAO,CAAC,EAAE;QACR,gFAAgF;QAChF,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;QAC7B,4DAA4D;QAC5D,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,iDAAiD;QACjD,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,uBAAuB;IACvB,GAAG,CAAC,EAAE;QACJ,6DAA6D;QAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAgB,GAAG,IAAI,IAAI,CAuB1B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @flxbl-dev/cli — FLXBL CLI entry point
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { registerLoginCommand } from './commands/login.js';
|
|
6
|
+
import { registerLogoutCommand } from './commands/logout.js';
|
|
7
|
+
import { registerWhoamiCommand } from './commands/whoami.js';
|
|
8
|
+
import { registerInitCommand } from './commands/init.js';
|
|
9
|
+
import { registerGenerateCommand } from './commands/generate.js';
|
|
10
|
+
import { registerDevCommand } from './commands/dev.js';
|
|
11
|
+
import { registerDataCommand } from './commands/data.js';
|
|
12
|
+
import { registerSchemaCommand } from './commands/schema/index.js';
|
|
13
|
+
const VERSION = '0.1.0';
|
|
14
|
+
export function run() {
|
|
15
|
+
const program = new Command();
|
|
16
|
+
program
|
|
17
|
+
.name('flxbl')
|
|
18
|
+
.description('FLXBL CLI — generate typed SDKs, manage schemas, and query data')
|
|
19
|
+
.version(VERSION);
|
|
20
|
+
// Auth commands
|
|
21
|
+
registerLoginCommand(program);
|
|
22
|
+
registerLogoutCommand(program);
|
|
23
|
+
registerWhoamiCommand(program);
|
|
24
|
+
// Project commands
|
|
25
|
+
registerInitCommand(program);
|
|
26
|
+
registerGenerateCommand(program);
|
|
27
|
+
registerDevCommand(program);
|
|
28
|
+
// Data commands
|
|
29
|
+
registerDataCommand(program);
|
|
30
|
+
registerSchemaCommand(program);
|
|
31
|
+
program.parse();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,UAAU,GAAG;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,iEAAiE,CAAC;SAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,gBAAgB;IAChB,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,mBAAmB;IACnB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5B,gBAAgB;IAChB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Logger — colored output and spinners
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { type Ora } from 'ora';
|
|
6
|
+
export declare const log: {
|
|
7
|
+
info: (msg: string) => void;
|
|
8
|
+
success: (msg: string) => void;
|
|
9
|
+
warn: (msg: string) => void;
|
|
10
|
+
error: (msg: string) => void;
|
|
11
|
+
dim: (msg: string) => void;
|
|
12
|
+
plain: (msg: string) => void;
|
|
13
|
+
};
|
|
14
|
+
export declare function spinner(text: string): Ora;
|
|
15
|
+
export { chalk };
|
|
16
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/ui/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,eAAO,MAAM,GAAG;gBACF,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;eACR,MAAM;iBACJ,MAAM;CACpB,CAAC;AAEF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Logger — colored output and spinners
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
export const log = {
|
|
7
|
+
info: (msg) => console.log(chalk.blue('info') + ' ' + msg),
|
|
8
|
+
success: (msg) => console.log(chalk.green('ok') + ' ' + msg),
|
|
9
|
+
warn: (msg) => console.log(chalk.yellow('warn') + ' ' + msg),
|
|
10
|
+
error: (msg) => console.error(chalk.red('error') + ' ' + msg),
|
|
11
|
+
dim: (msg) => console.log(chalk.dim(msg)),
|
|
12
|
+
plain: (msg) => console.log(msg),
|
|
13
|
+
};
|
|
14
|
+
export function spinner(text) {
|
|
15
|
+
return ora({ text, color: 'cyan' });
|
|
16
|
+
}
|
|
17
|
+
export { chalk };
|
|
18
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/ui/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC;IACnE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC;IACvE,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC;IACrE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IACrE,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;CACzC,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal table rendering
|
|
3
|
+
*/
|
|
4
|
+
export interface TableColumn {
|
|
5
|
+
header: string;
|
|
6
|
+
key: string;
|
|
7
|
+
width?: number;
|
|
8
|
+
formatter?: (value: unknown) => string;
|
|
9
|
+
}
|
|
10
|
+
export declare function renderTable(columns: TableColumn[], rows: Record<string, unknown>[]): void;
|
|
11
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/ui/table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACxC;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC9B,IAAI,CAoBN"}
|
package/dist/ui/table.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal table rendering
|
|
3
|
+
*/
|
|
4
|
+
import Table from 'cli-table3';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
export function renderTable(columns, rows) {
|
|
7
|
+
const table = new Table({
|
|
8
|
+
head: columns.map((c) => chalk.cyan(c.header)),
|
|
9
|
+
colWidths: columns.map((c) => c.width).filter(Boolean),
|
|
10
|
+
style: { head: [], border: ['dim'] },
|
|
11
|
+
wordWrap: true,
|
|
12
|
+
});
|
|
13
|
+
for (const row of rows) {
|
|
14
|
+
table.push(columns.map((col) => {
|
|
15
|
+
const val = row[col.key];
|
|
16
|
+
if (col.formatter)
|
|
17
|
+
return col.formatter(val);
|
|
18
|
+
if (val === null || val === undefined)
|
|
19
|
+
return chalk.dim('—');
|
|
20
|
+
return String(val);
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
console.log(table.toString());
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/ui/table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,UAAU,WAAW,CACzB,OAAsB,EACtB,IAA+B;IAE/B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;QAClE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;QACpC,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAClB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,GAAG,CAAC,SAAS;gBAAE,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Watcher — polls the API for schema changes
|
|
3
|
+
*/
|
|
4
|
+
import type { FlxblApiClient, TenantSchema } from '@flxbl-dev/shared';
|
|
5
|
+
export interface SchemaWatcherOptions {
|
|
6
|
+
client: FlxblApiClient;
|
|
7
|
+
pollInterval: number;
|
|
8
|
+
onSchemaChange: (schema: TenantSchema) => void | Promise<void>;
|
|
9
|
+
onError: (error: Error) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class SchemaWatcher {
|
|
12
|
+
private timer;
|
|
13
|
+
private lastVersion;
|
|
14
|
+
private lastUpdatedAt;
|
|
15
|
+
private readonly options;
|
|
16
|
+
constructor(options: SchemaWatcherOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Sets the initial schema state (so the first poll doesn't trigger a change).
|
|
19
|
+
*/
|
|
20
|
+
setInitialState(schema: TenantSchema): void;
|
|
21
|
+
/**
|
|
22
|
+
* Starts polling for schema changes.
|
|
23
|
+
*/
|
|
24
|
+
start(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Stops polling.
|
|
27
|
+
*/
|
|
28
|
+
stop(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=schema-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/schema-watcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,EAAE,oBAAoB;IAIzC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAK3C;;OAEG;IACH,KAAK,IAAI,IAAI;IAyBb;;OAEG;IACH,IAAI,IAAI,IAAI;CAMb"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Watcher — polls the API for schema changes
|
|
3
|
+
*/
|
|
4
|
+
export class SchemaWatcher {
|
|
5
|
+
timer = null;
|
|
6
|
+
lastVersion = null;
|
|
7
|
+
lastUpdatedAt = null;
|
|
8
|
+
options;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Sets the initial schema state (so the first poll doesn't trigger a change).
|
|
14
|
+
*/
|
|
15
|
+
setInitialState(schema) {
|
|
16
|
+
this.lastVersion = schema.version;
|
|
17
|
+
this.lastUpdatedAt = schema.updatedAt;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Starts polling for schema changes.
|
|
21
|
+
*/
|
|
22
|
+
start() {
|
|
23
|
+
if (this.timer)
|
|
24
|
+
return;
|
|
25
|
+
this.timer = setInterval(async () => {
|
|
26
|
+
try {
|
|
27
|
+
const schema = await this.options.client.getActiveSchema();
|
|
28
|
+
if (!schema)
|
|
29
|
+
return;
|
|
30
|
+
const changed = schema.version !== this.lastVersion ||
|
|
31
|
+
schema.updatedAt !== this.lastUpdatedAt;
|
|
32
|
+
if (changed) {
|
|
33
|
+
this.lastVersion = schema.version;
|
|
34
|
+
this.lastUpdatedAt = schema.updatedAt;
|
|
35
|
+
await this.options.onSchemaChange(schema);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
this.options.onError(error instanceof Error ? error : new Error(String(error)));
|
|
40
|
+
}
|
|
41
|
+
}, this.options.pollInterval);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Stops polling.
|
|
45
|
+
*/
|
|
46
|
+
stop() {
|
|
47
|
+
if (this.timer) {
|
|
48
|
+
clearInterval(this.timer);
|
|
49
|
+
this.timer = null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=schema-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-watcher.js","sourceRoot":"","sources":["../../src/watcher/schema-watcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,OAAO,aAAa;IAChB,KAAK,GAA0C,IAAI,CAAC;IACpD,WAAW,GAAkB,IAAI,CAAC;IAClC,aAAa,GAAkB,IAAI,CAAC;IAC3B,OAAO,CAAuB;IAE/C,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAoB;QAClC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QAEvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3D,IAAI,CAAC,MAAM;oBAAE,OAAO;gBAEpB,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW;oBACnC,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC;gBAE1C,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;oBAClC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;oBACtC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAClB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flxbl-dev/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "FLXBL CLI — generate typed SDKs, manage schemas, and query data from the terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"flxbl": "./bin/flxbl"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"bin"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rm -rf dist",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"flxbl",
|
|
31
|
+
"cli",
|
|
32
|
+
"codegen",
|
|
33
|
+
"typescript",
|
|
34
|
+
"schema",
|
|
35
|
+
"sdk-generator"
|
|
36
|
+
],
|
|
37
|
+
"author": "FLXBL",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@flxbl-dev/shared": "*",
|
|
41
|
+
"@flxbl-dev/client": "*",
|
|
42
|
+
"@inquirer/prompts": "^7.0.0",
|
|
43
|
+
"chalk": "^5.3.0",
|
|
44
|
+
"cli-table3": "^0.6.5",
|
|
45
|
+
"commander": "^12.1.0",
|
|
46
|
+
"jiti": "^2.4.0",
|
|
47
|
+
"ora": "^8.1.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.0.0",
|
|
51
|
+
"typescript": "^5.7.0",
|
|
52
|
+
"vitest": "^2.0.0"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18.0.0"
|
|
56
|
+
},
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "https://github.com/flxbl/flxbl-monolith.git",
|
|
60
|
+
"directory": "packages/cli"
|
|
61
|
+
}
|
|
62
|
+
}
|