@bagelink/workspace 1.12.19 → 1.12.25
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 +8 -2
- package/dist/bin/bgl.cjs +74 -26
- package/dist/bin/bgl.mjs +75 -27
- package/package.json +1 -1
- package/src/sdk.ts +87 -32
package/bin/bgl.ts
CHANGED
|
@@ -85,23 +85,27 @@ Lint Commands:
|
|
|
85
85
|
// Auto-detect workspace or allow override
|
|
86
86
|
const forceWorkspace = args.includes('--workspace') || args.includes('-w')
|
|
87
87
|
const forceProject = args.includes('--project') || args.includes('-p')
|
|
88
|
+
const splitMode = args.includes('--split') || args.includes('-s')
|
|
88
89
|
|
|
89
90
|
let workspaceMode = isWorkspace(process.cwd())
|
|
90
91
|
if (forceWorkspace) workspaceMode = true
|
|
91
92
|
if (forceProject) workspaceMode = false
|
|
92
93
|
|
|
94
|
+
const sdkOptions = { split: splitMode || undefined }
|
|
95
|
+
|
|
93
96
|
if (workspaceMode) {
|
|
94
97
|
console.log('✓ Detected workspace mode - will generate for multiple projects')
|
|
95
|
-
await generateSDKForWorkspace()
|
|
98
|
+
await generateSDKForWorkspace(process.cwd(), sdkOptions)
|
|
96
99
|
}
|
|
97
100
|
else {
|
|
98
|
-
await generateSDK(process.cwd())
|
|
101
|
+
await generateSDK(process.cwd(), sdkOptions)
|
|
99
102
|
}
|
|
100
103
|
}
|
|
101
104
|
else {
|
|
102
105
|
console.log(`
|
|
103
106
|
SDK Commands:
|
|
104
107
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
108
|
+
bgl sdk generate --split Generate per-module API files
|
|
105
109
|
bgl sdk generate --workspace Force workspace mode
|
|
106
110
|
bgl sdk generate --project Force single project mode
|
|
107
111
|
`)
|
|
@@ -145,10 +149,12 @@ Usage:
|
|
|
145
149
|
Example: bgl build --mode production
|
|
146
150
|
bgl lint init Set up linting (auto-detects workspace)
|
|
147
151
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
152
|
+
bgl sdk generate --split Generate per-module API files
|
|
148
153
|
|
|
149
154
|
Options:
|
|
150
155
|
--workspace, -w Force workspace mode
|
|
151
156
|
--project, -p Force single project mode
|
|
157
|
+
--split, -s Split SDK into per-module files
|
|
152
158
|
--mode <env> Set environment (matches bgl.config.ts keys)
|
|
153
159
|
--help, -h Show this help message
|
|
154
160
|
|
package/dist/bin/bgl.cjs
CHANGED
|
@@ -636,7 +636,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
636
636
|
}
|
|
637
637
|
}
|
|
638
638
|
|
|
639
|
-
async function generateSDK(root = process__default.cwd()) {
|
|
639
|
+
async function generateSDK(root = process__default.cwd(), options = {}) {
|
|
640
640
|
console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
|
|
641
641
|
let config = null;
|
|
642
642
|
let openApiUrl;
|
|
@@ -668,9 +668,9 @@ async function generateSDK(root = process__default.cwd()) {
|
|
|
668
668
|
initial: "./src/api"
|
|
669
669
|
},
|
|
670
670
|
{
|
|
671
|
-
type: "confirm",
|
|
671
|
+
type: options.split !== void 0 ? null : "confirm",
|
|
672
672
|
name: "splitFiles",
|
|
673
|
-
message: "Split into
|
|
673
|
+
message: "Split into per-module files?",
|
|
674
674
|
initial: true
|
|
675
675
|
}
|
|
676
676
|
]);
|
|
@@ -679,16 +679,15 @@ async function generateSDK(root = process__default.cwd()) {
|
|
|
679
679
|
process__default.exit(1);
|
|
680
680
|
}
|
|
681
681
|
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
682
|
-
const { outputDir
|
|
682
|
+
const { outputDir } = response;
|
|
683
|
+
const splitFiles = options.split ?? response.splitFiles ?? false;
|
|
683
684
|
console.log(`
|
|
684
685
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
685
|
-
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
686
|
+
console.log(`\u{1F4C1} Output directory: ${outputDir}`);
|
|
687
|
+
console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
|
|
686
688
|
`);
|
|
687
689
|
try {
|
|
688
690
|
const { openAPI } = await import('@bagelink/sdk');
|
|
689
|
-
const { readFileSync } = await import('node:fs');
|
|
690
|
-
const { dirname, join } = await import('node:path');
|
|
691
|
-
const { fileURLToPath } = await import('node:url');
|
|
692
691
|
const { types, code } = await openAPI(finalUrl, "/api");
|
|
693
692
|
const outputPath = node_path.resolve(root, outputDir);
|
|
694
693
|
if (!node_fs.existsSync(outputPath)) {
|
|
@@ -696,21 +695,40 @@ async function generateSDK(root = process__default.cwd()) {
|
|
|
696
695
|
}
|
|
697
696
|
const typesPath = node_path.resolve(outputPath, "types.d.ts");
|
|
698
697
|
node_fs.writeFileSync(typesPath, types);
|
|
699
|
-
console.log("\u2705 Generated types.d.ts");
|
|
700
698
|
const apiPath = node_path.resolve(outputPath, "api.ts");
|
|
701
699
|
node_fs.writeFileSync(apiPath, code);
|
|
702
|
-
console.log("\u2705 Generated api.ts");
|
|
703
|
-
console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
|
|
704
700
|
if (splitFiles) {
|
|
705
|
-
console.log("\
|
|
706
|
-
|
|
707
|
-
|
|
701
|
+
console.log("\u{1F500} Splitting into per-module files...");
|
|
702
|
+
try {
|
|
703
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
|
|
704
|
+
await splitClientCode({
|
|
705
|
+
bagelinkDir: outputPath,
|
|
706
|
+
useDirectories: true
|
|
707
|
+
});
|
|
708
|
+
node_fs.rmSync(apiPath, { force: true });
|
|
709
|
+
node_fs.rmSync(typesPath, { force: true });
|
|
710
|
+
console.log("\u2705 SDK split into per-module files!");
|
|
711
|
+
} catch (splitError) {
|
|
712
|
+
console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
|
|
713
|
+
console.log("\u2705 Generated monolithic api.ts + types.d.ts");
|
|
714
|
+
}
|
|
715
|
+
} else {
|
|
716
|
+
console.log("\u2705 Generated types.d.ts");
|
|
717
|
+
console.log("\u2705 Generated api.ts");
|
|
708
718
|
}
|
|
719
|
+
console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
|
|
709
720
|
console.log("\n\u2705 SDK generated successfully!");
|
|
710
|
-
|
|
721
|
+
if (splitFiles) {
|
|
722
|
+
console.log(`
|
|
723
|
+
Import per-module in your code:`);
|
|
724
|
+
console.log(` import { person } from '${outputDir.replace("./src/", "./")}/api'`);
|
|
725
|
+
console.log(` import type { PersonOut } from '${outputDir.replace("./src/", "./")}/types'`);
|
|
726
|
+
} else {
|
|
727
|
+
console.log(`
|
|
711
728
|
Import directly in your code:`);
|
|
712
|
-
|
|
713
|
-
|
|
729
|
+
console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
|
|
730
|
+
console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
|
|
731
|
+
}
|
|
714
732
|
console.log("");
|
|
715
733
|
} catch (error) {
|
|
716
734
|
console.error("\n\u274C Failed to generate SDK:");
|
|
@@ -726,7 +744,7 @@ Import directly in your code:`);
|
|
|
726
744
|
process__default.exit(1);
|
|
727
745
|
}
|
|
728
746
|
}
|
|
729
|
-
async function generateSDKForWorkspace(root = process__default.cwd()) {
|
|
747
|
+
async function generateSDKForWorkspace(root = process__default.cwd(), options = {}) {
|
|
730
748
|
console.log("\n\u{1F3E2} Generating SDK for workspace...\n");
|
|
731
749
|
let config = null;
|
|
732
750
|
let openApiUrl;
|
|
@@ -756,9 +774,11 @@ async function generateSDKForWorkspace(root = process__default.cwd()) {
|
|
|
756
774
|
}
|
|
757
775
|
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
758
776
|
const outputDir = "./shared";
|
|
777
|
+
const splitFiles = options.split ?? false;
|
|
759
778
|
console.log(`
|
|
760
779
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
761
|
-
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
780
|
+
console.log(`\u{1F4C1} Output directory: ${outputDir}`);
|
|
781
|
+
console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
|
|
762
782
|
`);
|
|
763
783
|
try {
|
|
764
784
|
const { openAPI } = await import('@bagelink/sdk');
|
|
@@ -769,15 +789,38 @@ async function generateSDKForWorkspace(root = process__default.cwd()) {
|
|
|
769
789
|
}
|
|
770
790
|
const typesPath = node_path.resolve(outputPath, "types.d.ts");
|
|
771
791
|
node_fs.writeFileSync(typesPath, types);
|
|
772
|
-
console.log("\u2705 Generated types.d.ts");
|
|
773
792
|
const apiPath = node_path.resolve(outputPath, "api.ts");
|
|
774
793
|
node_fs.writeFileSync(apiPath, code);
|
|
775
|
-
|
|
794
|
+
if (splitFiles) {
|
|
795
|
+
console.log("\u{1F500} Splitting into per-module files...");
|
|
796
|
+
try {
|
|
797
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
|
|
798
|
+
await splitClientCode({
|
|
799
|
+
bagelinkDir: outputPath,
|
|
800
|
+
useDirectories: true
|
|
801
|
+
});
|
|
802
|
+
node_fs.rmSync(apiPath, { force: true });
|
|
803
|
+
node_fs.rmSync(typesPath, { force: true });
|
|
804
|
+
console.log("\u2705 SDK split into per-module files!");
|
|
805
|
+
} catch (splitError) {
|
|
806
|
+
console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
|
|
807
|
+
}
|
|
808
|
+
} else {
|
|
809
|
+
console.log("\u2705 Generated types.d.ts");
|
|
810
|
+
console.log("\u2705 Generated api.ts");
|
|
811
|
+
}
|
|
776
812
|
console.log("\n\u2705 SDK generated successfully in shared folder!");
|
|
777
|
-
|
|
813
|
+
if (splitFiles) {
|
|
814
|
+
console.log(`
|
|
815
|
+
Import per-module from shared:`);
|
|
816
|
+
console.log(` import { person } from '@shared/api'`);
|
|
817
|
+
console.log(` import type { PersonOut } from '@shared/types'`);
|
|
818
|
+
} else {
|
|
819
|
+
console.log(`
|
|
778
820
|
Import from shared in your projects:`);
|
|
779
|
-
|
|
780
|
-
|
|
821
|
+
console.log(` import { agents } from '@shared/api'`);
|
|
822
|
+
console.log(` import type { SendMessageRequest } from '@shared/types'`);
|
|
823
|
+
}
|
|
781
824
|
console.log("");
|
|
782
825
|
} catch (error) {
|
|
783
826
|
console.error("\n\u274C Failed to generate SDK:");
|
|
@@ -850,19 +893,22 @@ Lint Commands:
|
|
|
850
893
|
if (subcommand === "generate") {
|
|
851
894
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
852
895
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
896
|
+
const splitMode = args.includes("--split") || args.includes("-s");
|
|
853
897
|
let workspaceMode = isWorkspace(process__default.cwd());
|
|
854
898
|
if (forceWorkspace) workspaceMode = true;
|
|
855
899
|
if (forceProject) workspaceMode = false;
|
|
900
|
+
const sdkOptions = { split: splitMode || void 0 };
|
|
856
901
|
if (workspaceMode) {
|
|
857
902
|
console.log("\u2713 Detected workspace mode - will generate for multiple projects");
|
|
858
|
-
await generateSDKForWorkspace();
|
|
903
|
+
await generateSDKForWorkspace(process__default.cwd(), sdkOptions);
|
|
859
904
|
} else {
|
|
860
|
-
await generateSDK(process__default.cwd());
|
|
905
|
+
await generateSDK(process__default.cwd(), sdkOptions);
|
|
861
906
|
}
|
|
862
907
|
} else {
|
|
863
908
|
console.log(`
|
|
864
909
|
SDK Commands:
|
|
865
910
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
911
|
+
bgl sdk generate --split Generate per-module API files
|
|
866
912
|
bgl sdk generate --workspace Force workspace mode
|
|
867
913
|
bgl sdk generate --project Force single project mode
|
|
868
914
|
`);
|
|
@@ -903,10 +949,12 @@ Usage:
|
|
|
903
949
|
Example: bgl build --mode production
|
|
904
950
|
bgl lint init Set up linting (auto-detects workspace)
|
|
905
951
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
952
|
+
bgl sdk generate --split Generate per-module API files
|
|
906
953
|
|
|
907
954
|
Options:
|
|
908
955
|
--workspace, -w Force workspace mode
|
|
909
956
|
--project, -p Force single project mode
|
|
957
|
+
--split, -s Split SDK into per-module files
|
|
910
958
|
--mode <env> Set environment (matches bgl.config.ts keys)
|
|
911
959
|
--help, -h Show this help message
|
|
912
960
|
|
package/dist/bin/bgl.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { resolve } from 'node:path';
|
|
|
3
3
|
import process from 'node:process';
|
|
4
4
|
import { spawn } from 'node:child_process';
|
|
5
5
|
import { l as listProjects, w as writeNetlifyConfig, i as initWorkspace, a as addProject } from '../shared/workspace.Bhp9XbPk.mjs';
|
|
6
|
-
import { existsSync, readFileSync, readdirSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync, unlinkSync, mkdirSync, rmSync } from 'node:fs';
|
|
7
7
|
import prompts from 'prompts';
|
|
8
8
|
|
|
9
9
|
async function runBuild(filter, additionalArgs = []) {
|
|
@@ -629,7 +629,7 @@ function updatePackageJsonLint(root, configs) {
|
|
|
629
629
|
}
|
|
630
630
|
}
|
|
631
631
|
|
|
632
|
-
async function generateSDK(root = process.cwd()) {
|
|
632
|
+
async function generateSDK(root = process.cwd(), options = {}) {
|
|
633
633
|
console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
|
|
634
634
|
let config = null;
|
|
635
635
|
let openApiUrl;
|
|
@@ -661,9 +661,9 @@ async function generateSDK(root = process.cwd()) {
|
|
|
661
661
|
initial: "./src/api"
|
|
662
662
|
},
|
|
663
663
|
{
|
|
664
|
-
type: "confirm",
|
|
664
|
+
type: options.split !== void 0 ? null : "confirm",
|
|
665
665
|
name: "splitFiles",
|
|
666
|
-
message: "Split into
|
|
666
|
+
message: "Split into per-module files?",
|
|
667
667
|
initial: true
|
|
668
668
|
}
|
|
669
669
|
]);
|
|
@@ -672,16 +672,15 @@ async function generateSDK(root = process.cwd()) {
|
|
|
672
672
|
process.exit(1);
|
|
673
673
|
}
|
|
674
674
|
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
675
|
-
const { outputDir
|
|
675
|
+
const { outputDir } = response;
|
|
676
|
+
const splitFiles = options.split ?? response.splitFiles ?? false;
|
|
676
677
|
console.log(`
|
|
677
678
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
678
|
-
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
679
|
+
console.log(`\u{1F4C1} Output directory: ${outputDir}`);
|
|
680
|
+
console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
|
|
679
681
|
`);
|
|
680
682
|
try {
|
|
681
683
|
const { openAPI } = await import('@bagelink/sdk');
|
|
682
|
-
const { readFileSync } = await import('node:fs');
|
|
683
|
-
const { dirname, join } = await import('node:path');
|
|
684
|
-
const { fileURLToPath } = await import('node:url');
|
|
685
684
|
const { types, code } = await openAPI(finalUrl, "/api");
|
|
686
685
|
const outputPath = resolve(root, outputDir);
|
|
687
686
|
if (!existsSync(outputPath)) {
|
|
@@ -689,21 +688,40 @@ async function generateSDK(root = process.cwd()) {
|
|
|
689
688
|
}
|
|
690
689
|
const typesPath = resolve(outputPath, "types.d.ts");
|
|
691
690
|
writeFileSync(typesPath, types);
|
|
692
|
-
console.log("\u2705 Generated types.d.ts");
|
|
693
691
|
const apiPath = resolve(outputPath, "api.ts");
|
|
694
692
|
writeFileSync(apiPath, code);
|
|
695
|
-
console.log("\u2705 Generated api.ts");
|
|
696
|
-
console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
|
|
697
693
|
if (splitFiles) {
|
|
698
|
-
console.log("\
|
|
699
|
-
|
|
700
|
-
|
|
694
|
+
console.log("\u{1F500} Splitting into per-module files...");
|
|
695
|
+
try {
|
|
696
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
|
|
697
|
+
await splitClientCode({
|
|
698
|
+
bagelinkDir: outputPath,
|
|
699
|
+
useDirectories: true
|
|
700
|
+
});
|
|
701
|
+
rmSync(apiPath, { force: true });
|
|
702
|
+
rmSync(typesPath, { force: true });
|
|
703
|
+
console.log("\u2705 SDK split into per-module files!");
|
|
704
|
+
} catch (splitError) {
|
|
705
|
+
console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
|
|
706
|
+
console.log("\u2705 Generated monolithic api.ts + types.d.ts");
|
|
707
|
+
}
|
|
708
|
+
} else {
|
|
709
|
+
console.log("\u2705 Generated types.d.ts");
|
|
710
|
+
console.log("\u2705 Generated api.ts");
|
|
701
711
|
}
|
|
712
|
+
console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
|
|
702
713
|
console.log("\n\u2705 SDK generated successfully!");
|
|
703
|
-
|
|
714
|
+
if (splitFiles) {
|
|
715
|
+
console.log(`
|
|
716
|
+
Import per-module in your code:`);
|
|
717
|
+
console.log(` import { person } from '${outputDir.replace("./src/", "./")}/api'`);
|
|
718
|
+
console.log(` import type { PersonOut } from '${outputDir.replace("./src/", "./")}/types'`);
|
|
719
|
+
} else {
|
|
720
|
+
console.log(`
|
|
704
721
|
Import directly in your code:`);
|
|
705
|
-
|
|
706
|
-
|
|
722
|
+
console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
|
|
723
|
+
console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
|
|
724
|
+
}
|
|
707
725
|
console.log("");
|
|
708
726
|
} catch (error) {
|
|
709
727
|
console.error("\n\u274C Failed to generate SDK:");
|
|
@@ -719,7 +737,7 @@ Import directly in your code:`);
|
|
|
719
737
|
process.exit(1);
|
|
720
738
|
}
|
|
721
739
|
}
|
|
722
|
-
async function generateSDKForWorkspace(root = process.cwd()) {
|
|
740
|
+
async function generateSDKForWorkspace(root = process.cwd(), options = {}) {
|
|
723
741
|
console.log("\n\u{1F3E2} Generating SDK for workspace...\n");
|
|
724
742
|
let config = null;
|
|
725
743
|
let openApiUrl;
|
|
@@ -749,9 +767,11 @@ async function generateSDKForWorkspace(root = process.cwd()) {
|
|
|
749
767
|
}
|
|
750
768
|
const finalUrl = openApiUrl ?? response.openApiUrl;
|
|
751
769
|
const outputDir = "./shared";
|
|
770
|
+
const splitFiles = options.split ?? false;
|
|
752
771
|
console.log(`
|
|
753
772
|
\u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
|
|
754
|
-
console.log(`\u{1F4C1} Output directory: ${outputDir}
|
|
773
|
+
console.log(`\u{1F4C1} Output directory: ${outputDir}`);
|
|
774
|
+
console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
|
|
755
775
|
`);
|
|
756
776
|
try {
|
|
757
777
|
const { openAPI } = await import('@bagelink/sdk');
|
|
@@ -762,15 +782,38 @@ async function generateSDKForWorkspace(root = process.cwd()) {
|
|
|
762
782
|
}
|
|
763
783
|
const typesPath = resolve(outputPath, "types.d.ts");
|
|
764
784
|
writeFileSync(typesPath, types);
|
|
765
|
-
console.log("\u2705 Generated types.d.ts");
|
|
766
785
|
const apiPath = resolve(outputPath, "api.ts");
|
|
767
786
|
writeFileSync(apiPath, code);
|
|
768
|
-
|
|
787
|
+
if (splitFiles) {
|
|
788
|
+
console.log("\u{1F500} Splitting into per-module files...");
|
|
789
|
+
try {
|
|
790
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
|
|
791
|
+
await splitClientCode({
|
|
792
|
+
bagelinkDir: outputPath,
|
|
793
|
+
useDirectories: true
|
|
794
|
+
});
|
|
795
|
+
rmSync(apiPath, { force: true });
|
|
796
|
+
rmSync(typesPath, { force: true });
|
|
797
|
+
console.log("\u2705 SDK split into per-module files!");
|
|
798
|
+
} catch (splitError) {
|
|
799
|
+
console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
|
|
800
|
+
}
|
|
801
|
+
} else {
|
|
802
|
+
console.log("\u2705 Generated types.d.ts");
|
|
803
|
+
console.log("\u2705 Generated api.ts");
|
|
804
|
+
}
|
|
769
805
|
console.log("\n\u2705 SDK generated successfully in shared folder!");
|
|
770
|
-
|
|
806
|
+
if (splitFiles) {
|
|
807
|
+
console.log(`
|
|
808
|
+
Import per-module from shared:`);
|
|
809
|
+
console.log(` import { person } from '@shared/api'`);
|
|
810
|
+
console.log(` import type { PersonOut } from '@shared/types'`);
|
|
811
|
+
} else {
|
|
812
|
+
console.log(`
|
|
771
813
|
Import from shared in your projects:`);
|
|
772
|
-
|
|
773
|
-
|
|
814
|
+
console.log(` import { agents } from '@shared/api'`);
|
|
815
|
+
console.log(` import type { SendMessageRequest } from '@shared/types'`);
|
|
816
|
+
}
|
|
774
817
|
console.log("");
|
|
775
818
|
} catch (error) {
|
|
776
819
|
console.error("\n\u274C Failed to generate SDK:");
|
|
@@ -843,19 +886,22 @@ Lint Commands:
|
|
|
843
886
|
if (subcommand === "generate") {
|
|
844
887
|
const forceWorkspace = args.includes("--workspace") || args.includes("-w");
|
|
845
888
|
const forceProject = args.includes("--project") || args.includes("-p");
|
|
889
|
+
const splitMode = args.includes("--split") || args.includes("-s");
|
|
846
890
|
let workspaceMode = isWorkspace(process.cwd());
|
|
847
891
|
if (forceWorkspace) workspaceMode = true;
|
|
848
892
|
if (forceProject) workspaceMode = false;
|
|
893
|
+
const sdkOptions = { split: splitMode || void 0 };
|
|
849
894
|
if (workspaceMode) {
|
|
850
895
|
console.log("\u2713 Detected workspace mode - will generate for multiple projects");
|
|
851
|
-
await generateSDKForWorkspace();
|
|
896
|
+
await generateSDKForWorkspace(process.cwd(), sdkOptions);
|
|
852
897
|
} else {
|
|
853
|
-
await generateSDK(process.cwd());
|
|
898
|
+
await generateSDK(process.cwd(), sdkOptions);
|
|
854
899
|
}
|
|
855
900
|
} else {
|
|
856
901
|
console.log(`
|
|
857
902
|
SDK Commands:
|
|
858
903
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
904
|
+
bgl sdk generate --split Generate per-module API files
|
|
859
905
|
bgl sdk generate --workspace Force workspace mode
|
|
860
906
|
bgl sdk generate --project Force single project mode
|
|
861
907
|
`);
|
|
@@ -896,10 +942,12 @@ Usage:
|
|
|
896
942
|
Example: bgl build --mode production
|
|
897
943
|
bgl lint init Set up linting (auto-detects workspace)
|
|
898
944
|
bgl sdk generate Generate SDK (auto-detects workspace)
|
|
945
|
+
bgl sdk generate --split Generate per-module API files
|
|
899
946
|
|
|
900
947
|
Options:
|
|
901
948
|
--workspace, -w Force workspace mode
|
|
902
949
|
--project, -p Force single project mode
|
|
950
|
+
--split, -s Split SDK into per-module files
|
|
903
951
|
--mode <env> Set environment (matches bgl.config.ts keys)
|
|
904
952
|
--help, -h Show this help message
|
|
905
953
|
|
package/package.json
CHANGED
package/src/sdk.ts
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { WorkspaceConfig } from './types'
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import { resolve } from 'node:path'
|
|
4
4
|
import process from 'node:process'
|
|
5
5
|
import prompts from 'prompts'
|
|
6
6
|
|
|
7
|
+
export interface GenerateSDKOptions {
|
|
8
|
+
/** Force split mode (per-module files) */
|
|
9
|
+
split?: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
7
12
|
/**
|
|
8
13
|
* Generate SDK from OpenAPI spec
|
|
9
14
|
*/
|
|
10
15
|
export async function generateSDK(
|
|
11
16
|
root: string = process.cwd(),
|
|
17
|
+
options: GenerateSDKOptions = {},
|
|
12
18
|
): Promise<void> {
|
|
13
19
|
console.log('\n🔧 Generating SDK from OpenAPI...\n')
|
|
14
20
|
|
|
@@ -48,9 +54,9 @@ export async function generateSDK(
|
|
|
48
54
|
initial: './src/api',
|
|
49
55
|
},
|
|
50
56
|
{
|
|
51
|
-
type: 'confirm',
|
|
57
|
+
type: options.split !== undefined ? null : 'confirm',
|
|
52
58
|
name: 'splitFiles',
|
|
53
|
-
message: 'Split into
|
|
59
|
+
message: 'Split into per-module files?',
|
|
54
60
|
initial: true,
|
|
55
61
|
},
|
|
56
62
|
])
|
|
@@ -61,17 +67,15 @@ export async function generateSDK(
|
|
|
61
67
|
}
|
|
62
68
|
|
|
63
69
|
const finalUrl = openApiUrl ?? response.openApiUrl
|
|
64
|
-
const { outputDir
|
|
70
|
+
const { outputDir } = response
|
|
71
|
+
const splitFiles = options.split ?? response.splitFiles ?? false
|
|
65
72
|
|
|
66
73
|
console.log(`\n📡 Fetching OpenAPI spec from: ${finalUrl}`)
|
|
67
|
-
console.log(`📁 Output directory: ${outputDir}
|
|
74
|
+
console.log(`📁 Output directory: ${outputDir}`)
|
|
75
|
+
console.log(`🔀 Split mode: ${splitFiles ? 'per-module' : 'monolithic'}\n`)
|
|
68
76
|
|
|
69
77
|
try {
|
|
70
|
-
// Dynamic import of @bagelink/sdk
|
|
71
78
|
const { openAPI } = await import('@bagelink/sdk')
|
|
72
|
-
const { readFileSync } = await import('node:fs')
|
|
73
|
-
const { dirname, join } = await import('node:path')
|
|
74
|
-
const { fileURLToPath } = await import('node:url')
|
|
75
79
|
|
|
76
80
|
const { types, code } = await openAPI(finalUrl, '/api')
|
|
77
81
|
|
|
@@ -80,29 +84,49 @@ export async function generateSDK(
|
|
|
80
84
|
mkdirSync(outputPath, { recursive: true })
|
|
81
85
|
}
|
|
82
86
|
|
|
83
|
-
// Write
|
|
87
|
+
// Write monolithic files first (always needed as intermediate)
|
|
84
88
|
const typesPath = resolve(outputPath, 'types.d.ts')
|
|
85
89
|
writeFileSync(typesPath, types)
|
|
86
|
-
console.log('✅ Generated types.d.ts')
|
|
87
90
|
|
|
88
|
-
// Write API client
|
|
89
91
|
const apiPath = resolve(outputPath, 'api.ts')
|
|
90
92
|
writeFileSync(apiPath, code)
|
|
91
|
-
console.log('✅ Generated api.ts')
|
|
92
|
-
console.log('ℹ️ Stream utilities are imported from @bagelink/sdk')
|
|
93
93
|
|
|
94
94
|
if (splitFiles) {
|
|
95
|
-
console.log('
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
console.log('🔀 Splitting into per-module files...')
|
|
96
|
+
try {
|
|
97
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen')
|
|
98
|
+
await splitClientCode({
|
|
99
|
+
bagelinkDir: outputPath,
|
|
100
|
+
useDirectories: true,
|
|
101
|
+
})
|
|
102
|
+
// Remove monolithic files after successful split
|
|
103
|
+
rmSync(apiPath, { force: true })
|
|
104
|
+
rmSync(typesPath, { force: true })
|
|
105
|
+
console.log('✅ SDK split into per-module files!')
|
|
106
|
+
}
|
|
107
|
+
catch (splitError: unknown) {
|
|
108
|
+
console.warn('⚠️ Split failed, keeping monolithic files:', splitError instanceof Error ? splitError.message : splitError)
|
|
109
|
+
console.log('✅ Generated monolithic api.ts + types.d.ts')
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.log('✅ Generated types.d.ts')
|
|
114
|
+
console.log('✅ Generated api.ts')
|
|
100
115
|
}
|
|
101
116
|
|
|
117
|
+
console.log('ℹ️ Stream utilities are imported from @bagelink/sdk')
|
|
102
118
|
console.log('\n✅ SDK generated successfully!')
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
119
|
+
|
|
120
|
+
if (splitFiles) {
|
|
121
|
+
console.log(`\nImport per-module in your code:`)
|
|
122
|
+
console.log(` import { person } from '${outputDir.replace('./src/', './')}/api'`)
|
|
123
|
+
console.log(` import type { PersonOut } from '${outputDir.replace('./src/', './')}/types'`)
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(`\nImport directly in your code:`)
|
|
127
|
+
console.log(` import { agents } from '${outputDir.replace('./src/', './')}/api'`)
|
|
128
|
+
console.log(` import type { SendMessageRequest } from '${outputDir.replace('./src/', './')}/types.d'`)
|
|
129
|
+
}
|
|
106
130
|
console.log('')
|
|
107
131
|
}
|
|
108
132
|
catch (error: unknown) {
|
|
@@ -124,7 +148,10 @@ export async function generateSDK(
|
|
|
124
148
|
/**
|
|
125
149
|
* Generate SDK for all projects in workspace
|
|
126
150
|
*/
|
|
127
|
-
export async function generateSDKForWorkspace(
|
|
151
|
+
export async function generateSDKForWorkspace(
|
|
152
|
+
root: string = process.cwd(),
|
|
153
|
+
options: GenerateSDKOptions = {},
|
|
154
|
+
): Promise<void> {
|
|
128
155
|
console.log('\n🏢 Generating SDK for workspace...\n')
|
|
129
156
|
|
|
130
157
|
// Try to load config
|
|
@@ -163,12 +190,13 @@ export async function generateSDKForWorkspace(root: string = process.cwd()): Pro
|
|
|
163
190
|
|
|
164
191
|
const finalUrl = openApiUrl ?? response.openApiUrl
|
|
165
192
|
const outputDir = './shared'
|
|
193
|
+
const splitFiles = options.split ?? false
|
|
166
194
|
|
|
167
195
|
console.log(`\n📡 Fetching OpenAPI spec from: ${finalUrl}`)
|
|
168
|
-
console.log(`📁 Output directory: ${outputDir}
|
|
196
|
+
console.log(`📁 Output directory: ${outputDir}`)
|
|
197
|
+
console.log(`🔀 Split mode: ${splitFiles ? 'per-module' : 'monolithic'}\n`)
|
|
169
198
|
|
|
170
199
|
try {
|
|
171
|
-
// Dynamic import of @bagelink/sdk
|
|
172
200
|
const { openAPI } = await import('@bagelink/sdk')
|
|
173
201
|
|
|
174
202
|
const { types, code } = await openAPI(finalUrl, '/api')
|
|
@@ -178,20 +206,47 @@ export async function generateSDKForWorkspace(root: string = process.cwd()): Pro
|
|
|
178
206
|
mkdirSync(outputPath, { recursive: true })
|
|
179
207
|
}
|
|
180
208
|
|
|
181
|
-
// Write
|
|
209
|
+
// Write monolithic files (always needed as intermediate for split)
|
|
182
210
|
const typesPath = resolve(outputPath, 'types.d.ts')
|
|
183
211
|
writeFileSync(typesPath, types)
|
|
184
|
-
console.log('✅ Generated types.d.ts')
|
|
185
212
|
|
|
186
|
-
// Write API client
|
|
187
213
|
const apiPath = resolve(outputPath, 'api.ts')
|
|
188
214
|
writeFileSync(apiPath, code)
|
|
189
|
-
|
|
215
|
+
|
|
216
|
+
if (splitFiles) {
|
|
217
|
+
console.log('🔀 Splitting into per-module files...')
|
|
218
|
+
try {
|
|
219
|
+
const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen')
|
|
220
|
+
await splitClientCode({
|
|
221
|
+
bagelinkDir: outputPath,
|
|
222
|
+
useDirectories: true,
|
|
223
|
+
})
|
|
224
|
+
// Remove monolithic files after successful split
|
|
225
|
+
rmSync(apiPath, { force: true })
|
|
226
|
+
rmSync(typesPath, { force: true })
|
|
227
|
+
console.log('✅ SDK split into per-module files!')
|
|
228
|
+
}
|
|
229
|
+
catch (splitError: unknown) {
|
|
230
|
+
console.warn('⚠️ Split failed, keeping monolithic files:', splitError instanceof Error ? splitError.message : splitError)
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
console.log('✅ Generated types.d.ts')
|
|
235
|
+
console.log('✅ Generated api.ts')
|
|
236
|
+
}
|
|
190
237
|
|
|
191
238
|
console.log('\n✅ SDK generated successfully in shared folder!')
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
239
|
+
|
|
240
|
+
if (splitFiles) {
|
|
241
|
+
console.log(`\nImport per-module from shared:`)
|
|
242
|
+
console.log(` import { person } from '@shared/api'`)
|
|
243
|
+
console.log(` import type { PersonOut } from '@shared/types'`)
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.log(`\nImport from shared in your projects:`)
|
|
247
|
+
console.log(` import { agents } from '@shared/api'`)
|
|
248
|
+
console.log(` import type { SendMessageRequest } from '@shared/types'`)
|
|
249
|
+
}
|
|
195
250
|
console.log('')
|
|
196
251
|
}
|
|
197
252
|
catch (error: unknown) {
|