@trebired/bundler 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +168 -9
- package/dist/core/build.d.ts.map +1 -1
- package/dist/core/build.js +11 -2
- package/dist/core/build.js.map +1 -1
- package/dist/core/derive-manifest.d.ts +10 -0
- package/dist/core/derive-manifest.d.ts.map +1 -0
- package/dist/core/derive-manifest.js +150 -0
- package/dist/core/derive-manifest.js.map +1 -0
- package/dist/core/discovery-watch.d.ts +9 -0
- package/dist/core/discovery-watch.d.ts.map +1 -0
- package/dist/core/discovery-watch.js +71 -0
- package/dist/core/discovery-watch.js.map +1 -0
- package/dist/core/discovery.d.ts +30 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +257 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/esbuild-options.d.ts +7 -2
- package/dist/core/esbuild-options.d.ts.map +1 -1
- package/dist/core/esbuild-options.js +18 -22
- package/dist/core/esbuild-options.js.map +1 -1
- package/dist/core/manifest.d.ts +15 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +31 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/shared.d.ts +6 -2
- package/dist/core/shared.d.ts.map +1 -1
- package/dist/core/shared.js +14 -2
- package/dist/core/shared.js.map +1 -1
- package/dist/core/watch.d.ts.map +1 -1
- package/dist/core/watch.js +125 -14
- package/dist/core/watch.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/plugins/source-annotations.js +1 -1
- package/dist/plugins/source-annotations.js.map +1 -1
- package/dist/plugins/virtual-entries.d.ts +11 -0
- package/dist/plugins/virtual-entries.d.ts.map +1 -0
- package/dist/plugins/virtual-entries.js +32 -0
- package/dist/plugins/virtual-entries.js.map +1 -0
- package/dist/types.d.ts +58 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,21 @@ All notable changes to `@trebired/bundler` will be documented here.
|
|
|
4
4
|
|
|
5
5
|
This project follows semantic versioning once published.
|
|
6
6
|
|
|
7
|
+
## 0.3.0
|
|
8
|
+
|
|
9
|
+
- Changed inline source annotations from `@trebired/source:` to neutral `source:` comments.
|
|
10
|
+
- Added `virtualEntries` for in-memory generated entry modules.
|
|
11
|
+
- Added `deriveManifest()` for stable entry-centric asset graph derivation from esbuild metafiles.
|
|
12
|
+
- Added watch lifecycle hooks through `onRebuilt()` and `onEntrySetChanged()`.
|
|
13
|
+
- Aligned written manifest output with the same derived manifest graph used by runtime helpers.
|
|
14
|
+
|
|
15
|
+
## 0.2.0
|
|
16
|
+
|
|
17
|
+
- Added built-in entry discovery so the package can walk source directories and generate entry lists itself.
|
|
18
|
+
- Added source-tree watching for discovered entries, including new and removed matching files during watch mode.
|
|
19
|
+
- Added optional manifest writing that records resolved entries and generated outputs.
|
|
20
|
+
- Made `entries` optional when `discover` is configured.
|
|
21
|
+
|
|
7
22
|
## 0.1.0
|
|
8
23
|
|
|
9
24
|
- Added the `bundle()` and `watch()` APIs for fast esbuild-backed bundling.
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Fast bundler wrapper around `esbuild` with SCSS support, watch mode, and inline source path annotations.
|
|
4
4
|
|
|
5
|
-
`@trebired/bundler` is not a full custom bundler. It keeps the package-owned API small and lets `esbuild` do the heavy lifting, while adding logging aligned with other packages published by Trebired, SCSS compilation through `sass-embedded`, config-driven CLI commands, and
|
|
5
|
+
`@trebired/bundler` is not a full custom bundler. It keeps the package-owned API small and lets `esbuild` do the heavy lifting, while adding logging aligned with other packages published by Trebired, SCSS compilation through `sass-embedded`, built-in source walking, config-driven CLI commands, virtual entry modules, derived manifest helpers, and inline source path comments in generated output.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -18,7 +18,13 @@ Use this when:
|
|
|
18
18
|
|
|
19
19
|
- you want a bundling package that fits alongside other packages published by Trebired instead of wiring `esbuild` directly in every project
|
|
20
20
|
- you need one package that handles `tsx`, `jsx`, `ts`, `js`, `scss`, and `css`
|
|
21
|
+
- you want the package to discover entry files by walking your source tree
|
|
22
|
+
- you want in-memory generated entry modules without writing temp files
|
|
21
23
|
- you want watch mode and config-driven CLI commands without building a separate toolchain wrapper
|
|
24
|
+
- you want newly created matching files to join the build without external entry regeneration code
|
|
25
|
+
- you want a manifest describing resolved entries and generated outputs
|
|
26
|
+
- you want a stable helper for turning esbuild metafiles into runtime asset graphs
|
|
27
|
+
- you want rebuild hooks instead of scraping logger text
|
|
22
28
|
- you want generated bundles to optionally include inline comments that point back to the original source file path
|
|
23
29
|
- you want package-owned logs routed through `@trebired/logger-adapter`
|
|
24
30
|
|
|
@@ -39,13 +45,20 @@ If you want a fast bundling wrapper from the Trebired package ecosystem, use thi
|
|
|
39
45
|
import { bundle } from "@trebired/bundler";
|
|
40
46
|
|
|
41
47
|
await bundle({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
discover: {
|
|
49
|
+
dir: "./src",
|
|
50
|
+
include: ["app.tsx", "theme.css"],
|
|
51
|
+
},
|
|
52
|
+
virtualEntries: {
|
|
53
|
+
"entry-server": `
|
|
54
|
+
import { message } from "./src/lib/message";
|
|
55
|
+
export const rendered = message.toUpperCase();
|
|
56
|
+
`,
|
|
45
57
|
},
|
|
46
58
|
outDir: "./dist",
|
|
47
59
|
sourcemap: "external",
|
|
48
60
|
annotateSources: true,
|
|
61
|
+
manifest: true,
|
|
49
62
|
});
|
|
50
63
|
```
|
|
51
64
|
|
|
@@ -57,11 +70,13 @@ Create a config module:
|
|
|
57
70
|
import { defineBundlerConfig } from "@trebired/bundler";
|
|
58
71
|
|
|
59
72
|
export default defineBundlerConfig({
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
discover: {
|
|
74
|
+
dir: "./src/frontend",
|
|
75
|
+
include: ["**/*.tsx", "**/*.scss", "**/*.css"],
|
|
62
76
|
},
|
|
63
77
|
outDir: "./dist",
|
|
64
78
|
annotateSources: true,
|
|
79
|
+
manifest: true,
|
|
65
80
|
});
|
|
66
81
|
```
|
|
67
82
|
|
|
@@ -72,6 +87,113 @@ trebired-bundler build --config ./bundler.config.mjs
|
|
|
72
87
|
trebired-bundler watch --config ./bundler.config.mjs
|
|
73
88
|
```
|
|
74
89
|
|
|
90
|
+
## Discovery And Walking
|
|
91
|
+
|
|
92
|
+
Set `discover` when you want `@trebired/bundler` to walk the source tree and build the entry list itself.
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
await bundle({
|
|
96
|
+
discover: {
|
|
97
|
+
dir: "./src/frontend",
|
|
98
|
+
include: ["**/*.tsx", "global/**/*.scss"],
|
|
99
|
+
exclude: ["**/*.test.tsx"],
|
|
100
|
+
ignoreDirs: ["legacy"],
|
|
101
|
+
namePrefix: "frontend",
|
|
102
|
+
},
|
|
103
|
+
outDir: "./dist",
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The package:
|
|
108
|
+
|
|
109
|
+
- walks the configured directory recursively
|
|
110
|
+
- matches files by extension plus optional include and exclude patterns
|
|
111
|
+
- derives entry names from relative paths
|
|
112
|
+
- rebuilds the entry list during watch mode when matching files are added or removed
|
|
113
|
+
|
|
114
|
+
You can combine manual `entries` with `discover`. If both resolve the same entry name to different files, the build fails so the collision is explicit.
|
|
115
|
+
|
|
116
|
+
## Manifest
|
|
117
|
+
|
|
118
|
+
Set `manifest: true` to write `dist/bundler-manifest.json`, or pass `manifest: { file: "custom-name.json" }` to choose a different path inside `outDir`.
|
|
119
|
+
|
|
120
|
+
The manifest contains:
|
|
121
|
+
|
|
122
|
+
- resolved entries
|
|
123
|
+
- whether each entry came from `manual` config or `discover`
|
|
124
|
+
- generated output files
|
|
125
|
+
|
|
126
|
+
If you want a runtime-friendly asset graph directly in app code, call `deriveManifest()` on the returned `metafile`:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import { bundle, deriveManifest } from "@trebired/bundler";
|
|
130
|
+
|
|
131
|
+
const result = await bundle({
|
|
132
|
+
entries: {
|
|
133
|
+
app: "./src/app.tsx",
|
|
134
|
+
},
|
|
135
|
+
outDir: "./dist",
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const manifest = deriveManifest(result.metafile!, {
|
|
139
|
+
rootDir: process.cwd(),
|
|
140
|
+
outDir: "./dist",
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The helper returns:
|
|
145
|
+
|
|
146
|
+
- `entries`: entry output -> JS/CSS/import graph
|
|
147
|
+
- `chunks`: shared output -> import/CSS graph
|
|
148
|
+
- `allOutputs`: flat normalized output index
|
|
149
|
+
|
|
150
|
+
## Virtual Entries
|
|
151
|
+
|
|
152
|
+
Use `virtualEntries` when you want generated entry modules without writing temporary files:
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
await bundle({
|
|
156
|
+
entries: {
|
|
157
|
+
app: "./src/app.tsx",
|
|
158
|
+
},
|
|
159
|
+
virtualEntries: {
|
|
160
|
+
"entry-server": `
|
|
161
|
+
import { message } from "./src/lib/message";
|
|
162
|
+
export const rendered = message.toUpperCase();
|
|
163
|
+
`,
|
|
164
|
+
"global.client": `
|
|
165
|
+
import "./src/styles/site.scss";
|
|
166
|
+
console.log("global-client");
|
|
167
|
+
`,
|
|
168
|
+
},
|
|
169
|
+
outDir: "./dist",
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Virtual entries are loaded as TypeScript/ESM modules and resolve relative imports from `rootDir`.
|
|
174
|
+
|
|
175
|
+
## Watch Hooks
|
|
176
|
+
|
|
177
|
+
Use watch hooks when app code needs clean lifecycle points after rebuilds:
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
await watch({
|
|
181
|
+
discover: {
|
|
182
|
+
dir: "./src/pages",
|
|
183
|
+
include: ["**/*.tsx"],
|
|
184
|
+
},
|
|
185
|
+
outDir: "./dist",
|
|
186
|
+
async onEntrySetChanged(entries) {
|
|
187
|
+
console.log(entries);
|
|
188
|
+
},
|
|
189
|
+
async onRebuilt(result) {
|
|
190
|
+
console.log(result.outputs);
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
`onEntrySetChanged()` runs only when the resolved entry set changes. `onRebuilt()` runs after a successful rebuild result is assembled.
|
|
196
|
+
|
|
75
197
|
## Source Annotation Comments
|
|
76
198
|
|
|
77
199
|
Set `annotateSources: true` to inject preserved inline comments into bundled output.
|
|
@@ -79,13 +201,13 @@ Set `annotateSources: true` to inject preserved inline comments into bundled out
|
|
|
79
201
|
JavaScript and TypeScript modules are annotated like this:
|
|
80
202
|
|
|
81
203
|
```js
|
|
82
|
-
/*!
|
|
204
|
+
/*! source: src/app.tsx */
|
|
83
205
|
```
|
|
84
206
|
|
|
85
207
|
CSS and SCSS sources are annotated like this:
|
|
86
208
|
|
|
87
209
|
```css
|
|
88
|
-
/*!
|
|
210
|
+
/*! source: src/styles/site.scss */
|
|
89
211
|
```
|
|
90
212
|
|
|
91
213
|
These comments are emitted with project-relative POSIX-style paths so the generated bundle still points back to the original source file that contributed that segment.
|
|
@@ -118,7 +240,23 @@ You can pass:
|
|
|
118
240
|
|
|
119
241
|
```ts
|
|
120
242
|
type BundlerOptions = {
|
|
121
|
-
entries
|
|
243
|
+
entries?: string[] | Record<string, string>;
|
|
244
|
+
discover?: {
|
|
245
|
+
dir: string;
|
|
246
|
+
include?: string[];
|
|
247
|
+
exclude?: string[];
|
|
248
|
+
extensions?: string[];
|
|
249
|
+
ignoreDirs?: string[];
|
|
250
|
+
namePrefix?: string;
|
|
251
|
+
} | Array<{
|
|
252
|
+
dir: string;
|
|
253
|
+
include?: string[];
|
|
254
|
+
exclude?: string[];
|
|
255
|
+
extensions?: string[];
|
|
256
|
+
ignoreDirs?: string[];
|
|
257
|
+
namePrefix?: string;
|
|
258
|
+
}>;
|
|
259
|
+
virtualEntries?: Record<string, string>;
|
|
122
260
|
outDir: string;
|
|
123
261
|
rootDir?: string;
|
|
124
262
|
platform?: "browser" | "node" | "neutral";
|
|
@@ -132,22 +270,43 @@ type BundlerOptions = {
|
|
|
132
270
|
define?: Record<string, string>;
|
|
133
271
|
clean?: boolean;
|
|
134
272
|
annotateSources?: boolean;
|
|
273
|
+
manifest?: boolean | {
|
|
274
|
+
file?: string;
|
|
275
|
+
};
|
|
276
|
+
onRebuilt?: (result: BundlerBuildResult) => void | Promise<void>;
|
|
277
|
+
onEntrySetChanged?: (entries: Record<string, string>) => void | Promise<void>;
|
|
135
278
|
logger?: unknown;
|
|
136
279
|
loggerAdapter?: (logger: unknown, event: unknown) => unknown;
|
|
137
280
|
};
|
|
138
281
|
|
|
139
282
|
declare function bundle(options: BundlerOptions): Promise<{
|
|
283
|
+
entries: Record<string, string>;
|
|
140
284
|
outputs: string[];
|
|
141
285
|
warnings: number;
|
|
142
286
|
metafile?: object;
|
|
287
|
+
manifestPath?: string;
|
|
143
288
|
durationMs: number;
|
|
144
289
|
}>;
|
|
145
290
|
|
|
291
|
+
declare function deriveManifest(
|
|
292
|
+
metafile: object,
|
|
293
|
+
options: {
|
|
294
|
+
rootDir: string;
|
|
295
|
+
outDir: string;
|
|
296
|
+
},
|
|
297
|
+
): {
|
|
298
|
+
entries: Record<string, unknown>;
|
|
299
|
+
chunks: Record<string, unknown>;
|
|
300
|
+
allOutputs: Record<string, unknown>;
|
|
301
|
+
};
|
|
302
|
+
|
|
146
303
|
declare function watch(options: BundlerOptions): Promise<{
|
|
147
304
|
rebuild(): Promise<{
|
|
305
|
+
entries: Record<string, string>;
|
|
148
306
|
outputs: string[];
|
|
149
307
|
warnings: number;
|
|
150
308
|
metafile?: object;
|
|
309
|
+
manifestPath?: string;
|
|
151
310
|
durationMs: number;
|
|
152
311
|
}>;
|
|
153
312
|
dispose(): Promise<void>;
|
package/dist/core/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKtE,iBAAe,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0C1E;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/core/build.js
CHANGED
|
@@ -3,6 +3,7 @@ import { logPackageInitialized } from "@trebired/logger-adapter";
|
|
|
3
3
|
import { BUNDLER_LOG_GROUP, BUNDLER_PACKAGE_NAME } from "../constants.js";
|
|
4
4
|
import { resolveLogger } from "../logging.js";
|
|
5
5
|
import { createEsbuildOptions, normalizeBundlerOptions } from "./esbuild-options.js";
|
|
6
|
+
import { resolveBundlerEntries } from "./discovery.js";
|
|
6
7
|
import { cleanOutDir, formatFailure, logWarnings, toBuildResult } from "./shared.js";
|
|
7
8
|
async function bundle(options) {
|
|
8
9
|
const normalized = normalizeBundlerOptions(options || {});
|
|
@@ -21,9 +22,17 @@ async function bundle(options) {
|
|
|
21
22
|
logger.info("build", "start");
|
|
22
23
|
const startedAt = Date.now();
|
|
23
24
|
try {
|
|
24
|
-
const
|
|
25
|
+
const resolvedEntries = await resolveBundlerEntries(options || {}, normalized.rootDir);
|
|
26
|
+
logger.info("build", `entries :: count=${resolvedEntries.records.length}`);
|
|
27
|
+
const result = await runEsbuild(createEsbuildOptions({
|
|
28
|
+
...normalized,
|
|
29
|
+
entryRecords: resolvedEntries.records,
|
|
30
|
+
}, logger));
|
|
25
31
|
logWarnings(logger, result.warnings);
|
|
26
|
-
const summary = toBuildResult({
|
|
32
|
+
const summary = await toBuildResult({
|
|
33
|
+
entries: resolvedEntries.records,
|
|
34
|
+
manifest: normalized.manifest,
|
|
35
|
+
outDir: normalized.outDir,
|
|
27
36
|
result,
|
|
28
37
|
rootDir: normalized.rootDir,
|
|
29
38
|
startedAt,
|
package/dist/core/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErF,KAAK,UAAU,MAAM,CAAC,OAAuB;IAC3C,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,IAAI,EAAoB,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1E,qBAAqB,CAAC;QACpB,OAAO,EAAE,UAAU,CAAC,aAAa;QACjC,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM,EAAE,oBAAoB;KAC7B,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErF,KAAK,UAAU,MAAM,CAAC,OAAuB;IAC3C,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,IAAI,EAAoB,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1E,qBAAqB,CAAC;QACpB,OAAO,EAAE,UAAU,CAAC,aAAa;QACjC,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM,EAAE,oBAAoB;KAC7B,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,OAAO,IAAI,EAAoB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC;YACnD,GAAG,UAAU;YACb,YAAY,EAAE,eAAe,CAAC,OAAO;SACtC,EAAE,MAAM,CAAC,CAAC,CAAC;QACZ,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;YAClC,OAAO,EAAE,eAAe,CAAC,OAAO;YAChC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM;YACN,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS;SACV,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Metafile } from "esbuild";
|
|
2
|
+
import type { BundlerDerivedManifest } from "../types.js";
|
|
3
|
+
type DeriveManifestOptions = {
|
|
4
|
+
outDir: string;
|
|
5
|
+
rootDir: string;
|
|
6
|
+
};
|
|
7
|
+
declare function deriveManifest(metafile: Metafile, options: DeriveManifestOptions): BundlerDerivedManifest;
|
|
8
|
+
export { deriveManifest };
|
|
9
|
+
export type { DeriveManifestOptions };
|
|
10
|
+
//# sourceMappingURL=derive-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-manifest.d.ts","sourceRoot":"","sources":["../../src/core/derive-manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,KAAK,EACV,sBAAsB,EAKvB,MAAM,aAAa,CAAC;AAIrB,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAmFF,iBAAS,cAAc,CACrB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,qBAAqB,GAC7B,sBAAsB,CA8FxB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { toPosixPath } from "./discovery.js";
|
|
3
|
+
import { VIRTUAL_ENTRY_PREFIX } from "./discovery.js";
|
|
4
|
+
function normalizeFilePath(filePath, rootDir) {
|
|
5
|
+
if (filePath.startsWith(VIRTUAL_ENTRY_PREFIX)) {
|
|
6
|
+
return `virtual:${filePath.slice(VIRTUAL_ENTRY_PREFIX.length)}`;
|
|
7
|
+
}
|
|
8
|
+
const absolute = path.isAbsolute(filePath) ? filePath : path.resolve(rootDir, filePath);
|
|
9
|
+
return toPosixPath(path.relative(rootDir, absolute));
|
|
10
|
+
}
|
|
11
|
+
function normalizeInputPaths(inputs, rootDir) {
|
|
12
|
+
return Object.keys(inputs)
|
|
13
|
+
.map((value) => normalizeFilePath(value, rootDir))
|
|
14
|
+
.sort();
|
|
15
|
+
}
|
|
16
|
+
function normalizeImportedOutputPaths(metafile, outputPath, rootDir) {
|
|
17
|
+
const output = metafile.outputs[outputPath];
|
|
18
|
+
if (!output)
|
|
19
|
+
return [];
|
|
20
|
+
return output.imports
|
|
21
|
+
.filter((item) => !item.external && Boolean(metafile.outputs[item.path]))
|
|
22
|
+
.map((item) => normalizeFilePath(item.path, rootDir))
|
|
23
|
+
.sort();
|
|
24
|
+
}
|
|
25
|
+
function resolveOutputKind(args) {
|
|
26
|
+
if (args.outputValue.entryPoint)
|
|
27
|
+
return "entry";
|
|
28
|
+
if (args.importedOutputs.has(args.outputRel) || /\.(?:[mc]?js)$/i.test(args.outputRel))
|
|
29
|
+
return "chunk";
|
|
30
|
+
return "asset";
|
|
31
|
+
}
|
|
32
|
+
function deriveEntryName(args) {
|
|
33
|
+
if (args.outputValue.entryPoint) {
|
|
34
|
+
const entryRel = normalizeFilePath(args.outputValue.entryPoint, args.rootDir);
|
|
35
|
+
const ext = path.extname(entryRel);
|
|
36
|
+
return toPosixPath(ext ? entryRel.slice(0, -ext.length) : entryRel);
|
|
37
|
+
}
|
|
38
|
+
const absoluteOutDir = path.resolve(args.rootDir, args.outDir);
|
|
39
|
+
const absoluteOutput = path.resolve(args.rootDir, args.entryOutput);
|
|
40
|
+
const relOut = toPosixPath(path.relative(absoluteOutDir, absoluteOutput));
|
|
41
|
+
if (!relOut || relOut.startsWith(".."))
|
|
42
|
+
return undefined;
|
|
43
|
+
const ext = path.extname(relOut);
|
|
44
|
+
return ext ? relOut.slice(0, -ext.length) : relOut;
|
|
45
|
+
}
|
|
46
|
+
function collectReachableOutputs(args) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const stack = [args.outputPath];
|
|
49
|
+
while (stack.length) {
|
|
50
|
+
const current = stack.pop();
|
|
51
|
+
if (seen.has(current))
|
|
52
|
+
continue;
|
|
53
|
+
seen.add(current);
|
|
54
|
+
const currentOutput = args.metafile.outputs[current];
|
|
55
|
+
if (!currentOutput)
|
|
56
|
+
continue;
|
|
57
|
+
for (const imported of currentOutput.imports) {
|
|
58
|
+
if (imported.external || !args.metafile.outputs[imported.path])
|
|
59
|
+
continue;
|
|
60
|
+
stack.push(imported.path);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return Array.from(seen).sort().map((value) => normalizeFilePath(value, args.rootDir));
|
|
64
|
+
}
|
|
65
|
+
function deriveManifest(metafile, options) {
|
|
66
|
+
const outputs = Object.entries(metafile.outputs).sort(([a], [b]) => a.localeCompare(b));
|
|
67
|
+
const importedOutputs = new Set();
|
|
68
|
+
for (const [, output] of outputs) {
|
|
69
|
+
for (const imported of output.imports) {
|
|
70
|
+
if (!imported.external && metafile.outputs[imported.path]) {
|
|
71
|
+
importedOutputs.add(normalizeFilePath(imported.path, options.rootDir));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const entries = {};
|
|
76
|
+
const chunks = {};
|
|
77
|
+
const allOutputs = {};
|
|
78
|
+
for (const [outputPath, outputValue] of outputs) {
|
|
79
|
+
const outputRel = normalizeFilePath(outputPath, options.rootDir);
|
|
80
|
+
const imports = normalizeImportedOutputPaths(metafile, outputPath, options.rootDir);
|
|
81
|
+
const css = outputValue.cssBundle
|
|
82
|
+
? [normalizeFilePath(outputValue.cssBundle, options.rootDir)]
|
|
83
|
+
: outputRel.endsWith(".css")
|
|
84
|
+
? [outputRel]
|
|
85
|
+
: [];
|
|
86
|
+
const outputInfo = {
|
|
87
|
+
output: outputRel,
|
|
88
|
+
kind: resolveOutputKind({
|
|
89
|
+
importedOutputs,
|
|
90
|
+
outputPath,
|
|
91
|
+
outputRel,
|
|
92
|
+
outputValue,
|
|
93
|
+
}),
|
|
94
|
+
entryPoint: outputValue.entryPoint ? normalizeFilePath(outputValue.entryPoint, options.rootDir) : undefined,
|
|
95
|
+
entryName: deriveEntryName({
|
|
96
|
+
entryOutput: outputPath,
|
|
97
|
+
outputValue,
|
|
98
|
+
outDir: options.outDir,
|
|
99
|
+
rootDir: options.rootDir,
|
|
100
|
+
}),
|
|
101
|
+
inputs: normalizeInputPaths(outputValue.inputs, options.rootDir),
|
|
102
|
+
css,
|
|
103
|
+
imports,
|
|
104
|
+
bytes: outputValue.bytes,
|
|
105
|
+
};
|
|
106
|
+
allOutputs[outputRel] = outputInfo;
|
|
107
|
+
}
|
|
108
|
+
for (const [outputPath] of outputs) {
|
|
109
|
+
const outputRel = normalizeFilePath(outputPath, options.rootDir);
|
|
110
|
+
const outputInfo = allOutputs[outputRel];
|
|
111
|
+
if (!outputInfo)
|
|
112
|
+
continue;
|
|
113
|
+
if (outputInfo.kind === "entry") {
|
|
114
|
+
const reachable = collectReachableOutputs({
|
|
115
|
+
metafile,
|
|
116
|
+
outputPath,
|
|
117
|
+
rootDir: options.rootDir,
|
|
118
|
+
});
|
|
119
|
+
const js = reachable.filter((value) => /\.(?:[mc]?js)$/i.test(value));
|
|
120
|
+
const reachableCss = Array.from(new Set(reachable.flatMap((value) => {
|
|
121
|
+
const info = allOutputs[value];
|
|
122
|
+
return info ? info.css : value.endsWith(".css") ? [value] : [];
|
|
123
|
+
}))).sort();
|
|
124
|
+
entries[outputRel] = {
|
|
125
|
+
entryOutput: outputRel,
|
|
126
|
+
entryName: outputInfo.entryName,
|
|
127
|
+
inputs: outputInfo.inputs,
|
|
128
|
+
js,
|
|
129
|
+
css: reachableCss,
|
|
130
|
+
imports: outputInfo.imports,
|
|
131
|
+
};
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (outputInfo.kind === "chunk") {
|
|
135
|
+
chunks[outputRel] = {
|
|
136
|
+
output: outputRel,
|
|
137
|
+
inputs: outputInfo.inputs,
|
|
138
|
+
css: outputInfo.css,
|
|
139
|
+
imports: outputInfo.imports,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
entries: Object.fromEntries(Object.entries(entries).sort(([a], [b]) => a.localeCompare(b))),
|
|
145
|
+
chunks: Object.fromEntries(Object.entries(chunks).sort(([a], [b]) => a.localeCompare(b))),
|
|
146
|
+
allOutputs: Object.fromEntries(Object.entries(allOutputs).sort(([a], [b]) => a.localeCompare(b))),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export { deriveManifest };
|
|
150
|
+
//# sourceMappingURL=derive-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-manifest.js","sourceRoot":"","sources":["../../src/core/derive-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-watch.d.ts","sourceRoot":"","sources":["../../src/core/discovery-watch.ts"],"names":[],"mappings":"AAGA,KAAK,gBAAgB,GAAG;IACtB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,iBAAS,sBAAsB,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,GAAG,gBAAgB,CAqEnB;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
function createDiscoveryWatcher(args) {
|
|
4
|
+
const watchers = new Map();
|
|
5
|
+
let closed = false;
|
|
6
|
+
let timer = null;
|
|
7
|
+
const interval = setInterval(() => {
|
|
8
|
+
for (const dir of args.dirs) {
|
|
9
|
+
refresh(dir);
|
|
10
|
+
}
|
|
11
|
+
emitChange();
|
|
12
|
+
}, 250);
|
|
13
|
+
const emitChange = () => {
|
|
14
|
+
if (closed)
|
|
15
|
+
return;
|
|
16
|
+
if (timer)
|
|
17
|
+
clearTimeout(timer);
|
|
18
|
+
timer = setTimeout(() => {
|
|
19
|
+
timer = null;
|
|
20
|
+
args.onChange();
|
|
21
|
+
}, 80);
|
|
22
|
+
};
|
|
23
|
+
const ensureWatch = (dir) => {
|
|
24
|
+
if (closed || watchers.has(dir) || !fs.existsSync(dir))
|
|
25
|
+
return;
|
|
26
|
+
if (!fs.statSync(dir).isDirectory())
|
|
27
|
+
return;
|
|
28
|
+
const watcher = fs.watch(dir, () => {
|
|
29
|
+
refresh(dir);
|
|
30
|
+
emitChange();
|
|
31
|
+
});
|
|
32
|
+
watcher.on("error", () => {
|
|
33
|
+
watchers.delete(dir);
|
|
34
|
+
});
|
|
35
|
+
watchers.set(dir, watcher);
|
|
36
|
+
};
|
|
37
|
+
const refresh = (startDir) => {
|
|
38
|
+
if (closed || !fs.existsSync(startDir))
|
|
39
|
+
return;
|
|
40
|
+
const stack = [startDir];
|
|
41
|
+
while (stack.length) {
|
|
42
|
+
const current = stack.pop();
|
|
43
|
+
ensureWatch(current);
|
|
44
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
45
|
+
if (!entry.isDirectory())
|
|
46
|
+
continue;
|
|
47
|
+
const child = path.join(current, entry.name);
|
|
48
|
+
if (!watchers.has(child)) {
|
|
49
|
+
stack.push(child);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
for (const dir of args.dirs) {
|
|
55
|
+
refresh(dir);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
close() {
|
|
59
|
+
closed = true;
|
|
60
|
+
clearInterval(interval);
|
|
61
|
+
if (timer)
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
for (const watcher of watchers.values()) {
|
|
64
|
+
watcher.close();
|
|
65
|
+
}
|
|
66
|
+
watchers.clear();
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export { createDiscoveryWatcher };
|
|
71
|
+
//# sourceMappingURL=discovery-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-watch.js","sourceRoot":"","sources":["../../src/core/discovery-watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BundlerEntryRecord, BundlerManifestOptions, BundlerOptions } from "../types.js";
|
|
2
|
+
declare const VIRTUAL_ENTRY_PREFIX = "trebired-virtual:";
|
|
3
|
+
type NormalizedDiscoverOptions = {
|
|
4
|
+
dir: string;
|
|
5
|
+
dirAbs: string;
|
|
6
|
+
exclude: string[];
|
|
7
|
+
extensions: string[];
|
|
8
|
+
ignoreDirs: Set<string>;
|
|
9
|
+
include: string[];
|
|
10
|
+
namePrefix: string;
|
|
11
|
+
};
|
|
12
|
+
type ResolvedEntries = {
|
|
13
|
+
records: BundlerEntryRecord[];
|
|
14
|
+
signature: string;
|
|
15
|
+
};
|
|
16
|
+
type NormalizedManifestOptions = {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
file?: string;
|
|
19
|
+
};
|
|
20
|
+
declare function toPosixPath(value: string): string;
|
|
21
|
+
declare function resolveBundlerEntries(options: BundlerOptions, rootDir: string, settings?: {
|
|
22
|
+
allowEmpty?: boolean;
|
|
23
|
+
}): Promise<ResolvedEntries>;
|
|
24
|
+
declare function toEntryPointMap(records: BundlerEntryRecord[], rootDir: string): Record<string, string>;
|
|
25
|
+
declare function toPublicEntryMap(records: BundlerEntryRecord[], rootDir: string): Record<string, string>;
|
|
26
|
+
declare function normalizeManifestOptions(manifest: BundlerManifestOptions | undefined): NormalizedManifestOptions;
|
|
27
|
+
declare function normalizeDiscoverRoots(rootDir: string, discover: BundlerOptions["discover"]): string[];
|
|
28
|
+
export { normalizeDiscoverRoots, normalizeManifestOptions, resolveBundlerEntries, toPublicEntryMap, toEntryPointMap, toPosixPath, VIRTUAL_ENTRY_PREFIX, };
|
|
29
|
+
export type { NormalizedDiscoverOptions, NormalizedManifestOptions, ResolvedEntries };
|
|
30
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EAEf,MAAM,aAAa,CAAC;AAIrB,QAAA,MAAM,oBAAoB,sBAAsB,CAAC;AAEjD,KAAK,yBAAyB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;AAuMD,iBAAe,qBAAqB,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS/F;AAED,iBAAS,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAShG;AAED,iBAAS,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,GAAG,yBAAyB,CAgBzG;AAED,iBAAS,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAc/F;AAED,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,oBAAoB,GACrB,CAAC;AACF,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,EAAE,CAAC"}
|