@monorepolint/utils 0.6.0-alpha.2 → 0.6.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.turbo/turbo-clean.log +1 -1
  2. package/.turbo/turbo-compile-typescript.log +1 -1
  3. package/.turbo/turbo-lint.log +7 -7
  4. package/.turbo/turbo-test.log +14 -10
  5. package/.turbo/turbo-transpile-typescript.log +3 -3
  6. package/CHANGELOG.md +2 -0
  7. package/build/js/index.js +493 -443
  8. package/build/js/index.js.map +1 -1
  9. package/build/tsconfig.tsbuildinfo +1 -1
  10. package/build/types/CachingHost.d.ts.map +1 -1
  11. package/build/types/Host.d.ts.map +1 -1
  12. package/build/types/PackageJson.d.ts.map +1 -1
  13. package/build/types/SimpleHost.d.ts.map +1 -1
  14. package/build/types/Table.d.ts.map +1 -1
  15. package/build/types/findWorkspaceDir.d.ts.map +1 -1
  16. package/build/types/getPackageNameToDir.d.ts.map +1 -1
  17. package/build/types/getWorkspacePackageDirs.d.ts.map +1 -1
  18. package/build/types/index.d.ts +7 -7
  19. package/build/types/index.d.ts.map +1 -1
  20. package/build/types/matchesAnyGlob.d.ts.map +1 -1
  21. package/build/types/mutateJson.d.ts.map +1 -1
  22. package/build/types/nanosecondsToSanity.d.ts.map +1 -1
  23. package/coverage/AggregateTiming.ts.html +2 -2
  24. package/coverage/CachingHost.ts.html +258 -42
  25. package/coverage/Host.ts.html +15 -3
  26. package/coverage/PackageJson.ts.html +4 -4
  27. package/coverage/SimpleHost.ts.html +40 -7
  28. package/coverage/Table.ts.html +148 -31
  29. package/coverage/Timing.ts.html +1 -1
  30. package/coverage/clover.xml +533 -389
  31. package/coverage/coverage-final.json +13 -13
  32. package/coverage/findWorkspaceDir.ts.html +4 -4
  33. package/coverage/getPackageNameToDir.ts.html +18 -6
  34. package/coverage/getWorkspacePackageDirs.ts.html +174 -138
  35. package/coverage/index.html +40 -40
  36. package/coverage/index.ts.html +30 -30
  37. package/coverage/matchesAnyGlob.ts.html +37 -10
  38. package/coverage/mutateJson.ts.html +17 -5
  39. package/coverage/nanosecondsToSanity.ts.html +11 -5
  40. package/package.json +1 -2
  41. package/src/AggregateTiming.ts +1 -1
  42. package/src/CachingHost.ts +106 -34
  43. package/src/Host.ts +5 -1
  44. package/src/PackageJson.ts +3 -3
  45. package/src/SimpleHost.ts +14 -3
  46. package/src/Table.ts +62 -23
  47. package/src/__tests__/CachingHost.spec.ts +203 -166
  48. package/src/findWorkspaceDir.ts +3 -3
  49. package/src/getPackageNameToDir.ts +6 -2
  50. package/src/getWorkspacePackageDirs.ts +22 -10
  51. package/src/index.ts +7 -7
  52. package/src/matchesAnyGlob.ts +12 -3
  53. package/src/mutateJson.ts +5 -1
  54. package/src/nanosecondsToSanity.ts +3 -1
  55. package/vitest.config.mjs +10 -7
  56. package/vitest.config.mjs.timestamp-1736878329730-aa478e2241542.mjs +2 -2
@@ -162,11 +162,11 @@
162
162
  *
163
163
  */
164
164
   
165
+ import { findUp } from "find-up";
166
+ import * as fs from "fs";
165
167
  import * as path from "path";
166
168
  import { Host } from "./Host.js";
167
169
  import { PackageJson } from "./PackageJson.js";
