typeorm 0.3.26 → 0.3.27-dev.1f90467

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.
@@ -39,10 +39,32 @@ async function importOrRequireFile(filePath) {
39
39
  }
40
40
  return tryToRequire();
41
41
  }
42
+ const packageJsonCache = new Map();
43
+ const MAX_CACHE_SIZE = 1000;
44
+ function setPackageJsonCache(paths, packageJson) {
45
+ for (const path of paths) {
46
+ // Simple LRU-like behavior: if we're at capacity, remove oldest entry
47
+ if (packageJsonCache.size >= MAX_CACHE_SIZE &&
48
+ !packageJsonCache.has(path)) {
49
+ const firstKey = packageJsonCache.keys().next().value;
50
+ if (firstKey)
51
+ packageJsonCache.delete(firstKey);
52
+ }
53
+ packageJsonCache.set(path, packageJson);
54
+ }
55
+ }
42
56
  async function getNearestPackageJson(filePath) {
43
57
  let currentPath = filePath;
58
+ const paths = [];
44
59
  while (currentPath !== path_1.default.dirname(currentPath)) {
45
60
  currentPath = path_1.default.dirname(currentPath);
61
+ // Check if we have already cached the package.json for this path
62
+ if (packageJsonCache.has(currentPath)) {
63
+ setPackageJsonCache(paths, packageJsonCache.get(currentPath));
64
+ return packageJsonCache.get(currentPath);
65
+ }
66
+ // Add the current path to the list of paths to cache
67
+ paths.push(currentPath);
46
68
  const potentialPackageJson = path_1.default.join(currentPath, "package.json");
47
69
  try {
48
70
  const stats = await promises_1.default.stat(potentialPackageJson);
@@ -50,9 +72,14 @@ async function getNearestPackageJson(filePath) {
50
72
  continue;
51
73
  }
52
74
  try {
53
- return JSON.parse(await promises_1.default.readFile(potentialPackageJson, "utf8"));
75
+ const parsedPackage = JSON.parse(await promises_1.default.readFile(potentialPackageJson, "utf8"));
76
+ // Cache the parsed package.json object and return it
77
+ setPackageJsonCache(paths, parsedPackage);
78
+ return parsedPackage;
54
79
  }
55
80
  catch {
81
+ // If parsing fails, we still cache null to avoid repeated attempts
82
+ setPackageJsonCache(paths, null);
56
83
  return null;
57
84
  }
58
85
  }
@@ -61,6 +88,7 @@ async function getNearestPackageJson(filePath) {
61
88
  }
62
89
  }
63
90
  // the top of the file tree is reached
91
+ setPackageJsonCache(paths, null);
64
92
  return null;
65
93
  }
