@venizia/ignis-boot 0.2.1-3 → 0.2.1-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bun/auto-loader.d.ts +5 -1
- package/dist/cjs/bun/auto-loader.d.ts.map +1 -1
- package/dist/cjs/bun/auto-loader.js +37 -0
- package/dist/cjs/bun/auto-loader.js.map +1 -1
- package/dist/cjs/bun/group-resolver.d.ts +1 -1
- package/dist/cjs/bun/group-resolver.d.ts.map +1 -1
- package/dist/cjs/bun/group-resolver.js +8 -2
- package/dist/cjs/bun/group-resolver.js.map +1 -1
- package/dist/cjs/bun/index.d.ts +1 -0
- package/dist/cjs/bun/index.d.ts.map +1 -1
- package/dist/cjs/bun/index.js +1 -0
- package/dist/cjs/bun/index.js.map +1 -1
- package/dist/cjs/bun/plugin.d.ts +4 -2
- package/dist/cjs/bun/plugin.d.ts.map +1 -1
- package/dist/cjs/bun/plugin.js +45 -19
- package/dist/cjs/bun/plugin.js.map +1 -1
- package/dist/cjs/bun/scan-cache.d.ts +22 -0
- package/dist/cjs/bun/scan-cache.d.ts.map +1 -0
- package/dist/cjs/bun/scan-cache.js +88 -0
- package/dist/cjs/bun/scan-cache.js.map +1 -0
- package/dist/cjs/bun/sources.d.ts +34 -3
- package/dist/cjs/bun/sources.d.ts.map +1 -1
- package/dist/cjs/bun/sources.js +78 -19
- package/dist/cjs/bun/sources.js.map +1 -1
- package/dist/esm/bun/auto-loader.d.ts +5 -1
- package/dist/esm/bun/auto-loader.d.ts.map +1 -1
- package/dist/esm/bun/auto-loader.js +37 -0
- package/dist/esm/bun/auto-loader.js.map +1 -1
- package/dist/esm/bun/group-resolver.d.ts +1 -1
- package/dist/esm/bun/group-resolver.d.ts.map +1 -1
- package/dist/esm/bun/group-resolver.js +7 -1
- package/dist/esm/bun/group-resolver.js.map +1 -1
- package/dist/esm/bun/index.d.ts +1 -0
- package/dist/esm/bun/index.d.ts.map +1 -1
- package/dist/esm/bun/index.js +1 -0
- package/dist/esm/bun/index.js.map +1 -1
- package/dist/esm/bun/plugin.d.ts +4 -2
- package/dist/esm/bun/plugin.d.ts.map +1 -1
- package/dist/esm/bun/plugin.js +46 -20
- package/dist/esm/bun/plugin.js.map +1 -1
- package/dist/esm/bun/scan-cache.d.ts +22 -0
- package/dist/esm/bun/scan-cache.d.ts.map +1 -0
- package/dist/esm/bun/scan-cache.js +84 -0
- package/dist/esm/bun/scan-cache.js.map +1 -0
- package/dist/esm/bun/sources.d.ts +34 -3
- package/dist/esm/bun/sources.d.ts.map +1 -1
- package/dist/esm/bun/sources.js +78 -19
- package/dist/esm/bun/sources.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
/** 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. */
|
|
5
|
+
export class ArtifactScanCache {
|
|
6
|
+
static { this.VERSION = 1; }
|
|
7
|
+
static location(opts) {
|
|
8
|
+
const root = resolve(opts.root);
|
|
9
|
+
const key = createHash('sha1').update(root).digest('hex').slice(0, 16);
|
|
10
|
+
return join(dirname(root), 'node_modules', '.cache', 'ignis-artifacts', `${key}.json`);
|
|
11
|
+
}
|
|
12
|
+
/** Path, size and mtime of every `.ts` under `root`, plus the package manifest and the nearest lockfile (a dependency upgrade can change which decorators count). */
|
|
13
|
+
static fingerprint(opts) {
|
|
14
|
+
const root = resolve(opts.root);
|
|
15
|
+
const entries = [];
|
|
16
|
+
for (const relativePath of new Bun.Glob('**/*.ts').scanSync({ cwd: root })) {
|
|
17
|
+
const stats = statSync(join(root, relativePath));
|
|
18
|
+
entries.push(`${relativePath}:${stats.size}:${stats.mtimeMs}`);
|
|
19
|
+
}
|
|
20
|
+
entries.sort();
|
|
21
|
+
const extras = [join(dirname(root), 'package.json')];
|
|
22
|
+
let directory = dirname(root);
|
|
23
|
+
while (true) {
|
|
24
|
+
const lockfile = ['bun.lock', 'bun.lockb', 'package-lock.json']
|
|
25
|
+
.map(name => join(directory, name))
|
|
26
|
+
.find(existsSync);
|
|
27
|
+
if (lockfile) {
|
|
28
|
+
extras.push(lockfile);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
const parent = dirname(directory);
|
|
32
|
+
if (parent === directory) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
directory = parent;
|
|
36
|
+
}
|
|
37
|
+
for (const file of extras.filter(existsSync)) {
|
|
38
|
+
const stats = statSync(file);
|
|
39
|
+
entries.push(`${file}:${stats.size}:${stats.mtimeMs}`);
|
|
40
|
+
}
|
|
41
|
+
return createHash('sha1')
|
|
42
|
+
.update(`${ArtifactScanCache.VERSION}\n${entries.join('\n')}`)
|
|
43
|
+
.digest('hex');
|
|
44
|
+
}
|
|
45
|
+
/** The cached scan, or `undefined` for a missing, stale or unreadable cache - never an error. */
|
|
46
|
+
static read(opts) {
|
|
47
|
+
const file = ArtifactScanCache.location(opts);
|
|
48
|
+
if (!existsSync(file)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
let stored;
|
|
52
|
+
try {
|
|
53
|
+
stored = JSON.parse(readFileSync(file, 'utf8'));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// A corrupt cache is a miss: the caller scans and rewrites it.
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (stored.fingerprint !== ArtifactScanCache.fingerprint(opts) ||
|
|
60
|
+
!Array.isArray(stored.artifacts)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return stored.artifacts;
|
|
64
|
+
}
|
|
65
|
+
/** Stores a scan; `false` when the cache directory cannot be written (a read-only install), which only costs the next start a scan. */
|
|
66
|
+
static write(opts) {
|
|
67
|
+
const file = ArtifactScanCache.location(opts);
|
|
68
|
+
const temporary = `${file}.${process.pid}.tmp`;
|
|
69
|
+
try {
|
|
70
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
71
|
+
writeFileSync(temporary, JSON.stringify({
|
|
72
|
+
fingerprint: ArtifactScanCache.fingerprint(opts),
|
|
73
|
+
artifacts: opts.artifacts,
|
|
74
|
+
}));
|
|
75
|
+
renameSync(temporary, file);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Caching is an optimisation; reporting `false` lets the caller go on with the scan it already has.
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# 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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"}
|
|
@@ -1,17 +1,48 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { IScannedArtifact } from '../generator/common/index.js';
|
|
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. */
|
|
3
11
|
export declare class ArtifactSources {
|
|
4
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;
|
|
5
30
|
/** The `src` beside the nearest `package.json` at or above `from` (default: the working directory). */
|
|
6
31
|
static packageSource(opts?: {
|
|
7
32
|
from?: string;
|
|
8
33
|
}): string;
|
|
9
|
-
/** The decorated classes under a directory named `folder` in the package whose source holds `site
|
|
34
|
+
/** The decorated classes under a directory named `folder` in the package whose source holds `site`, each pointing at the copy that runs beside `site` (see `runningArtifacts`). */
|
|
10
35
|
static folderArtifacts(opts: {
|
|
11
36
|
folder: string | undefined;
|
|
12
37
|
site: string;
|
|
13
38
|
}): IScannedArtifact[];
|
|
39
|
+
/** 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`. */
|
|
40
|
+
static runningArtifacts(opts: {
|
|
41
|
+
artifacts: IScannedArtifact[];
|
|
42
|
+
from: string;
|
|
43
|
+
}): IScannedArtifact[];
|
|
14
44
|
/** Forgets every cached scan - for a long-lived process that rebuilds (a watch mode). */
|
|
15
45
|
static clear(): void;
|
|
16
46
|
}
|
|
47
|
+
export {};
|
|
17
48
|
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,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,mLAAmL;IACnL,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,EAAE;IAe9F,mTAAmT;IACnT,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC5B,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,gBAAgB,EAAE;IA2BtB,yFAAyF;IACzF,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
|
package/dist/esm/bun/sources.js
CHANGED
|
@@ -1,10 +1,57 @@
|
|
|
1
1
|
import { getError } from '@venizia/ignis-helpers';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
|
-
import {
|
|
5
|
-
/** 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. */
|
|
4
|
+
import { ArtifactScanCache } from './scan-cache.js';
|
|
5
|
+
/** 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. */
|
|
6
6
|
export class ArtifactSources {
|
|
7
7
|
static { this.scans = new Map(); }
|
|
8
|
+
/** Called by the modules that already hold the scanner (the build plugin). */
|
|
9
|
+
static useScanner(opts) {
|
|
10
|
+
ArtifactSources.scanner = opts.scanner;
|
|
11
|
+
}
|
|
12
|
+
/** Loads the scanner - only on a cache miss. A non-static specifier, so a bundle never pulls TypeScript in. */
|
|
13
|
+
static async loadScanner() {
|
|
14
|
+
if (ArtifactSources.scanner) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const generatorModule = '../generator';
|
|
18
|
+
const { ArtifactScanner } = await import(generatorModule);
|
|
19
|
+
ArtifactSources.scanner = ArtifactScanner.getInstance();
|
|
20
|
+
}
|
|
21
|
+
/** Whether `packageSource` can be listed without the scanner: scanned in this process, or a valid disk cache. */
|
|
22
|
+
static isCached(opts) {
|
|
23
|
+
if (ArtifactSources.scans.has(opts.packageSource)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
const cached = ArtifactScanCache.read({ root: opts.packageSource });
|
|
27
|
+
if (cached) {
|
|
28
|
+
ArtifactSources.scans.set(opts.packageSource, cached);
|
|
29
|
+
}
|
|
30
|
+
return cached !== undefined;
|
|
31
|
+
}
|
|
32
|
+
/** 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. */
|
|
33
|
+
static scan(opts) {
|
|
34
|
+
const { packageSource } = opts;
|
|
35
|
+
if (ArtifactSources.isCached({ packageSource })) {
|
|
36
|
+
return ArtifactSources.scans.get(packageSource) ?? [];
|
|
37
|
+
}
|
|
38
|
+
if (!ArtifactSources.scanner) {
|
|
39
|
+
throw getError({
|
|
40
|
+
message: `[ArtifactSources] ${packageSource} is not cached and the scanner is not loaded | Call ArtifactSources.loadScanner() first`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const { artifacts } = ArtifactSources.scanner.scanWithReport({
|
|
44
|
+
root: packageSource,
|
|
45
|
+
followReexports: true,
|
|
46
|
+
});
|
|
47
|
+
ArtifactSources.scans.set(packageSource, artifacts);
|
|
48
|
+
ArtifactScanCache.write({ root: packageSource, artifacts });
|
|
49
|
+
return artifacts;
|
|
50
|
+
}
|
|
51
|
+
/** The entry module (`Bun.main`), or `undefined` when there is no entry file (`bun -e`, a REPL). */
|
|
52
|
+
static entry() {
|
|
53
|
+
return typeof Bun !== 'undefined' && existsSync(Bun.main) ? Bun.main : undefined;
|
|
54
|
+
}
|
|
8
55
|
/** The `src` beside the nearest `package.json` at or above `from` (default: the working directory). */
|
|
9
56
|
static packageSource(opts = {}) {
|
|
10
57
|
const start = resolve(opts.from ?? process.cwd());
|
|
@@ -18,27 +65,39 @@ export class ArtifactSources {
|
|
|
18
65
|
}
|
|
19
66
|
return join(directory, 'src');
|
|
20
67
|
}
|
|
21
|
-
/** The decorated classes under a directory named `folder` in the package whose source holds `site
|
|
68
|
+
/** The decorated classes under a directory named `folder` in the package whose source holds `site`, each pointing at the copy that runs beside `site` (see `runningArtifacts`). */
|
|
22
69
|
static folderArtifacts(opts) {
|
|
23
70
|
const packageSource = ArtifactSources.packageSource({ from: dirname(opts.site) });
|
|
24
|
-
|
|
25
|
-
throw getError({
|
|
26
|
-
message: `[ArtifactGroup] '${opts.folder ?? '<application>'}' is defined at ${opts.site}, outside the package source ${packageSource} | A package consumed through dist must ship its groups filled by its own build (IgnisArtifactsPlugin), or be consumed from source`,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
let artifacts = ArtifactSources.scans.get(packageSource);
|
|
30
|
-
if (!artifacts) {
|
|
31
|
-
artifacts = ArtifactScanner.getInstance().scanWithReport({
|
|
32
|
-
root: packageSource,
|
|
33
|
-
followReexports: true,
|
|
34
|
-
}).artifacts;
|
|
35
|
-
ArtifactSources.scans.set(packageSource, artifacts);
|
|
36
|
-
}
|
|
71
|
+
const artifacts = ArtifactSources.scan({ packageSource });
|
|
37
72
|
const { folder } = opts;
|
|
38
|
-
|
|
39
|
-
|
|
73
|
+
const picked = folder === undefined
|
|
74
|
+
? artifacts
|
|
75
|
+
: artifacts.filter(artifact => relative(packageSource, artifact.filePath).split(sep).slice(0, -1).includes(folder));
|
|
76
|
+
return ArtifactSources.runningArtifacts({ artifacts: picked, from: opts.site });
|
|
77
|
+
}
|
|
78
|
+
/** 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`. */
|
|
79
|
+
static runningArtifacts(opts) {
|
|
80
|
+
const from = resolve(opts.from);
|
|
81
|
+
const packageSource = ArtifactSources.packageSource({ from: dirname(from) });
|
|
82
|
+
const [probe] = opts.artifacts;
|
|
83
|
+
if (!probe || from.startsWith(`${packageSource}${sep}`)) {
|
|
84
|
+
return opts.artifacts;
|
|
40
85
|
}
|
|
41
|
-
|
|
86
|
+
const packageRoot = dirname(packageSource);
|
|
87
|
+
const compiledPath = (target) => join(target.tree, relative(packageSource, target.artifact.filePath).replace(/\.ts$/, '.js'));
|
|
88
|
+
const segments = relative(packageRoot, dirname(from)).split(sep);
|
|
89
|
+
const tree = segments
|
|
90
|
+
.map((_segment, index) => join(packageRoot, ...segments.slice(0, index + 1)))
|
|
91
|
+
.find(candidate => existsSync(compiledPath({ tree: candidate, artifact: probe })));
|
|
92
|
+
return opts.artifacts.map(artifact => {
|
|
93
|
+
const compiled = tree ? compiledPath({ tree, artifact }) : undefined;
|
|
94
|
+
if (!compiled || !existsSync(compiled)) {
|
|
95
|
+
throw getError({
|
|
96
|
+
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)`,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return { ...artifact, filePath: compiled };
|
|
100
|
+
});
|
|
42
101
|
}
|
|
43
102
|
/** Forgets every cached scan - for a long-lived process that rebuilds (a watch mode). */
|
|
44
103
|
static clear() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/bun/sources.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venizia/ignis-boot",
|
|
3
|
-
"version": "0.2.1-
|
|
3
|
+
"version": "0.2.1-5",
|
|
4
4
|
"description": "Build-time artifact index generator for IGNIS applications: scans decorated classes with the TypeScript AST and emits one static registration file per package, so bun build --compile sees plain imports.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"artifact-index",
|