@layerzerolabs/build-utils-rust 0.2.113

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 (87) hide show
  1. package/.turbo/turbo-build.log +43 -0
  2. package/.turbo/turbo-lint.log +8 -0
  3. package/.turbo/turbo-test.log +58 -0
  4. package/README.md +111 -0
  5. package/dist/457ZJTJH.js +52 -0
  6. package/dist/457ZJTJH.js.map +1 -0
  7. package/dist/LQ26FJL3.js +112 -0
  8. package/dist/LQ26FJL3.js.map +1 -0
  9. package/dist/SPODHCGD.js +59 -0
  10. package/dist/SPODHCGD.js.map +1 -0
  11. package/dist/TOEFRNPD.js +83 -0
  12. package/dist/TOEFRNPD.js.map +1 -0
  13. package/dist/UDDAJZY4.js +26 -0
  14. package/dist/UDDAJZY4.js.map +1 -0
  15. package/dist/VUOMXK5T.js +6 -0
  16. package/dist/VUOMXK5T.js.map +1 -0
  17. package/dist/WKRDI535.js +51 -0
  18. package/dist/WKRDI535.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +28 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +9 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/logger.d.ts +8 -0
  28. package/dist/logger.d.ts.map +1 -0
  29. package/dist/logger.js +4 -0
  30. package/dist/logger.js.map +1 -0
  31. package/dist/resolve/discover.d.ts +23 -0
  32. package/dist/resolve/discover.d.ts.map +1 -0
  33. package/dist/resolve/discover.js +7 -0
  34. package/dist/resolve/discover.js.map +1 -0
  35. package/dist/resolve/exclude.d.ts +10 -0
  36. package/dist/resolve/exclude.d.ts.map +1 -0
  37. package/dist/resolve/exclude.js +4 -0
  38. package/dist/resolve/exclude.js.map +1 -0
  39. package/dist/resolve/index.d.ts +20 -0
  40. package/dist/resolve/index.d.ts.map +1 -0
  41. package/dist/resolve/index.js +9 -0
  42. package/dist/resolve/index.js.map +1 -0
  43. package/dist/resolve/io.d.ts +17 -0
  44. package/dist/resolve/io.d.ts.map +1 -0
  45. package/dist/resolve/io.js +6 -0
  46. package/dist/resolve/io.js.map +1 -0
  47. package/dist/resolve/rewrite.d.ts +41 -0
  48. package/dist/resolve/rewrite.d.ts.map +1 -0
  49. package/dist/resolve/rewrite.js +8 -0
  50. package/dist/resolve/rewrite.js.map +1 -0
  51. package/package.json +46 -0
  52. package/src/cli.ts +33 -0
  53. package/src/index.ts +1 -0
  54. package/src/logger.ts +26 -0
  55. package/src/resolve/discover.ts +93 -0
  56. package/src/resolve/exclude.ts +52 -0
  57. package/src/resolve/index.ts +122 -0
  58. package/src/resolve/io.ts +69 -0
  59. package/src/resolve/rewrite.ts +210 -0
  60. package/tests/resolve/discover.test.ts +206 -0
  61. package/tests/resolve/fixtures/index.ts +6 -0
  62. package/tests/resolve/fixtures/minimal.toml +2 -0
  63. package/tests/resolve/fixtures/mixed-deps.toml +4 -0
  64. package/tests/resolve/fixtures/multi-path-deps.toml +9 -0
  65. package/tests/resolve/fixtures/multi-section-path-deps.toml +13 -0
  66. package/tests/resolve/fixtures/no-path-deps.toml +3 -0
  67. package/tests/resolve/fixtures/oapp-with-stale-deps.toml +5 -0
  68. package/tests/resolve/fixtures/patch-multi-registry.toml +22 -0
  69. package/tests/resolve/fixtures/program-with-deps.toml +5 -0
  70. package/tests/resolve/fixtures/program-with-macros.toml +6 -0
  71. package/tests/resolve/fixtures/program-workspace-member.toml +5 -0
  72. package/tests/resolve/fixtures/root-only-sections.toml +13 -0
  73. package/tests/resolve/fixtures/stellar-consumer.toml +8 -0
  74. package/tests/resolve/fixtures/stellar-member-inheriting.toml +10 -0
  75. package/tests/resolve/fixtures/stellar-workspace-root.toml +17 -0
  76. package/tests/resolve/fixtures/stellar-workspace-with-tests.toml +15 -0
  77. package/tests/resolve/fixtures/target-cfg-path-dep.toml +10 -0
  78. package/tests/resolve/fixtures/with-features.toml +2 -0
  79. package/tests/resolve/fixtures/workspace-at-end.toml +6 -0
  80. package/tests/resolve/fixtures/workspace-at-top.toml +10 -0
  81. package/tests/resolve/fixtures/workspace-middle.toml +10 -0
  82. package/tests/resolve/fixtures/workspace-with-default-members.toml +8 -0
  83. package/tests/resolve/fixtures/workspace-with-path-deps.toml +8 -0
  84. package/tests/resolve/index.test.ts +298 -0
  85. package/tests/resolve/rewrite.test.ts +420 -0
  86. package/tsconfig.json +21 -0
  87. package/tsup.config.ts +8 -0
