@lage-run/hasher 1.9.0 → 1.9.2

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.json CHANGED
@@ -2,7 +2,63 @@
2
2
  "name": "@lage-run/hasher",
3
3
  "entries": [
4
4
  {
5
- "date": "Mon, 01 Sep 2025 08:10:04 GMT",
5
+ "date": "Sat, 24 Jan 2026 09:00:58 GMT",
6
+ "version": "1.9.2",
7
+ "tag": "@lage-run/hasher_v1.9.2",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "elcraig@microsoft.com",
12
+ "package": "@lage-run/hasher",
13
+ "commit": "092607a7d55561a9342ab3265ccab0142dd59b9b",
14
+ "comment": "Add explicit module boundary types and update typescript version"
15
+ },
16
+ {
17
+ "author": "email not defined",
18
+ "package": "@lage-run/hasher",
19
+ "commit": "092607a7d55561a9342ab3265ccab0142dd59b9b",
20
+ "comment": "Update dependency workspace-tools to v0.40.4 and fix deprecated API usage"
21
+ },
22
+ {
23
+ "author": "dobes@formative.com",
24
+ "package": "@lage-run/hasher",
25
+ "commit": "092607a7d55561a9342ab3265ccab0142dd59b9b",
26
+ "comment": "Show target.id in error about missing inputs"
27
+ }
28
+ ],
29
+ "none": [
30
+ {
31
+ "author": "elcraig@microsoft.com",
32
+ "package": "@lage-run/hasher",
33
+ "commit": "092607a7d55561a9342ab3265ccab0142dd59b9b",
34
+ "comment": "Add missing dev dep on micromatch types"
35
+ }
36
+ ]
37
+ }
38
+ },
39
+ {
40
+ "date": "Thu, 15 Jan 2026 23:24:00 GMT",
41
+ "version": "1.9.1",
42
+ "tag": "@lage-run/hasher_v1.9.1",
43
+ "comments": {
44
+ "patch": [
45
+ {
46
+ "author": "renovate@whitesourcesoftware.com",
47
+ "package": "@lage-run/hasher",
48
+ "commit": "3d7ac61faadf82097fb2996431b537b2a9baa0e3",
49
+ "comment": "Update dependency workspace-tools to v0.40.0"
50
+ },
51
+ {
52
+ "author": "nemanjatesic@microsoft.com",
53
+ "package": "@lage-run/hasher",
54
+ "commit": "3d7ac61faadf82097fb2996431b537b2a9baa0e3",
55
+ "comment": "Add lint rule for no-floating-promises and fix several places"
56
+ }
57
+ ]
58
+ }
59
+ },
60
+ {
61
+ "date": "Mon, 01 Sep 2025 08:10:36 GMT",
6
62
  "version": "1.9.0",
7
63
  "tag": "@lage-run/hasher_v1.9.0",
8
64
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,31 @@
1
1
  # Change Log - @lage-run/hasher
2
2
 
3
- <!-- This log was last generated on Mon, 01 Sep 2025 08:10:04 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Sat, 24 Jan 2026 09:00:58 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.9.2
8
+
9
+ Sat, 24 Jan 2026 09:00:58 GMT
10
+
11
+ ### Patches
12
+
13
+ - Add explicit module boundary types and update typescript version (elcraig@microsoft.com)
14
+ - Update dependency workspace-tools to v0.40.4 and fix deprecated API usage (email not defined)
15
+ - Show target.id in error about missing inputs (dobes@formative.com)
16
+
17
+ ## 1.9.1
18
+
19
+ Thu, 15 Jan 2026 23:24:00 GMT
20
+
21
+ ### Patches
22
+
23
+ - Update dependency workspace-tools to v0.40.0 (renovate@whitesourcesoftware.com)
24
+ - Add lint rule for no-floating-promises and fix several places (nemanjatesic@microsoft.com)
25
+
7
26
  ## 1.9.0
8
27
 
9
- Mon, 01 Sep 2025 08:10:04 GMT
28
+ Mon, 01 Sep 2025 08:10:36 GMT
10
29
 
11
30
  ### Minor changes
12
31
 
@@ -5,7 +5,7 @@ export declare class FileHasher {
5
5
  #private;
6
6
  private options;
7
7
  constructor(options: FileHashStoreOptions);
8
- getHashesFromGit(): Promise<void>;
8
+ private getHashesFromGit;
9
9
  readManifest(): Promise<void>;
10
10
  writeManifest(): void;
11
11
  hash(files: string[]): Record<string, string>;
package/lib/FileHasher.js CHANGED
@@ -73,9 +73,9 @@ function _interop_require_default(obj) {
73
73
  }
74
74
  var _store = /*#__PURE__*/ new WeakMap(), _manifestFile = /*#__PURE__*/ new WeakMap();
75
75
  class FileHasher {
76
- async getHashesFromGit() {
76
+ getHashesFromGit() {
77
77
  const { root } = this.options;
78
- const fileHashes = await (0, _getPackageDeps.getPackageDeps)(root);
78
+ const fileHashes = (0, _getPackageDeps.getPackageDeps)(root);
79
79
  const files = [
80
80
  ...fileHashes.keys()
81
81
  ];
@@ -96,9 +96,14 @@ class FileHasher {
96
96
  this.writeManifest();
97
97
  }
98
98
  async readManifest() {
99
- return new Promise((resolve)=>{
99
+ return new Promise((resolve, reject)=>{
100
100
  if (!_gracefulfs.default.existsSync(_class_private_field_get(this, _manifestFile))) {
101
- this.getHashesFromGit().then(()=>resolve());
101
+ try {
102
+ this.getHashesFromGit();
103
+ resolve();
104
+ } catch (err) {
105
+ reject(err);
106
+ }
102
107
  return;
103
108
  }
104
109
  const inputStream = _gracefulfs.default.createReadStream(_class_private_field_get(this, _manifestFile), "utf-8");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileHasher.ts"],"sourcesContent":["import fs from \"graceful-fs\";\nimport path from \"path\";\nimport { hash as fastHash, stat } from \"glob-hasher\";\nimport { createInterface } from \"node:readline\";\nimport { getPackageDeps } from \"./getPackageDeps.js\";\n\ninterface FileHashStoreOptions {\n root: string;\n}\n\ntype FileHashManifestStore = Record<\n string,\n {\n mtime: bigint;\n size: number;\n hash: string;\n }\n>;\n\nexport class FileHasher {\n #store: FileHashManifestStore = {};\n #manifestFile: string;\n\n constructor(private options: FileHashStoreOptions) {\n const { root } = options;\n const cacheDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\");\n this.#manifestFile = path.join(cacheDirectory, \"file_hashes.manifest\");\n }\n\n async getHashesFromGit() {\n const { root } = this.options;\n const fileHashes = await getPackageDeps(root);\n const files = [...fileHashes.keys()];\n const fileStats = stat(files, { cwd: root }) ?? {};\n\n for (const [relativePath, fileStat] of Object.entries(fileStats)) {\n const hash = fileHashes.get(relativePath);\n if (hash) {\n const { size, mtime } = fileStat;\n\n this.#store[relativePath] = { hash, size, mtime };\n }\n }\n\n this.writeManifest();\n }\n\n async readManifest() {\n return new Promise<void>((resolve) => {\n if (!fs.existsSync(this.#manifestFile)) {\n this.getHashesFromGit().then(() => resolve());\n return;\n }\n\n const inputStream = fs.createReadStream(this.#manifestFile, \"utf-8\");\n const rl = createInterface({\n input: inputStream,\n crlfDelay: Infinity,\n });\n\n let info: string[] = [];\n\n rl.on(\"line\", (line) => {\n info = line.split(\"\\0\");\n\n this.#store[info[0]] = {\n mtime: BigInt(info[1]),\n size: parseInt(info[2]),\n hash: info[3],\n };\n });\n\n inputStream.on(\"end\", () => {\n rl.close();\n resolve();\n });\n });\n }\n\n writeManifest() {\n fs.mkdirSync(path.dirname(this.#manifestFile), { recursive: true });\n const outputLines = Object.entries(this.#store).map(([relativePath, info]) => {\n return `${relativePath}\\0${info.mtime.toString()}\\0${info.size.toString()}\\0${info.hash}`;\n });\n\n fs.writeFileSync(this.#manifestFile, outputLines.join(\"\\n\"), \"utf-8\");\n }\n\n hash(files: string[]) {\n const hashes: Record<string, string> = {};\n\n const updatedFiles: string[] = [];\n\n const stats = stat(files, { cwd: this.options.root }) ?? {};\n\n for (const file of files) {\n const stat = stats[file];\n\n const info = this.#store[file];\n if (info && stat.mtime === info.mtime && stat.size == info.size) {\n hashes[file] = info.hash;\n } else {\n updatedFiles.push(file);\n }\n }\n\n const updatedHashes = fastHash(updatedFiles, { cwd: this.options.root, concurrency: 4 }) ?? {};\n\n for (const [file, hash] of Object.entries(updatedHashes)) {\n const stat = fs.statSync(path.join(this.options.root, file), { bigint: true });\n this.#store[file] = {\n mtime: stat.mtimeMs,\n size: Number(stat.size),\n hash: hash ?? \"\",\n };\n hashes[file] = hash ?? \"\";\n }\n\n return hashes;\n }\n}\n"],"names":["FileHasher","getHashesFromGit","root","options","fileHashes","getPackageDeps","files","keys","fileStats","stat","cwd","relativePath","fileStat","Object","entries","hash","get","size","mtime","writeManifest","readManifest","Promise","resolve","fs","existsSync","then","inputStream","createReadStream","rl","createInterface","input","crlfDelay","Infinity","info","on","line","split","BigInt","parseInt","close","mkdirSync","path","dirname","recursive","outputLines","map","toString","writeFileSync","join","hashes","updatedFiles","stats","file","push","updatedHashes","fastHash","concurrency","statSync","bigint","mtimeMs","Number","cacheDirectory"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/FileHasher.ts"],"sourcesContent":["import fs from \"graceful-fs\";\nimport path from \"path\";\nimport { hash as fastHash, stat } from \"glob-hasher\";\nimport { createInterface } from \"node:readline\";\nimport { getPackageDeps } from \"./getPackageDeps.js\";\n\ninterface FileHashStoreOptions {\n root: string;\n}\n\ntype FileHashManifestStore = Record<\n string,\n {\n mtime: bigint;\n size: number;\n hash: string;\n }\n>;\n\nexport class FileHasher {\n #store: FileHashManifestStore = {};\n #manifestFile: string;\n\n constructor(private options: FileHashStoreOptions) {\n const { root } = options;\n const cacheDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\");\n this.#manifestFile = path.join(cacheDirectory, \"file_hashes.manifest\");\n }\n\n private getHashesFromGit(): void {\n const { root } = this.options;\n const fileHashes = getPackageDeps(root);\n const files = [...fileHashes.keys()];\n const fileStats = stat(files, { cwd: root }) ?? {};\n\n for (const [relativePath, fileStat] of Object.entries(fileStats)) {\n const hash = fileHashes.get(relativePath);\n if (hash) {\n const { size, mtime } = fileStat;\n\n this.#store[relativePath] = { hash, size, mtime };\n }\n }\n\n this.writeManifest();\n }\n\n public async readManifest(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!fs.existsSync(this.#manifestFile)) {\n try {\n this.getHashesFromGit();\n resolve();\n } catch (err) {\n reject(err);\n }\n return;\n }\n\n const inputStream = fs.createReadStream(this.#manifestFile, \"utf-8\");\n const rl = createInterface({\n input: inputStream,\n crlfDelay: Infinity,\n });\n\n let info: string[] = [];\n\n rl.on(\"line\", (line) => {\n info = line.split(\"\\0\");\n\n this.#store[info[0]] = {\n mtime: BigInt(info[1]),\n size: parseInt(info[2]),\n hash: info[3],\n };\n });\n\n inputStream.on(\"end\", () => {\n rl.close();\n resolve();\n });\n });\n }\n\n public writeManifest(): void {\n fs.mkdirSync(path.dirname(this.#manifestFile), { recursive: true });\n const outputLines = Object.entries(this.#store).map(([relativePath, info]) => {\n return `${relativePath}\\0${info.mtime.toString()}\\0${info.size.toString()}\\0${info.hash}`;\n });\n\n fs.writeFileSync(this.#manifestFile, outputLines.join(\"\\n\"), \"utf-8\");\n }\n\n public hash(files: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n\n const updatedFiles: string[] = [];\n\n const stats = stat(files, { cwd: this.options.root }) ?? {};\n\n for (const file of files) {\n const stat = stats[file];\n\n const info = this.#store[file];\n if (info && stat.mtime === info.mtime && stat.size == info.size) {\n hashes[file] = info.hash;\n } else {\n updatedFiles.push(file);\n }\n }\n\n const updatedHashes = fastHash(updatedFiles, { cwd: this.options.root, concurrency: 4 }) ?? {};\n\n for (const [file, hash] of Object.entries(updatedHashes)) {\n const stat = fs.statSync(path.join(this.options.root, file), { bigint: true });\n this.#store[file] = {\n mtime: stat.mtimeMs,\n size: Number(stat.size),\n hash: hash ?? \"\",\n };\n hashes[file] = hash ?? \"\";\n }\n\n return hashes;\n }\n}\n"],"names":["FileHasher","getHashesFromGit","root","options","fileHashes","getPackageDeps","files","keys","fileStats","stat","cwd","relativePath","fileStat","Object","entries","hash","get","size","mtime","writeManifest","readManifest","Promise","resolve","reject","fs","existsSync","err","inputStream","createReadStream","rl","createInterface","input","crlfDelay","Infinity","info","on","line","split","BigInt","parseInt","close","mkdirSync","path","dirname","recursive","outputLines","map","toString","writeFileSync","join","hashes","updatedFiles","stats","file","push","updatedHashes","fastHash","concurrency","statSync","bigint","mtimeMs","Number","cacheDirectory"],"mappings":"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"}
@@ -15,6 +15,6 @@ export declare class PackageTree {
15
15
  constructor(options: PackageTreeOptions);
16
16
  reset(): void;
17
17
  initialize(): Promise<void>;
18
- addToPackageTree(filePaths: string[]): Promise<void>;
18
+ addToPackageTree(filePaths: string[]): void;
19
19
  getPackageFiles(packageName: string, patterns: string[]): string[];
20
20
  }
@@ -126,7 +126,7 @@ class PackageTree {
126
126
  }
127
127
  }
128
128
  }
129
- async addToPackageTree(filePaths) {
129
+ addToPackageTree(filePaths) {
130
130
  // key: path/to/package (packageRoot), value: array of a tuple of [file, hash]
131
131
  const packageFiles = _class_private_field_get(this, _packageFiles);
132
132
  for (const entry of filePaths){
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PackageTree.ts"],"sourcesContent":["import { type PackageInfos } from \"workspace-tools\";\n\nimport execa from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport micromatch from \"micromatch\";\n\nexport interface PackageTreeOptions {\n root: string;\n packageInfos: PackageInfos;\n includeUntracked: boolean;\n}\n\ninterface PathNode {\n children: {\n [key: string]: PathNode;\n };\n\n isPackage: boolean;\n}\n\n/**\n * Package Tree keeps a data structure to quickly find all files in a package.\n *\n * TODO: add a watcher to make sure the tree is up to date during a \"watched\" run.\n */\nexport class PackageTree {\n #tree: PathNode = { children: {}, isPackage: true };\n #packageFiles: Record<string, string[]> = {};\n #memoizedPackageFiles: Record<string, string[]> = {};\n\n constructor(private options: PackageTreeOptions) {}\n\n reset() {\n // reset the internal state\n this.#tree = { children: {}, isPackage: true };\n this.#packageFiles = {};\n this.#memoizedPackageFiles = {};\n }\n\n async initialize() {\n const { root, includeUntracked, packageInfos } = this.options;\n\n this.reset();\n\n // Generate path tree of all packages in workspace (scale: ~2000 * ~3)\n for (const info of Object.values(packageInfos)) {\n const packagePath = path.dirname(info.packageJsonPath);\n const pathParts = path.relative(root, packagePath).split(/[\\\\/]/);\n\n let currentNode = this.#tree;\n\n for (const part of pathParts) {\n // initialize the children if not already done\n currentNode.children[part] = currentNode.children[part] || { children: {}, isPackage: false };\n currentNode = currentNode.children[part];\n }\n\n currentNode.isPackage = true;\n }\n\n // Get all files in the workspace (scale: ~2000) according to git\n const lsFilesResults = await execa(\"git\", [\"ls-files\", \"-z\"], { cwd: root });\n\n if (lsFilesResults.exitCode === 0) {\n const files = lsFilesResults.stdout.split(\"\\0\").filter((f) => Boolean(f) && fs.existsSync(path.join(root, f)));\n this.addToPackageTree(files);\n }\n\n if (includeUntracked) {\n // Also get all untracked files in the workspace according to git\n const lsOtherResults = await execa(\"git\", [\"ls-files\", \"-o\", \"-z\", \"--exclude-standard\"], { cwd: root });\n if (lsOtherResults.exitCode === 0) {\n const files = lsOtherResults.stdout.split(\"\\0\").filter(Boolean);\n this.addToPackageTree(files);\n }\n }\n }\n\n async addToPackageTree(filePaths: string[]) {\n // key: path/to/package (packageRoot), value: array of a tuple of [file, hash]\n const packageFiles = this.#packageFiles;\n\n for (const entry of filePaths) {\n const pathParts = entry.split(/[\\\\/]/);\n\n let node = this.#tree;\n\n const pathPartsBuffer: string[] = [];\n let packagePathParts: string[] = [];\n\n for (const part of pathParts) {\n if (node.children[part]) {\n node = node.children[part] as PathNode;\n pathPartsBuffer.push(part);\n\n if (node.isPackage) {\n packagePathParts = [...pathPartsBuffer];\n }\n } else {\n break;\n }\n }\n\n const packageRoot = packagePathParts.join(\"/\");\n packageFiles[packageRoot] = packageFiles[packageRoot] || [];\n packageFiles[packageRoot].push(entry);\n }\n }\n\n getPackageFiles(packageName: string, patterns: string[]) {\n const { root, packageInfos } = this.options;\n const packagePath = path.relative(root, path.dirname(packageInfos[packageName].packageJsonPath)).replace(/\\\\/g, \"/\");\n\n const packageFiles = this.#packageFiles[packagePath];\n\n if (!packageFiles) {\n return [];\n }\n\n const key = `${packageName}\\0${patterns.join(\"\\0\")}`;\n\n if (!this.#memoizedPackageFiles[key]) {\n const packagePatterns = patterns.map((pattern) => {\n if (pattern.startsWith(\"!\")) {\n return `!${path.join(packagePath, pattern.slice(1)).replace(/\\\\/g, \"/\")}`;\n }\n\n return path.join(packagePath, pattern).replace(/\\\\/g, \"/\");\n });\n this.#memoizedPackageFiles[key] = micromatch(packageFiles, packagePatterns, { dot: true });\n }\n\n return this.#memoizedPackageFiles[key];\n }\n}\n"],"names":["PackageTree","reset","children","isPackage","initialize","root","includeUntracked","packageInfos","options","info","Object","values","packagePath","path","dirname","packageJsonPath","pathParts","relative","split","currentNode","part","lsFilesResults","execa","cwd","exitCode","files","stdout","filter","f","Boolean","fs","existsSync","join","addToPackageTree","lsOtherResults","filePaths","packageFiles","entry","node","pathPartsBuffer","packagePathParts","push","packageRoot","getPackageFiles","packageName","patterns","replace","key","packagePatterns","map","pattern","startsWith","slice","micromatch","dot"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/PackageTree.ts"],"sourcesContent":["import { type PackageInfos } from \"workspace-tools\";\n\nimport execa from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport micromatch from \"micromatch\";\n\nexport interface PackageTreeOptions {\n root: string;\n packageInfos: PackageInfos;\n includeUntracked: boolean;\n}\n\ninterface PathNode {\n children: {\n [key: string]: PathNode;\n };\n\n isPackage: boolean;\n}\n\n/**\n * Package Tree keeps a data structure to quickly find all files in a package.\n *\n * TODO: add a watcher to make sure the tree is up to date during a \"watched\" run.\n */\nexport class PackageTree {\n #tree: PathNode = { children: {}, isPackage: true };\n #packageFiles: Record<string, string[]> = {};\n #memoizedPackageFiles: Record<string, string[]> = {};\n\n constructor(private options: PackageTreeOptions) {}\n\n reset(): void {\n // reset the internal state\n this.#tree = { children: {}, isPackage: true };\n this.#packageFiles = {};\n this.#memoizedPackageFiles = {};\n }\n\n async initialize(): Promise<void> {\n const { root, includeUntracked, packageInfos } = this.options;\n\n this.reset();\n\n // Generate path tree of all packages in workspace (scale: ~2000 * ~3)\n for (const info of Object.values(packageInfos)) {\n const packagePath = path.dirname(info.packageJsonPath);\n const pathParts = path.relative(root, packagePath).split(/[\\\\/]/);\n\n let currentNode = this.#tree;\n\n for (const part of pathParts) {\n // initialize the children if not already done\n currentNode.children[part] = currentNode.children[part] || { children: {}, isPackage: false };\n currentNode = currentNode.children[part];\n }\n\n currentNode.isPackage = true;\n }\n\n // Get all files in the workspace (scale: ~2000) according to git\n const lsFilesResults = await execa(\"git\", [\"ls-files\", \"-z\"], { cwd: root });\n\n if (lsFilesResults.exitCode === 0) {\n const files = lsFilesResults.stdout.split(\"\\0\").filter((f) => Boolean(f) && fs.existsSync(path.join(root, f)));\n this.addToPackageTree(files);\n }\n\n if (includeUntracked) {\n // Also get all untracked files in the workspace according to git\n const lsOtherResults = await execa(\"git\", [\"ls-files\", \"-o\", \"-z\", \"--exclude-standard\"], { cwd: root });\n if (lsOtherResults.exitCode === 0) {\n const files = lsOtherResults.stdout.split(\"\\0\").filter(Boolean);\n this.addToPackageTree(files);\n }\n }\n }\n\n addToPackageTree(filePaths: string[]): void {\n // key: path/to/package (packageRoot), value: array of a tuple of [file, hash]\n const packageFiles = this.#packageFiles;\n\n for (const entry of filePaths) {\n const pathParts = entry.split(/[\\\\/]/);\n\n let node = this.#tree;\n\n const pathPartsBuffer: string[] = [];\n let packagePathParts: string[] = [];\n\n for (const part of pathParts) {\n if (node.children[part]) {\n node = node.children[part] as PathNode;\n pathPartsBuffer.push(part);\n\n if (node.isPackage) {\n packagePathParts = [...pathPartsBuffer];\n }\n } else {\n break;\n }\n }\n\n const packageRoot = packagePathParts.join(\"/\");\n packageFiles[packageRoot] = packageFiles[packageRoot] || [];\n packageFiles[packageRoot].push(entry);\n }\n }\n\n getPackageFiles(packageName: string, patterns: string[]): string[] {\n const { root, packageInfos } = this.options;\n const packagePath = path.relative(root, path.dirname(packageInfos[packageName].packageJsonPath)).replace(/\\\\/g, \"/\");\n\n const packageFiles = this.#packageFiles[packagePath];\n\n if (!packageFiles) {\n return [];\n }\n\n const key = `${packageName}\\0${patterns.join(\"\\0\")}`;\n\n if (!this.#memoizedPackageFiles[key]) {\n const packagePatterns = patterns.map((pattern) => {\n if (pattern.startsWith(\"!\")) {\n return `!${path.join(packagePath, pattern.slice(1)).replace(/\\\\/g, \"/\")}`;\n }\n\n return path.join(packagePath, pattern).replace(/\\\\/g, \"/\");\n });\n this.#memoizedPackageFiles[key] = micromatch(packageFiles, packagePatterns, { dot: true });\n }\n\n return this.#memoizedPackageFiles[key];\n }\n}\n"],"names":["PackageTree","reset","children","isPackage","initialize","root","includeUntracked","packageInfos","options","info","Object","values","packagePath","path","dirname","packageJsonPath","pathParts","relative","split","currentNode","part","lsFilesResults","execa","cwd","exitCode","files","stdout","filter","f","Boolean","fs","existsSync","join","addToPackageTree","lsOtherResults","filePaths","packageFiles","entry","node","pathPartsBuffer","packagePathParts","push","packageRoot","getPackageFiles","packageName","patterns","replace","key","packagePatterns","map","pattern","startsWith","slice","micromatch","dot"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Target } from "@lage-run/target-graph";
2
- import { type ParsedLock, type WorkspaceInfo, type PackageInfos } from "workspace-tools";
2
+ import { type ParsedLock, type WorkspaceInfos, type PackageInfos } from "workspace-tools";
3
3
  import type { DependencyMap } from "workspace-tools/lib/graph/createDependencyMap.js";
4
4
  import { FileHasher } from "./FileHasher.js";
5
5
  import type { Logger } from "@lage-run/logger";
@@ -40,12 +40,12 @@ export declare class TargetHasher {
40
40
  packageTree: PackageTree | undefined;
41
41
  initializedPromise: Promise<unknown> | undefined;
42
42
  packageInfos: PackageInfos;
43
- workspaceInfo: WorkspaceInfo | undefined;
43
+ workspaceInfo: WorkspaceInfos | undefined;
44
44
  globalInputsHash: Record<string, string> | undefined;
45
45
  lockInfo: ParsedLock | undefined;
46
46
  targetHashes: Record<string, string>;
47
47
  dependencyMap: DependencyMap;
48
- getPackageInfos(workspacePackages: WorkspaceInfo): PackageInfos;
48
+ getPackageInfos(workspacePackages: WorkspaceInfos): PackageInfos;
49
49
  constructor(options: TargetHasherOptions);
50
50
  ensureInitialized(): void;
51
51
  initialize(): Promise<void>;
@@ -77,7 +77,7 @@ class TargetHasher {
77
77
  this.fileHasher.readManifest().then(()=>(0, _globby.globAsync)(environmentGlob, {
78
78
  cwd: root
79
79
  })).then((files)=>this.fileHasher.hash(files)).then((hash)=>this.globalInputsHash = hash),
80
- (0, _workspacetools.getWorkspacesAsync)(root).then((workspaceInfo)=>this.workspaceInfo = workspaceInfo).then(()=>{
80
+ (0, _workspacetools.getWorkspaceInfosAsync)(root).then((workspaceInfo)=>this.workspaceInfo = workspaceInfo).then(()=>{
81
81
  this.packageInfos = this.getPackageInfos(this.workspaceInfo);
82
82
  this.dependencyMap = (0, _workspacetools.createDependencyMap)(this.packageInfos, {
83
83
  withDevDependencies: true,
@@ -104,7 +104,7 @@ class TargetHasher {
104
104
  const { root } = this.options;
105
105
  if (target.cwd === root && target.cache) {
106
106
  if (!target.inputs) {
107
- throw new Error("Root-level targets must have `inputs` defined if it has cache enabled.");
107
+ throw new Error(`No "inputs" specified for target "${target.id}"; cannot cache.`);
108
108
  }
109
109
  const files = await (0, _globby.globAsync)(target.inputs, {
110
110
  cwd: root
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TargetHasher.ts"],"sourcesContent":["import type { Target } from \"@lage-run/target-graph\";\nimport { hash } from \"glob-hasher\";\nimport { globAsync } from \"@lage-run/globby\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n type ParsedLock,\n type WorkspaceInfo,\n type PackageInfos,\n getWorkspacesAsync,\n parseLockFile,\n createDependencyMap,\n} from \"workspace-tools\";\nimport type { DependencyMap } from \"workspace-tools/lib/graph/createDependencyMap.js\";\nimport { infoFromPackageJson } from \"workspace-tools/lib/infoFromPackageJson.js\";\n\nimport { hashStrings } from \"./hashStrings.js\";\nimport { resolveInternalDependencies } from \"./resolveInternalDependencies.js\";\nimport { resolveExternalDependencies } from \"./resolveExternalDependencies.js\";\nimport { FileHasher } from \"./FileHasher.js\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { PackageTree } from \"./PackageTree.js\";\nimport { getInputFiles } from \"./getInputFiles.js\";\n\nexport interface TargetHasherOptions {\n root: string;\n environmentGlob: string[];\n cacheKey?: string;\n cliArgs?: string[];\n logger?: Logger;\n}\n\nexport interface TargetManifest {\n id: string;\n hash: string;\n globalInputsHash: string;\n dependency: Record<string, string>;\n fileHasher: FileHasher;\n files: Record<\n string,\n {\n mtimeMs: number;\n size: number;\n hash: string;\n }\n >;\n}\n\n/**\n * TargetHasher is a class that can be used to generate a hash of a target.\n *\n * Currently, it encapsulates the use of `backfill-hasher` to generate a hash.\n */\nexport class TargetHasher {\n targetHashesLog: Record<string, { fileHashes: Record<string, string>; globalFileHashes: Record<string, string> }> = {};\n targetHashesDirectory: string;\n\n logger: Logger | undefined;\n fileHasher: FileHasher;\n packageTree: PackageTree | undefined;\n\n initializedPromise: Promise<unknown> | undefined;\n\n packageInfos: PackageInfos = {};\n workspaceInfo: WorkspaceInfo | undefined;\n globalInputsHash: Record<string, string> | undefined;\n lockInfo: ParsedLock | undefined;\n targetHashes: Record<string, string> = {};\n\n dependencyMap: DependencyMap = {\n dependencies: new Map(),\n dependents: new Map(),\n };\n\n getPackageInfos(workspacePackages: WorkspaceInfo) {\n const { root } = this.options;\n const packageInfos: PackageInfos = {};\n\n if (workspacePackages.length) {\n for (const pkg of workspacePackages) {\n packageInfos[pkg.name] = pkg.packageJson;\n }\n } else {\n const packageJsonPath = path.join(root, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const rootInfo = infoFromPackageJson(packageJson, packageJsonPath);\n if (rootInfo) {\n packageInfos[rootInfo.name] = rootInfo;\n }\n } catch (e) {\n throw new Error(`Invalid package.json file detected ${packageJsonPath}: ${(e as Error)?.message || e}`);\n }\n }\n }\n\n return packageInfos;\n }\n\n constructor(private options: TargetHasherOptions) {\n const { root, logger } = options;\n this.logger = logger;\n\n this.fileHasher = new FileHasher({\n root,\n });\n\n this.targetHashesDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\", \"hashes\");\n\n if (!fs.existsSync(this.targetHashesDirectory)) {\n fs.mkdirSync(this.targetHashesDirectory, { recursive: true });\n }\n }\n\n ensureInitialized() {\n if (!this.initializedPromise) {\n throw new Error(\"TargetHasher is not initialized\");\n }\n }\n\n async initialize() {\n const { environmentGlob, root } = this.options;\n\n if (this.initializedPromise) {\n await this.initializedPromise;\n return;\n }\n\n this.initializedPromise = Promise.all([\n this.fileHasher\n .readManifest()\n .then(() => globAsync(environmentGlob, { cwd: root }))\n .then((files) => this.fileHasher.hash(files))\n .then((hash) => (this.globalInputsHash = hash)),\n\n getWorkspacesAsync(root)\n .then((workspaceInfo) => (this.workspaceInfo = workspaceInfo))\n .then(() => {\n this.packageInfos = this.getPackageInfos(this.workspaceInfo!);\n\n this.dependencyMap = createDependencyMap(this.packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n this.packageTree = new PackageTree({\n root,\n packageInfos: this.packageInfos,\n\n // TODO: (optimization) false if process.env.TF_BUILD || process.env.CI\n includeUntracked: true,\n });\n\n return this.packageTree.initialize();\n }),\n\n parseLockFile(root).then((lockInfo) => (this.lockInfo = lockInfo)),\n ]);\n\n await this.initializedPromise;\n\n if (this.logger !== undefined) {\n const globalInputsHash = hashStrings(Object.values(this.globalInputsHash ?? {}));\n this.logger.verbose(`Global inputs hash: ${globalInputsHash}`);\n }\n }\n\n async hash(target: Target): Promise<string> {\n this.ensureInitialized();\n\n const { root } = this.options;\n\n if (target.cwd === root && target.cache) {\n if (!target.inputs) {\n throw new Error(\"Root-level targets must have `inputs` defined if it has cache enabled.\");\n }\n\n const files = await globAsync(target.inputs, { cwd: root });\n const fileFashes = hash(files, { cwd: root }) ?? {};\n\n const hashes = Object.values(fileFashes) as string[];\n\n return hashStrings(hashes);\n }\n\n // 1. add hash of target's inputs\n // 2. add hash of target packages' internal and external deps\n const { dependencies, devDependencies } = this.packageInfos[target.packageName!];\n\n const workspaceInfo = this.workspaceInfo!;\n const parsedLock = this.lockInfo!;\n\n const allDependencies: Record<string, string> = {\n ...dependencies,\n ...devDependencies,\n };\n\n const internalDeps = resolveInternalDependencies(allDependencies, workspaceInfo);\n const externalDeps = resolveExternalDependencies(allDependencies, workspaceInfo, parsedLock);\n const resolvedDependencies = [...internalDeps, ...externalDeps].sort();\n\n const files = getInputFiles(target, this.dependencyMap, this.packageTree!);\n const fileHashes = this.fileHasher.hash(files) ?? {}; // this list is sorted by file name\n\n // get target hashes\n const targetDepHashes = target.dependencies?.sort().map((targetDep) => this.targetHashes[targetDep]);\n\n const globalFileHashes = await this.getEnvironmentGlobHashes(root, target);\n\n const combinedHashes = [\n // Environmental hashes\n ...Object.values(globalFileHashes),\n `${target.id}|${JSON.stringify(this.options.cliArgs)}`,\n this.options.cacheKey || \"\",\n\n // File content hashes based on target.inputs\n ...Object.values(fileHashes),\n\n // Dependency hashes\n ...resolvedDependencies,\n ...targetDepHashes,\n ].filter(Boolean);\n\n const hashString = hashStrings(combinedHashes);\n\n this.targetHashes[target.id] = hashString;\n\n this.targetHashesLog[target.id] = { fileHashes, globalFileHashes };\n\n return hashString;\n }\n\n writeTargetHashesManifest() {\n for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)) {\n const targetHashesManifestPath = path.join(this.targetHashesDirectory, `${id}.json`);\n if (!fs.existsSync(path.dirname(targetHashesManifestPath))) {\n fs.mkdirSync(path.dirname(targetHashesManifestPath), { recursive: true });\n }\n fs.writeFileSync(targetHashesManifestPath, JSON.stringify({ fileHashes, globalFileHashes }), \"utf-8\");\n }\n }\n\n async getEnvironmentGlobHashes(root: string, target: Target) {\n const globalFileHashes = target.environmentGlob\n ? this.fileHasher.hash(await globAsync(target.environmentGlob ?? [], { cwd: root }))\n : (this.globalInputsHash ?? {});\n\n return globalFileHashes;\n }\n\n async cleanup() {\n this.writeTargetHashesManifest();\n await this.fileHasher.writeManifest();\n }\n}\n"],"names":["TargetHasher","getPackageInfos","workspacePackages","root","options","packageInfos","length","pkg","name","packageJson","packageJsonPath","path","join","fs","existsSync","JSON","parse","readFileSync","rootInfo","infoFromPackageJson","e","Error","message","ensureInitialized","initializedPromise","initialize","environmentGlob","Promise","all","fileHasher","readManifest","then","globAsync","cwd","files","hash","globalInputsHash","getWorkspacesAsync","workspaceInfo","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","parseLockFile","lockInfo","logger","undefined","hashStrings","Object","values","verbose","target","cache","inputs","fileFashes","hashes","dependencies","devDependencies","packageName","parsedLock","allDependencies","internalDeps","resolveInternalDependencies","externalDeps","resolveExternalDependencies","resolvedDependencies","sort","getInputFiles","fileHashes","targetDepHashes","map","targetDep","targetHashes","globalFileHashes","getEnvironmentGlobHashes","combinedHashes","id","stringify","cliArgs","cacheKey","filter","Boolean","hashString","targetHashesLog","writeTargetHashesManifest","entries","targetHashesManifestPath","targetHashesDirectory","dirname","mkdirSync","recursive","writeFileSync","cleanup","writeManifest","Map","dependents","FileHasher"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/TargetHasher.ts"],"sourcesContent":["import type { Target } from \"@lage-run/target-graph\";\nimport { hash } from \"glob-hasher\";\nimport { globAsync } from \"@lage-run/globby\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n type ParsedLock,\n type WorkspaceInfos,\n type PackageInfos,\n getWorkspaceInfosAsync,\n parseLockFile,\n createDependencyMap,\n} from \"workspace-tools\";\nimport type { DependencyMap } from \"workspace-tools/lib/graph/createDependencyMap.js\";\nimport { infoFromPackageJson } from \"workspace-tools/lib/infoFromPackageJson.js\";\n\nimport { hashStrings } from \"./hashStrings.js\";\nimport { resolveInternalDependencies } from \"./resolveInternalDependencies.js\";\nimport { resolveExternalDependencies } from \"./resolveExternalDependencies.js\";\nimport { FileHasher } from \"./FileHasher.js\";\nimport type { Logger } from \"@lage-run/logger\";\nimport { PackageTree } from \"./PackageTree.js\";\nimport { getInputFiles } from \"./getInputFiles.js\";\n\nexport interface TargetHasherOptions {\n root: string;\n environmentGlob: string[];\n cacheKey?: string;\n cliArgs?: string[];\n logger?: Logger;\n}\n\nexport interface TargetManifest {\n id: string;\n hash: string;\n globalInputsHash: string;\n dependency: Record<string, string>;\n fileHasher: FileHasher;\n files: Record<\n string,\n {\n mtimeMs: number;\n size: number;\n hash: string;\n }\n >;\n}\n\n/**\n * TargetHasher is a class that can be used to generate a hash of a target.\n *\n * Currently, it encapsulates the use of `backfill-hasher` to generate a hash.\n */\nexport class TargetHasher {\n targetHashesLog: Record<string, { fileHashes: Record<string, string>; globalFileHashes: Record<string, string> }> = {};\n targetHashesDirectory: string;\n\n logger: Logger | undefined;\n fileHasher: FileHasher;\n packageTree: PackageTree | undefined;\n\n initializedPromise: Promise<unknown> | undefined;\n\n packageInfos: PackageInfos = {};\n workspaceInfo: WorkspaceInfos | undefined;\n globalInputsHash: Record<string, string> | undefined;\n lockInfo: ParsedLock | undefined;\n targetHashes: Record<string, string> = {};\n\n dependencyMap: DependencyMap = {\n dependencies: new Map(),\n dependents: new Map(),\n };\n\n getPackageInfos(workspacePackages: WorkspaceInfos): PackageInfos {\n const { root } = this.options;\n const packageInfos: PackageInfos = {};\n\n if (workspacePackages.length) {\n for (const pkg of workspacePackages) {\n packageInfos[pkg.name] = pkg.packageJson;\n }\n } else {\n const packageJsonPath = path.join(root, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const rootInfo = infoFromPackageJson(packageJson, packageJsonPath);\n if (rootInfo) {\n packageInfos[rootInfo.name] = rootInfo;\n }\n } catch (e) {\n throw new Error(`Invalid package.json file detected ${packageJsonPath}: ${(e as Error)?.message || e}`);\n }\n }\n }\n\n return packageInfos;\n }\n\n constructor(private options: TargetHasherOptions) {\n const { root, logger } = options;\n this.logger = logger;\n\n this.fileHasher = new FileHasher({\n root,\n });\n\n this.targetHashesDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\", \"hashes\");\n\n if (!fs.existsSync(this.targetHashesDirectory)) {\n fs.mkdirSync(this.targetHashesDirectory, { recursive: true });\n }\n }\n\n ensureInitialized(): void {\n if (!this.initializedPromise) {\n throw new Error(\"TargetHasher is not initialized\");\n }\n }\n\n async initialize(): Promise<void> {\n const { environmentGlob, root } = this.options;\n\n if (this.initializedPromise) {\n await this.initializedPromise;\n return;\n }\n\n this.initializedPromise = Promise.all([\n this.fileHasher\n .readManifest()\n .then(() => globAsync(environmentGlob, { cwd: root }))\n .then((files) => this.fileHasher.hash(files))\n .then((hash) => (this.globalInputsHash = hash)),\n\n getWorkspaceInfosAsync(root)\n .then((workspaceInfo) => (this.workspaceInfo = workspaceInfo))\n .then(() => {\n this.packageInfos = this.getPackageInfos(this.workspaceInfo!);\n\n this.dependencyMap = createDependencyMap(this.packageInfos, { withDevDependencies: true, withPeerDependencies: false });\n this.packageTree = new PackageTree({\n root,\n packageInfos: this.packageInfos,\n\n // TODO: (optimization) false if process.env.TF_BUILD || process.env.CI\n includeUntracked: true,\n });\n\n return this.packageTree.initialize();\n }),\n\n parseLockFile(root).then((lockInfo) => (this.lockInfo = lockInfo)),\n ]);\n\n await this.initializedPromise;\n\n if (this.logger !== undefined) {\n const globalInputsHash = hashStrings(Object.values(this.globalInputsHash ?? {}));\n this.logger.verbose(`Global inputs hash: ${globalInputsHash}`);\n }\n }\n\n async hash(target: Target): Promise<string> {\n this.ensureInitialized();\n\n const { root } = this.options;\n\n if (target.cwd === root && target.cache) {\n if (!target.inputs) {\n throw new Error(`No \"inputs\" specified for target \"${target.id}\"; cannot cache.`);\n }\n\n const files = await globAsync(target.inputs, { cwd: root });\n const fileFashes = hash(files, { cwd: root }) ?? {};\n\n const hashes = Object.values(fileFashes) as string[];\n\n return hashStrings(hashes);\n }\n\n // 1. add hash of target's inputs\n // 2. add hash of target packages' internal and external deps\n const { dependencies, devDependencies } = this.packageInfos[target.packageName!];\n\n const workspaceInfo = this.workspaceInfo!;\n const parsedLock = this.lockInfo!;\n\n const allDependencies: Record<string, string> = {\n ...dependencies,\n ...devDependencies,\n };\n\n const internalDeps = resolveInternalDependencies(allDependencies, workspaceInfo);\n const externalDeps = resolveExternalDependencies(allDependencies, workspaceInfo, parsedLock);\n const resolvedDependencies = [...internalDeps, ...externalDeps].sort();\n\n const files = getInputFiles(target, this.dependencyMap, this.packageTree!);\n const fileHashes = this.fileHasher.hash(files) ?? {}; // this list is sorted by file name\n\n // get target hashes\n const targetDepHashes = target.dependencies?.sort().map((targetDep) => this.targetHashes[targetDep]);\n\n const globalFileHashes = await this.getEnvironmentGlobHashes(root, target);\n\n const combinedHashes = [\n // Environmental hashes\n ...Object.values(globalFileHashes),\n `${target.id}|${JSON.stringify(this.options.cliArgs)}`,\n this.options.cacheKey || \"\",\n\n // File content hashes based on target.inputs\n ...Object.values(fileHashes),\n\n // Dependency hashes\n ...resolvedDependencies,\n ...targetDepHashes,\n ].filter(Boolean);\n\n const hashString = hashStrings(combinedHashes);\n\n this.targetHashes[target.id] = hashString;\n\n this.targetHashesLog[target.id] = { fileHashes, globalFileHashes };\n\n return hashString;\n }\n\n writeTargetHashesManifest(): void {\n for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)) {\n const targetHashesManifestPath = path.join(this.targetHashesDirectory, `${id}.json`);\n if (!fs.existsSync(path.dirname(targetHashesManifestPath))) {\n fs.mkdirSync(path.dirname(targetHashesManifestPath), { recursive: true });\n }\n fs.writeFileSync(targetHashesManifestPath, JSON.stringify({ fileHashes, globalFileHashes }), \"utf-8\");\n }\n }\n\n async getEnvironmentGlobHashes(root: string, target: Target): Promise<Record<string, string>> {\n const globalFileHashes = target.environmentGlob\n ? this.fileHasher.hash(await globAsync(target.environmentGlob ?? [], { cwd: root }))\n : (this.globalInputsHash ?? {});\n\n return globalFileHashes;\n }\n\n async cleanup(): Promise<void> {\n this.writeTargetHashesManifest();\n await this.fileHasher.writeManifest();\n }\n}\n"],"names":["TargetHasher","getPackageInfos","workspacePackages","root","options","packageInfos","length","pkg","name","packageJson","packageJsonPath","path","join","fs","existsSync","JSON","parse","readFileSync","rootInfo","infoFromPackageJson","e","Error","message","ensureInitialized","initializedPromise","initialize","environmentGlob","Promise","all","fileHasher","readManifest","then","globAsync","cwd","files","hash","globalInputsHash","getWorkspaceInfosAsync","workspaceInfo","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","parseLockFile","lockInfo","logger","undefined","hashStrings","Object","values","verbose","target","cache","inputs","id","fileFashes","hashes","dependencies","devDependencies","packageName","parsedLock","allDependencies","internalDeps","resolveInternalDependencies","externalDeps","resolveExternalDependencies","resolvedDependencies","sort","getInputFiles","fileHashes","targetDepHashes","map","targetDep","targetHashes","globalFileHashes","getEnvironmentGlobHashes","combinedHashes","stringify","cliArgs","cacheKey","filter","Boolean","hashString","targetHashesLog","writeTargetHashesManifest","entries","targetHashesManifestPath","targetHashesDirectory","dirname","mkdirSync","recursive","writeFileSync","cleanup","writeManifest","Map","dependents","FileHasher"],"mappings":"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"}
@@ -1 +1 @@
1
- export const internalCacheFolder: string;
1
+ export let internalCacheFolder: string;
@@ -1 +1 @@
1
- export const global: boolean;
1
+ export let global: boolean;
@@ -1 +1 @@
1
- export const global2: boolean;
1
+ export let global2: boolean;
@@ -1 +1 @@
1
- export const global: boolean;
1
+ export let global: boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/PackageTree.test.ts"],"sourcesContent":["import path from \"path\";\n\nimport { PackageTree, TargetHasher } from \"../index\";\nimport fs from \"fs\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nimport { Target } from \"@lage-run/target-graph\";\nimport { getPackageInfos } from \"workspace-tools\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\ndescribe(\"PackageTree\", () => {\n test(\"can find all files of a monorepo\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*\"]);\n\n expect(files).toHaveLength(3);\n });\n\n test(\"can find all files of a monorepo with a pattern\", async () => {\n const monorepo = new Monorepo(\"monorepo2\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*.ts\"]);\n\n expect(files).toHaveLength(1);\n });\n\n test(\"can find all files of a monorepo with nested files\", async () => {\n const monorepo = new Monorepo(\"monorepo-nested\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-nested\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*.ts\"]);\n const allFiles = packageTree.getPackageFiles(\"package-a\", [\"**/*\"]);\n\n expect(files).toHaveLength(2);\n expect(allFiles).toHaveLength(4);\n\n const files2 = packageTree.getPackageFiles(\"package-b\", [\"**/*.ts\"]);\n const allFiles2 = packageTree.getPackageFiles(\"package-b\", [\"**/*\"]);\n\n expect(files2).toHaveLength(1);\n expect(allFiles2).toHaveLength(3);\n });\n});\n"],"names":["fixturesPath","path","join","__dirname","describe","test","monorepo","Monorepo","init","packageRoot","root","packageInfos","getPackageInfos","packageTree","PackageTree","includeUntracked","initialize","files","getPackageFiles","expect","toHaveLength","allFiles","files2","allFiles2"],"mappings":";;;;6DAAiB;uBAEyB;iCAEjB;gCAEO;;;;;;AAChC,MAAMA,eAAeC,aAAI,CAACC,IAAI,CAACC,WAAW,MAAM;AAEhDC,SAAS,eAAe;IACtBC,KAAK,oCAAoC;QACvC,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAE/DC,OAAOF,OAAOG,YAAY,CAAC;IAC7B;IAEAf,KAAK,mDAAmD;QACtD,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QAElEC,OAAOF,OAAOG,YAAY,CAAC;IAC7B;IAEAf,KAAK,sDAAsD;QACzD,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QAClE,MAAMG,WAAWR,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAElEC,OAAOF,OAAOG,YAAY,CAAC;QAC3BD,OAAOE,UAAUD,YAAY,CAAC;QAE9B,MAAME,SAAST,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QACnE,MAAMK,YAAYV,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAEnEC,OAAOG,QAAQF,YAAY,CAAC;QAC5BD,OAAOI,WAAWH,YAAY,CAAC;IACjC;AACF"}
1
+ {"version":3,"sources":["../../src/__tests__/PackageTree.test.ts"],"sourcesContent":["import path from \"path\";\n\nimport { PackageTree } from \"../index\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nimport { getPackageInfos } from \"workspace-tools\";\n\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\ndescribe(\"PackageTree\", () => {\n test(\"can find all files of a monorepo\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*\"]);\n\n expect(files).toHaveLength(3);\n });\n\n test(\"can find all files of a monorepo with a pattern\", async () => {\n const monorepo = new Monorepo(\"monorepo2\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*.ts\"]);\n\n expect(files).toHaveLength(1);\n });\n\n test(\"can find all files of a monorepo with nested files\", async () => {\n const monorepo = new Monorepo(\"monorepo-nested\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-nested\"));\n const packageRoot = monorepo.root;\n\n const packageInfos = getPackageInfos(packageRoot);\n\n const packageTree = new PackageTree({\n includeUntracked: true,\n root: packageRoot,\n packageInfos,\n });\n\n await packageTree.initialize();\n\n const files = packageTree.getPackageFiles(\"package-a\", [\"**/*.ts\"]);\n const allFiles = packageTree.getPackageFiles(\"package-a\", [\"**/*\"]);\n\n expect(files).toHaveLength(2);\n expect(allFiles).toHaveLength(4);\n\n const files2 = packageTree.getPackageFiles(\"package-b\", [\"**/*.ts\"]);\n const allFiles2 = packageTree.getPackageFiles(\"package-b\", [\"**/*\"]);\n\n expect(files2).toHaveLength(1);\n expect(allFiles2).toHaveLength(3);\n });\n});\n"],"names":["fixturesPath","path","join","__dirname","describe","test","monorepo","Monorepo","init","packageRoot","root","packageInfos","getPackageInfos","packageTree","PackageTree","includeUntracked","initialize","files","getPackageFiles","expect","toHaveLength","allFiles","files2","allFiles2"],"mappings":";;;;6DAAiB;uBAEW;iCACH;gCACO;;;;;;AAEhC,MAAMA,eAAeC,aAAI,CAACC,IAAI,CAACC,WAAW,MAAM;AAEhDC,SAAS,eAAe;IACtBC,KAAK,oCAAoC;QACvC,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAE/DC,OAAOF,OAAOG,YAAY,CAAC;IAC7B;IAEAf,KAAK,mDAAmD;QACtD,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QAElEC,OAAOF,OAAOG,YAAY,CAAC;IAC7B;IAEAf,KAAK,sDAAsD;QACzD,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;QAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAc;QAC5C,MAAMS,cAAcH,SAASI,IAAI;QAEjC,MAAMC,eAAeC,IAAAA,+BAAe,EAACH;QAErC,MAAMI,cAAc,IAAIC,kBAAW,CAAC;YAClCC,kBAAkB;YAClBL,MAAMD;YACNE;QACF;QAEA,MAAME,YAAYG,UAAU;QAE5B,MAAMC,QAAQJ,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QAClE,MAAMG,WAAWR,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAElEC,OAAOF,OAAOG,YAAY,CAAC;QAC3BD,OAAOE,UAAUD,YAAY,CAAC;QAE9B,MAAME,SAAST,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAU;QACnE,MAAMK,YAAYV,YAAYK,eAAe,CAAC,aAAa;YAAC;SAAO;QAEnEC,OAAOG,QAAQF,YAAY,CAAC;QAC5BD,OAAOI,WAAWH,YAAY,CAAC;IACjC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/getPackageDeps.test.ts"],"sourcesContent":["import * as path from \"path\";\nimport * as fs from \"fs\";\nimport { execSync } from \"child_process\";\n\nimport { getPackageDeps, parseGitLsTree, parseGitFilename } from \"../getPackageDeps\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\n\nconst SOURCE_PATH: string = path.join(__dirname, \"..\", \"__fixtures__\");\n\nconst TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"test-project\");\nconst NESTED_TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"nested-test-project\");\n\nconst FileSystem = {\n writeFile: fs.writeFileSync,\n deleteFile: fs.rmSync,\n};\n\ndescribe(parseGitFilename.name, () => {\n it(\"can parse backslash-escaped filenames\", () => {\n expect(parseGitFilename(\"some/path/to/a/file name\")).toEqual(\"some/path/to/a/file name\");\n expect(parseGitFilename('\"some/path/to/a/file?name\"')).toEqual(\"some/path/to/a/file?name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\name\"')).toEqual(\"some/path/to/a/file\\\\name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file网网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\347\\\\\\\\\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\347\\\\网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\网网name\");\n });\n});\n\ndescribe(parseGitLsTree.name, () => {\n it(\"can handle a blob\", () => {\n const filename: string = \"src/typings/tsd.d.ts\";\n const hash: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const output: string = `100644 blob ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle a submodule\", () => {\n const filename: string = \"rushstack\";\n const hash: string = \"c5880bf5b0c6c1f2e2c43c95beeb8f0a808e8bac\";\n\n const output: string = `160000 commit ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle multiple lines\", () => {\n const filename1: string = \"src/typings/tsd.d.ts\";\n const hash1: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const filename2: string = \"src/foo bar/tsd.d.ts\";\n const hash2: string = \"0123456789abcdef1234567890abcdef01234567\";\n\n const output: string = `100644 blob ${hash1}\\t${filename1}\\n100666 blob ${hash2}\\t${filename2}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(2); // Expect there to be exactly 2 changes\n expect(changes.get(filename1)).toEqual(hash1); // Expect the hash to be ${hash1}\n expect(changes.get(filename2)).toEqual(hash2); // Expect the hash to be ${hash2}\n });\n\n it(\"throws with malformed input\", () => {\n expect(parseGitLsTree.bind(undefined, \"some super malformed input\")).toThrow();\n });\n});\n\ndescribe(getPackageDeps.name, () => {\n it(\"can parse committed file\", async () => {\n const monorepo = new Monorepo(\"parse-commited-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n });\n\n it(\"can handle files in subfolders\", async () => {\n const monorepo = new Monorepo(\"files-in-subfolders\");\n await monorepo.init(NESTED_TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"src/file 1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n\n await monorepo.cleanup();\n }, 60_000);\n\n it(\"can handle adding one file\", async () => {\n const monorepo = new Monorepo(\"add-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle adding two files\", async () => {\n const monorepo = new Monorepo(\"add-two-files\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath1: string = path.join(monorepo.root, \"a.txt\");\n const tempFilePath2: string = path.join(monorepo.root, \"b.txt\");\n\n FileSystem.writeFile(tempFilePath1, \"a\");\n FileSystem.writeFile(tempFilePath2, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"b.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath1);\n FileSystem.deleteFile(tempFilePath2);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle removing one file\", async () => {\n const monorepo = new Monorepo(\"remove-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.deleteFile(testFilePath);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle changing one file\", async () => {\n const monorepo = new Monorepo(\"change-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.writeFile(testFilePath, \"abc\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can exclude a committed file\", async () => {\n const monorepo = new Monorepo(\"exclude-comitted-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"file1.txt\", \"file 2.txt\", \"file蝴蝶.txt\"]);\n\n const expectedFiles: { [key: string]: string } = {\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n await monorepo.cleanup();\n });\n\n it(\"can exclude an added file\", async () => {\n const monorepo = new Monorepo(\"exclude-added-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"a.txt\"]);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with spaces\", async () => {\n const monorepo = new Monorepo(\"filename-with-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with multiple spaces\", async () => {\n const monorepo = new Monorepo(\"filename-multiple-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file name.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file name.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with non-standard characters\", async () => {\n const monorepo = new Monorepo(\"non-standard-characters\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"newFile批把.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"newFile批把.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n});\n"],"names":["SOURCE_PATH","path","join","__dirname","TEST_PROJECT_PATH","NESTED_TEST_PROJECT_PATH","FileSystem","writeFile","fs","writeFileSync","deleteFile","rmSync","describe","parseGitFilename","name","it","expect","toEqual","parseGitLsTree","filename","hash","output","changes","size","get","filename1","hash1","filename2","hash2","bind","undefined","toThrow","getPackageDeps","monorepo","Monorepo","init","results","root","expectedFiles","filePaths","Array","from","keys","sort","forEach","filePath","cleanup","tempFilePath","tempFilePath1","tempFilePath2","testFilePath","toHaveLength","Object","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/__tests__/getPackageDeps.test.ts"],"sourcesContent":["import * as path from \"path\";\nimport * as fs from \"fs\";\n\nimport { getPackageDeps, parseGitLsTree, parseGitFilename } from \"../getPackageDeps\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\n\nconst SOURCE_PATH: string = path.join(__dirname, \"..\", \"__fixtures__\");\n\nconst TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"test-project\");\nconst NESTED_TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"nested-test-project\");\n\nconst FileSystem = {\n writeFile: fs.writeFileSync,\n deleteFile: fs.rmSync,\n};\n\ndescribe(parseGitFilename.name, () => {\n it(\"can parse backslash-escaped filenames\", () => {\n expect(parseGitFilename(\"some/path/to/a/file name\")).toEqual(\"some/path/to/a/file name\");\n expect(parseGitFilename('\"some/path/to/a/file?name\"')).toEqual(\"some/path/to/a/file?name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\name\"')).toEqual(\"some/path/to/a/file\\\\name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file网网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\347\\\\\\\\\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\347\\\\网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\网网name\");\n });\n});\n\ndescribe(parseGitLsTree.name, () => {\n it(\"can handle a blob\", () => {\n const filename: string = \"src/typings/tsd.d.ts\";\n const hash: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const output: string = `100644 blob ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle a submodule\", () => {\n const filename: string = \"rushstack\";\n const hash: string = \"c5880bf5b0c6c1f2e2c43c95beeb8f0a808e8bac\";\n\n const output: string = `160000 commit ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle multiple lines\", () => {\n const filename1: string = \"src/typings/tsd.d.ts\";\n const hash1: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const filename2: string = \"src/foo bar/tsd.d.ts\";\n const hash2: string = \"0123456789abcdef1234567890abcdef01234567\";\n\n const output: string = `100644 blob ${hash1}\\t${filename1}\\n100666 blob ${hash2}\\t${filename2}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(2); // Expect there to be exactly 2 changes\n expect(changes.get(filename1)).toEqual(hash1); // Expect the hash to be ${hash1}\n expect(changes.get(filename2)).toEqual(hash2); // Expect the hash to be ${hash2}\n });\n\n it(\"throws with malformed input\", () => {\n expect(parseGitLsTree.bind(undefined, \"some super malformed input\")).toThrow();\n });\n});\n\ndescribe(getPackageDeps.name, () => {\n it(\"can parse committed file\", async () => {\n const monorepo = new Monorepo(\"parse-commited-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n });\n\n it(\"can handle files in subfolders\", async () => {\n const monorepo = new Monorepo(\"files-in-subfolders\");\n await monorepo.init(NESTED_TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"src/file 1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n\n await monorepo.cleanup();\n }, 60_000);\n\n it(\"can handle adding one file\", async () => {\n const monorepo = new Monorepo(\"add-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle adding two files\", async () => {\n const monorepo = new Monorepo(\"add-two-files\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath1: string = path.join(monorepo.root, \"a.txt\");\n const tempFilePath2: string = path.join(monorepo.root, \"b.txt\");\n\n FileSystem.writeFile(tempFilePath1, \"a\");\n FileSystem.writeFile(tempFilePath2, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"b.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath1);\n FileSystem.deleteFile(tempFilePath2);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle removing one file\", async () => {\n const monorepo = new Monorepo(\"remove-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.deleteFile(testFilePath);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle changing one file\", async () => {\n const monorepo = new Monorepo(\"change-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.writeFile(testFilePath, \"abc\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can exclude a committed file\", async () => {\n const monorepo = new Monorepo(\"exclude-comitted-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"file1.txt\", \"file 2.txt\", \"file蝴蝶.txt\"]);\n\n const expectedFiles: { [key: string]: string } = {\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n await monorepo.cleanup();\n });\n\n it(\"can exclude an added file\", async () => {\n const monorepo = new Monorepo(\"exclude-added-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"a.txt\"]);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with spaces\", async () => {\n const monorepo = new Monorepo(\"filename-with-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with multiple spaces\", async () => {\n const monorepo = new Monorepo(\"filename-multiple-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file name.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file name.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with non-standard characters\", async () => {\n const monorepo = new Monorepo(\"non-standard-characters\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"newFile批把.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"newFile批把.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n});\n"],"names":["SOURCE_PATH","path","join","__dirname","TEST_PROJECT_PATH","NESTED_TEST_PROJECT_PATH","FileSystem","writeFile","fs","writeFileSync","deleteFile","rmSync","describe","parseGitFilename","name","it","expect","toEqual","parseGitLsTree","filename","hash","output","changes","size","get","filename1","hash1","filename2","hash2","bind","undefined","toThrow","getPackageDeps","monorepo","Monorepo","init","results","root","expectedFiles","filePaths","Array","from","keys","sort","forEach","filePath","cleanup","tempFilePath","tempFilePath1","tempFilePath2","testFilePath","toHaveLength","Object","length"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/resolveDependenciesHelper.ts"],"sourcesContent":["import path from \"path\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\nimport { getYarnWorkspaces, getPnpmWorkspaces, getRushWorkspaces } from \"workspace-tools\";\n\nexport async function filterDependenciesInYarnFixture(fixture: string, filterFunction: any) {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getYarnWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n\nexport async function filterDependenciesInPnpmFixture(fixture: string, filterFunction: any) {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getPnpmWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n\nexport async function filterDependenciesInRushFixture(fixture: string, filterFunction: any) {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getRushWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n"],"names":["filterDependenciesInPnpmFixture","filterDependenciesInRushFixture","filterDependenciesInYarnFixture","fixturesPath","path","join","__dirname","fixture","filterFunction","monorepo","Monorepo","init","packageRoot","root","workspacesPackageInfo","getYarnWorkspaces","dependencies","foo","filteredDependencies","getPnpmWorkspaces","getRushWorkspaces"],"mappings":";;;;;;;;;;;QAoBsBA;eAAAA;;QAcAC;eAAAA;;QA5BAC;eAAAA;;;6DANL;iCACQ;gCAG+C;;;;;;AAFxE,MAAMC,eAAeC,aAAI,CAACC,IAAI,CAACC,WAAW,MAAM;AAIzC,eAAeJ,gCAAgCK,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBC,IAAAA,iCAAiB,EAACH;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT;AAEO,eAAelB,gCAAgCO,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBK,IAAAA,iCAAiB,EAACP;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT;AAEO,eAAejB,gCAAgCM,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBM,IAAAA,iCAAiB,EAACR;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT"}
1
+ {"version":3,"sources":["../../src/__tests__/resolveDependenciesHelper.ts"],"sourcesContent":["import path from \"path\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\nimport { getYarnWorkspaces, getPnpmWorkspaces, getRushWorkspaces } from \"workspace-tools\";\n\nexport async function filterDependenciesInYarnFixture(fixture: string, filterFunction: any): Promise<any> {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getYarnWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n\nexport async function filterDependenciesInPnpmFixture(fixture: string, filterFunction: any): Promise<any> {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getPnpmWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n\nexport async function filterDependenciesInRushFixture(fixture: string, filterFunction: any): Promise<any> {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, fixture));\n const packageRoot = monorepo.root;\n\n const workspacesPackageInfo = getRushWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const filteredDependencies = filterFunction(dependencies, workspacesPackageInfo);\n\n return filteredDependencies;\n}\n"],"names":["filterDependenciesInPnpmFixture","filterDependenciesInRushFixture","filterDependenciesInYarnFixture","fixturesPath","path","join","__dirname","fixture","filterFunction","monorepo","Monorepo","init","packageRoot","root","workspacesPackageInfo","getYarnWorkspaces","dependencies","foo","filteredDependencies","getPnpmWorkspaces","getRushWorkspaces"],"mappings":";;;;;;;;;;;QAoBsBA;eAAAA;;QAcAC;eAAAA;;QA5BAC;eAAAA;;;6DANL;iCACQ;gCAG+C;;;;;;AAFxE,MAAMC,eAAeC,aAAI,CAACC,IAAI,CAACC,WAAW,MAAM;AAIzC,eAAeJ,gCAAgCK,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBC,IAAAA,iCAAiB,EAACH;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT;AAEO,eAAelB,gCAAgCO,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBK,IAAAA,iCAAiB,EAACP;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT;AAEO,eAAejB,gCAAgCM,OAAe,EAAEC,cAAmB;IACxF,MAAMC,WAAW,IAAIC,yBAAQ,CAAC;IAC9B,MAAMD,SAASE,IAAI,CAACP,aAAI,CAACC,IAAI,CAACF,cAAcI;IAC5C,MAAMK,cAAcH,SAASI,IAAI;IAEjC,MAAMC,wBAAwBM,IAAAA,iCAAiB,EAACR;IAEhD,MAAMI,eAAe;QAAE,aAAa;QAASC,KAAK;IAAQ;IAE1D,MAAMC,uBAAuBV,eAAeQ,cAAcF;IAE1D,OAAOI;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/expandInputPatterns.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\n\nexport function expandInputPatterns(patterns: string[], target: Target, dependencyMap: DependencyMap) {\n const expandedPatterns: Record<string, string[]> = {};\n\n for (const pattern of patterns) {\n if (pattern.startsWith(\"^\") || pattern.startsWith(\"!^\")) {\n const matchPattern = pattern.replace(\"^\", \"\");\n\n // get all the packages that are transitive deps and add them to the list\n const queue = [target.packageName];\n\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const pkg = queue.pop()!;\n if (visited.has(pkg)) {\n continue;\n }\n visited.add(pkg);\n\n if (pkg !== target.packageName) {\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(matchPattern);\n }\n\n if (dependencyMap.dependencies.has(pkg)) {\n const deps = dependencyMap.dependencies.get(pkg);\n if (deps) {\n for (const dep of deps) {\n queue.push(dep);\n }\n }\n }\n }\n } else {\n const pkg = target.packageName!;\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(pattern);\n }\n }\n\n return expandedPatterns;\n}\n"],"names":["expandInputPatterns","patterns","target","dependencyMap","expandedPatterns","pattern","startsWith","matchPattern","replace","queue","packageName","visited","Set","length","pkg","pop","has","add","push","dependencies","deps","get","dep"],"mappings":";;;;+BAGgBA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,QAAkB,EAAEC,MAAc,EAAEC,aAA4B;IAClG,MAAMC,mBAA6C,CAAC;IAEpD,KAAK,MAAMC,WAAWJ,SAAU;QAC9B,IAAII,QAAQC,UAAU,CAAC,QAAQD,QAAQC,UAAU,CAAC,OAAO;YACvD,MAAMC,eAAeF,QAAQG,OAAO,CAAC,KAAK;YAE1C,yEAAyE;YACzE,MAAMC,QAAQ;gBAACP,OAAOQ,WAAW;aAAC;YAElC,MAAMC,UAAU,IAAIC;YAEpB,MAAOH,MAAMI,MAAM,GAAG,EAAG;gBACvB,MAAMC,MAAML,MAAMM,GAAG;gBACrB,IAAIJ,QAAQK,GAAG,CAACF,MAAM;oBACpB;gBACF;gBACAH,QAAQM,GAAG,CAACH;gBAEZ,IAAIA,QAAQZ,OAAOQ,WAAW,EAAE;oBAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;oBACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACX;gBAC7B;gBAEA,IAAIJ,cAAcgB,YAAY,CAACH,GAAG,CAACF,MAAM;oBACvC,MAAMM,OAAOjB,cAAcgB,YAAY,CAACE,GAAG,CAACP;oBAC5C,IAAIM,MAAM;wBACR,KAAK,MAAME,OAAOF,KAAM;4BACtBX,MAAMS,IAAI,CAACI;wBACb;oBACF;gBACF;YACF;QACF,OAAO;YACL,MAAMR,MAAMZ,OAAOQ,WAAW;YAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;YACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACb;QAC7B;IACF;IAEA,OAAOD;AACT"}
1
+ {"version":3,"sources":["../src/expandInputPatterns.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\n\nexport function expandInputPatterns(patterns: string[], target: Target, dependencyMap: DependencyMap): Record<string, string[]> {\n const expandedPatterns: Record<string, string[]> = {};\n\n for (const pattern of patterns) {\n if (pattern.startsWith(\"^\") || pattern.startsWith(\"!^\")) {\n const matchPattern = pattern.replace(\"^\", \"\");\n\n // get all the packages that are transitive deps and add them to the list\n const queue = [target.packageName];\n\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const pkg = queue.pop()!;\n if (visited.has(pkg)) {\n continue;\n }\n visited.add(pkg);\n\n if (pkg !== target.packageName) {\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(matchPattern);\n }\n\n if (dependencyMap.dependencies.has(pkg)) {\n const deps = dependencyMap.dependencies.get(pkg);\n if (deps) {\n for (const dep of deps) {\n queue.push(dep);\n }\n }\n }\n }\n } else {\n const pkg = target.packageName!;\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(pattern);\n }\n }\n\n return expandedPatterns;\n}\n"],"names":["expandInputPatterns","patterns","target","dependencyMap","expandedPatterns","pattern","startsWith","matchPattern","replace","queue","packageName","visited","Set","length","pkg","pop","has","add","push","dependencies","deps","get","dep"],"mappings":";;;;+BAGgBA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,QAAkB,EAAEC,MAAc,EAAEC,aAA4B;IAClG,MAAMC,mBAA6C,CAAC;IAEpD,KAAK,MAAMC,WAAWJ,SAAU;QAC9B,IAAII,QAAQC,UAAU,CAAC,QAAQD,QAAQC,UAAU,CAAC,OAAO;YACvD,MAAMC,eAAeF,QAAQG,OAAO,CAAC,KAAK;YAE1C,yEAAyE;YACzE,MAAMC,QAAQ;gBAACP,OAAOQ,WAAW;aAAC;YAElC,MAAMC,UAAU,IAAIC;YAEpB,MAAOH,MAAMI,MAAM,GAAG,EAAG;gBACvB,MAAMC,MAAML,MAAMM,GAAG;gBACrB,IAAIJ,QAAQK,GAAG,CAACF,MAAM;oBACpB;gBACF;gBACAH,QAAQM,GAAG,CAACH;gBAEZ,IAAIA,QAAQZ,OAAOQ,WAAW,EAAE;oBAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;oBACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACX;gBAC7B;gBAEA,IAAIJ,cAAcgB,YAAY,CAACH,GAAG,CAACF,MAAM;oBACvC,MAAMM,OAAOjB,cAAcgB,YAAY,CAACE,GAAG,CAACP;oBAC5C,IAAIM,MAAM;wBACR,KAAK,MAAME,OAAOF,KAAM;4BACtBX,MAAMS,IAAI,CAACI;wBACb;oBACF;gBACF;YACF;QACF,OAAO;YACL,MAAMR,MAAMZ,OAAOQ,WAAW;YAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;YACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACb;QAC7B;IACF;IAEA,OAAOD;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/getInputFiles.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\nimport { type PackageTree } from \"./PackageTree.js\";\nimport { expandInputPatterns } from \"./expandInputPatterns.js\";\n\nexport function getInputFiles(target: Target, dependencyMap: DependencyMap, packageTree: PackageTree) {\n const inputs = target.inputs ?? [\"**/*\"];\n\n const packagePatterns = expandInputPatterns(inputs, target, dependencyMap);\n const files: string[] = [];\n for (const [pkg, patterns] of Object.entries(packagePatterns)) {\n const packageFiles = packageTree.getPackageFiles(pkg, patterns);\n files.push(...packageFiles);\n }\n return files;\n}\n"],"names":["getInputFiles","target","dependencyMap","packageTree","inputs","packagePatterns","expandInputPatterns","files","pkg","patterns","Object","entries","packageFiles","getPackageFiles","push"],"mappings":";;;;+BAKgBA;;;eAAAA;;;qCAFoB;AAE7B,SAASA,cAAcC,MAAc,EAAEC,aAA4B,EAAEC,WAAwB;IAClG,MAAMC,SAASH,OAAOG,MAAM,IAAI;QAAC;KAAO;IAExC,MAAMC,kBAAkBC,IAAAA,wCAAmB,EAACF,QAAQH,QAAQC;IAC5D,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAM,CAACC,KAAKC,SAAS,IAAIC,OAAOC,OAAO,CAACN,iBAAkB;QAC7D,MAAMO,eAAeT,YAAYU,eAAe,CAACL,KAAKC;QACtDF,MAAMO,IAAI,IAAIF;IAChB;IACA,OAAOL;AACT"}
1
+ {"version":3,"sources":["../src/getInputFiles.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\nimport { type PackageTree } from \"./PackageTree.js\";\nimport { expandInputPatterns } from \"./expandInputPatterns.js\";\n\nexport function getInputFiles(target: Target, dependencyMap: DependencyMap, packageTree: PackageTree): string[] {\n const inputs = target.inputs ?? [\"**/*\"];\n\n const packagePatterns = expandInputPatterns(inputs, target, dependencyMap);\n const files: string[] = [];\n for (const [pkg, patterns] of Object.entries(packagePatterns)) {\n const packageFiles = packageTree.getPackageFiles(pkg, patterns);\n files.push(...packageFiles);\n }\n return files;\n}\n"],"names":["getInputFiles","target","dependencyMap","packageTree","inputs","packagePatterns","expandInputPatterns","files","pkg","patterns","Object","entries","packageFiles","getPackageFiles","push"],"mappings":";;;;+BAKgBA;;;eAAAA;;;qCAFoB;AAE7B,SAASA,cAAcC,MAAc,EAAEC,aAA4B,EAAEC,WAAwB;IAClG,MAAMC,SAASH,OAAOG,MAAM,IAAI;QAAC;KAAO;IAExC,MAAMC,kBAAkBC,IAAAA,wCAAmB,EAACF,QAAQH,QAAQC;IAC5D,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAM,CAACC,KAAKC,SAAS,IAAIC,OAAOC,OAAO,CAACN,iBAAkB;QAC7D,MAAMO,eAAeT,YAAYU,eAAe,CAACL,KAAKC;QACtDF,MAAMO,IAAI,IAAIF;IAChB;IACA,OAAOL;AACT"}
@@ -1,4 +1,4 @@
1
- import type { ParsedLock, WorkspaceInfo } from "workspace-tools";
1
+ import type { ParsedLock, WorkspaceInfos } from "workspace-tools";
2
2
  export type Dependencies = {
3
3
  [key in string]: string;
4
4
  };
@@ -6,6 +6,6 @@ export type ExternalDependenciesQueue = {
6
6
  name: string;
7
7
  versionRange: string;
8
8
  }[];
9
- export declare function filterExternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfo): Dependencies;
9
+ export declare function filterExternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfos): Dependencies;
10
10
  export declare function addToQueue(dependencies: Dependencies | undefined, done: string[], queue: [string, string][]): void;
11
- export declare function resolveExternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfo, lockInfo: ParsedLock): string[];
11
+ export declare function resolveExternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfos, lockInfo: ParsedLock): string[];
@@ -22,7 +22,7 @@ _export(exports, {
22
22
  const _workspacetools = require("workspace-tools");
23
23
  const _nameAtVersion = require("./nameAtVersion.js");
24
24
  function filterExternalDependencies(dependencies, workspaces) {
25
- const workspacePackageNames = (0, _workspacetools.listOfWorkspacePackageNames)(workspaces);
25
+ const workspacePackageNames = workspaces.map((ws)=>ws.name);
26
26
  const externalDependencies = {};
27
27
  Object.entries(dependencies).forEach(([name, versionRange])=>{
28
28
  if (workspacePackageNames.indexOf(name) < 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resolveExternalDependencies.ts"],"sourcesContent":["import type { ParsedLock, WorkspaceInfo } from \"workspace-tools\";\nimport { queryLockFile, listOfWorkspacePackageNames } from \"workspace-tools\";\nimport { nameAtVersion } from \"./nameAtVersion.js\";\n\nexport type Dependencies = { [key in string]: string };\n\nexport type ExternalDependenciesQueue = {\n name: string;\n versionRange: string;\n}[];\n\nexport function filterExternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfo): Dependencies {\n const workspacePackageNames = listOfWorkspacePackageNames(workspaces);\n const externalDependencies: Dependencies = {};\n\n Object.entries(dependencies).forEach(([name, versionRange]) => {\n if (workspacePackageNames.indexOf(name) < 0) {\n externalDependencies[name] = versionRange;\n }\n });\n\n return externalDependencies;\n}\n\nfunction isDone(done: string[], key: string): boolean {\n return done.indexOf(key) >= 0;\n}\n\nfunction isInQueue(queue: [string, string][], key: string): boolean {\n return Boolean(queue.find(([name, versionRange]) => nameAtVersion(name, versionRange) === key));\n}\n\nexport function addToQueue(dependencies: Dependencies | undefined, done: string[], queue: [string, string][]): void {\n if (dependencies) {\n Object.entries(dependencies).forEach(([name, versionRange]) => {\n const versionRangeSignature = nameAtVersion(name, versionRange);\n\n if (!isDone(done, versionRangeSignature) && !isInQueue(queue, versionRangeSignature)) {\n queue.push([name, versionRange]);\n }\n });\n }\n}\n\nexport function resolveExternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfo, lockInfo: ParsedLock): string[] {\n const externalDependencies = filterExternalDependencies(allDependencies, workspaces);\n\n const done: string[] = [];\n const doneRange: string[] = [];\n const queue = Object.entries(externalDependencies);\n\n while (queue.length > 0) {\n const next = queue.shift();\n\n if (!next) {\n continue;\n }\n\n const [name, versionRange] = next;\n doneRange.push(nameAtVersion(name, versionRange));\n\n const lockFileResult = queryLockFile(name, versionRange, lockInfo);\n\n if (lockFileResult) {\n const { version, dependencies } = lockFileResult;\n\n addToQueue(dependencies, doneRange, queue);\n done.push(nameAtVersion(name, version));\n } else {\n done.push(nameAtVersion(name, versionRange));\n }\n }\n\n return done;\n}\n"],"names":["addToQueue","filterExternalDependencies","resolveExternalDependencies","dependencies","workspaces","workspacePackageNames","listOfWorkspacePackageNames","externalDependencies","Object","entries","forEach","name","versionRange","indexOf","isDone","done","key","isInQueue","queue","Boolean","find","nameAtVersion","versionRangeSignature","push","allDependencies","lockInfo","doneRange","length","next","shift","lockFileResult","queryLockFile","version"],"mappings":";;;;;;;;;;;QAgCgBA;eAAAA;;QArBAC;eAAAA;;QAiCAC;eAAAA;;;gCA3C2C;+BAC7B;AASvB,SAASD,2BAA2BE,YAA0B,EAAEC,UAAyB;IAC9F,MAAMC,wBAAwBC,IAAAA,2CAA2B,EAACF;IAC1D,MAAMG,uBAAqC,CAAC;IAE5CC,OAAOC,OAAO,CAACN,cAAcO,OAAO,CAAC,CAAC,CAACC,MAAMC,aAAa;QACxD,IAAIP,sBAAsBQ,OAAO,CAACF,QAAQ,GAAG;YAC3CJ,oBAAoB,CAACI,KAAK,GAAGC;QAC/B;IACF;IAEA,OAAOL;AACT;AAEA,SAASO,OAAOC,IAAc,EAAEC,GAAW;IACzC,OAAOD,KAAKF,OAAO,CAACG,QAAQ;AAC9B;AAEA,SAASC,UAAUC,KAAyB,EAAEF,GAAW;IACvD,OAAOG,QAAQD,MAAME,IAAI,CAAC,CAAC,CAACT,MAAMC,aAAa,GAAKS,IAAAA,4BAAa,EAACV,MAAMC,kBAAkBI;AAC5F;AAEO,SAAShB,WAAWG,YAAsC,EAAEY,IAAc,EAAEG,KAAyB;IAC1G,IAAIf,cAAc;QAChBK,OAAOC,OAAO,CAACN,cAAcO,OAAO,CAAC,CAAC,CAACC,MAAMC,aAAa;YACxD,MAAMU,wBAAwBD,IAAAA,4BAAa,EAACV,MAAMC;YAElD,IAAI,CAACE,OAAOC,MAAMO,0BAA0B,CAACL,UAAUC,OAAOI,wBAAwB;gBACpFJ,MAAMK,IAAI,CAAC;oBAACZ;oBAAMC;iBAAa;YACjC;QACF;IACF;AACF;AAEO,SAASV,4BAA4BsB,eAA6B,EAAEpB,UAAyB,EAAEqB,QAAoB;IACxH,MAAMlB,uBAAuBN,2BAA2BuB,iBAAiBpB;IAEzE,MAAMW,OAAiB,EAAE;IACzB,MAAMW,YAAsB,EAAE;IAC9B,MAAMR,QAAQV,OAAOC,OAAO,CAACF;IAE7B,MAAOW,MAAMS,MAAM,GAAG,EAAG;QACvB,MAAMC,OAAOV,MAAMW,KAAK;QAExB,IAAI,CAACD,MAAM;YACT;QACF;QAEA,MAAM,CAACjB,MAAMC,aAAa,GAAGgB;QAC7BF,UAAUH,IAAI,CAACF,IAAAA,4BAAa,EAACV,MAAMC;QAEnC,MAAMkB,iBAAiBC,IAAAA,6BAAa,EAACpB,MAAMC,cAAca;QAEzD,IAAIK,gBAAgB;YAClB,MAAM,EAAEE,OAAO,EAAE7B,YAAY,EAAE,GAAG2B;YAElC9B,WAAWG,cAAcuB,WAAWR;YACpCH,KAAKQ,IAAI,CAACF,IAAAA,4BAAa,EAACV,MAAMqB;QAChC,OAAO;YACLjB,KAAKQ,IAAI,CAACF,IAAAA,4BAAa,EAACV,MAAMC;QAChC;IACF;IAEA,OAAOG;AACT"}
1
+ {"version":3,"sources":["../src/resolveExternalDependencies.ts"],"sourcesContent":["import type { ParsedLock, WorkspaceInfos } from \"workspace-tools\";\nimport { queryLockFile } from \"workspace-tools\";\nimport { nameAtVersion } from \"./nameAtVersion.js\";\n\nexport type Dependencies = { [key in string]: string };\n\nexport type ExternalDependenciesQueue = {\n name: string;\n versionRange: string;\n}[];\n\nexport function filterExternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfos): Dependencies {\n const workspacePackageNames = workspaces.map((ws) => ws.name);\n const externalDependencies: Dependencies = {};\n\n Object.entries(dependencies).forEach(([name, versionRange]) => {\n if (workspacePackageNames.indexOf(name) < 0) {\n externalDependencies[name] = versionRange;\n }\n });\n\n return externalDependencies;\n}\n\nfunction isDone(done: string[], key: string): boolean {\n return done.indexOf(key) >= 0;\n}\n\nfunction isInQueue(queue: [string, string][], key: string): boolean {\n return Boolean(queue.find(([name, versionRange]) => nameAtVersion(name, versionRange) === key));\n}\n\nexport function addToQueue(dependencies: Dependencies | undefined, done: string[], queue: [string, string][]): void {\n if (dependencies) {\n Object.entries(dependencies).forEach(([name, versionRange]) => {\n const versionRangeSignature = nameAtVersion(name, versionRange);\n\n if (!isDone(done, versionRangeSignature) && !isInQueue(queue, versionRangeSignature)) {\n queue.push([name, versionRange]);\n }\n });\n }\n}\n\nexport function resolveExternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfos, lockInfo: ParsedLock): string[] {\n const externalDependencies = filterExternalDependencies(allDependencies, workspaces);\n\n const done: string[] = [];\n const doneRange: string[] = [];\n const queue = Object.entries(externalDependencies);\n\n while (queue.length > 0) {\n const next = queue.shift();\n\n if (!next) {\n continue;\n }\n\n const [name, versionRange] = next;\n doneRange.push(nameAtVersion(name, versionRange));\n\n const lockFileResult = queryLockFile(name, versionRange, lockInfo);\n\n if (lockFileResult) {\n const { version, dependencies } = lockFileResult;\n\n addToQueue(dependencies, doneRange, queue);\n done.push(nameAtVersion(name, version));\n } else {\n done.push(nameAtVersion(name, versionRange));\n }\n }\n\n return done;\n}\n"],"names":["addToQueue","filterExternalDependencies","resolveExternalDependencies","dependencies","workspaces","workspacePackageNames","map","ws","name","externalDependencies","Object","entries","forEach","versionRange","indexOf","isDone","done","key","isInQueue","queue","Boolean","find","nameAtVersion","versionRangeSignature","push","allDependencies","lockInfo","doneRange","length","next","shift","lockFileResult","queryLockFile","version"],"mappings":";;;;;;;;;;;QAgCgBA;eAAAA;;QArBAC;eAAAA;;QAiCAC;eAAAA;;;gCA3Cc;+BACA;AASvB,SAASD,2BAA2BE,YAA0B,EAAEC,UAA0B;IAC/F,MAAMC,wBAAwBD,WAAWE,GAAG,CAAC,CAACC,KAAOA,GAAGC,IAAI;IAC5D,MAAMC,uBAAqC,CAAC;IAE5CC,OAAOC,OAAO,CAACR,cAAcS,OAAO,CAAC,CAAC,CAACJ,MAAMK,aAAa;QACxD,IAAIR,sBAAsBS,OAAO,CAACN,QAAQ,GAAG;YAC3CC,oBAAoB,CAACD,KAAK,GAAGK;QAC/B;IACF;IAEA,OAAOJ;AACT;AAEA,SAASM,OAAOC,IAAc,EAAEC,GAAW;IACzC,OAAOD,KAAKF,OAAO,CAACG,QAAQ;AAC9B;AAEA,SAASC,UAAUC,KAAyB,EAAEF,GAAW;IACvD,OAAOG,QAAQD,MAAME,IAAI,CAAC,CAAC,CAACb,MAAMK,aAAa,GAAKS,IAAAA,4BAAa,EAACd,MAAMK,kBAAkBI;AAC5F;AAEO,SAASjB,WAAWG,YAAsC,EAAEa,IAAc,EAAEG,KAAyB;IAC1G,IAAIhB,cAAc;QAChBO,OAAOC,OAAO,CAACR,cAAcS,OAAO,CAAC,CAAC,CAACJ,MAAMK,aAAa;YACxD,MAAMU,wBAAwBD,IAAAA,4BAAa,EAACd,MAAMK;YAElD,IAAI,CAACE,OAAOC,MAAMO,0BAA0B,CAACL,UAAUC,OAAOI,wBAAwB;gBACpFJ,MAAMK,IAAI,CAAC;oBAAChB;oBAAMK;iBAAa;YACjC;QACF;IACF;AACF;AAEO,SAASX,4BAA4BuB,eAA6B,EAAErB,UAA0B,EAAEsB,QAAoB;IACzH,MAAMjB,uBAAuBR,2BAA2BwB,iBAAiBrB;IAEzE,MAAMY,OAAiB,EAAE;IACzB,MAAMW,YAAsB,EAAE;IAC9B,MAAMR,QAAQT,OAAOC,OAAO,CAACF;IAE7B,MAAOU,MAAMS,MAAM,GAAG,EAAG;QACvB,MAAMC,OAAOV,MAAMW,KAAK;QAExB,IAAI,CAACD,MAAM;YACT;QACF;QAEA,MAAM,CAACrB,MAAMK,aAAa,GAAGgB;QAC7BF,UAAUH,IAAI,CAACF,IAAAA,4BAAa,EAACd,MAAMK;QAEnC,MAAMkB,iBAAiBC,IAAAA,6BAAa,EAACxB,MAAMK,cAAca;QAEzD,IAAIK,gBAAgB;YAClB,MAAM,EAAEE,OAAO,EAAE9B,YAAY,EAAE,GAAG4B;YAElC/B,WAAWG,cAAcwB,WAAWR;YACpCH,KAAKQ,IAAI,CAACF,IAAAA,4BAAa,EAACd,MAAMyB;QAChC,OAAO;YACLjB,KAAKQ,IAAI,CAACF,IAAAA,4BAAa,EAACd,MAAMK;QAChC;IACF;IAEA,OAAOG;AACT"}
@@ -1,6 +1,6 @@
1
- import type { WorkspaceInfo } from "workspace-tools";
1
+ import type { WorkspaceInfos } from "workspace-tools";
2
2
  export type Dependencies = {
3
3
  [key in string]: string;
4
4
  };
5
- export declare function filterInternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfo): string[];
6
- export declare function resolveInternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfo): string[];
5
+ export declare function filterInternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfos): string[];
6
+ export declare function resolveInternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfos): string[];
@@ -16,9 +16,8 @@ _export(exports, {
16
16
  return resolveInternalDependencies;
17
17
  }
18
18
  });
19
- const _workspacetools = require("workspace-tools");
20
19
  function filterInternalDependencies(dependencies, workspaces) {
21
- const workspacePackageNames = (0, _workspacetools.listOfWorkspacePackageNames)(workspaces);
20
+ const workspacePackageNames = workspaces.map((ws)=>ws.name);
22
21
  return Object.keys(dependencies).filter((dependency)=>workspacePackageNames.indexOf(dependency) >= 0);
23
22
  }
24
23
  function resolveInternalDependencies(allDependencies, workspaces) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resolveInternalDependencies.ts"],"sourcesContent":["import type { WorkspaceInfo } from \"workspace-tools\";\nimport { listOfWorkspacePackageNames } from \"workspace-tools\";\n\nexport type Dependencies = { [key in string]: string };\n\nexport function filterInternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfo): string[] {\n const workspacePackageNames = listOfWorkspacePackageNames(workspaces);\n return Object.keys(dependencies).filter((dependency) => workspacePackageNames.indexOf(dependency) >= 0);\n}\n\nexport function resolveInternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfo): string[] {\n const dependencyNames = filterInternalDependencies(allDependencies, workspaces);\n\n return dependencyNames;\n}\n"],"names":["filterInternalDependencies","resolveInternalDependencies","dependencies","workspaces","workspacePackageNames","listOfWorkspacePackageNames","Object","keys","filter","dependency","indexOf","allDependencies","dependencyNames"],"mappings":";;;;;;;;;;;QAKgBA;eAAAA;;QAKAC;eAAAA;;;gCAT4B;AAIrC,SAASD,2BAA2BE,YAA0B,EAAEC,UAAyB;IAC9F,MAAMC,wBAAwBC,IAAAA,2CAA2B,EAACF;IAC1D,OAAOG,OAAOC,IAAI,CAACL,cAAcM,MAAM,CAAC,CAACC,aAAeL,sBAAsBM,OAAO,CAACD,eAAe;AACvG;AAEO,SAASR,4BAA4BU,eAA6B,EAAER,UAAyB;IAClG,MAAMS,kBAAkBZ,2BAA2BW,iBAAiBR;IAEpE,OAAOS;AACT"}
1
+ {"version":3,"sources":["../src/resolveInternalDependencies.ts"],"sourcesContent":["import type { WorkspaceInfos } from \"workspace-tools\";\n\nexport type Dependencies = { [key in string]: string };\n\nexport function filterInternalDependencies(dependencies: Dependencies, workspaces: WorkspaceInfos): string[] {\n const workspacePackageNames = workspaces.map((ws) => ws.name);\n return Object.keys(dependencies).filter((dependency) => workspacePackageNames.indexOf(dependency) >= 0);\n}\n\nexport function resolveInternalDependencies(allDependencies: Dependencies, workspaces: WorkspaceInfos): string[] {\n const dependencyNames = filterInternalDependencies(allDependencies, workspaces);\n\n return dependencyNames;\n}\n"],"names":["filterInternalDependencies","resolveInternalDependencies","dependencies","workspaces","workspacePackageNames","map","ws","name","Object","keys","filter","dependency","indexOf","allDependencies","dependencyNames"],"mappings":";;;;;;;;;;;QAIgBA;eAAAA;;QAKAC;eAAAA;;;AALT,SAASD,2BAA2BE,YAA0B,EAAEC,UAA0B;IAC/F,MAAMC,wBAAwBD,WAAWE,GAAG,CAAC,CAACC,KAAOA,GAAGC,IAAI;IAC5D,OAAOC,OAAOC,IAAI,CAACP,cAAcQ,MAAM,CAAC,CAACC,aAAeP,sBAAsBQ,OAAO,CAACD,eAAe;AACvG;AAEO,SAASV,4BAA4BY,eAA6B,EAAEV,UAA0B;IACnG,MAAMW,kBAAkBd,2BAA2Ba,iBAAiBV;IAEpE,OAAOW;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/hasher",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "Hasher for Lage Targets",
5
5
  "repository": {
6
6
  "url": "https://github.com/microsoft/lage"
@@ -15,19 +15,20 @@
15
15
  "lint": "monorepo-scripts lint"
16
16
  },
17
17
  "dependencies": {
18
- "@lage-run/globby": "^14.2.1",
19
- "@lage-run/logger": "^1.3.1",
20
- "@lage-run/target-graph": "^0.12.0",
21
- "execa": "5.1.1",
18
+ "@lage-run/globby": "^14.2.2",
19
+ "@lage-run/logger": "^1.3.2",
20
+ "@lage-run/target-graph": "^0.12.2",
21
+ "execa": "^5.1.1",
22
22
  "glob-hasher": "^1.4.2",
23
- "graceful-fs": "4.2.11",
24
- "micromatch": "4.0.8",
25
- "workspace-tools": "0.38.4"
23
+ "graceful-fs": "^4.2.11",
24
+ "micromatch": "^4.0.8",
25
+ "workspace-tools": "^0.40.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@lage-run/monorepo-fixture": "^0.1.0",
29
29
  "@lage-run/monorepo-scripts": "^1.0.0",
30
- "@types/graceful-fs": "^4.1.6"
30
+ "@types/graceful-fs": "^4.1.6",
31
+ "@types/micromatch": "^4.0.0"
31
32
  },
32
33
  "publishConfig": {
33
34
  "access": "public"