@lage-run/hasher 1.6.2 → 1.6.4
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 +37 -1
- package/CHANGELOG.md +19 -2
- package/lib/FileHasher.js +3 -3
- package/lib/FileHasher.js.map +1 -0
- package/lib/PackageTree.js +3 -2
- package/lib/PackageTree.js.map +1 -0
- package/lib/TargetHasher.js +6 -6
- package/lib/TargetHasher.js.map +1 -0
- package/lib/__tests__/TargetHasher.test.js.map +1 -0
- package/lib/__tests__/getPackageDeps.test.js +3 -1
- package/lib/__tests__/getPackageDeps.test.js.map +1 -0
- package/lib/__tests__/resolveDependenciesHelper.js +3 -3
- package/lib/__tests__/resolveDependenciesHelper.js.map +1 -0
- package/lib/__tests__/resolveExternalDependencies.test.js.map +1 -0
- package/lib/__tests__/resolveInternalDependencies.test.js.map +1 -0
- package/lib/expandInputPatterns.js.map +1 -0
- package/lib/getInputFiles.js.map +1 -0
- package/lib/getPackageDeps.js +14 -12
- package/lib/getPackageDeps.js.map +1 -0
- package/lib/hashStrings.js.map +1 -0
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -0
- package/lib/nameAtVersion.js.map +1 -0
- package/lib/resolveExternalDependencies.js +4 -4
- package/lib/resolveExternalDependencies.js.map +1 -0
- package/lib/resolveInternalDependencies.js.map +1 -0
- package/package.json +3 -3
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,43 @@
|
|
|
2
2
|
"name": "@lage-run/hasher",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Fri, 08 Nov 2024 19:44:39 GMT",
|
|
6
|
+
"version": "1.6.4",
|
|
7
|
+
"tag": "@lage-run/hasher_v1.6.4",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "beachball",
|
|
12
|
+
"package": "@lage-run/hasher",
|
|
13
|
+
"comment": "Bump @lage-run/target-graph to v0.10.0",
|
|
14
|
+
"commit": "not available"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Tue, 22 Oct 2024 15:19:29 GMT",
|
|
21
|
+
"version": "1.6.3",
|
|
22
|
+
"tag": "@lage-run/hasher_v1.6.3",
|
|
23
|
+
"comments": {
|
|
24
|
+
"patch": [
|
|
25
|
+
{
|
|
26
|
+
"author": "email not defined",
|
|
27
|
+
"package": "@lage-run/hasher",
|
|
28
|
+
"commit": "067b34dac0e6621e6dab889b4ecb3ffb96ed3b7c",
|
|
29
|
+
"comment": "Update dependency workspace-tools to v0.37.0"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"author": "beachball",
|
|
33
|
+
"package": "@lage-run/hasher",
|
|
34
|
+
"comment": "Bump @lage-run/target-graph to v0.9.3",
|
|
35
|
+
"commit": "not available"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"date": "Mon, 21 Oct 2024 22:18:54 GMT",
|
|
6
42
|
"version": "1.6.2",
|
|
7
43
|
"tag": "@lage-run/hasher_v1.6.2",
|
|
8
44
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
# Change Log - @lage-run/hasher
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Fri, 08 Nov 2024 19:44:39 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 1.6.4
|
|
8
|
+
|
|
9
|
+
Fri, 08 Nov 2024 19:44:39 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Bump @lage-run/target-graph to v0.10.0
|
|
14
|
+
|
|
15
|
+
## 1.6.3
|
|
16
|
+
|
|
17
|
+
Tue, 22 Oct 2024 15:19:29 GMT
|
|
18
|
+
|
|
19
|
+
### Patches
|
|
20
|
+
|
|
21
|
+
- Update dependency workspace-tools to v0.37.0 (email not defined)
|
|
22
|
+
- Bump @lage-run/target-graph to v0.9.3
|
|
23
|
+
|
|
7
24
|
## 1.6.2
|
|
8
25
|
|
|
9
|
-
Mon, 21 Oct 2024 22:18:
|
|
26
|
+
Mon, 21 Oct 2024 22:18:54 GMT
|
|
10
27
|
|
|
11
28
|
### Patches
|
|
12
29
|
|
package/lib/FileHasher.js
CHANGED
|
@@ -74,7 +74,7 @@ function _interop_require_default(obj) {
|
|
|
74
74
|
var _store = /*#__PURE__*/ new WeakMap(), _manifestFile = /*#__PURE__*/ new WeakMap();
|
|
75
75
|
class FileHasher {
|
|
76
76
|
async getHashesFromGit() {
|
|
77
|
-
const { root
|
|
77
|
+
const { root } = this.options;
|
|
78
78
|
const fileHashes = await (0, _getPackageDeps.getPackageDeps)(root);
|
|
79
79
|
const files = [
|
|
80
80
|
...fileHashes.keys()
|
|
@@ -85,7 +85,7 @@ class FileHasher {
|
|
|
85
85
|
for (const [relativePath, fileStat] of Object.entries(fileStats)){
|
|
86
86
|
const hash = fileHashes.get(relativePath);
|
|
87
87
|
if (hash) {
|
|
88
|
-
const { size
|
|
88
|
+
const { size, mtime } = fileStat;
|
|
89
89
|
_class_private_field_get(this, _store)[relativePath] = {
|
|
90
90
|
hash,
|
|
91
91
|
size,
|
|
@@ -174,7 +174,7 @@ class FileHasher {
|
|
|
174
174
|
});
|
|
175
175
|
this.options = options;
|
|
176
176
|
_class_private_field_set(this, _store, {});
|
|
177
|
-
const { root
|
|
177
|
+
const { root } = options;
|
|
178
178
|
const cacheDirectory = _path.default.join(root, "node_modules", ".cache", "lage");
|
|
179
179
|
_class_private_field_set(this, _manifestFile, _path.default.join(cacheDirectory, "file_hashes.manifest"));
|
|
180
180
|
}
|
|
@@ -0,0 +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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"}
|
package/lib/PackageTree.js
CHANGED
|
@@ -73,12 +73,13 @@ function _interop_require_default(obj) {
|
|
|
73
73
|
var _tree = /*#__PURE__*/ new WeakMap(), _packageFiles = /*#__PURE__*/ new WeakMap(), _memoizedPackageFiles = /*#__PURE__*/ new WeakMap();
|
|
74
74
|
class PackageTree {
|
|
75
75
|
reset() {
|
|
76
|
+
// reset the internal state
|
|
76
77
|
_class_private_field_set(this, _tree, {});
|
|
77
78
|
_class_private_field_set(this, _packageFiles, {});
|
|
78
79
|
_class_private_field_set(this, _memoizedPackageFiles, {});
|
|
79
80
|
}
|
|
80
81
|
async initialize() {
|
|
81
|
-
const { root
|
|
82
|
+
const { root, includeUntracked, packageInfos } = this.options;
|
|
82
83
|
this.reset();
|
|
83
84
|
// Generate path tree of all packages in workspace (scale: ~2000 * ~3)
|
|
84
85
|
for (const info of Object.values(packageInfos)){
|
|
@@ -137,7 +138,7 @@ class PackageTree {
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
getPackageFiles(packageName, patterns) {
|
|
140
|
-
const { root
|
|
141
|
+
const { root, packageInfos } = this.options;
|
|
141
142
|
const packagePath = _path.default.relative(root, _path.default.dirname(packageInfos[packageName].packageJsonPath)).replace(/\\/g, "/");
|
|
142
143
|
const packageFiles = _class_private_field_get(this, _packageFiles)[packagePath];
|
|
143
144
|
if (!packageFiles) {
|
|
@@ -0,0 +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 [key: string]: PathNode;\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 = {};\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 = {};\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 currentNode[part] = currentNode[part] || {};\n currentNode = currentNode[part];\n }\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\", \"--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 const packagePathParts: string[] = [];\n\n for (const part of pathParts) {\n if (node[part]) {\n node = node[part] as PathNode;\n packagePathParts.push(part);\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","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","packagePathParts","push","packageRoot","getPackageFiles","packageName","patterns","replace","key","packagePatterns","map","pattern","startsWith","slice","micromatch","dot","constructor"],"mappings":"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"}
|
package/lib/TargetHasher.js
CHANGED
|
@@ -40,7 +40,7 @@ function _interop_require_default(obj) {
|
|
|
40
40
|
}
|
|
41
41
|
class TargetHasher {
|
|
42
42
|
getPackageInfos(workspacePackages) {
|
|
43
|
-
const { root
|
|
43
|
+
const { root } = this.options;
|
|
44
44
|
const packageInfos = {};
|
|
45
45
|
if (workspacePackages.length) {
|
|
46
46
|
for (const pkg of workspacePackages){
|
|
@@ -68,7 +68,7 @@ class TargetHasher {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
async initialize() {
|
|
71
|
-
const { environmentGlob
|
|
71
|
+
const { environmentGlob, root } = this.options;
|
|
72
72
|
if (this.initializedPromise) {
|
|
73
73
|
await this.initializedPromise;
|
|
74
74
|
return;
|
|
@@ -101,7 +101,7 @@ class TargetHasher {
|
|
|
101
101
|
}
|
|
102
102
|
async hash(target) {
|
|
103
103
|
this.ensureInitialized();
|
|
104
|
-
const { root
|
|
104
|
+
const { root } = this.options;
|
|
105
105
|
if (target.cwd === root && target.cache) {
|
|
106
106
|
if (!target.inputs) {
|
|
107
107
|
throw new Error("Root-level targets must have `inputs` defined if it has cache enabled.");
|
|
@@ -117,7 +117,7 @@ class TargetHasher {
|
|
|
117
117
|
}
|
|
118
118
|
// 1. add hash of target's inputs
|
|
119
119
|
// 2. add hash of target packages' internal and external deps
|
|
120
|
-
const { dependencies
|
|
120
|
+
const { dependencies, devDependencies } = this.packageInfos[target.packageName];
|
|
121
121
|
const workspaceInfo = this.workspaceInfo;
|
|
122
122
|
const parsedLock = this.lockInfo;
|
|
123
123
|
const allDependencies = {
|
|
@@ -155,7 +155,7 @@ class TargetHasher {
|
|
|
155
155
|
return hashString;
|
|
156
156
|
}
|
|
157
157
|
writeTargetHashesManifest() {
|
|
158
|
-
for (const [id, { fileHashes
|
|
158
|
+
for (const [id, { fileHashes, globalFileHashes }] of Object.entries(this.targetHashesLog)){
|
|
159
159
|
const targetHashesManifestPath = _path.default.join(this.targetHashesDirectory, `${id}.json`);
|
|
160
160
|
if (!_fs.default.existsSync(_path.default.dirname(targetHashesManifestPath))) {
|
|
161
161
|
_fs.default.mkdirSync(_path.default.dirname(targetHashesManifestPath), {
|
|
@@ -200,7 +200,7 @@ class TargetHasher {
|
|
|
200
200
|
dependencies: new Map(),
|
|
201
201
|
dependents: new Map()
|
|
202
202
|
};
|
|
203
|
-
const { root
|
|
203
|
+
const { root, logger } = options;
|
|
204
204
|
this.logger = logger;
|
|
205
205
|
this.fileHasher = new _FileHasher.FileHasher({
|
|
206
206
|
root
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/__tests__/TargetHasher.test.ts"],"sourcesContent":["import path from \"path\";\n\nimport { TargetHasher } from \"../index\";\nimport fs from \"fs\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nimport { Target } from \"@lage-run/target-graph\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\ndescribe(\"The main Hasher class\", () => {\n async function setupFixture(fixture = \"monorepo\") {\n const monorepo = new Monorepo(\"fixture\");\n await monorepo.init(path.join(fixturesPath, fixture));\n return monorepo;\n }\n\n async function getHash(hasher: TargetHasher, target: Target) {\n await hasher.initialize();\n const hash = await hasher.hash(target);\n await hasher.cleanup();\n\n return hash;\n }\n\n function createTarget(root: string, packageName: string, task: string): Target {\n return {\n cwd: path.join(root, \"packages\", packageName),\n dependencies: [],\n dependents: [],\n depSpecs: [],\n id: `${packageName}#${task}`,\n label: `${packageName}#${task}`,\n packageName,\n task,\n };\n }\n\n it(\"creates different hashes given different global environment glob\", async () => {\n const monorepo1 = await setupFixture(\"monorepo-with-global-files\");\n\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [\"some-global.config.js\"] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n const hash = await getHash(hasher, target);\n\n const hasher2 = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target2 = createTarget(monorepo1.root, \"package-a\", \"build\");\n const hash2 = await getHash(hasher2, target2);\n\n expect(hash).not.toEqual(hash2);\n\n monorepo1.cleanup();\n });\n\n it(\"creates different hashes given different fixtures\", async () => {\n const monorepo1 = await setupFixture(\"monorepo\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n const hash = await getHash(hasher, target);\n\n const monorepo2 = await setupFixture(\"monorepo-different\");\n const target2 = createTarget(monorepo2.root, \"package-a\", \"build\");\n const hasher2 = new TargetHasher({ root: monorepo2.root, environmentGlob: [] });\n const hash2 = await getHash(hasher2, target2);\n expect(hash).not.toEqual(hash2);\n\n monorepo1.cleanup();\n monorepo2.cleanup();\n });\n\n it(\"creates the same hash given the same fixture, with different target hasher instances\", async () => {\n const monorepo1 = await setupFixture(\"monorepo\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n const hash = await getHash(hasher, target);\n\n const monorepo2 = await setupFixture(\"monorepo\");\n const hasher2 = new TargetHasher({ root: monorepo2.root, environmentGlob: [] });\n const target2 = createTarget(monorepo2.root, \"package-a\", \"build\");\n const hash2 = await getHash(hasher2, target2);\n\n expect(hash).toEqual(hash2);\n\n monorepo1.cleanup();\n monorepo2.cleanup();\n });\n\n it(\"creates different hashes when a src file has changed\", async () => {\n const monorepo1 = await setupFixture(\"monorepo\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n const hash = await getHash(hasher, target);\n\n const monorepo2 = await setupFixture(\"monorepo\");\n const hasher2 = new TargetHasher({ root: monorepo2.root, environmentGlob: [] });\n const target2 = createTarget(monorepo2.root, \"package-a\", \"build\");\n\n await monorepo2.commitFiles({ \"packages/package-a/src/index.ts\": \"console.log('hello world');\" });\n\n const hash2 = await getHash(hasher2, target2);\n\n expect(hash).not.toEqual(hash2);\n\n monorepo1.cleanup();\n monorepo2.cleanup();\n });\n\n it(\"creates different hashes when a src file has changed for a dependency\", async () => {\n const monorepo1 = await setupFixture(\"monorepo-with-deps\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n target.inputs = [\"**/*\", \"^**/*\"];\n\n const hash = await getHash(hasher, target);\n\n const monorepo2 = await setupFixture(\"monorepo-with-deps\");\n await monorepo2.commitFiles({ \"packages/package-b/src/index.ts\": \"console.log('hello world');\" });\n\n const hasher2 = new TargetHasher({ root: monorepo2.root, environmentGlob: [] });\n const target2 = createTarget(monorepo2.root, \"package-a\", \"build\");\n target2.inputs = [\"**/*\", \"^**/*\"];\n\n const hash2 = await getHash(hasher2, target2);\n\n expect(hash).not.toEqual(hash2);\n\n monorepo1.cleanup();\n monorepo2.cleanup();\n });\n\n it(\"creates different hashes when the target has a different env glob\", async () => {\n const monorepo1 = await setupFixture(\"monorepo-with-global-files\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"build\");\n target.environmentGlob = [\"some-global*\"];\n target.inputs = [\"**/*\", \"^**/*\"];\n\n const hash = await getHash(hasher, target);\n\n const target2 = createTarget(monorepo1.root, \"package-a\", \"build\");\n target2.environmentGlob = [\"some-global.*\"];\n target2.inputs = [\"**/*\", \"^**/*\"];\n\n const hash2 = await getHash(hasher, target2);\n\n expect(hash).not.toEqual(hash2);\n\n monorepo1.cleanup();\n });\n\n it(\"creates different hashes when the target has a different env glob for different task types\", async () => {\n const monorepo1 = await setupFixture(\"monorepo-with-global-files-different-tasks\");\n const hasher = new TargetHasher({ root: monorepo1.root, environmentGlob: [] });\n const target = createTarget(monorepo1.root, \"package-a\", \"test\");\n target.environmentGlob = [\"some-global*\"];\n target.inputs = [\"**/*\", \"^**/*\"];\n\n const hash = await getHash(hasher, target);\n\n const target2 = createTarget(monorepo1.root, \"package-a\", \"lint\");\n target2.environmentGlob = [\".eslintrc.js\"];\n target2.inputs = [\"**/*\", \"^**/*\"];\n\n const hash2 = await getHash(hasher, target2);\n const target3 = createTarget(monorepo1.root, \"package-a\", \"lint\");\n fs.writeFileSync(path.join(monorepo1.root, \".eslintrc.js\"), \"module.exports = {/*somethingdifferent*/};\");\n target3.environmentGlob = [\".eslintrc.js\"];\n target3.inputs = [\"**/*\", \"^**/*\"];\n\n const hash3 = await getHash(hasher, target3);\n\n expect(hash).not.toEqual(hash2);\n expect(hash2).not.toEqual(hash3);\n\n monorepo1.cleanup();\n });\n});\n"],"names":["fixturesPath","path","join","__dirname","describe","setupFixture","fixture","monorepo","Monorepo","init","getHash","hasher","target","initialize","hash","cleanup","createTarget","root","packageName","task","cwd","dependencies","dependents","depSpecs","id","label","it","monorepo1","TargetHasher","environmentGlob","hasher2","target2","hash2","expect","not","toEqual","monorepo2","commitFiles","inputs","target3","fs","writeFileSync","hash3"],"mappings":"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"}
|
|
@@ -27,7 +27,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
27
27
|
if (cache && cache.has(obj)) {
|
|
28
28
|
return cache.get(obj);
|
|
29
29
|
}
|
|
30
|
-
var newObj = {
|
|
30
|
+
var newObj = {
|
|
31
|
+
__proto__: null
|
|
32
|
+
};
|
|
31
33
|
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
32
34
|
for(var key in obj){
|
|
33
35
|
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/__tests__/getPackageDeps.test.ts"],"sourcesContent":["import * as path from \"path\";\nimport * as fs from \"fs\";\nimport { execSync } from \"child_process\";\n\nimport { getPackageDeps, parseGitLsTree, parseGitFilename } from \"../getPackageDeps\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\n\nconst SOURCE_PATH: string = path.join(__dirname, \"..\", \"__fixtures__\");\n\nconst TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"test-project\");\nconst NESTED_TEST_PROJECT_PATH: string = path.join(SOURCE_PATH, \"nested-test-project\");\n\nconst FileSystem = {\n writeFile: fs.writeFileSync,\n deleteFile: fs.rmSync,\n};\n\ndescribe(parseGitFilename.name, () => {\n it(\"can parse backslash-escaped filenames\", () => {\n expect(parseGitFilename(\"some/path/to/a/file name\")).toEqual(\"some/path/to/a/file name\");\n expect(parseGitFilename('\"some/path/to/a/file?name\"')).toEqual(\"some/path/to/a/file?name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\name\"')).toEqual(\"some/path/to/a/file\\\\name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\\"name\"')).toEqual('some/path/to/a/file\"name');\n expect(parseGitFilename('\"some/path/to/a/file\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file网网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\347\\\\\\\\\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\347\\\\网name\");\n expect(parseGitFilename('\"some/path/to/a/file\\\\\\\\\\\\347\\\\275\\\\221\\\\347\\\\275\\\\221name\"')).toEqual(\"some/path/to/a/file\\\\网网name\");\n });\n});\n\ndescribe(parseGitLsTree.name, () => {\n it(\"can handle a blob\", () => {\n const filename: string = \"src/typings/tsd.d.ts\";\n const hash: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const output: string = `100644 blob ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle a submodule\", () => {\n const filename: string = \"rushstack\";\n const hash: string = \"c5880bf5b0c6c1f2e2c43c95beeb8f0a808e8bac\";\n\n const output: string = `160000 commit ${hash}\\t${filename}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(1); // Expect there to be exactly 1 change\n expect(changes.get(filename)).toEqual(hash); // Expect the hash to be ${hash}\n });\n\n it(\"can handle multiple lines\", () => {\n const filename1: string = \"src/typings/tsd.d.ts\";\n const hash1: string = \"3451bccdc831cb43d7a70ed8e628dcf9c7f888c8\";\n\n const filename2: string = \"src/foo bar/tsd.d.ts\";\n const hash2: string = \"0123456789abcdef1234567890abcdef01234567\";\n\n const output: string = `100644 blob ${hash1}\\t${filename1}\\n100666 blob ${hash2}\\t${filename2}`;\n const changes: Map<string, string> = parseGitLsTree(output);\n\n expect(changes.size).toEqual(2); // Expect there to be exactly 2 changes\n expect(changes.get(filename1)).toEqual(hash1); // Expect the hash to be ${hash1}\n expect(changes.get(filename2)).toEqual(hash2); // Expect the hash to be ${hash2}\n });\n\n it(\"throws with malformed input\", () => {\n expect(parseGitLsTree.bind(undefined, \"some super malformed input\")).toThrow();\n });\n});\n\ndescribe(getPackageDeps.name, () => {\n it(\"can parse committed file\", async () => {\n const monorepo = new Monorepo(\"parse-commited-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n });\n\n it(\"can handle files in subfolders\", async () => {\n const monorepo = new Monorepo(\"files-in-subfolders\");\n await monorepo.init(NESTED_TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n const expectedFiles: { [key: string]: string } = {\n \"src/file 1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n\n await monorepo.cleanup();\n });\n\n it(\"can handle adding one file\", async () => {\n const monorepo = new Monorepo(\"add-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle adding two files\", async () => {\n const monorepo = new Monorepo(\"add-two-files\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath1: string = path.join(monorepo.root, \"a.txt\");\n const tempFilePath2: string = path.join(monorepo.root, \"b.txt\");\n\n FileSystem.writeFile(tempFilePath1, \"a\");\n FileSystem.writeFile(tempFilePath2, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"a.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"b.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n FileSystem.deleteFile(tempFilePath1);\n FileSystem.deleteFile(tempFilePath2);\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle removing one file\", async () => {\n const monorepo = new Monorepo(\"remove-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.deleteFile(testFilePath);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle changing one file\", async () => {\n const monorepo = new Monorepo(\"change-one-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const testFilePath: string = path.join(monorepo.root, \"file1.txt\");\n\n FileSystem.writeFile(testFilePath, \"abc\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can exclude a committed file\", async () => {\n const monorepo = new Monorepo(\"exclude-comitted-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"file1.txt\", \"file 2.txt\", \"file蝴蝶.txt\"]);\n\n const expectedFiles: { [key: string]: string } = {\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n await monorepo.cleanup();\n });\n\n it(\"can exclude an added file\", async () => {\n const monorepo = new Monorepo(\"exclude-added-file\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root, [\"a.txt\"]);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with spaces\", async () => {\n const monorepo = new Monorepo(\"filename-with-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with multiple spaces\", async () => {\n const monorepo = new Monorepo(\"filename-multiple-spaces\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"a file name.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"a file name.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n\n it(\"can handle a filename with non-standard characters\", async () => {\n const monorepo = new Monorepo(\"non-standard-characters\");\n await monorepo.init(TEST_PROJECT_PATH);\n\n const tempFilePath: string = path.join(monorepo.root, \"newFile批把.txt\");\n\n FileSystem.writeFile(tempFilePath, \"a\");\n\n const results: Map<string, string> = getPackageDeps(monorepo.root);\n try {\n const expectedFiles: { [key: string]: string } = {\n \"file1.txt\": \"c7b2f707ac99ca522f965210a7b6b0b109863f34\",\n \"file 2.txt\": \"a385f754ec4fede884a4864d090064d9aeef8ccb\",\n \"file蝴蝶.txt\": \"ae814af81e16cb2ae8c57503c77e2cab6b5462ba\",\n \"newFile批把.txt\": \"2e65efe2a145dda7ee51d1741299f848e5bf752e\",\n \"package.json\": \"18a1e415e56220fa5122428a4ef8eb8874756576\",\n };\n const filePaths: string[] = Array.from(results.keys()).sort();\n\n expect(filePaths).toHaveLength(Object.keys(expectedFiles).length);\n\n filePaths.forEach((filePath) => expect(results.get(filePath)).toEqual(expectedFiles[filePath]));\n } finally {\n await monorepo.cleanup();\n }\n });\n});\n"],"names":["SOURCE_PATH","path","join","__dirname","TEST_PROJECT_PATH","NESTED_TEST_PROJECT_PATH","FileSystem","writeFile","fs","writeFileSync","deleteFile","rmSync","describe","parseGitFilename","name","it","expect","toEqual","parseGitLsTree","filename","hash","output","changes","size","get","filename1","hash1","filename2","hash2","bind","undefined","toThrow","getPackageDeps","monorepo","Monorepo","init","results","root","expectedFiles","filePaths","Array","from","keys","sort","forEach","filePath","cleanup","tempFilePath","tempFilePath1","tempFilePath2","testFilePath","toHaveLength","Object","length"],"mappings":"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"}
|
|
@@ -9,14 +9,14 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
filterDependenciesInYarnFixture: function() {
|
|
13
|
-
return filterDependenciesInYarnFixture;
|
|
14
|
-
},
|
|
15
12
|
filterDependenciesInPnpmFixture: function() {
|
|
16
13
|
return filterDependenciesInPnpmFixture;
|
|
17
14
|
},
|
|
18
15
|
filterDependenciesInRushFixture: function() {
|
|
19
16
|
return filterDependenciesInRushFixture;
|
|
17
|
+
},
|
|
18
|
+
filterDependenciesInYarnFixture: function() {
|
|
19
|
+
return filterDependenciesInYarnFixture;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/__tests__/resolveExternalDependencies.test.ts"],"sourcesContent":["import { getPnpmWorkspaces, getRushWorkspaces, getYarnWorkspaces, parseLockFile } from \"workspace-tools\";\n\nimport { filterExternalDependencies, resolveExternalDependencies, addToQueue } from \"../resolveExternalDependencies\";\nimport { filterDependenciesInYarnFixture } from \"./resolveDependenciesHelper\";\nimport path from \"path\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\ndescribe(\"filterExternalDependencies()\", () => {\n it(\"only lists external dependencies\", async () => {\n const results = await filterDependenciesInYarnFixture(\"monorepo\", filterExternalDependencies);\n expect(results).toEqual({ foo: \"1.0.0\" });\n });\n\n it(\"identifies all dependencies as external packages if there are no workspaces\", async () => {\n const results = await filterDependenciesInYarnFixture(\"basic\", filterExternalDependencies);\n expect(results).toEqual({ foo: \"1.0.0\", \"package-a\": \"1.0.0\" });\n });\n});\n\ndescribe(\"addToQueue()\", () => {\n it(\"adds external dependencies to queue\", () => {\n const externalDependencies = { foo: \"1.0.0\" };\n const done: string[] = [];\n const queue: [string, string][] = [];\n\n addToQueue(externalDependencies, done, queue);\n\n const expectedQueue = [[\"foo\", \"1.0.0\"]];\n expect(queue).toEqual(expectedQueue);\n });\n\n it(\"doesn't add to the queue if the dependency has been visited\", () => {\n const externalDependencies = { foo: \"1.0.0\" };\n const done: string[] = [\"foo@1.0.0\"];\n const queue: [string, string][] = [];\n\n addToQueue(externalDependencies, done, queue);\n\n expect(queue).toEqual([]);\n });\n\n it(\"doesn't add to queue if the dependency is already in the queue\", () => {\n const externalDependencies = { foo: \"1.0.0\" };\n const done: string[] = [];\n const queue: [string, string][] = [[\"foo\", \"1.0.0\"]];\n\n addToQueue(externalDependencies, done, queue);\n\n const expectedQueue = [[\"foo\", \"1.0.0\"]];\n expect(queue).toEqual(expectedQueue);\n });\n});\n\ndescribe(\"resolveExternalDependencies() - yarn\", () => {\n it(\"given a list of external dependencies and a parsed Lock file, add all dependencies, transitively\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n\n const workspaces = getYarnWorkspaces(packageRoot);\n\n const allDependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n const parsedLockFile = await parseLockFile(packageRoot);\n\n const resolvedDependencies = resolveExternalDependencies(allDependencies, workspaces, parsedLockFile);\n\n expect(resolvedDependencies).toEqual([\"foo@1.0.0\", \"bar@^1.0.0\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"resolveExternalDependencies() - pnpm\", () => {\n it(\"given a list of external dependencies and a parsed Lock file, add all dependencies, transitively\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-pnpm\"));\n const packageRoot = monorepo.root;\n const workspaces = getPnpmWorkspaces(packageRoot);\n\n const allDependencies = {\n \"package-a\": \"1.0.0\",\n once: \"1.4.0\",\n };\n const parsedLockFile = await parseLockFile(packageRoot);\n\n const resolvedDependencies = resolveExternalDependencies(allDependencies, workspaces, parsedLockFile);\n\n expect(resolvedDependencies).toEqual([\"once@1.4.0\", \"wrappy@1.0.2\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"resolveExternalDependencies() - rush+pnpm\", () => {\n it(\"given a list of external dependencies and a parsed Lock file, add all dependencies, transitively\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-rush-pnpm\"));\n const packageRoot = monorepo.root;\n const workspaces = getRushWorkspaces(packageRoot);\n\n const allDependencies = {\n \"package-a\": \"1.0.0\",\n once: \"1.4.0\",\n };\n const parsedLockFile = await parseLockFile(packageRoot);\n\n const resolvedDependencies = resolveExternalDependencies(allDependencies, workspaces, parsedLockFile);\n\n expect(resolvedDependencies).toEqual([\"once@1.4.0\", \"wrappy@1.0.2\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"resolveExternalDependencies() - rush+yarn\", () => {\n it(\"given a list of external dependencies and a parsed Lock file, add all dependencies, transitively\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-rush-yarn\"));\n const packageRoot = monorepo.root;\n const workspaces = getRushWorkspaces(packageRoot);\n\n const allDependencies = {\n \"package-a\": \"1.0.0\",\n once: \"1.4.0\",\n };\n const parsedLockFile = await parseLockFile(packageRoot);\n\n const resolvedDependencies = resolveExternalDependencies(allDependencies, workspaces, parsedLockFile);\n\n expect(resolvedDependencies).toEqual([\"once@1.4.0\", \"wrappy@1.0.2\"]);\n await monorepo.cleanup();\n });\n});\n"],"names":["fixturesPath","path","join","__dirname","describe","it","results","filterDependenciesInYarnFixture","filterExternalDependencies","expect","toEqual","foo","externalDependencies","done","queue","addToQueue","expectedQueue","monorepo","Monorepo","init","packageRoot","root","workspaces","getYarnWorkspaces","allDependencies","parsedLockFile","parseLockFile","resolvedDependencies","resolveExternalDependencies","cleanup","getPnpmWorkspaces","once","getRushWorkspaces"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/__tests__/resolveInternalDependencies.test.ts"],"sourcesContent":["import { getPnpmWorkspaces, getRushWorkspaces, getYarnWorkspaces } from \"workspace-tools\";\n\nimport { filterInternalDependencies, resolveInternalDependencies } from \"../resolveInternalDependencies\";\nimport {\n filterDependenciesInYarnFixture,\n filterDependenciesInPnpmFixture,\n filterDependenciesInRushFixture,\n} from \"./resolveDependenciesHelper\";\nimport path from \"path\";\nimport { Monorepo } from \"@lage-run/monorepo-fixture\";\nconst fixturesPath = path.join(__dirname, \"..\", \"__fixtures__\");\n\ndescribe(\"filterInternalDependencies() for yarn\", () => {\n it(\"only lists internal dependencies\", async () => {\n const results = await filterDependenciesInYarnFixture(\"monorepo\", filterInternalDependencies);\n\n expect(results).toEqual([\"package-a\"]);\n });\n\n it(\"lists no internal packages if there are no workspaces\", async () => {\n const results = await filterDependenciesInYarnFixture(\"basic\", filterInternalDependencies);\n\n expect(results).toEqual([]);\n });\n});\n\ndescribe(\"resolveInternalDependencies() for yarn\", () => {\n it(\"adds internal dependency names to the processedPackages list\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo\"));\n const packageRoot = monorepo.root;\n const workspaces = getYarnWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const resolvedDependencies = resolveInternalDependencies(dependencies, workspaces);\n\n expect(resolvedDependencies).toEqual([\"package-a\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"filterInternalDependencies() for pnpm\", () => {\n it(\"only lists internal dependencies\", async () => {\n const results = await filterDependenciesInPnpmFixture(\"monorepo-pnpm\", filterInternalDependencies);\n\n expect(results).toEqual([\"package-a\"]);\n });\n\n it(\"lists no internal packages if there are no workspaces\", async () => {\n const results = await filterDependenciesInPnpmFixture(\"basic\", filterInternalDependencies);\n\n expect(results).toEqual([]);\n });\n});\n\ndescribe(\"resolveInternalDependencies() for pnpm\", () => {\n it(\"adds internal dependency names to the processedPackages list\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-pnpm\"));\n const packageRoot = monorepo.root;\n const workspaces = getPnpmWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const resolvedDependencies = resolveInternalDependencies(dependencies, workspaces);\n\n expect(resolvedDependencies).toEqual([\"package-a\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"filterInternalDependencies() for rush+pnpm\", () => {\n it(\"only lists internal dependencies\", async () => {\n const results = await filterDependenciesInRushFixture(\"monorepo-rush-pnpm\", filterInternalDependencies);\n\n expect(results).toEqual([\"package-a\"]);\n });\n\n it(\"lists no internal packages if there are no workspaces\", async () => {\n const results = await filterDependenciesInRushFixture(\"basic\", filterInternalDependencies);\n\n expect(results).toEqual([]);\n });\n});\n\ndescribe(\"resolveInternalDependencies() for rush+pnpm\", () => {\n it(\"adds internal dependency names to the processedPackages list\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-rush-pnpm\"));\n const packageRoot = monorepo.root;\n\n const workspaces = getRushWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const resolvedDependencies = resolveInternalDependencies(dependencies, workspaces);\n\n expect(resolvedDependencies).toEqual([\"package-a\"]);\n await monorepo.cleanup();\n });\n});\n\ndescribe(\"filterInternalDependencies() for rush+yarn\", () => {\n it(\"only lists internal dependencies\", async () => {\n const results = await filterDependenciesInRushFixture(\"monorepo-rush-yarn\", filterInternalDependencies);\n\n expect(results).toEqual([\"package-a\"]);\n });\n\n it(\"lists no internal packages if there are no workspaces\", async () => {\n const results = await filterDependenciesInRushFixture(\"basic\", filterInternalDependencies);\n\n expect(results).toEqual([]);\n });\n});\n\ndescribe(\"resolveInternalDependencies() for rush+yarn\", () => {\n it(\"adds internal dependency names to the processedPackages list\", async () => {\n const monorepo = new Monorepo(\"monorepo\");\n await monorepo.init(path.join(fixturesPath, \"monorepo-rush-yarn\"));\n const packageRoot = monorepo.root;\n const workspaces = getRushWorkspaces(packageRoot);\n\n const dependencies = { \"package-a\": \"1.0.0\", foo: \"1.0.0\" };\n\n const resolvedDependencies = resolveInternalDependencies(dependencies, workspaces);\n\n expect(resolvedDependencies).toEqual([\"package-a\"]);\n await monorepo.cleanup();\n });\n});\n"],"names":["fixturesPath","path","join","__dirname","describe","it","results","filterDependenciesInYarnFixture","filterInternalDependencies","expect","toEqual","monorepo","Monorepo","init","packageRoot","root","workspaces","getYarnWorkspaces","dependencies","foo","resolvedDependencies","resolveInternalDependencies","cleanup","filterDependenciesInPnpmFixture","getPnpmWorkspaces","filterDependenciesInRushFixture","getRushWorkspaces"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/expandInputPatterns.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\n\nexport function expandInputPatterns(patterns: string[], target: Target, dependencyMap: DependencyMap) {\n const expandedPatterns: Record<string, string[]> = {};\n\n for (const pattern of patterns) {\n if (pattern.startsWith(\"^\") || pattern.startsWith(\"!^\")) {\n const matchPattern = pattern.replace(\"^\", \"\");\n\n // get all the packages that are transitive deps and add them to the list\n const queue = [target.packageName];\n\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const pkg = queue.pop()!;\n if (visited.has(pkg)) {\n continue;\n }\n visited.add(pkg);\n\n if (pkg !== target.packageName) {\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(matchPattern);\n }\n\n if (dependencyMap.dependencies.has(pkg)) {\n const deps = dependencyMap.dependencies.get(pkg);\n if (deps) {\n for (const dep of deps) {\n queue.push(dep);\n }\n }\n }\n }\n } else {\n const pkg = target.packageName!;\n expandedPatterns[pkg] = expandedPatterns[pkg] ?? [];\n expandedPatterns[pkg].push(pattern);\n }\n }\n\n return expandedPatterns;\n}\n"],"names":["expandInputPatterns","patterns","target","dependencyMap","expandedPatterns","pattern","startsWith","matchPattern","replace","queue","packageName","visited","Set","length","pkg","pop","has","add","push","dependencies","deps","get","dep"],"mappings":";;;;+BAGgBA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,QAAkB,EAAEC,MAAc,EAAEC,aAA4B;IAClG,MAAMC,mBAA6C,CAAC;IAEpD,KAAK,MAAMC,WAAWJ,SAAU;QAC9B,IAAII,QAAQC,UAAU,CAAC,QAAQD,QAAQC,UAAU,CAAC,OAAO;YACvD,MAAMC,eAAeF,QAAQG,OAAO,CAAC,KAAK;YAE1C,yEAAyE;YACzE,MAAMC,QAAQ;gBAACP,OAAOQ,WAAW;aAAC;YAElC,MAAMC,UAAU,IAAIC;YAEpB,MAAOH,MAAMI,MAAM,GAAG,EAAG;gBACvB,MAAMC,MAAML,MAAMM,GAAG;gBACrB,IAAIJ,QAAQK,GAAG,CAACF,MAAM;oBACpB;gBACF;gBACAH,QAAQM,GAAG,CAACH;gBAEZ,IAAIA,QAAQZ,OAAOQ,WAAW,EAAE;oBAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;oBACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACX;gBAC7B;gBAEA,IAAIJ,cAAcgB,YAAY,CAACH,GAAG,CAACF,MAAM;oBACvC,MAAMM,OAAOjB,cAAcgB,YAAY,CAACE,GAAG,CAACP;oBAC5C,IAAIM,MAAM;wBACR,KAAK,MAAME,OAAOF,KAAM;4BACtBX,MAAMS,IAAI,CAACI;wBACb;oBACF;gBACF;YACF;QACF,OAAO;YACL,MAAMR,MAAMZ,OAAOQ,WAAW;YAC9BN,gBAAgB,CAACU,IAAI,GAAGV,gBAAgB,CAACU,IAAI,IAAI,EAAE;YACnDV,gBAAgB,CAACU,IAAI,CAACI,IAAI,CAACb;QAC7B;IACF;IAEA,OAAOD;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/getInputFiles.ts"],"sourcesContent":["import { type Target } from \"@lage-run/target-graph\";\nimport { type DependencyMap } from \"workspace-tools\";\nimport { type PackageTree } from \"./PackageTree.js\";\nimport { expandInputPatterns } from \"./expandInputPatterns.js\";\n\nexport function getInputFiles(target: Target, dependencyMap: DependencyMap, packageTree: PackageTree) {\n const inputs = target.inputs ?? [\"**/*\"];\n\n const packagePatterns = expandInputPatterns(inputs, target, dependencyMap);\n const files: string[] = [];\n for (const [pkg, patterns] of Object.entries(packagePatterns)) {\n const packageFiles = packageTree.getPackageFiles(pkg, patterns);\n files.push(...packageFiles);\n }\n return files;\n}\n"],"names":["getInputFiles","target","dependencyMap","packageTree","inputs","packagePatterns","expandInputPatterns","files","pkg","patterns","Object","entries","packageFiles","getPackageFiles","push"],"mappings":";;;;+BAKgBA;;;eAAAA;;;qCAFoB;AAE7B,SAASA,cAAcC,MAAc,EAAEC,aAA4B,EAAEC,WAAwB;IAClG,MAAMC,SAASH,OAAOG,MAAM,IAAI;QAAC;KAAO;IAExC,MAAMC,kBAAkBC,IAAAA,wCAAmB,EAACF,QAAQH,QAAQC;IAC5D,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAM,CAACC,KAAKC,SAAS,IAAIC,OAAOC,OAAO,CAACN,iBAAkB;QAC7D,MAAMO,eAAeT,YAAYU,eAAe,CAACL,KAAKC;QACtDF,MAAMO,IAAI,IAAIF;IAChB;IACA,OAAOL;AACT"}
|
package/lib/getPackageDeps.js
CHANGED
|
@@ -9,26 +9,26 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
parseGitFilename: function() {
|
|
13
|
-
return parseGitFilename;
|
|
14
|
-
},
|
|
15
|
-
parseGitLsTree: function() {
|
|
16
|
-
return parseGitLsTree;
|
|
17
|
-
},
|
|
18
|
-
parseGitStatus: function() {
|
|
19
|
-
return parseGitStatus;
|
|
20
|
-
},
|
|
21
12
|
getGitHashForFiles: function() {
|
|
22
13
|
return getGitHashForFiles;
|
|
23
14
|
},
|
|
15
|
+
getPackageDeps: function() {
|
|
16
|
+
return getPackageDeps;
|
|
17
|
+
},
|
|
24
18
|
gitLsTree: function() {
|
|
25
19
|
return gitLsTree;
|
|
26
20
|
},
|
|
27
21
|
gitStatus: function() {
|
|
28
22
|
return gitStatus;
|
|
29
23
|
},
|
|
30
|
-
|
|
31
|
-
return
|
|
24
|
+
parseGitFilename: function() {
|
|
25
|
+
return parseGitFilename;
|
|
26
|
+
},
|
|
27
|
+
parseGitLsTree: function() {
|
|
28
|
+
return parseGitLsTree;
|
|
29
|
+
},
|
|
30
|
+
parseGitStatus: function() {
|
|
31
|
+
return parseGitStatus;
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
|
|
@@ -59,7 +59,9 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
59
59
|
if (cache && cache.has(obj)) {
|
|
60
60
|
return cache.get(obj);
|
|
61
61
|
}
|
|
62
|
-
var newObj = {
|
|
62
|
+
var newObj = {
|
|
63
|
+
__proto__: null
|
|
64
|
+
};
|
|
63
65
|
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
64
66
|
for(var key in obj){
|
|
65
67
|
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
@@ -0,0 +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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hashStrings.ts"],"sourcesContent":["import crypto from \"crypto\";\n\nexport function hashStrings(strings: string | string[]): string {\n const hasher = crypto.createHash(\"sha1\");\n const anArray = typeof strings === \"string\" ? [strings] : strings;\n const elements = [...anArray];\n elements.sort((a, b) => a.localeCompare(b));\n elements.forEach((element) => hasher.update(element));\n\n return hasher.digest(\"hex\");\n}\n"],"names":["hashStrings","strings","hasher","crypto","createHash","anArray","elements","sort","a","b","localeCompare","forEach","element","update","digest"],"mappings":";;;;+BAEgBA;;;eAAAA;;;+DAFG;;;;;;AAEZ,SAASA,YAAYC,OAA0B;IACpD,MAAMC,SAASC,eAAM,CAACC,UAAU,CAAC;IACjC,MAAMC,UAAU,OAAOJ,YAAY,WAAW;QAACA;KAAQ,GAAGA;IAC1D,MAAMK,WAAW;WAAID;KAAQ;IAC7BC,SAASC,IAAI,CAAC,CAACC,GAAGC,IAAMD,EAAEE,aAAa,CAACD;IACxCH,SAASK,OAAO,CAAC,CAACC,UAAYV,OAAOW,MAAM,CAACD;IAE5C,OAAOV,OAAOY,MAAM,CAAC;AACvB"}
|
package/lib/index.js
CHANGED
|
@@ -9,12 +9,12 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
TargetHasher: function() {
|
|
13
|
-
return _TargetHasher.TargetHasher;
|
|
14
|
-
},
|
|
15
12
|
PackageTree: function() {
|
|
16
13
|
return _PackageTree.PackageTree;
|
|
17
14
|
},
|
|
15
|
+
TargetHasher: function() {
|
|
16
|
+
return _TargetHasher.TargetHasher;
|
|
17
|
+
},
|
|
18
18
|
getInputFiles: function() {
|
|
19
19
|
return _getInputFiles.getInputFiles;
|
|
20
20
|
}
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { TargetHasher } from \"./TargetHasher.js\";\nexport { PackageTree } from \"./PackageTree.js\";\nexport { getInputFiles } from \"./getInputFiles.js\";\n"],"names":["PackageTree","TargetHasher","getInputFiles"],"mappings":";;;;;;;;;;;IACSA,WAAW;eAAXA,wBAAW;;IADXC,YAAY;eAAZA,0BAAY;;IAEZC,aAAa;eAAbA,4BAAa;;;8BAFO;6BACD;+BACE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nameAtVersion.ts"],"sourcesContent":["export function nameAtVersion(name: string, version: string): string {\n return `${name}@${version}`;\n}\n"],"names":["nameAtVersion","name","version"],"mappings":";;;;+BAAgBA;;;eAAAA;;;AAAT,SAASA,cAAcC,IAAY,EAAEC,OAAe;IACzD,OAAO,GAAGD,KAAK,CAAC,EAAEC,SAAS;AAC7B"}
|
|
@@ -9,12 +9,12 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
filterExternalDependencies: function() {
|
|
13
|
-
return filterExternalDependencies;
|
|
14
|
-
},
|
|
15
12
|
addToQueue: function() {
|
|
16
13
|
return addToQueue;
|
|
17
14
|
},
|
|
15
|
+
filterExternalDependencies: function() {
|
|
16
|
+
return filterExternalDependencies;
|
|
17
|
+
},
|
|
18
18
|
resolveExternalDependencies: function() {
|
|
19
19
|
return resolveExternalDependencies;
|
|
20
20
|
}
|
|
@@ -64,7 +64,7 @@ function resolveExternalDependencies(allDependencies, workspaces, lockInfo) {
|
|
|
64
64
|
doneRange.push((0, _nameAtVersion.nameAtVersion)(name, versionRange));
|
|
65
65
|
const lockFileResult = (0, _workspacetools.queryLockFile)(name, versionRange, lockInfo);
|
|
66
66
|
if (lockFileResult) {
|
|
67
|
-
const { version
|
|
67
|
+
const { version, dependencies } = lockFileResult;
|
|
68
68
|
addToQueue(dependencies, doneRange, queue);
|
|
69
69
|
done.push((0, _nameAtVersion.nameAtVersion)(name, version));
|
|
70
70
|
} else {
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/hasher",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.4",
|
|
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.0",
|
|
19
19
|
"@lage-run/logger": "^1.3.1",
|
|
20
|
-
"@lage-run/target-graph": "^0.
|
|
20
|
+
"@lage-run/target-graph": "^0.10.0",
|
|
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.
|
|
25
|
+
"workspace-tools": "0.37.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@lage-run/monorepo-fixture": "*",
|