@venizia/ignis-boot 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/README.md +17 -4
- package/dist/esm/build-info/resolver.d.ts +2 -2
- package/dist/esm/build-info/resolver.d.ts.map +1 -1
- package/dist/esm/build-info/resolver.js +17 -11
- package/dist/esm/build-info/resolver.js.map +1 -1
- package/dist/esm/bun/plugin.d.ts +1 -1
- package/dist/esm/bun/plugin.d.ts.map +1 -1
- package/dist/esm/bun/plugin.js +2 -2
- package/dist/esm/bun/plugin.js.map +1 -1
- package/dist/esm/clis/artifacts.js +0 -0
- package/package.json +19 -33
- package/dist/cjs/build-info/common/constants.d.ts +0 -12
- package/dist/cjs/build-info/common/constants.d.ts.map +0 -1
- package/dist/cjs/build-info/common/constants.js +0 -32
- package/dist/cjs/build-info/common/constants.js.map +0 -1
- package/dist/cjs/build-info/common/index.d.ts +0 -2
- package/dist/cjs/build-info/common/index.d.ts.map +0 -1
- package/dist/cjs/build-info/common/index.js +0 -18
- package/dist/cjs/build-info/common/index.js.map +0 -1
- package/dist/cjs/build-info/index.d.ts +0 -4
- package/dist/cjs/build-info/index.d.ts.map +0 -1
- package/dist/cjs/build-info/index.js +0 -20
- package/dist/cjs/build-info/index.js.map +0 -1
- package/dist/cjs/build-info/resolver.d.ts +0 -25
- package/dist/cjs/build-info/resolver.d.ts.map +0 -1
- package/dist/cjs/build-info/resolver.js +0 -105
- package/dist/cjs/build-info/resolver.js.map +0 -1
- package/dist/cjs/build-info/stamp.d.ts +0 -22
- package/dist/cjs/build-info/stamp.d.ts.map +0 -1
- package/dist/cjs/build-info/stamp.js +0 -36
- package/dist/cjs/build-info/stamp.js.map +0 -1
- package/dist/cjs/bun/auto-group.d.ts +0 -22
- package/dist/cjs/bun/auto-group.d.ts.map +0 -1
- package/dist/cjs/bun/auto-group.js +0 -51
- package/dist/cjs/bun/auto-group.js.map +0 -1
- package/dist/cjs/bun/auto-loader.d.ts +0 -13
- package/dist/cjs/bun/auto-loader.d.ts.map +0 -1
- package/dist/cjs/bun/auto-loader.js +0 -63
- package/dist/cjs/bun/auto-loader.js.map +0 -1
- package/dist/cjs/bun/auto.d.ts +0 -5
- package/dist/cjs/bun/auto.d.ts.map +0 -1
- package/dist/cjs/bun/auto.js +0 -11
- package/dist/cjs/bun/auto.js.map +0 -1
- package/dist/cjs/bun/group-resolver.d.ts +0 -16
- package/dist/cjs/bun/group-resolver.d.ts.map +0 -1
- package/dist/cjs/bun/group-resolver.js +0 -44
- package/dist/cjs/bun/group-resolver.js.map +0 -1
- package/dist/cjs/bun/index.d.ts +0 -7
- package/dist/cjs/bun/index.d.ts.map +0 -1
- package/dist/cjs/bun/index.js +0 -23
- package/dist/cjs/bun/index.js.map +0 -1
- package/dist/cjs/bun/plugin.d.ts +0 -67
- package/dist/cjs/bun/plugin.d.ts.map +0 -1
- package/dist/cjs/bun/plugin.js +0 -395
- package/dist/cjs/bun/plugin.js.map +0 -1
- package/dist/cjs/bun/scan-cache.d.ts +0 -22
- package/dist/cjs/bun/scan-cache.d.ts.map +0 -1
- package/dist/cjs/bun/scan-cache.js +0 -89
- package/dist/cjs/bun/scan-cache.js.map +0 -1
- package/dist/cjs/bun/sources.d.ts +0 -49
- package/dist/cjs/bun/sources.d.ts.map +0 -1
- package/dist/cjs/bun/sources.js +0 -115
- package/dist/cjs/bun/sources.js.map +0 -1
- package/dist/cjs/clis/artifacts.d.ts +0 -3
- package/dist/cjs/clis/artifacts.d.ts.map +0 -1
- package/dist/cjs/clis/artifacts.js +0 -62
- package/dist/cjs/clis/artifacts.js.map +0 -1
- package/dist/cjs/common/install-quiet-logger.d.ts +0 -2
- package/dist/cjs/common/install-quiet-logger.d.ts.map +0 -1
- package/dist/cjs/common/install-quiet-logger.js +0 -7
- package/dist/cjs/common/install-quiet-logger.js.map +0 -1
- package/dist/cjs/common/quiet-logger.d.ts +0 -18
- package/dist/cjs/common/quiet-logger.d.ts.map +0 -1
- package/dist/cjs/common/quiet-logger.js +0 -46
- package/dist/cjs/common/quiet-logger.js.map +0 -1
- package/dist/cjs/generator/common/constants.d.ts +0 -59
- package/dist/cjs/generator/common/constants.d.ts.map +0 -1
- package/dist/cjs/generator/common/constants.js +0 -102
- package/dist/cjs/generator/common/constants.js.map +0 -1
- package/dist/cjs/generator/common/index.d.ts +0 -3
- package/dist/cjs/generator/common/index.d.ts.map +0 -1
- package/dist/cjs/generator/common/index.js +0 -19
- package/dist/cjs/generator/common/index.js.map +0 -1
- package/dist/cjs/generator/common/types.d.ts +0 -33
- package/dist/cjs/generator/common/types.d.ts.map +0 -1
- package/dist/cjs/generator/common/types.js +0 -3
- package/dist/cjs/generator/common/types.js.map +0 -1
- package/dist/cjs/generator/emitter.d.ts +0 -41
- package/dist/cjs/generator/emitter.d.ts.map +0 -1
- package/dist/cjs/generator/emitter.js +0 -82
- package/dist/cjs/generator/emitter.js.map +0 -1
- package/dist/cjs/generator/index.d.ts +0 -26
- package/dist/cjs/generator/index.d.ts.map +0 -1
- package/dist/cjs/generator/index.js +0 -68
- package/dist/cjs/generator/index.js.map +0 -1
- package/dist/cjs/generator/reexport.d.ts +0 -28
- package/dist/cjs/generator/reexport.d.ts.map +0 -1
- package/dist/cjs/generator/reexport.js +0 -131
- package/dist/cjs/generator/reexport.js.map +0 -1
- package/dist/cjs/generator/scanner.d.ts +0 -26
- package/dist/cjs/generator/scanner.d.ts.map +0 -1
- package/dist/cjs/generator/scanner.js +0 -258
- package/dist/cjs/generator/scanner.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -3
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -19
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/vite/index.d.ts +0 -2
- package/dist/cjs/vite/index.d.ts.map +0 -1
- package/dist/cjs/vite/index.js +0 -18
- package/dist/cjs/vite/index.js.map +0 -1
- package/dist/cjs/vite/plugin.d.ts +0 -29
- package/dist/cjs/vite/plugin.d.ts.map +0 -1
- package/dist/cjs/vite/plugin.js +0 -61
- package/dist/cjs/vite/plugin.js.map +0 -1
package/LICENSE.md
CHANGED
|
@@ -4,7 +4,7 @@ Part of the Ignis Framework - a TypeScript Server Infrastructure built on [Hono]
|
|
|
4
4
|
|
|
5
5
|
## MIT License
|
|
6
6
|
|
|
7
|
-
Copyright (c) 2025
|
|
7
|
+
Copyright (c) 2025 Venizia Co., Ltd.
|
|
8
8
|
|
|
9
9
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
10
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @venizia/ignis-boot
|
|
2
2
|
|
|
3
|
-
Build-time tools for an IGNIS application: `ignis-artifacts` writes one static file that registers your decorated classes, and `BuildInfoStamp` stamps the build. Install it as a devDependency of the application, or as a dependency if production runs the source unbundled.
|
|
3
|
+
Build-time tools for an IGNIS application: `ignis-artifacts` writes one static file that registers your decorated classes (on Bun, `@venizia/ignis-boot/auto` builds the same list in memory at start instead), and `BuildInfoStamp` stamps the build. Install it as a devDependency of the application, or as a dependency if production runs the source unbundled.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -146,9 +146,9 @@ The resolver reads each field from the environment first (first non-blank key wi
|
|
|
146
146
|
|
|
147
147
|
| Binary | File |
|
|
148
148
|
|---|---|
|
|
149
|
-
| `ignis-artifacts` | `dist/
|
|
149
|
+
| `ignis-artifacts` | `dist/esm/clis/artifacts.js` |
|
|
150
150
|
|
|
151
|
-
The package ships
|
|
151
|
+
The package ships ES modules. The programmatic API mirrors the CLI:
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
154
|
import { checkArtifactIndex } from '@venizia/ignis-boot/generator';
|
|
@@ -160,7 +160,7 @@ const { isFresh } = checkArtifactIndex({ root: 'src', out: 'src/generated/artifa
|
|
|
160
160
|
|
|
161
161
|
`dev-configs -> inversion -> {filter, helpers} -> {boot, kernel} -> connectors -> {core-worker, core-server}`. Boot depends on `@venizia/ignis-helpers` only; no IGNIS package depends on boot, so the application declares it.
|
|
162
162
|
|
|
163
|
-
The generated index replaces
|
|
163
|
+
The generated index replaces a run-time scan of the file system at startup.
|
|
164
164
|
|
|
165
165
|
## Links
|
|
166
166
|
|
|
@@ -172,3 +172,16 @@ The generated index replaces the runtime booters IGNIS once took from LoopBack 4
|
|
|
172
172
|
- [Source](https://github.com/VENIZIA-AI/ignis/blob/main/packages/boot)
|
|
173
173
|
|
|
174
174
|
MIT licensed - see [LICENSE.md](./LICENSE.md).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
<p align="center">
|
|
179
|
+
<a href="https://venizia.ai">
|
|
180
|
+
<picture>
|
|
181
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://venizia.ai/assets/logo-white.svg">
|
|
182
|
+
<img src="https://venizia.ai/assets/logo.svg" alt="VENIZIA" height="28">
|
|
183
|
+
</picture>
|
|
184
|
+
</a>
|
|
185
|
+
<br>
|
|
186
|
+
<sub>@venizia/ignis-boot is part of IGNIS, built and maintained by <a href="https://venizia.ai">VENIZIA</a>.</sub>
|
|
187
|
+
</p>
|
|
@@ -15,8 +15,8 @@ export declare class BuildInfoResolver extends BaseHelper {
|
|
|
15
15
|
}): Promise<TBuildInfoRecord>;
|
|
16
16
|
private resolveEnvironmentValue;
|
|
17
17
|
/**
|
|
18
|
-
* `
|
|
19
|
-
*
|
|
18
|
+
* `execFile` runs `git` without a shell, so no argument is ever parsed by one. A nonzero exit and
|
|
19
|
+
* `git` being absent are both a miss, logged and degraded to one field.
|
|
20
20
|
*/
|
|
21
21
|
private resolveGitValue;
|
|
22
22
|
/** `JSON.parse` promises nothing about the shape, so a manifest holding `{ "name": 42 }` must not become a numeric `service`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/build-info/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/build-info/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAYvF;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAoB;IAE5C,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAIjC,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkClE,OAAO,CAAC,uBAAuB;IAW/B;;;OAGG;YACW,eAAe;IA0B7B,iIAAiI;IACjI,OAAO,CAAC,eAAe;CAyBxB"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { BaseHelper } from '@venizia/ignis-helpers';
|
|
2
2
|
import { BuildInfoRegistry } from '@venizia/ignis-helpers/core';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
3
4
|
import { existsSync, readFileSync } from 'node:fs';
|
|
4
5
|
import { resolve } from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
5
7
|
import { BuildInfoEnvironmentKeys } from './common/index.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
6
9
|
/** Length of a short SHA; an env value already shorter is left alone. */
|
|
7
10
|
const COMMIT_LENGTH = 12;
|
|
8
11
|
/**
|
|
@@ -52,24 +55,27 @@ export class BuildInfoResolver extends BaseHelper {
|
|
|
52
55
|
return undefined;
|
|
53
56
|
}
|
|
54
57
|
/**
|
|
55
|
-
* `
|
|
56
|
-
*
|
|
58
|
+
* `execFile` runs `git` without a shell, so no argument is ever parsed by one. A nonzero exit and
|
|
59
|
+
* `git` being absent are both a miss, logged and degraded to one field.
|
|
57
60
|
*/
|
|
58
61
|
async resolveGitValue(opts) {
|
|
59
62
|
const { args, root } = opts;
|
|
60
63
|
try {
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
// stdout while exiting 128, so the exit code decides and stdout alone never does.
|
|
64
|
-
if (result.exitCode !== 0) {
|
|
65
|
-
this.logger.debug('git %s | exit: %d | %s', args.join(' '), result.exitCode, result.stderr.toString().trim());
|
|
66
|
-
return undefined;
|
|
67
|
-
}
|
|
68
|
-
const value = result.stdout.toString().trim();
|
|
64
|
+
const { stdout } = await execFileAsync('git', args, { cwd: root, windowsHide: true });
|
|
65
|
+
const value = stdout.trim();
|
|
69
66
|
return value.length > 0 ? value : undefined;
|
|
70
67
|
}
|
|
71
68
|
catch (error) {
|
|
72
|
-
|
|
69
|
+
// `rev-parse --abbrev-ref HEAD` in a repository with no commit prints the literal `HEAD` on
|
|
70
|
+
// stdout while exiting 128, so the exit code decides and stdout alone never does: a nonzero
|
|
71
|
+
// exit rejects here whatever it printed.
|
|
72
|
+
const { code, stderr } = error;
|
|
73
|
+
if (typeof code === 'number') {
|
|
74
|
+
this.logger.debug('git %s | exit: %d | %s', args.join(' '), code, (stderr ?? '').trim());
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.logger.debug('git %s | unavailable: %s', args.join(' '), error);
|
|
78
|
+
}
|
|
73
79
|
return undefined;
|
|
74
80
|
}
|
|
75
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/build-info/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEpD,yEAAyE;AACzE,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAG/C;QACE,KAAK,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,iBAAiB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAwB;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,kGAAkG;QAClG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;YACvF,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;SAC5E,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,IAAI,IAAI,WAAW;YACrC,OAAO,EACL,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,OAAO,EAAE,CAAC;gBACxE,QAAQ,CAAC,OAAO;gBAChB,WAAW;YACb,MAAM,EACJ,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAC5E,CAAC,EACD,aAAa,CACd;gBACD,SAAS;gBACT,WAAW;YACb,MAAM,EACJ,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,MAAM,EAAE,CAAC;gBACvE,SAAS;gBACT,WAAW;YACb,OAAO,EACL,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,QAAQ,EAAE,CAAC;gBACzE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC3B,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,IAAiC;QAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAAC,IAG7B;QACC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/build-info/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseHelper } from '@venizia/ignis-helpers';\nimport { BuildInfoRegistry, type TBuildInfoRecord } from '@venizia/ignis-helpers/core';\nimport { execFile } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { promisify } from 'node:util';\nimport { BuildInfoEnvironmentKeys } from './common';\n\nconst execFileAsync = promisify(execFile);\n\n/** Length of a short SHA; an env value already shorter is left alone. */\nconst COMMIT_LENGTH = 12;\n\n/**\n * Resolves the stamp: environment first (CI knows the release tag), then `git`, then the\n * manifest. Every miss is logged with its reason and degrades one field to\n * {@link BuildInfoRegistry.UNSPECIFIED} - a Distroless image has no `git` and an exported tarball\n * has no manifest, and a build must not die over a stamp.\n */\nexport class BuildInfoResolver extends BaseHelper {\n private static instance?: BuildInfoResolver;\n\n private constructor() {\n super({ scope: BuildInfoResolver.name });\n }\n\n static getInstance(): BuildInfoResolver {\n return (this.instance ??= new BuildInfoResolver());\n }\n\n async resolve(opts?: { root?: string }): Promise<TBuildInfoRecord> {\n const root = resolve(opts?.root ?? process.cwd());\n const manifest = this.resolveManifest({ root });\n\n // Independent processes; sequencing them would double the latency of the common case for nothing.\n const [gitCommit, gitBranch] = await Promise.all([\n this.resolveGitValue({ args: ['rev-parse', `--short=${COMMIT_LENGTH}`, 'HEAD'], root }),\n this.resolveGitValue({ args: ['rev-parse', '--abbrev-ref', 'HEAD'], root }),\n ]);\n\n const unspecified = BuildInfoRegistry.UNSPECIFIED;\n return {\n service: manifest.name ?? unspecified,\n version:\n this.resolveEnvironmentValue({ keys: BuildInfoEnvironmentKeys.VERSION }) ??\n manifest.version ??\n unspecified,\n commit:\n this.resolveEnvironmentValue({ keys: BuildInfoEnvironmentKeys.COMMIT })?.slice(\n 0,\n COMMIT_LENGTH,\n ) ??\n gitCommit ??\n unspecified,\n branch:\n this.resolveEnvironmentValue({ keys: BuildInfoEnvironmentKeys.BRANCH }) ??\n gitBranch ??\n unspecified,\n builtAt:\n this.resolveEnvironmentValue({ keys: BuildInfoEnvironmentKeys.BUILT_AT }) ??\n new Date().toISOString(),\n };\n }\n\n private resolveEnvironmentValue(opts: { keys: readonly string[] }): string | undefined {\n for (const key of opts.keys) {\n const value = process.env[key];\n if (value !== undefined && value.trim().length > 0) {\n return value.trim();\n }\n }\n\n return undefined;\n }\n\n /**\n * `execFile` runs `git` without a shell, so no argument is ever parsed by one. A nonzero exit and\n * `git` being absent are both a miss, logged and degraded to one field.\n */\n private async resolveGitValue(opts: {\n args: string[];\n root: string;\n }): Promise<string | undefined> {\n const { args, root } = opts;\n\n try {\n const { stdout } = await execFileAsync('git', args, { cwd: root, windowsHide: true });\n const value = stdout.trim();\n return value.length > 0 ? value : undefined;\n } catch (error) {\n // `rev-parse --abbrev-ref HEAD` in a repository with no commit prints the literal `HEAD` on\n // stdout while exiting 128, so the exit code decides and stdout alone never does: a nonzero\n // exit rejects here whatever it printed.\n const { code, stderr } = error as { code?: number | string; stderr?: string };\n\n if (typeof code === 'number') {\n this.logger.debug('git %s | exit: %d | %s', args.join(' '), code, (stderr ?? '').trim());\n } else {\n this.logger.debug('git %s | unavailable: %s', args.join(' '), error);\n }\n\n return undefined;\n }\n }\n\n /** `JSON.parse` promises nothing about the shape, so a manifest holding `{ \"name\": 42 }` must not become a numeric `service`. */\n private resolveManifest(opts: { root: string }): { name?: string; version?: string } {\n const manifest = resolve(opts.root, 'package.json');\n if (!existsSync(manifest)) {\n this.logger.debug('No package.json at %s', opts.root);\n return {};\n }\n\n try {\n const parsed: unknown = JSON.parse(readFileSync(manifest, 'utf8'));\n if (typeof parsed !== 'object' || parsed === null) {\n return {};\n }\n\n const name = 'name' in parsed ? parsed.name : undefined;\n const version = 'version' in parsed ? parsed.version : undefined;\n\n return {\n name: typeof name === 'string' ? name : undefined,\n version: typeof version === 'string' ? version : undefined,\n };\n } catch (error) {\n this.logger.debug('Unreadable package.json at %s | %s', manifest, error);\n return {};\n }\n }\n}\n"]}
|
package/dist/esm/bun/plugin.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare class IgnisArtifactsPlugin {
|
|
|
4
4
|
static readonly NAME = "ignis-artifacts";
|
|
5
5
|
static readonly VIRTUAL = "ignis:artifacts";
|
|
6
6
|
static readonly EXPORT_NAME = "GeneratedArtifacts";
|
|
7
|
-
/** `@venizia/ignis-boot/auto`, from source or from
|
|
7
|
+
/** `@venizia/ignis-boot/auto`, from source or from `dist/esm` - replaced at build time by a static re-export of the virtual module. */
|
|
8
8
|
static readonly AUTO_MODULE: RegExp;
|
|
9
9
|
/** A text test for a file worth parsing: `ArtifactGroup.define(`, with any spacing or line break around the dot. */
|
|
10
10
|
static readonly DEFINE_CALL: RegExp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/bun/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAQrC,6QAA6Q;AAC7Q,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,qBAAqB;IACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,qBAAqB;IAC5C,MAAM,CAAC,QAAQ,CAAC,WAAW,wBAAwB;IAEnD
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/bun/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAQrC,6QAA6Q;AAC7Q,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,qBAAqB;IACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,qBAAqB;IAC5C,MAAM,CAAC,QAAQ,CAAC,WAAW,wBAAwB;IAEnD,uIAAuI;IACvI,MAAM,CAAC,QAAQ,CAAC,WAAW,SACkF;IAE7G,oHAAoH;IACpH,MAAM,CAAC,QAAQ,CAAC,WAAW,SAAsD;IAEjF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA8D;IAMjG,8GAA8G;IAC9G,MAAM,CAAC,WAAW,CAAC,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,MAAM;IAMxD,wLAAwL;IACxL,MAAM,CAAC,cAAc,IAAI,MAAM;IAK/B,+NAA+N;IAC/N,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAoB7D,sYAAsY;IACtY,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAqJxE,sGAAsG;IACtG,MAAM,CAAC,QAAQ,CAAC,SAAS,SACuE;IAEhG,uIAAuI;IACvI,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IA8B7E,2cAA2c;IAC3c,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;KACjC,GAAG,MAAM;IAwBV,2PAA2P;IAC3P,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAwC5B,wPAAwP;IACxP,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IAM7D,kTAAkT;IAClT,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IA4D7D,kRAAkR;IAClR,MAAM,CAAC,MAAM,CACX,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GACrF,SAAS;IAgEZ,gFAAgF;WACnE,eAAe,CAAC,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAO1E"}
|
package/dist/esm/bun/plugin.js
CHANGED
|
@@ -9,8 +9,8 @@ export class IgnisArtifactsPlugin {
|
|
|
9
9
|
static { this.NAME = 'ignis-artifacts'; }
|
|
10
10
|
static { this.VIRTUAL = 'ignis:artifacts'; }
|
|
11
11
|
static { this.EXPORT_NAME = 'GeneratedArtifacts'; }
|
|
12
|
-
/** `@venizia/ignis-boot/auto`, from source or from
|
|
13
|
-
static { this.AUTO_MODULE = /[\\/](?:@venizia[\\/]ignis-boot|packages[\\/]boot)[\\/](?:dist[\\/]
|
|
12
|
+
/** `@venizia/ignis-boot/auto`, from source or from `dist/esm` - replaced at build time by a static re-export of the virtual module. */
|
|
13
|
+
static { this.AUTO_MODULE = /[\\/](?:@venizia[\\/]ignis-boot|packages[\\/]boot)[\\/](?:dist[\\/]esm|src)[\\/]bun[\\/]auto\.(?:ts|js)$/; }
|
|
14
14
|
/** A text test for a file worth parsing: `ArtifactGroup.define(`, with any spacing or line break around the dot. */
|
|
15
15
|
static { this.DEFINE_CALL = /ArtifactGroup\s*\.\s*(?:define|application)\s*\(/; }
|
|
16
16
|
static { this.RUNTIME_KEY = Symbol.for('@venizia/ignis-boot:artifacts-runtime-plugin'); }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/bun/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BunPlugin } from 'bun';\nimport { getError } from '@venizia/ignis-helpers';\nimport { existsSync, globSync, readdirSync, readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport ts from 'typescript';\nimport { ArtifactIndexEmitter, ArtifactScanner, ArtifactStereotypes } from '../generator';\nimport { ArtifactSources } from './sources';\n\n/** 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. */\nexport class IgnisArtifactsPlugin {\n static readonly NAME = 'ignis-artifacts';\n static readonly VIRTUAL = 'ignis:artifacts';\n static readonly EXPORT_NAME = 'GeneratedArtifacts';\n\n /** `@venizia/ignis-boot/auto`, from source or from either dist format - replaced at build time by a static re-export of the virtual module. */\n static readonly AUTO_MODULE =\n /[\\\\/](?:@venizia[\\\\/]ignis-boot|packages[\\\\/]boot)[\\\\/](?:dist[\\\\/](?:esm|cjs)|src)[\\\\/]bun[\\\\/]auto\\.(?:ts|js)$/;\n\n /** A text test for a file worth parsing: `ArtifactGroup.define(`, with any spacing or line break around the dot. */\n static readonly DEFINE_CALL = /ArtifactGroup\\s*\\.\\s*(?:define|application)\\s*\\(/;\n\n private static readonly RUNTIME_KEY = Symbol.for('@venizia/ignis-boot:artifacts-runtime-plugin');\n\n static {\n ArtifactSources.useScanner({ scanner: ArtifactScanner.getInstance() });\n }\n\n /** The `src` beside the nearest `package.json` at or above `from` (default: the entry module's directory). */\n static defaultRoot(opts: { from?: string } = {}): string {\n return ArtifactSources.packageSource({\n from: opts.from ?? IgnisArtifactsPlugin.entryDirectory(),\n });\n }\n\n /** 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). */\n static entryDirectory(): string {\n const entry = ArtifactSources.entry();\n return entry ? dirname(entry) : process.cwd();\n }\n\n /** 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`). */\n static render(opts: { root: string; entry?: string }): string {\n const root = resolve(opts.root);\n if (!existsSync(root)) {\n throw getError({\n message: `[IgnisArtifactsPlugin] ${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`,\n });\n }\n const outFile = join(root, '__ignis_artifacts__.ts');\n const artifacts = ArtifactSources.scan({ packageSource: root });\n return ArtifactIndexEmitter.render({\n artifacts: opts.entry\n ? ArtifactSources.runningArtifacts({ artifacts, from: opts.entry })\n : artifacts,\n outFile,\n exportName: IgnisArtifactsPlugin.EXPORT_NAME,\n command: { root, out: outFile },\n absoluteImports: true,\n });\n }\n\n /** 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. */\n static rewriteGroups(opts: { filePath: string; source: string }): string {\n const { filePath, source } = opts;\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const aliases = new Set<string>();\n for (const statement of sourceFile.statements) {\n const bindings = ts.isImportDeclaration(statement)\n ? statement.importClause?.namedBindings\n : undefined;\n for (const element of bindings && ts.isNamedImports(bindings) ? bindings.elements : []) {\n if (\n (element.propertyName ?? element.name).text === 'ArtifactGroup' &&\n element.name.text !== 'ArtifactGroup'\n ) {\n aliases.add(element.name.text);\n }\n }\n }\n\n const edits: Array<{ at: number; text: string }> = [];\n const imports: string[] = [];\n let counter = 0;\n\n const refuse = (node: ts.Node, reason: string): never => {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n throw getError({\n 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`,\n });\n };\n\n const isCompiled = !ArtifactStereotypes.SOURCE_EXTENSION.test(filePath);\n const contentLiteral = (folder: string | undefined, ignore?: string[]): string => {\n const artifacts = ArtifactSources.folderArtifacts({ folder, site: filePath, ignore });\n if (artifacts.length === 0) {\n throw getError({\n message: `[IgnisArtifactsPlugin] ArtifactGroup '${folder ?? '<application>'}' resolved to no class | ${filePath} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n\n const fields: string[] = [];\n for (const { type, field } of ArtifactStereotypes.EMIT_ORDER) {\n const locals = artifacts\n .filter((artifact) => artifact.type === type)\n .map((artifact) => {\n if (isCompiled) {\n return `require(${JSON.stringify(artifact.filePath)}).${artifact.className}`;\n }\n counter += 1;\n const local = `__ignis_group_${counter}`;\n const path = artifact.filePath\n .split(sep)\n .join('/')\n .replace(ArtifactStereotypes.SOURCE_EXTENSION, '');\n imports.push(`import { ${artifact.className} as ${local} } from '${path}';`);\n return local;\n });\n if (locals.length > 0) {\n fields.push(`${field}: [${locals.join(', ')}]`);\n }\n }\n return `{ ${fields.join(', ')} }`;\n };\n\n const visit = (node: ts.Node): void => {\n const isGroupCall =\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n (ts.isIdentifier(node.expression.expression) ||\n ts.isPropertyAccessExpression(node.expression.expression)) &&\n (node.expression.name.text === 'define' || node.expression.name.text === 'application');\n if (!isGroupCall) {\n ts.forEachChild(node, visit);\n return;\n }\n\n const call = node as ts.CallExpression;\n const access = call.expression as ts.PropertyAccessExpression;\n const target = access.expression;\n const callee = ts.isIdentifier(target)\n ? target.text\n : (target as ts.PropertyAccessExpression).name.text;\n const isApplication = access.name.text === 'application';\n if (ts.isIdentifier(target) && aliases.has(callee)) {\n refuse(call, `ArtifactGroup is imported as ${callee}`);\n }\n if (callee !== 'ArtifactGroup') {\n ts.forEachChild(node, visit);\n return;\n }\n\n const [argument] = call.arguments;\n if (isApplication && !argument) {\n edits.push({ at: call.arguments.pos, text: `{ content: ${contentLiteral(undefined)} }` });\n return;\n }\n if (!argument || !ts.isObjectLiteralExpression(argument)) {\n refuse(call, 'the argument is not an object literal');\n }\n\n const literal = argument as ts.ObjectLiteralExpression;\n const named = (name: string): ts.ObjectLiteralElementLike | undefined =>\n literal.properties.find(\n (entry) =>\n entry.name !== undefined && ts.isIdentifier(entry.name) && entry.name.text === name,\n );\n if (named('content')) {\n return;\n }\n\n const folderProperty = named('folder');\n if (isApplication && folderProperty) {\n refuse(call, 'ArtifactGroup.application() takes no folder');\n }\n const folderLiteral =\n folderProperty &&\n ts.isPropertyAssignment(folderProperty) &&\n ts.isStringLiteral(folderProperty.initializer)\n ? folderProperty.initializer.text\n : undefined;\n if (!isApplication && folderLiteral === undefined) {\n refuse(call, 'folder is not a string literal');\n }\n\n const ignoreProperty = named('ignore');\n const ignoreList =\n ignoreProperty &&\n ts.isPropertyAssignment(ignoreProperty) &&\n ts.isArrayLiteralExpression(ignoreProperty.initializer) &&\n ignoreProperty.initializer.elements.every((element) => ts.isStringLiteral(element))\n ? ignoreProperty.initializer.elements.map((element) => (element as ts.StringLiteral).text)\n : undefined;\n if (ignoreProperty && ignoreList === undefined) {\n refuse(call, 'ignore is not an array of string literals');\n }\n\n const last = literal.properties[literal.properties.length - 1];\n edits.push({\n at: last ? last.getEnd() : literal.getStart() + 1,\n text: `${last ? ', ' : ''}content: ${contentLiteral(folderLiteral, ignoreList)}`,\n });\n };\n visit(sourceFile);\n\n let rewritten = source;\n for (const edit of [...edits].sort((left, right) => right.at - left.at)) {\n rewritten = rewritten.slice(0, edit.at) + edit.text + rewritten.slice(edit.at);\n }\n return imports.length > 0 ? `${imports.join('\\n')}\\n${rewritten}` : rewritten;\n }\n\n /** A text test for a file worth parsing for decorated classes: an IGNIS stereotype decorator call. */\n static readonly DECORATED =\n /@(?:configuration|component|controller|service|repository|datasource|model|injectable)\\s*\\(/;\n\n /** The classes of a source file that carry an IGNIS stereotype decorator (`@service()`, `@repository(...)`, `@injectable(...)`...). */\n static decoratedClasses(opts: { filePath: string; source: string }): string[] {\n const names = new Set([\n ...Object.keys(ArtifactStereotypes.BY_DECORATOR),\n ArtifactStereotypes.ROOT_DECORATOR,\n ]);\n const sourceFile = ts.createSourceFile(\n opts.filePath,\n opts.source,\n ts.ScriptTarget.Latest,\n true,\n );\n const found: string[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isClassDeclaration(node) && node.name) {\n const isDecorated = (ts.getDecorators(node) ?? []).some((decorator) => {\n const expression = ts.isCallExpression(decorator.expression)\n ? decorator.expression.expression\n : decorator.expression;\n return ts.isIdentifier(expression) && names.has(expression.text);\n });\n if (isDecorated) {\n found.push(node.name.text);\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n return found;\n }\n\n /** Opens each named class with `static { Object.defineProperty(this, 'name', ...) }`. Binding keys are built from `Class.name`, and a bundler renames classes - a minifier, or Bun's scope hoisting when a registered class shadows a same-name class it extends (`StockService` becomes `StockService2`). A string literal survives both, and a static block runs before the class's decorators. Only these classes are touched; the rest of the bundle is left alone. */\n static pinClassNames(opts: {\n filePath: string;\n source: string;\n classNames: ReadonlySet<string>;\n }): string {\n const sourceFile = ts.createSourceFile(\n opts.filePath,\n opts.source,\n ts.ScriptTarget.Latest,\n true,\n );\n const positions: Array<{ at: number; name: string }> = [];\n const visit = (node: ts.Node): void => {\n if (ts.isClassDeclaration(node) && node.name && opts.classNames.has(node.name.text)) {\n positions.push({ at: node.members.pos, name: node.name.text });\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n\n let pinned = opts.source;\n for (const { at, name } of positions.sort((left, right) => right.at - left.at)) {\n const block = ` static { Object.defineProperty(this, 'name', { value: ${JSON.stringify(name)} }); }`;\n pinned = pinned.slice(0, at) + block + pinned.slice(at);\n }\n return pinned;\n }\n\n /** The classes whose names a build must pin, by the file the build loads: the app's own (from the tree `entry` runs, see `runningArtifacts`) and those of every package that defines a group the app can borrow (from the tree the group file sits in). */\n static pinnedClasses(opts: {\n root: string;\n groupFiles?: ReadonlyArray<string>;\n entry?: string;\n }): Map<string, Set<string>> {\n const byFile = new Map<string, Set<string>>();\n const add = (artifacts: ReadonlyArray<{ filePath: string; className: string }>): void => {\n for (const { filePath, className } of artifacts) {\n byFile.set(filePath, (byFile.get(filePath) ?? new Set()).add(className));\n }\n };\n const own = ArtifactSources.scan({ packageSource: opts.root });\n add(opts.entry ? ArtifactSources.runningArtifacts({ artifacts: own, from: opts.entry }) : own);\n // Every class carrying an IGNIS decorator in the workspace sources: a class nothing scans (a library that defines no group) is still an injection target, and still renamed by a bundler when its name collides.\n for (const file of IgnisArtifactsPlugin.workspaceSourceFiles({ root: opts.root })) {\n if (!ArtifactStereotypes.SOURCE_EXTENSION.test(file)) {\n continue;\n }\n const source = readFileSync(file, 'utf8');\n if (!IgnisArtifactsPlugin.DECORATED.test(source)) {\n continue;\n }\n add(\n IgnisArtifactsPlugin.decoratedClasses({ filePath: file, source }).map((className) => ({\n filePath: file,\n className,\n })),\n );\n }\n for (const groupFile of opts.groupFiles ?? []) {\n const packageSource = ArtifactSources.packageSource({ from: dirname(groupFile) });\n if (packageSource === opts.root || !existsSync(packageSource)) {\n continue;\n }\n add(\n ArtifactSources.runningArtifacts({\n artifacts: ArtifactSources.scan({ packageSource }),\n from: groupFile,\n }),\n );\n }\n return byFile;\n }\n\n /** 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. */\n static groupDefinitionFiles(opts: { root: string }): string[] {\n return IgnisArtifactsPlugin.workspaceSourceFiles(opts).filter((file) =>\n IgnisArtifactsPlugin.DEFINE_CALL.test(readFileSync(file, 'utf8')),\n );\n }\n\n /** The source files of the application and 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 - plus the compiled trees beside each `src`, for a package that runs from `dist`. Tests excluded. */\n static workspaceSourceFiles(opts: { root: string }): string[] {\n const root = resolve(opts.root);\n const packageDirectory = dirname(root);\n const manifestPath = join(packageDirectory, 'package.json');\n const manifest = existsSync(manifestPath) ? JSON.parse(readFileSync(manifestPath, 'utf8')) : {};\n const names = Object.keys({\n ...manifest.dependencies,\n ...manifest.devDependencies,\n ...manifest.peerDependencies,\n });\n\n const sources = new Set<string>([root]);\n for (const name of names) {\n let directory = packageDirectory;\n while (true) {\n const linked = join(directory, 'node_modules', name);\n if (existsSync(linked)) {\n const real = realpathSync(linked);\n if (!real.split(sep).includes('node_modules') && existsSync(join(real, 'src'))) {\n sources.add(join(real, 'src'));\n }\n break;\n }\n const parent = dirname(directory);\n if (parent === directory) {\n break;\n }\n directory = parent;\n }\n }\n\n // A package that runs from its compiled tree (`main` in dist) defines its groups there too.\n const trees: Array<{ directory: string; pattern: string }> = [];\n for (const source of sources) {\n if (!existsSync(source)) {\n continue;\n }\n trees.push({ directory: source, pattern: ArtifactStereotypes.SOURCE_GLOB });\n for (const entry of readdirSync(dirname(source), { withFileTypes: true })) {\n if (\n entry.isDirectory() &&\n !['src', 'node_modules'].includes(entry.name) &&\n !entry.name.startsWith('.')\n ) {\n trees.push({ directory: join(dirname(source), entry.name), pattern: '**/*.js' });\n }\n }\n }\n\n const files: string[] = [];\n for (const { directory, pattern } of trees) {\n for (const relativePath of globSync(pattern, { cwd: directory })) {\n if (!relativePath.includes('__tests__')) {\n files.push(join(directory, relativePath));\n }\n }\n }\n return files;\n }\n\n /** 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. */\n static create(\n opts: { root?: string; entry?: string; isRuntime?: boolean; lazyIndex?: boolean } = {},\n ): BunPlugin {\n const isRuntime = opts.isRuntime ?? false;\n\n return {\n name: IgnisArtifactsPlugin.NAME,\n setup(build) {\n const [entrypoint] = isRuntime ? [] : build.config.entrypoints;\n const entry = opts.entry ?? (entrypoint ? resolve(entrypoint) : ArtifactSources.entry());\n const root =\n opts.root ??\n ArtifactSources.packageSource({ from: entry ? dirname(entry) : process.cwd() });\n const contents = (): string => IgnisArtifactsPlugin.render({ root, entry });\n\n if (isRuntime) {\n build.module(IgnisArtifactsPlugin.VIRTUAL, () => ({\n contents: contents(),\n loader: 'ts',\n }));\n return;\n }\n\n const virtualPath = join(resolve(root), '__ignis_artifacts__.ts');\n build.onResolve({ filter: /^ignis:artifacts$/ }, () => ({ path: virtualPath }));\n build.onLoad({ filter: /__ignis_artifacts__\\.ts$/ }, () => ({\n contents: contents(),\n loader: 'ts',\n }));\n const groupFiles = IgnisArtifactsPlugin.groupDefinitionFiles({ root });\n const groupFileSet = new Set(groupFiles);\n const pinned = IgnisArtifactsPlugin.pinnedClasses({ root, groupFiles, entry });\n const loaded = [...new Set([...groupFiles, ...pinned.keys()])];\n if (loaded.length > 0) {\n const escaped = loaded.map((file) => file.replace(/[.*+?^${}()|[\\]\\\\/]/g, '\\\\$&'));\n build.onLoad({ filter: new RegExp(`^(?:${escaped.join('|')})$`) }, (args) => {\n const source = readFileSync(args.path, 'utf8');\n const grouped = groupFileSet.has(args.path)\n ? IgnisArtifactsPlugin.rewriteGroups({ filePath: args.path, source })\n : source;\n const classNames = pinned.get(args.path);\n return {\n contents: classNames\n ? IgnisArtifactsPlugin.pinClassNames({\n filePath: args.path,\n source: grouped,\n classNames,\n })\n : grouped,\n loader: args.path.endsWith('.tsx') ? 'tsx' : args.path.endsWith('.ts') ? 'ts' : 'js',\n };\n });\n }\n // 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.\n const isLazy = opts.lazyIndex ?? build.config.target !== 'browser';\n const autoModule = isLazy\n ? `import { AutoArtifactGroup } from './auto-group';\\nexport default new AutoArtifactGroup({ resolve: async () => (await import('${IgnisArtifactsPlugin.VIRTUAL}')).${IgnisArtifactsPlugin.EXPORT_NAME} });\\n`\n : `import { ${IgnisArtifactsPlugin.EXPORT_NAME} } from '${IgnisArtifactsPlugin.VIRTUAL}';\\nimport { AutoArtifactGroup } from './auto-group';\\nexport default new AutoArtifactGroup({ content: ${IgnisArtifactsPlugin.EXPORT_NAME} });\\n`;\n build.onLoad({ filter: IgnisArtifactsPlugin.AUTO_MODULE }, () => ({\n contents: autoModule,\n loader: 'ts',\n }));\n },\n };\n }\n\n /** Registers the run-time plugin once per process; a second call is a no-op. */\n static async registerRuntime(opts: { root?: string } = {}): Promise<void> {\n if (Reflect.get(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY) === true) {\n return;\n }\n await Bun.plugin(IgnisArtifactsPlugin.create({ ...opts, isRuntime: true }));\n Reflect.set(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY, true);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/bun/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BunPlugin } from 'bun';\nimport { getError } from '@venizia/ignis-helpers';\nimport { existsSync, globSync, readdirSync, readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport ts from 'typescript';\nimport { ArtifactIndexEmitter, ArtifactScanner, ArtifactStereotypes } from '../generator';\nimport { ArtifactSources } from './sources';\n\n/** 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. */\nexport class IgnisArtifactsPlugin {\n static readonly NAME = 'ignis-artifacts';\n static readonly VIRTUAL = 'ignis:artifacts';\n static readonly EXPORT_NAME = 'GeneratedArtifacts';\n\n /** `@venizia/ignis-boot/auto`, from source or from `dist/esm` - replaced at build time by a static re-export of the virtual module. */\n static readonly AUTO_MODULE =\n /[\\\\/](?:@venizia[\\\\/]ignis-boot|packages[\\\\/]boot)[\\\\/](?:dist[\\\\/]esm|src)[\\\\/]bun[\\\\/]auto\\.(?:ts|js)$/;\n\n /** A text test for a file worth parsing: `ArtifactGroup.define(`, with any spacing or line break around the dot. */\n static readonly DEFINE_CALL = /ArtifactGroup\\s*\\.\\s*(?:define|application)\\s*\\(/;\n\n private static readonly RUNTIME_KEY = Symbol.for('@venizia/ignis-boot:artifacts-runtime-plugin');\n\n static {\n ArtifactSources.useScanner({ scanner: ArtifactScanner.getInstance() });\n }\n\n /** The `src` beside the nearest `package.json` at or above `from` (default: the entry module's directory). */\n static defaultRoot(opts: { from?: string } = {}): string {\n return ArtifactSources.packageSource({\n from: opts.from ?? IgnisArtifactsPlugin.entryDirectory(),\n });\n }\n\n /** 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). */\n static entryDirectory(): string {\n const entry = ArtifactSources.entry();\n return entry ? dirname(entry) : process.cwd();\n }\n\n /** 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`). */\n static render(opts: { root: string; entry?: string }): string {\n const root = resolve(opts.root);\n if (!existsSync(root)) {\n throw getError({\n message: `[IgnisArtifactsPlugin] ${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`,\n });\n }\n const outFile = join(root, '__ignis_artifacts__.ts');\n const artifacts = ArtifactSources.scan({ packageSource: root });\n return ArtifactIndexEmitter.render({\n artifacts: opts.entry\n ? ArtifactSources.runningArtifacts({ artifacts, from: opts.entry })\n : artifacts,\n outFile,\n exportName: IgnisArtifactsPlugin.EXPORT_NAME,\n command: { root, out: outFile },\n absoluteImports: true,\n });\n }\n\n /** 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. */\n static rewriteGroups(opts: { filePath: string; source: string }): string {\n const { filePath, source } = opts;\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const aliases = new Set<string>();\n for (const statement of sourceFile.statements) {\n const bindings = ts.isImportDeclaration(statement)\n ? statement.importClause?.namedBindings\n : undefined;\n for (const element of bindings && ts.isNamedImports(bindings) ? bindings.elements : []) {\n if (\n (element.propertyName ?? element.name).text === 'ArtifactGroup' &&\n element.name.text !== 'ArtifactGroup'\n ) {\n aliases.add(element.name.text);\n }\n }\n }\n\n const edits: Array<{ at: number; text: string }> = [];\n const imports: string[] = [];\n let counter = 0;\n\n const refuse = (node: ts.Node, reason: string): never => {\n const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n throw getError({\n 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`,\n });\n };\n\n const isCompiled = !ArtifactStereotypes.SOURCE_EXTENSION.test(filePath);\n const contentLiteral = (folder: string | undefined, ignore?: string[]): string => {\n const artifacts = ArtifactSources.folderArtifacts({ folder, site: filePath, ignore });\n if (artifacts.length === 0) {\n throw getError({\n message: `[IgnisArtifactsPlugin] ArtifactGroup '${folder ?? '<application>'}' resolved to no class | ${filePath} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n\n const fields: string[] = [];\n for (const { type, field } of ArtifactStereotypes.EMIT_ORDER) {\n const locals = artifacts\n .filter((artifact) => artifact.type === type)\n .map((artifact) => {\n if (isCompiled) {\n return `require(${JSON.stringify(artifact.filePath)}).${artifact.className}`;\n }\n counter += 1;\n const local = `__ignis_group_${counter}`;\n const path = artifact.filePath\n .split(sep)\n .join('/')\n .replace(ArtifactStereotypes.SOURCE_EXTENSION, '');\n imports.push(`import { ${artifact.className} as ${local} } from '${path}';`);\n return local;\n });\n if (locals.length > 0) {\n fields.push(`${field}: [${locals.join(', ')}]`);\n }\n }\n return `{ ${fields.join(', ')} }`;\n };\n\n const visit = (node: ts.Node): void => {\n const isGroupCall =\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n (ts.isIdentifier(node.expression.expression) ||\n ts.isPropertyAccessExpression(node.expression.expression)) &&\n (node.expression.name.text === 'define' || node.expression.name.text === 'application');\n if (!isGroupCall) {\n ts.forEachChild(node, visit);\n return;\n }\n\n const call = node as ts.CallExpression;\n const access = call.expression as ts.PropertyAccessExpression;\n const target = access.expression;\n const callee = ts.isIdentifier(target)\n ? target.text\n : (target as ts.PropertyAccessExpression).name.text;\n const isApplication = access.name.text === 'application';\n if (ts.isIdentifier(target) && aliases.has(callee)) {\n refuse(call, `ArtifactGroup is imported as ${callee}`);\n }\n if (callee !== 'ArtifactGroup') {\n ts.forEachChild(node, visit);\n return;\n }\n\n const [argument] = call.arguments;\n if (isApplication && !argument) {\n edits.push({ at: call.arguments.pos, text: `{ content: ${contentLiteral(undefined)} }` });\n return;\n }\n if (!argument || !ts.isObjectLiteralExpression(argument)) {\n refuse(call, 'the argument is not an object literal');\n }\n\n const literal = argument as ts.ObjectLiteralExpression;\n const named = (name: string): ts.ObjectLiteralElementLike | undefined =>\n literal.properties.find(\n (entry) =>\n entry.name !== undefined && ts.isIdentifier(entry.name) && entry.name.text === name,\n );\n if (named('content')) {\n return;\n }\n\n const folderProperty = named('folder');\n if (isApplication && folderProperty) {\n refuse(call, 'ArtifactGroup.application() takes no folder');\n }\n const folderLiteral =\n folderProperty &&\n ts.isPropertyAssignment(folderProperty) &&\n ts.isStringLiteral(folderProperty.initializer)\n ? folderProperty.initializer.text\n : undefined;\n if (!isApplication && folderLiteral === undefined) {\n refuse(call, 'folder is not a string literal');\n }\n\n const ignoreProperty = named('ignore');\n const ignoreList =\n ignoreProperty &&\n ts.isPropertyAssignment(ignoreProperty) &&\n ts.isArrayLiteralExpression(ignoreProperty.initializer) &&\n ignoreProperty.initializer.elements.every((element) => ts.isStringLiteral(element))\n ? ignoreProperty.initializer.elements.map((element) => (element as ts.StringLiteral).text)\n : undefined;\n if (ignoreProperty && ignoreList === undefined) {\n refuse(call, 'ignore is not an array of string literals');\n }\n\n const last = literal.properties[literal.properties.length - 1];\n edits.push({\n at: last ? last.getEnd() : literal.getStart() + 1,\n text: `${last ? ', ' : ''}content: ${contentLiteral(folderLiteral, ignoreList)}`,\n });\n };\n visit(sourceFile);\n\n let rewritten = source;\n for (const edit of [...edits].sort((left, right) => right.at - left.at)) {\n rewritten = rewritten.slice(0, edit.at) + edit.text + rewritten.slice(edit.at);\n }\n return imports.length > 0 ? `${imports.join('\\n')}\\n${rewritten}` : rewritten;\n }\n\n /** A text test for a file worth parsing for decorated classes: an IGNIS stereotype decorator call. */\n static readonly DECORATED =\n /@(?:configuration|component|controller|service|repository|datasource|model|injectable)\\s*\\(/;\n\n /** The classes of a source file that carry an IGNIS stereotype decorator (`@service()`, `@repository(...)`, `@injectable(...)`...). */\n static decoratedClasses(opts: { filePath: string; source: string }): string[] {\n const names = new Set([\n ...Object.keys(ArtifactStereotypes.BY_DECORATOR),\n ArtifactStereotypes.ROOT_DECORATOR,\n ]);\n const sourceFile = ts.createSourceFile(\n opts.filePath,\n opts.source,\n ts.ScriptTarget.Latest,\n true,\n );\n const found: string[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isClassDeclaration(node) && node.name) {\n const isDecorated = (ts.getDecorators(node) ?? []).some((decorator) => {\n const expression = ts.isCallExpression(decorator.expression)\n ? decorator.expression.expression\n : decorator.expression;\n return ts.isIdentifier(expression) && names.has(expression.text);\n });\n if (isDecorated) {\n found.push(node.name.text);\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n return found;\n }\n\n /** Opens each named class with `static { Object.defineProperty(this, 'name', ...) }`. Binding keys are built from `Class.name`, and a bundler renames classes - a minifier, or Bun's scope hoisting when a registered class shadows a same-name class it extends (`StockService` becomes `StockService2`). A string literal survives both, and a static block runs before the class's decorators. Only these classes are touched; the rest of the bundle is left alone. */\n static pinClassNames(opts: {\n filePath: string;\n source: string;\n classNames: ReadonlySet<string>;\n }): string {\n const sourceFile = ts.createSourceFile(\n opts.filePath,\n opts.source,\n ts.ScriptTarget.Latest,\n true,\n );\n const positions: Array<{ at: number; name: string }> = [];\n const visit = (node: ts.Node): void => {\n if (ts.isClassDeclaration(node) && node.name && opts.classNames.has(node.name.text)) {\n positions.push({ at: node.members.pos, name: node.name.text });\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n\n let pinned = opts.source;\n for (const { at, name } of positions.sort((left, right) => right.at - left.at)) {\n const block = ` static { Object.defineProperty(this, 'name', { value: ${JSON.stringify(name)} }); }`;\n pinned = pinned.slice(0, at) + block + pinned.slice(at);\n }\n return pinned;\n }\n\n /** The classes whose names a build must pin, by the file the build loads: the app's own (from the tree `entry` runs, see `runningArtifacts`) and those of every package that defines a group the app can borrow (from the tree the group file sits in). */\n static pinnedClasses(opts: {\n root: string;\n groupFiles?: ReadonlyArray<string>;\n entry?: string;\n }): Map<string, Set<string>> {\n const byFile = new Map<string, Set<string>>();\n const add = (artifacts: ReadonlyArray<{ filePath: string; className: string }>): void => {\n for (const { filePath, className } of artifacts) {\n byFile.set(filePath, (byFile.get(filePath) ?? new Set()).add(className));\n }\n };\n const own = ArtifactSources.scan({ packageSource: opts.root });\n add(opts.entry ? ArtifactSources.runningArtifacts({ artifacts: own, from: opts.entry }) : own);\n // Every class carrying an IGNIS decorator in the workspace sources: a class nothing scans (a library that defines no group) is still an injection target, and still renamed by a bundler when its name collides.\n for (const file of IgnisArtifactsPlugin.workspaceSourceFiles({ root: opts.root })) {\n if (!ArtifactStereotypes.SOURCE_EXTENSION.test(file)) {\n continue;\n }\n const source = readFileSync(file, 'utf8');\n if (!IgnisArtifactsPlugin.DECORATED.test(source)) {\n continue;\n }\n add(\n IgnisArtifactsPlugin.decoratedClasses({ filePath: file, source }).map((className) => ({\n filePath: file,\n className,\n })),\n );\n }\n for (const groupFile of opts.groupFiles ?? []) {\n const packageSource = ArtifactSources.packageSource({ from: dirname(groupFile) });\n if (packageSource === opts.root || !existsSync(packageSource)) {\n continue;\n }\n add(\n ArtifactSources.runningArtifacts({\n artifacts: ArtifactSources.scan({ packageSource }),\n from: groupFile,\n }),\n );\n }\n return byFile;\n }\n\n /** 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. */\n static groupDefinitionFiles(opts: { root: string }): string[] {\n return IgnisArtifactsPlugin.workspaceSourceFiles(opts).filter((file) =>\n IgnisArtifactsPlugin.DEFINE_CALL.test(readFileSync(file, 'utf8')),\n );\n }\n\n /** The source files of the application and 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 - plus the compiled trees beside each `src`, for a package that runs from `dist`. Tests excluded. */\n static workspaceSourceFiles(opts: { root: string }): string[] {\n const root = resolve(opts.root);\n const packageDirectory = dirname(root);\n const manifestPath = join(packageDirectory, 'package.json');\n const manifest = existsSync(manifestPath) ? JSON.parse(readFileSync(manifestPath, 'utf8')) : {};\n const names = Object.keys({\n ...manifest.dependencies,\n ...manifest.devDependencies,\n ...manifest.peerDependencies,\n });\n\n const sources = new Set<string>([root]);\n for (const name of names) {\n let directory = packageDirectory;\n while (true) {\n const linked = join(directory, 'node_modules', name);\n if (existsSync(linked)) {\n const real = realpathSync(linked);\n if (!real.split(sep).includes('node_modules') && existsSync(join(real, 'src'))) {\n sources.add(join(real, 'src'));\n }\n break;\n }\n const parent = dirname(directory);\n if (parent === directory) {\n break;\n }\n directory = parent;\n }\n }\n\n // A package that runs from its compiled tree (`main` in dist) defines its groups there too.\n const trees: Array<{ directory: string; pattern: string }> = [];\n for (const source of sources) {\n if (!existsSync(source)) {\n continue;\n }\n trees.push({ directory: source, pattern: ArtifactStereotypes.SOURCE_GLOB });\n for (const entry of readdirSync(dirname(source), { withFileTypes: true })) {\n if (\n entry.isDirectory() &&\n !['src', 'node_modules'].includes(entry.name) &&\n !entry.name.startsWith('.')\n ) {\n trees.push({ directory: join(dirname(source), entry.name), pattern: '**/*.js' });\n }\n }\n }\n\n const files: string[] = [];\n for (const { directory, pattern } of trees) {\n for (const relativePath of globSync(pattern, { cwd: directory })) {\n if (!relativePath.includes('__tests__')) {\n files.push(join(directory, relativePath));\n }\n }\n }\n return files;\n }\n\n /** 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. */\n static create(\n opts: { root?: string; entry?: string; isRuntime?: boolean; lazyIndex?: boolean } = {},\n ): BunPlugin {\n const isRuntime = opts.isRuntime ?? false;\n\n return {\n name: IgnisArtifactsPlugin.NAME,\n setup(build) {\n const [entrypoint] = isRuntime ? [] : build.config.entrypoints;\n const entry = opts.entry ?? (entrypoint ? resolve(entrypoint) : ArtifactSources.entry());\n const root =\n opts.root ??\n ArtifactSources.packageSource({ from: entry ? dirname(entry) : process.cwd() });\n const contents = (): string => IgnisArtifactsPlugin.render({ root, entry });\n\n if (isRuntime) {\n build.module(IgnisArtifactsPlugin.VIRTUAL, () => ({\n contents: contents(),\n loader: 'ts',\n }));\n return;\n }\n\n const virtualPath = join(resolve(root), '__ignis_artifacts__.ts');\n build.onResolve({ filter: /^ignis:artifacts$/ }, () => ({ path: virtualPath }));\n build.onLoad({ filter: /__ignis_artifacts__\\.ts$/ }, () => ({\n contents: contents(),\n loader: 'ts',\n }));\n const groupFiles = IgnisArtifactsPlugin.groupDefinitionFiles({ root });\n const groupFileSet = new Set(groupFiles);\n const pinned = IgnisArtifactsPlugin.pinnedClasses({ root, groupFiles, entry });\n const loaded = [...new Set([...groupFiles, ...pinned.keys()])];\n if (loaded.length > 0) {\n const escaped = loaded.map((file) => file.replace(/[.*+?^${}()|[\\]\\\\/]/g, '\\\\$&'));\n build.onLoad({ filter: new RegExp(`^(?:${escaped.join('|')})$`) }, (args) => {\n const source = readFileSync(args.path, 'utf8');\n const grouped = groupFileSet.has(args.path)\n ? IgnisArtifactsPlugin.rewriteGroups({ filePath: args.path, source })\n : source;\n const classNames = pinned.get(args.path);\n return {\n contents: classNames\n ? IgnisArtifactsPlugin.pinClassNames({\n filePath: args.path,\n source: grouped,\n classNames,\n })\n : grouped,\n loader: args.path.endsWith('.tsx') ? 'tsx' : args.path.endsWith('.ts') ? 'ts' : 'js',\n };\n });\n }\n // 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.\n const isLazy = opts.lazyIndex ?? build.config.target !== 'browser';\n const autoModule = isLazy\n ? `import { AutoArtifactGroup } from './auto-group';\\nexport default new AutoArtifactGroup({ resolve: async () => (await import('${IgnisArtifactsPlugin.VIRTUAL}')).${IgnisArtifactsPlugin.EXPORT_NAME} });\\n`\n : `import { ${IgnisArtifactsPlugin.EXPORT_NAME} } from '${IgnisArtifactsPlugin.VIRTUAL}';\\nimport { AutoArtifactGroup } from './auto-group';\\nexport default new AutoArtifactGroup({ content: ${IgnisArtifactsPlugin.EXPORT_NAME} });\\n`;\n build.onLoad({ filter: IgnisArtifactsPlugin.AUTO_MODULE }, () => ({\n contents: autoModule,\n loader: 'ts',\n }));\n },\n };\n }\n\n /** Registers the run-time plugin once per process; a second call is a no-op. */\n static async registerRuntime(opts: { root?: string } = {}): Promise<void> {\n if (Reflect.get(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY) === true) {\n return;\n }\n await Bun.plugin(IgnisArtifactsPlugin.create({ ...opts, isRuntime: true }));\n Reflect.set(globalThis, IgnisArtifactsPlugin.RUNTIME_KEY, true);\n }\n}\n"]}
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venizia/ignis-boot",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
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",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"directory": "packages/boot"
|
|
31
31
|
},
|
|
32
32
|
"bin": {
|
|
33
|
-
"ignis-artifacts": "./dist/
|
|
33
|
+
"ignis-artifacts": "./dist/esm/clis/artifacts.js"
|
|
34
34
|
},
|
|
35
35
|
"files": [
|
|
36
36
|
"README.md",
|
|
@@ -40,49 +40,35 @@
|
|
|
40
40
|
"!**/*.tsbuildinfo"
|
|
41
41
|
],
|
|
42
42
|
"sideEffects": [
|
|
43
|
-
"./dist/cjs/bun/auto.js",
|
|
44
43
|
"./dist/esm/bun/auto.js"
|
|
45
44
|
],
|
|
46
|
-
"main": "./dist/
|
|
47
|
-
"
|
|
48
|
-
"types": "./dist/cjs/index.d.ts",
|
|
45
|
+
"main": "./dist/esm/index.js",
|
|
46
|
+
"types": "./dist/esm/index.d.ts",
|
|
49
47
|
"exports": {
|
|
50
48
|
".": {
|
|
51
|
-
"types": "./dist/
|
|
52
|
-
"
|
|
53
|
-
"require": "./dist/cjs/index.js",
|
|
54
|
-
"default": "./dist/cjs/index.js"
|
|
49
|
+
"types": "./dist/esm/index.d.ts",
|
|
50
|
+
"default": "./dist/esm/index.js"
|
|
55
51
|
},
|
|
56
52
|
"./package.json": "./package.json",
|
|
57
53
|
"./generator": {
|
|
58
|
-
"types": "./dist/
|
|
59
|
-
"
|
|
60
|
-
"require": "./dist/cjs/generator/index.js",
|
|
61
|
-
"default": "./dist/cjs/generator/index.js"
|
|
54
|
+
"types": "./dist/esm/generator/index.d.ts",
|
|
55
|
+
"default": "./dist/esm/generator/index.js"
|
|
62
56
|
},
|
|
63
57
|
"./bun": {
|
|
64
|
-
"types": "./dist/
|
|
65
|
-
"
|
|
66
|
-
"require": "./dist/cjs/bun/index.js",
|
|
67
|
-
"default": "./dist/cjs/bun/index.js"
|
|
58
|
+
"types": "./dist/esm/bun/index.d.ts",
|
|
59
|
+
"default": "./dist/esm/bun/index.js"
|
|
68
60
|
},
|
|
69
61
|
"./auto": {
|
|
70
|
-
"types": "./dist/
|
|
71
|
-
"
|
|
72
|
-
"require": "./dist/cjs/bun/auto.js",
|
|
73
|
-
"default": "./dist/cjs/bun/auto.js"
|
|
62
|
+
"types": "./dist/esm/bun/auto.d.ts",
|
|
63
|
+
"default": "./dist/esm/bun/auto.js"
|
|
74
64
|
},
|
|
75
65
|
"./vite": {
|
|
76
|
-
"types": "./dist/
|
|
77
|
-
"
|
|
78
|
-
"require": "./dist/cjs/vite/index.js",
|
|
79
|
-
"default": "./dist/cjs/vite/index.js"
|
|
66
|
+
"types": "./dist/esm/vite/index.d.ts",
|
|
67
|
+
"default": "./dist/esm/vite/index.js"
|
|
80
68
|
},
|
|
81
69
|
"./build-info": {
|
|
82
|
-
"types": "./dist/
|
|
83
|
-
"
|
|
84
|
-
"require": "./dist/cjs/build-info/index.js",
|
|
85
|
-
"default": "./dist/cjs/build-info/index.js"
|
|
70
|
+
"types": "./dist/esm/build-info/index.d.ts",
|
|
71
|
+
"default": "./dist/esm/build-info/index.js"
|
|
86
72
|
}
|
|
87
73
|
},
|
|
88
74
|
"publishConfig": {
|
|
@@ -94,12 +80,12 @@
|
|
|
94
80
|
"test": "bun test ./src"
|
|
95
81
|
},
|
|
96
82
|
"dependencies": {
|
|
97
|
-
"@venizia/ignis-helpers": "0.4.
|
|
98
|
-
"@venizia/ignis-inversion": "0.4.
|
|
83
|
+
"@venizia/ignis-helpers": "0.4.4",
|
|
84
|
+
"@venizia/ignis-inversion": "0.4.4"
|
|
99
85
|
},
|
|
100
86
|
"devDependencies": {
|
|
101
87
|
"@types/bun": "^1.4.3",
|
|
102
|
-
"@venizia/dev-configs": "0.4.
|
|
88
|
+
"@venizia/dev-configs": "0.4.4",
|
|
103
89
|
"eslint": "^10.13.0",
|
|
104
90
|
"oxlint": "1.89.0",
|
|
105
91
|
"oxlint-tsgolint": "7.0.2004",
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Each field is spelled differently by every CI provider, and `APP_ENV_*` is what this
|
|
3
|
-
* organisation's pipelines export - so it is read before the generic `APP_BUILD_*` pair and before
|
|
4
|
-
* anything provider-specific. The first key carrying a non-blank value wins.
|
|
5
|
-
*/
|
|
6
|
-
export declare class BuildInfoEnvironmentKeys {
|
|
7
|
-
static readonly VERSION: readonly string[];
|
|
8
|
-
static readonly COMMIT: readonly string[];
|
|
9
|
-
static readonly BRANCH: readonly string[];
|
|
10
|
-
static readonly BUILT_AT: readonly string[];
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/build-info/common/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,wBAAwB;IACnC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAKxC;IAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAMvC;IAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAKvC;IAEF,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAA4C;CACxF"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BuildInfoEnvironmentKeys = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Each field is spelled differently by every CI provider, and `APP_ENV_*` is what this
|
|
6
|
-
* organisation's pipelines export - so it is read before the generic `APP_BUILD_*` pair and before
|
|
7
|
-
* anything provider-specific. The first key carrying a non-blank value wins.
|
|
8
|
-
*/
|
|
9
|
-
class BuildInfoEnvironmentKeys {
|
|
10
|
-
static { this.VERSION = [
|
|
11
|
-
'APP_ENV_BUILD_VERSION',
|
|
12
|
-
'APP_BUILD_VERSION',
|
|
13
|
-
'CI_COMMIT_TAG',
|
|
14
|
-
'GITHUB_REF_NAME',
|
|
15
|
-
]; }
|
|
16
|
-
static { this.COMMIT = [
|
|
17
|
-
'APP_ENV_BUILD_COMMIT_TAG',
|
|
18
|
-
'APP_BUILD_COMMIT',
|
|
19
|
-
'CI_COMMIT_SHA',
|
|
20
|
-
'GITHUB_SHA',
|
|
21
|
-
'COMMIT_SHA',
|
|
22
|
-
]; }
|
|
23
|
-
static { this.BRANCH = [
|
|
24
|
-
'APP_BUILD_BRANCH',
|
|
25
|
-
'CI_COMMIT_REF_NAME',
|
|
26
|
-
'GITHUB_REF_NAME',
|
|
27
|
-
'BRANCH_NAME',
|
|
28
|
-
]; }
|
|
29
|
-
static { this.BUILT_AT = ['APP_ENV_BUILD_DATE', 'APP_BUILD_DATE']; }
|
|
30
|
-
}
|
|
31
|
-
exports.BuildInfoEnvironmentKeys = BuildInfoEnvironmentKeys;
|
|
32
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/build-info/common/constants.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,MAAa,wBAAwB;aACnB,YAAO,GAAsB;QAC3C,uBAAuB;QACvB,mBAAmB;QACnB,eAAe;QACf,iBAAiB;KAClB,CAAC;aAEc,WAAM,GAAsB;QAC1C,0BAA0B;QAC1B,kBAAkB;QAClB,eAAe;QACf,YAAY;QACZ,YAAY;KACb,CAAC;aAEc,WAAM,GAAsB;QAC1C,kBAAkB;QAClB,oBAAoB;QACpB,iBAAiB;QACjB,aAAa;KACd,CAAC;aAEc,aAAQ,GAAsB,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;;AAvBzF,4DAwBC","sourcesContent":["/**\n * Each field is spelled differently by every CI provider, and `APP_ENV_*` is what this\n * organisation's pipelines export - so it is read before the generic `APP_BUILD_*` pair and before\n * anything provider-specific. The first key carrying a non-blank value wins.\n */\nexport class BuildInfoEnvironmentKeys {\n static readonly VERSION: readonly string[] = [\n 'APP_ENV_BUILD_VERSION',\n 'APP_BUILD_VERSION',\n 'CI_COMMIT_TAG',\n 'GITHUB_REF_NAME',\n ];\n\n static readonly COMMIT: readonly string[] = [\n 'APP_ENV_BUILD_COMMIT_TAG',\n 'APP_BUILD_COMMIT',\n 'CI_COMMIT_SHA',\n 'GITHUB_SHA',\n 'COMMIT_SHA',\n ];\n\n static readonly BRANCH: readonly string[] = [\n 'APP_BUILD_BRANCH',\n 'CI_COMMIT_REF_NAME',\n 'GITHUB_REF_NAME',\n 'BRANCH_NAME',\n ];\n\n static readonly BUILT_AT: readonly string[] = ['APP_ENV_BUILD_DATE', 'APP_BUILD_DATE'];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/build-info/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./constants"), exports);
|
|
18
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/build-info/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B","sourcesContent":["export * from './constants';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/build-info/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|