@lage-run/hasher 1.8.3 → 1.9.1

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,58 @@
2
2
  "name": "@lage-run/hasher",
3
3
  "entries": [
4
4
  {
5
- "date": "Fri, 01 Aug 2025 08:09:39 GMT",
5
+ "date": "Thu, 15 Jan 2026 23:23:27 GMT",
6
+ "version": "1.9.1",
7
+ "tag": "@lage-run/hasher_v1.9.1",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "renovate@whitesourcesoftware.com",
12
+ "package": "@lage-run/hasher",
13
+ "commit": "3d7ac61faadf82097fb2996431b537b2a9baa0e3",
14
+ "comment": "Update dependency workspace-tools to v0.40.0"
15
+ },
16
+ {
17
+ "author": "nemanjatesic@microsoft.com",
18
+ "package": "@lage-run/hasher",
19
+ "commit": "3d7ac61faadf82097fb2996431b537b2a9baa0e3",
20
+ "comment": "Add lint rule for no-floating-promises and fix several places"
21
+ }
22
+ ]
23
+ }
24
+ },
25
+ {
26
+ "date": "Mon, 01 Sep 2025 08:10:36 GMT",
27
+ "version": "1.9.0",
28
+ "tag": "@lage-run/hasher_v1.9.0",
29
+ "comments": {
30
+ "minor": [
31
+ {
32
+ "author": "dannyvv@microsoft.com",
33
+ "package": "@lage-run/hasher",
34
+ "commit": "5f2d28335f9293a5cc44a3bc6a99f41f8f981e7c",
35
+ "comment": "Add merge logic for targetConfig"
36
+ }
37
+ ]
38
+ }
39
+ },
40
+ {
41
+ "date": "Fri, 08 Aug 2025 08:10:13 GMT",
42
+ "version": "1.8.3",
43
+ "tag": "@lage-run/hasher_v1.8.3",
44
+ "comments": {
45
+ "none": [
46
+ {
47
+ "author": "elcraig@microsoft.com",
48
+ "package": "@lage-run/hasher",
49
+ "commit": "733dbd23642c8ca7dc405de21a3c8b65b5a1aa5c",
50
+ "comment": "update formatting"
51
+ }
52
+ ]
53
+ }
54
+ },
55
+ {
56
+ "date": "Fri, 01 Aug 2025 08:10:15 GMT",
6
57
  "version": "1.8.3",
7
58
  "tag": "@lage-run/hasher_v1.8.3",
8
59
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,29 @@
1
1
  # Change Log - @lage-run/hasher
2
2
 
3
- <!-- This log was last generated on Fri, 01 Aug 2025 08:09:39 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Thu, 15 Jan 2026 23:23:27 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.9.1
8
+
9
+ Thu, 15 Jan 2026 23:23:27 GMT
10
+
11
+ ### Patches
12
+
13
+ - Update dependency workspace-tools to v0.40.0 (renovate@whitesourcesoftware.com)
14
+ - Add lint rule for no-floating-promises and fix several places (nemanjatesic@microsoft.com)
15
+
16
+ ## 1.9.0
17
+
18
+ Mon, 01 Sep 2025 08:10:36 GMT
19
+
20
+ ### Minor changes
21
+
22
+ - Add merge logic for targetConfig (dannyvv@microsoft.com)
23
+
7
24
  ## 1.8.3
8
25
 
9
- Fri, 01 Aug 2025 08:09:39 GMT
26
+ Fri, 01 Aug 2025 08:10:15 GMT
10
27
 
11
28
  ### Patches
12
29
 
package/lib/FileHasher.js CHANGED
@@ -96,9 +96,9 @@ 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
+ this.getHashesFromGit().then(()=>resolve()).catch(reject);
102
102
  return;
103
103
  }
104
104
  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 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, reject) => {\n if (!fs.existsSync(this.#manifestFile)) {\n this.getHashesFromGit()\n .then(() => resolve())\n .catch(reject);\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","reject","fs","existsSync","then","catch","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() {\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 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 +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 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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"}
@@ -123,7 +123,7 @@ describe(_getPackageDeps.getPackageDeps.name, ()=>{
123
123
  const filePaths = Array.from(results.keys()).sort();
124
124
  filePaths.forEach((filePath)=>expect(results.get(filePath)).toEqual(expectedFiles[filePath]));
125
125
  await monorepo.cleanup();
126
- });
126
+ }, 60000);
127
127
  it("can handle adding one file", async ()=>{
128
128
  const monorepo = new _monorepofixture.Monorepo("add-one-file");
129
129
  await monorepo.init(TEST_PROJECT_PATH);
@@ -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 });\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\";\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/hasher",
3
- "version": "1.8.3",
3
+ "version": "1.9.1",
4
4
  "description": "Hasher for Lage Targets",
5
5
  "repository": {
6
6
  "url": "https://github.com/microsoft/lage"
@@ -17,12 +17,12 @@
17
17
  "dependencies": {
18
18
  "@lage-run/globby": "^14.2.1",
19
19
  "@lage-run/logger": "^1.3.1",
20
- "@lage-run/target-graph": "^0.11.3",
20
+ "@lage-run/target-graph": "^0.12.1",
21
21
  "execa": "5.1.1",
22
22
  "glob-hasher": "^1.4.2",
23
23
  "graceful-fs": "4.2.11",
24
24
  "micromatch": "4.0.8",
25
- "workspace-tools": "0.38.4"
25
+ "workspace-tools": "0.40.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@lage-run/monorepo-fixture": "^0.1.0",
package/.eslintignore DELETED
@@ -1,2 +0,0 @@
1
- src/__fixtures__
2
- src/__tests__