168
- import * as fs from "fs";
169
- import { findUp } from "find-up";
170
170
   
171
171
  export async function findPnpmWorkspaceDir(cwd: string) {
172
172
  const workspaceManifestLocation = await findUp("pnpm-workspace.yaml", {
@@ -177,7 +177,7 @@ export async function findPnpmWorkspaceDir(cwd: string) {
177
177
   
178
178
  export async function findWorkspaceDir(
179
179
  host: Pick<Host, "readJson" | "exists">,
180
- dir: string
180
+ dir: string,
181
181
  ): Promise<string | undefined> {
182
182
  // Defining workspaces in package.json is not necessary in PNPM
183
183
  const maybePnpmWorkspaceDir = await findPnpmWorkspaceDir(dir);
@@ -208,7 +208,7 @@ export async function findWorkspaceDir(
208
208
  <div class='footer quiet pad2 space-top1 center small'>
209
209
  Code coverage generated by
210
210
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
211
- at 2025-01-17T16:18:31.005Z
211
+ at 2025-01-22T17:39:00.274Z
212
212
  </div>
213
213
  <script src="prettify.js"></script>
214
214
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>28/28</span>
28
+ <span class='fraction'>32/32</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>28/28</span>
49
+ <span class='fraction'>32/32</span>
50
50
  </div>
51
51
 
52
52
 
@@ -97,7 +97,11 @@
97
97
  <a name='L32'></a><a href='#L32'>32</a>
98
98
  <a name='L33'></a><a href='#L33'>33</a>
99
99
  <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
101
105
  <span class="cline-any cline-neutral">&nbsp;</span>
102
106
  <span class="cline-any cline-neutral">&nbsp;</span>
103
107
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -131,6 +135,10 @@
131
135
  <span class="cline-any cline-yes">1x</span>
132
136
  <span class="cline-any cline-yes">1x</span>
133
137
  <span class="cline-any cline-yes">1x</span>
138
+ <span class="cline-any cline-yes">1x</span>
139
+ <span class="cline-any cline-yes">1x</span>
140
+ <span class="cline-any cline-yes">1x</span>
141
+ <span class="cline-any cline-yes">1x</span>
134
142
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*!
135
143
  * Copyright 2019 Palantir Technologies, Inc.
136
144
  *
@@ -150,11 +158,15 @@ import { PackageJson } from "./PackageJson.js";
150
158
  export async function getPackageNameToDir(
151
159
  host: Pick&lt;Host, "readJson" | "exists"&gt;,
152
160
  workspaceDir: string,
153
- resolvePaths: boolean = false
161
+ resolvePaths: boolean = false,
154
162
  ) {
155
163
  const ret = new Map&lt;string, string&gt;();
156
164
  &nbsp;
157
- const workspacePackages = await getWorkspacePackageDirs(host, workspaceDir, resolvePaths);
165
+ const workspacePackages = await getWorkspacePackageDirs(
166
+ host,
167
+ workspaceDir,
168
+ resolvePaths,
169
+ );
158
170
  for (const packageDir of workspacePackages) {
159
171
  const packagePath = pathJoin(packageDir, "package.json");
160
172
  const { name } = host.readJson(packagePath) as PackageJson;
@@ -172,7 +184,7 @@ export async function getPackageNameToDir(
172
184
  <div class='footer quiet pad2 space-top1 center small'>
173
185
  Code coverage generated by
174
186
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
175
- at 2025-01-17T16:18:31.005Z
187
+ at 2025-01-22T17:39:00.274Z
176
188
  </div>
177
189
  <script src="prettify.js"></script>
178
190
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/64</span>
28
+ <span class='fraction'>76/76</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>0/0</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>0/0</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/64</span>
49
+ <span class='fraction'>76/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -133,146 +133,182 @@
133
133
  <a name='L68'></a><a href='#L68'>68</a>
134
134
  <a name='L69'></a><a href='#L69'>69</a>
135
135
  <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
137
149
  <span class="cline-any cline-neutral">&nbsp;</span>
138
150
  <span class="cline-any cline-neutral">&nbsp;</span>
139
151
  <span class="cline-any cline-neutral">&nbsp;</span>
140
152
  <span class="cline-any cline-neutral">&nbsp;</span>
141
153
  <span class="cline-any cline-neutral">&nbsp;</span>
142
154
  <span class="cline-any cline-neutral">&nbsp;</span>
143
- <span class="cline-any cline-no">&nbsp;</span>
144
- <span class="cline-any cline-no">&nbsp;</span>
145
- <span class="cline-any cline-no">&nbsp;</span>
146
- <span class="cline-any cline-no">&nbsp;</span>
147
- <span class="cline-any cline-no">&nbsp;</span>
148
- <span class="cline-any cline-no">&nbsp;</span>
149
- <span class="cline-any cline-no">&nbsp;</span>
150
- <span class="cline-any cline-no">&nbsp;</span>
151
- <span class="cline-any cline-no">&nbsp;</span>
152
- <span class="cline-any cline-no">&nbsp;</span>
153
- <span class="cline-any cline-no">&nbsp;</span>
154
- <span class="cline-any cline-no">&nbsp;</span>
155
- <span class="cline-any cline-no">&nbsp;</span>
156
- <span class="cline-any cline-no">&nbsp;</span>
157
- <span class="cline-any cline-no">&nbsp;</span>
158
- <span class="cline-any cline-no">&nbsp;</span>
159
- <span class="cline-any cline-no">&nbsp;</span>
160
- <span class="cline-any cline-no">&nbsp;</span>
161
- <span class="cline-any cline-no">&nbsp;</span>
162
- <span class="cline-any cline-no">&nbsp;</span>
163
- <span class="cline-any cline-no">&nbsp;</span>
164
- <span class="cline-any cline-no">&nbsp;</span>
165
- <span class="cline-any cline-no">&nbsp;</span>
166
- <span class="cline-any cline-no">&nbsp;</span>
167
- <span class="cline-any cline-no">&nbsp;</span>
168
- <span class="cline-any cline-no">&nbsp;</span>
169
- <span class="cline-any cline-no">&nbsp;</span>
170
- <span class="cline-any cline-no">&nbsp;</span>
171
- <span class="cline-any cline-no">&nbsp;</span>
172
- <span class="cline-any cline-no">&nbsp;</span>
173
- <span class="cline-any cline-no">&nbsp;</span>
174
- <span class="cline-any cline-no">&nbsp;</span>
175
- <span class="cline-any cline-no">&nbsp;</span>
176
- <span class="cline-any cline-no">&nbsp;</span>
177
- <span class="cline-any cline-no">&nbsp;</span>
178
- <span class="cline-any cline-no">&nbsp;</span>
179
- <span class="cline-any cline-no">&nbsp;</span>
180
- <span class="cline-any cline-no">&nbsp;</span>
181
- <span class="cline-any cline-no">&nbsp;</span>
182
- <span class="cline-any cline-no">&nbsp;</span>
183
- <span class="cline-any cline-no">&nbsp;</span>
184
- <span class="cline-any cline-no">&nbsp;</span>
185
- <span class="cline-any cline-no">&nbsp;</span>
186
- <span class="cline-any cline-no">&nbsp;</span>
187
- <span class="cline-any cline-no">&nbsp;</span>
188
- <span class="cline-any cline-no">&nbsp;</span>
189
- <span class="cline-any cline-no">&nbsp;</span>
190
- <span class="cline-any cline-no">&nbsp;</span>
191
- <span class="cline-any cline-no">&nbsp;</span>
192
- <span class="cline-any cline-no">&nbsp;</span>
193
- <span class="cline-any cline-no">&nbsp;</span>
194
- <span class="cline-any cline-no">&nbsp;</span>
195
- <span class="cline-any cline-no">&nbsp;</span>
196
- <span class="cline-any cline-no">&nbsp;</span>
197
- <span class="cline-any cline-no">&nbsp;</span>
198
- <span class="cline-any cline-no">&nbsp;</span>
199
- <span class="cline-any cline-no">&nbsp;</span>
200
- <span class="cline-any cline-no">&nbsp;</span>
201
- <span class="cline-any cline-no">&nbsp;</span>
202
- <span class="cline-any cline-no">&nbsp;</span>
203
- <span class="cline-any cline-no">&nbsp;</span>
204
- <span class="cline-any cline-no">&nbsp;</span>
205
- <span class="cline-any cline-no">&nbsp;</span>
206
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >/*!</span></span></span>
155
+ <span class="cline-any cline-yes">1x</span>
156
+ <span class="cline-any cline-yes">1x</span>
157
+ <span class="cline-any cline-yes">1x</span>
158
+ <span class="cline-any cline-yes">1x</span>
159
+ <span class="cline-any cline-yes">1x</span>
160
+ <span class="cline-any cline-yes">1x</span>
161
+ <span class="cline-any cline-yes">1x</span>
162
+ <span class="cline-any cline-yes">1x</span>
163
+ <span class="cline-any cline-yes">1x</span>
164
+ <span class="cline-any cline-yes">1x</span>
165
+ <span class="cline-any cline-yes">1x</span>
166
+ <span class="cline-any cline-yes">1x</span>
167
+ <span class="cline-any cline-yes">1x</span>
168
+ <span class="cline-any cline-yes">1x</span>
169
+ <span class="cline-any cline-yes">1x</span>
170
+ <span class="cline-any cline-yes">1x</span>
171
+ <span class="cline-any cline-yes">1x</span>
172
+ <span class="cline-any cline-yes">1x</span>
173
+ <span class="cline-any cline-yes">1x</span>
174
+ <span class="cline-any cline-yes">1x</span>
175
+ <span class="cline-any cline-yes">1x</span>
176
+ <span class="cline-any cline-yes">1x</span>
177
+ <span class="cline-any cline-yes">1x</span>
178
+ <span class="cline-any cline-yes">1x</span>
179
+ <span class="cline-any cline-yes">1x</span>
180
+ <span class="cline-any cline-yes">1x</span>
181
+ <span class="cline-any cline-yes">1x</span>
182
+ <span class="cline-any cline-yes">1x</span>
183
+ <span class="cline-any cline-yes">1x</span>
184
+ <span class="cline-any cline-yes">1x</span>
185
+ <span class="cline-any cline-yes">1x</span>
186
+ <span class="cline-any cline-yes">1x</span>
187
+ <span class="cline-any cline-yes">1x</span>
188
+ <span class="cline-any cline-yes">1x</span>
189
+ <span class="cline-any cline-yes">1x</span>
190
+ <span class="cline-any cline-yes">1x</span>
191
+ <span class="cline-any cline-yes">1x</span>
192
+ <span class="cline-any cline-yes">1x</span>
193
+ <span class="cline-any cline-yes">1x</span>
194
+ <span class="cline-any cline-yes">1x</span>
195
+ <span class="cline-any cline-yes">1x</span>
196
+ <span class="cline-any cline-yes">1x</span>
197
+ <span class="cline-any cline-yes">1x</span>
198
+ <span class="cline-any cline-yes">1x</span>
199
+ <span class="cline-any cline-yes">1x</span>
200
+ <span class="cline-any cline-yes">1x</span>
201
+ <span class="cline-any cline-yes">1x</span>
202
+ <span class="cline-any cline-yes">1x</span>
203
+ <span class="cline-any cline-yes">1x</span>
204
+ <span class="cline-any cline-yes">1x</span>
205
+ <span class="cline-any cline-yes">1x</span>
206
+ <span class="cline-any cline-yes">1x</span>
207
+ <span class="cline-any cline-yes">1x</span>
208
+ <span class="cline-any cline-yes">1x</span>
209
+ <span class="cline-any cline-yes">1x</span>
210
+ <span class="cline-any cline-yes">1x</span>
211
+ <span class="cline-any cline-yes">1x</span>
212
+ <span class="cline-any cline-yes">1x</span>
213
+ <span class="cline-any cline-yes">1x</span>
214
+ <span class="cline-any cline-yes">1x</span>
215
+ <span class="cline-any cline-yes">1x</span>
216
+ <span class="cline-any cline-yes">1x</span>
217
+ <span class="cline-any cline-yes">1x</span>
218
+ <span class="cline-any cline-yes">1x</span>
219
+ <span class="cline-any cline-yes">1x</span>
220
+ <span class="cline-any cline-yes">1x</span>
221
+ <span class="cline-any cline-yes">1x</span>
222
+ <span class="cline-any cline-yes">1x</span>
223
+ <span class="cline-any cline-yes">1x</span>
224
+ <span class="cline-any cline-yes">1x</span>
225
+ <span class="cline-any cline-yes">1x</span>
226
+ <span class="cline-any cline-yes">1x</span>
227
+ <span class="cline-any cline-yes">1x</span>
228
+ <span class="cline-any cline-yes">1x</span>
229
+ <span class="cline-any cline-yes">1x</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*!
207
231
  * Copyright 2019 Palantir Technologies, Inc.
208
232
  *
209
233
  * Licensed under the MIT license. See LICENSE file in the project root for details.
210
234
  *
211
235
  */
212
236
  &nbsp;
213
- <span class="cstat-no" title="statement not covered" >import { existsSync } from "fs";</span>
214
- <span class="cstat-no" title="statement not covered" >import * as glob from "glob";</span>
215
- <span class="cstat-no" title="statement not covered" >import * as path from "node:path";</span>
216
- <span class="cstat-no" title="statement not covered" >import * as fs from "node:fs";</span>
217
- <span class="cstat-no" title="statement not covered" >import { Host } from "./Host.js";</span>
218
- <span class="cstat-no" title="statement not covered" >import { PackageJson } from "./PackageJson.js";</span>
219
- <span class="cstat-no" title="statement not covered" >import readYamlFile from "read-yaml-file";</span>
220
- <span class="cstat-no" title="statement not covered" >import { findPackages } from "find-packages";</span>
221
- <span class="cstat-no" title="statement not covered" ></span>
222
- <span class="cstat-no" title="statement not covered" >async function findPNPMWorkspacePackages(workspaceRoot: string) {</span>
223
- <span class="cstat-no" title="statement not covered" > workspaceRoot = fs.realpathSync(workspaceRoot);</span>
224
- <span class="cstat-no" title="statement not covered" > const workspaceManifest = await readYamlFile.default&lt;{ packages?: string[] }&gt;(</span>
225
- <span class="cstat-no" title="statement not covered" > path.join(workspaceRoot, "pnpm-workspace.yaml")</span>
226
- <span class="cstat-no" title="statement not covered" > );</span>
227
- <span class="cstat-no" title="statement not covered" ></span>
228
- <span class="cstat-no" title="statement not covered" > return findPackages(workspaceRoot, {</span>
229
- <span class="cstat-no" title="statement not covered" > ignore: ["**/node_modules/**", "**/bower_components/**"],</span>
230
- <span class="cstat-no" title="statement not covered" > includeRoot: true,</span>
231
- <span class="cstat-no" title="statement not covered" > patterns: workspaceManifest.packages,</span>
232
- <span class="cstat-no" title="statement not covered" > });</span>
233
- <span class="cstat-no" title="statement not covered" >}</span>
234
- <span class="cstat-no" title="statement not covered" ></span>
235
- <span class="cstat-no" title="statement not covered" >export async function getWorkspacePackageDirs(</span>
236
- <span class="cstat-no" title="statement not covered" > host: Pick&lt;Host, "readJson" | "exists"&gt;,</span>
237
- <span class="cstat-no" title="statement not covered" > workspaceDir: string,</span>
238
- <span class="cstat-no" title="statement not covered" > resolvePaths: boolean = false</span>
239
- <span class="cstat-no" title="statement not covered" >) {</span>
240
- <span class="cstat-no" title="statement not covered" > const packageJson = host.readJson(path.join(workspaceDir, "package.json")) as PackageJson;</span>
241
- <span class="cstat-no" title="statement not covered" ></span>
242
- <span class="cstat-no" title="statement not covered" > const isPnpmWorkspace = host.exists(path.join(workspaceDir, "pnpm-workspace.yaml"));</span>
243
- <span class="cstat-no" title="statement not covered" > if (isPnpmWorkspace) {</span>
244
- <span class="cstat-no" title="statement not covered" > const workspacePackages = await findPNPMWorkspacePackages(workspaceDir);</span>
245
- <span class="cstat-no" title="statement not covered" > if (workspacePackages.length === 0) {</span>
246
- <span class="cstat-no" title="statement not covered" > throw new Error("Invalid workspaceDir: " + workspaceDir);</span>
247
- <span class="cstat-no" title="statement not covered" > }</span>
248
- <span class="cstat-no" title="statement not covered" > return workspacePackages.map((project) =&gt; project.dir).filter((d) =&gt; d !== workspaceDir);</span>
249
- <span class="cstat-no" title="statement not covered" > }</span>
250
- <span class="cstat-no" title="statement not covered" ></span>
251
- <span class="cstat-no" title="statement not covered" > if (!packageJson.workspaces) {</span>
252
- <span class="cstat-no" title="statement not covered" > throw new Error("Unsupported! Monorepo is not backed by either pnpm nor yarn workspaces.");</span>
253
- <span class="cstat-no" title="statement not covered" > }</span>
254
- <span class="cstat-no" title="statement not covered" ></span>
255
- <span class="cstat-no" title="statement not covered" > const ret: string[] = [];</span>
256
- <span class="cstat-no" title="statement not covered" > const packageGlobs = Array.isArray(packageJson.workspaces)</span>
257
- <span class="cstat-no" title="statement not covered" > ? packageJson.workspaces</span>
258
- <span class="cstat-no" title="statement not covered" > : packageJson.workspaces.packages || [];</span>
259
- <span class="cstat-no" title="statement not covered" ></span>
260
- <span class="cstat-no" title="statement not covered" > for (const pattern of packageGlobs) {</span>
261
- <span class="cstat-no" title="statement not covered" > for (const packagePath of glob.sync(pattern, { cwd: workspaceDir })) {</span>
262
- <span class="cstat-no" title="statement not covered" > const packageJsonPath = path.join(workspaceDir, packagePath, "package.json");</span>
263
- <span class="cstat-no" title="statement not covered" ></span>
264
- <span class="cstat-no" title="statement not covered" > if (existsSync(packageJsonPath)) {</span>
265
- <span class="cstat-no" title="statement not covered" > if (resolvePaths === true) {</span>
266
- <span class="cstat-no" title="statement not covered" > ret.push(path.resolve(path.join(workspaceDir, packagePath)));</span>
267
- <span class="cstat-no" title="statement not covered" > } else {</span>
268
- <span class="cstat-no" title="statement not covered" > ret.push(packagePath);</span>
269
- <span class="cstat-no" title="statement not covered" > }</span>
270
- <span class="cstat-no" title="statement not covered" > }</span>
271
- <span class="cstat-no" title="statement not covered" > }</span>
272
- <span class="cstat-no" title="statement not covered" > }</span>
273
- <span class="cstat-no" title="statement not covered" ></span>
274
- <span class="cstat-no" title="statement not covered" > return ret;</span>
275
- <span class="cstat-no" title="statement not covered" >}</span>
237
+ import { findPackages } from "find-packages";
238
+ import { existsSync } from "fs";
239
+ import * as glob from "glob";
240
+ import * as fs from "node:fs";
241
+ import * as path from "node:path";
242
+ import readYamlFile from "read-yaml-file";
243
+ import { Host } from "./Host.js";
244
+ import { PackageJson } from "./PackageJson.js";
245
+ &nbsp;
246
+ async function findPNPMWorkspacePackages(workspaceRoot: string) {
247
+ workspaceRoot = fs.realpathSync(workspaceRoot);
248
+ const workspaceManifest = await readYamlFile.default&lt;{ packages?: string[] }&gt;(
249
+ path.join(workspaceRoot, "pnpm-workspace.yaml"),
250
+ );
251
+ &nbsp;
252
+ return findPackages(workspaceRoot, {
253
+ ignore: ["**/node_modules/**", "**/bower_components/**"],
254
+ includeRoot: true,
255
+ patterns: workspaceManifest.packages,
256
+ });
257
+ }
258
+ &nbsp;
259
+ export async function getWorkspacePackageDirs(
260
+ host: Pick&lt;Host, "readJson" | "exists"&gt;,
261
+ workspaceDir: string,
262
+ resolvePaths: boolean = false,
263
+ ) {
264
+ const packageJson = host.readJson(
265
+ path.join(workspaceDir, "package.json"),
266
+ ) as PackageJson;
267
+ &nbsp;
268
+ const isPnpmWorkspace = host.exists(
269
+ path.join(workspaceDir, "pnpm-workspace.yaml"),
270
+ );
271
+ if (isPnpmWorkspace) {
272
+ const workspacePackages = await findPNPMWorkspacePackages(workspaceDir);
273
+ if (workspacePackages.length === 0) {
274
+ throw new Error("Invalid workspaceDir: " + workspaceDir);
275
+ }
276
+ return workspacePackages.map((project) =&gt; project.dir).filter((d) =&gt;
277
+ d !== workspaceDir
278
+ );
279
+ }
280
+ &nbsp;
281
+ if (!packageJson.workspaces) {
282
+ throw new Error(
283
+ "Unsupported! Monorepo is not backed by either pnpm nor yarn workspaces.",
284
+ );
285
+ }
286
+ &nbsp;
287
+ const ret: string[] = [];
288
+ const packageGlobs = Array.isArray(packageJson.workspaces)
289
+ ? packageJson.workspaces
290
+ : packageJson.workspaces.packages || [];
291
+ &nbsp;
292
+ for (const pattern of packageGlobs) {
293
+ for (const packagePath of glob.sync(pattern, { cwd: workspaceDir })) {
294
+ const packageJsonPath = path.join(
295
+ workspaceDir,
296
+ packagePath,
297
+ "package.json",
298
+ );
299
+ &nbsp;
300
+ if (existsSync(packageJsonPath)) {
301
+ if (resolvePaths === true) {
302
+ ret.push(path.resolve(path.join(workspaceDir, packagePath)));
303
+ } else {
304
+ ret.push(packagePath);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ &nbsp;
310
+ return ret;
311
+ }
276
312
  &nbsp;</pre></td></tr></table></pre>
277
313
 
278
314
  <div class='push'></div><!-- for sticky footer -->
@@ -280,7 +316,7 @@
280
316
  <div class='footer quiet pad2 space-top1 center small'>
281
317
  Code coverage generated by
282
318
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
283
- at 2025-01-17T16:18:31.005Z
319
+ at 2025-01-22T17:39:00.274Z
284
320
  </div>
285
321
  <script src="prettify.js"></script>
286
322
  <script>