@@ -0,0 +1,5 @@
1
+ [package]
2
+ name = "my-program"
3
+
4
+ [dependencies]
5
+ rbac = { path = "dependencies/utils-solana-rbac" }
@@ -0,0 +1,6 @@
1
+ [package]
2
+ name = "my-program"
3
+
4
+ [dependencies]
5
+ rbac = { path = "../../dependencies/utils-solana-rbac" }
6
+ rbac-macros = { path = "../../dependencies/utils-solana-rbac/macros" }
@@ -0,0 +1,5 @@
1
+ [package]
2
+ name = "my-program"
3
+
4
+ [dependencies]
5
+ rbac = { path = "../../dependencies/utils-solana-rbac" }
@@ -0,0 +1,13 @@
1
+ [package]
2
+ name = "my-lib"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [dependencies]
7
+ anchor-lang = { version = "0.32.1" }
8
+
9
+ [patch.crates-io]
10
+ anchor-lang = { git = "https://github.com/example/anchor.git", rev = "deadbeef" }
11
+
12
+ [profile.release]
13
+ overflow-checks = true
@@ -0,0 +1,8 @@
1
+ [package]
2
+ name = "console-oft"
3
+
4
+ # Like the Solana consumers, the manifest points straight at dependencies/ —
5
+ # the resolve tool only vendors crates there, it does not rewrite this file.
6
+ [dependencies]
7
+ utils = { path = "dependencies/protocol-stellar/contracts/utils" }
8
+ oft-core = { path = "dependencies/protocol-stellar/contracts/oapps/oft-core" }
@@ -0,0 +1,10 @@
1
+ [package]
2
+ name = "oft-core"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+
7
+ [dependencies]
8
+ soroban-sdk = { workspace = true }
9
+ utils = { workspace = true }
10
+ common-macros = { workspace = true }
@@ -0,0 +1,17 @@
1
+ [workspace]
2
+ resolver = "2"
3
+ members = ["contracts/*", "contracts/oapps/*"]
4
+
5
+ [workspace.package]
6
+ edition = "2021"
7
+ version = "0.0.1"
8
+ license = "MIT"
9
+
10
+ [workspace.dependencies]
11
+ soroban-sdk = { version = "25.1.1" }
12
+ utils = { path = "contracts/utils" }
13
+ common-macros = { path = "contracts/common-macros" }
14
+ oapp = { path = "contracts/oapps/oapp" }
15
+
16
+ [profile.release]
17
+ opt-level = "z"
@@ -0,0 +1,15 @@
1
+ [workspace]
2
+ resolver = "2"
3
+ members = ["contracts/*", "tests/mock_vault"]
4
+
5
+ [workspace.package]
6
+ edition = "2021"
7
+ version = "0.0.1"
8
+ license = "MIT"
9
+
10
+ [workspace.dependencies]
11
+ soroban-sdk = { version = "25.1.1" }
12
+ utils = { path = "contracts/utils" }
13
+
14
+ [profile.release]
15
+ opt-level = "z"
@@ -0,0 +1,10 @@
1
+ [package]
2
+ name = "my-crate"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [dependencies]
7
+ anchor-lang = { version = "0.32.1" }
8
+
9
+ [target.'cfg(target_arch = "wasm32")'.dependencies]
10
+ wasm-utils = { path = "dependencies/wasm-utils" }
@@ -0,0 +1,2 @@
1
+ [dependencies]
2
+ rbac = { path = "dependencies/utils-solana-rbac", features = ["idl-build"] }
@@ -0,0 +1,6 @@
1
+ [package]
2
+ name = "my-lib"
3
+
4
+ [workspace]
5
+ members = ["macros"]
6
+ resolver = "2"
@@ -0,0 +1,10 @@
1
+ [workspace]
2
+ members = ["programs/my_program"]
3
+ resolver = "2"
4
+
5
+ [package]
6
+ name = "my-lib"
7
+ version = "0.1.0"
8
+
9
+ [dependencies]
10
+ anchor-lang = { version = "0.32.1" }
@@ -0,0 +1,10 @@
1
+ [package]
2
+ name = "my-lib"
3
+ version = "0.1.0"
4
+
5
+ [workspace]
6
+ members = ["programs/*", "macros"]
7
+ resolver = "2"
8
+
9
+ [dependencies]
10
+ anchor-lang = { version = "0.32.1" }
@@ -0,0 +1,8 @@
1
+ [workspace]
2
+ resolver = "2"
3
+ members = ["contracts/*", "tests/mock"]
4
+ default-members = ["contracts/main", "tests/mock"]
5
+
6
+ [workspace.package]
7
+ edition = "2021"
8
+ version = "0.0.1"
@@ -0,0 +1,8 @@
1
+ [workspace]
2
+ members = ["macros"]
3
+
4
+ [package]
5
+ name = "oapp"
6
+
7
+ [dependencies]
8
+ rbac = { path = "dependencies/utils-solana-rbac" }
@@ -0,0 +1,298 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { parse } from 'smol-toml';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+
6
+ import { resolveDependencies } from '../../src/resolve';
7
+ import { fixture } from './fixtures';
8
+
9
+ const TMP = join(__dirname, '__tmp_resolve__');
10
+
11
+ const createCrate = (path: string, cargoContent: string) => {
12
+ mkdirSync(path, { recursive: true });
13
+ writeFileSync(join(path, 'Cargo.toml'), cargoContent);
14
+ mkdirSync(join(path, 'src'), { recursive: true });
15
+ writeFileSync(join(path, 'src', 'lib.rs'), '// placeholder');
16
+ };
17
+
18
+ const readToml = (path: string) => readFileSync(path, 'utf-8');
19
+
20
+ beforeEach(() => mkdirSync(TMP, { recursive: true }));
21
+ afterEach(() => rmSync(TMP, { recursive: true, force: true }));
22
+
23
+ describe('resolveDependencies — single crate mode', () => {
24
+ it('copies discovered packages into dependencies/ and rewrites transitive paths', async () => {
25
+ const root = join(TMP, 'single-crate');
26
+
27
+ createCrate(root, fixture('program-with-deps.toml'));
28
+
29
+ const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'utils-solana-rbac');
30
+ createCrate(rbacSource, fixture('minimal.toml'));
31
+ writeFileSync(join(rbacSource, 'package.json'), '{}');
32
+
33
+ await resolveDependencies({ cwd: root });
34
+
35
+ expect(existsSync(join(root, 'dependencies', 'utils-solana-rbac', 'Cargo.toml'))).toBe(
36
+ true,
37
+ );
38
+ expect(existsSync(join(root, 'dependencies', 'utils-solana-rbac', 'src', 'lib.rs'))).toBe(
39
+ true,
40
+ );
41
+ // package.json should NOT be copied
42
+ expect(existsSync(join(root, 'dependencies', 'utils-solana-rbac', 'package.json'))).toBe(
43
+ false,
44
+ );
45
+ });
46
+ });
47
+
48
+ describe('resolveDependencies — workspace mode ([workspace] members)', () => {
49
+ it('places dependencies/ at workspace root when root Cargo.toml has [workspace]', async () => {
50
+ const root = join(TMP, 'workspace');
51
+ // Root is a real Cargo workspace listing its members (Solana `programs/*`).
52
+ createCrate(root, '[workspace]\nresolver = "2"\nmembers = ["programs/*"]');
53
+
54
+ const programDir = join(root, 'programs', 'my_program');
55
+ createCrate(programDir, fixture('program-workspace-member.toml'));
56
+
57
+ const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'utils-solana-rbac');
58
+ createCrate(rbacSource, fixture('minimal.toml'));
59
+ writeFileSync(join(rbacSource, 'package.json'), '{}');
60
+
61
+ await resolveDependencies({ cwd: root });
62
+
63
+ expect(existsSync(join(root, 'dependencies', 'utils-solana-rbac', 'Cargo.toml'))).toBe(
64
+ true,
65
+ );
66
+ expect(existsSync(join(programDir, 'dependencies'))).toBe(false);
67
+ });
68
+ });
69
+
70
+ describe('resolveDependencies — transitive dep rewriting', () => {
71
+ it('rewrites paths inside copied crates to point to flat siblings', async () => {
72
+ const root = join(TMP, 'transitive');
73
+
74
+ createCrate(root, fixture('program-with-deps.toml'));
75
+
76
+ // oapp depends on rbac (stale dependencies/ path from previous build)
77
+ const oappSource = join(root, 'node_modules', '@layerzerolabs', 'oapp-solana-impl');
78
+ createCrate(oappSource, fixture('oapp-with-stale-deps.toml'));
79
+ writeFileSync(join(oappSource, 'package.json'), '{}');
80
+
81
+ const rbacSource = join(oappSource, 'node_modules', '@layerzerolabs', 'utils-solana-rbac');
82
+ createCrate(rbacSource, fixture('minimal.toml'));
83
+ writeFileSync(join(rbacSource, 'package.json'), '{}');
84
+
85
+ await resolveDependencies({ cwd: root });
86
+
87
+ const copiedOappToml = readToml(
88
+ join(root, 'dependencies', 'oapp-solana-impl', 'Cargo.toml'),
89
+ );
90
+ expect(copiedOappToml).toContain('path = "../utils-solana-rbac"');
91
+ });
92
+
93
+ it('strips root-only Cargo tables from copied dependency manifests', async () => {
94
+ const root = join(TMP, 'root-only-sections');
95
+
96
+ createCrate(root, fixture('program-with-deps.toml'));
97
+
98
+ const oappSource = join(root, 'node_modules', '@layerzerolabs', 'oapp-solana-impl');
99
+ createCrate(oappSource, fixture('root-only-sections.toml'));
100
+ writeFileSync(join(oappSource, 'package.json'), '{}');
101
+
102
+ await resolveDependencies({ cwd: root });
103
+
104
+ const copiedOapp = parse(
105
+ readToml(join(root, 'dependencies', 'oapp-solana-impl', 'Cargo.toml')),
106
+ );
107
+ expect(copiedOapp.package).toBeDefined();
108
+ expect(copiedOapp.dependencies).toBeDefined();
109
+ expect(copiedOapp.patch).toBeUndefined();
110
+ expect(copiedOapp.profile).toBeUndefined();
111
+ });
112
+ });
113
+
114
+ describe('resolveDependencies — Stellar workspace dependency vendoring', () => {
115
+ // Build a consumer (single crate) that path-deps into sub-crates of a
116
+ // protocol-stellar workspace dependency living in node_modules.
117
+ const setupStellarConsumer = (root: string) => {
118
+ createCrate(root, fixture('stellar-consumer.toml'));
119
+
120
+ const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar');
121
+ createCrate(protocol, fixture('stellar-workspace-root.toml'));
122
+ writeFileSync(join(protocol, 'package.json'), '{}');
123
+ // members: contracts/* and contracts/oapps/* — incl. a deep inheriting member
124
+ createCrate(
125
+ join(protocol, 'contracts', 'utils'),
126
+ fixture('stellar-member-inheriting.toml'),
127
+ );
128
+ createCrate(
129
+ join(protocol, 'contracts', 'common-macros'),
130
+ fixture('stellar-member-inheriting.toml'),
131
+ );
132
+ createCrate(join(protocol, 'contracts', 'oapps'), fixture('minimal.toml')); // grouping crate
133
+ createCrate(
134
+ join(protocol, 'contracts', 'oapps', 'oft-core'),
135
+ fixture('stellar-member-inheriting.toml'),
136
+ );
137
+ return protocol;
138
+ };
139
+
140
+ it('copies the whole workspace tree, including deeply nested members', async () => {
141
+ const root = join(TMP, 'stellar-consumer');
142
+ setupStellarConsumer(root);
143
+
144
+ await resolveDependencies({ cwd: root });
145
+
146
+ const vendored = join(root, 'dependencies', 'protocol-stellar');
147
+ expect(existsSync(join(vendored, 'Cargo.toml'))).toBe(true);
148
+ expect(existsSync(join(vendored, 'contracts', 'utils', 'Cargo.toml'))).toBe(true);
149
+ // the deep member — the case the old one-level scan missed
150
+ expect(existsSync(join(vendored, 'contracts', 'oapps', 'oft-core', 'Cargo.toml'))).toBe(
151
+ true,
152
+ );
153
+ });
154
+
155
+ it('preserves the [workspace] root manifest so member inheritance still resolves', async () => {
156
+ const root = join(TMP, 'stellar-preserve-ws');
157
+ setupStellarConsumer(root);
158
+
159
+ await resolveDependencies({ cwd: root });
160
+
161
+ const vendoredRoot = readToml(join(root, 'dependencies', 'protocol-stellar', 'Cargo.toml'));
162
+ // The root-only-table strip MUST be skipped for a vendored workspace root.
163
+ expect(vendoredRoot).toContain('[workspace]');
164
+ expect(vendoredRoot).toContain('[workspace.package]');
165
+ expect(vendoredRoot).toContain('[workspace.dependencies]');
166
+ });
167
+
168
+ it('leaves the consumer manifest untouched (it already points at dependencies/)', async () => {
169
+ const root = join(TMP, 'stellar-consumer-manifest');
170
+ setupStellarConsumer(root);
171
+ const original = readToml(join(root, 'Cargo.toml'));
172
+
173
+ await resolveDependencies({ cwd: root });
174
+
175
+ // Like Solana, the resolver only fills dependencies/; the consumer's own
176
+ // Cargo.toml (already pointing at dependencies/...) is the source of truth.
177
+ expect(readToml(join(root, 'Cargo.toml'))).toBe(original);
178
+ });
179
+
180
+ it('vendors the deep member the consumer path-deps into', async () => {
181
+ const root = join(TMP, 'stellar-deep-member');
182
+ setupStellarConsumer(root);
183
+
184
+ await resolveDependencies({ cwd: root });
185
+
186
+ // The consumer's `path = "dependencies/protocol-stellar/contracts/oapps/oft-core"`
187
+ // resolves because that crate was vendored at exactly that location.
188
+ expect(
189
+ existsSync(
190
+ join(
191
+ root,
192
+ 'dependencies',
193
+ 'protocol-stellar',
194
+ 'contracts',
195
+ 'oapps',
196
+ 'oft-core',
197
+ 'Cargo.toml',
198
+ ),
199
+ ),
200
+ ).toBe(true);
201
+ });
202
+ });
203
+
204
+ describe('resolveDependencies — prune excluded workspace members', () => {
205
+ // A vendored workspace whose root manifest lists a literal member under an
206
+ // excluded dir (tests/mock_vault). The tests/ subtree is never copied, so the
207
+ // dangling member must be pruned from the preserved manifest — else cargo fails
208
+ // loading a missing workspace member.
209
+ const setupConsumerWithTestMember = (root: string) => {
210
+ createCrate(root, fixture('stellar-consumer.toml'));
211
+
212
+ const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar');
213
+ createCrate(protocol, fixture('stellar-workspace-with-tests.toml'));
214
+ writeFileSync(join(protocol, 'package.json'), '{}');
215
+ createCrate(
216
+ join(protocol, 'contracts', 'utils'),
217
+ fixture('stellar-member-inheriting.toml'),
218
+ );
219
+
220
+ // The excluded test member + extra files — none of this should be vendored.
221
+ const mock = join(protocol, 'tests', 'mock_vault');
222
+ createCrate(mock, '[package]\nname = "mock_vault"\nversion = "0.0.0"\nedition = "2021"');
223
+ writeFileSync(join(protocol, 'tests', 'integration.rs'), '// must NOT be vendored');
224
+ return protocol;
225
+ };
226
+
227
+ it('drops the excluded member from the preserved root manifest, keeps real members', async () => {
228
+ const root = join(TMP, 'prune-member');
229
+ setupConsumerWithTestMember(root);
230
+
231
+ await resolveDependencies({ cwd: root });
232
+
233
+ const vendoredRoot = readToml(join(root, 'dependencies', 'protocol-stellar', 'Cargo.toml'));
234
+ // The dangling test member is gone...
235
+ expect(vendoredRoot).not.toContain('tests/mock_vault');
236
+ // ...but the workspace table and real members/globs remain intact.
237
+ expect(vendoredRoot).toContain('[workspace]');
238
+ expect(vendoredRoot).toContain('contracts/*');
239
+ });
240
+
241
+ it('does not vendor the excluded subtree at all', async () => {
242
+ const root = join(TMP, 'prune-no-tests');
243
+ setupConsumerWithTestMember(root);
244
+
245
+ await resolveDependencies({ cwd: root });
246
+
247
+ const vendored = join(root, 'dependencies', 'protocol-stellar');
248
+ expect(existsSync(join(vendored, 'tests'))).toBe(false);
249
+ // real members are still vendored
250
+ expect(existsSync(join(vendored, 'contracts', 'utils', 'Cargo.toml'))).toBe(true);
251
+ });
252
+ });
253
+
254
+ describe('resolveDependencies — single-crate consumer (no [workspace])', () => {
255
+ it('places dependencies/ next to the crate Cargo.toml', async () => {
256
+ const root = join(TMP, 'leaf-consumer');
257
+ createCrate(root, fixture('program-with-deps.toml')); // bare [package], no [workspace]
258
+
259
+ const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'utils-solana-rbac');
260
+ createCrate(rbacSource, fixture('minimal.toml'));
261
+ writeFileSync(join(rbacSource, 'package.json'), '{}');
262
+
263
+ await resolveDependencies({ cwd: root });
264
+
265
+ expect(existsSync(join(root, 'dependencies', 'utils-solana-rbac', 'Cargo.toml'))).toBe(
266
+ true,
267
+ );
268
+ });
269
+ });
270
+
271
+ describe('resolveDependencies — error handling', () => {
272
+ it('throws when --cargo-dir does not contain Cargo.toml', async () => {
273
+ const root = join(TMP, 'bad-cargo-dir');
274
+ mkdirSync(join(root, 'programs', 'nope'), { recursive: true });
275
+
276
+ await expect(resolveDependencies({ cwd: root, cargoDir: 'programs/nope' })).rejects.toThrow(
277
+ 'does not contain a Cargo.toml',
278
+ );
279
+ });
280
+
281
+ describe('empty node_modules does not change dependencies state', () => {
282
+ const root = join(TMP, 'empty');
283
+ beforeEach(() => {
284
+ createCrate(root, fixture('minimal.toml'));
285
+ });
286
+
287
+ it('dependencies does not exist', async () => {
288
+ await resolveDependencies({ cwd: root });
289
+ expect(existsSync(join(root, 'dependencies'))).toBe(false);
290
+ });
291
+
292
+ it('dependencies already exists', async () => {
293
+ mkdirSync(join(root, 'dependencies'), { recursive: true });
294
+ await resolveDependencies({ cwd: root });
295
+ expect(existsSync(join(root, 'dependencies'))).toBe(true);
296
+ });
297
+ });
298
+ });