@ttsc/unplugin 0.30.2 → 0.30.3

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.
@@ -1,135 +1,272 @@
1
+ import { watch } from 'chokidar';
1
2
  import fs from 'node:fs';
2
3
  import path from 'node:path';
3
- import { validateGraphInputObservation, pathIdentityKey } from './transform.mjs';
4
+ import { captureWatchInputBaseline, validateGraphInputObservation, watchInputEvidenceMatchesBaseline, pathIdentityKey } from './transform.mjs';
4
5
 
5
6
  /**
6
- * How often each registered Vite-unsafe input is predicate-polled, in
7
- * milliseconds.
7
+ * One filesystem subscription per unique input, shared by all served modules.
8
8
  *
9
- * Polling is the only watch primitive that covers the whole class: the dev
10
- * server's chokidar watcher ignores every `node_modules` directory, which is
11
- * exactly where superseding resolution candidates usually live, and `fs.watch`
12
- * cannot observe a path whose parent directories do not exist yet. One `stat`
13
- * every half second per unavailable path is negligible against a dev server's
14
- * baseline. Rich inputs replay only the predicates the compiler recorded.
9
+ * Vite resolves transform-context addWatchFile as a runtime import, including
10
+ * type-only .server files and non-module plugin assets. Use a separate watcher
11
+ * for compiler inputs, including node_modules, which Vite's watcher ignores.
12
+ * Ordinary files use events after their initial subscription is observed.
13
+ * Missing spellings and directory predicates keep a shared predicate poll.
14
+ * Linked files also share topology checks by directory because retargeting a
15
+ * junction need not emit events on its previously watched descendants.
15
16
  */
