@memberjunction/codegen-lib 3.2.0 → 3.4.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.
@@ -0,0 +1,630 @@
1
+ "use strict";
2
+ /**
3
+ * Build-time tool to generate an import manifest that prevents tree-shaking of
4
+ * @RegisterClass decorated classes.
5
+ *
6
+ * The tool starts from the current app's package.json, walks its full transitive
7
+ * dependency tree, scans each dependency's source for @RegisterClass decorators,
8
+ * and generates a manifest importing only the packages that contain them.
9
+ *
10
+ * Usage (via MJCLI):
11
+ * mj codegen manifest --output ./src/generated/class-registrations-manifest.ts
12
+ *
13
+ * Or programmatically:
14
+ * import { generateClassRegistrationsManifest } from '@memberjunction/codegen-lib';
15
+ * await generateClassRegistrationsManifest({ outputPath: './src/generated/class-manifest.ts' });
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.generateClassRegistrationsManifest = void 0;
42
+ const ts = __importStar(require("typescript"));
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const glob_1 = require("glob");
46
+ /**
47
+ * Reads and parses a package.json file, returning relevant info.
48
+ */
49
+ function readPackageJson(dir) {
50
+ const pkgPath = path.join(dir, 'package.json');
51
+ if (!fs.existsSync(pkgPath))
52
+ return null;
53
+ try {
54
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
55
+ return {
56
+ name: pkg.name || path.basename(dir),
57
+ dir,
58
+ dependencies: pkg.dependencies || {},
59
+ devDependencies: pkg.devDependencies || {}
60
+ };
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * Resolves a dependency name to its directory on disk.
68
+ * Walks up node_modules directories from the starting point to handle hoisted packages.
69
+ */
70
+ function resolvePackageDir(depName, fromDir) {
71
+ let searchDir = fromDir;
72
+ const root = path.parse(searchDir).root;
73
+ while (searchDir !== root) {
74
+ const candidate = path.join(searchDir, 'node_modules', depName);
75
+ if (fs.existsSync(path.join(candidate, 'package.json'))) {
76
+ // Resolve symlinks (workspace packages are symlinked)
77
+ try {
78
+ const realPath = fs.realpathSync(candidate);
79
+ return realPath;
80
+ }
81
+ catch {
82
+ return candidate;
83
+ }
84
+ }
85
+ searchDir = path.dirname(searchDir);
86
+ }
87
+ return null;
88
+ }
89
+ /**
90
+ * Walks the full transitive dependency tree starting from an app's package.json.
91
+ * Returns all unique package directories found (deduplicated by resolved real path).
92
+ */
93
+ function walkDependencyTree(appDir, log) {
94
+ // Map of package name -> resolved directory
95
+ const visited = new Map();
96
+ const queue = [];
97
+ // Start with the app's own package.json
98
+ const appPkg = readPackageJson(appDir);
99
+ if (!appPkg) {
100
+ log(`No package.json found in ${appDir}`);
101
+ return visited;
102
+ }
103
+ // Seed queue with all direct dependencies (both deps and devDeps for the root app)
104
+ const allDeps = { ...appPkg.dependencies, ...appPkg.devDependencies };
105
+ for (const depName of Object.keys(allDeps)) {
106
+ queue.push({ depName, fromDir: appDir });
107
+ }
108
+ while (queue.length > 0) {
109
+ const { depName, fromDir } = queue.shift();
110
+ // Skip if already visited
111
+ if (visited.has(depName))
112
+ continue;
113
+ // Resolve to actual directory on disk
114
+ const depDir = resolvePackageDir(depName, fromDir);
115
+ if (!depDir)
116
+ continue; // External package not found locally, skip
117
+ visited.set(depName, depDir);
118
+ // Read this package's dependencies and add to queue (only dependencies, not devDeps for transitive)
119
+ const depPkg = readPackageJson(depDir);
120
+ if (depPkg) {
121
+ for (const transitiveDep of Object.keys(depPkg.dependencies)) {
122
+ if (!visited.has(transitiveDep)) {
123
+ queue.push({ depName: transitiveDep, fromDir: depDir });
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return visited;
129
+ }
130
+ // ============================================================================
131
+ // Source Scanning
132
+ // ============================================================================
133
+ /**
134
+ * Finds all TypeScript source files in a package directory.
135
+ * Looks in the src/ folder by default.
136
+ */
137
+ async function findSourceFiles(packageDir, excludePatterns) {
138
+ const srcDir = path.join(packageDir, 'src');
139
+ if (!fs.existsSync(srcDir))
140
+ return [];
141
+ const defaultExcludes = [
142
+ '**/node_modules/**',
143
+ '**/dist/**',
144
+ '**/build/**',
145
+ '**/.git/**',
146
+ '**/__tests__/**',
147
+ '**/*.d.ts',
148
+ '**/*.spec.ts',
149
+ '**/*.test.ts',
150
+ ...excludePatterns.map(p => `**/${p}/**`)
151
+ ];
152
+ const files = await (0, glob_1.glob)('**/*.ts', {
153
+ cwd: srcDir,
154
+ absolute: true,
155
+ ignore: defaultExcludes,
156
+ nodir: true
157
+ });
158
+ return files;
159
+ }
160
+ /**
161
+ * Parses a TypeScript file and extracts @RegisterClass decorator information
162
+ */
163
+ function extractRegisterClassDecorators(filePath, sourceText, packageName) {
164
+ const results = [];
165
+ // Quick check before parsing
166
+ if (!sourceText.includes('RegisterClass'))
167
+ return results;
168
+ const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
169
+ function visit(node) {
170
+ if (ts.isClassDeclaration(node) && node.name) {
171
+ const decorators = ts.getDecorators(node);
172
+ if (decorators) {
173
+ for (const decorator of decorators) {
174
+ const info = parseRegisterClassDecorator(decorator, node.name.text, filePath, packageName);
175
+ if (info) {
176
+ results.push(info);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ ts.forEachChild(node, visit);
182
+ }
183
+ visit(sourceFile);
184
+ return results;
185
+ }
186
+ /**
187
+ * Parses a single @RegisterClass decorator and extracts its arguments
188
+ */
189
+ function parseRegisterClassDecorator(decorator, className, filePath, packageName) {
190
+ if (!ts.isCallExpression(decorator.expression))
191
+ return null;
192
+ const callExpr = decorator.expression;
193
+ // Check if the function being called is "RegisterClass"
194
+ if (!ts.isIdentifier(callExpr.expression) || callExpr.expression.text !== 'RegisterClass') {
195
+ return null;
196
+ }
197
+ // Extract arguments
198
+ const args = callExpr.arguments;
199
+ let baseClassName;
200
+ let key;
201
+ if (args.length > 0 && ts.isIdentifier(args[0])) {
202
+ baseClassName = args[0].text;
203
+ }
204
+ if (args.length > 1 && ts.isStringLiteral(args[1])) {
205
+ key = args[1].text;
206
+ }
207
+ return { className, filePath, packageName, baseClassName, key };
208
+ }
209
+ // ============================================================================
210
+ // Export Verification
211
+ // ============================================================================
212
+ /**
213
+ * Resolves the `.d.ts` entry point for a package by reading its package.json.
214
+ * Checks `types`, `typings`, then falls back to conventional locations.
215
+ */
216
+ function resolveTypesEntryPoint(packageDir) {
217
+ const pkgPath = path.join(packageDir, 'package.json');
218
+ if (!fs.existsSync(pkgPath))
219
+ return null;
220
+ try {
221
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
222
+ // Check types/typings fields (these are the authoritative source)
223
+ const typesField = pkg.types || pkg.typings;
224
+ if (typesField) {
225
+ const resolved = path.resolve(packageDir, typesField);
226
+ // If the field points to a .ts source file, convert to .d.ts in dist
227
+ if (resolved.endsWith('.ts') && !resolved.endsWith('.d.ts')) {
228
+ const dtsPath = resolved
229
+ .replace(/\/src\//, '/dist/')
230
+ .replace(/\.ts$/, '.d.ts');
231
+ if (fs.existsSync(dtsPath))
232
+ return dtsPath;
233
+ }
234
+ if (fs.existsSync(resolved))
235
+ return resolved;
236
+ }
237
+ // Fallback: check main field and derive .d.ts from it
238
+ if (pkg.main) {
239
+ const mainDts = path.resolve(packageDir, pkg.main.replace(/\.js$/, '.d.ts'));
240
+ if (fs.existsSync(mainDts))
241
+ return mainDts;
242
+ }
243
+ // Last resort: conventional locations
244
+ for (const candidate of ['dist/index.d.ts', 'dist/public-api.d.ts']) {
245
+ const candidatePath = path.join(packageDir, candidate);
246
+ if (fs.existsSync(candidatePath))
247
+ return candidatePath;
248
+ }
249
+ }
250
+ catch {
251
+ // Ignore parse errors
252
+ }
253
+ return null;
254
+ }
255
+ /**
256
+ * Collects all class names exported from a package by recursively following
257
+ * `export * from '...'` and `export { Foo } from '...'` declarations
258
+ * in .d.ts files starting from the types entry point.
259
+ */
260
+ function collectExportedClassNames(entryDtsPath) {
261
+ const exported = new Set();
262
+ const visited = new Set();
263
+ function processFile(filePath) {
264
+ if (visited.has(filePath))
265
+ return;
266
+ visited.add(filePath);
267
+ let content;
268
+ try {
269
+ content = fs.readFileSync(filePath, 'utf-8');
270
+ }
271
+ catch {
272
+ return;
273
+ }
274
+ const fileDir = path.dirname(filePath);
275
+ for (const line of content.split('\n')) {
276
+ const trimmed = line.trim();
277
+ // export declare class ClassName ...
278
+ const declareClassMatch = trimmed.match(/^export\s+declare\s+class\s+(\w+)/);
279
+ if (declareClassMatch) {
280
+ exported.add(declareClassMatch[1]);
281
+ continue;
282
+ }
283
+ // export { Foo, Bar, Baz } (with or without "from")
284
+ const namedExportMatch = trimmed.match(/^export\s*\{([^}]+)\}/);
285
+ if (namedExportMatch) {
286
+ const names = namedExportMatch[1].split(',');
287
+ for (const name of names) {
288
+ // Handle "Foo as Bar" — the exported name is "Bar"
289
+ const parts = name.trim().split(/\s+as\s+/);
290
+ const exportedName = parts.length > 1 ? parts[1].trim() : parts[0].trim();
291
+ if (exportedName && /^\w+$/.test(exportedName)) {
292
+ exported.add(exportedName);
293
+ }
294
+ }
295
+ // If this is a re-export from another file, also follow it
296
+ const fromMatch = trimmed.match(/from\s+['"]([^'"]+)['"]/);
297
+ if (fromMatch) {
298
+ const resolvedPath = resolveDtsImport(fromMatch[1], fileDir);
299
+ if (resolvedPath)
300
+ processFile(resolvedPath);
301
+ }
302
+ continue;
303
+ }
304
+ // export * from './something'
305
+ const starExportMatch = trimmed.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]/);
306
+ if (starExportMatch) {
307
+ const resolvedPath = resolveDtsImport(starExportMatch[1], fileDir);
308
+ if (resolvedPath)
309
+ processFile(resolvedPath);
310
+ continue;
311
+ }
312
+ }
313
+ }
314
+ processFile(entryDtsPath);
315
+ return exported;
316
+ }
317
+ /**
318
+ * Resolves a relative import specifier to an actual .d.ts file path.
319
+ */
320
+ function resolveDtsImport(specifier, fromDir) {
321
+ // Only resolve relative imports
322
+ if (!specifier.startsWith('.'))
323
+ return null;
324
+ // Strip .js extension if present (common in ESM .d.ts files)
325
+ const cleaned = specifier.replace(/\.js$/, '');
326
+ const base = path.resolve(fromDir, cleaned);
327
+ // Try direct .d.ts, then with index
328
+ for (const candidate of [
329
+ `${base}.d.ts`,
330
+ path.join(base, 'index.d.ts')
331
+ ]) {
332
+ if (fs.existsSync(candidate))
333
+ return candidate;
334
+ }
335
+ return null;
336
+ }
337
+ /**
338
+ * Builds a map of package name -> Set of exported class names
339
+ * by checking each package's .d.ts entry point.
340
+ */
341
+ function buildPackageExportsMap(depTree, log) {
342
+ const exportsMap = new Map();
343
+ for (const [depName, depDir] of Array.from(depTree.entries())) {
344
+ const entryDts = resolveTypesEntryPoint(depDir);
345
+ if (!entryDts)
346
+ continue;
347
+ const exportedNames = collectExportedClassNames(entryDts);
348
+ if (exportedNames.size > 0) {
349
+ exportsMap.set(depName, exportedNames);
350
+ }
351
+ }
352
+ return exportsMap;
353
+ }
354
+ /**
355
+ * Filters registered classes to only include those actually exported
356
+ * from their package's public API.
357
+ */
358
+ function filterToExportedClasses(classes, exportsMap, log) {
359
+ const exported = [];
360
+ const skipped = [];
361
+ for (const cls of classes) {
362
+ const packageExports = exportsMap.get(cls.packageName);
363
+ if (!packageExports) {
364
+ // No .d.ts found for this package — include it (may be a local/workspace package)
365
+ exported.push(cls);
366
+ continue;
367
+ }
368
+ if (packageExports.has(cls.className)) {
369
+ exported.push(cls);
370
+ }
371
+ else {
372
+ skipped.push(cls);
373
+ }
374
+ }
375
+ if (skipped.length > 0) {
376
+ log(`Skipped ${skipped.length} classes not exported from their package's public API:`);
377
+ for (const cls of skipped) {
378
+ log(` - ${cls.className} (found in ${cls.packageName} source but not in public exports)`);
379
+ }
380
+ }
381
+ return { exported, skipped };
382
+ }
383
+ // ============================================================================
384
+ // Manifest Generation
385
+ // ============================================================================
386
+ /**
387
+ * Generates the manifest file content with named imports and runtime references
388
+ * to prevent tree-shaking of individual classes.
389
+ *
390
+ * Bare `import 'pkg'` only ensures side effects run but bundlers can still
391
+ * tree-shake individual classes within a package. By importing each class by
392
+ * name and placing it in an exported array, we create a static code path that
393
+ * the bundler cannot eliminate.
394
+ */
395
+ function generateManifestContent(classes, appName, totalDepsWalked, filterBaseClasses) {
396
+ // Filter by base classes if specified
397
+ let filteredClasses = classes;
398
+ if (filterBaseClasses && filterBaseClasses.length > 0) {
399
+ const filterSet = new Set(filterBaseClasses);
400
+ filteredClasses = classes.filter(c => c.baseClassName && filterSet.has(c.baseClassName));
401
+ }
402
+ // Group by package and deduplicate class names within each package
403
+ const packageMap = new Map();
404
+ for (const cls of filteredClasses) {
405
+ if (!packageMap.has(cls.packageName)) {
406
+ packageMap.set(cls.packageName, []);
407
+ }
408
+ const existing = packageMap.get(cls.packageName);
409
+ if (!existing.includes(cls.className)) {
410
+ existing.push(cls.className);
411
+ }
412
+ }
413
+ const sortedPackages = Array.from(packageMap.keys()).sort();
414
+ // Build alias map: detect cross-package name collisions and assign unique aliases
415
+ const aliasMap = buildAliasMap(packageMap, sortedPackages);
416
+ const lines = buildFileHeader(appName, totalDepsWalked, sortedPackages.length);
417
+ // Generate named imports per package
418
+ const allAliases = [];
419
+ for (const packageName of sortedPackages) {
420
+ const classNames = packageMap.get(packageName).sort();
421
+ const importSpecifiers = buildImportSpecifiers(classNames, packageName, aliasMap);
422
+ allAliases.push(...importSpecifiers.map(s => s.alias));
423
+ lines.push(`// ${packageName} (${classNames.length} classes)`);
424
+ lines.push(`import {`);
425
+ for (const spec of importSpecifiers) {
426
+ if (spec.alias !== spec.original) {
427
+ lines.push(` ${spec.original} as ${spec.alias},`);
428
+ }
429
+ else {
430
+ lines.push(` ${spec.alias},`);
431
+ }
432
+ }
433
+ lines.push(`} from '${packageName}';`);
434
+ lines.push('');
435
+ }
436
+ // Runtime reference array — this is the static code path that prevents tree-shaking
437
+ lines.push('/**');
438
+ lines.push(' * Runtime references to every @RegisterClass decorated class.');
439
+ lines.push(' * This array creates a static code path the bundler cannot tree-shake.');
440
+ lines.push(' */');
441
+ lines.push('// eslint-disable-next-line @typescript-eslint/no-explicit-any');
442
+ lines.push(`export const CLASS_REGISTRATIONS: any[] = [`);
443
+ for (const alias of allAliases) {
444
+ lines.push(` ${alias},`);
445
+ }
446
+ lines.push('];');
447
+ lines.push('');
448
+ lines.push('/** Marker constant indicating the manifest has been loaded. */');
449
+ lines.push('export const CLASS_REGISTRATIONS_MANIFEST_LOADED = true;');
450
+ lines.push('');
451
+ lines.push(`/** Total @RegisterClass decorated classes discovered in dependency tree */`);
452
+ lines.push(`export const CLASS_REGISTRATIONS_COUNT = ${allAliases.length};`);
453
+ lines.push('');
454
+ lines.push(`/** Packages imported by this manifest */`);
455
+ lines.push(`export const CLASS_REGISTRATIONS_PACKAGES = [`);
456
+ for (const pkg of sortedPackages) {
457
+ lines.push(` '${pkg}',`);
458
+ }
459
+ lines.push(`] as const;`);
460
+ lines.push('');
461
+ return lines.join('\n');
462
+ }
463
+ /**
464
+ * Builds the file header comment block.
465
+ */
466
+ function buildFileHeader(appName, totalDepsWalked, packageCount) {
467
+ return [
468
+ '/**',
469
+ ' * AUTO-GENERATED FILE - DO NOT EDIT',
470
+ ' * Generated by mj codegen manifest',
471
+ ` * App: ${appName}`,
472
+ ` * Last generated: ${new Date().toISOString()}`,
473
+ ` * Dependency tree: ${totalDepsWalked} packages walked, ${packageCount} contain @RegisterClass`,
474
+ ' *',
475
+ ' * This file imports every @RegisterClass decorated class by name and places',
476
+ ' * them in an exported array, creating a static code path that prevents',
477
+ ' * tree-shaking from removing them.',
478
+ ' */',
479
+ '',
480
+ '/* eslint-disable @typescript-eslint/no-unused-vars */',
481
+ ''
482
+ ];
483
+ }
484
+ /**
485
+ * Detects cross-package class name collisions and builds a map of
486
+ * (packageName, className) -> unique alias for any collisions.
487
+ *
488
+ * Classes that are unique across all packages keep their original name.
489
+ * Colliding classes get prefixed with a sanitized package suffix.
490
+ */
491
+ function buildAliasMap(packageMap, sortedPackages) {
492
+ // Count how many packages export each class name
493
+ const nameCount = new Map();
494
+ for (const pkg of sortedPackages) {
495
+ const classNames = packageMap.get(pkg);
496
+ for (const name of classNames) {
497
+ nameCount.set(name, (nameCount.get(name) || 0) + 1);
498
+ }
499
+ }
500
+ // Build alias map only for collisions: "pkgName::className" -> alias
501
+ const aliasMap = new Map();
502
+ for (const pkg of sortedPackages) {
503
+ const classNames = packageMap.get(pkg);
504
+ for (const name of classNames) {
505
+ if ((nameCount.get(name) || 0) > 1) {
506
+ const suffix = sanitizePackageName(pkg);
507
+ aliasMap.set(`${pkg}::${name}`, `${name}_${suffix}`);
508
+ }
509
+ }
510
+ }
511
+ return aliasMap;
512
+ }
513
+ /**
514
+ * Converts a package name like "@memberjunction/ai-anthropic"
515
+ * into a safe identifier suffix like "ai_anthropic".
516
+ */
517
+ function sanitizePackageName(packageName) {
518
+ return packageName
519
+ .replace(/^@[^/]+\//, '') // strip scope
520
+ .replace(/[^a-zA-Z0-9]/g, '_'); // non-alphanum → underscore
521
+ }
522
+ /**
523
+ * Builds import specifiers for a package's classes, applying aliases where needed.
524
+ */
525
+ function buildImportSpecifiers(classNames, packageName, aliasMap) {
526
+ return classNames.map(name => {
527
+ const key = `${packageName}::${name}`;
528
+ const alias = aliasMap.get(key) || name;
529
+ return { original: name, alias };
530
+ });
531
+ }
532
+ // ============================================================================
533
+ // Main Entry Point
534
+ // ============================================================================
535
+ /**
536
+ * Generates a class registrations manifest for the app in the given directory.
537
+ *
538
+ * Walks the app's dependency tree from its package.json, scans each dependency
539
+ * for @RegisterClass decorators, and writes an import manifest that prevents
540
+ * tree-shaking from removing those classes.
541
+ *
542
+ * @param options - Configuration options
543
+ * @returns Result with discovered classes and generated manifest path
544
+ *
545
+ * @example
546
+ * ```typescript
547
+ * import { generateClassRegistrationsManifest } from '@memberjunction/codegen-lib';
548
+ *
549
+ * const result = await generateClassRegistrationsManifest({
550
+ * outputPath: './src/generated/class-manifest.ts'
551
+ * });
552
+ *
553
+ * if (result.success) {
554
+ * console.log(`Manifest: ${result.packages.length} packages, ${result.classes.length} classes`);
555
+ * }
556
+ * ```
557
+ */
558
+ async function generateClassRegistrationsManifest(options) {
559
+ const { outputPath, appDir = process.cwd(), verbose = true, filterBaseClasses, excludePatterns = [] } = options;
560
+ const errors = [];
561
+ const allClasses = [];
562
+ const log = (msg) => {
563
+ if (verbose)
564
+ console.log(`[class-manifest] ${msg}`);
565
+ };
566
+ const absoluteAppDir = path.resolve(appDir);
567
+ // Read the app's package.json
568
+ const appPkg = readPackageJson(absoluteAppDir);
569
+ if (!appPkg) {
570
+ errors.push(`No package.json found in ${absoluteAppDir}`);
571
+ return { success: false, outputPath, classes: [], packages: [], totalDepsWalked: 0, errors };
572
+ }
573
+ log(`Building manifest for: ${appPkg.name}`);
574
+ log(`App directory: ${absoluteAppDir}`);
575
+ // Walk the dependency tree
576
+ const depTree = walkDependencyTree(absoluteAppDir, log);
577
+ log(`Dependency tree: ${depTree.size} packages`);
578
+ // Scan each dependency for @RegisterClass decorators
579
+ let packagesWithDecorators = 0;
580
+ for (const [depName, depDir] of Array.from(depTree.entries())) {
581
+ const sourceFiles = await findSourceFiles(depDir, excludePatterns);
582
+ if (sourceFiles.length === 0)
583
+ continue;
584
+ let foundInPackage = false;
585
+ for (const filePath of sourceFiles) {
586
+ try {
587
+ const sourceText = fs.readFileSync(filePath, 'utf-8');
588
+ const classes = extractRegisterClassDecorators(filePath, sourceText, depName);
589
+ if (classes.length > 0) {
590
+ foundInPackage = true;
591
+ allClasses.push(...classes);
592
+ }
593
+ }
594
+ catch (err) {
595
+ errors.push(`Error reading ${filePath}: ${err}`);
596
+ }
597
+ }
598
+ if (foundInPackage)
599
+ packagesWithDecorators++;
600
+ }
601
+ log(`Found ${allClasses.length} @RegisterClass decorators in ${packagesWithDecorators} packages`);
602
+ // Build export map and filter to only classes actually exported from public API
603
+ log('Verifying classes are exported from package public APIs...');
604
+ const exportsMap = buildPackageExportsMap(depTree, log);
605
+ const { exported: verifiedClasses, skipped } = filterToExportedClasses(allClasses, exportsMap, log);
606
+ log(`Verified: ${verifiedClasses.length} exported, ${skipped.length} skipped (not in public API)`);
607
+ // Generate manifest using only verified classes
608
+ const manifestContent = generateManifestContent(verifiedClasses, appPkg.name, depTree.size, filterBaseClasses);
609
+ const absoluteOutputPath = path.resolve(outputPath);
610
+ try {
611
+ fs.mkdirSync(path.dirname(absoluteOutputPath), { recursive: true });
612
+ fs.writeFileSync(absoluteOutputPath, manifestContent, 'utf-8');
613
+ log(`Generated manifest at: ${absoluteOutputPath}`);
614
+ }
615
+ catch (err) {
616
+ errors.push(`Error writing manifest: ${err}`);
617
+ return { success: false, outputPath: absoluteOutputPath, classes: allClasses, packages: [], totalDepsWalked: depTree.size, errors };
618
+ }
619
+ const uniquePackages = Array.from(new Set(verifiedClasses.map(c => c.packageName))).sort();
620
+ return {
621
+ success: errors.length === 0,
622
+ outputPath: absoluteOutputPath,
623
+ classes: verifiedClasses,
624
+ packages: uniquePackages,
625
+ totalDepsWalked: depTree.size,
626
+ errors
627
+ };
628
+ }
629
+ exports.generateClassRegistrationsManifest = generateClassRegistrationsManifest;
630
+ //# sourceMappingURL=GenerateClassRegistrationsManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateClassRegistrationsManifest.js","sourceRoot":"","sources":["../../src/Manifest/GenerateClassRegistrationsManifest.ts"],"names":[],"mappings":"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"}
@@ -31,5 +31,11 @@ export declare class SQLLogging {
31
31
  static LogSQLAndExecute(ds: sql.ConnectionPool, query: string, description?: string, isRecurringScript?: boolean): Promise<any>;
32
32
  protected static getFileLength(filePath: string): number;
33
33
  protected static convertSQLLogToFlywaySchema(): void;
34
+ /**
35
+ * Escapes special regex characters in a string
36
+ * @param str The string to escape
37
+ * @returns The escaped string safe for use in regex
38
+ */
39
+ private static escapeRegex;
34
40
  }
35
41
  //# sourceMappingURL=sql_logging.d.ts.map