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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +11 -10
  5. package/.turbo/turbo-transpile-typescript.log +4 -4
  6. package/CHANGELOG.md +4 -0
  7. package/build/js/index.js +489 -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 +252 -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 +137 -29
  29. package/coverage/Timing.ts.html +1 -1
  30. package/coverage/clover.xml +527 -396
  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 +168 -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 +104 -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 +58 -22
  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 +19 -9
  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 +6 -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-31T20:59:52.637Z
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-31T20:59:52.637Z
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'>74/74</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'>74/74</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,176 @@
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
137
147
  <span class="cline-any cline-neutral">&nbsp;</span>
138
148
  <span class="cline-any cline-neutral">&nbsp;</span>
139
149
  <span class="cline-any cline-neutral">&nbsp;</span>
140
150
  <span class="cline-any cline-neutral">&nbsp;</span>
141
151
  <span class="cline-any cline-neutral">&nbsp;</span>
142
152
  <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>
153
+ <span class="cline-any cline-yes">1x</span>
154
+ <span class="cline-any cline-yes">1x</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-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*!
207
227
  * Copyright 2019 Palantir Technologies, Inc.
208
228
  *
209
229
  * Licensed under the MIT license. See LICENSE file in the project root for details.
210
230
  *
211
231
  */
212
232
  &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>
233
+ import { findPackages } from "find-packages";
234
+ import { existsSync } from "fs";
235
+ import * as glob from "glob";
236
+ import * as fs from "node:fs";
237
+ import * as path from "node:path";
238
+ import readYamlFile from "read-yaml-file";
239
+ import { Host } from "./Host.js";
240
+ import { PackageJson } from "./PackageJson.js";
241
+ &nbsp;
242
+ async function findPNPMWorkspacePackages(workspaceRoot: string) {
243
+ workspaceRoot = fs.realpathSync(workspaceRoot);
244
+ const workspaceManifest = await readYamlFile.default&lt;{ packages?: string[] }&gt;(
245
+ path.join(workspaceRoot, "pnpm-workspace.yaml"),
246
+ );
247
+ &nbsp;
248
+ return findPackages(workspaceRoot, {
249
+ ignore: ["**/node_modules/**", "**/bower_components/**"],
250
+ includeRoot: true,
251
+ patterns: workspaceManifest.packages,
252
+ });
253
+ }
254
+ &nbsp;
255
+ export async function getWorkspacePackageDirs(
256
+ host: Pick&lt;Host, "readJson" | "exists"&gt;,
257
+ workspaceDir: string,
258
+ resolvePaths: boolean = false,
259
+ ) {
260
+ const packageJson = host.readJson(
261
+ path.join(workspaceDir, "package.json"),
262
+ ) as PackageJson;
263
+ &nbsp;
264
+ const isPnpmWorkspace = host.exists(
265
+ path.join(workspaceDir, "pnpm-workspace.yaml"),
266
+ );
267
+ if (isPnpmWorkspace) {
268
+ const workspacePackages = await findPNPMWorkspacePackages(workspaceDir);
269
+ if (workspacePackages.length === 0) {
270
+ throw new Error("Invalid workspaceDir: " + workspaceDir);
271
+ }
272
+ return workspacePackages.map((project) =&gt; project.dir).filter((d) =&gt; d !== workspaceDir);
273
+ }
274
+ &nbsp;
275
+ if (!packageJson.workspaces) {
276
+ throw new Error(
277
+ "Unsupported! Monorepo is not backed by either pnpm nor yarn workspaces.",
278
+ );
279
+ }
280
+ &nbsp;
281
+ const ret: string[] = [];
282
+ const packageGlobs = Array.isArray(packageJson.workspaces)
283
+ ? packageJson.workspaces
284
+ : packageJson.workspaces.packages || [];
285
+ &nbsp;
286
+ for (const pattern of packageGlobs) {
287
+ for (const packagePath of glob.sync(pattern, { cwd: workspaceDir })) {
288
+ const packageJsonPath = path.join(
289
+ workspaceDir,
290
+ packagePath,
291
+ "package.json",
292
+ );
293
+ &nbsp;
294
+ if (existsSync(packageJsonPath)) {
295
+ if (resolvePaths === true) {
296
+ ret.push(path.resolve(path.join(workspaceDir, packagePath)));
297
+ } else {
298
+ ret.push(packagePath);
299
+ }
300
+ }
301
+ }
302
+ }
303
+ &nbsp;
304
+ return ret;
305
+ }
276
306
  &nbsp;</pre></td></tr></table></pre>
277
307
 
278
308
  <div class='push'></div><!-- for sticky footer -->
@@ -280,7 +310,7 @@
280
310
  <div class='footer quiet pad2 space-top1 center small'>
281
311
  Code coverage generated by
282
312
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
283
- at 2025-01-17T16:18:31.005Z
313
+ at 2025-01-31T20:59:52.637Z
284
314
  </div>
285
315
  <script src="prettify.js"></script>
286
316
  <script>