@venizia/ignis-boot 0.2.1-0 → 0.2.1-10

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 (131) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/bun/auto-group.d.ts +22 -0
  3. package/dist/cjs/bun/auto-group.d.ts.map +1 -0
  4. package/dist/cjs/bun/auto-group.js +51 -0
  5. package/dist/cjs/bun/auto-group.js.map +1 -0
  6. package/dist/cjs/bun/auto-loader.d.ts +13 -0
  7. package/dist/cjs/bun/auto-loader.d.ts.map +1 -0
  8. package/dist/cjs/bun/auto-loader.js +63 -0
  9. package/dist/cjs/bun/auto-loader.js.map +1 -0
  10. package/dist/cjs/bun/auto.d.ts +5 -0
  11. package/dist/cjs/bun/auto.d.ts.map +1 -0
  12. package/dist/cjs/bun/auto.js +11 -0
  13. package/dist/cjs/bun/auto.js.map +1 -0
  14. package/dist/cjs/bun/group-resolver.d.ts +16 -0
  15. package/dist/cjs/bun/group-resolver.d.ts.map +1 -0
  16. package/dist/cjs/bun/group-resolver.js +44 -0
  17. package/dist/cjs/bun/group-resolver.js.map +1 -0
  18. package/dist/cjs/bun/index.d.ts +7 -0
  19. package/dist/cjs/bun/index.d.ts.map +1 -0
  20. package/dist/cjs/bun/index.js +23 -0
  21. package/dist/cjs/bun/index.js.map +1 -0
  22. package/dist/cjs/bun/plugin.d.ts +44 -0
  23. package/dist/cjs/bun/plugin.d.ts.map +1 -0
  24. package/dist/cjs/bun/plugin.js +299 -0
  25. package/dist/cjs/bun/plugin.js.map +1 -0
  26. package/dist/cjs/bun/scan-cache.d.ts +22 -0
  27. package/dist/cjs/bun/scan-cache.d.ts.map +1 -0
  28. package/dist/cjs/bun/scan-cache.js +89 -0
  29. package/dist/cjs/bun/scan-cache.js.map +1 -0
  30. package/dist/cjs/bun/sources.d.ts +49 -0
  31. package/dist/cjs/bun/sources.d.ts.map +1 -0
  32. package/dist/cjs/bun/sources.js +115 -0
  33. package/dist/cjs/bun/sources.js.map +1 -0
  34. package/dist/cjs/clis/artifacts.js +4 -2
  35. package/dist/cjs/clis/artifacts.js.map +1 -1
  36. package/dist/cjs/generator/common/constants.d.ts +13 -0
  37. package/dist/cjs/generator/common/constants.d.ts.map +1 -1
  38. package/dist/cjs/generator/common/constants.js +19 -4
  39. package/dist/cjs/generator/common/constants.js.map +1 -1
  40. package/dist/cjs/generator/common/types.d.ts +16 -1
  41. package/dist/cjs/generator/common/types.d.ts.map +1 -1
  42. package/dist/cjs/generator/emitter.d.ts +12 -0
  43. package/dist/cjs/generator/emitter.d.ts.map +1 -1
  44. package/dist/cjs/generator/emitter.js +23 -6
  45. package/dist/cjs/generator/emitter.js.map +1 -1
  46. package/dist/cjs/generator/index.d.ts +2 -0
  47. package/dist/cjs/generator/index.d.ts.map +1 -1
  48. package/dist/cjs/generator/index.js +12 -6
  49. package/dist/cjs/generator/index.js.map +1 -1
  50. package/dist/cjs/generator/reexport.d.ts +28 -0
  51. package/dist/cjs/generator/reexport.d.ts.map +1 -0
  52. package/dist/cjs/generator/reexport.js +131 -0
  53. package/dist/cjs/generator/reexport.js.map +1 -0
  54. package/dist/cjs/generator/scanner.d.ts +3 -1
  55. package/dist/cjs/generator/scanner.d.ts.map +1 -1
  56. package/dist/cjs/generator/scanner.js +72 -17
  57. package/dist/cjs/generator/scanner.js.map +1 -1
  58. package/dist/cjs/vite/index.d.ts +2 -0
  59. package/dist/cjs/vite/index.d.ts.map +1 -0
  60. package/dist/cjs/vite/index.js +18 -0
  61. package/dist/cjs/vite/index.js.map +1 -0
  62. package/dist/cjs/vite/plugin.d.ts +33 -0
  63. package/dist/cjs/vite/plugin.d.ts.map +1 -0
  64. package/dist/cjs/vite/plugin.js +51 -0
  65. package/dist/cjs/vite/plugin.js.map +1 -0
  66. package/dist/esm/bun/auto-group.d.ts +22 -0
  67. package/dist/esm/bun/auto-group.d.ts.map +1 -0
  68. package/dist/esm/bun/auto-group.js +47 -0
  69. package/dist/esm/bun/auto-group.js.map +1 -0
  70. package/dist/esm/bun/auto-loader.d.ts +13 -0
  71. package/dist/esm/bun/auto-loader.d.ts.map +1 -0
  72. package/dist/esm/bun/auto-loader.js +59 -0
  73. package/dist/esm/bun/auto-loader.js.map +1 -0
  74. package/dist/esm/bun/auto.d.ts +5 -0
  75. package/dist/esm/bun/auto.d.ts.map +1 -0
  76. package/dist/esm/bun/auto.js +9 -0
  77. package/dist/esm/bun/auto.js.map +1 -0
  78. package/dist/esm/bun/group-resolver.d.ts +16 -0
  79. package/dist/esm/bun/group-resolver.d.ts.map +1 -0
  80. package/dist/esm/bun/group-resolver.js +40 -0
  81. package/dist/esm/bun/group-resolver.js.map +1 -0
  82. package/dist/esm/bun/index.d.ts +7 -0
  83. package/dist/esm/bun/index.d.ts.map +1 -0
  84. package/dist/esm/bun/index.js +7 -0
  85. package/dist/esm/bun/index.js.map +1 -0
  86. package/dist/esm/bun/plugin.d.ts +44 -0
  87. package/dist/esm/bun/plugin.d.ts.map +1 -0
  88. package/dist/esm/bun/plugin.js +292 -0
  89. package/dist/esm/bun/plugin.js.map +1 -0
  90. package/dist/esm/bun/scan-cache.d.ts +22 -0
  91. package/dist/esm/bun/scan-cache.d.ts.map +1 -0
  92. package/dist/esm/bun/scan-cache.js +85 -0
  93. package/dist/esm/bun/scan-cache.js.map +1 -0
  94. package/dist/esm/bun/sources.d.ts +49 -0
  95. package/dist/esm/bun/sources.d.ts.map +1 -0
  96. package/dist/esm/bun/sources.js +111 -0
  97. package/dist/esm/bun/sources.js.map +1 -0
  98. package/dist/esm/clis/artifacts.js +5 -3
  99. package/dist/esm/clis/artifacts.js.map +1 -1
  100. package/dist/esm/generator/common/constants.d.ts +13 -0
  101. package/dist/esm/generator/common/constants.d.ts.map +1 -1
  102. package/dist/esm/generator/common/constants.js +17 -3
  103. package/dist/esm/generator/common/constants.js.map +1 -1
  104. package/dist/esm/generator/common/types.d.ts +16 -1
  105. package/dist/esm/generator/common/types.d.ts.map +1 -1
  106. package/dist/esm/generator/emitter.d.ts +12 -0
  107. package/dist/esm/generator/emitter.d.ts.map +1 -1
  108. package/dist/esm/generator/emitter.js +23 -6
  109. package/dist/esm/generator/emitter.js.map +1 -1
  110. package/dist/esm/generator/index.d.ts +2 -0
  111. package/dist/esm/generator/index.d.ts.map +1 -1
  112. package/dist/esm/generator/index.js +12 -6
  113. package/dist/esm/generator/index.js.map +1 -1
  114. package/dist/esm/generator/reexport.d.ts +28 -0
  115. package/dist/esm/generator/reexport.d.ts.map +1 -0
  116. package/dist/esm/generator/reexport.js +124 -0
  117. package/dist/esm/generator/reexport.js.map +1 -0
  118. package/dist/esm/generator/scanner.d.ts +3 -1
  119. package/dist/esm/generator/scanner.d.ts.map +1 -1
  120. package/dist/esm/generator/scanner.js +75 -20
  121. package/dist/esm/generator/scanner.js.map +1 -1
  122. package/dist/esm/package.json +3 -1
  123. package/dist/esm/vite/index.d.ts +2 -0
  124. package/dist/esm/vite/index.d.ts.map +1 -0
  125. package/dist/esm/vite/index.js +2 -0
  126. package/dist/esm/vite/index.js.map +1 -0
  127. package/dist/esm/vite/plugin.d.ts +33 -0
  128. package/dist/esm/vite/plugin.d.ts.map +1 -0
  129. package/dist/esm/vite/plugin.js +47 -0
  130. package/dist/esm/vite/plugin.js.map +1 -0
  131. package/package.json +26 -4
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.IgnisArtifactsPlugin = void 0;
7
+ const ignis_helpers_1 = require("@venizia/ignis-helpers");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const typescript_1 = __importDefault(require("typescript"));
11
+ const generator_1 = require("../generator");
12
+ const sources_1 = require("./sources");
13
+ /** Serves `ignis:artifacts` - the application's generated index, rendered in memory from the scanner. At run time it is a virtual module (`build.module`); in `Bun.build` it is resolved and loaded (`onResolve`/`onLoad`), so a binary carries the list and never scans. */
14
+ class IgnisArtifactsPlugin {
15
+ static { this.NAME = 'ignis-artifacts'; }
16
+ static { this.VIRTUAL = 'ignis:artifacts'; }
17
+ static { this.EXPORT_NAME = 'GeneratedArtifacts'; }
18
+ /** `@venizia/ignis-boot/auto`, from source or from either dist format - replaced at build time by a static re-export of the virtual module. */
19
+ static { this.AUTO_MODULE = /[\\/](?:@venizia[\\/]ignis-boot|packages[\\/]boot)[\\/](?:dist[\\/](?:esm|cjs)|src)[\\/]bun[\\/]auto\.(?:ts|js)$/; }
20
+ /** A text test for a file worth parsing: `ArtifactGroup.define(`, with any spacing or line break around the dot. */
21
+ static { this.DEFINE_CALL = /ArtifactGroup\s*\.\s*(?:define|application)\s*\(/; }
22
+ static { this.RUNTIME_KEY = Symbol.for('@venizia/ignis-boot:artifacts-runtime-plugin'); }
23
+ static {
24
+ sources_1.ArtifactSources.useScanner({ scanner: generator_1.ArtifactScanner.getInstance() });
25
+ }
26
+ /** The `src` beside the nearest `package.json` at or above `from` (default: the entry module's directory). */
27
+ static defaultRoot(opts = {}) {
28
+ return sources_1.ArtifactSources.packageSource({
29
+ from: opts.from ?? IgnisArtifactsPlugin.entryDirectory(),
30
+ });
31
+ }
32
+ /** The entry module's directory (`Bun.main`), so the root never depends on where the process was started; the working directory only when there is no entry file (`bun -e`, a REPL). */
33
+ static entryDirectory() {
34
+ const entry = sources_1.ArtifactSources.entry();
35
+ return entry ? (0, node_path_1.dirname)(entry) : process.cwd();
36
+ }
37
+ /** The index as module source: every import absolute, since a virtual module has no directory to resolve from. With `entry` in a compiled tree, each class is imported from that tree (`ArtifactSources.runningArtifacts`). */
38
+ static render(opts) {
39
+ const root = (0, node_path_1.resolve)(opts.root);
40
+ if (!(0, node_fs_1.existsSync)(root)) {
41
+ throw (0, ignis_helpers_1.getError)({
42
+ message: `[IgnisArtifactsPlugin] ${(0, node_path_1.dirname)(root)} has no src directory (${root}) | Auto artifacts scan the src beside the package.json of the entry module; pass IgnisArtifactsPlugin.create({ root }), or use ArtifactGroup.application() in the application's own source`,
43
+ });
44
+ }
45
+ const outFile = (0, node_path_1.join)(root, '__ignis_artifacts__.ts');
46
+ const artifacts = sources_1.ArtifactSources.scan({ packageSource: root });
47
+ return generator_1.ArtifactIndexEmitter.render({
48
+ artifacts: opts.entry
49
+ ? sources_1.ArtifactSources.runningArtifacts({ artifacts, from: opts.entry })
50
+ : artifacts,
51
+ outFile,
52
+ exportName: IgnisArtifactsPlugin.EXPORT_NAME,
53
+ command: { root, out: outFile },
54
+ absoluteImports: true,
55
+ });
56
+ }
57
+ /** Rewrites every `ArtifactGroup.define({ folder: '<literal>' })` and `ArtifactGroup.application()` in a source file to carry its classes as `content`, imported by absolute path - a binary then holds each group's list and never scans. A group with no decorated class, or a call the plugin cannot read (an aliased `ArtifactGroup`, a folder that is not a string literal), fails the build. */
58
+ static rewriteGroups(opts) {
59
+ const { filePath, source } = opts;
60
+ const sourceFile = typescript_1.default.createSourceFile(filePath, source, typescript_1.default.ScriptTarget.Latest, true);
61
+ const aliases = new Set();
62
+ for (const statement of sourceFile.statements) {
63
+ const bindings = typescript_1.default.isImportDeclaration(statement)
64
+ ? statement.importClause?.namedBindings
65
+ : undefined;
66
+ for (const element of bindings && typescript_1.default.isNamedImports(bindings) ? bindings.elements : []) {
67
+ if ((element.propertyName ?? element.name).text === 'ArtifactGroup' &&
68
+ element.name.text !== 'ArtifactGroup') {
69
+ aliases.add(element.name.text);
70
+ }
71
+ }
72
+ }
73
+ const edits = [];
74
+ const imports = [];
75
+ let counter = 0;
76
+ const refuse = (node, reason) => {
77
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
78
+ throw (0, ignis_helpers_1.getError)({
79
+ message: `[IgnisArtifactsPlugin] An ArtifactGroup call at ${filePath}:${line + 1} cannot be rewritten | ${reason} - write ArtifactGroup.define({ folder: '<name>' }) or ArtifactGroup.application() with the class imported under its own name`,
80
+ });
81
+ };
82
+ const isCompiled = !generator_1.ArtifactStereotypes.SOURCE_EXTENSION.test(filePath);
83
+ const contentLiteral = (folder, ignore) => {
84
+ const artifacts = sources_1.ArtifactSources.folderArtifacts({ folder, site: filePath, ignore });
85
+ if (artifacts.length === 0) {
86
+ throw (0, ignis_helpers_1.getError)({
87
+ message: `[IgnisArtifactsPlugin] ArtifactGroup '${folder ?? '<application>'}' resolved to no class | ${filePath} - check the folder name and that its classes carry a stereotype decorator`,
88
+ });
89
+ }
90
+ const fields = [];
91
+ for (const { type, field } of generator_1.ArtifactStereotypes.EMIT_ORDER) {
92
+ const locals = artifacts
93
+ .filter(artifact => artifact.type === type)
94
+ .map(artifact => {
95
+ if (isCompiled) {
96
+ return `require(${JSON.stringify(artifact.filePath)}).${artifact.className}`;
97
+ }
98
+ counter += 1;
99
+ const local = `__ignis_group_${counter}`;
100
+ const path = artifact.filePath
101
+ .split(node_path_1.sep)
102
+ .join('/')
103
+ .replace(generator_1.ArtifactStereotypes.SOURCE_EXTENSION, '');
104
+ imports.push(`import { ${artifact.className} as ${local} } from '${path}';`);
105
+ return local;
106
+ });
107
+ if (locals.length > 0) {
108
+ fields.push(`${field}: [${locals.join(', ')}]`);
109
+ }
110
+ }
111
+ return `{ ${fields.join(', ')} }`;
112
+ };
113
+ const visit = (node) => {
114
+ const isGroupCall = typescript_1.default.isCallExpression(node) &&
115
+ typescript_1.default.isPropertyAccessExpression(node.expression) &&
116
+ (typescript_1.default.isIdentifier(node.expression.expression) ||
117
+ typescript_1.default.isPropertyAccessExpression(node.expression.expression)) &&
118
+ (node.expression.name.text === 'define' || node.expression.name.text === 'application');
119
+ if (!isGroupCall) {
120
+ typescript_1.default.forEachChild(node, visit);
121
+ return;
122
+ }
123
+ const call = node;
124
+ const access = call.expression;
125
+ const target = access.expression;
126
+ const callee = typescript_1.default.isIdentifier(target)
127
+ ? target.text
128
+ : target.name.text;
129
+ const isApplication = access.name.text === 'application';
130
+ if (typescript_1.default.isIdentifier(target) && aliases.has(callee)) {
131
+ refuse(call, `ArtifactGroup is imported as ${callee}`);
132
+ }
133
+ if (callee !== 'ArtifactGroup') {
134
+ typescript_1.default.forEachChild(node, visit);
135
+ return;
136
+ }
137
+ const [argument] = call.arguments;
138
+ if (isApplication && !argument) {
139
+ edits.push({ at: call.arguments.pos, text: `{ content: ${contentLiteral(undefined)} }` });
140
+ return;
141
+ }
142
+ if (!argument || !typescript_1.default.isObjectLiteralExpression(argument)) {
143
+ refuse(call, 'the argument is not an object literal');
144
+ }
145
+ const literal = argument;
146
+ const named = (name) => literal.properties.find(entry => entry.name !== undefined && typescript_1.default.isIdentifier(entry.name) && entry.name.text === name);
147
+ if (named('content')) {
148
+ return;
149
+ }
150
+ const folderProperty = named('folder');
151
+ if (isApplication && folderProperty) {
152
+ refuse(call, 'ArtifactGroup.application() takes no folder');
153
+ }
154
+ const folderLiteral = folderProperty &&
155
+ typescript_1.default.isPropertyAssignment(folderProperty) &&
156
+ typescript_1.default.isStringLiteral(folderProperty.initializer)
157
+ ? folderProperty.initializer.text
158
+ : undefined;
159
+ if (!isApplication && folderLiteral === undefined) {
160
+ refuse(call, 'folder is not a string literal');
161
+ }
162
+ const ignoreProperty = named('ignore');
163
+ const ignoreList = ignoreProperty &&
164
+ typescript_1.default.isPropertyAssignment(ignoreProperty) &&
165
+ typescript_1.default.isArrayLiteralExpression(ignoreProperty.initializer) &&
166
+ ignoreProperty.initializer.elements.every(element => typescript_1.default.isStringLiteral(element))
167
+ ? ignoreProperty.initializer.elements.map(element => element.text)
168
+ : undefined;
169
+ if (ignoreProperty && ignoreList === undefined) {
170
+ refuse(call, 'ignore is not an array of string literals');
171
+ }
172
+ const last = literal.properties[literal.properties.length - 1];
173
+ edits.push({
174
+ at: last ? last.getEnd() : literal.getStart() + 1,
175
+ text: `${last ? ', ' : ''}content: ${contentLiteral(folderLiteral, ignoreList)}`,
176
+ });
177
+ };
178
+ visit(sourceFile);
179
+ let rewritten = source;
180
+ for (const edit of [...edits].sort((left, right) => right.at - left.at)) {
181
+ rewritten = rewritten.slice(0, edit.at) + edit.text + rewritten.slice(edit.at);
182
+ }
183
+ return imports.length > 0 ? `${imports.join('\n')}\n${rewritten}` : rewritten;
184
+ }
185
+ /** The source files that define groups: the application's own `src` and the `src` of each workspace dependency (a dependency whose real path is outside every `node_modules`), found by walking up the `node_modules` chain as Node resolution does. */
186
+ static groupDefinitionFiles(opts) {
187
+ const root = (0, node_path_1.resolve)(opts.root);
188
+ const packageDirectory = (0, node_path_1.dirname)(root);
189
+ const manifestPath = (0, node_path_1.join)(packageDirectory, 'package.json');
190
+ const manifest = (0, node_fs_1.existsSync)(manifestPath) ? JSON.parse((0, node_fs_1.readFileSync)(manifestPath, 'utf8')) : {};
191
+ const names = Object.keys({
192
+ ...manifest.dependencies,
193
+ ...manifest.devDependencies,
194
+ ...manifest.peerDependencies,
195
+ });
196
+ const sources = new Set([root]);
197
+ for (const name of names) {
198
+ let directory = packageDirectory;
199
+ while (true) {
200
+ const linked = (0, node_path_1.join)(directory, 'node_modules', name);
201
+ if ((0, node_fs_1.existsSync)(linked)) {
202
+ const real = (0, node_fs_1.realpathSync)(linked);
203
+ if (!real.split(node_path_1.sep).includes('node_modules') && (0, node_fs_1.existsSync)((0, node_path_1.join)(real, 'src'))) {
204
+ sources.add((0, node_path_1.join)(real, 'src'));
205
+ }
206
+ break;
207
+ }
208
+ const parent = (0, node_path_1.dirname)(directory);
209
+ if (parent === directory) {
210
+ break;
211
+ }
212
+ directory = parent;
213
+ }
214
+ }
215
+ // A package that runs from its compiled tree (`main` in dist) defines its groups there too.
216
+ const trees = [];
217
+ for (const source of sources) {
218
+ if (!(0, node_fs_1.existsSync)(source)) {
219
+ continue;
220
+ }
221
+ trees.push({ directory: source, pattern: generator_1.ArtifactStereotypes.SOURCE_GLOB });
222
+ for (const entry of (0, node_fs_1.readdirSync)((0, node_path_1.dirname)(source), { withFileTypes: true })) {
223
+ if (entry.isDirectory() &&
224
+ !['src', 'node_modules'].includes(entry.name) &&
225
+ !entry.name.startsWith('.')) {
226
+ trees.push({ directory: (0, node_path_1.join)((0, node_path_1.dirname)(source), entry.name), pattern: '**/*.js' });
227
+ }
228
+ }
229
+ }
230
+ const files = [];
231
+ for (const { directory, pattern } of trees) {
232
+ for (const relativePath of (0, node_fs_1.globSync)(pattern, { cwd: directory })) {
233
+ const file = (0, node_path_1.join)(directory, relativePath);
234
+ if (!relativePath.includes('__tests__') &&
235
+ IgnisArtifactsPlugin.DEFINE_CALL.test((0, node_fs_1.readFileSync)(file, 'utf8'))) {
236
+ files.push(file);
237
+ }
238
+ }
239
+ }
240
+ return files;
241
+ }
242
+ /** For `Bun.build({ plugins: [IgnisArtifactsPlugin.create()] })`; `isRuntime` is set by `registerRuntime`, which serves a virtual module instead. `entry` (default: the build's first entrypoint, or `Bun.main` at run time) decides which tree the classes are imported from. */
243
+ static create(opts = {}) {
244
+ const isRuntime = opts.isRuntime ?? false;
245
+ return {
246
+ name: IgnisArtifactsPlugin.NAME,
247
+ setup(build) {
248
+ const [entrypoint] = isRuntime ? [] : build.config.entrypoints;
249
+ const entry = opts.entry ?? (entrypoint ? (0, node_path_1.resolve)(entrypoint) : sources_1.ArtifactSources.entry());
250
+ const root = opts.root ??
251
+ sources_1.ArtifactSources.packageSource({ from: entry ? (0, node_path_1.dirname)(entry) : process.cwd() });
252
+ const contents = () => IgnisArtifactsPlugin.render({ root, entry });
253
+ if (isRuntime) {
254
+ build.module(IgnisArtifactsPlugin.VIRTUAL, () => ({
255
+ contents: contents(),
256
+ loader: 'ts',
257
+ }));
258
+ return;
259
+ }
260
+ const virtualPath = (0, node_path_1.join)((0, node_path_1.resolve)(root), '__ignis_artifacts__.ts');
261
+ build.onResolve({ filter: /^ignis:artifacts$/ }, () => ({ path: virtualPath }));
262
+ build.onLoad({ filter: /__ignis_artifacts__\.ts$/ }, () => ({
263
+ contents: contents(),
264
+ loader: 'ts',
265
+ }));
266
+ const groupFiles = IgnisArtifactsPlugin.groupDefinitionFiles({ root });
267
+ if (groupFiles.length > 0) {
268
+ const escaped = groupFiles.map(file => file.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&'));
269
+ build.onLoad({ filter: new RegExp(`^(?:${escaped.join('|')})$`) }, args => ({
270
+ contents: IgnisArtifactsPlugin.rewriteGroups({
271
+ filePath: args.path,
272
+ source: (0, node_fs_1.readFileSync)(args.path, 'utf8'),
273
+ }),
274
+ loader: args.path.endsWith('.tsx') ? 'tsx' : args.path.endsWith('.ts') ? 'ts' : 'js',
275
+ }));
276
+ }
277
+ // Lazy (a dynamic import on the first resolve) for a server: a library importing this module must not evaluate the app's classes inside its own half-loaded graph. Eager for a browser bundle: a lazily evaluated graph is not tree-shaken, which doubled a measured frontend bundle.
278
+ const isLazy = opts.lazyIndex ?? build.config.target !== 'browser';
279
+ const autoModule = isLazy
280
+ ? `import { AutoArtifactGroup } from './auto-group';\nexport default new AutoArtifactGroup({ resolve: async () => (await import('${IgnisArtifactsPlugin.VIRTUAL}')).${IgnisArtifactsPlugin.EXPORT_NAME} });\n`
281
+ : `import { ${IgnisArtifactsPlugin.EXPORT_NAME} } from '${IgnisArtifactsPlugin.VIRTUAL}';\nimport { AutoArtifactGroup } from './auto-group';\nexport default new AutoArtifactGroup({ content: ${IgnisArtifactsPlugin.EXPORT_NAME} });\n`;
282
+ build.onLoad({ filter: IgnisArtifactsPlugin.AUTO_MODULE }, () => ({
283
+ contents: autoModule,
284
+ loader: 'ts',
285
+ }));
286
+ },
287
+ };
288
+ }
289
+ /** Registers the run-time plugin once per process; a second call is a no-op. */
290
+ static async registerRuntime(opts = {}) {
291
+ if (Reflect.get(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY) === true) {
292
+ return;
293
+ }
294
+ await Bun.plugin(IgnisArtifactsPlugin.create({ ...opts, isRuntime: true }));
295
+ Reflect.set(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY, true);
296
+ }
297
+ }
298
+ exports.IgnisArtifactsPlugin = IgnisArtifactsPlugin;
299
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/bun/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type IScannedArtifact } from '../generator/common';
2
+ /** The scanner's answer for one `src`, kept under the package's `node_modules/.cache` and valid while no `.ts` file under `src`, the package manifest or the lockfile changed - a hit skips TypeScript entirely. */
3
+ export declare class ArtifactScanCache {
4
+ static readonly VERSION = 2;
5
+ static location(opts: {
6
+ root: string;
7
+ }): string;
8
+ /** Path, size and mtime of every `.ts`/`.tsx` under `root`, plus the package manifest and the nearest lockfile (a dependency upgrade can change which decorators count). */
9
+ static fingerprint(opts: {
10
+ root: string;
11
+ }): string;
12
+ /** The cached scan, or `undefined` for a missing, stale or unreadable cache - never an error. */
13
+ static read(opts: {
14
+ root: string;
15
+ }): IScannedArtifact[] | undefined;
16
+ /** Stores a scan; `false` when the cache directory cannot be written (a read-only install), which only costs the next start a scan. */
17
+ static write(opts: {
18
+ root: string;
19
+ artifacts: IScannedArtifact[];
20
+ }): boolean;
21
+ }
22
+ //# sourceMappingURL=scan-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-cache.d.ts","sourceRoot":"","sources":["../../../src/bun/scan-cache.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,oNAAoN;AACpN,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK;IAE5B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAM/C,4KAA4K;IAC5K,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAmClD,iGAAiG;IACjG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,EAAE,GAAG,SAAS;IAqBnE,uIAAuI;IACvI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;KAAE,GAAG,OAAO;CAmB7E"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArtifactScanCache = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_crypto_1 = require("node:crypto");
6
+ const node_path_1 = require("node:path");
7
+ const common_1 = require("../generator/common");
8
+ /** The scanner's answer for one `src`, kept under the package's `node_modules/.cache` and valid while no `.ts` file under `src`, the package manifest or the lockfile changed - a hit skips TypeScript entirely. */
9
+ class ArtifactScanCache {
10
+ static { this.VERSION = 2; }
11
+ static location(opts) {
12
+ const root = (0, node_path_1.resolve)(opts.root);
13
+ const key = (0, node_crypto_1.createHash)('sha1').update(root).digest('hex').slice(0, 16);
14
+ return (0, node_path_1.join)((0, node_path_1.dirname)(root), 'node_modules', '.cache', 'ignis-artifacts', `${key}.json`);
15
+ }
16
+ /** Path, size and mtime of every `.ts`/`.tsx` under `root`, plus the package manifest and the nearest lockfile (a dependency upgrade can change which decorators count). */
17
+ static fingerprint(opts) {
18
+ const root = (0, node_path_1.resolve)(opts.root);
19
+ const entries = [];
20
+ for (const relativePath of (0, node_fs_1.globSync)(common_1.ArtifactStereotypes.SOURCE_GLOB, { cwd: root })) {
21
+ const stats = (0, node_fs_1.statSync)((0, node_path_1.join)(root, relativePath));
22
+ entries.push(`${relativePath}:${stats.size}:${stats.mtimeMs}`);
23
+ }
24
+ entries.sort();
25
+ const extras = [(0, node_path_1.join)((0, node_path_1.dirname)(root), 'package.json')];
26
+ let directory = (0, node_path_1.dirname)(root);
27
+ while (true) {
28
+ const lockfile = ['bun.lock', 'bun.lockb', 'package-lock.json']
29
+ .map(name => (0, node_path_1.join)(directory, name))
30
+ .find(node_fs_1.existsSync);
31
+ if (lockfile) {
32
+ extras.push(lockfile);
33
+ break;
34
+ }
35
+ const parent = (0, node_path_1.dirname)(directory);
36
+ if (parent === directory) {
37
+ break;
38
+ }
39
+ directory = parent;
40
+ }
41
+ for (const file of extras.filter(node_fs_1.existsSync)) {
42
+ const stats = (0, node_fs_1.statSync)(file);
43
+ entries.push(`${file}:${stats.size}:${stats.mtimeMs}`);
44
+ }
45
+ return (0, node_crypto_1.createHash)('sha1')
46
+ .update(`${ArtifactScanCache.VERSION}\n${entries.join('\n')}`)
47
+ .digest('hex');
48
+ }
49
+ /** The cached scan, or `undefined` for a missing, stale or unreadable cache - never an error. */
50
+ static read(opts) {
51
+ const file = ArtifactScanCache.location(opts);
52
+ if (!(0, node_fs_1.existsSync)(file)) {
53
+ return undefined;
54
+ }
55
+ let stored;
56
+ try {
57
+ stored = JSON.parse((0, node_fs_1.readFileSync)(file, 'utf8'));
58
+ }
59
+ catch {
60
+ // A corrupt cache is a miss: the caller scans and rewrites it.
61
+ return undefined;
62
+ }
63
+ if (stored.fingerprint !== ArtifactScanCache.fingerprint(opts) ||
64
+ !Array.isArray(stored.artifacts)) {
65
+ return undefined;
66
+ }
67
+ return stored.artifacts;
68
+ }
69
+ /** Stores a scan; `false` when the cache directory cannot be written (a read-only install), which only costs the next start a scan. */
70
+ static write(opts) {
71
+ const file = ArtifactScanCache.location(opts);
72
+ const temporary = `${file}.${process.pid}.tmp`;
73
+ try {
74
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(file), { recursive: true });
75
+ (0, node_fs_1.writeFileSync)(temporary, JSON.stringify({
76
+ fingerprint: ArtifactScanCache.fingerprint(opts),
77
+ artifacts: opts.artifacts,
78
+ }));
79
+ (0, node_fs_1.renameSync)(temporary, file);
80
+ return true;
81
+ }
82
+ catch {
83
+ // Caching is an optimisation; reporting `false` lets the caller go on with the scan it already has.
84
+ return false;
85
+ }
86
+ }
87
+ }
88
+ exports.ArtifactScanCache = ArtifactScanCache;
89
+ //# sourceMappingURL=scan-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-cache.js","sourceRoot":"","sources":["../../../src/bun/scan-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type IScannedArtifact } from '../generator/common';
2
+ interface IArtifactScanner {
3
+ scanWithReport(opts: {
4
+ root: string;
5
+ followReexports: boolean;
6
+ }): {
7
+ artifacts: IScannedArtifact[];
8
+ };
9
+ }
10
+ /** Where a package's artifacts live: the `src` beside its nearest `package.json`, and the classes under one of its directories. One scan per package per process, served from `ArtifactScanCache` when no source file changed - so this module never loads the scanner (and TypeScript) itself. */
11
+ export declare class ArtifactSources {
12
+ private static readonly scans;
13
+ private static scanner;
14
+ /** Called by the modules that already hold the scanner (the build plugin). */
15
+ static useScanner(opts: {
16
+ scanner: IArtifactScanner;
17
+ }): void;
18
+ /** Loads the scanner - only on a cache miss. A non-static specifier, so a bundle never pulls TypeScript in. */
19
+ static loadScanner(): Promise<void>;
20
+ /** Whether `packageSource` can be listed without the scanner: scanned in this process, or a valid disk cache. */
21
+ static isCached(opts: {
22
+ packageSource: string;
23
+ }): boolean;
24
+ /** Every decorated class under `packageSource`: this process's scan, else the disk cache, else the scanner (which must be loaded), written back to the cache. */
25
+ static scan(opts: {
26
+ packageSource: string;
27
+ }): IScannedArtifact[];
28
+ /** The entry module (`Bun.main`), or `undefined` when there is no entry file (`bun -e`, a REPL). */
29
+ static entry(): string | undefined;
30
+ /** The `src` beside the nearest `package.json` at or above `from` (default: the working directory). */
31
+ static packageSource(opts?: {
32
+ from?: string;
33
+ }): string;
34
+ /** The decorated classes under a directory named `folder` in the package whose source holds `site`, less those under an `ignore` glob (relative to `src`), each pointing at the copy that runs beside `site` (see `runningArtifacts`). */
35
+ static folderArtifacts(opts: {
36
+ folder: string | undefined;
37
+ site: string;
38
+ ignore?: ReadonlyArray<string>;
39
+ }): IScannedArtifact[];
40
+ /** The scanned classes as the code at `from` runs them: unchanged when `from` is in `src`; otherwise each `src/<path>.ts` becomes `<tree>/<path>.js` in the compiled tree `from` sits in (`dist`, `dist/esm`), so an application registers the very class its code uses, never a second copy loaded from `src`. */
41
+ static runningArtifacts(opts: {
42
+ artifacts: IScannedArtifact[];
43
+ from: string;
44
+ }): IScannedArtifact[];
45
+ /** Forgets every cached scan - for a long-lived process that rebuilds (a watch mode). */
46
+ static clear(): void;
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,UAAU,gBAAgB;IACxB,cAAc,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,GAAG;QAChE,SAAS,EAAE,gBAAgB,EAAE,CAAC;KAC/B,CAAC;CACH;AAED,mSAAmS;AACnS,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAyC;IACtE,OAAO,CAAC,MAAM,CAAC,OAAO,CAA+B;IAErD,8EAA8E;IAC9E,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI;IAI5D,+GAA+G;WAClG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IASzC,iHAAiH;IACjH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAWzD,iKAAiK;IACjK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,EAAE;IAmBhE,oGAAoG;IACpG,MAAM,CAAC,KAAK,IAAI,MAAM,GAAG,SAAS;IAIlC,uGAAuG;IACvG,MAAM,CAAC,aAAa,CAAC,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,MAAM;IAa1D,0OAA0O;IAC1O,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;KAChC,GAAG,gBAAgB,EAAE;IAiBtB,mTAAmT;IACnT,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC5B,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,gBAAgB,EAAE;IAiCtB,yFAAyF;IACzF,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArtifactSources = void 0;
4
+ const ignis_helpers_1 = require("@venizia/ignis-helpers");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const common_1 = require("../generator/common");
8
+ const scan_cache_1 = require("./scan-cache");
9
+ /** Where a package's artifacts live: the `src` beside its nearest `package.json`, and the classes under one of its directories. One scan per package per process, served from `ArtifactScanCache` when no source file changed - so this module never loads the scanner (and TypeScript) itself. */
10
+ class ArtifactSources {
11
+ static { this.scans = new Map(); }
12
+ /** Called by the modules that already hold the scanner (the build plugin). */
13
+ static useScanner(opts) {
14
+ ArtifactSources.scanner = opts.scanner;
15
+ }
16
+ /** Loads the scanner - only on a cache miss. A non-static specifier, so a bundle never pulls TypeScript in. */
17
+ static async loadScanner() {
18
+ if (ArtifactSources.scanner) {
19
+ return;
20
+ }
21
+ const generatorModule = '../generator';
22
+ const { ArtifactScanner } = await import(generatorModule);
23
+ ArtifactSources.scanner = ArtifactScanner.getInstance();
24
+ }
25
+ /** Whether `packageSource` can be listed without the scanner: scanned in this process, or a valid disk cache. */
26
+ static isCached(opts) {
27
+ if (ArtifactSources.scans.has(opts.packageSource)) {
28
+ return true;
29
+ }
30
+ const cached = scan_cache_1.ArtifactScanCache.read({ root: opts.packageSource });
31
+ if (cached) {
32
+ ArtifactSources.scans.set(opts.packageSource, cached);
33
+ }
34
+ return cached !== undefined;
35
+ }
36
+ /** Every decorated class under `packageSource`: this process's scan, else the disk cache, else the scanner (which must be loaded), written back to the cache. */
37
+ static scan(opts) {
38
+ const { packageSource } = opts;
39
+ if (ArtifactSources.isCached({ packageSource })) {
40
+ return ArtifactSources.scans.get(packageSource) ?? [];
41
+ }
42
+ if (!ArtifactSources.scanner) {
43
+ throw (0, ignis_helpers_1.getError)({
44
+ message: `[ArtifactSources] ${packageSource} is not cached and the scanner is not loaded | Call ArtifactSources.loadScanner() first`,
45
+ });
46
+ }
47
+ const { artifacts } = ArtifactSources.scanner.scanWithReport({
48
+ root: packageSource,
49
+ followReexports: true,
50
+ });
51
+ ArtifactSources.scans.set(packageSource, artifacts);
52
+ scan_cache_1.ArtifactScanCache.write({ root: packageSource, artifacts });
53
+ return artifacts;
54
+ }
55
+ /** The entry module (`Bun.main`), or `undefined` when there is no entry file (`bun -e`, a REPL). */
56
+ static entry() {
57
+ return typeof Bun !== 'undefined' && (0, node_fs_1.existsSync)(Bun.main) ? Bun.main : undefined;
58
+ }
59
+ /** The `src` beside the nearest `package.json` at or above `from` (default: the working directory). */
60
+ static packageSource(opts = {}) {
61
+ const start = (0, node_path_1.resolve)(opts.from ?? process.cwd());
62
+ let directory = start;
63
+ while (!(0, node_fs_1.existsSync)((0, node_path_1.join)(directory, 'package.json'))) {
64
+ const parent = (0, node_path_1.dirname)(directory);
65
+ if (parent === directory) {
66
+ return (0, node_path_1.join)(start, 'src');
67
+ }
68
+ directory = parent;
69
+ }
70
+ return (0, node_path_1.join)(directory, 'src');
71
+ }
72
+ /** The decorated classes under a directory named `folder` in the package whose source holds `site`, less those under an `ignore` glob (relative to `src`), each pointing at the copy that runs beside `site` (see `runningArtifacts`). */
73
+ static folderArtifacts(opts) {
74
+ const packageSource = ArtifactSources.packageSource({ from: (0, node_path_1.dirname)(opts.site) });
75
+ const artifacts = ArtifactSources.scan({ packageSource });
76
+ const { folder } = opts;
77
+ const ignored = opts.ignore ?? [];
78
+ const picked = artifacts.filter(artifact => {
79
+ const path = (0, node_path_1.relative)(packageSource, artifact.filePath);
80
+ return ((folder === undefined || path.split(node_path_1.sep).slice(0, -1).includes(folder)) &&
81
+ !ignored.some(pattern => (0, node_path_1.matchesGlob)(path, pattern)));
82
+ });
83
+ return ArtifactSources.runningArtifacts({ artifacts: picked, from: opts.site });
84
+ }
85
+ /** The scanned classes as the code at `from` runs them: unchanged when `from` is in `src`; otherwise each `src/<path>.ts` becomes `<tree>/<path>.js` in the compiled tree `from` sits in (`dist`, `dist/esm`), so an application registers the very class its code uses, never a second copy loaded from `src`. */
86
+ static runningArtifacts(opts) {
87
+ const from = (0, node_path_1.resolve)(opts.from);
88
+ const packageSource = ArtifactSources.packageSource({ from: (0, node_path_1.dirname)(from) });
89
+ const [probe] = opts.artifacts;
90
+ if (!probe || from.startsWith(`${packageSource}${node_path_1.sep}`)) {
91
+ return opts.artifacts;
92
+ }
93
+ const packageRoot = (0, node_path_1.dirname)(packageSource);
94
+ const compiledPath = (target) => (0, node_path_1.join)(target.tree, (0, node_path_1.relative)(packageSource, target.artifact.filePath).replace(common_1.ArtifactStereotypes.SOURCE_EXTENSION, '.js'));
95
+ const segments = (0, node_path_1.relative)(packageRoot, (0, node_path_1.dirname)(from)).split(node_path_1.sep);
96
+ const tree = segments
97
+ .map((_segment, index) => (0, node_path_1.join)(packageRoot, ...segments.slice(0, index + 1)))
98
+ .find(candidate => (0, node_fs_1.existsSync)(compiledPath({ tree: candidate, artifact: probe })));
99
+ return opts.artifacts.map(artifact => {
100
+ const compiled = tree ? compiledPath({ tree, artifact }) : undefined;
101
+ if (!compiled || !(0, node_fs_1.existsSync)(compiled)) {
102
+ throw (0, ignis_helpers_1.getError)({
103
+ message: `[ArtifactSources] ${artifact.filePath} has no compiled copy beside ${from} | The package runs from a compiled tree that is older than its src - rebuild it (or run it from src)`,
104
+ });
105
+ }
106
+ return { ...artifact, filePath: compiled };
107
+ });
108
+ }
109
+ /** Forgets every cached scan - for a long-lived process that rebuilds (a watch mode). */
110
+ static clear() {
111
+ ArtifactSources.scans.clear();
112
+ }
113
+ }
114
+ exports.ArtifactSources = ArtifactSources;
115
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"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"}