16
- const MISSING_INPUT_POLL_INTERVAL = 500;
17
- /** Create an empty missing-input watch for one plugin instance. */
18
- function createViteServeMissingInputWatch() {
17
+ function createViteServeInputWatch() {
19
18
  const entries = new Map();
20
- let poller;
19
+ const importerInputs = new Map();
20
+ const pending = new Set();
21
+ const links = new Map();
21
22
  let server;
22
- const stopPollingIfEmpty = () => {
23
- if (entries.size !== 0 || poller === undefined) {
24
- return;
23
+ let watcher;
24
+ let poller;
25
+ let flushTimer;
26
+ let failed = false;
27
+ const remove = (entry) => {
28
+ entries.delete(entry.file);
29
+ watcher?.unwatch(entry.file);
30
+ for (const file of entry.links) {
31
+ const link = links.get(file);
32
+ link?.inputs.delete(entry);
33
+ if (link?.inputs.size === 0)
34
+ links.delete(file);
25
35
  }
26
- clearInterval(poller);
27
- poller = undefined;
28
36
  };
29
- const poll = () => {
37
+ const check = (selected) => {
30
38
  const importers = new Set();
31
- for (const [identity, entry] of entries) {
32
- if (!viteServeInputWatchConditionChanged(entry)) {
39
+ for (const entry of selected) {
40
+ if (entries.get(entry.file) !== entry)
33
41
  continue;
42
+ let baseline;
43
+ for (const [key, condition] of entry.conditions) {
44
+ const state = condition.evidence?.state;
45
+ let changed;
46
+ if (state?.codec === "predicates") {
47
+ changed =
48
+ validateGraphInputObservation(entry.file, state.observation)
49
+ .length !== 0;
50
+ }
51
+ else {
52
+ baseline ??= captureWatchInputBaseline(entry.file);
53
+ changed =
54
+ baseline === undefined ||
55
+ (condition.evidence?.state !== undefined
56
+ ? !watchInputEvidenceMatchesBaseline(condition.evidence, baseline)
57
+ : JSON.stringify(condition.baseline) !==
58
+ JSON.stringify(baseline));
59
+ }
60
+ if (!changed)
61
+ continue;
62
+ for (const importer of condition.importers)
63
+ importers.add(importer);
64
+ entry.conditions.delete(key);
34
65
  }
35
- entries.delete(identity);
36
- for (const importer of entry.importers) {
37
- importers.add(importer);
66
+ if (entry.conditions.size === 0) {
67
+ remove(entry);
38
68
  }
39
69
  }
40
- stopPollingIfEmpty();
41
- if (server === undefined || importers.size === 0) {
42
- return;
70
+ if (server !== undefined && importers.size !== 0) {
71
+ invalidateImporters(server, importers);
72
+ sendFullReload(server);
43
73
  }
44
- invalidateImporters(server, importers);
45
- sendFullReload(server);
74
+ };
75
+ const enqueue = (file, observed) => {
76
+ const absolute = path.resolve(file);
77
+ const direct = entries.get(absolute);
78
+ if (direct !== undefined && observed)
79
+ direct.observed = true;
80
+ for (const candidate of [absolute, path.dirname(absolute)]) {
81
+ const entry = entries.get(candidate);
82
+ if (entry !== undefined)
83
+ pending.add(entry);
84
+ }
85
+ if (pending.size === 0 || flushTimer !== undefined)
86
+ return;
87
+ flushTimer = setTimeout(() => {
88
+ flushTimer = undefined;
89
+ const selected = [...pending];
90
+ pending.clear();
91
+ check(selected);
92
+ }, 0);
93
+ flushTimer.unref();
94
+ };
95
+ const ensureWatcher = () => {
96
+ if (watcher !== undefined)
97
+ return watcher;
98
+ // Chokidar's persistent:false backend omits its native error listener on
99
+ // Windows. Keep the owned subscription alive until dispose() closes it.
100
+ const active = watch([], { depth: 0, ignoreInitial: false });
101
+ watcher = active;
102
+ // Initial add events compare compiler-time evidence too: an edit between
103
+ // compilation and asynchronous watcher setup must not be missed.
104
+ active.on("all", (event, file) => {
105
+ if (watcher === active)
106
+ enqueue(file, event === "add" || event === "addDir");
107
+ });
108
+ active.on("error", () => {
109
+ if (watcher === active)
110
+ failed = true;
111
+ });
112
+ poller = setInterval(() => {
113
+ const selected = new Set([...entries.values()].filter((entry) => failed || entry.poll || !entry.observed));
114
+ // Files reached through one linked directory share one topology check.
115
+ // Content edits remain event-driven; retargeting a junction does not
116
+ // reliably emit an event on its previously watched descendants.
117
+ for (const [file, link] of links) {
118
+ const target = realpath(file);
119
+ if (target !== link.target) {
120
+ link.target = target;
121
+ for (const entry of link.inputs) {
122
+ selected.add(entry);
123
+ entry.observed = false;
124
+ active.unwatch(entry.file);
125
+ active.add(entry.file);
126
+ }
127
+ }
128
+ }
129
+ check(selected);
130
+ }, 500);
131
+ poller.unref();
132
+ return watcher;
46
133
  };
47
134
  return {
48
135
  attach(next) {
49
136
  server = next;
50
137
  },
51
- dispose() {
138
+ async dispose() {
52
139
  entries.clear();
53
- if (poller !== undefined) {
140
+ importerInputs.clear();
141
+ pending.clear();
142
+ links.clear();
143
+ if (poller !== undefined)
54
144
  clearInterval(poller);
55
- poller = undefined;
56
- }
57
- // The server reference deliberately survives: `vite.restartServer`
58
- // configures the replacement server (attach) before it closes the old
59
- // one (whose buildEnd runs this dispose), so unsetting it here would
60
- // detach the freshly attached replacement and revive the 500 this
61
- // module exists to prevent. A same-instance `vite build` after a serve
62
- // is instead excluded by the adapter's `config.command` gate.
63
- },
64
- serving() {
65
- return server !== undefined;
145
+ if (flushTimer !== undefined)
146
+ clearTimeout(flushTimer);
147
+ poller = undefined;
148
+ flushTimer = undefined;
149
+ const closing = watcher;
150
+ watcher = undefined;
151
+ failed = false;
152
+ await closing?.close();
153
+ // Retain the attached server across overlapping Vite restart containers.
66
154
  },
67
- watch(input, importer, condition) {
68
- const spelling = path.resolve(input);
69
- const identity = viteServeMissingInputWatchKey(spelling, condition);
70
- const existing = entries.get(identity);
71
- if (existing !== undefined) {
72
- existing.importers.add(path.resolve(importer));
155
+ replace(importer, inputs, failed = false) {
156
+ if (server === undefined)
73
157
  return;
158
+ importer = path.resolve(importer);
159
+ const previous = importerInputs.get(importer) ?? new Map();
160
+ if (failed) {
161
+ // An exception can omit the dependency whose deletion caused it.
162
+ // Keep the last successful spellings until a successful delivery can
163
+ // replace them, observing their current failed state for recovery.
164
+ const reported = new Set(inputs.map((input) => path.resolve(input.file)));
165
+ inputs = [
166
+ ...inputs,
167
+ ...[...previous.keys()]
168
+ .filter((file) => !reported.has(file))
169
+ .map((file) => ({ file })),
170
+ ];
74
171
  }
75
- entries.set(identity, {
76
- condition,
77
- importers: new Set([path.resolve(importer)]),
78
- spelling,
79
- });
80
- if (poller === undefined) {
81
- poller = setInterval(poll, MISSING_INPUT_POLL_INTERVAL);
82
- // A poller must never keep the dev-server process alive on its own.
83
- poller.unref?.();
172
+ const current = new Map();
173
+ const added = [];
174
+ for (const input of inputs) {
175
+ const file = path.resolve(input.file);
176
+ const evidence = input.evidence;
177
+ const key = JSON.stringify(evidence ?? null);
178
+ current.set(file, key);
179
+ let entry = entries.get(file);
180
+ if (entry === undefined) {
181
+ entry = {
182
+ file,
183
+ conditions: new Map(),
184
+ poll: false,
185
+ observed: false,
186
+ links: new Set(),
187
+ };
188
+ entries.set(file, entry);
189
+ added.push(file);
190
+ const directory = path.dirname(file);
191
+ const directoryTarget = realpath(directory);
192
+ const fileTarget = realpath(file);
193
+ const linked = [
194
+ ...(directoryTarget !== undefined &&
195
+ !sameSpelling(directory, directoryTarget)
196
+ ? [directory]
197
+ : []),
198
+ ...(fileTarget !== undefined &&
199
+ directoryTarget !== undefined &&
200
+ !sameSpelling(fileTarget, path.join(directoryTarget, path.basename(file)))
201
+ ? [file]
202
+ : []),
203
+ ];
204
+ for (const linkedFile of linked) {
205
+ let link = links.get(linkedFile);
206
+ if (link === undefined) {
207
+ link = { target: realpath(linkedFile), inputs: new Set() };
208
+ links.set(linkedFile, link);
209
+ }
210
+ link.inputs.add(entry);
211
+ entry.links.add(linkedFile);
212
+ }
213
+ }
214
+ let condition = entry.conditions.get(key);
215
+ if (condition === undefined) {
216
+ condition = {
217
+ evidence,
218
+ baseline: evidence?.state === undefined
219
+ ? captureWatchInputBaseline(file)
220
+ : undefined,
221
+ importers: new Set(),
222
+ };
223
+ entry.conditions.set(key, condition);
224
+ }
225
+ condition.importers.add(importer);
226
+ const observation = evidence?.state?.codec === "predicates"
227
+ ? evidence.state.observation
228
+ : undefined;
229
+ entry.poll ||=
230
+ evidence?.missing === true ||
231
+ evidence?.unavailable !== undefined ||
232
+ (observation !== undefined &&
233
+ observation.fileExists !== true &&
234
+ observation.stat !== "file" &&
235
+ observation.readFile?.ok !== true) ||
236
+ (evidence?.state === undefined &&
237
+ condition.baseline?.fileExists !== true);
84
238
  }
239
+ for (const [file, key] of previous) {
240
+ if (current.get(file) === key)
241
+ continue;
242
+ const entry = entries.get(file);
243
+ const condition = entry?.conditions.get(key);
244
+ condition?.importers.delete(importer);
245
+ if (condition?.importers.size === 0)
246
+ entry?.conditions.delete(key);
247
+ if (entry?.conditions.size === 0 && !current.has(file)) {
248
+ remove(entry);
249
+ }
250
+ }
251
+ importerInputs.set(importer, current);
252
+ if (added.length !== 0)
253
+ ensureWatcher().add(added);
85
254
  },
86
255
  };
87
256
  }
88
- /** Key a private poll by predicate and exact lexical spelling. */
89
- function viteServeMissingInputWatchKey(input, condition) {
90
- // Missing aliases can share a physical parent now and later retarget or
91
- // diverge. Neither predicate may let one lexical spelling answer for another.
92
- const predicate = typeof condition === "string"
93
- ? condition
94
- : `predicates:${JSON.stringify([
95
- condition.accessibleEntries === undefined
96
- ? null
97
- : [
98
- condition.accessibleEntries.directories,
99
- condition.accessibleEntries.files,
100
- ],
101
- condition.directoryExists ?? null,
102
- condition.fileExists ?? null,
103
- condition.readFile === undefined
104
- ? null
105
- : condition.readFile.ok
106
- ? [true, condition.readFile.hash]
107
- : [false],
108
- condition.realpath === undefined
109
- ? null
110
- : condition.realpath.ok
111
- ? [true, condition.realpath.path]
112
- : [false],
113
- condition.stat ?? null,
114
- ])}`;
115
- return `${predicate}:${path.resolve(input)}`;
116
- }
117
- /** Whether one registered condition no longer describes its lexical path. */
118
- function viteServeInputWatchConditionChanged(entry) {
119
- if (typeof entry.condition !== "string") {
120
- return (validateGraphInputObservation(entry.spelling, entry.condition).length !==
121
- 0);
122
- }
257
+ function realpath(file) {
123
258
  try {
124
- if (!fs.existsSync(entry.spelling)) {
125
- return false;
126
- }
127
- return (entry.condition === "exists" || !fs.statSync(entry.spelling).isDirectory());
259
+ return fs.realpathSync.native(file);
128
260
  }
129
261
  catch {
130
- return false;
262
+ return undefined;
131
263
  }
132
264
  }
265
+ function sameSpelling(left, right) {
266
+ return process.platform === "win32"
267
+ ? left.toLowerCase() === right.toLowerCase()
268
+ : left === right;
269
+ }
133
270
  /**
134
271
  * Invalidate every module-graph node of the registered importers so the next
135
272
  * request retransforms them. Importers keep their original absolute spelling so
@@ -214,5 +351,5 @@ function sendFullReload(server) {
214
351
  }
215
352
  }
216
353
 
217
- export { createViteServeMissingInputWatch, viteServeMissingInputWatchKey };
354
+ export { createViteServeInputWatch };
218
355
  //# sourceMappingURL=viteServe.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"viteServe.mjs","sources":["../../src/core/viteServe.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viteServe.mjs","sources":["../../src/core/viteServe.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttsc/unplugin",
3
- "version": "0.30.2",
3
+ "version": "0.30.3",
4
4
  "description": "Bundler adapters for ttsc plugins.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.mjs",
@@ -196,10 +196,11 @@
196
196
  "src"
197
197
  ],
198
198
  "dependencies": {
199
+ "chokidar": "^4.0.3",
199
200
  "unplugin": "^2.3.11"
200
201
  },
201
202
  "peerDependencies": {
202
- "ttsc": "^0.30.2"
203
+ "ttsc": "^0.30.3"
203
204
  },
204
205
  "devDependencies": {
205
206
  "@rollup/plugin-commonjs": "^29.0.2",
@@ -213,7 +214,7 @@
213
214
  "tslib": "^2.8.1",
214
215
  "typescript": "^7.0.2",
215
216
  "vite": "^7.3.5",
216
- "ttsc": "0.30.2"
217
+ "ttsc": "0.30.3"
217
218
  },
218
219
  "repository": {
219
220
  "type": "git",
package/src/bun.ts CHANGED
@@ -46,22 +46,6 @@ export type TtscBunOptions =
46
46
  | TtscUnpluginOptions
47
47
  | (() => TtscUnpluginOptions | undefined);
48
48
 
49
- /**
50
- * Transform hooks handed to the shared transform under Bun.
51
- *
52
- * The shared transform calls `addWatchFile` once per plugin-reported dependency
53
- * so type-only inputs can enter a bundler's watch graph. Bun's bundler and
54
- * runtime loaders expose no per-module dependency-registration channel, so the
55
- * hook is an explicit no-op here: reported dependencies cannot participate in
56
- * Bun invalidation, but a valid dependency list must never crash the loader by
57
- * reaching a missing context method. Passing an empty object made
58
- * `this.addWatchFile` `undefined`, so any plugin reporting dependencies threw
59
- * `TypeError: this.addWatchFile is not a function`.
60
- */
61
- const bunTransformHooks = {
62
- addWatchFile(): void {},
63
- };
64
-
65
49
  /** Resolve {@link TtscBunOptions} to a plain options object (or `undefined`). */
66
50
  function resolveBunOptions(
67
51
  options?: TtscBunOptions,
@@ -177,13 +161,14 @@ export default function bun(options?: TtscBunOptions): BunLikePlugin {
177
161
  const loader = bunLoaderFor(args.path);
178
162
  const transformOptions = getOptions();
179
163
  const source = await fs.readFile(args.path, "utf8");
164
+ // Bun has no dependency subscription API. Omitting watch hooks also
165
+ // avoids deriving a filesystem watch graph that this host cannot use.
180
166
  const result = await transformTtsc(
181
167
  args.path,
182
168
  source,
183
169
  transformOptions,
184
170
  undefined,
185
171
  cache,
186
- bunTransformHooks,
187
172
  );
188
173
  if (result !== undefined) {
189
174
  return { contents: result.code, loader };
@@ -0,0 +1,127 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import type { UnpluginOptions } from "unplugin";
4
+
5
+ import type { ResolvedTtscUnpluginOptions } from "./options";
6
+ import { typescriptTransformSourcePattern } from "./sourceExtensions";
7
+ import {
8
+ type TtscWatchInput,
9
+ beginTtscTransformBuild,
10
+ createTtscTransformCache,
11
+ resetTtscTransformCache,
12
+ transformTtsc,
13
+ } from "./transform";
14
+
15
+ /** Preserve esbuild's distinct file and directory dependency channels. */
16
+ export function createEsbuildOptions(
17
+ options: ResolvedTtscUnpluginOptions,
18
+ includes: (file: string) => boolean,
19
+ ): UnpluginOptions {
20
+ const cache = createTtscTransformCache();
21
+ const owners = new WeakSet<object>();
22
+ let lifecycles = 0;
23
+ return {
24
+ name: "ttsc-unplugin",
25
+ esbuild: {
26
+ setup(build) {
27
+ // Setup can fail validation without receiving onDispose. Acquire only
28
+ // at onStart, and retain a generation while another owner is active.
29
+ build.onStart(() => {
30
+ if (!owners.has(build)) {
31
+ owners.add(build);
32
+ lifecycles += 1;
33
+ }
34
+ beginTtscTransformBuild(cache);
35
+ });
36
+ build.onDispose(() => {
37
+ if (!owners.delete(build)) return;
38
+ lifecycles -= 1;
39
+ if (lifecycles === 0) resetTtscTransformCache(cache);
40
+ });
41
+ const previous = new Map<
42
+ string,
43
+ { watchDirs: string[]; watchFiles: string[] }
44
+ >();
45
+ // There is no generic transform hook on this adapter. Its native
46
+ // loader owns registration, independent of unplugin's hook order.
47
+ build.onLoad(
48
+ { filter: typescriptTransformSourcePattern, namespace: "file" },
49
+ async ({ path: file }) => {
50
+ if (!includes(file)) return;
51
+ const watchFiles = new Set<string>([file]);
52
+ const watchDirs = new Set<string>();
53
+ const register = (inputs: readonly TtscWatchInput[]) => {
54
+ for (const input of inputs) {
55
+ const observation =
56
+ input.evidence?.state?.codec === "predicates"
57
+ ? input.evidence.state.observation
58
+ : undefined;
59
+ const directory =
60
+ observation?.directoryExists === true ||
61
+ observation?.stat === "directory" ||
62
+ observation?.accessibleEntries !== undefined;
63
+ const missingDirectory =
64
+ observation?.directoryExists === false &&
65
+ observation.fileExists !== true &&
66
+ observation.stat !== "file";
67
+ if (directory || missingDirectory) watchDirs.add(input.file);
68
+ if (!directory || observation?.fileExists !== undefined)
69
+ watchFiles.add(input.file);
70
+ // Failed envelopes carry no generation evidence. This rare
71
+ // path must still classify existing recovery directories.
72
+ if (input.evidence === undefined) {
73
+ try {
74
+ if (fs.statSync(input.file).isDirectory())
75
+ watchDirs.add(input.file);
76
+ } catch {
77
+ // Missing files are already tracked through watchFiles.
78
+ }
79
+ }
80
+ }
81
+ };
82
+ let contents: string;
83
+ let errors;
84
+ try {
85
+ const source = await fs.promises.readFile(file, "utf8");
86
+ const result = await transformTtsc(
87
+ file,
88
+ source,
89
+ options,
90
+ undefined,
91
+ cache,
92
+ { addWatchFiles: register },
93
+ );
94
+ contents = result?.code ?? source;
95
+ } catch (error) {
96
+ for (const input of previous.get(file)?.watchFiles ?? [])
97
+ watchFiles.add(input);
98
+ for (const input of previous.get(file)?.watchDirs ?? [])
99
+ watchDirs.add(input);
100
+ // Returning errors with dependencies lets an initially failing
101
+ // build observe its repair; throwing discards those channels.
102
+ errors = [
103
+ {
104
+ text: error instanceof Error ? error.message : String(error),
105
+ detail: error,
106
+ },
107
+ ];
108
+ contents = "";
109
+ }
110
+ const dependencies = {
111
+ watchFiles: [...watchFiles],
112
+ watchDirs: [...watchDirs],
113
+ };
114
+ previous.set(file, dependencies);
115
+ return {
116
+ contents,
117
+ errors,
118
+ loader: file.endsWith(".tsx") ? "tsx" : "ts",
119
+ resolveDir: path.dirname(file),
120
+ ...dependencies,
121
+ };
122
+ },
123
+ );
124
+ },
125
+ },
126
+ };
127
+ }