@monorepolint/utils 0.6.0-alpha.5 → 0.6.0-alpha.6

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,4 +1,4 @@
1
1
 
2
- > @monorepolint/utils@0.6.0-alpha.5 clean /home/runner/work/monorepolint/monorepolint/packages/utils
2
+ > @monorepolint/utils@0.6.0-alpha.6 clean /home/runner/work/monorepolint/monorepolint/packages/utils
3
3
  > rm -rf build dist lib node_modules *.tgz tsconfig.tsbuildinfo
4
4
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @monorepolint/utils@0.6.0-alpha.5 compile-typescript /home/runner/work/monorepolint/monorepolint/packages/utils
2
+ > @monorepolint/utils@0.6.0-alpha.6 compile-typescript /home/runner/work/monorepolint/monorepolint/packages/utils
3
3
  > tsc --build
4
4
 
@@ -1,5 +1,5 @@
1
1
 
2
- > @monorepolint/utils@0.6.0-alpha.5 lint /home/runner/work/monorepolint/monorepolint/packages/utils
2
+ > @monorepolint/utils@0.6.0-alpha.6 lint /home/runner/work/monorepolint/monorepolint/packages/utils
3
3
  > eslint .
4
4
 
5
5
 
@@ -1,25 +1,25 @@
1
1
 
2
- > @monorepolint/utils@0.6.0-alpha.5 test /home/runner/work/monorepolint/monorepolint/packages/utils
2
+ > @monorepolint/utils@0.6.0-alpha.6 test /home/runner/work/monorepolint/monorepolint/packages/utils
3
3
  > vitest run --passWithNoTests
4
4
 
5
5
 
6
-  RUN  v3.1.1 /home/runner/work/monorepolint/monorepolint/packages/utils
6
+  RUN  v3.2.4 /home/runner/work/monorepolint/monorepolint/packages/utils
7
7
  Coverage enabled with v8
8
8
 
9
- ✓ src/__tests__/CachingHost.spec.ts (11 tests) 28ms
9
+ ✓ src/__tests__/CachingHost.spec.ts (11 tests) 43ms
10
10
 
11
11
   Test Files  1 passed (1)
12
12
   Tests  11 passed (11)
13
-  Start at  20:07:43
14
-  Duration  1.53s (transform 213ms, setup 0ms, collect 228ms, tests 28ms, environment 0ms, prepare 168ms)
13
+  Start at  18:00:38
14
+  Duration  1.49s (transform 155ms, setup 0ms, collect 158ms, tests 43ms, environment 0ms, prepare 192ms)
15
15
 
16
16
   % Coverage report from v8
17
17
  -------------------|---------|----------|---------|---------|-------------------
18
18
  File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
19
19
  -------------------|---------|----------|---------|---------|-------------------
20
- All files | 37.5 | 66.07 | 62.16 | 37.5 |
21
- ...egateTiming.ts | 100 | 100 | 100 | 100 |
22
- CachingHost.ts | 83.42 | 74 | 92 | 83.42 | ...37-540,548-549
20
+ All files | 31.2 | 65.48 | 60.52 | 31.2 |
21
+ ...egateTiming.ts | 0 | 0 | 0 | 0 | 1-70
22
+ CachingHost.ts | 81.91 | 74 | 92 | 81.91 | ...45-548,556-557
23
23
  Host.ts | 0 | 0 | 0 | 0 | 1
24
24
  PackageJson.ts | 0 | 0 | 0 | 0 | 1
25
25
  SimpleHost.ts | 0 | 0 | 0 | 0 | 1-67
@@ -1,14 +1,14 @@
1
1
 
2
- > @monorepolint/utils@0.6.0-alpha.5 transpile-typescript /home/runner/work/monorepolint/monorepolint/packages/utils
2
+ > @monorepolint/utils@0.6.0-alpha.6 transpile-typescript /home/runner/work/monorepolint/monorepolint/packages/utils
3
3
  > tsup --config ../../tsup.config.cjs
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: tsconfig.json
7
- CLI tsup v8.4.0
7
+ CLI tsup v8.5.0
8
8
  CLI Using tsup config: /home/runner/work/monorepolint/monorepolint/tsup.config.cjs
9
9
  CLI Target: node16
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM build/js/index.js 26.89 KB
13
- ESM build/js/index.js.map 61.23 KB
14
- ESM ⚡️ Build success in 63ms
12
+ ESM build/js/index.js 27.08 KB
13
+ ESM build/js/index.js.map 61.65 KB
14
+ ESM ⚡️ Build success in 73ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @monorepolint/utils
2
2
 
3
+ ## 0.6.0-alpha.6
4
+
5
+ ### Minor Changes
6
+
7
+ - c1914bd: Dropping support for anything less than node 20
8
+
3
9
  ## 0.6.0-alpha.5
4
10
 
5
11
  ### Patch Changes
package/build/js/index.js CHANGED
@@ -282,8 +282,8 @@ var AggregateTiming = class {
282
282
  };
283
283
 
284
284
  // src/CachingHost.ts
