@lage-run/hasher 1.8.2 → 1.8.3

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,22 @@
2
2
  "name": "@lage-run/hasher",
3
3
  "entries": [
4
4
  {
5
- "date": "Thu, 17 Apr 2025 08:09:27 GMT",
5
+ "date": "Fri, 01 Aug 2025 08:09:39 GMT",
6
+ "version": "1.8.3",
7
+ "tag": "@lage-run/hasher_v1.8.3",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "renovate@whitesourcesoftware.com",
12
+ "package": "@lage-run/hasher",
13
+ "commit": "28308e0b441f625fb5a83daabadb55f49b208603",
14
+ "comment": "Update dependency workspace-tools to v0.38.4"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Thu, 17 Apr 2025 08:10:01 GMT",
6
21
  "version": "1.8.2",
7
22
  "tag": "@lage-run/hasher_v1.8.2",
8
23
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,20 @@
1
1
  # Change Log - @lage-run/hasher
2
2
 
3
- <!-- This log was last generated on Thu, 17 Apr 2025 08:09:27 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Fri, 01 Aug 2025 08:09:39 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.8.3
8
+
9
+ Fri, 01 Aug 2025 08:09:39 GMT
10
+
11
+ ### Patches
12
+
13
+ - Update dependency workspace-tools to v0.38.4 (renovate@whitesourcesoftware.com)
14
+
7
15
  ## 1.8.2
8
16
 
9
- Thu, 17 Apr 2025 08:09:27 GMT
17
+ Thu, 17 Apr 2025 08:10:01 GMT
10
18
 
11
19
  ### Patches
12
20
 
@@ -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","constructor","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) => {\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 +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","constructor"],"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 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 +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","constructor","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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"}
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- filterDependenciesInPnpmFixture: function() {
12
+ get filterDependenciesInPnpmFixture () {
13
13
  return filterDependenciesInPnpmFixture;
14
14
  },
15
- filterDependenciesInRushFixture: function() {
15
+ get filterDependenciesInRushFixture () {
16
16
  return filterDependenciesInRushFixture;
17
17
  },
18
- filterDependenciesInYarnFixture: function() {
18
+ get filterDependenciesInYarnFixture () {
19
19
  return filterDependenciesInYarnFixture;
20
20
  }
21
21
  });
@@ -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":";;;;;;;;;;;IAoBsBA,+BAA+B;eAA/BA;;IAcAC,+BAA+B;eAA/BA;;IA5BAC,+BAA+B;eAA/BA;;;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) {\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"}
@@ -5,29 +5,29 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- getGitHashForFiles: function() {
12
+ get getGitHashForFiles () {
13
13
  return getGitHashForFiles;
14
14
  },
15
- getPackageDeps: function() {
15
+ get getPackageDeps () {
16
16
  return getPackageDeps;
17
17
  },
18
- gitLsTree: function() {
18
+ get gitLsTree () {
19
19
  return gitLsTree;
20
20
  },
21
- gitStatus: function() {
21
+ get gitStatus () {
22
22
  return gitStatus;
23
23
  },
24
- parseGitFilename: function() {
24
+ get parseGitFilename () {
25
25
  return parseGitFilename;
26
26
  },
27
- parseGitLsTree: function() {
27
+ get parseGitLsTree () {
28
28
  return parseGitLsTree;
29
29
  },
30
- parseGitStatus: function() {
30
+ get parseGitStatus () {
31
31
  return parseGitStatus;
32
32
  }
33
33
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/getPackageDeps.ts"],"sourcesContent":["import * as path from \"path\";\nimport execa from \"execa\";\n\n/**\n * Parses a quoted filename sourced from the output of the \"git status\" command.\n *\n * Paths with non-standard characters will be enclosed with double-quotes, and non-standard\n * characters will be backslash escaped (ex. double-quotes, non-ASCII characters). The\n * escaped chars can be included in one of two ways:\n * - backslash-escaped chars (ex. \\\")\n * - octal encoded chars (ex. \\347)\n *\n * See documentation: https://git-scm.com/docs/git-status\n */\nexport function parseGitFilename(filename: string): string {\n // If there are no double-quotes around the string, then there are no escaped characters\n // to decode, so just return\n if (!filename.match(/^\".+\"$/)) {\n return filename;\n }\n\n // Need to hex encode '%' since we will be decoding the converted octal values from hex\n filename = filename.replace(/%/g, \"%25\");\n // Replace all instances of octal literals with percent-encoded hex (ex. '\\347\\275\\221' -> '%E7%BD%91').\n // This is done because the octal literals represent UTF-8 bytes, and by converting them to percent-encoded\n // hex, we can use decodeURIComponent to get the Unicode chars.\n filename = filename.replace(/(?:\\\\(\\d{1,3}))/g, (match, ...[octalValue, index, source]) => {\n // We need to make sure that the backslash is intended to escape the octal value. To do this, walk\n // backwards from the match to ensure that it's already escaped.\n const trailingBackslashes: RegExpMatchArray | null = (source as string).slice(0, index as number).match(/\\\\*$/);\n return trailingBackslashes && trailingBackslashes.length > 0 && trailingBackslashes[0].length % 2 === 0\n ? `%${parseInt(octalValue, 8).toString(16)}`\n : match;\n });\n\n // Finally, decode the filename and unescape the escaped UTF-8 chars\n return JSON.parse(decodeURIComponent(filename));\n}\n\n/**\n * Parses the output of the \"git ls-tree\" command\n */\nexport function parseGitLsTree(output: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n if (output) {\n // A line is expected to look like:\n // 100644 blob 3451bccdc831cb43d7a70ed8e628dcf9c7f888c8 src/typings/tsd.d.ts\n // 160000 commit c5880bf5b0c6c1f2e2c43c95beeb8f0a808e8bac rushstack\n const gitRegex = /([0-9]{6})\\s(blob|commit)\\s([a-f0-9]{40})\\s*(.*)/;\n\n // Note: The output of git ls-tree uses \\n newlines regardless of OS.\n const outputLines: string[] = output.trim().split(\"\\n\");\n for (const line of outputLines) {\n if (line) {\n // Take everything after the \"100644 blob\", which is just the hash and filename\n const matches: RegExpMatchArray | null = line.match(gitRegex);\n if (matches && matches[3] && matches[4]) {\n const hash: string = matches[3];\n const filename: string = parseGitFilename(matches[4]);\n\n changes.set(filename, hash);\n } else {\n throw new Error(`Cannot parse git ls-tree input: \"${line}\"`);\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Parses the output of the \"git status\" command\n */\nexport function parseGitStatus(output: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n /*\n * Typically, output will look something like:\n * M temp_modules/rush-package-deps-hash/package.json\n * D package-deps-hash/src/index.ts\n */\n\n // If there was an issue with `git ls-tree`, or there are no current changes, processOutputBlocks[1]\n // will be empty or undefined\n if (!output) {\n return changes;\n }\n\n // Note: The output of git hash-object uses \\n newlines regardless of OS.\n const outputLines: string[] = output.trim().split(\"\\n\");\n for (const line of outputLines) {\n /*\n * changeType is in the format of \"XY\" where \"X\" is the status of the file in the index and \"Y\" is the status of\n * the file in the working tree. Some example statuses:\n * - 'D' == deletion\n * - 'M' == modification\n * - 'A' == addition\n * - '??' == untracked\n * - 'R' == rename\n * - 'RM' == rename with modifications\n * - '[MARC]D' == deleted in work tree\n * Full list of examples: https://git-scm.com/docs/git-status#_short_format\n */\n const match: RegExpMatchArray | null = line.match(/(\"(\\\\\"|[^\"])+\")|(\\S+\\s*)/g);\n\n if (match && match.length > 1) {\n const [changeType, ...filenameMatches] = match;\n\n // We always care about the last filename in the filenames array. In the case of non-rename changes,\n // the filenames array only contains one file, so we can join all segments that were split on spaces.\n // In the case of rename changes, the last item in the array is the path to the file in the working tree,\n // which is the only one that we care about. It is also surrounded by double-quotes if spaces are\n // included, so no need to worry about joining different segments\n let lastFilename: string = changeType.startsWith(\"R\") ? filenameMatches[filenameMatches.length - 1] : filenameMatches.join(\"\");\n lastFilename = parseGitFilename(lastFilename);\n\n changes.set(lastFilename, changeType.trimRight());\n }\n }\n\n return changes;\n}\n\n/**\n * Takes a list of files and returns the current git hashes for them\n *\n * @public\n */\nexport function getGitHashForFiles(filesToHash: string[], packagePath: string, gitPath?: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n if (filesToHash.length) {\n // Use --stdin-paths arg to pass the list of files to git in order to avoid issues with\n // command length\n const result = execa.sync(gitPath || \"git\", [\"hash-object\", \"--stdin-paths\"], {\n input: filesToHash.map((x) => path.resolve(packagePath, x)).join(\"\\n\"),\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git hash-object exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n const hashStdout: string = result.stdout.trim();\n\n // The result of \"git hash-object\" will be a list of file hashes delimited by newlines\n const hashes: string[] = hashStdout.split(\"\\n\");\n\n if (hashes.length !== filesToHash.length) {\n throw new Error(`Passed ${filesToHash.length} file paths to Git to hash, but received ${hashes.length} hashes.`);\n }\n\n for (let i = 0; i < hashes.length; i++) {\n const hash: string = hashes[i];\n const filePath: string = filesToHash[i];\n changes.set(filePath, hash);\n }\n }\n\n return changes;\n}\n\n/**\n * Executes \"git ls-tree\" in a folder\n */\nexport function gitLsTree(path: string, gitPath?: string): string {\n const result = execa.sync(gitPath || \"git\", [\"ls-tree\", \"HEAD\", \"-r\"], {\n cwd: path,\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git ls-tree exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n return result.stdout;\n}\n\n/**\n * Executes \"git status\" in a folder\n */\nexport function gitStatus(path: string, gitPath?: string): string {\n /**\n * -s - Short format. Will be printed as 'XY PATH' or 'XY ORIG_PATH -> PATH'. Paths with non-standard\n * characters will be escaped using double-quotes, and non-standard characters will be backslash\n * escaped (ex. spaces, tabs, double-quotes)\n * -u - Untracked files are included\n *\n * See documentation here: https://git-scm.com/docs/git-status\n */\n const result = execa.sync(gitPath || \"git\", [\"status\", \"-s\", \"-u\", \".\"], {\n cwd: path,\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git status exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n return result.stdout;\n}\n\n/**\n * Builds an object containing hashes for the files under the specified `packagePath` folder.\n * @param packagePath - The folder path to derive the package dependencies from. This is typically the folder\n * containing package.json. If omitted, the default value is the current working directory.\n * @param excludedPaths - An optional array of file path exclusions. If a file should be omitted from the list\n * of dependencies, use this to exclude it.\n * @returns the package-deps.json file content\n *\n * @public\n */\nexport function getPackageDeps(packagePath: string = process.cwd(), excludedPaths?: string[], gitPath?: string): Map<string, string> {\n const gitLsOutput: string = gitLsTree(packagePath, gitPath);\n\n // Add all the checked in hashes\n const result: Map<string, string> = parseGitLsTree(gitLsOutput);\n\n // Remove excluded paths\n if (excludedPaths) {\n for (const excludedPath of excludedPaths) {\n result.delete(excludedPath);\n }\n }\n\n // Update the checked in hashes with the current repo status\n const gitStatusOutput: string = gitStatus(packagePath, gitPath);\n const currentlyChangedFiles: Map<string, string> = parseGitStatus(gitStatusOutput);\n const filesToHash: string[] = [];\n const excludedPathSet: Set<string> = new Set<string>(excludedPaths);\n for (const [filename, changeType] of currentlyChangedFiles) {\n // See comments inside parseGitStatus() for more information\n if (changeType === \"D\" || (changeType.length === 2 && changeType.charAt(1) === \"D\")) {\n result.delete(filename);\n } else {\n if (!excludedPathSet.has(filename)) {\n filesToHash.push(filename);\n }\n }\n }\n\n const currentlyChangedFileHashes: Map<string, string> = getGitHashForFiles(filesToHash, packagePath, gitPath);\n for (const [filename, hash] of currentlyChangedFileHashes) {\n result.set(filename, hash);\n }\n\n return result;\n}\n"],"names":["getGitHashForFiles","getPackageDeps","gitLsTree","gitStatus","parseGitFilename","parseGitLsTree","parseGitStatus","filename","match","replace","octalValue","index","source","trailingBackslashes","slice","length","parseInt","toString","JSON","parse","decodeURIComponent","output","changes","Map","gitRegex","outputLines","trim","split","line","matches","hash","set","Error","changeType","filenameMatches","lastFilename","startsWith","join","trimRight","filesToHash","packagePath","gitPath","result","execa","sync","input","map","x","path","resolve","exitCode","stderr","hashStdout","stdout","hashes","i","filePath","cwd","process","excludedPaths","gitLsOutput","excludedPath","delete","gitStatusOutput","currentlyChangedFiles","excludedPathSet","Set","charAt","has","push","currentlyChangedFileHashes"],"mappings":";;;;;;;;;;;IAkIgBA,kBAAkB;eAAlBA;;IAiFAC,cAAc;eAAdA;;IA7CAC,SAAS;eAATA;;IAeAC,SAAS;eAATA;;IAvKAC,gBAAgB;eAAhBA;;IA4BAC,cAAc;eAAdA;;IAiCAC,cAAc;eAAdA;;;8DA3EM;8DACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaX,SAASF,iBAAiBG,QAAgB;IAC/C,wFAAwF;IACxF,4BAA4B;IAC5B,IAAI,CAACA,SAASC,KAAK,CAAC,WAAW;QAC7B,OAAOD;IACT;IAEA,uFAAuF;IACvFA,WAAWA,SAASE,OAAO,CAAC,MAAM;IAClC,wGAAwG;IACxG,2GAA2G;IAC3G,+DAA+D;IAC/DF,WAAWA,SAASE,OAAO,CAAC,oBAAoB,CAACD,OAAO,GAAG,CAACE,YAAYC,OAAOC,OAAO;QACpF,kGAAkG;QAClG,gEAAgE;QAChE,MAAMC,sBAA+C,AAACD,OAAkBE,KAAK,CAAC,GAAGH,OAAiBH,KAAK,CAAC;QACxG,OAAOK,uBAAuBA,oBAAoBE,MAAM,GAAG,KAAKF,mBAAmB,CAAC,EAAE,CAACE,MAAM,GAAG,MAAM,IAClG,CAAC,CAAC,EAAEC,SAASN,YAAY,GAAGO,QAAQ,CAAC,KAAK,GAC1CT;IACN;IAEA,oEAAoE;IACpE,OAAOU,KAAKC,KAAK,CAACC,mBAAmBb;AACvC;AAKO,SAASF,eAAegB,MAAc;IAC3C,MAAMC,UAA+B,IAAIC;IAEzC,IAAIF,QAAQ;QACV,mCAAmC;QACnC,+EAA+E;QAC/E,oEAAoE;QACpE,MAAMG,WAAW;QAEjB,qEAAqE;QACrE,MAAMC,cAAwBJ,OAAOK,IAAI,GAAGC,KAAK,CAAC;QAClD,KAAK,MAAMC,QAAQH,YAAa;YAC9B,IAAIG,MAAM;gBACR,+EAA+E;gBAC/E,MAAMC,UAAmCD,KAAKpB,KAAK,CAACgB;gBACpD,IAAIK,WAAWA,OAAO,CAAC,EAAE,IAAIA,OAAO,CAAC,EAAE,EAAE;oBACvC,MAAMC,OAAeD,OAAO,CAAC,EAAE;oBAC/B,MAAMtB,WAAmBH,iBAAiByB,OAAO,CAAC,EAAE;oBAEpDP,QAAQS,GAAG,CAACxB,UAAUuB;gBACxB,OAAO;oBACL,MAAM,IAAIE,MAAM,CAAC,iCAAiC,EAAEJ,KAAK,CAAC,CAAC;gBAC7D;YACF;QACF;IACF;IAEA,OAAON;AACT;AAKO,SAAShB,eAAee,MAAc;IAC3C,MAAMC,UAA+B,IAAIC;IAEzC;;;;GAIC,GAED,oGAAoG;IACpG,6BAA6B;IAC7B,IAAI,CAACF,QAAQ;QACX,OAAOC;IACT;IAEA,yEAAyE;IACzE,MAAMG,cAAwBJ,OAAOK,IAAI,GAAGC,KAAK,CAAC;IAClD,KAAK,MAAMC,QAAQH,YAAa;QAC9B;;;;;;;;;;;KAWC,GACD,MAAMjB,QAAiCoB,KAAKpB,KAAK,CAAC;QAElD,IAAIA,SAASA,MAAMO,MAAM,GAAG,GAAG;YAC7B,MAAM,CAACkB,YAAY,GAAGC,gBAAgB,GAAG1B;YAEzC,oGAAoG;YACpG,qGAAqG;YACrG,yGAAyG;YACzG,iGAAiG;YACjG,iEAAiE;YACjE,IAAI2B,eAAuBF,WAAWG,UAAU,CAAC,OAAOF,eAAe,CAACA,gBAAgBnB,MAAM,GAAG,EAAE,GAAGmB,gBAAgBG,IAAI,CAAC;YAC3HF,eAAe/B,iBAAiB+B;YAEhCb,QAAQS,GAAG,CAACI,cAAcF,WAAWK,SAAS;QAChD;IACF;IAEA,OAAOhB;AACT;AAOO,SAAStB,mBAAmBuC,WAAqB,EAAEC,WAAmB,EAAEC,OAAgB;IAC7F,MAAMnB,UAA+B,IAAIC;IAEzC,IAAIgB,YAAYxB,MAAM,EAAE;QACtB,uFAAuF;QACvF,iBAAiB;QACjB,MAAM2B,SAASC,cAAK,CAACC,IAAI,CAACH,WAAW,OAAO;YAAC;YAAe;SAAgB,EAAE;YAC5EI,OAAON,YAAYO,GAAG,CAAC,CAACC,IAAMC,MAAKC,OAAO,CAACT,aAAaO,IAAIV,IAAI,CAAC;QACnE;QAEA,IAAIK,OAAOQ,QAAQ,KAAK,GAAG;YACzB,MAAM,IAAIlB,MAAM,CAAC,mCAAmC,EAAEU,OAAOQ,QAAQ,CAAC,EAAE,EAAER,OAAOS,MAAM,EAAE;QAC3F;QAEA,MAAMC,aAAqBV,OAAOW,MAAM,CAAC3B,IAAI;QAE7C,sFAAsF;QACtF,MAAM4B,SAAmBF,WAAWzB,KAAK,CAAC;QAE1C,IAAI2B,OAAOvC,MAAM,KAAKwB,YAAYxB,MAAM,EAAE;YACxC,MAAM,IAAIiB,MAAM,CAAC,OAAO,EAAEO,YAAYxB,MAAM,CAAC,yCAAyC,EAAEuC,OAAOvC,MAAM,CAAC,QAAQ,CAAC;QACjH;QAEA,IAAK,IAAIwC,IAAI,GAAGA,IAAID,OAAOvC,MAAM,EAAEwC,IAAK;YACtC,MAAMzB,OAAewB,MAAM,CAACC,EAAE;YAC9B,MAAMC,WAAmBjB,WAAW,CAACgB,EAAE;YACvCjC,QAAQS,GAAG,CAACyB,UAAU1B;QACxB;IACF;IAEA,OAAOR;AACT;AAKO,SAASpB,UAAU8C,IAAY,EAAEP,OAAgB;IACtD,MAAMC,SAASC,cAAK,CAACC,IAAI,CAACH,WAAW,OAAO;QAAC;QAAW;QAAQ;KAAK,EAAE;QACrEgB,KAAKT;IACP;IAEA,IAAIN,OAAOQ,QAAQ,KAAK,GAAG;QACzB,MAAM,IAAIlB,MAAM,CAAC,+BAA+B,EAAEU,OAAOQ,QAAQ,CAAC,EAAE,EAAER,OAAOS,MAAM,EAAE;IACvF;IAEA,OAAOT,OAAOW,MAAM;AACtB;AAKO,SAASlD,UAAU6C,IAAY,EAAEP,OAAgB;IACtD;;;;;;;GAOC,GACD,MAAMC,SAASC,cAAK,CAACC,IAAI,CAACH,WAAW,OAAO;QAAC;QAAU;QAAM;QAAM;KAAI,EAAE;QACvEgB,KAAKT;IACP;IAEA,IAAIN,OAAOQ,QAAQ,KAAK,GAAG;QACzB,MAAM,IAAIlB,MAAM,CAAC,8BAA8B,EAAEU,OAAOQ,QAAQ,CAAC,EAAE,EAAER,OAAOS,MAAM,EAAE;IACtF;IAEA,OAAOT,OAAOW,MAAM;AACtB;AAYO,SAASpD,eAAeuC,cAAsBkB,QAAQD,GAAG,EAAE,EAAEE,aAAwB,EAAElB,OAAgB;IAC5G,MAAMmB,cAAsB1D,UAAUsC,aAAaC;IAEnD,gCAAgC;IAChC,MAAMC,SAA8BrC,eAAeuD;IAEnD,wBAAwB;IACxB,IAAID,eAAe;QACjB,KAAK,MAAME,gBAAgBF,cAAe;YACxCjB,OAAOoB,MAAM,CAACD;QAChB;IACF;IAEA,4DAA4D;IAC5D,MAAME,kBAA0B5D,UAAUqC,aAAaC;IACvD,MAAMuB,wBAA6C1D,eAAeyD;IAClE,MAAMxB,cAAwB,EAAE;IAChC,MAAM0B,kBAA+B,IAAIC,IAAYP;IACrD,KAAK,MAAM,CAACpD,UAAU0B,WAAW,IAAI+B,sBAAuB;QAC1D,4DAA4D;QAC5D,IAAI/B,eAAe,OAAQA,WAAWlB,MAAM,KAAK,KAAKkB,WAAWkC,MAAM,CAAC,OAAO,KAAM;YACnFzB,OAAOoB,MAAM,CAACvD;QAChB,OAAO;YACL,IAAI,CAAC0D,gBAAgBG,GAAG,CAAC7D,WAAW;gBAClCgC,YAAY8B,IAAI,CAAC9D;YACnB;QACF;IACF;IAEA,MAAM+D,6BAAkDtE,mBAAmBuC,aAAaC,aAAaC;IACrG,KAAK,MAAM,CAAClC,UAAUuB,KAAK,IAAIwC,2BAA4B;QACzD5B,OAAOX,GAAG,CAACxB,UAAUuB;IACvB;IAEA,OAAOY;AACT"}
1
+ {"version":3,"sources":["../src/getPackageDeps.ts"],"sourcesContent":["import * as path from \"path\";\nimport execa from \"execa\";\n\n/**\n * Parses a quoted filename sourced from the output of the \"git status\" command.\n *\n * Paths with non-standard characters will be enclosed with double-quotes, and non-standard\n * characters will be backslash escaped (ex. double-quotes, non-ASCII characters). The\n * escaped chars can be included in one of two ways:\n * - backslash-escaped chars (ex. \\\")\n * - octal encoded chars (ex. \\347)\n *\n * See documentation: https://git-scm.com/docs/git-status\n */\nexport function parseGitFilename(filename: string): string {\n // If there are no double-quotes around the string, then there are no escaped characters\n // to decode, so just return\n if (!filename.match(/^\".+\"$/)) {\n return filename;\n }\n\n // Need to hex encode '%' since we will be decoding the converted octal values from hex\n filename = filename.replace(/%/g, \"%25\");\n // Replace all instances of octal literals with percent-encoded hex (ex. '\\347\\275\\221' -> '%E7%BD%91').\n // This is done because the octal literals represent UTF-8 bytes, and by converting them to percent-encoded\n // hex, we can use decodeURIComponent to get the Unicode chars.\n filename = filename.replace(/(?:\\\\(\\d{1,3}))/g, (match, ...[octalValue, index, source]) => {\n // We need to make sure that the backslash is intended to escape the octal value. To do this, walk\n // backwards from the match to ensure that it's already escaped.\n const trailingBackslashes: RegExpMatchArray | null = (source as string).slice(0, index as number).match(/\\\\*$/);\n return trailingBackslashes && trailingBackslashes.length > 0 && trailingBackslashes[0].length % 2 === 0\n ? `%${parseInt(octalValue, 8).toString(16)}`\n : match;\n });\n\n // Finally, decode the filename and unescape the escaped UTF-8 chars\n return JSON.parse(decodeURIComponent(filename));\n}\n\n/**\n * Parses the output of the \"git ls-tree\" command\n */\nexport function parseGitLsTree(output: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n if (output) {\n // A line is expected to look like:\n // 100644 blob 3451bccdc831cb43d7a70ed8e628dcf9c7f888c8 src/typings/tsd.d.ts\n // 160000 commit c5880bf5b0c6c1f2e2c43c95beeb8f0a808e8bac rushstack\n const gitRegex = /([0-9]{6})\\s(blob|commit)\\s([a-f0-9]{40})\\s*(.*)/;\n\n // Note: The output of git ls-tree uses \\n newlines regardless of OS.\n const outputLines: string[] = output.trim().split(\"\\n\");\n for (const line of outputLines) {\n if (line) {\n // Take everything after the \"100644 blob\", which is just the hash and filename\n const matches: RegExpMatchArray | null = line.match(gitRegex);\n if (matches && matches[3] && matches[4]) {\n const hash: string = matches[3];\n const filename: string = parseGitFilename(matches[4]);\n\n changes.set(filename, hash);\n } else {\n throw new Error(`Cannot parse git ls-tree input: \"${line}\"`);\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Parses the output of the \"git status\" command\n */\nexport function parseGitStatus(output: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n /*\n * Typically, output will look something like:\n * M temp_modules/rush-package-deps-hash/package.json\n * D package-deps-hash/src/index.ts\n */\n\n // If there was an issue with `git ls-tree`, or there are no current changes, processOutputBlocks[1]\n // will be empty or undefined\n if (!output) {\n return changes;\n }\n\n // Note: The output of git hash-object uses \\n newlines regardless of OS.\n const outputLines: string[] = output.trim().split(\"\\n\");\n for (const line of outputLines) {\n /*\n * changeType is in the format of \"XY\" where \"X\" is the status of the file in the index and \"Y\" is the status of\n * the file in the working tree. Some example statuses:\n * - 'D' == deletion\n * - 'M' == modification\n * - 'A' == addition\n * - '??' == untracked\n * - 'R' == rename\n * - 'RM' == rename with modifications\n * - '[MARC]D' == deleted in work tree\n * Full list of examples: https://git-scm.com/docs/git-status#_short_format\n */\n const match: RegExpMatchArray | null = line.match(/(\"(\\\\\"|[^\"])+\")|(\\S+\\s*)/g);\n\n if (match && match.length > 1) {\n const [changeType, ...filenameMatches] = match;\n\n // We always care about the last filename in the filenames array. In the case of non-rename changes,\n // the filenames array only contains one file, so we can join all segments that were split on spaces.\n // In the case of rename changes, the last item in the array is the path to the file in the working tree,\n // which is the only one that we care about. It is also surrounded by double-quotes if spaces are\n // included, so no need to worry about joining different segments\n let lastFilename: string = changeType.startsWith(\"R\") ? filenameMatches[filenameMatches.length - 1] : filenameMatches.join(\"\");\n lastFilename = parseGitFilename(lastFilename);\n\n changes.set(lastFilename, changeType.trimRight());\n }\n }\n\n return changes;\n}\n\n/**\n * Takes a list of files and returns the current git hashes for them\n *\n * @public\n */\nexport function getGitHashForFiles(filesToHash: string[], packagePath: string, gitPath?: string): Map<string, string> {\n const changes: Map<string, string> = new Map<string, string>();\n\n if (filesToHash.length) {\n // Use --stdin-paths arg to pass the list of files to git in order to avoid issues with\n // command length\n const result = execa.sync(gitPath || \"git\", [\"hash-object\", \"--stdin-paths\"], {\n input: filesToHash.map((x) => path.resolve(packagePath, x)).join(\"\\n\"),\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git hash-object exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n const hashStdout: string = result.stdout.trim();\n\n // The result of \"git hash-object\" will be a list of file hashes delimited by newlines\n const hashes: string[] = hashStdout.split(\"\\n\");\n\n if (hashes.length !== filesToHash.length) {\n throw new Error(`Passed ${filesToHash.length} file paths to Git to hash, but received ${hashes.length} hashes.`);\n }\n\n for (let i = 0; i < hashes.length; i++) {\n const hash: string = hashes[i];\n const filePath: string = filesToHash[i];\n changes.set(filePath, hash);\n }\n }\n\n return changes;\n}\n\n/**\n * Executes \"git ls-tree\" in a folder\n */\nexport function gitLsTree(path: string, gitPath?: string): string {\n const result = execa.sync(gitPath || \"git\", [\"ls-tree\", \"HEAD\", \"-r\"], {\n cwd: path,\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git ls-tree exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n return result.stdout;\n}\n\n/**\n * Executes \"git status\" in a folder\n */\nexport function gitStatus(path: string, gitPath?: string): string {\n /**\n * -s - Short format. Will be printed as 'XY PATH' or 'XY ORIG_PATH -> PATH'. Paths with non-standard\n * characters will be escaped using double-quotes, and non-standard characters will be backslash\n * escaped (ex. spaces, tabs, double-quotes)\n * -u - Untracked files are included\n *\n * See documentation here: https://git-scm.com/docs/git-status\n */\n const result = execa.sync(gitPath || \"git\", [\"status\", \"-s\", \"-u\", \".\"], {\n cwd: path,\n });\n\n if (result.exitCode !== 0) {\n throw new Error(`git status exited with status ${result.exitCode}: ${result.stderr}`);\n }\n\n return result.stdout;\n}\n\n/**\n * Builds an object containing hashes for the files under the specified `packagePath` folder.\n * @param packagePath - The folder path to derive the package dependencies from. This is typically the folder\n * containing package.json. If omitted, the default value is the current working directory.\n * @param excludedPaths - An optional array of file path exclusions. If a file should be omitted from the list\n * of dependencies, use this to exclude it.\n * @returns the package-deps.json file content\n *\n * @public\n */\nexport function getPackageDeps(packagePath: string = process.cwd(), excludedPaths?: string[], gitPath?: string): Map<string, string> {\n const gitLsOutput: string = gitLsTree(packagePath, gitPath);\n\n // Add all the checked in hashes\n const result: Map<string, string> = parseGitLsTree(gitLsOutput);\n\n // Remove excluded paths\n if (excludedPaths) {\n for (const excludedPath of excludedPaths) {\n result.delete(excludedPath);\n }\n }\n\n // Update the checked in hashes with the current repo status\n const gitStatusOutput: string = gitStatus(packagePath, gitPath);\n const currentlyChangedFiles: Map<string, string> = parseGitStatus(gitStatusOutput);\n const filesToHash: string[] = [];\n const excludedPathSet: Set<string> = new Set<string>(excludedPaths);\n for (const [filename, changeType] of currentlyChangedFiles) {\n // See comments inside parseGitStatus() for more information\n if (changeType === \"D\" || (changeType.length === 2 && changeType.charAt(1) === \"D\")) {\n result.delete(filename);\n } else {\n if (!excludedPathSet.has(filename)) {\n filesToHash.push(filename);\n }\n }\n }\n\n const currentlyChangedFileHashes: Map<string, string> = getGitHashForFiles(filesToHash, packagePath, gitPath);\n for (const [filename, hash] of currentlyChangedFileHashes) {\n result.set(filename, hash);\n }\n\n return result;\n}\n"],"names":["getGitHashForFiles","getPackageDeps","gitLsTree","gitStatus","parseGitFilename","parseGitLsTree","parseGitStatus","filename","match","replace","octalValue","index","source","trailingBackslashes","slice","length","parseInt","toString","JSON","parse","decodeURIComponent","output","changes","Map","gitRegex","outputLines","trim","split","line","matches","hash","set","Error","changeType","filenameMatches","lastFilename","startsWith","join","trimRight","filesToHash","packagePath","gitPath","result","execa","sync","input","map","x","path","resolve","exitCode","stderr","hashStdout","stdout","hashes","i","filePath","cwd","process","excludedPaths","gitLsOutput","excludedPath","delete","gitStatusOutput","currentlyChangedFiles","excludedPathSet","Set","charAt","has","push","currentlyChangedFileHashes"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -5,23 +5,23 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- FileHasher: function() {
12
+ get FileHasher () {
13
13
  return _FileHasher.FileHasher;
14
14
  },
15
- PackageTree: function() {
15
+ get PackageTree () {
16
16
  return _PackageTree.PackageTree;
17
17
  },
18
- TargetHasher: function() {
18
+ get TargetHasher () {
19
19
  return _TargetHasher.TargetHasher;
20
20
  },
21
- getInputFiles: function() {
21
+ get getInputFiles () {
22
22
  return _getInputFiles.getInputFiles;
23
23
  },
24
- hashStrings: function() {
24
+ get hashStrings () {
25
25
  return _hashStrings.hashStrings;
26
26
  }
27
27
  });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { TargetHasher } from \"./TargetHasher.js\";\nexport { PackageTree } from \"./PackageTree.js\";\nexport { getInputFiles } from \"./getInputFiles.js\";\nexport { FileHasher } from \"./FileHasher.js\";\nexport { hashStrings } from \"./hashStrings.js\";\n"],"names":["FileHasher","PackageTree","TargetHasher","getInputFiles","hashStrings"],"mappings":";;;;;;;;;;;IAGSA,UAAU;eAAVA,sBAAU;;IAFVC,WAAW;eAAXA,wBAAW;;IADXC,YAAY;eAAZA,0BAAY;;IAEZC,aAAa;eAAbA,4BAAa;;IAEbC,WAAW;eAAXA,wBAAW;;;8BAJS;6BACD;+BACE;4BACH;6BACC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { TargetHasher } from \"./TargetHasher.js\";\nexport { PackageTree } from \"./PackageTree.js\";\nexport { getInputFiles } from \"./getInputFiles.js\";\nexport { FileHasher } from \"./FileHasher.js\";\nexport { hashStrings } from \"./hashStrings.js\";\n"],"names":["FileHasher","PackageTree","TargetHasher","getInputFiles","hashStrings"],"mappings":";;;;;;;;;;;QAGSA;eAAAA,sBAAU;;QAFVC;eAAAA,wBAAW;;QADXC;eAAAA,0BAAY;;QAEZC;eAAAA,4BAAa;;QAEbC;eAAAA,wBAAW;;;8BAJS;6BACD;+BACE;4BACH;6BACC"}
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- addToQueue: function() {
12
+ get addToQueue () {
13
13
  return addToQueue;
14
14
  },
15
- filterExternalDependencies: function() {
15
+ get filterExternalDependencies () {
16
16
  return filterExternalDependencies;
17
17
  },
18
- resolveExternalDependencies: function() {
18
+ get resolveExternalDependencies () {
19
19
  return resolveExternalDependencies;
20
20
  }
21
21
  });
@@ -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":";;;;;;;;;;;IAgCgBA,UAAU;eAAVA;;IArBAC,0BAA0B;eAA1BA;;IAiCAC,2BAA2B;eAA3BA;;;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, 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"}
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- filterInternalDependencies: function() {
12
+ get filterInternalDependencies () {
13
13
  return filterInternalDependencies;
14
14
  },
15
- resolveInternalDependencies: function() {
15
+ get resolveInternalDependencies () {
16
16
  return resolveInternalDependencies;
17
17
  }
18
18
  });
@@ -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":";;;;;;;;;;;IAKgBA,0BAA0B;eAA1BA;;IAKAC,2BAA2B;eAA3BA;;;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 { 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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/hasher",
3
- "version": "1.8.2",
3
+ "version": "1.8.3",
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.2",
20
+ "@lage-run/target-graph": "^0.11.3",
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.3"
25
+ "workspace-tools": "0.38.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@lage-run/monorepo-fixture": "^0.1.0",