@bsb/base 9.0.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/LICENSE +665 -0
- package/LICENSE.commercial +32 -0
- package/README.md +263 -0
- package/bsb-plugin.json +62 -0
- package/lib/base/BSBConfig.d.ts +130 -0
- package/lib/base/BSBConfig.js +95 -0
- package/lib/base/BSBConfig.js.map +1 -0
- package/lib/base/BSBEvents.d.ts +207 -0
- package/lib/base/BSBEvents.js +101 -0
- package/lib/base/BSBEvents.js.map +1 -0
- package/lib/base/BSBObservable.d.ts +178 -0
- package/lib/base/BSBObservable.js +91 -0
- package/lib/base/BSBObservable.js.map +1 -0
- package/lib/base/BSBService.d.ts +277 -0
- package/lib/base/BSBService.js +366 -0
- package/lib/base/BSBService.js.map +1 -0
- package/lib/base/BSBServiceClient.d.ts +135 -0
- package/lib/base/BSBServiceClient.js +130 -0
- package/lib/base/BSBServiceClient.js.map +1 -0
- package/lib/base/EventValidator.d.ts +137 -0
- package/lib/base/EventValidator.js +210 -0
- package/lib/base/EventValidator.js.map +1 -0
- package/lib/base/ObservableBackend.d.ts +281 -0
- package/lib/base/ObservableBackend.js +515 -0
- package/lib/base/ObservableBackend.js.map +1 -0
- package/lib/base/PluginConfig.d.ts +196 -0
- package/lib/base/PluginConfig.js +96 -0
- package/lib/base/PluginConfig.js.map +1 -0
- package/lib/base/PluginEvents.d.ts +140 -0
- package/lib/base/PluginEvents.js +268 -0
- package/lib/base/PluginEvents.js.map +1 -0
- package/lib/base/PluginObservable.d.ts +196 -0
- package/lib/base/PluginObservable.js +250 -0
- package/lib/base/PluginObservable.js.map +1 -0
- package/lib/base/ResourceContext.d.ts +70 -0
- package/lib/base/ResourceContext.js +54 -0
- package/lib/base/ResourceContext.js.map +1 -0
- package/lib/base/base.d.ts +264 -0
- package/lib/base/base.js +182 -0
- package/lib/base/base.js.map +1 -0
- package/lib/base/errorMessages.d.ts +56 -0
- package/lib/base/errorMessages.js +70 -0
- package/lib/base/errorMessages.js.map +1 -0
- package/lib/base/factory.d.ts +58 -0
- package/lib/base/factory.js +167 -0
- package/lib/base/factory.js.map +1 -0
- package/lib/base/functions.d.ts +117 -0
- package/lib/base/functions.js +152 -0
- package/lib/base/functions.js.map +1 -0
- package/lib/base/index.d.ts +44 -0
- package/lib/base/index.js +64 -0
- package/lib/base/index.js.map +1 -0
- package/lib/base/logFormatter.d.ts +50 -0
- package/lib/base/logFormatter.js +105 -0
- package/lib/base/logFormatter.js.map +1 -0
- package/lib/base/tools.d.ts +316 -0
- package/lib/base/tools.js +666 -0
- package/lib/base/tools.js.map +1 -0
- package/lib/cli.d.ts +28 -0
- package/lib/cli.js +254 -0
- package/lib/cli.js.map +1 -0
- package/lib/dev.d.ts +27 -0
- package/lib/dev.js +200 -0
- package/lib/dev.js.map +1 -0
- package/lib/index.d.ts +32 -0
- package/lib/index.js +49 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces/events.d.ts +67 -0
- package/lib/interfaces/events.js +44 -0
- package/lib/interfaces/events.js.map +1 -0
- package/lib/interfaces/index.d.ts +38 -0
- package/lib/interfaces/index.js +59 -0
- package/lib/interfaces/index.js.map +1 -0
- package/lib/interfaces/logging.d.ts +106 -0
- package/lib/interfaces/logging.js +39 -0
- package/lib/interfaces/logging.js.map +1 -0
- package/lib/interfaces/metrics.d.ts +365 -0
- package/lib/interfaces/metrics.js +46 -0
- package/lib/interfaces/metrics.js.map +1 -0
- package/lib/interfaces/observable-types.d.ts +63 -0
- package/lib/interfaces/observable-types.js +49 -0
- package/lib/interfaces/observable-types.js.map +1 -0
- package/lib/interfaces/observable.d.ts +297 -0
- package/lib/interfaces/observable.js +29 -0
- package/lib/interfaces/observable.js.map +1 -0
- package/lib/interfaces/options.d.ts +164 -0
- package/lib/interfaces/options.js +56 -0
- package/lib/interfaces/options.js.map +1 -0
- package/lib/interfaces/plugins.d.ts +143 -0
- package/lib/interfaces/plugins.js +45 -0
- package/lib/interfaces/plugins.js.map +1 -0
- package/lib/interfaces/result.d.ts +129 -0
- package/lib/interfaces/result.js +162 -0
- package/lib/interfaces/result.js.map +1 -0
- package/lib/interfaces/schema-events.d.ts +378 -0
- package/lib/interfaces/schema-events.js +247 -0
- package/lib/interfaces/schema-events.js.map +1 -0
- package/lib/interfaces/schema-types.d.ts +407 -0
- package/lib/interfaces/schema-types.js +581 -0
- package/lib/interfaces/schema-types.js.map +1 -0
- package/lib/interfaces/service.d.ts +48 -0
- package/lib/interfaces/service.js +29 -0
- package/lib/interfaces/service.js.map +1 -0
- package/lib/interfaces/tools.d.ts +65 -0
- package/lib/interfaces/tools.js +50 -0
- package/lib/interfaces/tools.js.map +1 -0
- package/lib/plugins/config-default/index.d.ts +59 -0
- package/lib/plugins/config-default/index.js +197 -0
- package/lib/plugins/config-default/index.js.map +1 -0
- package/lib/plugins/config-default/interfaces.d.ts +92 -0
- package/lib/plugins/config-default/interfaces.js +36 -0
- package/lib/plugins/config-default/interfaces.js.map +1 -0
- package/lib/plugins/events-default/events/broadcast.d.ts +36 -0
- package/lib/plugins/events-default/events/broadcast.js +85 -0
- package/lib/plugins/events-default/events/broadcast.js.map +1 -0
- package/lib/plugins/events-default/events/emit.d.ts +38 -0
- package/lib/plugins/events-default/events/emit.js +104 -0
- package/lib/plugins/events-default/events/emit.js.map +1 -0
- package/lib/plugins/events-default/events/emitAndReturn.d.ts +36 -0
- package/lib/plugins/events-default/events/emitAndReturn.js +100 -0
- package/lib/plugins/events-default/events/emitAndReturn.js.map +1 -0
- package/lib/plugins/events-default/events/emitStreamAndReceiveStream.d.ts +38 -0
- package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js +134 -0
- package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js.map +1 -0
- package/lib/plugins/events-default/events/index.d.ts +30 -0
- package/lib/plugins/events-default/events/index.js +38 -0
- package/lib/plugins/events-default/events/index.js.map +1 -0
- package/lib/plugins/events-default/index.d.ts +57 -0
- package/lib/plugins/events-default/index.js +86 -0
- package/lib/plugins/events-default/index.js.map +1 -0
- package/lib/plugins/observable-default/index.d.ts +43 -0
- package/lib/plugins/observable-default/index.js +151 -0
- package/lib/plugins/observable-default/index.js.map +1 -0
- package/lib/schemas/config-default.json +34 -0
- package/lib/schemas/config-default.plugin.json +36 -0
- package/lib/schemas/events-default.json +18 -0
- package/lib/schemas/events-default.plugin.json +17 -0
- package/lib/schemas/observable-default.json +33 -0
- package/lib/schemas/observable-default.plugin.json +24 -0
- package/lib/scripts/bsb-client-cli.d.ts +21 -0
- package/lib/scripts/bsb-client-cli.js +701 -0
- package/lib/scripts/bsb-client-cli.js.map +1 -0
- package/lib/scripts/bsb-plugin-cli.d.ts +15 -0
- package/lib/scripts/bsb-plugin-cli.js +547 -0
- package/lib/scripts/bsb-plugin-cli.js.map +1 -0
- package/lib/scripts/export-schemas.d.ts +17 -0
- package/lib/scripts/export-schemas.js +205 -0
- package/lib/scripts/export-schemas.js.map +1 -0
- package/lib/scripts/extract-schemas-from-source.d.ts +23 -0
- package/lib/scripts/extract-schemas-from-source.js +604 -0
- package/lib/scripts/extract-schemas-from-source.js.map +1 -0
- package/lib/scripts/generate-client-types.d.ts +22 -0
- package/lib/scripts/generate-client-types.js +537 -0
- package/lib/scripts/generate-client-types.js.map +1 -0
- package/lib/scripts/generate-plugin-json.d.ts +17 -0
- package/lib/scripts/generate-plugin-json.js +219 -0
- package/lib/scripts/generate-plugin-json.js.map +1 -0
- package/lib/serviceBase/config.d.ts +83 -0
- package/lib/serviceBase/config.js +236 -0
- package/lib/serviceBase/config.js.map +1 -0
- package/lib/serviceBase/events.d.ts +91 -0
- package/lib/serviceBase/events.js +519 -0
- package/lib/serviceBase/events.js.map +1 -0
- package/lib/serviceBase/index.d.ts +33 -0
- package/lib/serviceBase/index.js +50 -0
- package/lib/serviceBase/index.js.map +1 -0
- package/lib/serviceBase/observable.d.ts +249 -0
- package/lib/serviceBase/observable.js +551 -0
- package/lib/serviceBase/observable.js.map +1 -0
- package/lib/serviceBase/plugins.d.ts +48 -0
- package/lib/serviceBase/plugins.js +184 -0
- package/lib/serviceBase/plugins.js.map +1 -0
- package/lib/serviceBase/serviceBase.d.ts +228 -0
- package/lib/serviceBase/serviceBase.js +420 -0
- package/lib/serviceBase/serviceBase.js.map +1 -0
- package/lib/serviceBase/services.d.ts +63 -0
- package/lib/serviceBase/services.js +346 -0
- package/lib/serviceBase/services.js.map +1 -0
- package/lib/tests.d.ts +27 -0
- package/lib/tests.js +44 -0
- package/lib/tests.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BSB Schema Extraction from TypeScript Source
|
|
4
|
+
*
|
|
5
|
+
* Extracts event schemas directly from plugin TypeScript source files
|
|
6
|
+
* without requiring compilation. This breaks the circular dependency:
|
|
7
|
+
* build needs schemas → schemas need compiled JS → JS needs build
|
|
8
|
+
*
|
|
9
|
+
* Approach:
|
|
10
|
+
* 1. Read plugin index.ts, truncate at `export class Plugin`
|
|
11
|
+
* 2. Rewrite imports to avoid pulling in runtime deps (BSBService, etc.)
|
|
12
|
+
* 3. Keep local relative imports (./types, ./utils) — they may define schemas
|
|
13
|
+
* 4. Append footer that calls exportEventSchemas() and outputs JSON
|
|
14
|
+
* 5. Execute temp file with ts-node, capture JSON output
|
|
15
|
+
* 6. Write schema JSON to src/.bsb/schemas/
|
|
16
|
+
*
|
|
17
|
+
* The temp file is placed in the plugin's own directory so that relative
|
|
18
|
+
* imports (./types, ./storage, etc.) resolve correctly.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.extractSchemasFromSource = main;
|
|
22
|
+
const fs = require("fs");
|
|
23
|
+
const path = require("path");
|
|
24
|
+
const CWD = process.cwd();
|
|
25
|
+
// Schema-relevant identifiers from BSB
|
|
26
|
+
const SCHEMA_IDENTIFIERS = new Set([
|
|
27
|
+
'createConfigSchema',
|
|
28
|
+
'createEventSchemas',
|
|
29
|
+
'createReturnableEvent',
|
|
30
|
+
'createFireAndForgetEvent',
|
|
31
|
+
'createBroadcastEvent',
|
|
32
|
+
'bsb',
|
|
33
|
+
'optional',
|
|
34
|
+
'nullable',
|
|
35
|
+
'InferBSBType',
|
|
36
|
+
]);
|
|
37
|
+
const OBSERVABLE_METHODS = {
|
|
38
|
+
logging: ['debug', 'info', 'warn', 'error'],
|
|
39
|
+
metrics: ['createCounter', 'createGauge', 'createHistogram', 'incrementCounter', 'setGauge', 'observeHistogram'],
|
|
40
|
+
tracing: ['spanStart', 'spanEnd', 'spanError'],
|
|
41
|
+
};
|
|
42
|
+
const EVENTS_METHODS = [
|
|
43
|
+
'onBroadcast',
|
|
44
|
+
'emitBroadcast',
|
|
45
|
+
'onEvent',
|
|
46
|
+
'emitEvent',
|
|
47
|
+
'onReturnableEvent',
|
|
48
|
+
'emitEventAndReturn',
|
|
49
|
+
'receiveStream',
|
|
50
|
+
'sendStream',
|
|
51
|
+
];
|
|
52
|
+
const CONFIG_METHODS = [
|
|
53
|
+
'getObservablePlugins',
|
|
54
|
+
'getEventsPlugins',
|
|
55
|
+
'getServicePlugins',
|
|
56
|
+
'getServicePluginDefinition',
|
|
57
|
+
'getPluginConfig',
|
|
58
|
+
];
|
|
59
|
+
function resolveTsNodeRegister() {
|
|
60
|
+
const searchRoots = [
|
|
61
|
+
CWD,
|
|
62
|
+
__dirname,
|
|
63
|
+
path.join(CWD, 'node_modules', '@bsb', 'base'),
|
|
64
|
+
path.join(__dirname, '..', '..'),
|
|
65
|
+
];
|
|
66
|
+
for (const root of searchRoots) {
|
|
67
|
+
try {
|
|
68
|
+
return require.resolve('ts-node/register/transpile-only', { paths: [root] });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Try next location
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const root of searchRoots) {
|
|
75
|
+
try {
|
|
76
|
+
return require.resolve('ts-node/register', { paths: [root] });
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Try next location
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Detect whether this is a self-build (@bsb/base project) or an external plugin.
|
|
86
|
+
*/
|
|
87
|
+
function detectProjectType() {
|
|
88
|
+
const packageJsonPath = path.join(CWD, 'package.json');
|
|
89
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
90
|
+
try {
|
|
91
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
92
|
+
if (pkg.name === '@bsb/base') {
|
|
93
|
+
return 'self';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// ignore
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return 'external';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Discover plugin source files from src/plugins/<plugin>/index.ts.
|
|
104
|
+
*/
|
|
105
|
+
function discoverPlugins() {
|
|
106
|
+
const pluginsDir = path.join(CWD, 'src', 'plugins');
|
|
107
|
+
const results = [];
|
|
108
|
+
if (!fs.existsSync(pluginsDir)) {
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
const dirs = fs.readdirSync(pluginsDir, { withFileTypes: true })
|
|
112
|
+
.filter(d => d.isDirectory())
|
|
113
|
+
.map(d => d.name);
|
|
114
|
+
for (const dir of dirs) {
|
|
115
|
+
const indexPath = path.join(pluginsDir, dir, 'index.ts');
|
|
116
|
+
if (!fs.existsSync(indexPath))
|
|
117
|
+
continue;
|
|
118
|
+
results.push({ srcPath: indexPath, dirName: dir });
|
|
119
|
+
}
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
function inferPluginType(pluginDirName, sourceContent) {
|
|
123
|
+
if (pluginDirName.startsWith('service-'))
|
|
124
|
+
return 'service';
|
|
125
|
+
if (pluginDirName.startsWith('observable-'))
|
|
126
|
+
return 'observable';
|
|
127
|
+
if (pluginDirName.startsWith('events-'))
|
|
128
|
+
return 'events';
|
|
129
|
+
if (pluginDirName.startsWith('config-'))
|
|
130
|
+
return 'config';
|
|
131
|
+
if (/extends\s+BSBService\b/.test(sourceContent))
|
|
132
|
+
return 'service';
|
|
133
|
+
if (/extends\s+BSBObservable\b/.test(sourceContent))
|
|
134
|
+
return 'observable';
|
|
135
|
+
if (/extends\s+BSBEvents\b/.test(sourceContent))
|
|
136
|
+
return 'events';
|
|
137
|
+
if (/extends\s+BSBConfig\b/.test(sourceContent))
|
|
138
|
+
return 'config';
|
|
139
|
+
return 'unknown';
|
|
140
|
+
}
|
|
141
|
+
function extractPluginClassBody(sourceContent) {
|
|
142
|
+
const classMatch = sourceContent.match(/export\s+(?:default\s+)?class\s+Plugin\b/);
|
|
143
|
+
if (!classMatch || classMatch.index === undefined)
|
|
144
|
+
return '';
|
|
145
|
+
const classStart = classMatch.index;
|
|
146
|
+
const openBrace = sourceContent.indexOf('{', classStart);
|
|
147
|
+
if (openBrace < 0)
|
|
148
|
+
return '';
|
|
149
|
+
let depth = 0;
|
|
150
|
+
for (let i = openBrace; i < sourceContent.length; i++) {
|
|
151
|
+
const ch = sourceContent[i];
|
|
152
|
+
if (ch === '{')
|
|
153
|
+
depth++;
|
|
154
|
+
if (ch === '}') {
|
|
155
|
+
depth--;
|
|
156
|
+
if (depth === 0) {
|
|
157
|
+
return sourceContent.slice(openBrace + 1, i);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return '';
|
|
162
|
+
}
|
|
163
|
+
function classHasMethod(classBody, methodName) {
|
|
164
|
+
const escaped = methodName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
165
|
+
const methodRegex = new RegExp(`\\b(?:public\\s+|protected\\s+|private\\s+|static\\s+|override\\s+|async\\s+)*(?:readonly\\s+)?${escaped}\\s*\\(`);
|
|
166
|
+
return methodRegex.test(classBody);
|
|
167
|
+
}
|
|
168
|
+
function buildCapabilities(pluginType, classBody) {
|
|
169
|
+
if (pluginType === 'observable') {
|
|
170
|
+
const logging = Object.fromEntries(OBSERVABLE_METHODS.logging.map((name) => [name, classHasMethod(classBody, name)]));
|
|
171
|
+
const metrics = Object.fromEntries(OBSERVABLE_METHODS.metrics.map((name) => [name, classHasMethod(classBody, name)]));
|
|
172
|
+
const tracing = Object.fromEntries(OBSERVABLE_METHODS.tracing.map((name) => [name, classHasMethod(classBody, name)]));
|
|
173
|
+
return { logging, metrics, tracing };
|
|
174
|
+
}
|
|
175
|
+
if (pluginType === 'events') {
|
|
176
|
+
return {
|
|
177
|
+
eventsApi: Object.fromEntries(EVENTS_METHODS.map((name) => [name, classHasMethod(classBody, name)])),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
if (pluginType === 'config') {
|
|
181
|
+
return {
|
|
182
|
+
configApi: Object.fromEntries(CONFIG_METHODS.map((name) => [name, classHasMethod(classBody, name)])),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Parse an import statement to extract identifiers and source path.
|
|
189
|
+
* Handles named, default, namespace (import *), type-only, and side-effect imports.
|
|
190
|
+
*/
|
|
191
|
+
function parseImportLine(line) {
|
|
192
|
+
const trimmed = line.trim();
|
|
193
|
+
// Type-only: import type { A } from "path"
|
|
194
|
+
const typeMatch = trimmed.match(/^import\s+type\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/);
|
|
195
|
+
if (typeMatch) {
|
|
196
|
+
const identifiers = typeMatch[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
197
|
+
return { identifiers, source: typeMatch[2], isTypeOnly: true, isNamespace: false, raw: trimmed };
|
|
198
|
+
}
|
|
199
|
+
// Namespace: import * as X from "path"
|
|
200
|
+
const nsMatch = trimmed.match(/^import\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]/);
|
|
201
|
+
if (nsMatch) {
|
|
202
|
+
return { identifiers: [nsMatch[1]], source: nsMatch[2], isTypeOnly: false, isNamespace: true, raw: trimmed };
|
|
203
|
+
}
|
|
204
|
+
// Named: import { A, B } from "path"
|
|
205
|
+
const namedMatch = trimmed.match(/^import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/);
|
|
206
|
+
if (namedMatch) {
|
|
207
|
+
const identifiers = namedMatch[1].split(',').map(s => {
|
|
208
|
+
const parts = s.trim().split(/\s+as\s+/);
|
|
209
|
+
return parts[parts.length - 1].trim();
|
|
210
|
+
}).filter(Boolean);
|
|
211
|
+
return { identifiers, source: namedMatch[2], isTypeOnly: false, isNamespace: false, raw: trimmed };
|
|
212
|
+
}
|
|
213
|
+
// Default: import X from "path"
|
|
214
|
+
const defaultMatch = trimmed.match(/^import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/);
|
|
215
|
+
if (defaultMatch) {
|
|
216
|
+
return { identifiers: [defaultMatch[1]], source: defaultMatch[2], isTypeOnly: false, isNamespace: false, raw: trimmed };
|
|
217
|
+
}
|
|
218
|
+
// Side-effect: import "path"
|
|
219
|
+
const sideEffectMatch = trimmed.match(/^import\s+['"]([^'"]+)['"]/);
|
|
220
|
+
if (sideEffectMatch) {
|
|
221
|
+
return { identifiers: [], source: sideEffectMatch[1], isTypeOnly: false, isNamespace: false, raw: trimmed };
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Rewrite a BSB import (from ../../base or @bsb/base) to targeted sub-module imports.
|
|
227
|
+
* For self-build: rewrites to specific sub-modules (../../base/PluginConfig, ../../interfaces/schema-types).
|
|
228
|
+
* For external: keeps @bsb/base but filters to only schema-relevant identifiers.
|
|
229
|
+
*/
|
|
230
|
+
function rewriteBsbImport(identifiers, projectType) {
|
|
231
|
+
const schemaIds = identifiers.filter(id => SCHEMA_IDENTIFIERS.has(id));
|
|
232
|
+
if (schemaIds.length === 0)
|
|
233
|
+
return [];
|
|
234
|
+
if (projectType === 'external') {
|
|
235
|
+
// External plugins: keep importing from @bsb/base, just filter identifiers
|
|
236
|
+
return [`import { ${schemaIds.join(', ')} } from '@bsb/base';`];
|
|
237
|
+
}
|
|
238
|
+
// Self-build: split into targeted sub-module imports
|
|
239
|
+
const byModule = {};
|
|
240
|
+
for (const id of schemaIds) {
|
|
241
|
+
let target;
|
|
242
|
+
if (id === 'createConfigSchema') {
|
|
243
|
+
target = '../../base/PluginConfig';
|
|
244
|
+
}
|
|
245
|
+
else if (['createEventSchemas', 'createReturnableEvent', 'createFireAndForgetEvent', 'createBroadcastEvent'].includes(id)) {
|
|
246
|
+
target = '../../interfaces/schema-events';
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
target = '../../interfaces/schema-types';
|
|
250
|
+
}
|
|
251
|
+
if (!byModule[target])
|
|
252
|
+
byModule[target] = [];
|
|
253
|
+
byModule[target].push(id);
|
|
254
|
+
}
|
|
255
|
+
const lines = [];
|
|
256
|
+
for (const [mod, ids] of Object.entries(byModule)) {
|
|
257
|
+
lines.push(`import { ${ids.join(', ')} } from "${mod}";`);
|
|
258
|
+
}
|
|
259
|
+
return lines;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Normalize multiline imports into single lines.
|
|
263
|
+
* Joins imports that span multiple lines (e.g., import {\n A,\n B,\n} from 'x')
|
|
264
|
+
* into a single line so that parseImportLine() can handle them.
|
|
265
|
+
*/
|
|
266
|
+
function normalizeMultilineImports(lines) {
|
|
267
|
+
const result = [];
|
|
268
|
+
let buffer = null;
|
|
269
|
+
for (const line of lines) {
|
|
270
|
+
const trimmed = line.trim();
|
|
271
|
+
if (buffer !== null) {
|
|
272
|
+
// We're inside a multiline import — keep buffering
|
|
273
|
+
buffer.push(trimmed);
|
|
274
|
+
// Check if this line closes the import (has } and from)
|
|
275
|
+
if (trimmed.includes('}') && /from\s+['"]/.test(trimmed)) {
|
|
276
|
+
// Join all buffered lines into one and emit
|
|
277
|
+
result.push(buffer.join(' '));
|
|
278
|
+
buffer = null;
|
|
279
|
+
}
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Detect start of a multiline import: starts with 'import' has '{' but no '}'
|
|
283
|
+
if (/^\s*import\s/.test(line) && trimmed.includes('{') && !trimmed.includes('}')) {
|
|
284
|
+
buffer = [trimmed];
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
// Regular line — pass through
|
|
288
|
+
result.push(line);
|
|
289
|
+
}
|
|
290
|
+
// If we ended while still buffering (malformed import), flush as-is
|
|
291
|
+
if (buffer !== null) {
|
|
292
|
+
for (const l of buffer) {
|
|
293
|
+
result.push(l);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Check if an import source is a local relative import (./types, ./storage, etc.)
|
|
300
|
+
*/
|
|
301
|
+
function isLocalRelativeImport(source) {
|
|
302
|
+
return source.startsWith('./') || source.startsWith('../');
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if an import source is a BSB base import.
|
|
306
|
+
*/
|
|
307
|
+
function isBsbBaseImport(source) {
|
|
308
|
+
return (source === '@bsb/base' ||
|
|
309
|
+
source === '../../base' ||
|
|
310
|
+
source === '../../base/index' ||
|
|
311
|
+
source.startsWith('@bsb/base/'));
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Check if a relative import is schema-related (schema-events, schema-types).
|
|
315
|
+
*/
|
|
316
|
+
function isSchemaModuleImport(source) {
|
|
317
|
+
return source.includes('schema-events') || source.includes('schema-types');
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Extract schema-relevant source code from a plugin's index.ts.
|
|
321
|
+
* Truncates at the class declaration and rewrites imports.
|
|
322
|
+
*/
|
|
323
|
+
function extractSchemaSource(sourceContent, pluginDirName, projectType) {
|
|
324
|
+
// Normalize multiline imports into single lines before processing
|
|
325
|
+
const lines = normalizeMultilineImports(sourceContent.split('\n'));
|
|
326
|
+
// Find the Plugin class declaration line (not helper classes like Config)
|
|
327
|
+
const classLineIndex = lines.findIndex(line => /^\s*export\s+(default\s+)?class\s+Plugin\b/.test(line));
|
|
328
|
+
// Take everything before the class
|
|
329
|
+
const relevantLines = classLineIndex >= 0
|
|
330
|
+
? lines.slice(0, classLineIndex)
|
|
331
|
+
: lines;
|
|
332
|
+
// Two-pass approach:
|
|
333
|
+
// Pass 1: separate imports from body lines
|
|
334
|
+
// Pass 2: filter local ./ imports by checking if their identifiers are used in the body
|
|
335
|
+
const resolvedImports = [];
|
|
336
|
+
const pendingLocalImports = [];
|
|
337
|
+
const bodyLines = [];
|
|
338
|
+
for (const line of relevantLines) {
|
|
339
|
+
const trimmed = line.trim();
|
|
340
|
+
// Skip require() calls for non-schema modules
|
|
341
|
+
if (/\brequire\s*\(/.test(trimmed)) {
|
|
342
|
+
if (/schema|zod/.test(trimmed)) {
|
|
343
|
+
bodyLines.push(line);
|
|
344
|
+
}
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
// Handle import lines
|
|
348
|
+
if (trimmed.startsWith('import ')) {
|
|
349
|
+
const parsed = parseImportLine(trimmed);
|
|
350
|
+
if (!parsed) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
// Type-only imports: drop them (not needed for runtime extraction)
|
|
354
|
+
if (parsed.isTypeOnly) {
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
// Keep zod imports as-is
|
|
358
|
+
if (parsed.source === 'zod') {
|
|
359
|
+
resolvedImports.push(line);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
// Keep schema module imports as-is
|
|
363
|
+
if (isSchemaModuleImport(parsed.source)) {
|
|
364
|
+
resolvedImports.push(line);
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
// Rewrite BSB base imports (../../base or @bsb/base)
|
|
368
|
+
if (isBsbBaseImport(parsed.source)) {
|
|
369
|
+
const rewritten = rewriteBsbImport(parsed.identifiers, projectType);
|
|
370
|
+
for (const l of rewritten) {
|
|
371
|
+
resolvedImports.push(l);
|
|
372
|
+
}
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
// Local relative imports (./types, ./storage, etc.)
|
|
376
|
+
// Defer decision — we'll check if identifiers are used in body text
|
|
377
|
+
if (isLocalRelativeImport(parsed.source)) {
|
|
378
|
+
// Skip imports from parent plugin dirs (../service-*) — cross-plugin deps
|
|
379
|
+
if (parsed.source.startsWith('../')) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
// Queue for usage check
|
|
383
|
+
pendingLocalImports.push({ line, identifiers: parsed.identifiers });
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
// Drop everything else (node:*, other packages, etc.)
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
// Keep all non-import lines (const declarations, comments, etc.)
|
|
390
|
+
bodyLines.push(line);
|
|
391
|
+
}
|
|
392
|
+
// Pass 2: filter local imports — only keep those whose identifiers are referenced in body
|
|
393
|
+
const bodyText = bodyLines.join('\n');
|
|
394
|
+
for (const pending of pendingLocalImports) {
|
|
395
|
+
const isUsed = pending.identifiers.some(id => {
|
|
396
|
+
// Use word boundary check to avoid false positives
|
|
397
|
+
const regex = new RegExp(`\\b${id}\\b`);
|
|
398
|
+
return regex.test(bodyText);
|
|
399
|
+
});
|
|
400
|
+
if (isUsed) {
|
|
401
|
+
resolvedImports.push(pending.line);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// Build final output: imports first, then body
|
|
405
|
+
const outputLines = [...resolvedImports, ...bodyLines];
|
|
406
|
+
// Append the extraction footer
|
|
407
|
+
const exportEventSchemasImport = projectType === 'self'
|
|
408
|
+
? `import { exportEventSchemas } from "../../interfaces/schema-events";`
|
|
409
|
+
: `import { exportEventSchemas } from '@bsb/base';`;
|
|
410
|
+
outputLines.push('');
|
|
411
|
+
outputLines.push('// --- Schema extraction footer (auto-generated) ---');
|
|
412
|
+
outputLines.push(exportEventSchemasImport);
|
|
413
|
+
outputLines.push('');
|
|
414
|
+
outputLines.push(`let _Config: any;`);
|
|
415
|
+
outputLines.push(`let _EventSchemas: any;`);
|
|
416
|
+
outputLines.push(`try { _Config = eval('Config'); } catch { _Config = undefined; }`);
|
|
417
|
+
outputLines.push(`try { _EventSchemas = eval('EventSchemas'); } catch { _EventSchemas = undefined; }`);
|
|
418
|
+
outputLines.push(`if (!_Config && (module as any)?.exports?.Config) { _Config = (module as any).exports.Config; }`);
|
|
419
|
+
outputLines.push(`if (!_EventSchemas && (module as any)?.exports?.EventSchemas) { _EventSchemas = (module as any).exports.EventSchemas; }`);
|
|
420
|
+
outputLines.push('');
|
|
421
|
+
outputLines.push(`const _pluginName = _Config && _Config.metadata`);
|
|
422
|
+
outputLines.push(` ? (_Config as any).metadata.name`);
|
|
423
|
+
outputLines.push(` : ${JSON.stringify(pluginDirName)};`);
|
|
424
|
+
outputLines.push(`const _pluginVersion = _Config && _Config.metadata && _Config.metadata.version`);
|
|
425
|
+
outputLines.push(` ? (_Config as any).metadata.version`);
|
|
426
|
+
outputLines.push(` : "1.0.0";`);
|
|
427
|
+
outputLines.push('');
|
|
428
|
+
outputLines.push('const _schemaResult = (_EventSchemas)');
|
|
429
|
+
outputLines.push(' ? exportEventSchemas(_pluginName, _pluginVersion, _EventSchemas as any)');
|
|
430
|
+
outputLines.push(' : { pluginName: _pluginName, version: _pluginVersion, events: {} };');
|
|
431
|
+
outputLines.push('');
|
|
432
|
+
outputLines.push('// Extract config schema as JSON Schema if Config has a Zod validationSchema');
|
|
433
|
+
outputLines.push('try {');
|
|
434
|
+
outputLines.push(' if (_Config) {');
|
|
435
|
+
outputLines.push(' const _configInstance = new (_Config as any)("", "", "", "");');
|
|
436
|
+
outputLines.push(' if (_configInstance.validationSchema && typeof _configInstance.validationSchema === "object") {');
|
|
437
|
+
outputLines.push(' const _zod = require("zod");');
|
|
438
|
+
outputLines.push(' const _toJSONSchema = _zod.toJSONSchema || (_zod.z && _zod.z.toJSONSchema);');
|
|
439
|
+
outputLines.push(' if (typeof _toJSONSchema === "function") {');
|
|
440
|
+
outputLines.push(' (_schemaResult as any).configSchema = _toJSONSchema(_configInstance.validationSchema);');
|
|
441
|
+
outputLines.push(' }');
|
|
442
|
+
outputLines.push(' }');
|
|
443
|
+
outputLines.push(' }');
|
|
444
|
+
outputLines.push('} catch (_e) {');
|
|
445
|
+
outputLines.push(' // Config schema extraction is optional - skip on error');
|
|
446
|
+
outputLines.push('}');
|
|
447
|
+
outputLines.push('');
|
|
448
|
+
outputLines.push('(module as any).exports.__BSB_SCHEMA_RESULT = _schemaResult;');
|
|
449
|
+
outputLines.push('');
|
|
450
|
+
return outputLines.join('\n');
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Detect plugin dependencies by scanning for .bsb/clients/ imports.
|
|
454
|
+
* Returns structured dependency objects with org-qualified ID and version
|
|
455
|
+
* read from the dependency's schema JSON.
|
|
456
|
+
*/
|
|
457
|
+
function detectClientDependencies(sourceContent) {
|
|
458
|
+
const lines = normalizeMultilineImports(sourceContent.split('\n'));
|
|
459
|
+
const pluginIds = new Set();
|
|
460
|
+
for (const line of lines) {
|
|
461
|
+
const parsed = parseImportLine(line.trim());
|
|
462
|
+
if (!parsed)
|
|
463
|
+
continue;
|
|
464
|
+
// Match any relative import ending in .bsb/clients/{pluginId}
|
|
465
|
+
const match = parsed.source.match(/\.bsb\/clients\/([^/]+)$/);
|
|
466
|
+
if (match) {
|
|
467
|
+
pluginIds.add(match[1]);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
if (pluginIds.size === 0)
|
|
471
|
+
return [];
|
|
472
|
+
// Read orgId from package.json (bsb.orgId field)
|
|
473
|
+
const pkgJsonPath = path.join(CWD, 'package.json');
|
|
474
|
+
let orgId = '_';
|
|
475
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
476
|
+
try {
|
|
477
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
478
|
+
orgId = pkg.bsb?.orgId || '_';
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
// use default
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// Resolve each plugin ID to a structured dependency
|
|
485
|
+
const schemasDir = path.join(CWD, 'src', '.bsb', 'schemas');
|
|
486
|
+
const deps = [];
|
|
487
|
+
for (const pluginId of pluginIds) {
|
|
488
|
+
// Read the dependency's schema to get its version
|
|
489
|
+
let version = '1.0.0';
|
|
490
|
+
const schemaPath = path.join(schemasDir, `${pluginId}.json`);
|
|
491
|
+
if (fs.existsSync(schemaPath)) {
|
|
492
|
+
try {
|
|
493
|
+
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
|
|
494
|
+
version = schema.version || '1.0.0';
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
// use fallback
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
deps.push({ id: `${orgId}/${pluginId}`, version });
|
|
501
|
+
}
|
|
502
|
+
return deps;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Main extraction function.
|
|
506
|
+
*/
|
|
507
|
+
async function main() {
|
|
508
|
+
const projectType = detectProjectType();
|
|
509
|
+
const plugins = discoverPlugins();
|
|
510
|
+
const tsNodeRegisterPath = resolveTsNodeRegister();
|
|
511
|
+
if (plugins.length === 0) {
|
|
512
|
+
// eslint-disable-next-line no-console
|
|
513
|
+
console.log('No plugins found in src/plugins.');
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if (!tsNodeRegisterPath) {
|
|
517
|
+
// eslint-disable-next-line no-console
|
|
518
|
+
console.log('Skipping schema extraction: ts-node/register is not available in this project.');
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
// Create output directory
|
|
522
|
+
const schemasDir = path.join(CWD, 'src', '.bsb', 'schemas');
|
|
523
|
+
if (!fs.existsSync(schemasDir)) {
|
|
524
|
+
fs.mkdirSync(schemasDir, { recursive: true });
|
|
525
|
+
}
|
|
526
|
+
// Register ts-node once so temp TypeScript files can be required in-process.
|
|
527
|
+
// This avoids spawning child processes (more reliable on restricted Windows environments).
|
|
528
|
+
require(tsNodeRegisterPath);
|
|
529
|
+
let extracted = 0;
|
|
530
|
+
let errors = 0;
|
|
531
|
+
// Track temp files for cleanup
|
|
532
|
+
const tempFiles = [];
|
|
533
|
+
for (const plugin of plugins) {
|
|
534
|
+
try {
|
|
535
|
+
const sourceContent = fs.readFileSync(plugin.srcPath, 'utf-8');
|
|
536
|
+
const pluginType = inferPluginType(plugin.dirName, sourceContent);
|
|
537
|
+
const classBody = extractPluginClassBody(sourceContent);
|
|
538
|
+
const capabilities = buildCapabilities(pluginType, classBody);
|
|
539
|
+
const tempSource = extractSchemaSource(sourceContent, plugin.dirName, projectType);
|
|
540
|
+
// Place temp file in the plugin's directory so relative imports resolve
|
|
541
|
+
const pluginDir = path.dirname(plugin.srcPath);
|
|
542
|
+
const tempFile = path.join(pluginDir, `_bsb_extract_temp_.ts`);
|
|
543
|
+
tempFiles.push(tempFile);
|
|
544
|
+
fs.writeFileSync(tempFile, tempSource, 'utf-8');
|
|
545
|
+
// Execute extraction in-process via ts-node/register
|
|
546
|
+
delete require.cache[require.resolve(tempFile)];
|
|
547
|
+
const loaded = require(tempFile);
|
|
548
|
+
if (!loaded || !loaded.__BSB_SCHEMA_RESULT || typeof loaded.__BSB_SCHEMA_RESULT !== 'object') {
|
|
549
|
+
throw new Error('Schema extraction did not return a result');
|
|
550
|
+
}
|
|
551
|
+
// Parse and write the schema JSON
|
|
552
|
+
const schemaExport = loaded.__BSB_SCHEMA_RESULT;
|
|
553
|
+
schemaExport.pluginType = pluginType;
|
|
554
|
+
if (capabilities) {
|
|
555
|
+
schemaExport.capabilities = capabilities;
|
|
556
|
+
}
|
|
557
|
+
// Auto-detect dependencies from .bsb/clients/ imports
|
|
558
|
+
const deps = detectClientDependencies(sourceContent);
|
|
559
|
+
if (deps.length > 0) {
|
|
560
|
+
schemaExport.dependencies = deps;
|
|
561
|
+
}
|
|
562
|
+
const schemaFile = path.join(schemasDir, `${plugin.dirName}.json`);
|
|
563
|
+
fs.writeFileSync(schemaFile, JSON.stringify(schemaExport, null, 2), 'utf-8');
|
|
564
|
+
// eslint-disable-next-line no-console
|
|
565
|
+
console.log(` Extracted schema for ${plugin.dirName} (v${schemaExport.version})`);
|
|
566
|
+
extracted++;
|
|
567
|
+
}
|
|
568
|
+
catch (err) {
|
|
569
|
+
errors++;
|
|
570
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
571
|
+
// eslint-disable-next-line no-console
|
|
572
|
+
console.error(` Error extracting schema for ${plugin.dirName}: ${message}`);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
// Cleanup temp files (opt-out for debugging)
|
|
576
|
+
if (process.env.BSB_KEEP_EXTRACT_TEMP !== '1') {
|
|
577
|
+
for (const tempFile of tempFiles) {
|
|
578
|
+
try {
|
|
579
|
+
if (fs.existsSync(tempFile)) {
|
|
580
|
+
fs.unlinkSync(tempFile);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
catch {
|
|
584
|
+
// Non-fatal
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// eslint-disable-next-line no-console
|
|
589
|
+
console.log(`\nSchema extraction complete: ${extracted} extracted, ${errors} errors`);
|
|
590
|
+
// eslint-disable-next-line no-console
|
|
591
|
+
console.log(`Schemas written to: ${schemasDir}`);
|
|
592
|
+
if (errors > 0) {
|
|
593
|
+
process.exit(1);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// Run if called directly
|
|
597
|
+
if (require.main === module) {
|
|
598
|
+
main().catch(error => {
|
|
599
|
+
// eslint-disable-next-line no-console
|
|
600
|
+
console.error('Fatal error during schema extraction:', error);
|
|
601
|
+
process.exit(1);
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=extract-schemas-from-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-schemas-from-source.js","sourceRoot":"","sources":["../../src/scripts/extract-schemas-from-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BSB Virtual Client Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript virtual client files from exported schema JSON files.
|
|
5
|
+
* These client files provide typed wrappers around the event bus, enabling
|
|
6
|
+
* type-safe cross-plugin communication without direct source imports.
|
|
7
|
+
*
|
|
8
|
+
* Schema sources:
|
|
9
|
+
* 1. Local build: lib/schemas/*.json (from this project's export-schemas)
|
|
10
|
+
* 2. Remote install: src/.bsb/schemas/*.json (from bsb client install)
|
|
11
|
+
*
|
|
12
|
+
* Output:
|
|
13
|
+
* Writes TypeScript files to src/.bsb/clients/{plugin-name}.ts
|
|
14
|
+
*
|
|
15
|
+
* Generated clients use bsb.* builders to define BSBType schemas (same as
|
|
16
|
+
* real plugins), then export inferred TypeScript types from those schemas.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Main generation function.
|
|
20
|
+
*/
|
|
21
|
+
declare function main(): Promise<void>;
|
|
22
|
+
export { main as generateClientTypes };
|