285
- import * as realFs from "node:fs";
286
- import * as path from "node:path";
285
+ import * as realFs from "fs";
286
+ import * as path from "path";
287
287
  function assertNoTombstone(node) {
288
288
  if (node.tombstone) {
289
289
  throw new Error(`Unexpected tombstone ${JSON.stringify(node)}`);
@@ -499,7 +499,14 @@ var CachingHost = class {
499
499
  readFile(filePath, opts) {
500
500
  let node = this.#getNodeResolvingSymlinks(filePath);
501
501
  if (!node) {
502
- return void 0;
502
+ const error = new Error(
503
+ `ENOENT: no such file or directory, open '${filePath}'`
504
+ );
505
+ error.errno = -2;
506
+ error.code = "ENOENT";
507
+ error.syscall = "open";
508
+ error.path = filePath;
509
+ throw error;
503
510
  }
504
511
  assertNotType(node, "dir");
505
512
  assertNoTombstone(node);
@@ -667,8 +674,8 @@ import { join as pathJoin } from "path";
667
674
  import { findPackages } from "find-packages";
668
675
  import { existsSync } from "fs";
669
676
  import * as glob from "glob";
670
- import * as fs2 from "node:fs";
671
- import * as path3 from "node:path";
677
+ import * as fs2 from "fs";
678
+ import * as path3 from "path";
672
679
  import readYamlFile from "read-yaml-file";
673
680
  async function findPNPMWorkspacePackages(workspaceRoot) {
674
681
  workspaceRoot = fs2.realpathSync(workspaceRoot);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nanosecondsToSanity.ts","../../src/Table.ts","../../src/AggregateTiming.ts","../../src/CachingHost.ts","../../src/findWorkspaceDir.ts","../../src/getPackageNameToDir.ts","../../src/getWorkspacePackageDirs.ts","../../src/matchesAnyGlob.ts","../../src/mutateJson.ts","../../src/SimpleHost.ts","../../src/Timing.ts"],"sourcesContent":["/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nexport function nanosecondsToSanity(n: bigint, precision: number = 9) {\n return n / BigInt(1000000000) + \".\"\n + (\"\" + (n % BigInt(1000000000))).padStart(9, \"0\").substring(0, precision)\n + \"s\";\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\nimport { nanosecondsToSanity } from \"./nanosecondsToSanity.js\";\ntype HeaderFooterHelper<HB, FB, H, F> =\n & (HB extends true ? { header: H } : { header?: H })\n & (FB extends true ? { footer: F } : { footer?: F });\n\ntype WithAlignemnt = { alignment?: \"right\" | \"left\" };\ntype BaseCellConfig = WithAlignemnt & { type: \"bigint\" | \"string\" };\n\ntype BaseBigIntCellConfig = {\n type: \"bigint\";\n renderAs?: \"nanoseconds\";\n precision?: number;\n} & WithAlignemnt;\ntype BaseStringCellConfig = { type: \"string\" } & WithAlignemnt;\n\ntype BigIntColumnConfig<H, F> =\n & WithAlignemnt\n & BaseBigIntCellConfig\n & HeaderFooterHelper<\n H,\n F,\n string,\n AggregateFooterConfig | StaticFooterConfig\n >;\n\ntype StringColumnConfig<H, F> =\n & WithAlignemnt\n & BaseStringCellConfig\n & HeaderFooterHelper<H, F, string, StaticFooterConfig>;\n\ntype AggregateFooterConfig = {\n aggregate: \"sum\" | \"average\";\n renderAs?: \"nanoseconds\";\n precision?: number;\n} & WithAlignemnt;\n\ntype StaticFooterConfig = StrictStaticFooterConfig | string;\ntype StrictStaticFooterConfig = {\n aggregate: \"static\";\n value: string;\n} & WithAlignemnt;\n\ntype AnyStrictFooterConfig = AggregateFooterConfig | StrictStaticFooterConfig;\n\ntype TableConfig<T extends any[], H extends boolean, F extends boolean> = {\n sortColumn?: number;\n padding?: number;\n showHeader: H;\n showFooter: F;\n columns: {\n [K in keyof T]: T[K] extends bigint ? BigIntColumnConfig<H, F>\n : StringColumnConfig<H, F>;\n };\n title: string;\n};\n\ntype InternalTableConfig = {\n padding: number;\n showHeader: boolean;\n showFooter: boolean;\n sortColumn?: number;\n columns: Array<BigIntColumnConfig<any, any> | StringColumnConfig<any, any>>;\n title: string;\n};\n\nexport class Table<T extends any[]> {\n #rows: T[] = [];\n #config: InternalTableConfig;\n #columnWidths: number[] = [];\n #footer: Array<bigint | string> = [];\n #footerRowConfig?: Array<Required<BaseCellConfig> & AnyStrictFooterConfig>;\n #totalWidth = 0;\n\n constructor(\n config:\n | TableConfig<T, true, true>\n | TableConfig<T, true, false>\n | TableConfig<T, false, true>\n | TableConfig<T, false, false>,\n ) {\n this.#config = {\n padding: 2,\n ...config,\n };\n this.#columnWidths.fill(0, 0, config.columns.length);\n\n if (config.showFooter) {\n this.#footerRowConfig = [];\n for (const columnConfig of config.columns) {\n if (columnConfig.footer === undefined) {\n throw new Error(\"Must specify footer fields when showFooter is true\");\n } else if (typeof columnConfig.footer === \"string\") {\n this.#footerRowConfig.push({\n type: \"string\",\n alignment: \"left\",\n aggregate: \"static\",\n value: columnConfig.footer,\n });\n } else if (\"value\" in columnConfig.footer) {\n this.#footerRowConfig.push({\n type: \"string\",\n alignment: \"left\",\n ...columnConfig.footer,\n });\n } else if (\"aggregate\" in columnConfig.footer) {\n if (columnConfig.type !== \"bigint\") {\n throw new Error(\"expecting bigint for aggregate\");\n }\n this.#footerRowConfig.push({\n type: columnConfig.type,\n renderAs: columnConfig.renderAs,\n precision: columnConfig.precision,\n alignment: \"right\",\n ...columnConfig.footer,\n });\n }\n }\n }\n }\n\n addRow(...data: T) {\n // TODO: maybe clone the data\n this.#rows.push(data);\n }\n\n #sumColumn(c: number) {\n let total = BigInt(0);\n for (const row of this.#rows) {\n total += row[c];\n }\n return total;\n }\n\n #updateFooterRow() {\n const footerRowConfig = this.#footerRowConfig;\n if (footerRowConfig) {\n for (let c = 0; c < footerRowConfig.length; c++) {\n const footerColConfig = footerRowConfig[c];\n\n switch (footerColConfig.aggregate) {\n case \"sum\":\n this.#footer[c] = this.#sumColumn(c);\n break;\n case \"average\":\n this.#footer[c] = this.#sumColumn(c) / BigInt(this.#rows.length);\n break;\n case \"static\":\n this.#footer[c] = footerColConfig.value;\n break;\n }\n }\n }\n }\n\n #calculateColumnWidths() {\n this.#columnWidths.fill(0, 0, this.#config.columns.length);\n\n for (let c = 0; c < this.#config.columns.length; c++) {\n const colConfig = this.#config.columns[c];\n this.#columnWidths[c] = Math.max(\n (this.#config.columns[c].header ?? \"\").length,\n ...this.#rows.map((a) => this.#getCellValueAsString(a[c], colConfig).length),\n this.#footer && this.#footerRowConfig\n ? this.#getCellValueAsString(\n this.#footer?.[c] ?? \"\",\n this.#footerRowConfig[c],\n ).length\n : 0,\n );\n }\n\n this.#totalWidth = 0;\n for (const colWidth of this.#columnWidths) {\n this.#totalWidth += colWidth;\n }\n this.#totalWidth += (this.#columnWidths.length - 1) * this.#config.padding;\n }\n\n #printSeparator(fillString: string) {\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr2 = \"\";\n\n // tslint:disable-next-line: prefer-for-of\n for (let c = 0; c < this.#columnWidths.length; c++) {\n hr2 += \"\".padStart(this.#columnWidths[c], fillString) + paddingString;\n }\n hr2 = hr2.trimRight();\n console.log(hr2);\n }\n\n #printHeaderRow() {\n if (this.#config.showHeader) {\n const colConfigs = this.#config.columns;\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr = \"\";\n for (let c = 0; c < colConfigs.length; c++) {\n const heading = colConfigs[c].header ?? \"\";\n hr += heading.padEnd(this.#columnWidths[c], \" \") + paddingString;\n }\n hr = hr.trimRight();\n console.log(hr);\n\n this.#printSeparator(\"-\");\n }\n }\n\n #printFooterRow() {\n const footerRow = this.#footer;\n if (footerRow) {\n this.#printSeparator(\"=\");\n\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr = \"\";\n for (let c = 0; c < footerRow.length; c++) {\n hr += this.#getCellValueAligned(footerRow[c], this.#footerRowConfig![c], c)\n + paddingString; // .padEnd(this.#columnWidths[c], \" \") + paddingString;\n }\n hr = hr.trimRight();\n console.log(hr);\n }\n }\n\n print() {\n // let data = [...this.#rows];\n if (this.#config.sortColumn !== undefined) {\n // todo\n }\n\n this.#updateFooterRow();\n this.#calculateColumnWidths();\n\n console.log();\n console.log(`${this.#config.title}`);\n console.log(\"\".padStart(this.#totalWidth, \"=\"));\n\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n if (this.#config.showHeader) {\n this.#printHeaderRow();\n }\n\n for (let r = 0; r < this.#rows.length; r++) {\n let rowText = \"\";\n for (let c = 0; c < this.#config.columns.length; c++) {\n rowText += this.getEntryAsStringAligned(c, r) + paddingString;\n }\n rowText.trim();\n console.log(rowText);\n }\n\n if (this.#config.showFooter) this.#printFooterRow();\n console.log();\n }\n\n #getCellValueAsString(\n value: bigint | string,\n config: BaseBigIntCellConfig | BaseStringCellConfig,\n ) {\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n return nanosecondsToSanity(value as bigint, config.precision ?? 9);\n } else {\n return \"\" + value;\n }\n }\n\n #getCellValueAligned(\n value: bigint | string,\n config: BaseBigIntCellConfig | BaseStringCellConfig,\n column: number,\n ) {\n let result: string;\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n result = nanosecondsToSanity(value as bigint, config.precision ?? 9);\n } else {\n result = \"\" + value;\n }\n\n if (config.alignment === \"left\") {\n return result.padEnd(this.#columnWidths[column]);\n } else {\n return result.padStart(this.#columnWidths[column]);\n }\n }\n\n getEntryAsString(colNum: number, rowNum: number) {\n const config = this.#config.columns[colNum];\n\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n return nanosecondsToSanity(\n this.#rows[rowNum][colNum],\n config.precision ?? 9,\n );\n } else {\n return \"\" + this.#rows[rowNum][colNum];\n }\n }\n\n getEntryAsStringAligned(colNum: number, rowNum: number) {\n const config = this.#config.columns[colNum];\n\n let result: string;\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n result = nanosecondsToSanity(\n this.#rows[rowNum][colNum],\n config.precision ?? 9,\n );\n } else {\n result = \"\" + this.#rows[rowNum][colNum];\n }\n\n if (config.alignment === \"left\") {\n return result.padEnd(this.#columnWidths[colNum]);\n } else {\n return result.padStart(this.#columnWidths[colNum]);\n }\n }\n\n getColumnWidth(\n colNum: number,\n config:\n | BigIntColumnConfig<boolean, boolean>\n | StringColumnConfig<boolean, boolean>,\n ) {\n let maxWidth = Math.max(\n (config.header ?? \"\").length,\n this.#footer && this.#footerRowConfig\n ? this.#getCellValueAsString(\n this.#footer[colNum],\n this.#footerRowConfig[colNum],\n ).length\n : 0,\n );\n\n for (let r = 0; r < this.#rows.length; r++) {\n maxWidth = Math.max(maxWidth, this.getEntryAsString(colNum, r).length);\n // if (config.type == \"bigint\" && config.renderAs === \"nanoseconds\") {\n // maxWidth = Math.max(maxWidth, Number(row[colNum] / BigInt(1000000000)) + 10); // 1 for period, 9 for digits\n // } else if (config.type == \"bigint\" || config.type == \"string\") {\n // maxWidth = Math.max(maxWidth, (\"\" + row[colNum]).length);\n // }\n }\n\n return maxWidth;\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\n\nimport { Table } from \"./Table.js\";\nexport class AggregateTiming {\n #data = new Map<string, { count: number; total: bigint }>();\n #last: { count: number; total: bigint } | undefined;\n\n constructor(private title: string) {}\n\n public start(name: string) {\n const time = process.hrtime.bigint();\n if (this.#last) {\n this.#last.total += time;\n }\n\n let data = this.#data.get(name);\n if (data === undefined) {\n data = { count: 1, total: -time };\n this.#data.set(name, data);\n } else {\n data.total -= time;\n data.count++;\n }\n this.#last = data;\n }\n\n public stop() {\n const time = process.hrtime.bigint();\n if (this.#last) {\n this.#last.total += time;\n this.#last = undefined;\n }\n }\n\n public printResults() {\n const table = new Table<[bigint, string, bigint, bigint]>({\n sortColumn: -1,\n showFooter: true,\n showHeader: true,\n title: this.title,\n columns: [\n {\n header: \"Duration\",\n type: \"bigint\",\n renderAs: \"nanoseconds\",\n footer: { aggregate: \"sum\" },\n },\n { header: \"Task\", type: \"string\", alignment: \"left\", footer: \"TOTAL\" },\n { header: \"Count\", type: \"bigint\", footer: { aggregate: \"sum\" } },\n { header: \"Avg\", type: \"bigint\", footer: { aggregate: \"average\" } },\n ],\n });\n\n for (const [name, value] of this.#data) {\n table.addRow(\n value.total,\n name,\n BigInt(value.count), // fixme this can be a number later\n value.total / BigInt(value.count),\n );\n }\n table.print();\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as realFs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { Host } from \"./Host.js\";\n\nfunction assertNoTombstone(\n node: Node,\n): asserts node is Node & { tombstone?: false } {\n if (node.tombstone) {\n throw new Error(`Unexpected tombstone ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertNotType<N extends Node, T extends Node[\"type\"]>(\n node: N,\n type: T,\n): asserts node is N & { type: Exclude<N[\"type\"], T> } {\n if (node.type === type) {\n throw new Error(`Unexpected node type ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertType<N extends Node, T extends Node[\"type\"]>(\n node: N,\n type: T,\n): asserts node is N & { type: T } {\n if (node.type !== type) {\n throw new Error(`Unexpected node type ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertExists<T extends Node>(node: T | undefined): asserts node is T {\n if (!node) {\n throw new Error(`Expected node to exist`);\n }\n}\n\nfunction assertHasParent(node: Node) {\n if (!node.parent) {\n throw new Error(\"Expected node to have a parent directory\");\n }\n}\n\ninterface BaseNode<T extends string> {\n type: T;\n fullPath: string;\n tombstone?: boolean;\n parent?: DirNode | DirStubNode;\n needsFlush: boolean;\n}\ninterface DirNode extends BaseNode<\"dir\"> {\n stub?: false;\n tombstone?: false;\n dir: Map<string, Node>;\n}\n\ninterface DirStubNode extends BaseNode<\"dir\"> {\n stub: true;\n tombstone?: false;\n dir: Map<string, Node>;\n}\n\ninterface DirTombstoneNode extends BaseNode<\"dir\"> {\n stub?: false;\n tombstone: true;\n dir: Map<string, Node>;\n}\n\ninterface FileNode extends BaseNode<\"file\"> {\n stub?: false;\n tombstone?: false;\n file: Buffer;\n}\n\ninterface FileTombstoneNode extends BaseNode<\"file\"> {\n stub?: false;\n tombstone: true;\n file?: never;\n}\n\ninterface FileStubNode extends BaseNode<\"file\"> {\n stub: true;\n tombstone?: false;\n file?: never;\n}\n\ninterface SymlinkNode extends BaseNode<\"symlink\"> {\n tombstone?: false;\n symlink: string;\n}\n\ntype Node =\n | DirNode\n | FileNode\n | SymlinkNode\n | DirTombstoneNode\n | FileTombstoneNode\n | DirStubNode\n | FileStubNode;\n\nexport class CachingHost implements Host {\n // We need many trees because of windows, key is the `root`\n #trees = new Map<string, DirNode | DirStubNode>();\n\n constructor(\n private fs: Pick<\n typeof realFs,\n | \"existsSync\"\n | \"lstatSync\"\n | \"mkdirSync\"\n | \"promises\"\n | \"readdirSync\"\n | \"readFileSync\"\n | \"readlinkSync\"\n | \"realpathSync\"\n | \"rmdirSync\"\n | \"statSync\"\n | \"unlinkSync\"\n | \"writeFileSync\"\n > = realFs,\n ) {}\n\n #replaceNode(\n node: FileNode | FileStubNode | SymlinkNode,\n newNode: Omit<FileTombstoneNode, \"fullPath\" | \"parent\">,\n ): FileTombstoneNode;\n #replaceNode(\n node: FileNode | FileStubNode | FileTombstoneNode,\n newNode: Omit<FileNode, \"fullPath\" | \"parent\">,\n ): FileNode;\n #replaceNode(\n node: DirTombstoneNode | DirStubNode,\n newNode: Omit<DirNode, \"fullPath\" | \"parent\" | \"dir\">,\n ): DirStubNode;\n #replaceNode(\n node: DirNode,\n newNode: Omit<DirTombstoneNode, \"fullPath\" | \"parent\" | \"dir\">,\n ): DirTombstoneNode;\n #replaceNode(\n node: Node,\n partialNewNode: Omit<Node, \"fullPath\" | \"parent\">,\n ): Node {\n if (!node.parent) throw new Error(\"Cannot replace root node\");\n const newNode: Node = {\n ...partialNewNode,\n fullPath: node.fullPath,\n parent: node.parent,\n dir: (node as DirNode).dir,\n } as Node;\n node.parent.dir.set(path.basename(node.fullPath), newNode);\n return newNode;\n }\n\n #unstubDirectory(node: DirNode | DirStubNode): asserts node is DirNode {\n // So the rules for our stub dirs. We assume the things in the map are authority but\n // for things not in the map, the real FS is the authority\n for (const child of this.fs.readdirSync(node.fullPath)) {\n // just makign this call will populate the structure but its a little expensive.\n // TODO: make an unknown stub\n this.#getNode(path.join(node.fullPath, child));\n }\n node.stub = false;\n }\n\n /**\n * Assumes no parent -> path is root\n *\n * Throws if the path doesnt exist!\n */\n #stubify(filePath: string, parent: undefined): DirStubNode;\n #stubify(\n filePath: string,\n parent: DirNode | DirStubNode | undefined,\n ): DirStubNode | SymlinkNode | FileStubNode;\n #stubify(\n filePath: string,\n parent: DirNode | DirStubNode | undefined,\n ): typeof parent extends undefined ? DirNode | DirStubNode\n : DirNode | DirStubNode | SymlinkNode | FileStubNode\n {\n const canonicalPath = path.resolve(filePath);\n\n if (!parent && canonicalPath !== path.parse(canonicalPath).root) {\n throw new Error(\n `parent can only be null if path is root. Instead got: ${canonicalPath}`,\n );\n }\n const stat = this.fs.lstatSync(canonicalPath); // may throw\n\n let node: SymlinkNode | FileStubNode | DirStubNode;\n\n if (stat.isDirectory()) {\n node = {\n fullPath: canonicalPath,\n type: \"dir\",\n stub: true,\n dir: new Map(),\n parent,\n needsFlush: false,\n };\n } else if (stat.isSymbolicLink()) {\n node = {\n fullPath: canonicalPath,\n type: \"symlink\",\n symlink: this.fs.readlinkSync(canonicalPath),\n parent,\n needsFlush: false,\n };\n } else if (stat.isFile()) {\n node = {\n fullPath: canonicalPath,\n type: \"file\",\n stub: true,\n parent,\n needsFlush: false,\n };\n } else {\n throw new Error(\n `what is not a file nor symlink nor directory? nothing we care about: ${canonicalPath}`,\n );\n }\n\n if (!parent && node.type === \"dir\") {\n this.#trees.set(canonicalPath, node);\n return node;\n } else if (parent) {\n parent.dir.set(path.basename(canonicalPath), node);\n } else {\n throw new Error(\n `root can only be a dir, got ${JSON.stringify(node)} for path: ${canonicalPath}`,\n );\n }\n return node;\n }\n\n /**\n * Note: may return the node itself!\n * You should check the `fullPath` of the result.\n */\n #getNearestAncestorNode(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const { root } = path.parse(canonicalPath);\n const parts = [];\n\n let maybePath = canonicalPath;\n while (maybePath !== root) {\n parts.unshift(path.basename(maybePath));\n maybePath = path.dirname(maybePath);\n }\n\n let curPath = root;\n let curNode: Node = this.#trees.get(root)\n ?? this.#stubify(curPath, undefined); // its okay to throw if there is no root\n try {\n for (const part of parts) {\n assertNoTombstone(curNode);\n assertNotType(curNode, \"file\");\n if (curNode.type === \"symlink\") {\n const linkedNode = this.#getNodeResolvingSymlinks(\n path.resolve(path.dirname(curPath), curNode.symlink),\n );\n assertExists(linkedNode);\n assertNoTombstone(linkedNode);\n assertType(linkedNode, \"dir\");\n curNode = linkedNode;\n }\n assertType(curNode, \"dir\");\n assertNoTombstone(curNode);\n curNode = curNode.dir.get(part)\n ?? this.#stubify(path.join(curNode.fullPath, part), curNode);\n curPath = path.join(curPath, part);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // This error is expected when things done exist.\n // console.log(`Got EXPECTED error when trying to getNearestAncestorNode(${canonicalPath}): `, (e as any).message);\n }\n return { pathWithSymlinks: curPath, node: curNode };\n }\n\n #getNode(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const { pathWithSymlinks, node } = this.#getNearestAncestorNode(\n canonicalPath,\n );\n if (pathWithSymlinks === canonicalPath) {\n return node;\n }\n return undefined;\n }\n\n #getNodeResolvingSymlinks(\n filePath: string,\n follows: number = 100,\n ): Exclude<Node, SymlinkNode> | undefined {\n const node = this.#getNode(filePath); // canonicalizes for us\n if (!node || node.type !== \"symlink\") return node;\n // this is a really poor mans way of doing this. but who has 100's of symlinks hanging around?\n if (follows === 0) throw new Error(\"Exhausted symlink follows\");\n\n return this.#getNodeResolvingSymlinks(node.symlink, follows--);\n }\n\n mkdir(\n filePath: string,\n opts: { recursive: boolean } = { recursive: false },\n ): void {\n const canonicalPath = path.resolve(filePath);\n const { node, pathWithSymlinks } = this.#getNearestAncestorNode(\n canonicalPath,\n );\n if (filePath === pathWithSymlinks) {\n assertType(node, \"dir\");\n assertHasParent(node);\n if (!node.tombstone) return; // already done\n } else if (path.dirname(filePath) === pathWithSymlinks) {\n assertType(node, \"dir\");\n assertNoTombstone(node);\n node.dir.set(path.basename(filePath), {\n type: \"dir\",\n fullPath: filePath,\n parent: node,\n dir: new Map(),\n needsFlush: true,\n });\n return;\n }\n\n if (!opts.recursive && path.dirname(canonicalPath) !== pathWithSymlinks) {\n throw new Error(\"no such file or directory\");\n }\n\n const rootPath = pathWithSymlinks;\n let maybePath = canonicalPath;\n const toMake: string[] = [];\n while (maybePath !== rootPath) {\n toMake.unshift(\n path.resolve(node.fullPath, path.relative(rootPath, maybePath)),\n );\n maybePath = path.dirname(maybePath);\n }\n\n for (const dirToMake of toMake) {\n this.mkdir(dirToMake);\n }\n }\n\n rmdir(directoryPath: string): void {\n const node = this.#getNode(directoryPath);\n if (!node || node.tombstone) {\n return; // this isnt how FS usually work but its what we are doing\n }\n assertType(node, \"dir\");\n if (node.stub) {\n this.#unstubDirectory(node);\n }\n\n if (node.dir.size === 0) {\n this.#replaceNode(node, {\n type: \"dir\",\n tombstone: true,\n needsFlush: true,\n });\n } else {\n throw new Error(\"directory not empty\");\n }\n }\n\n exists(filePath: string): boolean {\n const node = this.#getNode(filePath); // canonicalizes for us\n return !!node && !node.tombstone;\n }\n\n readFile(filePath: string, opts?: undefined): Buffer;\n readFile(filePath: string, opts: { encoding: BufferEncoding }): string;\n readFile(filePath: string, opts: { asJson: true }): object;\n readFile(\n filePath: string,\n opts: undefined | { encoding: BufferEncoding; asJson?: false } | {\n encoding?: never;\n asJson: true;\n },\n ) {\n let node = this.#getNodeResolvingSymlinks(filePath); // canonicalizes for us\n\n if (!node) {\n return undefined;\n }\n assertNotType(node, \"dir\");\n assertNoTombstone(node);\n\n if (node.stub) {\n node = this.#replaceNode(node, {\n type: \"file\",\n file: this.fs.readFileSync(filePath),\n needsFlush: false,\n });\n }\n\n if (!opts) {\n return Buffer.from(node.file);\n } else if (opts.asJson) {\n return JSON.parse(node.file.toString(\"utf-8\"));\n } else {\n return node.file.toString(opts.encoding);\n }\n }\n\n writeFile(filePath: string, buffer: Buffer): void;\n writeFile(\n filePath: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n filePath: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n filePath: string,\n body: string | Buffer,\n opts?: { encoding: BufferEncoding },\n ) {\n const fileContentsAsBuffer = typeof body === \"string\"\n ? Buffer.from(body, opts?.encoding)\n : Buffer.from(body);\n\n const canonicalPath = path.resolve(filePath);\n const existingNode = this.#getNodeResolvingSymlinks(canonicalPath);\n if (existingNode) {\n if (existingNode.type === \"dir\") {\n throw new Error(\"cant write file to a dir\");\n }\n this.#replaceNode(existingNode, {\n file: fileContentsAsBuffer,\n type: \"file\",\n needsFlush: true,\n });\n return;\n }\n\n const maybeDirNode = this.#getNodeResolvingSymlinks(\n path.dirname(canonicalPath),\n );\n assertExists(maybeDirNode);\n assertType(maybeDirNode, \"dir\");\n assertNoTombstone(maybeDirNode);\n\n maybeDirNode.dir.set(path.basename(canonicalPath), {\n type: \"file\",\n fullPath: canonicalPath,\n parent: maybeDirNode,\n file: fileContentsAsBuffer,\n needsFlush: true,\n });\n }\n\n deleteFile(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const node = this.#getNode(canonicalPath);\n if (!node || (node.type === \"file\" && node.tombstone === true)) return;\n assertNotType(node, \"dir\");\n this.#replaceNode(node, {\n type: \"file\",\n tombstone: true,\n needsFlush: true,\n });\n }\n\n readJson(filePath: string) {\n return this.readFile(filePath, { asJson: true });\n }\n\n writeJson(filePath: string, o: object): void {\n return this.writeFile(filePath, JSON.stringify(o, undefined, 2) + \"\\n\", {\n encoding: \"utf-8\",\n });\n }\n\n async #flushFileNode(\n node: FileNode | FileStubNode | FileTombstoneNode,\n ): Promise<unknown> {\n // FIXME all tombstones need a flush, so we can get rid of needsFlush for them\n if (node.tombstone) {\n try {\n await this.fs.promises.access(node.fullPath);\n return this.fs.promises.unlink(node.fullPath);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // should only throw if file doesnt exist which is no op\n return;\n }\n } else if (node.stub === true || node.needsFlush === false) {\n return;\n } else {\n // we dont do things with file stubs\n return this.fs.promises.writeFile(node.fullPath, node.file);\n }\n }\n\n async #flushSymlinkNode(node: SymlinkNode) {\n if (!node.needsFlush) return;\n try {\n const linkValue = await this.fs.promises.readlink(node.fullPath);\n if (linkValue === node.symlink) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // expected when the link doesnt exist\n }\n return this.fs.promises.symlink(node.symlink, node.fullPath);\n }\n\n async #flushDirNode(\n node: DirNode | DirStubNode | DirTombstoneNode,\n ): Promise<unknown> {\n if (!node.tombstone && node.needsFlush) {\n try {\n await this.fs.promises.access(node.fullPath); // throws if the file doesnt exist\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n await this.fs.promises.mkdir(node.fullPath); // throws if it does :(\n }\n }\n\n const promises: Promise<unknown>[] = [];\n for (const child of node.dir.values()) {\n if (node.tombstone && !child.tombstone) {\n throw new Error(\n \"Unexpected failure during sanity check. A non-deleted child is on a deleted dir\",\n );\n }\n if (child.type === \"dir\") {\n promises.push(this.#flushDirNode(child));\n } else if (child.type === \"file\") {\n promises.push(this.#flushFileNode(child));\n } else if (child.type === \"symlink\") {\n promises.push(this.#flushSymlinkNode(child));\n } else {\n throw new Error(\"should never happen\");\n }\n }\n await Promise.all(promises);\n if (node.tombstone) {\n return this.fs.promises.rmdir(node.fullPath);\n }\n return;\n }\n\n flush() {\n const promises: Promise<unknown>[] = [];\n for (const rootNode of this.#trees.values()) {\n promises.push(this.#flushDirNode(rootNode));\n }\n return Promise.all(promises);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { findUp } from \"find-up\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n\nexport async function findPnpmWorkspaceDir(cwd: string) {\n const workspaceManifestLocation = await findUp(\"pnpm-workspace.yaml\", {\n cwd: await fs.promises.realpath(cwd),\n });\n return workspaceManifestLocation && path.dirname(workspaceManifestLocation);\n}\n\nexport async function findWorkspaceDir(\n host: Pick<Host, \"readJson\" | \"exists\">,\n dir: string,\n): Promise<string | undefined> {\n // Defining workspaces in package.json is not necessary in PNPM\n const maybePnpmWorkspaceDir = await findPnpmWorkspaceDir(dir);\n if (maybePnpmWorkspaceDir != null) {\n return maybePnpmWorkspaceDir;\n }\n\n // We may not be in a repository that uses PNPM, look for workspaces in package.json\n const packagePath = path.join(dir, \"package.json\");\n if (host.exists(packagePath)) {\n const packageJson = host.readJson(packagePath) as PackageJson;\n if (packageJson.workspaces !== undefined) {\n return dir;\n }\n }\n\n const nextDir = path.normalize(path.join(dir, \"..\"));\n if (nextDir === dir) {\n return undefined;\n }\n\n return findWorkspaceDir(host, nextDir);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { join as pathJoin } from \"path\";\nimport { getWorkspacePackageDirs } from \"./getWorkspacePackageDirs.js\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n/**\n * returns a map of package names to their directories in the workspace.\n * if `resolvePaths` is true, the returned directory names are absolute paths\n * resolved against the `workspaceDir`.\n */\nexport async function getPackageNameToDir(\n host: Pick<Host, \"readJson\" | \"exists\">,\n workspaceDir: string,\n resolvePaths: boolean = false,\n) {\n const ret = new Map<string, string>();\n\n const workspacePackages = await getWorkspacePackageDirs(\n host,\n workspaceDir,\n resolvePaths,\n );\n for (const packageDir of workspacePackages) {\n const packagePath = pathJoin(packageDir, \"package.json\");\n const { name } = host.readJson(packagePath) as PackageJson;\n if (name === undefined) {\n throw new Error(`Package needs a name: ${packagePath}`);\n }\n ret.set(name, packageDir);\n }\n return ret;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { findPackages } from \"find-packages\";\nimport { existsSync } from \"fs\";\nimport * as glob from \"glob\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport readYamlFile from \"read-yaml-file\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n\nasync function findPNPMWorkspacePackages(workspaceRoot: string) {\n workspaceRoot = fs.realpathSync(workspaceRoot);\n const workspaceManifest = await readYamlFile.default<{ packages?: string[] }>(\n path.join(workspaceRoot, \"pnpm-workspace.yaml\"),\n );\n\n return findPackages(workspaceRoot, {\n ignore: [\"**/node_modules/**\", \"**/bower_components/**\"],\n includeRoot: true,\n patterns: workspaceManifest.packages,\n });\n}\n\nexport async function getWorkspacePackageDirs(\n host: Pick<Host, \"readJson\" | \"exists\">,\n workspaceDir: string,\n resolvePaths: boolean = false,\n) {\n const packageJson = host.readJson(\n path.join(workspaceDir, \"package.json\"),\n ) as PackageJson;\n\n const isPnpmWorkspace = host.exists(\n path.join(workspaceDir, \"pnpm-workspace.yaml\"),\n );\n if (isPnpmWorkspace) {\n const workspacePackages = await findPNPMWorkspacePackages(workspaceDir);\n if (workspacePackages.length === 0) {\n throw new Error(\"Invalid workspaceDir: \" + workspaceDir);\n }\n return workspacePackages.map((project) => project.dir).filter((d) => d !== workspaceDir);\n }\n\n if (!packageJson.workspaces) {\n throw new Error(\n \"Unsupported! Monorepo is not backed by either pnpm nor yarn workspaces.\",\n );\n }\n\n const ret: string[] = [];\n const packageGlobs = Array.isArray(packageJson.workspaces)\n ? packageJson.workspaces\n : packageJson.workspaces.packages || [];\n\n for (const pattern of packageGlobs) {\n for (const packagePath of glob.sync(pattern, { cwd: workspaceDir })) {\n const packageJsonPath = path.join(\n workspaceDir,\n packagePath,\n \"package.json\",\n );\n\n if (existsSync(packageJsonPath)) {\n if (resolvePaths === true) {\n ret.push(path.resolve(path.join(workspaceDir, packagePath)));\n } else {\n ret.push(packagePath);\n }\n }\n }\n }\n\n return ret;\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport micromatch from \"micromatch\";\nimport { nanosecondsToSanity } from \"./nanosecondsToSanity.js\";\nimport { Table } from \"./Table.js\";\n// This file requires a LOT of caching to be performant. We have three layers to avoid work.\n\n/**\n * Multimap cache of whether a needle was found in the glob haystack. Short circuits many\n * individual checks against the globs.\n */\nconst cache = new Map<\n /* haystack */ readonly string[],\n Map</* needle */ string, /* result */ boolean>\n>();\n\n/**\n * Multimap cache of whether a needle matches a glob. Allows us to avoid regexp's.\n */\nconst singleMatcherCache = new Map<\n /* glob */ string,\n Map</* needle */ string, /* result*/ boolean>\n>();\n\n/**\n * Cache of glob to regular expression. Compiling the regular expression is expensive.\n */\nconst compiledGlobCache = new Map</* glob */ string, RegExp>();\n\nlet haystackMiss = 0;\nlet haystackHit = 0;\n\nlet matchTime = BigInt(0);\n\nlet singleMatcherHits = 0;\nlet singleMatcherMisses = 0;\nlet singleMatcherSaves = 0; // hits + hits you would have had if the haystack didn't save you\n\ninterface MatchesAnyGlob {\n (needle: string, haystack: readonly string[]): boolean | undefined;\n printStats?: () => void;\n}\nexport const matchesAnyGlob: MatchesAnyGlob = function matchesAnyGlobFunc(\n needle: string,\n haystack: readonly string[],\n) {\n matchTime -= process.hrtime.bigint();\n\n let cacheForHaystack = cache.get(haystack);\n if (cacheForHaystack === undefined) {\n cacheForHaystack = new Map<string, boolean>();\n cache.set(haystack, cacheForHaystack);\n }\n\n let result = cacheForHaystack!.get(needle);\n if (result === undefined) {\n haystackMiss++;\n result = false;\n for (const pattern of haystack) {\n // result = needleInPattern(needle, pattern); // commented out as a reminder to update both\n // BEGIN INLINE of needleInPattern\n let patternCache = singleMatcherCache.get(pattern);\n if (patternCache === undefined) {\n patternCache = new Map<string, boolean>();\n singleMatcherCache.set(pattern, patternCache);\n }\n\n // N.B. true/false/undefined\n result = patternCache.get(needle); // only thing different from the inline is we need to reuse `result`\n if (result === undefined) {\n let regexp: RegExp | undefined | false = compiledGlobCache.get(pattern);\n if (regexp === undefined) {\n regexp = micromatch.makeRe(pattern);\n // if (regexp === false) throw new Error(\"bad glob\");\n compiledGlobCache.set(pattern, regexp);\n }\n\n singleMatcherMisses++;\n result = regexp.test(needle);\n patternCache.set(needle, result);\n } else {\n singleMatcherHits++;\n singleMatcherSaves++;\n }\n // END INLINE of needleInPattern\n if (result) break;\n }\n cacheForHaystack!.set(needle, result);\n } else {\n singleMatcherSaves += haystack.length;\n haystackHit++;\n }\n matchTime += process.hrtime.bigint();\n return result;\n};\n\nmatchesAnyGlob.printStats = () => {\n const table = new Table<[string, string]>({\n title: \"matchesAnyGlob stats\",\n showHeader: true,\n showFooter: false,\n columns: [\n { header: \"Stat\", type: \"string\" },\n { header: \"Value\", type: \"string\" },\n ],\n });\n table.addRow(\"Haystack Miss\", \"\" + haystackMiss);\n table.addRow(\"Haystack Hit\", \"\" + haystackHit);\n table.addRow(\"Single Glob Hits\", \"\" + singleMatcherHits);\n table.addRow(\"Single Glob Misses\", \"\" + singleMatcherMisses);\n table.addRow(\"Single Glob Saves\", \"\" + singleMatcherSaves);\n table.addRow(\"Total Time\", nanosecondsToSanity(matchTime, 6));\n\n table.print();\n};\n\n/**\n * @deprecated Don't use this directly. We manually inline it above\n */\nexport function needleInPattern(needle: string, pattern: string) {\n // benchmark says the uncommented version is best\n // https://jsben.ch/Y8TWs\n\n // option 2\n let patternCache = singleMatcherCache.get(pattern);\n if (patternCache === undefined) {\n patternCache = new Map<string, boolean>();\n singleMatcherCache.set(pattern, patternCache);\n }\n\n // N.B. true/false/undefined\n let result = patternCache.get(needle);\n if (result === undefined) {\n let regexp: RegExp | undefined | false = compiledGlobCache.get(pattern);\n if (regexp === undefined) {\n regexp = micromatch.makeRe(pattern);\n // if (regexp === false) throw new Error(\"bad glob\");\n compiledGlobCache.set(pattern, regexp);\n }\n\n singleMatcherMisses++;\n result = regexp.test(needle);\n patternCache.set(needle, result);\n } else {\n singleMatcherHits++;\n singleMatcherSaves++;\n }\n\n return result;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Host } from \"./Host.js\";\nexport function mutateJson<T extends object>(\n path: string,\n host: Host,\n mutator: (f: T) => T,\n) {\n let file = host.readJson(path) as T;\n file = mutator(file);\n host.writeJson(path, file);\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as realFs from \"fs\";\n\nimport { Host } from \"./Host.js\";\nexport class SimpleHost implements Host {\n constructor(private fs: typeof realFs = realFs) {}\n mkdir(directoryPath: string, opts?: { recursive: boolean }): void {\n this.fs.mkdirSync(directoryPath, { recursive: opts?.recursive ?? false });\n }\n rmdir(directoryPath: string): void {\n this.fs.rmdirSync(directoryPath);\n }\n\n exists(path: string): boolean {\n return this.fs.existsSync(path);\n }\n\n writeFile(path: string, buffer: Buffer): void;\n writeFile(\n path: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n path: string,\n body: string | Buffer,\n opts?: { encoding: BufferEncoding },\n ): void {\n if (opts) {\n this.fs.writeFileSync(path, body, { encoding: opts.encoding });\n } else {\n this.fs.writeFileSync(path, body);\n }\n }\n readFile(path: string, opts?: undefined): Buffer;\n readFile(path: string, opts: { encoding: BufferEncoding }): string;\n readFile(path: string, opts: { asJson: true }): object;\n readFile(\n path: string,\n opts?: { encoding?: BufferEncoding; asJson?: boolean },\n ): string | object | Buffer {\n if (opts?.asJson) {\n return JSON.parse(this.fs.readFileSync(path, \"utf-8\"));\n }\n return this.fs.readFileSync(path, opts?.encoding);\n }\n deleteFile(path: string) {\n this.fs.unlinkSync(path);\n }\n readJson(filename: string) {\n const contents = this.fs.readFileSync(filename, \"utf-8\");\n return JSON.parse(contents);\n }\n writeJson(path: string, o: object): void {\n return this.fs.writeFileSync(path, JSON.stringify(o, undefined, 2) + \"\\n\");\n }\n flush() {\n // noop in the simple case\n return Promise.resolve();\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\nimport { Table } from \"./Table.js\";\nexport class Timing {\n #starts: Array<{ name?: string; start: bigint }> = [];\n constructor(private title: string) {\n this.stop(); // make sure we have starting point\n }\n\n public start(name: string) {\n this.#starts.push({ name, start: process.hrtime.bigint() });\n }\n\n public stop() {\n this.#starts.push({ start: process.hrtime.bigint() });\n }\n\n public printResults() {\n const table = new Table<[bigint, string]>({\n sortColumn: -1,\n showFooter: true,\n showHeader: true,\n title: this.title,\n columns: [\n {\n header: \"Duration\",\n type: \"bigint\",\n renderAs: \"nanoseconds\",\n precision: 4,\n footer: { aggregate: \"sum\" },\n },\n { header: \"Task\", type: \"string\", footer: \"TOTAL\" },\n ],\n });\n\n this.stop(); // be sure we stopped the last one\n\n let cur: { name?: string; start: bigint } = this.#starts[0];\n for (const entry of this.#starts) {\n if (cur.name) {\n const span = entry.start - cur.start;\n table.addRow(span, cur.name);\n }\n cur = entry;\n }\n\n table.print();\n }\n}\n"],"mappings":"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","names":["fs","promises","path","fs","path","path","realFs","fs","path"]}
1
+ {"version":3,"sources":["../../src/nanosecondsToSanity.ts","../../src/Table.ts","../../src/AggregateTiming.ts","../../src/CachingHost.ts","../../src/findWorkspaceDir.ts","../../src/getPackageNameToDir.ts","../../src/getWorkspacePackageDirs.ts","../../src/matchesAnyGlob.ts","../../src/mutateJson.ts","../../src/SimpleHost.ts","../../src/Timing.ts"],"sourcesContent":["/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nexport function nanosecondsToSanity(n: bigint, precision: number = 9) {\n return n / BigInt(1000000000) + \".\"\n + (\"\" + (n % BigInt(1000000000))).padStart(9, \"0\").substring(0, precision)\n + \"s\";\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\nimport { nanosecondsToSanity } from \"./nanosecondsToSanity.js\";\ntype HeaderFooterHelper<HB, FB, H, F> =\n & (HB extends true ? { header: H } : { header?: H })\n & (FB extends true ? { footer: F } : { footer?: F });\n\ntype WithAlignemnt = { alignment?: \"right\" | \"left\" };\ntype BaseCellConfig = WithAlignemnt & { type: \"bigint\" | \"string\" };\n\ntype BaseBigIntCellConfig = {\n type: \"bigint\";\n renderAs?: \"nanoseconds\";\n precision?: number;\n} & WithAlignemnt;\ntype BaseStringCellConfig = { type: \"string\" } & WithAlignemnt;\n\ntype BigIntColumnConfig<H, F> =\n & WithAlignemnt\n & BaseBigIntCellConfig\n & HeaderFooterHelper<\n H,\n F,\n string,\n AggregateFooterConfig | StaticFooterConfig\n >;\n\ntype StringColumnConfig<H, F> =\n & WithAlignemnt\n & BaseStringCellConfig\n & HeaderFooterHelper<H, F, string, StaticFooterConfig>;\n\ntype AggregateFooterConfig = {\n aggregate: \"sum\" | \"average\";\n renderAs?: \"nanoseconds\";\n precision?: number;\n} & WithAlignemnt;\n\ntype StaticFooterConfig = StrictStaticFooterConfig | string;\ntype StrictStaticFooterConfig = {\n aggregate: \"static\";\n value: string;\n} & WithAlignemnt;\n\ntype AnyStrictFooterConfig = AggregateFooterConfig | StrictStaticFooterConfig;\n\ntype TableConfig<T extends any[], H extends boolean, F extends boolean> = {\n sortColumn?: number;\n padding?: number;\n showHeader: H;\n showFooter: F;\n columns: {\n [K in keyof T]: T[K] extends bigint ? BigIntColumnConfig<H, F>\n : StringColumnConfig<H, F>;\n };\n title: string;\n};\n\ntype InternalTableConfig = {\n padding: number;\n showHeader: boolean;\n showFooter: boolean;\n sortColumn?: number;\n columns: Array<BigIntColumnConfig<any, any> | StringColumnConfig<any, any>>;\n title: string;\n};\n\nexport class Table<T extends any[]> {\n #rows: T[] = [];\n #config: InternalTableConfig;\n #columnWidths: number[] = [];\n #footer: Array<bigint | string> = [];\n #footerRowConfig?: Array<Required<BaseCellConfig> & AnyStrictFooterConfig>;\n #totalWidth = 0;\n\n constructor(\n config:\n | TableConfig<T, true, true>\n | TableConfig<T, true, false>\n | TableConfig<T, false, true>\n | TableConfig<T, false, false>,\n ) {\n this.#config = {\n padding: 2,\n ...config,\n };\n this.#columnWidths.fill(0, 0, config.columns.length);\n\n if (config.showFooter) {\n this.#footerRowConfig = [];\n for (const columnConfig of config.columns) {\n if (columnConfig.footer === undefined) {\n throw new Error(\"Must specify footer fields when showFooter is true\");\n } else if (typeof columnConfig.footer === \"string\") {\n this.#footerRowConfig.push({\n type: \"string\",\n alignment: \"left\",\n aggregate: \"static\",\n value: columnConfig.footer,\n });\n } else if (\"value\" in columnConfig.footer) {\n this.#footerRowConfig.push({\n type: \"string\",\n alignment: \"left\",\n ...columnConfig.footer,\n });\n } else if (\"aggregate\" in columnConfig.footer) {\n if (columnConfig.type !== \"bigint\") {\n throw new Error(\"expecting bigint for aggregate\");\n }\n this.#footerRowConfig.push({\n type: columnConfig.type,\n renderAs: columnConfig.renderAs,\n precision: columnConfig.precision,\n alignment: \"right\",\n ...columnConfig.footer,\n });\n }\n }\n }\n }\n\n addRow(...data: T) {\n // TODO: maybe clone the data\n this.#rows.push(data);\n }\n\n #sumColumn(c: number) {\n let total = BigInt(0);\n for (const row of this.#rows) {\n total += row[c];\n }\n return total;\n }\n\n #updateFooterRow() {\n const footerRowConfig = this.#footerRowConfig;\n if (footerRowConfig) {\n for (let c = 0; c < footerRowConfig.length; c++) {\n const footerColConfig = footerRowConfig[c];\n\n switch (footerColConfig.aggregate) {\n case \"sum\":\n this.#footer[c] = this.#sumColumn(c);\n break;\n case \"average\":\n this.#footer[c] = this.#sumColumn(c) / BigInt(this.#rows.length);\n break;\n case \"static\":\n this.#footer[c] = footerColConfig.value;\n break;\n }\n }\n }\n }\n\n #calculateColumnWidths() {\n this.#columnWidths.fill(0, 0, this.#config.columns.length);\n\n for (let c = 0; c < this.#config.columns.length; c++) {\n const colConfig = this.#config.columns[c];\n this.#columnWidths[c] = Math.max(\n (this.#config.columns[c].header ?? \"\").length,\n ...this.#rows.map((a) => this.#getCellValueAsString(a[c], colConfig).length),\n this.#footer && this.#footerRowConfig\n ? this.#getCellValueAsString(\n this.#footer?.[c] ?? \"\",\n this.#footerRowConfig[c],\n ).length\n : 0,\n );\n }\n\n this.#totalWidth = 0;\n for (const colWidth of this.#columnWidths) {\n this.#totalWidth += colWidth;\n }\n this.#totalWidth += (this.#columnWidths.length - 1) * this.#config.padding;\n }\n\n #printSeparator(fillString: string) {\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr2 = \"\";\n\n // tslint:disable-next-line: prefer-for-of\n for (let c = 0; c < this.#columnWidths.length; c++) {\n hr2 += \"\".padStart(this.#columnWidths[c], fillString) + paddingString;\n }\n hr2 = hr2.trimRight();\n console.log(hr2);\n }\n\n #printHeaderRow() {\n if (this.#config.showHeader) {\n const colConfigs = this.#config.columns;\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr = \"\";\n for (let c = 0; c < colConfigs.length; c++) {\n const heading = colConfigs[c].header ?? \"\";\n hr += heading.padEnd(this.#columnWidths[c], \" \") + paddingString;\n }\n hr = hr.trimRight();\n console.log(hr);\n\n this.#printSeparator(\"-\");\n }\n }\n\n #printFooterRow() {\n const footerRow = this.#footer;\n if (footerRow) {\n this.#printSeparator(\"=\");\n\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n\n let hr = \"\";\n for (let c = 0; c < footerRow.length; c++) {\n hr += this.#getCellValueAligned(footerRow[c], this.#footerRowConfig![c], c)\n + paddingString; // .padEnd(this.#columnWidths[c], \" \") + paddingString;\n }\n hr = hr.trimRight();\n console.log(hr);\n }\n }\n\n print() {\n // let data = [...this.#rows];\n if (this.#config.sortColumn !== undefined) {\n // todo\n }\n\n this.#updateFooterRow();\n this.#calculateColumnWidths();\n\n console.log();\n console.log(`${this.#config.title}`);\n console.log(\"\".padStart(this.#totalWidth, \"=\"));\n\n const paddingString = \"\".padStart(this.#config.padding, \" \");\n if (this.#config.showHeader) {\n this.#printHeaderRow();\n }\n\n for (let r = 0; r < this.#rows.length; r++) {\n let rowText = \"\";\n for (let c = 0; c < this.#config.columns.length; c++) {\n rowText += this.getEntryAsStringAligned(c, r) + paddingString;\n }\n rowText.trim();\n console.log(rowText);\n }\n\n if (this.#config.showFooter) this.#printFooterRow();\n console.log();\n }\n\n #getCellValueAsString(\n value: bigint | string,\n config: BaseBigIntCellConfig | BaseStringCellConfig,\n ) {\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n return nanosecondsToSanity(value as bigint, config.precision ?? 9);\n } else {\n return \"\" + value;\n }\n }\n\n #getCellValueAligned(\n value: bigint | string,\n config: BaseBigIntCellConfig | BaseStringCellConfig,\n column: number,\n ) {\n let result: string;\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n result = nanosecondsToSanity(value as bigint, config.precision ?? 9);\n } else {\n result = \"\" + value;\n }\n\n if (config.alignment === \"left\") {\n return result.padEnd(this.#columnWidths[column]);\n } else {\n return result.padStart(this.#columnWidths[column]);\n }\n }\n\n getEntryAsString(colNum: number, rowNum: number) {\n const config = this.#config.columns[colNum];\n\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n return nanosecondsToSanity(\n this.#rows[rowNum][colNum],\n config.precision ?? 9,\n );\n } else {\n return \"\" + this.#rows[rowNum][colNum];\n }\n }\n\n getEntryAsStringAligned(colNum: number, rowNum: number) {\n const config = this.#config.columns[colNum];\n\n let result: string;\n if (config.type === \"bigint\" && config.renderAs === \"nanoseconds\") {\n result = nanosecondsToSanity(\n this.#rows[rowNum][colNum],\n config.precision ?? 9,\n );\n } else {\n result = \"\" + this.#rows[rowNum][colNum];\n }\n\n if (config.alignment === \"left\") {\n return result.padEnd(this.#columnWidths[colNum]);\n } else {\n return result.padStart(this.#columnWidths[colNum]);\n }\n }\n\n getColumnWidth(\n colNum: number,\n config:\n | BigIntColumnConfig<boolean, boolean>\n | StringColumnConfig<boolean, boolean>,\n ) {\n let maxWidth = Math.max(\n (config.header ?? \"\").length,\n this.#footer && this.#footerRowConfig\n ? this.#getCellValueAsString(\n this.#footer[colNum],\n this.#footerRowConfig[colNum],\n ).length\n : 0,\n );\n\n for (let r = 0; r < this.#rows.length; r++) {\n maxWidth = Math.max(maxWidth, this.getEntryAsString(colNum, r).length);\n // if (config.type == \"bigint\" && config.renderAs === \"nanoseconds\") {\n // maxWidth = Math.max(maxWidth, Number(row[colNum] / BigInt(1000000000)) + 10); // 1 for period, 9 for digits\n // } else if (config.type == \"bigint\" || config.type == \"string\") {\n // maxWidth = Math.max(maxWidth, (\"\" + row[colNum]).length);\n // }\n }\n\n return maxWidth;\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\n\nimport { Table } from \"./Table.js\";\nexport class AggregateTiming {\n #data = new Map<string, { count: number; total: bigint }>();\n #last: { count: number; total: bigint } | undefined;\n\n constructor(private title: string) {}\n\n public start(name: string) {\n const time = process.hrtime.bigint();\n if (this.#last) {\n this.#last.total += time;\n }\n\n let data = this.#data.get(name);\n if (data === undefined) {\n data = { count: 1, total: -time };\n this.#data.set(name, data);\n } else {\n data.total -= time;\n data.count++;\n }\n this.#last = data;\n }\n\n public stop() {\n const time = process.hrtime.bigint();\n if (this.#last) {\n this.#last.total += time;\n this.#last = undefined;\n }\n }\n\n public printResults() {\n const table = new Table<[bigint, string, bigint, bigint]>({\n sortColumn: -1,\n showFooter: true,\n showHeader: true,\n title: this.title,\n columns: [\n {\n header: \"Duration\",\n type: \"bigint\",\n renderAs: \"nanoseconds\",\n footer: { aggregate: \"sum\" },\n },\n { header: \"Task\", type: \"string\", alignment: \"left\", footer: \"TOTAL\" },\n { header: \"Count\", type: \"bigint\", footer: { aggregate: \"sum\" } },\n { header: \"Avg\", type: \"bigint\", footer: { aggregate: \"average\" } },\n ],\n });\n\n for (const [name, value] of this.#data) {\n table.addRow(\n value.total,\n name,\n BigInt(value.count), // fixme this can be a number later\n value.total / BigInt(value.count),\n );\n }\n table.print();\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as realFs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { Host } from \"./Host.js\";\n\nfunction assertNoTombstone(\n node: Node,\n): asserts node is Node & { tombstone?: false } {\n if (node.tombstone) {\n throw new Error(`Unexpected tombstone ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertNotType<N extends Node, T extends Node[\"type\"]>(\n node: N,\n type: T,\n): asserts node is N & { type: Exclude<N[\"type\"], T> } {\n if (node.type === type) {\n throw new Error(`Unexpected node type ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertType<N extends Node, T extends Node[\"type\"]>(\n node: N,\n type: T,\n): asserts node is N & { type: T } {\n if (node.type !== type) {\n throw new Error(`Unexpected node type ${JSON.stringify(node)}`);\n }\n}\n\nfunction assertExists<T extends Node>(node: T | undefined): asserts node is T {\n if (!node) {\n throw new Error(`Expected node to exist`);\n }\n}\n\nfunction assertHasParent(node: Node) {\n if (!node.parent) {\n throw new Error(\"Expected node to have a parent directory\");\n }\n}\n\ninterface BaseNode<T extends string> {\n type: T;\n fullPath: string;\n tombstone?: boolean;\n parent?: DirNode | DirStubNode;\n needsFlush: boolean;\n}\ninterface DirNode extends BaseNode<\"dir\"> {\n stub?: false;\n tombstone?: false;\n dir: Map<string, Node>;\n}\n\ninterface DirStubNode extends BaseNode<\"dir\"> {\n stub: true;\n tombstone?: false;\n dir: Map<string, Node>;\n}\n\ninterface DirTombstoneNode extends BaseNode<\"dir\"> {\n stub?: false;\n tombstone: true;\n dir: Map<string, Node>;\n}\n\ninterface FileNode extends BaseNode<\"file\"> {\n stub?: false;\n tombstone?: false;\n file: Buffer;\n}\n\ninterface FileTombstoneNode extends BaseNode<\"file\"> {\n stub?: false;\n tombstone: true;\n file?: never;\n}\n\ninterface FileStubNode extends BaseNode<\"file\"> {\n stub: true;\n tombstone?: false;\n file?: never;\n}\n\ninterface SymlinkNode extends BaseNode<\"symlink\"> {\n tombstone?: false;\n symlink: string;\n}\n\ntype Node =\n | DirNode\n | FileNode\n | SymlinkNode\n | DirTombstoneNode\n | FileTombstoneNode\n | DirStubNode\n | FileStubNode;\n\nexport class CachingHost implements Host {\n // We need many trees because of windows, key is the `root`\n #trees = new Map<string, DirNode | DirStubNode>();\n\n constructor(\n private fs: Pick<\n typeof realFs,\n | \"existsSync\"\n | \"lstatSync\"\n | \"mkdirSync\"\n | \"promises\"\n | \"readdirSync\"\n | \"readFileSync\"\n | \"readlinkSync\"\n | \"realpathSync\"\n | \"rmdirSync\"\n | \"statSync\"\n | \"unlinkSync\"\n | \"writeFileSync\"\n > = realFs,\n ) {}\n\n #replaceNode(\n node: FileNode | FileStubNode | SymlinkNode,\n newNode: Omit<FileTombstoneNode, \"fullPath\" | \"parent\">,\n ): FileTombstoneNode;\n #replaceNode(\n node: FileNode | FileStubNode | FileTombstoneNode,\n newNode: Omit<FileNode, \"fullPath\" | \"parent\">,\n ): FileNode;\n #replaceNode(\n node: DirTombstoneNode | DirStubNode,\n newNode: Omit<DirNode, \"fullPath\" | \"parent\" | \"dir\">,\n ): DirStubNode;\n #replaceNode(\n node: DirNode,\n newNode: Omit<DirTombstoneNode, \"fullPath\" | \"parent\" | \"dir\">,\n ): DirTombstoneNode;\n #replaceNode(\n node: Node,\n partialNewNode: Omit<Node, \"fullPath\" | \"parent\">,\n ): Node {\n if (!node.parent) throw new Error(\"Cannot replace root node\");\n const newNode: Node = {\n ...partialNewNode,\n fullPath: node.fullPath,\n parent: node.parent,\n dir: (node as DirNode).dir,\n } as Node;\n node.parent.dir.set(path.basename(node.fullPath), newNode);\n return newNode;\n }\n\n #unstubDirectory(node: DirNode | DirStubNode): asserts node is DirNode {\n // So the rules for our stub dirs. We assume the things in the map are authority but\n // for things not in the map, the real FS is the authority\n for (const child of this.fs.readdirSync(node.fullPath)) {\n // just makign this call will populate the structure but its a little expensive.\n // TODO: make an unknown stub\n this.#getNode(path.join(node.fullPath, child));\n }\n node.stub = false;\n }\n\n /**\n * Assumes no parent -> path is root\n *\n * Throws if the path doesnt exist!\n */\n #stubify(filePath: string, parent: undefined): DirStubNode;\n #stubify(\n filePath: string,\n parent: DirNode | DirStubNode | undefined,\n ): DirStubNode | SymlinkNode | FileStubNode;\n #stubify(\n filePath: string,\n parent: DirNode | DirStubNode | undefined,\n ): typeof parent extends undefined ? DirNode | DirStubNode\n : DirNode | DirStubNode | SymlinkNode | FileStubNode\n {\n const canonicalPath = path.resolve(filePath);\n\n if (!parent && canonicalPath !== path.parse(canonicalPath).root) {\n throw new Error(\n `parent can only be null if path is root. Instead got: ${canonicalPath}`,\n );\n }\n const stat = this.fs.lstatSync(canonicalPath); // may throw\n\n let node: SymlinkNode | FileStubNode | DirStubNode;\n\n if (stat.isDirectory()) {\n node = {\n fullPath: canonicalPath,\n type: \"dir\",\n stub: true,\n dir: new Map(),\n parent,\n needsFlush: false,\n };\n } else if (stat.isSymbolicLink()) {\n node = {\n fullPath: canonicalPath,\n type: \"symlink\",\n symlink: this.fs.readlinkSync(canonicalPath),\n parent,\n needsFlush: false,\n };\n } else if (stat.isFile()) {\n node = {\n fullPath: canonicalPath,\n type: \"file\",\n stub: true,\n parent,\n needsFlush: false,\n };\n } else {\n throw new Error(\n `what is not a file nor symlink nor directory? nothing we care about: ${canonicalPath}`,\n );\n }\n\n if (!parent && node.type === \"dir\") {\n this.#trees.set(canonicalPath, node);\n return node;\n } else if (parent) {\n parent.dir.set(path.basename(canonicalPath), node);\n } else {\n throw new Error(\n `root can only be a dir, got ${JSON.stringify(node)} for path: ${canonicalPath}`,\n );\n }\n return node;\n }\n\n /**\n * Note: may return the node itself!\n * You should check the `fullPath` of the result.\n */\n #getNearestAncestorNode(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const { root } = path.parse(canonicalPath);\n const parts = [];\n\n let maybePath = canonicalPath;\n while (maybePath !== root) {\n parts.unshift(path.basename(maybePath));\n maybePath = path.dirname(maybePath);\n }\n\n let curPath = root;\n let curNode: Node = this.#trees.get(root)\n ?? this.#stubify(curPath, undefined); // its okay to throw if there is no root\n try {\n for (const part of parts) {\n assertNoTombstone(curNode);\n assertNotType(curNode, \"file\");\n if (curNode.type === \"symlink\") {\n const linkedNode = this.#getNodeResolvingSymlinks(\n path.resolve(path.dirname(curPath), curNode.symlink),\n );\n assertExists(linkedNode);\n assertNoTombstone(linkedNode);\n assertType(linkedNode, \"dir\");\n curNode = linkedNode;\n }\n assertType(curNode, \"dir\");\n assertNoTombstone(curNode);\n curNode = curNode.dir.get(part)\n ?? this.#stubify(path.join(curNode.fullPath, part), curNode);\n curPath = path.join(curPath, part);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // This error is expected when things done exist.\n // console.log(`Got EXPECTED error when trying to getNearestAncestorNode(${canonicalPath}): `, (e as any).message);\n }\n return { pathWithSymlinks: curPath, node: curNode };\n }\n\n #getNode(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const { pathWithSymlinks, node } = this.#getNearestAncestorNode(\n canonicalPath,\n );\n if (pathWithSymlinks === canonicalPath) {\n return node;\n }\n return undefined;\n }\n\n #getNodeResolvingSymlinks(\n filePath: string,\n follows: number = 100,\n ): Exclude<Node, SymlinkNode> | undefined {\n const node = this.#getNode(filePath); // canonicalizes for us\n if (!node || node.type !== \"symlink\") return node;\n // this is a really poor mans way of doing this. but who has 100's of symlinks hanging around?\n if (follows === 0) throw new Error(\"Exhausted symlink follows\");\n\n return this.#getNodeResolvingSymlinks(node.symlink, follows--);\n }\n\n mkdir(\n filePath: string,\n opts: { recursive: boolean } = { recursive: false },\n ): void {\n const canonicalPath = path.resolve(filePath);\n const { node, pathWithSymlinks } = this.#getNearestAncestorNode(\n canonicalPath,\n );\n if (filePath === pathWithSymlinks) {\n assertType(node, \"dir\");\n assertHasParent(node);\n if (!node.tombstone) return; // already done\n } else if (path.dirname(filePath) === pathWithSymlinks) {\n assertType(node, \"dir\");\n assertNoTombstone(node);\n node.dir.set(path.basename(filePath), {\n type: \"dir\",\n fullPath: filePath,\n parent: node,\n dir: new Map(),\n needsFlush: true,\n });\n return;\n }\n\n if (!opts.recursive && path.dirname(canonicalPath) !== pathWithSymlinks) {\n throw new Error(\"no such file or directory\");\n }\n\n const rootPath = pathWithSymlinks;\n let maybePath = canonicalPath;\n const toMake: string[] = [];\n while (maybePath !== rootPath) {\n toMake.unshift(\n path.resolve(node.fullPath, path.relative(rootPath, maybePath)),\n );\n maybePath = path.dirname(maybePath);\n }\n\n for (const dirToMake of toMake) {\n this.mkdir(dirToMake);\n }\n }\n\n rmdir(directoryPath: string): void {\n const node = this.#getNode(directoryPath);\n if (!node || node.tombstone) {\n return; // this isnt how FS usually work but its what we are doing\n }\n assertType(node, \"dir\");\n if (node.stub) {\n this.#unstubDirectory(node);\n }\n\n if (node.dir.size === 0) {\n this.#replaceNode(node, {\n type: \"dir\",\n tombstone: true,\n needsFlush: true,\n });\n } else {\n throw new Error(\"directory not empty\");\n }\n }\n\n exists(filePath: string): boolean {\n const node = this.#getNode(filePath); // canonicalizes for us\n return !!node && !node.tombstone;\n }\n\n readFile(filePath: string, opts?: undefined): Buffer;\n readFile(filePath: string, opts: { encoding: BufferEncoding }): string;\n readFile(filePath: string, opts: { asJson: true }): object;\n readFile(\n filePath: string,\n opts: undefined | { encoding: BufferEncoding; asJson?: false } | {\n encoding?: never;\n asJson: true;\n },\n ) {\n let node = this.#getNodeResolvingSymlinks(filePath); // canonicalizes for us\n\n if (!node) {\n // Match SimpleHost behavior by throwing ENOENT error\n const error = new Error(\n `ENOENT: no such file or directory, open '${filePath}'`,\n ) as NodeJS.ErrnoException;\n error.errno = -2;\n error.code = \"ENOENT\";\n error.syscall = \"open\";\n error.path = filePath;\n throw error;\n }\n assertNotType(node, \"dir\");\n assertNoTombstone(node);\n\n if (node.stub) {\n node = this.#replaceNode(node, {\n type: \"file\",\n file: this.fs.readFileSync(filePath),\n needsFlush: false,\n });\n }\n\n if (!opts) {\n return Buffer.from(node.file);\n } else if (opts.asJson) {\n return JSON.parse(node.file.toString(\"utf-8\"));\n } else {\n return node.file.toString(opts.encoding);\n }\n }\n\n writeFile(filePath: string, buffer: Buffer): void;\n writeFile(\n filePath: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n filePath: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n filePath: string,\n body: string | Buffer,\n opts?: { encoding: BufferEncoding },\n ) {\n const fileContentsAsBuffer = typeof body === \"string\"\n ? Buffer.from(body, opts?.encoding)\n : Buffer.from(body);\n\n const canonicalPath = path.resolve(filePath);\n const existingNode = this.#getNodeResolvingSymlinks(canonicalPath);\n if (existingNode) {\n if (existingNode.type === \"dir\") {\n throw new Error(\"cant write file to a dir\");\n }\n this.#replaceNode(existingNode, {\n file: fileContentsAsBuffer,\n type: \"file\",\n needsFlush: true,\n });\n return;\n }\n\n const maybeDirNode = this.#getNodeResolvingSymlinks(\n path.dirname(canonicalPath),\n );\n assertExists(maybeDirNode);\n assertType(maybeDirNode, \"dir\");\n assertNoTombstone(maybeDirNode);\n\n maybeDirNode.dir.set(path.basename(canonicalPath), {\n type: \"file\",\n fullPath: canonicalPath,\n parent: maybeDirNode,\n file: fileContentsAsBuffer,\n needsFlush: true,\n });\n }\n\n deleteFile(filePath: string) {\n const canonicalPath = path.resolve(filePath);\n const node = this.#getNode(canonicalPath);\n if (!node || (node.type === \"file\" && node.tombstone === true)) return;\n assertNotType(node, \"dir\");\n this.#replaceNode(node, {\n type: \"file\",\n tombstone: true,\n needsFlush: true,\n });\n }\n\n readJson(filePath: string) {\n return this.readFile(filePath, { asJson: true });\n }\n\n writeJson(filePath: string, o: object): void {\n return this.writeFile(filePath, JSON.stringify(o, undefined, 2) + \"\\n\", {\n encoding: \"utf-8\",\n });\n }\n\n async #flushFileNode(\n node: FileNode | FileStubNode | FileTombstoneNode,\n ): Promise<unknown> {\n // FIXME all tombstones need a flush, so we can get rid of needsFlush for them\n if (node.tombstone) {\n try {\n await this.fs.promises.access(node.fullPath);\n return this.fs.promises.unlink(node.fullPath);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // should only throw if file doesnt exist which is no op\n return;\n }\n } else if (node.stub === true || node.needsFlush === false) {\n return;\n } else {\n // we dont do things with file stubs\n return this.fs.promises.writeFile(node.fullPath, node.file);\n }\n }\n\n async #flushSymlinkNode(node: SymlinkNode) {\n if (!node.needsFlush) return;\n try {\n const linkValue = await this.fs.promises.readlink(node.fullPath);\n if (linkValue === node.symlink) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n // expected when the link doesnt exist\n }\n return this.fs.promises.symlink(node.symlink, node.fullPath);\n }\n\n async #flushDirNode(\n node: DirNode | DirStubNode | DirTombstoneNode,\n ): Promise<unknown> {\n if (!node.tombstone && node.needsFlush) {\n try {\n await this.fs.promises.access(node.fullPath); // throws if the file doesnt exist\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n await this.fs.promises.mkdir(node.fullPath); // throws if it does :(\n }\n }\n\n const promises: Promise<unknown>[] = [];\n for (const child of node.dir.values()) {\n if (node.tombstone && !child.tombstone) {\n throw new Error(\n \"Unexpected failure during sanity check. A non-deleted child is on a deleted dir\",\n );\n }\n if (child.type === \"dir\") {\n promises.push(this.#flushDirNode(child));\n } else if (child.type === \"file\") {\n promises.push(this.#flushFileNode(child));\n } else if (child.type === \"symlink\") {\n promises.push(this.#flushSymlinkNode(child));\n } else {\n throw new Error(\"should never happen\");\n }\n }\n await Promise.all(promises);\n if (node.tombstone) {\n return this.fs.promises.rmdir(node.fullPath);\n }\n return;\n }\n\n flush() {\n const promises: Promise<unknown>[] = [];\n for (const rootNode of this.#trees.values()) {\n promises.push(this.#flushDirNode(rootNode));\n }\n return Promise.all(promises);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { findUp } from \"find-up\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n\nexport async function findPnpmWorkspaceDir(cwd: string) {\n const workspaceManifestLocation = await findUp(\"pnpm-workspace.yaml\", {\n cwd: await fs.promises.realpath(cwd),\n });\n return workspaceManifestLocation && path.dirname(workspaceManifestLocation);\n}\n\nexport async function findWorkspaceDir(\n host: Pick<Host, \"readJson\" | \"exists\">,\n dir: string,\n): Promise<string | undefined> {\n // Defining workspaces in package.json is not necessary in PNPM\n const maybePnpmWorkspaceDir = await findPnpmWorkspaceDir(dir);\n if (maybePnpmWorkspaceDir != null) {\n return maybePnpmWorkspaceDir;\n }\n\n // We may not be in a repository that uses PNPM, look for workspaces in package.json\n const packagePath = path.join(dir, \"package.json\");\n if (host.exists(packagePath)) {\n const packageJson = host.readJson(packagePath) as PackageJson;\n if (packageJson.workspaces !== undefined) {\n return dir;\n }\n }\n\n const nextDir = path.normalize(path.join(dir, \"..\"));\n if (nextDir === dir) {\n return undefined;\n }\n\n return findWorkspaceDir(host, nextDir);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { join as pathJoin } from \"path\";\nimport { getWorkspacePackageDirs } from \"./getWorkspacePackageDirs.js\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n/**\n * returns a map of package names to their directories in the workspace.\n * if `resolvePaths` is true, the returned directory names are absolute paths\n * resolved against the `workspaceDir`.\n */\nexport async function getPackageNameToDir(\n host: Pick<Host, \"readJson\" | \"exists\">,\n workspaceDir: string,\n resolvePaths: boolean = false,\n) {\n const ret = new Map<string, string>();\n\n const workspacePackages = await getWorkspacePackageDirs(\n host,\n workspaceDir,\n resolvePaths,\n );\n for (const packageDir of workspacePackages) {\n const packagePath = pathJoin(packageDir, \"package.json\");\n const { name } = host.readJson(packagePath) as PackageJson;\n if (name === undefined) {\n throw new Error(`Package needs a name: ${packagePath}`);\n }\n ret.set(name, packageDir);\n }\n return ret;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { findPackages } from \"find-packages\";\nimport { existsSync } from \"fs\";\nimport * as glob from \"glob\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport readYamlFile from \"read-yaml-file\";\nimport { Host } from \"./Host.js\";\nimport { PackageJson } from \"./PackageJson.js\";\n\nasync function findPNPMWorkspacePackages(workspaceRoot: string) {\n workspaceRoot = fs.realpathSync(workspaceRoot);\n const workspaceManifest = await readYamlFile.default<{ packages?: string[] }>(\n path.join(workspaceRoot, \"pnpm-workspace.yaml\"),\n );\n\n return findPackages(workspaceRoot, {\n ignore: [\"**/node_modules/**\", \"**/bower_components/**\"],\n includeRoot: true,\n patterns: workspaceManifest.packages,\n });\n}\n\nexport async function getWorkspacePackageDirs(\n host: Pick<Host, \"readJson\" | \"exists\">,\n workspaceDir: string,\n resolvePaths: boolean = false,\n) {\n const packageJson = host.readJson(\n path.join(workspaceDir, \"package.json\"),\n ) as PackageJson;\n\n const isPnpmWorkspace = host.exists(\n path.join(workspaceDir, \"pnpm-workspace.yaml\"),\n );\n if (isPnpmWorkspace) {\n const workspacePackages = await findPNPMWorkspacePackages(workspaceDir);\n if (workspacePackages.length === 0) {\n throw new Error(\"Invalid workspaceDir: \" + workspaceDir);\n }\n return workspacePackages.map((project) => project.dir).filter((d) => d !== workspaceDir);\n }\n\n if (!packageJson.workspaces) {\n throw new Error(\n \"Unsupported! Monorepo is not backed by either pnpm nor yarn workspaces.\",\n );\n }\n\n const ret: string[] = [];\n const packageGlobs = Array.isArray(packageJson.workspaces)\n ? packageJson.workspaces\n : packageJson.workspaces.packages || [];\n\n for (const pattern of packageGlobs) {\n for (const packagePath of glob.sync(pattern, { cwd: workspaceDir })) {\n const packageJsonPath = path.join(\n workspaceDir,\n packagePath,\n \"package.json\",\n );\n\n if (existsSync(packageJsonPath)) {\n if (resolvePaths === true) {\n ret.push(path.resolve(path.join(workspaceDir, packagePath)));\n } else {\n ret.push(packagePath);\n }\n }\n }\n }\n\n return ret;\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport micromatch from \"micromatch\";\nimport { nanosecondsToSanity } from \"./nanosecondsToSanity.js\";\nimport { Table } from \"./Table.js\";\n// This file requires a LOT of caching to be performant. We have three layers to avoid work.\n\n/**\n * Multimap cache of whether a needle was found in the glob haystack. Short circuits many\n * individual checks against the globs.\n */\nconst cache = new Map<\n /* haystack */ readonly string[],\n Map</* needle */ string, /* result */ boolean>\n>();\n\n/**\n * Multimap cache of whether a needle matches a glob. Allows us to avoid regexp's.\n */\nconst singleMatcherCache = new Map<\n /* glob */ string,\n Map</* needle */ string, /* result*/ boolean>\n>();\n\n/**\n * Cache of glob to regular expression. Compiling the regular expression is expensive.\n */\nconst compiledGlobCache = new Map</* glob */ string, RegExp>();\n\nlet haystackMiss = 0;\nlet haystackHit = 0;\n\nlet matchTime = BigInt(0);\n\nlet singleMatcherHits = 0;\nlet singleMatcherMisses = 0;\nlet singleMatcherSaves = 0; // hits + hits you would have had if the haystack didn't save you\n\ninterface MatchesAnyGlob {\n (needle: string, haystack: readonly string[]): boolean | undefined;\n printStats?: () => void;\n}\nexport const matchesAnyGlob: MatchesAnyGlob = function matchesAnyGlobFunc(\n needle: string,\n haystack: readonly string[],\n) {\n matchTime -= process.hrtime.bigint();\n\n let cacheForHaystack = cache.get(haystack);\n if (cacheForHaystack === undefined) {\n cacheForHaystack = new Map<string, boolean>();\n cache.set(haystack, cacheForHaystack);\n }\n\n let result = cacheForHaystack!.get(needle);\n if (result === undefined) {\n haystackMiss++;\n result = false;\n for (const pattern of haystack) {\n // result = needleInPattern(needle, pattern); // commented out as a reminder to update both\n // BEGIN INLINE of needleInPattern\n let patternCache = singleMatcherCache.get(pattern);\n if (patternCache === undefined) {\n patternCache = new Map<string, boolean>();\n singleMatcherCache.set(pattern, patternCache);\n }\n\n // N.B. true/false/undefined\n result = patternCache.get(needle); // only thing different from the inline is we need to reuse `result`\n if (result === undefined) {\n let regexp: RegExp | undefined | false = compiledGlobCache.get(pattern);\n if (regexp === undefined) {\n regexp = micromatch.makeRe(pattern);\n // if (regexp === false) throw new Error(\"bad glob\");\n compiledGlobCache.set(pattern, regexp);\n }\n\n singleMatcherMisses++;\n result = regexp.test(needle);\n patternCache.set(needle, result);\n } else {\n singleMatcherHits++;\n singleMatcherSaves++;\n }\n // END INLINE of needleInPattern\n if (result) break;\n }\n cacheForHaystack!.set(needle, result);\n } else {\n singleMatcherSaves += haystack.length;\n haystackHit++;\n }\n matchTime += process.hrtime.bigint();\n return result;\n};\n\nmatchesAnyGlob.printStats = () => {\n const table = new Table<[string, string]>({\n title: \"matchesAnyGlob stats\",\n showHeader: true,\n showFooter: false,\n columns: [\n { header: \"Stat\", type: \"string\" },\n { header: \"Value\", type: \"string\" },\n ],\n });\n table.addRow(\"Haystack Miss\", \"\" + haystackMiss);\n table.addRow(\"Haystack Hit\", \"\" + haystackHit);\n table.addRow(\"Single Glob Hits\", \"\" + singleMatcherHits);\n table.addRow(\"Single Glob Misses\", \"\" + singleMatcherMisses);\n table.addRow(\"Single Glob Saves\", \"\" + singleMatcherSaves);\n table.addRow(\"Total Time\", nanosecondsToSanity(matchTime, 6));\n\n table.print();\n};\n\n/**\n * @deprecated Don't use this directly. We manually inline it above\n */\nexport function needleInPattern(needle: string, pattern: string) {\n // benchmark says the uncommented version is best\n // https://jsben.ch/Y8TWs\n\n // option 2\n let patternCache = singleMatcherCache.get(pattern);\n if (patternCache === undefined) {\n patternCache = new Map<string, boolean>();\n singleMatcherCache.set(pattern, patternCache);\n }\n\n // N.B. true/false/undefined\n let result = patternCache.get(needle);\n if (result === undefined) {\n let regexp: RegExp | undefined | false = compiledGlobCache.get(pattern);\n if (regexp === undefined) {\n regexp = micromatch.makeRe(pattern);\n // if (regexp === false) throw new Error(\"bad glob\");\n compiledGlobCache.set(pattern, regexp);\n }\n\n singleMatcherMisses++;\n result = regexp.test(needle);\n patternCache.set(needle, result);\n } else {\n singleMatcherHits++;\n singleMatcherSaves++;\n }\n\n return result;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Host } from \"./Host.js\";\nexport function mutateJson<T extends object>(\n path: string,\n host: Host,\n mutator: (f: T) => T,\n) {\n let file = host.readJson(path) as T;\n file = mutator(file);\n host.writeJson(path, file);\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as realFs from \"fs\";\n\nimport { Host } from \"./Host.js\";\nexport class SimpleHost implements Host {\n constructor(private fs: typeof realFs = realFs) {}\n mkdir(directoryPath: string, opts?: { recursive: boolean }): void {\n this.fs.mkdirSync(directoryPath, { recursive: opts?.recursive ?? false });\n }\n rmdir(directoryPath: string): void {\n this.fs.rmdirSync(directoryPath);\n }\n\n exists(path: string): boolean {\n return this.fs.existsSync(path);\n }\n\n writeFile(path: string, buffer: Buffer): void;\n writeFile(\n path: string,\n body: string,\n opts: { encoding: BufferEncoding },\n ): void;\n writeFile(\n path: string,\n body: string | Buffer,\n opts?: { encoding: BufferEncoding },\n ): void {\n if (opts) {\n this.fs.writeFileSync(path, body, { encoding: opts.encoding });\n } else {\n this.fs.writeFileSync(path, body);\n }\n }\n readFile(path: string, opts?: undefined): Buffer;\n readFile(path: string, opts: { encoding: BufferEncoding }): string;\n readFile(path: string, opts: { asJson: true }): object;\n readFile(\n path: string,\n opts?: { encoding?: BufferEncoding; asJson?: boolean },\n ): string | object | Buffer {\n if (opts?.asJson) {\n return JSON.parse(this.fs.readFileSync(path, \"utf-8\"));\n }\n return this.fs.readFileSync(path, opts?.encoding);\n }\n deleteFile(path: string) {\n this.fs.unlinkSync(path);\n }\n readJson(filename: string) {\n const contents = this.fs.readFileSync(filename, \"utf-8\");\n return JSON.parse(contents);\n }\n writeJson(path: string, o: object): void {\n return this.fs.writeFileSync(path, JSON.stringify(o, undefined, 2) + \"\\n\");\n }\n flush() {\n // noop in the simple case\n return Promise.resolve();\n }\n}\n","/*!\n * Copyright 2022 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n// tslint:disable:no-console\nimport { Table } from \"./Table.js\";\nexport class Timing {\n #starts: Array<{ name?: string; start: bigint }> = [];\n constructor(private title: string) {\n this.stop(); // make sure we have starting point\n }\n\n public start(name: string) {\n this.#starts.push({ name, start: process.hrtime.bigint() });\n }\n\n public stop() {\n this.#starts.push({ start: process.hrtime.bigint() });\n }\n\n public printResults() {\n const table = new Table<[bigint, string]>({\n sortColumn: -1,\n showFooter: true,\n showHeader: true,\n title: this.title,\n columns: [\n {\n header: \"Duration\",\n type: \"bigint\",\n renderAs: \"nanoseconds\",\n precision: 4,\n footer: { aggregate: \"sum\" },\n },\n { header: \"Task\", type: \"string\", footer: \"TOTAL\" },\n ],\n });\n\n this.stop(); // be sure we stopped the last one\n\n let cur: { name?: string; start: bigint } = this.#starts[0];\n for (const entry of this.#starts) {\n if (cur.name) {\n const span = entry.start - cur.start;\n table.addRow(span, cur.name);\n }\n cur = entry;\n }\n\n table.print();\n }\n}\n"],"mappings":"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","names":["fs","promises","path","fs","path","path","realFs","fs","path"]}