@lage-run/hasher 1.9.4 → 1.9.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileHasher.ts"],"sourcesContent":["import { getFileHashes } from \"backfill-hasher\";\nimport { hash as fastHash, stat } from \"glob-hasher\";\nimport fs from \"graceful-fs\";\nimport { createInterface } from \"node:readline\";\nimport path from \"path\";\n\ninterface FileHashStoreOptions {\n root: string;\n}\n\ntype FileHashManifestStore = Record<\n string,\n {\n mtime: bigint;\n size: number;\n hash: string;\n }\n>;\n\nexport class FileHasher {\n #store: FileHashManifestStore = {};\n #manifestFile: string;\n\n constructor(private options: FileHashStoreOptions) {\n const { root } = options;\n const cacheDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\");\n this.#manifestFile = path.join(cacheDirectory, \"file_hashes.manifest\");\n }\n\n private getHashesFromGit(): void {\n const { root } = this.options;\n const fileHashes = getFileHashes(root);\n const files = Object.keys(fileHashes);\n const fileStats = stat(files, { cwd: root }) ?? {};\n\n for (const [relativePath, fileStat] of Object.entries(fileStats)) {\n const hash = fileHashes[relativePath];\n if (hash) {\n const { size, mtime } = fileStat;\n\n this.#store[relativePath] = { hash, size, mtime };\n }\n }\n\n this.writeManifest();\n }\n\n public async readManifest(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!fs.existsSync(this.#manifestFile)) {\n try {\n this.getHashesFromGit();\n resolve();\n } catch (err) {\n reject(err);\n }\n return;\n }\n\n const inputStream = fs.createReadStream(this.#manifestFile, \"utf-8\");\n const rl = createInterface({\n input: inputStream,\n crlfDelay: Infinity,\n });\n\n let info: string[] = [];\n\n rl.on(\"line\", (line) => {\n info = line.split(\"\\0\");\n\n this.#store[info[0]] = {\n mtime: BigInt(info[1]),\n size: parseInt(info[2]),\n hash: info[3],\n };\n });\n\n inputStream.on(\"end\", () => {\n rl.close();\n resolve();\n });\n });\n }\n\n public writeManifest(): void {\n fs.mkdirSync(path.dirname(this.#manifestFile), { recursive: true });\n const outputLines = Object.entries(this.#store).map(([relativePath, info]) => {\n return `${relativePath}\\0${info.mtime.toString()}\\0${info.size.toString()}\\0${info.hash}`;\n });\n\n fs.writeFileSync(this.#manifestFile, outputLines.join(\"\\n\"), \"utf-8\");\n }\n\n public hash(files: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n\n const updatedFiles: string[] = [];\n\n const stats = stat(files, { cwd: this.options.root }) ?? {};\n\n for (const file of files) {\n const stat = stats[file];\n\n const info = this.#store[file];\n if (info && stat.mtime === info.mtime && stat.size == info.size) {\n hashes[file] = info.hash;\n } else {\n updatedFiles.push(file);\n }\n }\n\n const updatedHashes = fastHash(updatedFiles, { cwd: this.options.root, concurrency: 4 }) ?? {};\n\n for (const [file, hash] of Object.entries(updatedHashes)) {\n const stat = fs.statSync(path.join(this.options.root, file), { bigint: true });\n this.#store[file] = {\n mtime: stat.mtimeMs,\n size: Number(stat.size),\n hash: hash ?? \"\",\n };\n hashes[file] = hash ?? \"\";\n }\n\n return hashes;\n }\n}\n"],"names":["FileHasher","getHashesFromGit","root","options","fileHashes","getFileHashes","files","Object","keys","fileStats","stat","cwd","relativePath","fileStat","entries","hash","size","mtime","writeManifest","readManifest","Promise","resolve","reject","fs","existsSync","err","inputStream","createReadStream","rl","createInterface","input","crlfDelay","Infinity","info","on","line","split","BigInt","parseInt","close","mkdirSync","path","dirname","recursive","outputLines","map","toString","writeFileSync","join","hashes","updatedFiles","stats","file","push","updatedHashes","fastHash","concurrency","statSync","bigint","mtimeMs","Number","cacheDirectory"],"mappings":";;;;+BAmBaA;;;eAAAA;;;gCAnBiB;4BACS;mEACxB;8BACiB;6DACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgBf,sCACA;AAFK,MAAMA;IAUHC,mBAAyB;QAC/B,MAAM,EAAEC,IAAI,EAAE,GAAG,IAAI,CAACC,OAAO;QAC7B,MAAMC,aAAaC,IAAAA,6BAAa,EAACH;QACjC,MAAMI,QAAQC,OAAOC,IAAI,CAACJ;QAC1B,MAAMK,YAAYC,IAAAA,gBAAI,EAACJ,OAAO;YAAEK,KAAKT;QAAK,MAAM,CAAC;QAEjD,KAAK,MAAM,CAACU,cAAcC,SAAS,IAAIN,OAAOO,OAAO,CAACL,WAAY;YAChE,MAAMM,OAAOX,UAAU,CAACQ,aAAa;YACrC,IAAIG,MAAM;gBACR,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGJ;gBAExB,yBAAA,IAAI,EAAC,OAAM,CAACD,aAAa,GAAG;oBAAEG;oBAAMC;oBAAMC;gBAAM;YAClD;QACF;QAEA,IAAI,CAACC,aAAa;IACpB;IAEA,MAAaC,eAA8B;QACzC,OAAO,IAAIC,QAAc,CAACC,SAASC;YACjC,IAAI,CAACC,mBAAE,CAACC,UAAU,0BAAC,IAAI,EAAC,iBAAgB;gBACtC,IAAI;oBACF,IAAI,CAACvB,gBAAgB;oBACrBoB;gBACF,EAAE,OAAOI,KAAK;oBACZH,OAAOG;gBACT;gBACA;YACF;YAEA,MAAMC,cAAcH,mBAAE,CAACI,gBAAgB,0BAAC,IAAI,EAAC,gBAAe;YAC5D,MAAMC,KAAKC,IAAAA,6BAAe,EAAC;gBACzBC,OAAOJ;gBACPK,WAAWC;YACb;YAEA,IAAIC,OAAiB,EAAE;YAEvBL,GAAGM,EAAE,CAAC,QAAQ,CAACC;gBACbF,OAAOE,KAAKC,KAAK,CAAC;gBAElB,yBAAA,IAAI,EAAC,OAAM,CAACH,IAAI,CAAC,EAAE,CAAC,GAAG;oBACrBhB,OAAOoB,OAAOJ,IAAI,CAAC,EAAE;oBACrBjB,MAAMsB,SAASL,IAAI,CAAC,EAAE;oBACtBlB,MAAMkB,IAAI,CAAC,EAAE;gBACf;YACF;YAEAP,YAAYQ,EAAE,CAAC,OAAO;gBACpBN,GAAGW,KAAK;gBACRlB;YACF;QACF;IACF;IAEOH,gBAAsB;QAC3BK,mBAAE,CAACiB,SAAS,CAACC,aAAI,CAACC,OAAO,0BAAC,IAAI,EAAC,iBAAgB;YAAEC,WAAW;QAAK;QACjE,MAAMC,cAAcrC,OAAOO,OAAO,0BAAC,IAAI,EAAC,SAAQ+B,GAAG,CAAC,CAAC,CAACjC,cAAcqB,KAAK;YACvE,OAAO,GAAGrB,aAAa,EAAE,EAAEqB,KAAKhB,KAAK,CAAC6B,QAAQ,GAAG,EAAE,EAAEb,KAAKjB,IAAI,CAAC8B,QAAQ,GAAG,EAAE,EAAEb,KAAKlB,IAAI,EAAE;QAC3F;QAEAQ,mBAAE,CAACwB,aAAa,0BAAC,IAAI,EAAC,gBAAeH,YAAYI,IAAI,CAAC,OAAO;IAC/D;IAEOjC,KAAKT,KAAe,EAA0B;QACnD,MAAM2C,SAAiC,CAAC;QAExC,MAAMC,eAAyB,EAAE;QAEjC,MAAMC,QAAQzC,IAAAA,gBAAI,EAACJ,OAAO;YAAEK,KAAK,IAAI,CAACR,OAAO,CAACD,IAAI;QAAC,MAAM,CAAC;QAE1D,KAAK,MAAMkD,QAAQ9C,MAAO;YACxB,MAAMI,OAAOyC,KAAK,CAACC,KAAK;YAExB,MAAMnB,OAAO,yBAAA,IAAI,EAAC,OAAM,CAACmB,KAAK;YAC9B,IAAInB,QAAQvB,KAAKO,KAAK,KAAKgB,KAAKhB,KAAK,IAAIP,KAAKM,IAAI,IAAIiB,KAAKjB,IAAI,EAAE;gBAC/DiC,MAAM,CAACG,KAAK,GAAGnB,KAAKlB,IAAI;YAC1B,OAAO;gBACLmC,aAAaG,IAAI,CAACD;YACpB;QACF;QAEA,MAAME,gBAAgBC,IAAAA,gBAAQ,EAACL,cAAc;YAAEvC,KAAK,IAAI,CAACR,OAAO,CAACD,IAAI;YAAEsD,aAAa;QAAE,MAAM,CAAC;QAE7F,KAAK,MAAM,CAACJ,MAAMrC,KAAK,IAAIR,OAAOO,OAAO,CAACwC,eAAgB;YACxD,MAAM5C,OAAOa,mBAAE,CAACkC,QAAQ,CAAChB,aAAI,CAACO,IAAI,CAAC,IAAI,CAAC7C,OAAO,CAACD,IAAI,EAAEkD,OAAO;gBAAEM,QAAQ;YAAK;YAC5E,yBAAA,IAAI,EAAC,OAAM,CAACN,KAAK,GAAG;gBAClBnC,OAAOP,KAAKiD,OAAO;gBACnB3C,MAAM4C,OAAOlD,KAAKM,IAAI;gBACtBD,MAAMA,QAAQ;YAChB;YACAkC,MAAM,CAACG,KAAK,GAAGrC,QAAQ;QACzB;QAEA,OAAOkC;IACT;IArGA,YAAY,AAAQ9C,OAA6B,CAAE;;QAHnD,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAA,KAAA;;aAEoBA,UAAAA;uCAHpB,QAAgC,CAAC;QAI/B,MAAM,EAAED,IAAI,EAAE,GAAGC;QACjB,MAAM0D,iBAAiBpB,aAAI,CAACO,IAAI,CAAC9C,MAAM,gBAAgB,UAAU;uCAC5D,eAAgBuC,aAAI,CAACO,IAAI,CAACa,gBAAgB;IACjD;AAkGF"}
1
+ {"version":3,"sources":["../src/FileHasher.ts"],"sourcesContent":["import { getFileHashes } from \"backfill-hasher\";\nimport { hash as fastHash, stat as globStat } from \"glob-hasher\";\nimport fs from \"graceful-fs\";\nimport { createInterface } from \"node:readline\";\nimport path from \"path\";\n\ninterface FileHashStoreOptions {\n root: string;\n}\n\ntype FileHashManifestStore = Record<\n string,\n {\n mtime: bigint;\n size: number;\n hash: string;\n }\n>;\n\nexport class FileHasher {\n #store: FileHashManifestStore = {};\n #manifestFile: string;\n\n constructor(private options: FileHashStoreOptions) {\n const { root } = options;\n const cacheDirectory = path.join(root, \"node_modules\", \".cache\", \"lage\");\n this.#manifestFile = path.join(cacheDirectory, \"file_hashes.manifest\");\n }\n\n private getHashesFromGit(): void {\n const { root } = this.options;\n const fileHashes = getFileHashes(root);\n const files = Object.keys(fileHashes);\n const fileStats = globStat(files, { cwd: root }) ?? {};\n\n for (const [relativePath, fileStat] of Object.entries(fileStats)) {\n const hash = fileHashes[relativePath];\n if (hash) {\n const { size, mtime } = fileStat;\n\n this.#store[relativePath] = { hash, size, mtime };\n }\n }\n\n this.writeManifest();\n }\n\n public async readManifest(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!fs.existsSync(this.#manifestFile)) {\n try {\n this.getHashesFromGit();\n resolve();\n } catch (err) {\n reject(err);\n }\n return;\n }\n\n const inputStream = fs.createReadStream(this.#manifestFile, \"utf-8\");\n const rl = createInterface({\n input: inputStream,\n crlfDelay: Infinity,\n });\n\n let info: string[] = [];\n\n rl.on(\"line\", (line) => {\n info = line.split(\"\\0\");\n\n this.#store[info[0]] = {\n mtime: BigInt(info[1]),\n size: parseInt(info[2]),\n hash: info[3],\n };\n });\n\n inputStream.on(\"end\", () => {\n rl.close();\n resolve();\n });\n });\n }\n\n public writeManifest(): void {\n fs.mkdirSync(path.dirname(this.#manifestFile), { recursive: true });\n const outputLines = Object.entries(this.#store).map(([relativePath, info]) => {\n return `${relativePath}\\0${info.mtime.toString()}\\0${info.size.toString()}\\0${info.hash}`;\n });\n\n fs.writeFileSync(this.#manifestFile, outputLines.join(\"\\n\"), \"utf-8\");\n }\n\n public hash(files: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n\n const updatedFiles: string[] = [];\n\n const stats = globStat(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","getFileHashes","files","Object","keys","fileStats","globStat","cwd","relativePath","fileStat","entries","hash","size","mtime","writeManifest","readManifest","Promise","resolve","reject","fs","existsSync","err","inputStream","createReadStream","rl","createInterface","input","crlfDelay","Infinity","info","on","line","split","BigInt","parseInt","close","mkdirSync","path","dirname","recursive","outputLines","map","toString","writeFileSync","join","hashes","updatedFiles","stats","file","stat","push","updatedHashes","fastHash","concurrency","statSync","bigint","mtimeMs","Number","cacheDirectory"],"mappings":"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"}
@@ -51,7 +51,7 @@ class TargetHasher {
51
51
  this.initializedPromise = Promise.all([
52
52
  this.fileHasher.readManifest().then(()=>(0, _globby.globAsync)(environmentGlob, {
53
53
  cwd: root
54
- })).then((files)=>this.fileHasher.hash(files)).then((hash)=>this.globalInputsHash = hash),
54
+ })).then((files)=>this.fileHasher.hash(files)).then((h)=>this.globalInputsHash = h),
55
55
  (0, _workspacetools.getPackageInfosAsync)(root).then((packageInfos)=>{
56
56
  if (Object.keys(packageInfos).length) {
57
57
  this.packageInfos = packageInfos;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TargetHasher.ts"],"sourcesContent":["import { globAsync } from \"@lage-run/globby\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport { resolveExternalDependencies } from \"backfill-hasher\";\nimport fs from \"fs\";\nimport { hash } from \"glob-hasher\";\nimport path from \"path\";\nimport {\n createDependencyMap,\n type DependencyMap,\n getPackageInfo,\n getPackageInfosAsync,\n type PackageInfos,\n type ParsedLock,\n parseLockFile,\n} from \"workspace-tools\";\nimport { FileHasher } from \"./FileHasher.js\";\nimport { PackageTree } from \"./PackageTree.js\";\nimport { getInputFiles } from \"./getInputFiles.js\";\nimport { hashStrings } from \"./hashStrings.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 * It uses `glob-hasher` internally.\n */\nexport class TargetHasher {\n private targetHashesLog: Record<string, { fileHashes: Record<string, string>; globalFileHashes: Record<string, string> }> = {};\n private targetHashesDirectory: string;\n\n private logger: Logger | undefined;\n private fileHasher: FileHasher;\n public packageTree: PackageTree | undefined;\n\n private initializedPromise: Promise<unknown> | undefined;\n\n private packageInfos: PackageInfos = {};\n private globalInputsHash: Record<string, string> | undefined;\n private lockInfo: ParsedLock | undefined;\n private targetHashes: Record<string, string> = {};\n\n public dependencyMap: DependencyMap = {\n dependencies: new Map(),\n dependents: new Map(),\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 private ensureInitialized(): void {\n if (!this.initializedPromise) {\n throw new Error(\"TargetHasher is not initialized\");\n }\n }\n\n public async initialize(): Promise<void> {\n const { environmentGlob, root } = this.options;\n\n if (this.initializedPromise) {\n await this.initializedPromise;\n return;\n }\n\n this.initializedPromise = Promise.all([\n this.fileHasher\n .readManifest()\n .then(() => globAsync(environmentGlob, { cwd: root }))\n .then((files) => this.fileHasher.hash(files))\n .then((hash) => (this.globalInputsHash = hash)),\n\n getPackageInfosAsync(root).then((packageInfos) => {\n if (Object.keys(packageInfos).length) {\n this.packageInfos = packageInfos;\n } else {\n const rootInfo = getPackageInfo(root);\n if (rootInfo) {\n this.packageInfos = { [rootInfo.name]: rootInfo };\n }\n }\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 public async hash(target: Target): Promise<string> {\n this.ensureInitialized();\n\n const { root } = this.options;\n\n if (target.cwd === root && target.cache) {\n if (!target.inputs) {\n throw new Error(`No \"inputs\" specified for target \"${target.id}\"; cannot cache.`);\n }\n\n const files = await globAsync(target.inputs, { cwd: root });\n const fileFashes = hash(files, { cwd: root }) ?? {};\n\n const hashes = Object.values(fileFashes) as string[];\n\n return hashStrings(hashes);\n }\n\n // 1. add hash of target's inputs\n // 2. add hash of target packages' internal and external deps\n const { dependencies, devDependencies } = this.packageInfos[target.packageName!];\n\n const parsedLock = this.lockInfo!;\n\n const allDependencies: Record<string, string> = {\n ...dependencies,\n ...devDependencies,\n };\n\n const internalDeps = Object.keys(allDependencies).filter((dep) => this.packageInfos[dep]);\n const externalDeps = resolveExternalDependencies(allDependencies, this.packageInfos, 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 private writeTargetHashesManifest(): void {\n for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)) {\n const targetHashesManifestPath = path.join(this.targetHashesDirectory, `${id}.json`);\n if (!fs.existsSync(path.dirname(targetHashesManifestPath))) {\n fs.mkdirSync(path.dirname(targetHashesManifestPath), { recursive: true });\n }\n fs.writeFileSync(targetHashesManifestPath, JSON.stringify({ fileHashes, globalFileHashes }), \"utf-8\");\n }\n }\n\n private async getEnvironmentGlobHashes(root: string, target: Target): Promise<Record<string, string>> {\n const globalFileHashes = target.environmentGlob\n ? this.fileHasher.hash(await globAsync(target.environmentGlob ?? [], { cwd: root }))\n : (this.globalInputsHash ?? {});\n\n return globalFileHashes;\n }\n\n public async cleanup(): Promise<void> {\n this.writeTargetHashesManifest();\n this.fileHasher.writeManifest();\n }\n}\n"],"names":["TargetHasher","ensureInitialized","initializedPromise","Error","initialize","environmentGlob","root","options","Promise","all","fileHasher","readManifest","then","globAsync","cwd","files","hash","globalInputsHash","getPackageInfosAsync","packageInfos","Object","keys","length","rootInfo","getPackageInfo","name","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","parseLockFile","lockInfo","logger","undefined","hashStrings","values","verbose","target","cache","inputs","id","fileFashes","hashes","dependencies","devDependencies","packageName","parsedLock","allDependencies","internalDeps","filter","dep","externalDeps","resolveExternalDependencies","resolvedDependencies","sort","getInputFiles","fileHashes","targetDepHashes","map","targetDep","targetHashes","globalFileHashes","getEnvironmentGlobHashes","combinedHashes","JSON","stringify","cliArgs","cacheKey","Boolean","hashString","targetHashesLog","writeTargetHashesManifest","entries","targetHashesManifestPath","path","join","targetHashesDirectory","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","cleanup","writeManifest","Map","dependents","FileHasher"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/TargetHasher.ts"],"sourcesContent":["import { globAsync } from \"@lage-run/globby\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport { resolveExternalDependencies } from \"backfill-hasher\";\nimport fs from \"fs\";\nimport { hash } from \"glob-hasher\";\nimport path from \"path\";\nimport {\n createDependencyMap,\n type DependencyMap,\n getPackageInfo,\n getPackageInfosAsync,\n type PackageInfos,\n type ParsedLock,\n parseLockFile,\n} from \"workspace-tools\";\nimport { FileHasher } from \"./FileHasher.js\";\nimport { PackageTree } from \"./PackageTree.js\";\nimport { getInputFiles } from \"./getInputFiles.js\";\nimport { hashStrings } from \"./hashStrings.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 * It uses `glob-hasher` internally.\n */\nexport class TargetHasher {\n private targetHashesLog: Record<string, { fileHashes: Record<string, string>; globalFileHashes: Record<string, string> }> = {};\n private targetHashesDirectory: string;\n\n private logger: Logger | undefined;\n private fileHasher: FileHasher;\n public packageTree: PackageTree | undefined;\n\n private initializedPromise: Promise<unknown> | undefined;\n\n private packageInfos: PackageInfos = {};\n private globalInputsHash: Record<string, string> | undefined;\n private lockInfo: ParsedLock | undefined;\n private targetHashes: Record<string, string> = {};\n\n public dependencyMap: DependencyMap = {\n dependencies: new Map(),\n dependents: new Map(),\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 private ensureInitialized(): void {\n if (!this.initializedPromise) {\n throw new Error(\"TargetHasher is not initialized\");\n }\n }\n\n public async initialize(): Promise<void> {\n const { environmentGlob, root } = this.options;\n\n if (this.initializedPromise) {\n await this.initializedPromise;\n return;\n }\n\n this.initializedPromise = Promise.all([\n this.fileHasher\n .readManifest()\n .then(() => globAsync(environmentGlob, { cwd: root }))\n .then((files) => this.fileHasher.hash(files))\n .then((h) => (this.globalInputsHash = h)),\n\n getPackageInfosAsync(root).then((packageInfos) => {\n if (Object.keys(packageInfos).length) {\n this.packageInfos = packageInfos;\n } else {\n const rootInfo = getPackageInfo(root);\n if (rootInfo) {\n this.packageInfos = { [rootInfo.name]: rootInfo };\n }\n }\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 public async hash(target: Target): Promise<string> {\n this.ensureInitialized();\n\n const { root } = this.options;\n\n if (target.cwd === root && target.cache) {\n if (!target.inputs) {\n throw new Error(`No \"inputs\" specified for target \"${target.id}\"; cannot cache.`);\n }\n\n const files = await globAsync(target.inputs, { cwd: root });\n const fileFashes = hash(files, { cwd: root }) ?? {};\n\n const hashes = Object.values(fileFashes) as string[];\n\n return hashStrings(hashes);\n }\n\n // 1. add hash of target's inputs\n // 2. add hash of target packages' internal and external deps\n const { dependencies, devDependencies } = this.packageInfos[target.packageName!];\n\n const parsedLock = this.lockInfo!;\n\n const allDependencies: Record<string, string> = {\n ...dependencies,\n ...devDependencies,\n };\n\n const internalDeps = Object.keys(allDependencies).filter((dep) => this.packageInfos[dep]);\n const externalDeps = resolveExternalDependencies(allDependencies, this.packageInfos, 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 private writeTargetHashesManifest(): void {\n for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)) {\n const targetHashesManifestPath = path.join(this.targetHashesDirectory, `${id}.json`);\n if (!fs.existsSync(path.dirname(targetHashesManifestPath))) {\n fs.mkdirSync(path.dirname(targetHashesManifestPath), { recursive: true });\n }\n fs.writeFileSync(targetHashesManifestPath, JSON.stringify({ fileHashes, globalFileHashes }), \"utf-8\");\n }\n }\n\n private async getEnvironmentGlobHashes(root: string, target: Target): Promise<Record<string, string>> {\n const globalFileHashes = target.environmentGlob\n ? this.fileHasher.hash(await globAsync(target.environmentGlob ?? [], { cwd: root }))\n : (this.globalInputsHash ?? {});\n\n return globalFileHashes;\n }\n\n public async cleanup(): Promise<void> {\n this.writeTargetHashesManifest();\n this.fileHasher.writeManifest();\n }\n}\n"],"names":["TargetHasher","ensureInitialized","initializedPromise","Error","initialize","environmentGlob","root","options","Promise","all","fileHasher","readManifest","then","globAsync","cwd","files","hash","h","globalInputsHash","getPackageInfosAsync","packageInfos","Object","keys","length","rootInfo","getPackageInfo","name","dependencyMap","createDependencyMap","withDevDependencies","withPeerDependencies","packageTree","PackageTree","includeUntracked","parseLockFile","lockInfo","logger","undefined","hashStrings","values","verbose","target","cache","inputs","id","fileFashes","hashes","dependencies","devDependencies","packageName","parsedLock","allDependencies","internalDeps","filter","dep","externalDeps","resolveExternalDependencies","resolvedDependencies","sort","getInputFiles","fileHashes","targetDepHashes","map","targetDep","targetHashes","globalFileHashes","getEnvironmentGlobHashes","combinedHashes","JSON","stringify","cliArgs","cacheKey","Boolean","hashString","targetHashesLog","writeTargetHashesManifest","entries","targetHashesManifestPath","path","join","targetHashesDirectory","fs","existsSync","dirname","mkdirSync","recursive","writeFileSync","cleanup","writeManifest","Map","dependents","FileHasher"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/hasher",
3
- "version": "1.9.4",
3
+ "version": "1.9.5",
4
4
  "description": "Hasher for Lage Targets",
5
5
  "repository": {
6
6
  "url": "https://github.com/microsoft/lage"
@@ -18,8 +18,8 @@
18
18
  "dependencies": {
19
19
  "@lage-run/globby": "^13.0.1",
20
20
  "@lage-run/logger": "^1.3.3",
21
- "@lage-run/target-graph": "^0.13.0",
22
- "backfill-hasher": "^6.7.0",
21
+ "@lage-run/target-graph": "^0.14.0",
22
+ "backfill-hasher": "^6.7.1",
23
23
  "execa": "^5.1.1",
24
24
  "glob-hasher": "^1.4.2",
25
25
  "graceful-fs": "^4.2.11",