@ttsc/unplugin 0.30.2 → 0.30.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.
@@ -1,11 +1,10 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
1
  import { createUnplugin } from 'unplugin';
2
+ import { createEsbuildOptions } from './esbuild.mjs';
4
3
  import { resolveOptions } from './options.mjs';
5
4
  import { typescriptTransformSourcePattern } from './sourceExtensions.mjs';
6
5
  import { createTtscTransformCache, stripQuery, transformTtsc, beginTtscTransformBuild, resetTtscTransformCache, isDeclarationFile } from './transform.mjs';
7
6
  export { captureWatchInputBaseline, captureWatchInputFileBaseline, collectExternalInputHashes, collectProjectInputHashSnapshot, collectProjectInputHashes, isProjectWalkPath, isWatchInputKeyBaseline, watchInputEvidenceMatchesBaseline } from './transform.mjs';
8
- import { createViteServeMissingInputWatch } from './viteServe.mjs';
7
+ import { createViteServeInputWatch } from './viteServe.mjs';
9
8
  export { mergeMembershipPolicyOverlay, readProjectMembershipPolicy, readTsconfigSourceSnapshot } from './tsconfigPaths.mjs';
10
9
  export { discoverNearestProjectTsconfig, findNearestProjectTsconfig, findProjectTsconfigs } from './projectDiscovery.mjs';
11
10
 
@@ -41,10 +40,13 @@ const virtualModulePattern = /\0/;
41
40
  * server configured without a watcher takes the pass lifecycle with them,
42
41
  * having declared it will observe no edit at all.
43
42
  */
