@bagelink/workspace 1.10.1 → 1.10.3
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/bin/bgl.ts +9 -10
- package/dist/bin/bgl.cjs +3 -4
- package/dist/bin/bgl.mjs +3 -4
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/shared/{workspace.B6LGs4Ed.mjs → workspace.CApsK4fT.mjs} +38 -49
- package/dist/shared/{workspace.Ndvn7T1u.cjs → workspace.De344dyT.cjs} +20 -31
- package/package.json +1 -1
- package/src/detect.ts +4 -5
- package/src/lint.ts +1 -1
- package/src/sdk.ts +15 -26
- package/src/workspace.ts +1 -1
package/bin/bgl.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from 'node:process'
|
|
3
|
-
import { generateWorkspaceConfig } from '../src/init.js'
|
|
4
3
|
import { isWorkspace } from '../src/detect.js'
|
|
4
|
+
import { generateWorkspaceConfig } from '../src/init.js'
|
|
5
5
|
import { setupLint } from '../src/lint.js'
|
|
6
6
|
import { generateSDK, generateSDKForWorkspace } from '../src/sdk.js'
|
|
7
7
|
import { addProject, initWorkspace, listProjects } from '../src/workspace.js'
|
|
@@ -43,15 +43,15 @@ async function main() {
|
|
|
43
43
|
// Auto-detect workspace or allow override
|
|
44
44
|
const forceWorkspace = args.includes('--workspace') || args.includes('-w')
|
|
45
45
|
const forceProject = args.includes('--project') || args.includes('-p')
|
|
46
|
-
|
|
47
|
-
let workspaceMode = isWorkspace()
|
|
46
|
+
|
|
47
|
+
let workspaceMode = isWorkspace(process.cwd())
|
|
48
48
|
if (forceWorkspace) workspaceMode = true
|
|
49
49
|
if (forceProject) workspaceMode = false
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
if (workspaceMode) {
|
|
52
52
|
console.log('✓ Detected workspace mode')
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
await setupLint(process.cwd(), workspaceMode)
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
@@ -69,18 +69,17 @@ Lint Commands:
|
|
|
69
69
|
// Auto-detect workspace or allow override
|
|
70
70
|
const forceWorkspace = args.includes('--workspace') || args.includes('-w')
|
|
71
71
|
const forceProject = args.includes('--project') || args.includes('-p')
|
|
72
|
-
|
|
73
|
-
let workspaceMode = isWorkspace()
|
|
72
|
+
|
|
73
|
+
let workspaceMode = isWorkspace(process.cwd())
|
|
74
74
|
if (forceWorkspace) workspaceMode = true
|
|
75
75
|
if (forceProject) workspaceMode = false
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
if (workspaceMode) {
|
|
78
78
|
console.log('✓ Detected workspace mode - will generate for multiple projects')
|
|
79
79
|
await generateSDKForWorkspace()
|
|
80
80
|
}
|
|
81
81
|
else {
|
|
82
|
-
|
|
83
|
-
await generateSDK(process.cwd(), projectName)
|
|
82
|
+
await generateSDK(process.cwd())
|
|
84
83
|
}
|
|
85
84
|
}
|
|
86
85
|
else {
|
package/dist/bin/bgl.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
const process = require('node:process');
|
|
5
|
-
const detect = require('../shared/workspace.
|
|
5
|
+
const detect = require('../shared/workspace.De344dyT.cjs');
|
|
6
6
|
require('node:fs');
|
|
7
7
|
require('node:path');
|
|
8
8
|
require('prompts');
|
|
@@ -43,7 +43,7 @@ async function main() {
|
|
|
43
43
|
if (subcommand === "init") {
|
|
44
44
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
45
45
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
46
|
-
let workspaceMode = detect.isWorkspace();
|
|
46
|
+
let workspaceMode = detect.isWorkspace(process__default.cwd());
|
|
47
47
|
if (forceWorkspace) workspaceMode = true;
|
|
48
48
|
if (forceProject) workspaceMode = false;
|
|
49
49
|
if (workspaceMode) {
|
|
@@ -63,14 +63,13 @@ Lint Commands:
|
|
|
63
63
|
if (subcommand === "generate") {
|
|
64
64
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
65
65
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
66
|
-
let workspaceMode = detect.isWorkspace();
|
|
66
|
+
let workspaceMode = detect.isWorkspace(process__default.cwd());
|
|
67
67
|
if (forceWorkspace) workspaceMode = true;
|
|
68
68
|
if (forceProject) workspaceMode = false;
|
|
69
69
|
if (workspaceMode) {
|
|
70
70
|
console.log("\u2713 Detected workspace mode - will generate for multiple projects");
|
|
71
71
|
await detect.generateSDKForWorkspace();
|
|
72
72
|
} else {
|
|
73
|
-
args.find((arg) => !arg.startsWith("-"));
|
|
74
73
|
await detect.generateSDK(process__default.cwd());
|
|
75
74
|
}
|
|
76
75
|
} else {
|
package/dist/bin/bgl.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from 'node:process';
|
|
3
|
-
import { i as initWorkspace, g as generateWorkspaceConfig, h as addProject, l as listProjects, k as isWorkspace, d as setupLint, f as generateSDKForWorkspace, e as generateSDK } from '../shared/workspace.
|
|
3
|
+
import { i as initWorkspace, g as generateWorkspaceConfig, h as addProject, l as listProjects, k as isWorkspace, d as setupLint, f as generateSDKForWorkspace, e as generateSDK } from '../shared/workspace.CApsK4fT.mjs';
|
|
4
4
|
import 'node:fs';
|
|
5
5
|
import 'node:path';
|
|
6
6
|
import 'prompts';
|
|
@@ -37,7 +37,7 @@ async function main() {
|
|
|
37
37
|
if (subcommand === "init") {
|
|
38
38
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
39
39
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
40
|
-
let workspaceMode = isWorkspace();
|
|
40
|
+
let workspaceMode = isWorkspace(process.cwd());
|
|
41
41
|
if (forceWorkspace) workspaceMode = true;
|
|
42
42
|
if (forceProject) workspaceMode = false;
|
|
43
43
|
if (workspaceMode) {
|
|
@@ -57,14 +57,13 @@ Lint Commands:
|
|
|
57
57
|
if (subcommand === "generate") {
|
|
58
58
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
59
59
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
60
|
-
let workspaceMode = isWorkspace();
|
|
60
|
+
let workspaceMode = isWorkspace(process.cwd());
|
|
61
61
|
if (forceWorkspace) workspaceMode = true;
|
|
62
62
|
if (forceProject) workspaceMode = false;
|
|
63
63
|
if (workspaceMode) {
|
|
64
64
|
console.log("\u2713 Detected workspace mode - will generate for multiple projects");
|
|
65
65
|
await generateSDKForWorkspace();
|
|
66
66
|
} else {
|
|
67
|
-
args.find((arg) => !arg.startsWith("-"));
|
|
68
67
|
await generateSDK(process.cwd());
|
|
69
68
|
}
|
|
70
69
|
} else {
|
package/dist/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const node_fs = require('node:fs');
|
|
4
4
|
const node_path = require('node:path');
|
|
5
5
|
const process = require('node:process');
|
|
6
|
-
const detect = require('./shared/workspace.
|
|
6
|
+
const detect = require('./shared/workspace.De344dyT.cjs');
|
|
7
7
|
require('prompts');
|
|
8
8
|
|
|
9
9
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
package/dist/index.d.cts
CHANGED
|
@@ -99,7 +99,7 @@ declare function setupLint(root?: string, isWorkspace?: boolean): Promise<void>;
|
|
|
99
99
|
/**
|
|
100
100
|
* Generate SDK from OpenAPI spec
|
|
101
101
|
*/
|
|
102
|
-
declare function generateSDK(root?: string
|
|
102
|
+
declare function generateSDK(root?: string): Promise<void>;
|
|
103
103
|
/**
|
|
104
104
|
* Generate SDK for all projects in workspace
|
|
105
105
|
*/
|
package/dist/index.d.mts
CHANGED
|
@@ -99,7 +99,7 @@ declare function setupLint(root?: string, isWorkspace?: boolean): Promise<void>;
|
|
|
99
99
|
/**
|
|
100
100
|
* Generate SDK from OpenAPI spec
|
|
101
101
|
*/
|
|
102
|
-
declare function generateSDK(root?: string
|
|
102
|
+
declare function generateSDK(root?: string): Promise<void>;
|
|
103
103
|
/**
|
|
104
104
|
* Generate SDK for all projects in workspace
|
|
105
105
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -99,7 +99,7 @@ declare function setupLint(root?: string, isWorkspace?: boolean): Promise<void>;
|
|
|
99
99
|
/**
|
|
100
100
|
* Generate SDK from OpenAPI spec
|
|
101
101
|
*/
|
|
102
|
-
declare function generateSDK(root?: string
|
|
102
|
+
declare function generateSDK(root?: string): Promise<void>;
|
|
103
103
|
/**
|
|
104
104
|
* Generate SDK for all projects in workspace
|
|
105
105
|
*/
|
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { resolve, join } from 'node:path';
|
|
3
3
|
import process from 'node:process';
|
|
4
|
-
import { g as generateWorkspaceConfig, s as setBuildEnvVars, w as writeNetlifyConfig } from './shared/workspace.
|
|
5
|
-
export { h as addProject, a as generateNetlifyConfig, b as generateNetlifyRedirect, e as generateSDK, f as generateSDKForWorkspace, c as generateWorkspaceConfigSync, j as getWorkspaceInfo, i as initWorkspace, k as isWorkspace, l as listProjects, d as setupLint } from './shared/workspace.
|
|
4
|
+
import { g as generateWorkspaceConfig, s as setBuildEnvVars, w as writeNetlifyConfig } from './shared/workspace.CApsK4fT.mjs';
|
|
5
|
+
export { h as addProject, a as generateNetlifyConfig, b as generateNetlifyRedirect, e as generateSDK, f as generateSDKForWorkspace, c as generateWorkspaceConfigSync, j as getWorkspaceInfo, i as initWorkspace, k as isWorkspace, l as listProjects, d as setupLint } from './shared/workspace.CApsK4fT.mjs';
|
|
6
6
|
import 'prompts';
|
|
7
7
|
|
|
8
8
|
async function resolveConfig(mode = "development", options = {}) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { writeFileSync, existsSync, readFileSync, mkdirSync, readdirSync } from 'node:fs';
|
|
1
|
+
import { writeFileSync, existsSync, readFileSync as readFileSync$1, mkdirSync, readdirSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import process
|
|
3
|
+
import process from 'node:process';
|
|
4
4
|
import prompts from 'prompts';
|
|
5
5
|
|
|
6
6
|
function generateNetlifyRedirect(config) {
|
|
@@ -28,14 +28,14 @@ function writeNetlifyConfig(config, outPath = "./netlify.toml", additionalConfig
|
|
|
28
28
|
console.log(`\u2713 Generated netlify.toml at ${resolvedPath}`);
|
|
29
29
|
}
|
|
30
30
|
function setBuildEnvVars(config) {
|
|
31
|
-
process
|
|
32
|
-
process
|
|
31
|
+
process.env.BGL_PROXY_PATH = config.proxy;
|
|
32
|
+
process.env.BGL_API_HOST = config.host;
|
|
33
33
|
if (config.openapi_url !== void 0 && config.openapi_url !== "") {
|
|
34
|
-
process
|
|
34
|
+
process.env.BGL_OPENAPI_URL = config.openapi_url;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
async function generateWorkspaceConfig(root = process
|
|
38
|
+
async function generateWorkspaceConfig(root = process.cwd(), configFile = "bgl.config.ts") {
|
|
39
39
|
console.log("\n\u{1F527} No bgl.config.ts found. Let's create one!\n");
|
|
40
40
|
const response = await prompts([
|
|
41
41
|
{
|
|
@@ -60,7 +60,7 @@ async function generateWorkspaceConfig(root = process$1.cwd(), configFile = "bgl
|
|
|
60
60
|
]);
|
|
61
61
|
if (!response || !response.projectId) {
|
|
62
62
|
console.log("\n\u274C Config generation cancelled.\n");
|
|
63
|
-
process
|
|
63
|
+
process.exit(1);
|
|
64
64
|
}
|
|
65
65
|
const productionHost = response.useCustomHost === true ? response.customHost : `https://${response.projectId}.bagel.to`;
|
|
66
66
|
const configContent = `import { defineWorkspace } from '@bagelink/workspace'
|
|
@@ -128,7 +128,7 @@ export default defineWorkspace(configs)
|
|
|
128
128
|
}
|
|
129
129
|
console.log("\n\u{1F4A1} You can edit these files to customize your configuration.\n");
|
|
130
130
|
}
|
|
131
|
-
function generateWorkspaceConfigSync(projectId, root = process
|
|
131
|
+
function generateWorkspaceConfigSync(projectId, root = process.cwd(), configFile = "bgl.config.ts", customHost) {
|
|
132
132
|
const productionHost = customHost ?? `https://${projectId}.bagel.to`;
|
|
133
133
|
const configContent = `import { defineWorkspace } from '@bagelink/workspace'
|
|
134
134
|
import type { WorkspaceConfig, WorkspaceEnvironment } from '@bagelink/workspace'
|
|
@@ -164,7 +164,7 @@ function updatePackageJsonScripts(root) {
|
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
166
|
try {
|
|
167
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
167
|
+
const packageJson = JSON.parse(readFileSync$1(packageJsonPath, "utf-8"));
|
|
168
168
|
if (!packageJson.scripts) {
|
|
169
169
|
packageJson.scripts = {};
|
|
170
170
|
}
|
|
@@ -203,7 +203,7 @@ function updateViteConfig(root) {
|
|
|
203
203
|
const viteConfigPath = resolve(root, "vite.config.ts");
|
|
204
204
|
const viteConfigExists = existsSync(viteConfigPath);
|
|
205
205
|
if (viteConfigExists) {
|
|
206
|
-
const existingConfig = readFileSync(viteConfigPath, "utf-8");
|
|
206
|
+
const existingConfig = readFileSync$1(viteConfigPath, "utf-8");
|
|
207
207
|
if (existingConfig.includes("@bagelink/workspace")) {
|
|
208
208
|
console.log("\u2139\uFE0F vite.config.ts already configured");
|
|
209
209
|
return;
|
|
@@ -231,7 +231,7 @@ export default defineConfig(({ mode }) => {
|
|
|
231
231
|
console.log("\u2705 Created vite.config.ts");
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
async function setupLint(root = process
|
|
234
|
+
async function setupLint(root = process.cwd(), isWorkspace = false) {
|
|
235
235
|
console.log("\n\u{1F50D} Setting up linting...\n");
|
|
236
236
|
const response = await prompts([
|
|
237
237
|
{
|
|
@@ -254,7 +254,7 @@ async function setupLint(root = process$1.cwd(), isWorkspace = false) {
|
|
|
254
254
|
]);
|
|
255
255
|
if (!response || !response.configs) {
|
|
256
256
|
console.log("\n\u274C Setup cancelled.\n");
|
|
257
|
-
process
|
|
257
|
+
process.exit(1);
|
|
258
258
|
}
|
|
259
259
|
const { configs, installDeps } = response;
|
|
260
260
|
if (configs.includes("eslint")) {
|
|
@@ -369,7 +369,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
369
369
|
}
|
|
370
370
|
try {
|
|
371
371
|
const packageJson = JSON.parse(
|
|
372
|
-
|
|
372
|
+
readFileSync(packageJsonPath, "utf-8")
|
|
373
373
|
);
|
|
374
374
|
if (!packageJson.scripts) {
|
|
375
375
|
packageJson.scripts = {};
|
|
@@ -401,7 +401,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
403
|
|
|
404
|
-
async function generateSDK(root = process
|
|
404
|
+
async function generateSDK(root = process.cwd()) {
|
|
405
405
|
console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
|
|
406
406
|
let config = null;
|
|
407
407
|
let openApiUrl;
|
|
@@ -412,18 +412,19 @@ async function generateSDK(root = process$1.cwd(), projectName) {
|
|
|
412
412
|
const workspace = module.default;
|
|
413
413
|
if (typeof workspace === "function") {
|
|
414
414
|
config = workspace("development");
|
|
415
|
-
|
|
415
|
+
if (config?.openapi_url) {
|
|
416
|
+
openApiUrl = config.openapi_url;
|
|
417
|
+
}
|
|
416
418
|
}
|
|
417
419
|
}
|
|
418
|
-
} catch
|
|
419
|
-
console.warn("\u26A0\uFE0F Could not load bgl.config.ts");
|
|
420
|
+
} catch {
|
|
420
421
|
}
|
|
421
422
|
const response = await prompts([
|
|
422
423
|
{
|
|
423
|
-
type: openApiUrl ? null : "text",
|
|
424
|
+
type: openApiUrl !== void 0 ? null : "text",
|
|
424
425
|
name: "openApiUrl",
|
|
425
426
|
message: "OpenAPI spec URL:",
|
|
426
|
-
initial: openApiUrl
|
|
427
|
+
initial: openApiUrl ?? "http://localhost:8000/openapi.json"
|
|
427
428
|
},
|
|
428
429
|
{
|
|
429
430
|
type: "text",
|
|
@@ -440,16 +441,16 @@ async function generateSDK(root = process$1.cwd(), projectName) {
|
|
|
440
441
|
]);
|
|
441
442
|
if (!response) {
|
|
442
443
|
console.log("\n\u274C SDK generation cancelled.\n");
|
|
443
|
-
process
|
|
444
|
+
process.exit(1);
|
|
444
445
|
}
|
|
445
|
-
const finalUrl = openApiUrl
|
|
446
|
+
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
446
447
|
const { outputDir, splitFiles } = response;
|
|
447
448
|
console.log(`
|
|
448
449
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
449
450
|
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
450
451
|
`);
|
|
451
452
|
try {
|
|
452
|
-
const {
|
|
453
|
+
const { openAPI } = await import('@bagelink/sdk');
|
|
453
454
|
const { types, code } = await openAPI(finalUrl, "/api");
|
|
454
455
|
const outputPath = resolve(root, outputDir);
|
|
455
456
|
if (!existsSync(outputPath)) {
|
|
@@ -469,20 +470,8 @@ async function generateSDK(root = process$1.cwd(), projectName) {
|
|
|
469
470
|
console.log("\u2705 Generated index.ts");
|
|
470
471
|
if (splitFiles) {
|
|
471
472
|
console.log("\n\u{1F500} Splitting into organized files...");
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
await splitClientCode({
|
|
475
|
-
bagelinkDir: outputPath,
|
|
476
|
-
useDirectories: true
|
|
477
|
-
});
|
|
478
|
-
const fs = await import('node:fs');
|
|
479
|
-
fs.rmSync(apiPath, { force: true });
|
|
480
|
-
fs.rmSync(typesPath, { force: true });
|
|
481
|
-
fs.rmSync(indexPath, { force: true });
|
|
482
|
-
console.log("\u2705 Files organized into directories");
|
|
483
|
-
} catch (error) {
|
|
484
|
-
console.warn("\u26A0\uFE0F Could not split files, keeping monolithic structure");
|
|
485
|
-
}
|
|
473
|
+
console.log("\u2139\uFE0F File splitting requires @bagelink/sdk bin scripts");
|
|
474
|
+
console.log(" Keeping monolithic structure for now");
|
|
486
475
|
}
|
|
487
476
|
console.log("\n\u2705 SDK generated successfully!");
|
|
488
477
|
console.log(`
|
|
@@ -500,10 +489,10 @@ Import it in your code:`);
|
|
|
500
489
|
console.log(" 1. @bagelink/sdk is installed: bun add -D @bagelink/sdk");
|
|
501
490
|
console.log(" 2. OpenAPI URL is accessible");
|
|
502
491
|
console.log(" 3. API server is running (if using localhost)");
|
|
503
|
-
process
|
|
492
|
+
process.exit(1);
|
|
504
493
|
}
|
|
505
494
|
}
|
|
506
|
-
async function generateSDKForWorkspace(root = process
|
|
495
|
+
async function generateSDKForWorkspace(root = process.cwd()) {
|
|
507
496
|
console.log("\n\u{1F3E2} Generating SDK for workspace projects...\n");
|
|
508
497
|
const fs = await import('node:fs');
|
|
509
498
|
const items = fs.readdirSync(root, { withFileTypes: true });
|
|
@@ -530,14 +519,14 @@ async function generateSDKForWorkspace(root = process$1.cwd()) {
|
|
|
530
519
|
const projectPath = resolve(root, project);
|
|
531
520
|
try {
|
|
532
521
|
await generateSDK(projectPath);
|
|
533
|
-
} catch
|
|
534
|
-
console.error(`Failed to generate SDK for ${project}
|
|
522
|
+
} catch {
|
|
523
|
+
console.error(`Failed to generate SDK for ${project}`);
|
|
535
524
|
}
|
|
536
525
|
}
|
|
537
526
|
console.log("\n\u2705 All SDKs generated!");
|
|
538
527
|
}
|
|
539
528
|
|
|
540
|
-
async function initWorkspace(root = process
|
|
529
|
+
async function initWorkspace(root = process.cwd()) {
|
|
541
530
|
console.log("\n\u{1F680} Creating Bagel workspace...\n");
|
|
542
531
|
const response = await prompts([
|
|
543
532
|
{
|
|
@@ -567,7 +556,7 @@ async function initWorkspace(root = process$1.cwd()) {
|
|
|
567
556
|
]);
|
|
568
557
|
if (!response || !response.workspaceName) {
|
|
569
558
|
console.log("\n\u274C Workspace creation cancelled.\n");
|
|
570
|
-
process
|
|
559
|
+
process.exit(1);
|
|
571
560
|
}
|
|
572
561
|
const { workspaceName, projectId, createFirstProject, firstProjectName } = response;
|
|
573
562
|
createWorkspaceRoot(root, workspaceName, projectId);
|
|
@@ -590,7 +579,7 @@ function createWorkspaceRoot(root, name, projectId) {
|
|
|
590
579
|
const workspaceDir = resolve(root, name);
|
|
591
580
|
if (existsSync(workspaceDir)) {
|
|
592
581
|
console.error(`\u274C Directory ${name} already exists`);
|
|
593
|
-
process
|
|
582
|
+
process.exit(1);
|
|
594
583
|
}
|
|
595
584
|
mkdirSync(workspaceDir, { recursive: true });
|
|
596
585
|
const packageJson = {
|
|
@@ -706,11 +695,11 @@ function createSharedPackage(root) {
|
|
|
706
695
|
);
|
|
707
696
|
console.log("\u2705 Created shared package");
|
|
708
697
|
}
|
|
709
|
-
async function addProject(name, root = process
|
|
698
|
+
async function addProject(name, root = process.cwd()) {
|
|
710
699
|
const projectDir = resolve(root, name);
|
|
711
700
|
if (existsSync(projectDir)) {
|
|
712
701
|
console.error(`\u274C Project ${name} already exists`);
|
|
713
|
-
process
|
|
702
|
+
process.exit(1);
|
|
714
703
|
}
|
|
715
704
|
console.log(`
|
|
716
705
|
\u{1F4E6} Creating project: ${name}
|
|
@@ -835,7 +824,7 @@ function updateWorkspaceScripts(root, projectName) {
|
|
|
835
824
|
if (!existsSync(packageJsonPath)) return;
|
|
836
825
|
try {
|
|
837
826
|
const packageJson = JSON.parse(
|
|
838
|
-
|
|
827
|
+
readFileSync(packageJsonPath, "utf-8")
|
|
839
828
|
);
|
|
840
829
|
if (!packageJson.scripts) {
|
|
841
830
|
packageJson.scripts = {};
|
|
@@ -852,7 +841,7 @@ function updateWorkspaceScripts(root, projectName) {
|
|
|
852
841
|
console.warn("\u26A0\uFE0F Could not update workspace scripts");
|
|
853
842
|
}
|
|
854
843
|
}
|
|
855
|
-
function listProjects(root = process
|
|
844
|
+
function listProjects(root = process.cwd()) {
|
|
856
845
|
try {
|
|
857
846
|
const items = readdirSync(root, { withFileTypes: true });
|
|
858
847
|
return items.filter(
|
|
@@ -867,8 +856,8 @@ function isWorkspace(root = process.cwd()) {
|
|
|
867
856
|
const packageJsonPath = resolve(root, "package.json");
|
|
868
857
|
if (existsSync(packageJsonPath)) {
|
|
869
858
|
try {
|
|
870
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
871
|
-
if (packageJson.workspaces) {
|
|
859
|
+
const packageJson = JSON.parse(readFileSync$1(packageJsonPath, "utf-8"));
|
|
860
|
+
if (packageJson.workspaces !== void 0) {
|
|
872
861
|
return true;
|
|
873
862
|
}
|
|
874
863
|
} catch {
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
const node_fs = require('node:fs');
|
|
4
4
|
const node_path = require('node:path');
|
|
5
|
-
const process
|
|
5
|
+
const process = require('node:process');
|
|
6
6
|
const prompts = require('prompts');
|
|
7
7
|
|
|
8
8
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
9
9
|
|
|
10
|
-
const process__default = /*#__PURE__*/_interopDefaultCompat(process
|
|
10
|
+
const process__default = /*#__PURE__*/_interopDefaultCompat(process);
|
|
11
11
|
const prompts__default = /*#__PURE__*/_interopDefaultCompat(prompts);
|
|
12
12
|
|
|
13
13
|
function generateNetlifyRedirect(config) {
|
|
@@ -376,7 +376,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
376
376
|
}
|
|
377
377
|
try {
|
|
378
378
|
const packageJson = JSON.parse(
|
|
379
|
-
|
|
379
|
+
readFileSync(packageJsonPath, "utf-8")
|
|
380
380
|
);
|
|
381
381
|
if (!packageJson.scripts) {
|
|
382
382
|
packageJson.scripts = {};
|
|
@@ -408,7 +408,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
410
|
|
|
411
|
-
async function generateSDK(root = process__default.cwd()
|
|
411
|
+
async function generateSDK(root = process__default.cwd()) {
|
|
412
412
|
console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
|
|
413
413
|
let config = null;
|
|
414
414
|
let openApiUrl;
|
|
@@ -419,18 +419,19 @@ async function generateSDK(root = process__default.cwd(), projectName) {
|
|
|
419
419
|
const workspace = module.default;
|
|
420
420
|
if (typeof workspace === "function") {
|
|
421
421
|
config = workspace("development");
|
|
422
|
-
|
|
422
|
+
if (config?.openapi_url) {
|
|
423
|
+
openApiUrl = config.openapi_url;
|
|
424
|
+
}
|
|
423
425
|
}
|
|
424
426
|
}
|
|
425
|
-
} catch
|
|
426
|
-
console.warn("\u26A0\uFE0F Could not load bgl.config.ts");
|
|
427
|
+
} catch {
|
|
427
428
|
}
|
|
428
429
|
const response = await prompts__default([
|
|
429
430
|
{
|
|
430
|
-
type: openApiUrl ? null : "text",
|
|
431
|
+
type: openApiUrl !== void 0 ? null : "text",
|
|
431
432
|
name: "openApiUrl",
|
|
432
433
|
message: "OpenAPI spec URL:",
|
|
433
|
-
initial: openApiUrl
|
|
434
|
+
initial: openApiUrl ?? "http://localhost:8000/openapi.json"
|
|
434
435
|
},
|
|
435
436
|
{
|
|
436
437
|
type: "text",
|
|
@@ -449,14 +450,14 @@ async function generateSDK(root = process__default.cwd(), projectName) {
|
|
|
449
450
|
console.log("\n\u274C SDK generation cancelled.\n");
|
|
450
451
|
process__default.exit(1);
|
|
451
452
|
}
|
|
452
|
-
const finalUrl = openApiUrl
|
|
453
|
+
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
453
454
|
const { outputDir, splitFiles } = response;
|
|
454
455
|
console.log(`
|
|
455
456
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
456
457
|
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
457
458
|
`);
|
|
458
459
|
try {
|
|
459
|
-
const {
|
|
460
|
+
const { openAPI } = await import('@bagelink/sdk');
|
|
460
461
|
const { types, code } = await openAPI(finalUrl, "/api");
|
|
461
462
|
const outputPath = node_path.resolve(root, outputDir);
|
|
462
463
|
if (!node_fs.existsSync(outputPath)) {
|
|
@@ -476,20 +477,8 @@ async function generateSDK(root = process__default.cwd(), projectName) {
|
|
|
476
477
|
console.log("\u2705 Generated index.ts");
|
|
477
478
|
if (splitFiles) {
|
|
478
479
|
console.log("\n\u{1F500} Splitting into organized files...");
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
await splitClientCode({
|
|
482
|
-
bagelinkDir: outputPath,
|
|
483
|
-
useDirectories: true
|
|
484
|
-
});
|
|
485
|
-
const fs = await import('node:fs');
|
|
486
|
-
fs.rmSync(apiPath, { force: true });
|
|
487
|
-
fs.rmSync(typesPath, { force: true });
|
|
488
|
-
fs.rmSync(indexPath, { force: true });
|
|
489
|
-
console.log("\u2705 Files organized into directories");
|
|
490
|
-
} catch (error) {
|
|
491
|
-
console.warn("\u26A0\uFE0F Could not split files, keeping monolithic structure");
|
|
492
|
-
}
|
|
480
|
+
console.log("\u2139\uFE0F File splitting requires @bagelink/sdk bin scripts");
|
|
481
|
+
console.log(" Keeping monolithic structure for now");
|
|
493
482
|
}
|
|
494
483
|
console.log("\n\u2705 SDK generated successfully!");
|
|
495
484
|
console.log(`
|
|
@@ -537,8 +526,8 @@ async function generateSDKForWorkspace(root = process__default.cwd()) {
|
|
|
537
526
|
const projectPath = node_path.resolve(root, project);
|
|
538
527
|
try {
|
|
539
528
|
await generateSDK(projectPath);
|
|
540
|
-
} catch
|
|
541
|
-
console.error(`Failed to generate SDK for ${project}
|
|
529
|
+
} catch {
|
|
530
|
+
console.error(`Failed to generate SDK for ${project}`);
|
|
542
531
|
}
|
|
543
532
|
}
|
|
544
533
|
console.log("\n\u2705 All SDKs generated!");
|
|
@@ -842,7 +831,7 @@ function updateWorkspaceScripts(root, projectName) {
|
|
|
842
831
|
if (!node_fs.existsSync(packageJsonPath)) return;
|
|
843
832
|
try {
|
|
844
833
|
const packageJson = JSON.parse(
|
|
845
|
-
|
|
834
|
+
readFileSync(packageJsonPath, "utf-8")
|
|
846
835
|
);
|
|
847
836
|
if (!packageJson.scripts) {
|
|
848
837
|
packageJson.scripts = {};
|
|
@@ -870,12 +859,12 @@ function listProjects(root = process__default.cwd()) {
|
|
|
870
859
|
}
|
|
871
860
|
}
|
|
872
861
|
|
|
873
|
-
function isWorkspace(root =
|
|
862
|
+
function isWorkspace(root = process__default.cwd()) {
|
|
874
863
|
const packageJsonPath = node_path.resolve(root, "package.json");
|
|
875
864
|
if (node_fs.existsSync(packageJsonPath)) {
|
|
876
865
|
try {
|
|
877
866
|
const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, "utf-8"));
|
|
878
|
-
if (packageJson.workspaces) {
|
|
867
|
+
if (packageJson.workspaces !== void 0) {
|
|
879
868
|
return true;
|
|
880
869
|
}
|
|
881
870
|
} catch {
|
|
@@ -891,7 +880,7 @@ function isWorkspace(root = process.cwd()) {
|
|
|
891
880
|
return false;
|
|
892
881
|
}
|
|
893
882
|
}
|
|
894
|
-
function getWorkspaceInfo(root =
|
|
883
|
+
function getWorkspaceInfo(root = process__default.cwd()) {
|
|
895
884
|
const workspace = isWorkspace(root);
|
|
896
885
|
if (!workspace) {
|
|
897
886
|
return {
|
package/package.json
CHANGED
package/src/detect.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
2
2
|
import { resolve } from 'node:path'
|
|
3
|
+
import process from 'node:process'
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Detect if current directory is a workspace root
|
|
@@ -10,7 +11,7 @@ export function isWorkspace(root: string = process.cwd()): boolean {
|
|
|
10
11
|
if (existsSync(packageJsonPath)) {
|
|
11
12
|
try {
|
|
12
13
|
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))
|
|
13
|
-
if (packageJson.workspaces) {
|
|
14
|
+
if (packageJson.workspaces !== undefined) {
|
|
14
15
|
return true
|
|
15
16
|
}
|
|
16
17
|
}
|
|
@@ -24,8 +25,7 @@ export function isWorkspace(root: string = process.cwd()): boolean {
|
|
|
24
25
|
try {
|
|
25
26
|
const items = readdirSync(root, { withFileTypes: true })
|
|
26
27
|
const projectDirs = items.filter(
|
|
27
|
-
item =>
|
|
28
|
-
item.isDirectory()
|
|
28
|
+
item => item.isDirectory()
|
|
29
29
|
&& item.name !== 'node_modules'
|
|
30
30
|
&& item.name !== 'shared'
|
|
31
31
|
&& item.name !== '.git'
|
|
@@ -63,8 +63,7 @@ export function getWorkspaceInfo(root: string = process.cwd()): {
|
|
|
63
63
|
const items = readdirSync(root, { withFileTypes: true })
|
|
64
64
|
const projects = items
|
|
65
65
|
.filter(
|
|
66
|
-
item =>
|
|
67
|
-
item.isDirectory()
|
|
66
|
+
item => item.isDirectory()
|
|
68
67
|
&& item.name !== 'node_modules'
|
|
69
68
|
&& item.name !== 'shared'
|
|
70
69
|
&& item.name !== '.git'
|
package/src/lint.ts
CHANGED
|
@@ -195,7 +195,7 @@ function updatePackageJsonLint(root: string, configs: string[]): void {
|
|
|
195
195
|
|
|
196
196
|
try {
|
|
197
197
|
const packageJson = JSON.parse(
|
|
198
|
-
|
|
198
|
+
readFileSync(packageJsonPath, 'utf-8'),
|
|
199
199
|
)
|
|
200
200
|
|
|
201
201
|
if (!packageJson.scripts) {
|
package/src/sdk.ts
CHANGED
|
@@ -9,7 +9,6 @@ import prompts from 'prompts'
|
|
|
9
9
|
*/
|
|
10
10
|
export async function generateSDK(
|
|
11
11
|
root: string = process.cwd(),
|
|
12
|
-
projectName?: string,
|
|
13
12
|
): Promise<void> {
|
|
14
13
|
console.log('\n🔧 Generating SDK from OpenAPI...\n')
|
|
15
14
|
|
|
@@ -24,21 +23,23 @@ export async function generateSDK(
|
|
|
24
23
|
const workspace = module.default
|
|
25
24
|
if (typeof workspace === 'function') {
|
|
26
25
|
config = workspace('development')
|
|
27
|
-
|
|
26
|
+
if (config?.openapi_url) {
|
|
27
|
+
openApiUrl = config.openapi_url
|
|
28
|
+
}
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
|
-
catch
|
|
32
|
-
|
|
32
|
+
catch {
|
|
33
|
+
// Ignore config load errors
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
// Prompt for missing info
|
|
36
37
|
const response = await prompts([
|
|
37
38
|
{
|
|
38
|
-
type: openApiUrl ? null : 'text',
|
|
39
|
+
type: openApiUrl !== undefined ? null : 'text',
|
|
39
40
|
name: 'openApiUrl',
|
|
40
41
|
message: 'OpenAPI spec URL:',
|
|
41
|
-
initial: openApiUrl
|
|
42
|
+
initial: openApiUrl ?? 'http://localhost:8000/openapi.json',
|
|
42
43
|
},
|
|
43
44
|
{
|
|
44
45
|
type: 'text',
|
|
@@ -59,7 +60,7 @@ export async function generateSDK(
|
|
|
59
60
|
process.exit(1)
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
const finalUrl = openApiUrl
|
|
63
|
+
const finalUrl = openApiUrl ?? response.openApiUrl
|
|
63
64
|
const { outputDir, splitFiles } = response
|
|
64
65
|
|
|
65
66
|
console.log(`\n📡 Fetching OpenAPI spec from: ${finalUrl}`)
|
|
@@ -67,7 +68,7 @@ export async function generateSDK(
|
|
|
67
68
|
|
|
68
69
|
try {
|
|
69
70
|
// Dynamic import of @bagelink/sdk
|
|
70
|
-
const {
|
|
71
|
+
const { openAPI } = await import('@bagelink/sdk')
|
|
71
72
|
|
|
72
73
|
const { types, code } = await openAPI(finalUrl, '/api')
|
|
73
74
|
|
|
@@ -96,22 +97,10 @@ export async function generateSDK(
|
|
|
96
97
|
|
|
97
98
|
if (splitFiles) {
|
|
98
99
|
console.log('\n🔀 Splitting into organized files...')
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
useDirectories: true,
|
|
104
|
-
})
|
|
105
|
-
// Clean up monolithic files
|
|
106
|
-
const fs = await import('node:fs')
|
|
107
|
-
fs.rmSync(apiPath, { force: true })
|
|
108
|
-
fs.rmSync(typesPath, { force: true })
|
|
109
|
-
fs.rmSync(indexPath, { force: true })
|
|
110
|
-
console.log('✅ Files organized into directories')
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
console.warn('⚠️ Could not split files, keeping monolithic structure')
|
|
114
|
-
}
|
|
100
|
+
console.log('ℹ️ File splitting requires @bagelink/sdk bin scripts')
|
|
101
|
+
console.log(' Keeping monolithic structure for now')
|
|
102
|
+
// Note: File splitting requires unpublished bin scripts
|
|
103
|
+
// Users can manually run: bunx bagelink generate
|
|
115
104
|
}
|
|
116
105
|
|
|
117
106
|
console.log('\n✅ SDK generated successfully!')
|
|
@@ -177,8 +166,8 @@ export async function generateSDKForWorkspace(root: string = process.cwd()): Pro
|
|
|
177
166
|
try {
|
|
178
167
|
await generateSDK(projectPath)
|
|
179
168
|
}
|
|
180
|
-
catch
|
|
181
|
-
console.error(`Failed to generate SDK for ${project}
|
|
169
|
+
catch {
|
|
170
|
+
console.error(`Failed to generate SDK for ${project}`)
|
|
182
171
|
}
|
|
183
172
|
}
|
|
184
173
|
|
package/src/workspace.ts
CHANGED
|
@@ -386,7 +386,7 @@ function updateWorkspaceScripts(root: string, projectName: string): void {
|
|
|
386
386
|
|
|
387
387
|
try {
|
|
388
388
|
const packageJson = JSON.parse(
|
|
389
|
-
|
|
389
|
+
readFileSync(packageJsonPath, 'utf-8'),
|
|
390
390
|
)
|
|
391
391
|
|
|
392
392
|
if (!packageJson.scripts) {
|