@dudousxd/nestjs-codegen 0.27.1 → 0.28.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.
@@ -251,12 +251,18 @@ function findTypeInFile(name, file) {
251
251
  function resolveModuleSpecifier(moduleSpecifier, sourceFile, project) {
252
252
  if (moduleSpecifier.startsWith(".")) {
253
253
  const dir = dirname(sourceFile.getFilePath());
254
- const noExt = moduleSpecifier.replace(/\.(js|ts)$/, "");
255
- return [
256
- resolve2(dir, `${noExt}.ts`),
254
+ const ext = /\.(c|m)?(j|t)sx?$/.exec(moduleSpecifier)?.[0];
255
+ const base = ext ? moduleSpecifier.slice(0, -ext.length) : moduleSpecifier;
256
+ const flavour = ext?.startsWith(".c") ? "c" : ext?.startsWith(".m") ? "m" : "";
257
+ const candidates = [
258
+ resolve2(dir, `${base}.${flavour}ts`),
259
+ ...flavour === "" ? [resolve2(dir, `${base}.tsx`)] : [],
257
260
  resolve2(dir, `${moduleSpecifier}.ts`),
258
- resolve2(dir, moduleSpecifier, "index.ts")
261
+ resolve2(dir, moduleSpecifier, "index.ts"),
262
+ resolve2(dir, `${base}.d.${flavour}ts`),
263
+ ...ext === void 0 ? [resolve2(dir, moduleSpecifier, "index.d.ts")] : []
259
264
  ];
265
+ return [...new Set(candidates)];
260
266
  }
261
267
  const ctx = _ctxFor(project);
262
268
  const baseUrl = ctx.pathsBase ?? ctx.projectRoot;
@@ -5584,7 +5590,7 @@ async function generate(config, inputRoutes = [], entryPoint = "cli") {
5584
5590
 
5585
5591
  // src/watch/watcher.ts
5586
5592
  import { readFile as readFile3 } from "fs/promises";
5587
- import { join as join15 } from "path";
5593
+ import { join as join15, resolve as resolve5 } from "path";
5588
5594
  import chokidar from "chokidar";
5589
5595
 
5590
5596
  // src/watch/lock-file.ts
@@ -5666,11 +5672,36 @@ async function watch(config, onChange, options = {}) {
5666
5672
  }
5667
5673
  return discovery;
5668
5674
  }
5675
+ const trackedWatcher = chokidar.watch([], {
5676
+ ignoreInitial: true,
5677
+ persistent: true,
5678
+ awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 20 }
5679
+ });
5680
+ const trackedPaths = /* @__PURE__ */ new Set();
5681
+ async function syncTrackedInputs() {
5682
+ const manifest = await readManifest(config.codegen.outDir);
5683
+ const fresh = [];
5684
+ for (const path of manifest?.extraInputs ?? []) {
5685
+ const abs = resolve5(config.codegen.cwd, path);
5686
+ if (trackedPaths.has(abs)) continue;
5687
+ trackedPaths.add(abs);
5688
+ fresh.push(abs);
5689
+ }
5690
+ if (fresh.length > 0) trackedWatcher.add(fresh);
5691
+ }
5692
+ async function generateAndTrack(routes) {
5693
+ try {
5694
+ await generate(config, routes, entryPoint);
5695
+ } finally {
5696
+ await syncTrackedInputs().catch(() => {
5697
+ });
5698
+ }
5699
+ }
5669
5700
  async function runInitialPass() {
5670
5701
  try {
5671
5702
  const initialRoutes = (await getDiscovery()).discover();
5672
5703
  lastRoutes = initialRoutes;
5673
- await generate(config, initialRoutes, entryPoint);
5704
+ await generateAndTrack(initialRoutes);
5674
5705
  } catch (err) {
5675
5706
  if (err instanceof DriftGuardError) {
5676
5707
  console.error(err.message);
@@ -5680,7 +5711,7 @@ async function watch(config, onChange, options = {}) {
5680
5711
  `[nestjs-codegen] Initial route discovery failed, falling back to pages-only: ${err instanceof Error ? err.message : String(err)}`
5681
5712
  );
5682
5713
  try {
5683
- await generate(config, lastRoutes, entryPoint);
5714
+ await generateAndTrack(lastRoutes);
5684
5715
  } catch {
5685
5716
  }
5686
5717
  }
@@ -5713,7 +5744,7 @@ async function watch(config, onChange, options = {}) {
5713
5744
  pagesDebounceTimer = setTimeout(async () => {
5714
5745
  pagesDebounceTimer = void 0;
5715
5746
  try {
5716
- await generate(config, lastRoutes, entryPoint);
5747
+ await generateAndTrack(lastRoutes);
5717
5748
  } catch (err) {
5718
5749
  console.error(
5719
5750
  "[nestjs-codegen] Pages generation failed:",
@@ -5745,7 +5776,7 @@ async function watch(config, onChange, options = {}) {
5745
5776
  try {
5746
5777
  const routes = await (await getDiscovery()).rediscover(changed);
5747
5778
  lastRoutes = routes;
5748
- await generate(config, routes, entryPoint);
5779
+ await generateAndTrack(routes);
5749
5780
  } catch (err) {
5750
5781
  console.error(
5751
5782
  "[nestjs-codegen] Contracts generation failed:",
@@ -5766,6 +5797,9 @@ async function watch(config, onChange, options = {}) {
5766
5797
  formsWatcher.on("add", (p) => scheduleContractsRegenerate(p));
5767
5798
  formsWatcher.on("change", (p) => scheduleContractsRegenerate(p));
5768
5799
  formsWatcher.on("unlink", (p) => scheduleContractsRegenerate(p));
5800
+ trackedWatcher.on("add", (p) => scheduleContractsRegenerate(p));
5801
+ trackedWatcher.on("change", (p) => scheduleContractsRegenerate(p));
5802
+ trackedWatcher.on("unlink", (p) => scheduleContractsRegenerate(p));
5769
5803
  return {
5770
5804
  close: async () => {
5771
5805
  if (pagesDebounceTimer !== void 0) {
@@ -5779,13 +5813,14 @@ async function watch(config, onChange, options = {}) {
5779
5813
  await pagesWatcher.close();
5780
5814
  await contractsWatcher.close();
5781
5815
  await formsWatcher.close();
5816
+ await trackedWatcher.close();
5782
5817
  await lock.release();
5783
5818
  }
5784
5819
  };
5785
5820
  }
5786
5821
 
5787
5822
  // src/index.ts
5788
- var VERSION = "0.27.1";
5823
+ var VERSION = "0.28.0";
5789
5824
 
5790
5825
  // src/generate-manifest.ts
5791
5826
  var MANIFEST_FILE = ".codegen-manifest.json";
@@ -5877,14 +5912,26 @@ async function computeInputsHash(config, extraInputs = []) {
5877
5912
  hash.update("\n");
5878
5913
  }
5879
5914
  for (const file of extra) {
5880
- const contents = await readFile4(join16(cwd, file), "utf8").catch(() => null);
5881
5915
  hash.update(`extra:${file}
5882
5916
  `);
5883
- hash.update(contents ?? "\0missing");
5917
+ hash.update(await readTrackedInput(join16(cwd, file)));
5884
5918
  hash.update("\n");
5885
5919
  }
5886
5920
  return hash.digest("hex");
5887
5921
  }
5922
+ async function readTrackedInput(path) {
5923
+ try {
5924
+ return await readFile4(path, "utf8");
5925
+ } catch (err) {
5926
+ if (err.code !== "EISDIR") return "\0missing";
5927
+ }
5928
+ try {
5929
+ const entries = await readdir(path);
5930
+ return `\0dir:${entries.sort().join("\n")}`;
5931
+ } catch {
5932
+ return "\0missing";
5933
+ }
5934
+ }
5888
5935
  async function readManifest(outDir) {
5889
5936
  try {
5890
5937
  const raw = await readFile4(join16(outDir, MANIFEST_FILE), "utf8");