66
94
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/ImportUtils.ts"],"names":[],"mappings":";;AAIA,kDAoCC;;AAxCD,mEAA4B;AAC5B,wDAAuB;AACvB,6BAAmC;AAE5B,KAAK,UAAU,mBAAmB,CACrC,QAAgB;IAEhB,MAAM,WAAW,GAAG,KAAK,IAA2B,EAAE;QAClD,qFAAqF;QACrF,oDAAoD;QACpD,OAAO;YACH,8DAA8D;YAC9D,MAAM,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CACnD,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC1B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAA,mBAAa,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAC3C;YACD,KAAK;SACR,CAAA;IACL,CAAC,CAAA;IACD,MAAM,YAAY,GAAG,GAAsB,EAAE;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAA;IAC1C,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IAE5E,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,WAAW,EAAE,CAAA;SAC/D,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,YAAY,EAAE,CAAA;SACrE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAEzD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAI,WAAmB,EAAE,IAAI,KAAK,QAAQ,CAAA;YAExD,IAAI,QAAQ;gBAAE,OAAO,WAAW,EAAE,CAAA;;gBAC7B,OAAO,YAAY,EAAE,CAAA;QAC9B,CAAC;;YAAM,OAAO,YAAY,EAAE,CAAA;IAChC,CAAC;IAED,OAAO,YAAY,EAAE,CAAA;AACzB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACjD,IAAI,WAAW,GAAG,QAAQ,CAAA;IAE1B,OAAO,WAAW,KAAK,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACvC,MAAM,oBAAoB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;QAEnE,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YACjD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,SAAQ;YACZ,CAAC;YAED,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CACb,MAAM,kBAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAClD,CAAA;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,IAAI,CAAA;YACf,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,SAAQ;QACZ,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAA;AACf,CAAC","file":"ImportUtils.js","sourcesContent":["import fs from \"fs/promises\"\nimport path from \"path\"\nimport { pathToFileURL } from \"url\"\n\nexport async function importOrRequireFile(\n filePath: string,\n): Promise<[any, \"esm\" | \"commonjs\"]> {\n const tryToImport = async (): Promise<[any, \"esm\"]> => {\n // `Function` is required to make sure the `import` statement wil stay `import` after\n // transpilation and won't be converted to `require`\n return [\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n await Function(\"return filePath => import(filePath)\")()(\n filePath.startsWith(\"file://\")\n ? filePath\n : pathToFileURL(filePath).toString(),\n ),\n \"esm\",\n ]\n }\n const tryToRequire = (): [any, \"commonjs\"] => {\n return [require(filePath), \"commonjs\"]\n }\n\n const extension = filePath.substring(filePath.lastIndexOf(\".\") + \".\".length)\n\n if (extension === \"mjs\" || extension === \"mts\") return tryToImport()\n else if (extension === \"cjs\" || extension === \"cts\") return tryToRequire()\n else if (extension === \"js\" || extension === \"ts\") {\n const packageJson = await getNearestPackageJson(filePath)\n\n if (packageJson != null) {\n const isModule = (packageJson as any)?.type === \"module\"\n\n if (isModule) return tryToImport()\n else return tryToRequire()\n } else return tryToRequire()\n }\n\n return tryToRequire()\n}\n\nasync function getNearestPackageJson(filePath: string): Promise<object | null> {\n let currentPath = filePath\n\n while (currentPath !== path.dirname(currentPath)) {\n currentPath = path.dirname(currentPath)\n const potentialPackageJson = path.join(currentPath, \"package.json\")\n\n try {\n const stats = await fs.stat(potentialPackageJson)\n if (!stats.isFile()) {\n continue\n }\n\n try {\n return JSON.parse(\n await fs.readFile(potentialPackageJson, \"utf8\"),\n )\n } catch {\n return null\n }\n } catch {\n continue\n }\n }\n\n // the top of the file tree is reached\n return null\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/util/ImportUtils.ts"],"names":[],"mappings":"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","file":"ImportUtils.js","sourcesContent":["import fs from \"fs/promises\"\nimport path from \"path\"\nimport { pathToFileURL } from \"url\"\n\nexport async function importOrRequireFile(\n filePath: string,\n): Promise<[any, \"esm\" | \"commonjs\"]> {\n const tryToImport = async (): Promise<[any, \"esm\"]> => {\n // `Function` is required to make sure the `import` statement wil stay `import` after\n // transpilation and won't be converted to `require`\n return [\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n await Function(\"return filePath => import(filePath)\")()(\n filePath.startsWith(\"file://\")\n ? filePath\n : pathToFileURL(filePath).toString(),\n ),\n \"esm\",\n ]\n }\n const tryToRequire = (): [any, \"commonjs\"] => {\n return [require(filePath), \"commonjs\"]\n }\n\n const extension = filePath.substring(filePath.lastIndexOf(\".\") + \".\".length)\n\n if (extension === \"mjs\" || extension === \"mts\") return tryToImport()\n else if (extension === \"cjs\" || extension === \"cts\") return tryToRequire()\n else if (extension === \"js\" || extension === \"ts\") {\n const packageJson = await getNearestPackageJson(filePath)\n\n if (packageJson != null) {\n const isModule = (packageJson as any)?.type === \"module\"\n\n if (isModule) return tryToImport()\n else return tryToRequire()\n } else return tryToRequire()\n }\n\n return tryToRequire()\n}\n\nconst packageJsonCache = new Map<string, object | null>()\nconst MAX_CACHE_SIZE = 1000\n\nfunction setPackageJsonCache(paths: string[], packageJson: object | null) {\n for (const path of paths) {\n // Simple LRU-like behavior: if we're at capacity, remove oldest entry\n if (\n packageJsonCache.size >= MAX_CACHE_SIZE &&\n !packageJsonCache.has(path)\n ) {\n const firstKey = packageJsonCache.keys().next().value\n if (firstKey) packageJsonCache.delete(firstKey)\n }\n packageJsonCache.set(path, packageJson)\n }\n}\n\nasync function getNearestPackageJson(filePath: string): Promise<object | null> {\n let currentPath = filePath\n const paths: string[] = []\n\n while (currentPath !== path.dirname(currentPath)) {\n currentPath = path.dirname(currentPath)\n\n // Check if we have already cached the package.json for this path\n if (packageJsonCache.has(currentPath)) {\n setPackageJsonCache(paths, packageJsonCache.get(currentPath)!)\n return packageJsonCache.get(currentPath)!\n }\n\n // Add the current path to the list of paths to cache\n paths.push(currentPath)\n\n const potentialPackageJson = path.join(currentPath, \"package.json\")\n\n try {\n const stats = await fs.stat(potentialPackageJson)\n if (!stats.isFile()) {\n continue\n }\n\n try {\n const parsedPackage = JSON.parse(\n await fs.readFile(potentialPackageJson, \"utf8\"),\n )\n // Cache the parsed package.json object and return it\n setPackageJsonCache(paths, parsedPackage)\n return parsedPackage\n } catch {\n // If parsing fails, we still cache null to avoid repeated attempts\n setPackageJsonCache(paths, null)\n return null\n }\n } catch {\n continue\n }\n }\n\n // the top of the file tree is reached\n setPackageJsonCache(paths, null)\n return null\n}\n"],"sourceRoot":".."}