@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.
Files changed (182) hide show
  1. package/LICENSE +665 -0
  2. package/LICENSE.commercial +32 -0
  3. package/README.md +263 -0
  4. package/bsb-plugin.json +62 -0
  5. package/lib/base/BSBConfig.d.ts +130 -0
  6. package/lib/base/BSBConfig.js +95 -0
  7. package/lib/base/BSBConfig.js.map +1 -0
  8. package/lib/base/BSBEvents.d.ts +207 -0
  9. package/lib/base/BSBEvents.js +101 -0
  10. package/lib/base/BSBEvents.js.map +1 -0
  11. package/lib/base/BSBObservable.d.ts +178 -0
  12. package/lib/base/BSBObservable.js +91 -0
  13. package/lib/base/BSBObservable.js.map +1 -0
  14. package/lib/base/BSBService.d.ts +277 -0
  15. package/lib/base/BSBService.js +366 -0
  16. package/lib/base/BSBService.js.map +1 -0
  17. package/lib/base/BSBServiceClient.d.ts +135 -0
  18. package/lib/base/BSBServiceClient.js +130 -0
  19. package/lib/base/BSBServiceClient.js.map +1 -0
  20. package/lib/base/EventValidator.d.ts +137 -0
  21. package/lib/base/EventValidator.js +210 -0
  22. package/lib/base/EventValidator.js.map +1 -0
  23. package/lib/base/ObservableBackend.d.ts +281 -0
  24. package/lib/base/ObservableBackend.js +515 -0
  25. package/lib/base/ObservableBackend.js.map +1 -0
  26. package/lib/base/PluginConfig.d.ts +196 -0
  27. package/lib/base/PluginConfig.js +96 -0
  28. package/lib/base/PluginConfig.js.map +1 -0
  29. package/lib/base/PluginEvents.d.ts +140 -0
  30. package/lib/base/PluginEvents.js +268 -0
  31. package/lib/base/PluginEvents.js.map +1 -0
  32. package/lib/base/PluginObservable.d.ts +196 -0
  33. package/lib/base/PluginObservable.js +250 -0
  34. package/lib/base/PluginObservable.js.map +1 -0
  35. package/lib/base/ResourceContext.d.ts +70 -0
  36. package/lib/base/ResourceContext.js +54 -0
  37. package/lib/base/ResourceContext.js.map +1 -0
  38. package/lib/base/base.d.ts +264 -0
  39. package/lib/base/base.js +182 -0
  40. package/lib/base/base.js.map +1 -0
  41. package/lib/base/errorMessages.d.ts +56 -0
  42. package/lib/base/errorMessages.js +70 -0
  43. package/lib/base/errorMessages.js.map +1 -0
  44. package/lib/base/factory.d.ts +58 -0
  45. package/lib/base/factory.js +167 -0
  46. package/lib/base/factory.js.map +1 -0
  47. package/lib/base/functions.d.ts +117 -0
  48. package/lib/base/functions.js +152 -0
  49. package/lib/base/functions.js.map +1 -0
  50. package/lib/base/index.d.ts +44 -0
  51. package/lib/base/index.js +64 -0
  52. package/lib/base/index.js.map +1 -0
  53. package/lib/base/logFormatter.d.ts +50 -0
  54. package/lib/base/logFormatter.js +105 -0
  55. package/lib/base/logFormatter.js.map +1 -0
  56. package/lib/base/tools.d.ts +316 -0
  57. package/lib/base/tools.js +666 -0
  58. package/lib/base/tools.js.map +1 -0
  59. package/lib/cli.d.ts +28 -0
  60. package/lib/cli.js +254 -0
  61. package/lib/cli.js.map +1 -0
  62. package/lib/dev.d.ts +27 -0
  63. package/lib/dev.js +200 -0
  64. package/lib/dev.js.map +1 -0
  65. package/lib/index.d.ts +32 -0
  66. package/lib/index.js +49 -0
  67. package/lib/index.js.map +1 -0
  68. package/lib/interfaces/events.d.ts +67 -0
  69. package/lib/interfaces/events.js +44 -0
  70. package/lib/interfaces/events.js.map +1 -0
  71. package/lib/interfaces/index.d.ts +38 -0
  72. package/lib/interfaces/index.js +59 -0
  73. package/lib/interfaces/index.js.map +1 -0
  74. package/lib/interfaces/logging.d.ts +106 -0
  75. package/lib/interfaces/logging.js +39 -0
  76. package/lib/interfaces/logging.js.map +1 -0
  77. package/lib/interfaces/metrics.d.ts +365 -0
  78. package/lib/interfaces/metrics.js +46 -0
  79. package/lib/interfaces/metrics.js.map +1 -0
  80. package/lib/interfaces/observable-types.d.ts +63 -0
  81. package/lib/interfaces/observable-types.js +49 -0
  82. package/lib/interfaces/observable-types.js.map +1 -0
  83. package/lib/interfaces/observable.d.ts +297 -0
  84. package/lib/interfaces/observable.js +29 -0
  85. package/lib/interfaces/observable.js.map +1 -0
  86. package/lib/interfaces/options.d.ts +164 -0
  87. package/lib/interfaces/options.js +56 -0
  88. package/lib/interfaces/options.js.map +1 -0
  89. package/lib/interfaces/plugins.d.ts +143 -0
  90. package/lib/interfaces/plugins.js +45 -0
  91. package/lib/interfaces/plugins.js.map +1 -0
  92. package/lib/interfaces/result.d.ts +129 -0
  93. package/lib/interfaces/result.js +162 -0
  94. package/lib/interfaces/result.js.map +1 -0
  95. package/lib/interfaces/schema-events.d.ts +378 -0
  96. package/lib/interfaces/schema-events.js +247 -0
  97. package/lib/interfaces/schema-events.js.map +1 -0
  98. package/lib/interfaces/schema-types.d.ts +407 -0
  99. package/lib/interfaces/schema-types.js +581 -0
  100. package/lib/interfaces/schema-types.js.map +1 -0
  101. package/lib/interfaces/service.d.ts +48 -0
  102. package/lib/interfaces/service.js +29 -0
  103. package/lib/interfaces/service.js.map +1 -0
  104. package/lib/interfaces/tools.d.ts +65 -0
  105. package/lib/interfaces/tools.js +50 -0
  106. package/lib/interfaces/tools.js.map +1 -0
  107. package/lib/plugins/config-default/index.d.ts +59 -0
  108. package/lib/plugins/config-default/index.js +197 -0
  109. package/lib/plugins/config-default/index.js.map +1 -0
  110. package/lib/plugins/config-default/interfaces.d.ts +92 -0
  111. package/lib/plugins/config-default/interfaces.js +36 -0
  112. package/lib/plugins/config-default/interfaces.js.map +1 -0
  113. package/lib/plugins/events-default/events/broadcast.d.ts +36 -0
  114. package/lib/plugins/events-default/events/broadcast.js +85 -0
  115. package/lib/plugins/events-default/events/broadcast.js.map +1 -0
  116. package/lib/plugins/events-default/events/emit.d.ts +38 -0
  117. package/lib/plugins/events-default/events/emit.js +104 -0
  118. package/lib/plugins/events-default/events/emit.js.map +1 -0
  119. package/lib/plugins/events-default/events/emitAndReturn.d.ts +36 -0
  120. package/lib/plugins/events-default/events/emitAndReturn.js +100 -0
  121. package/lib/plugins/events-default/events/emitAndReturn.js.map +1 -0
  122. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.d.ts +38 -0
  123. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js +134 -0
  124. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js.map +1 -0
  125. package/lib/plugins/events-default/events/index.d.ts +30 -0
  126. package/lib/plugins/events-default/events/index.js +38 -0
  127. package/lib/plugins/events-default/events/index.js.map +1 -0
  128. package/lib/plugins/events-default/index.d.ts +57 -0
  129. package/lib/plugins/events-default/index.js +86 -0
  130. package/lib/plugins/events-default/index.js.map +1 -0
  131. package/lib/plugins/observable-default/index.d.ts +43 -0
  132. package/lib/plugins/observable-default/index.js +151 -0
  133. package/lib/plugins/observable-default/index.js.map +1 -0
  134. package/lib/schemas/config-default.json +34 -0
  135. package/lib/schemas/config-default.plugin.json +36 -0
  136. package/lib/schemas/events-default.json +18 -0
  137. package/lib/schemas/events-default.plugin.json +17 -0
  138. package/lib/schemas/observable-default.json +33 -0
  139. package/lib/schemas/observable-default.plugin.json +24 -0
  140. package/lib/scripts/bsb-client-cli.d.ts +21 -0
  141. package/lib/scripts/bsb-client-cli.js +701 -0
  142. package/lib/scripts/bsb-client-cli.js.map +1 -0
  143. package/lib/scripts/bsb-plugin-cli.d.ts +15 -0
  144. package/lib/scripts/bsb-plugin-cli.js +547 -0
  145. package/lib/scripts/bsb-plugin-cli.js.map +1 -0
  146. package/lib/scripts/export-schemas.d.ts +17 -0
  147. package/lib/scripts/export-schemas.js +205 -0
  148. package/lib/scripts/export-schemas.js.map +1 -0
  149. package/lib/scripts/extract-schemas-from-source.d.ts +23 -0
  150. package/lib/scripts/extract-schemas-from-source.js +604 -0
  151. package/lib/scripts/extract-schemas-from-source.js.map +1 -0
  152. package/lib/scripts/generate-client-types.d.ts +22 -0
  153. package/lib/scripts/generate-client-types.js +537 -0
  154. package/lib/scripts/generate-client-types.js.map +1 -0
  155. package/lib/scripts/generate-plugin-json.d.ts +17 -0
  156. package/lib/scripts/generate-plugin-json.js +219 -0
  157. package/lib/scripts/generate-plugin-json.js.map +1 -0
  158. package/lib/serviceBase/config.d.ts +83 -0
  159. package/lib/serviceBase/config.js +236 -0
  160. package/lib/serviceBase/config.js.map +1 -0
  161. package/lib/serviceBase/events.d.ts +91 -0
  162. package/lib/serviceBase/events.js +519 -0
  163. package/lib/serviceBase/events.js.map +1 -0
  164. package/lib/serviceBase/index.d.ts +33 -0
  165. package/lib/serviceBase/index.js +50 -0
  166. package/lib/serviceBase/index.js.map +1 -0
  167. package/lib/serviceBase/observable.d.ts +249 -0
  168. package/lib/serviceBase/observable.js +551 -0
  169. package/lib/serviceBase/observable.js.map +1 -0
  170. package/lib/serviceBase/plugins.d.ts +48 -0
  171. package/lib/serviceBase/plugins.js +184 -0
  172. package/lib/serviceBase/plugins.js.map +1 -0
  173. package/lib/serviceBase/serviceBase.d.ts +228 -0
  174. package/lib/serviceBase/serviceBase.js +420 -0
  175. package/lib/serviceBase/serviceBase.js.map +1 -0
  176. package/lib/serviceBase/services.d.ts +63 -0
  177. package/lib/serviceBase/services.js +346 -0
  178. package/lib/serviceBase/services.js.map +1 -0
  179. package/lib/tests.d.ts +27 -0
  180. package/lib/tests.js +44 -0
  181. package/lib/tests.js.map +1 -0
  182. 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":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAkqBc,wCAAwB;AAhqBzC,yBAAyB;AACzB,6BAA6B;AAE7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,uCAAuC;AACvC,MAAM,kBAAkB,GAAgB,IAAI,GAAG,CAAC;IAC9C,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,0BAA0B;IAC1B,sBAAsB;IACtB,KAAK;IACL,UAAU;IACV,UAAU;IACV,cAAc;CACf,CAAC,CAAC;AASH,MAAM,kBAAkB,GAAG;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IAC3C,OAAO,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,CAAC;IAChH,OAAO,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;CACtC,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,aAAa;IACb,eAAe;IACf,SAAS;IACT,WAAW;IACX,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,YAAY;CACJ,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,iBAAiB;CACT,CAAC;AAEX,SAAS,qBAAqB;IAC5B,MAAM,WAAW,GAAG;QAClB,GAAG;QACH,SAAS;QACT,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;KACjC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,aAAqB,EAAE,aAAqB;IACnE,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IACjE,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzD,IAAI,wBAAwB,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,IAAI,2BAA2B,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IACzE,IAAI,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,IAAI,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAAC,aAAqB;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACnF,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAE7D,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAC3D,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,kGAAkG,OAAO,SAAS,CAAC,CAAC;IACnJ,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAsB,EAAE,SAAiB;IAClE,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACrG,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACrG,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY;IAOnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,2CAA2C;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1F,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACnG,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACrF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC/G,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACpF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACnD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACrG,CAAC;IAED,gCAAgC;IAChC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAChF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC1H,CAAC;IAED,6BAA6B;IAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACpE,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC9G,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,WAAqB,EAAE,WAAgC;IAC/E,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/B,2EAA2E;QAC3E,OAAO,CAAC,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC;IAED,qDAAqD;IACrD,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,MAAc,CAAC;QACnB,IAAI,EAAE,KAAK,oBAAoB,EAAE,CAAC;YAChC,MAAM,GAAG,yBAAyB,CAAC;QACrC,CAAC;aAAM,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5H,MAAM,GAAG,gCAAgC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,+BAA+B,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,KAAe;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAoB,IAAI,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,mDAAmD;YACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,wDAAwD;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,4CAA4C;gBAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,SAAS;QACX,CAAC;QAED,8EAA8E;QAC9E,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,oEAAoE;IACpE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,CACL,MAAM,KAAK,WAAW;QACtB,MAAM,KAAK,YAAY;QACvB,MAAM,KAAK,kBAAkB;QAC7B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,aAAqB,EAAE,aAAqB,EAAE,WAAgC;IACzG,kEAAkE;IAClE,MAAM,KAAK,GAAG,yBAAyB,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnE,0EAA0E;IAC1E,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC5C,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,CACxD,CAAC;IAEF,mCAAmC;IACnC,MAAM,aAAa,GAAG,cAAc,IAAI,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QAChC,CAAC,CAAC,KAAK,CAAC;IAEV,qBAAqB;IACrB,2CAA2C;IAC3C,wFAAwF;IAExF,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,mBAAmB,GAAmD,EAAE,CAAC;IAC/E,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,8CAA8C;QAC9C,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,mEAAmE;YACnE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,mCAAmC;YACnC,IAAI,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,qDAAqD;YACrD,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACpE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,oDAAoD;YACpD,oEAAoE;YACpE,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,0EAA0E;gBAC1E,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpC,SAAS;gBACX,CAAC;gBACD,wBAAwB;gBACxB,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpE,SAAS;YACX,CAAC;YAED,sDAAsD;YACtD,SAAS;QACX,CAAC;QAED,iEAAiE;QACjE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC3C,mDAAmD;YACnD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC,CAAC;IAEvD,+BAA+B;IAC/B,MAAM,wBAAwB,GAAG,WAAW,KAAK,MAAM;QACrD,CAAC,CAAC,sEAAsE;QACxE,CAAC,CAAC,iDAAiD,CAAC;IAEtD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACzE,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC3C,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC5C,WAAW,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACrF,WAAW,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IACvG,WAAW,CAAC,IAAI,CAAC,iGAAiG,CAAC,CAAC;IACpH,WAAW,CAAC,IAAI,CAAC,yHAAyH,CAAC,CAAC;IAC5I,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpE,WAAW,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACvD,WAAW,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1D,WAAW,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IACnG,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC1D,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC1D,WAAW,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC9F,WAAW,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAC1F,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IACjG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrC,WAAW,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACtF,WAAW,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;IACxH,WAAW,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACvD,WAAW,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IACtG,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACrE,WAAW,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IACnH,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnC,WAAW,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC9E,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,WAAW,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IACjF,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,aAAqB;IACrD,MAAM,KAAK,GAAG,yBAAyB,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,8DAA8D;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,iDAAiD;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,IAAI,GAA2C,EAAE,CAAC;IAExD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,kDAAkD;QAClD,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;IAEnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,6EAA6E;IAC7E,2FAA2F;IAC3F,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE5B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,+BAA+B;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE/D,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAEnF,wEAAwE;YACxE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;YAC/D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEzB,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEhD,qDAAqD;YACrD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAsD,CAAC;YACtF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,EAAE,CAAC;gBAC7F,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YAED,kCAAkC;YAClC,MAAM,YAAY,GAAG,MAAM,CAAC,mBAA8C,CAAC;YAC3E,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;YACrC,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC;YAC3C,CAAC;YAED,sDAAsD;YACtD,MAAM,IAAI,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;YACnC,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC;YACnE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAE7E,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,OAAO,MAAM,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;YACnF,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,EAAE,CAAC;QAC9C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,iCAAiC,SAAS,eAAe,MAAM,SAAS,CAAC,CAAC;IACtF,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IAEjD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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 };