44
- const unpluginFactory = (rawOptions = {}) => {
43
+ const unpluginFactory = (rawOptions = {}, meta) => {
45
44
  const options = resolveOptions(rawOptions);
45
+ if (meta.framework === "esbuild") {
46
+ return createEsbuildOptions(options, isTransformTarget);
47
+ }
46
48
  const transformCache = createTtscTransformCache();
47
- const missingInputs = createViteServeMissingInputWatch();
49
+ const serveInputs = createViteServeInputWatch();
48
50
  let aliases;
49
51
  let viteCommand;
50
52
  let viteWatching = true;
@@ -59,13 +61,6 @@ const unpluginFactory = (rawOptions = {}) => {
59
61
  // old containers cannot dispose a replacement's freshly initialized cache.
60
62
  let viteBuildOwners = new WeakSet();
61
63
  let viteBuildLifecycles = 0;
62
- // esbuild schedules one-shot onDispose callbacks after it settles the build
63
- // Promise. Acquire ownership only at onStart: plugin setup runs before build
64
- // option validation, and a validation failure has no onDispose callback with
65
- // which to release a setup-time owner. Once a build has actually started, the
66
- // count keeps an older delayed callback from disposing its active generation.
67
- const esbuildOwners = new WeakSet();
68
- let esbuildLifecycles = 0;
69
64
  return {
70
65
  name,
71
66
  enforce: "pre",
@@ -95,14 +90,15 @@ const unpluginFactory = (rawOptions = {}) => {
95
90
  viteBuildWatching =
96
91
  config.build?.watch != null;
97
92
  },
98
- // Vite serve funnels every transform-context `addWatchFile()` into the
99
- // module's added-import graph (`_addedImports`), which import-analysis
100
- // resolves like real imports. Capture the dev server so the transform
101
- // hook can route watch inputs that do not exist yet — superseding
102
- // resolution candidates above all — around that graph and still
103
- // invalidate their importers when the path is created.
93
+ // Compiler dependencies belong to the filesystem watch graph. Vite's
94
+ // transform-context addWatchFile also inserts runtime imports, so none
95
+ // of those dependencies may use that channel during serve (#1368).
104
96
  configureServer(server) {
105
- missingInputs.attach(server);
97
+ serveInputs.attach(server);
98
+ },
99
+ watchChange(id, change) {
100
+ if (change.event === "delete")
101
+ serveInputs.forget(stripQuery(id));
106
102
  },
107
103
  // Vite calls buildEnd when the dev server closes, and Rollup calls it at
108
104
  // the end of every build phase; drop every poller and, once the last
@@ -119,15 +115,15 @@ const unpluginFactory = (rawOptions = {}) => {
119
115
  // fixing one of the two sites alone left this host recompiling the whole
120
116
  // project per edit (samchon/ttsc#1301). The watching build hands its
121
117
  // teardown to `closeWatcher` below instead.
122
- buildEnd() {
118
+ async buildEnd() {
123
119
  if (viteBuildOwners.delete(this)) {
124
120
  viteBuildLifecycles -= 1;
125
121
  }
126
122
  if (viteBuildLifecycles === 0) {
127
- missingInputs.dispose();
128
123
  if (viteCommand === "serve" || !viteBuildWatching) {
129
124
  resetTtscTransformCache(transformCache);
130
125
  }
126
+ await serveInputs.dispose();
131
127
  }
132
128
  },
133
129
  // The watching build's real teardown, and the only hook in a
@@ -144,11 +140,11 @@ const unpluginFactory = (rawOptions = {}) => {
144
140
  // `buildEnd` would then decrement a counter that is already zero and
145
141
  // strand it below zero, after which the disposal above could never fire
146
142
  // again for this plugin instance.
147
- closeWatcher() {
143
+ async closeWatcher() {
148
144
  viteBuildOwners = new WeakSet();
149
145
  viteBuildLifecycles = 0;
150
- missingInputs.dispose();
151
146
  resetTtscTransformCache(transformCache);
147
+ await serveInputs.dispose();
152
148
  },
153
149
  },
154
150
  // Rollup and Rolldown carry none of the Vite block's hooks, so before this
@@ -198,23 +194,14 @@ const unpluginFactory = (rawOptions = {}) => {
198
194
  resetTtscTransformCache(transformCache);
199
195
  });
200
196
  },
201
- esbuild: {
202
- setup(build) {
203
- build.onStart(() => {
204
- if (!esbuildOwners.has(build)) {
205
- esbuildOwners.add(build);
206
- esbuildLifecycles += 1;
207
- }
208
- });
209
- build.onDispose(() => {
210
- if (!esbuildOwners.delete(build)) {
211
- return;
212
- }
213
- esbuildLifecycles -= 1;
214
- if (esbuildLifecycles === 0) {
215
- resetTtscTransformCache(transformCache);
216
- }
217
- });
197
+ farm: {
198
+ // Farm calls buildStart only for the initial compilation. Every update
199
+ // opens a new pass so a failed verdict can recover, while an unchanged
200
+ // successful generation remains reusable across its module deliveries.
201
+ updateModules: {
202
+ executor() {
203
+ beginTtscTransformBuild(transformCache);
204
+ },
218
205
  },
219
206
  },
220
207
  buildStart() {
@@ -257,59 +244,43 @@ const unpluginFactory = (rawOptions = {}) => {
257
244
  if (!isTransformTarget(file)) {
258
245
  return undefined;
259
246
  }
247
+ // The project-root observer is already live when a Vite serve transform
248
+ // begins. Its sequence token lets registration prove only inputs that
249
+ // could have changed during compilation, instead of synchronously
250
+ // re-reading every input in a large compiler graph.
251
+ const serveStartedAt = viteCommand === "serve" && viteWatching
252
+ ? serveInputs.begin()
253
+ : undefined;
260
254
  return transformTtsc(file, source, options, aliases, transformCache, {
261
- // Register the derived watch inputs (plugin-reported `dependencies`
262
- // unioned with the host-owned reference graph) so type-only inputs
263
- // invalidate this module in watch mode and persistent caches;
264
- // bundlers erase type-only imports from their own module graph and
265
- // would otherwise serve stale generated code. Under Vite serve a
266
- // resolver input that is not proven to be a file must not enter
267
- // `addWatchFile`: import-analysis resolves added imports and 500s on
268
- // missing paths and directories, so those are watched against their
269
- // compiler predicates instead and invalidate this module when the
270
- // observation changes.
271
- addWatchFile: (watched, evidence) => {
272
- if (viteCommand === "serve" && missingInputs.serving()) {
273
- const observation = evidence?.state?.codec === "predicates"
274
- ? evidence.state.observation
275
- : undefined;
276
- const unsafePredicate = observation !== undefined &&
277
- observation.fileExists !== true &&
278
- observation.stat !== "file" &&
279
- observation.readFile?.ok !== true
280
- ? observation
281
- : undefined;
282
- if (unsafePredicate !== undefined) {
283
- missingInputs.watch(watched, path.resolve(file), unsafePredicate);
284
- return;
255
+ // A watcherless server has no invalidation channel and needs no
256
+ // watch-input derivation. Every other host keeps its native contract.
257
+ addWatchFiles: viteCommand === "serve" && !viteWatching
258
+ ? undefined
259
+ : (inputs, failed) => {
260
+ if (viteCommand === "serve") {
261
+ serveInputs.replace(file, inputs, failed, serveStartedAt);
285
262
  }
286
- // Trust the generation's recorded existence when it supplied one:
287
- // every cache hit revalidates it, and probing each input again
288
- // costs one `existsSync` per input per delivered module.
289
- const unavailable = evidence?.unavailable ??
290
- (evidence === undefined
291
- ? !fs.existsSync(watched)
292
- ? "missing"
293
- : undefined
294
- : evidence.missing
295
- ? "missing"
296
- : undefined);
297
- if (unavailable !== undefined) {
298
- missingInputs.watch(watched, path.resolve(file), unavailable === "not-file" ? "file" : "exists");
299
- return;
263
+ else {
264
+ const native = this.getNativeBuildContext?.();
265
+ for (const input of inputs) {
266
+ if (native?.framework === "rspack" &&
267
+ native.loaderContext !== undefined) {
268
+ // Compilation-level dependencies schedule a pass but do
269
+ // not invalidate Rspack's cached transformed modules.
270
+ if (input.evidence?.missing === true)
271
+ native.loaderContext.addMissingDependency(input.file);
272
+ else
273
+ native.loaderContext.addDependency(input.file);
274
+ }
275
+ else if (native?.framework === "farm") {
276
+ native.context.addWatchFile(file, input.file);
277
+ }
278
+ else {
279
+ this.addWatchFile(input.file);
280
+ }
281
+ }
300
282
  }
301
- }
302
- // A dev server configured without a watcher can never deliver a
303
- // change event, so a registration here buys nothing, and it is not
304
- // free: Vite's import analysis resolves every registered path like a
305
- // real import of the transformed module, once per module. The
306
- // adapter's own missing-input poll above stays active either way,
307
- // because it never depended on Vite's watcher.
308
- if (viteCommand === "serve" && !viteWatching) {
309
- return;
310
- }
311
- this.addWatchFile(watched);
312
- },
283
+ },
313
284
  // A module the plugin declared volatile depends on non-file inputs,
314
285
  // which no file-dependency snapshot can represent; mark it
315
286
  // uncacheable where the bundler exposes that control.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/core/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/core/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -56,6 +56,8 @@ interface TtscProjectMutationTracker {
56
56
  * whole, which cannot answer for one name.
57
57
  */
58
58
  covered?: ReadonlySet<string>;
59
+ /** Whether this is the repository-owned backend with content-event coverage. */
60
+ contentAuthoritative?: boolean;
59
61
  /**
60
62
  * Wait until every event this tracker's watcher has already dispatched has
61
63
  * been applied to it.
@@ -69,6 +71,8 @@ interface TtscProjectMutationTracker {
69
71
  drain?: () => Promise<void>;
70
72
  failed: boolean;
71
73
  membershipChanged: boolean;
74
+ /** Compare event and input paths through this tracker's filesystem identity. */
75
+ overlaps?: (input: string, changed: string) => boolean;
72
76
  settle?: Promise<void>;
73
77
  }
74
78
  /**
@@ -303,7 +307,7 @@ export interface TtscTransformFilesystemOperations {
303
307
  * native abort Node's Windows fs-event backend can raise when a watched
304
308
  * temporary tree is deleted.
305
309
  */
306
- watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void): {
310
+ watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void, recursive?: boolean): {
307
311
  close: () => void;
308
312
  };
309
313
  }
@@ -425,10 +429,12 @@ export interface TtscTransformHooks {
425
429
  addWatchFile?: (file: string, evidence?: TtscWatchInputEvidence) => void;
426
430
  /**
427
431
  * Batched form of {@link addWatchFile}. When supplied, the transform calls it
428
- * once per delivered module and does not call `addWatchFile` for that
429
- * module.
432
+ * once per delivered module and does not call `addWatchFile` for that module.
433
+ * `failed` marks a recovery batch: a failed compiler can omit inputs from its
434
+ * previous successful result, so replacing hosts should retain those
435
+ * spellings until the next successful delivery.
430
436
  */
431
- addWatchFiles?: (inputs: readonly TtscWatchInput[]) => void;
437
+ addWatchFiles?: (inputs: readonly TtscWatchInput[], failed?: boolean) => void;
432
438
  /**
433
439
  * Invoked when the plugin declared the transformed file volatile (the
434
440
  * envelope's `volatile` list): its output depends on non-file inputs that no
@@ -467,10 +473,14 @@ interface TtscHostInputValidation {
467
473
  readonly entries: Map<string, {
468
474
  path: string;
469
475
  /**
470
- * Whether the recorded state of this input came from reading its bytes.
471
- * An input that existed but could not be read records a missing state, so
472
- * no signature may stand in for it: its metadata holds still while the
473
- * bytes behind it appear.
476
+ * Whether the recorded state of this input has been matched to readable
477
+ * bytes. Capture sets it immediately for compiler-proven inputs; a
478
+ * current module supplied from an editor buffer can earn it later after
479
+ * its disk bytes match the recorded source.
480
+ *
481
+ * An input that still cannot be read records a missing state, so no
482
+ * signature may stand in for it: its metadata holds still while the bytes
483
+ * behind it appear.
474
484
  */
475
485
  readable: boolean;
476
486
  realpath: string | null;
@@ -56,6 +56,8 @@ interface TtscProjectMutationTracker {
56
56
  * whole, which cannot answer for one name.
57
57
  */
58
58
  covered?: ReadonlySet<string>;
59
+ /** Whether this is the repository-owned backend with content-event coverage. */
60
+ contentAuthoritative?: boolean;
59
61
  /**
60
62
  * Wait until every event this tracker's watcher has already dispatched has
61
63
  * been applied to it.
@@ -69,6 +71,8 @@ interface TtscProjectMutationTracker {
69
71
  drain?: () => Promise<void>;
70
72
  failed: boolean;
71
73
  membershipChanged: boolean;
74
+ /** Compare event and input paths through this tracker's filesystem identity. */
75
+ overlaps?: (input: string, changed: string) => boolean;
72
76
  settle?: Promise<void>;
73
77
  }
74
78
  /**
@@ -303,7 +307,7 @@ export interface TtscTransformFilesystemOperations {
303
307
  * native abort Node's Windows fs-event backend can raise when a watched
304
308
  * temporary tree is deleted.
305
309
  */
306
- watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void): {
310
+ watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void, recursive?: boolean): {
307
311
  close: () => void;
308
312
  };
309
313
  }
@@ -425,10 +429,12 @@ export interface TtscTransformHooks {
425
429
  addWatchFile?: (file: string, evidence?: TtscWatchInputEvidence) => void;
426
430
  /**
427
431
  * Batched form of {@link addWatchFile}. When supplied, the transform calls it
428
- * once per delivered module and does not call `addWatchFile` for that
429
- * module.
432
+ * once per delivered module and does not call `addWatchFile` for that module.
433
+ * `failed` marks a recovery batch: a failed compiler can omit inputs from its
434
+ * previous successful result, so replacing hosts should retain those
435
+ * spellings until the next successful delivery.
430
436
  */
431
- addWatchFiles?: (inputs: readonly TtscWatchInput[]) => void;
437
+ addWatchFiles?: (inputs: readonly TtscWatchInput[], failed?: boolean) => void;
432
438
  /**
433
439
  * Invoked when the plugin declared the transformed file volatile (the
434
440
  * envelope's `volatile` list): its output depends on non-file inputs that no
@@ -467,10 +473,14 @@ interface TtscHostInputValidation {
467
473
  readonly entries: Map<string, {
468
474
  path: string;
469
475
  /**
470
- * Whether the recorded state of this input came from reading its bytes.
471
- * An input that existed but could not be read records a missing state, so
472
- * no signature may stand in for it: its metadata holds still while the
473
- * bytes behind it appear.
476
+ * Whether the recorded state of this input has been matched to readable
477
+ * bytes. Capture sets it immediately for compiler-proven inputs; a
478
+ * current module supplied from an editor buffer can earn it later after
479
+ * its disk bytes match the recorded source.
480
+ *
481
+ * An input that still cannot be read records a missing state, so no
482
+ * signature may stand in for it: its metadata holds still while the bytes
483
+ * behind it appear.
474
484
  */
475
485
  readable: boolean;
476
486
  realpath: string | null;
@@ -56,6 +56,8 @@ interface TtscProjectMutationTracker {
56
56
  * whole, which cannot answer for one name.
57
57
  */
58
58
  covered?: ReadonlySet<string>;
59
+ /** Whether this is the repository-owned backend with content-event coverage. */
60
+ contentAuthoritative?: boolean;
59
61
  /**
60
62
  * Wait until every event this tracker's watcher has already dispatched has
61
63
  * been applied to it.
@@ -69,6 +71,8 @@ interface TtscProjectMutationTracker {
69
71
  drain?: () => Promise<void>;
70
72
  failed: boolean;
71
73
  membershipChanged: boolean;
74
+ /** Compare event and input paths through this tracker's filesystem identity. */
75
+ overlaps?: (input: string, changed: string) => boolean;
72
76
  settle?: Promise<void>;
73
77
  }
74
78
  /**
@@ -303,7 +307,7 @@ export interface TtscTransformFilesystemOperations {
303
307
  * native abort Node's Windows fs-event backend can raise when a watched
304
308
  * temporary tree is deleted.
305
309
  */
306
- watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void): {
310
+ watch?(directory: string, listener: (eventType: string, filename: string | null) => void, onError: () => void, recursive?: boolean): {
307
311
  close: () => void;
308
312
  };
309
313
  }
@@ -425,10 +429,12 @@ export interface TtscTransformHooks {
425
429
  addWatchFile?: (file: string, evidence?: TtscWatchInputEvidence) => void;
426
430
  /**
427
431
  * Batched form of {@link addWatchFile}. When supplied, the transform calls it
428
- * once per delivered module and does not call `addWatchFile` for that
429
- * module.
432
+ * once per delivered module and does not call `addWatchFile` for that module.
433
+ * `failed` marks a recovery batch: a failed compiler can omit inputs from its
434
+ * previous successful result, so replacing hosts should retain those
435
+ * spellings until the next successful delivery.
430
436
  */
431
- addWatchFiles?: (inputs: readonly TtscWatchInput[]) => void;
437
+ addWatchFiles?: (inputs: readonly TtscWatchInput[], failed?: boolean) => void;
432
438
  /**
433
439
  * Invoked when the plugin declared the transformed file volatile (the
434
440
  * envelope's `volatile` list): its output depends on non-file inputs that no
@@ -467,10 +473,14 @@ interface TtscHostInputValidation {
467
473
  readonly entries: Map<string, {
468
474
  path: string;
469
475
  /**
470
- * Whether the recorded state of this input came from reading its bytes.
471
- * An input that existed but could not be read records a missing state, so
472
- * no signature may stand in for it: its metadata holds still while the
473
- * bytes behind it appear.
476
+ * Whether the recorded state of this input has been matched to readable
477
+ * bytes. Capture sets it immediately for compiler-proven inputs; a
478
+ * current module supplied from an editor buffer can earn it later after
479
+ * its disk bytes match the recorded source.
480
+ *
481
+ * An input that still cannot be read records a missing state, so no
482
+ * signature may stand in for it: its metadata holds still while the bytes
483
+ * behind it appear.
474
484
  */
475
485
  readable: boolean;
476
486
  realpath: string | null;