@layerzerolabs/build-utils-rust 1.2.68 → 1.2.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build-utils-rust.js +3 -0
- package/dist/2T2WFWNM.js +57 -0
- package/dist/2T2WFWNM.js.map +1 -0
- package/dist/N2QRCDCB.js +115 -0
- package/dist/N2QRCDCB.js.map +1 -0
- package/dist/N4NI6N3K.js +83 -0
- package/dist/N4NI6N3K.js.map +1 -0
- package/dist/UDDAJZY4.js +26 -0
- package/dist/UDDAJZY4.js.map +1 -0
- package/dist/VUOMXK5T.js +6 -0
- package/dist/VUOMXK5T.js.map +1 -0
- package/dist/ZQ7KHDAO.js +52 -0
- package/dist/ZQ7KHDAO.js.map +1 -0
- package/dist/ZS7IDLZZ.js +59 -0
- package/dist/ZS7IDLZZ.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -0
- package/dist/resolve/discover.d.ts +23 -0
- package/dist/resolve/discover.d.ts.map +1 -0
- package/dist/resolve/discover.js +7 -0
- package/dist/resolve/discover.js.map +1 -0
- package/dist/resolve/exclude.d.ts +10 -0
- package/dist/resolve/exclude.d.ts.map +1 -0
- package/dist/resolve/exclude.js +4 -0
- package/dist/resolve/exclude.js.map +1 -0
- package/dist/resolve/index.d.ts +20 -0
- package/dist/resolve/index.d.ts.map +1 -0
- package/dist/resolve/index.js +9 -0
- package/dist/resolve/index.js.map +1 -0
- package/dist/resolve/io.d.ts +17 -0
- package/dist/resolve/io.d.ts.map +1 -0
- package/dist/resolve/io.js +6 -0
- package/dist/resolve/io.js.map +1 -0
- package/dist/resolve/rewrite.d.ts +41 -0
- package/dist/resolve/rewrite.d.ts.map +1 -0
- package/dist/resolve/rewrite.js +8 -0
- package/dist/resolve/rewrite.js.map +1 -0
- package/package.json +9 -6
- package/src/cli.ts +0 -33
- package/src/logger.ts +0 -26
- package/src/resolve/discover.ts +0 -93
- package/src/resolve/exclude.ts +0 -58
- package/src/resolve/index.ts +0 -122
- package/src/resolve/io.ts +0 -69
- package/src/resolve/rewrite.ts +0 -231
- package/tests/resolve/discover.test.ts +0 -208
- package/tests/resolve/fixtures/index.ts +0 -6
- package/tests/resolve/fixtures/minimal.toml +0 -2
- package/tests/resolve/fixtures/mixed-deps.toml +0 -4
- package/tests/resolve/fixtures/multi-path-deps.toml +0 -9
- package/tests/resolve/fixtures/multi-section-path-deps.toml +0 -13
- package/tests/resolve/fixtures/no-path-deps.toml +0 -3
- package/tests/resolve/fixtures/oapp-with-stale-deps.toml +0 -5
- package/tests/resolve/fixtures/oft-core-with-stale-deep-deps.toml +0 -11
- package/tests/resolve/fixtures/patch-multi-registry.toml +0 -22
- package/tests/resolve/fixtures/program-with-deps.toml +0 -5
- package/tests/resolve/fixtures/program-with-macros.toml +0 -6
- package/tests/resolve/fixtures/program-workspace-member.toml +0 -5
- package/tests/resolve/fixtures/root-only-sections.toml +0 -13
- package/tests/resolve/fixtures/stellar-consumer.toml +0 -8
- package/tests/resolve/fixtures/stellar-member-inheriting.toml +0 -10
- package/tests/resolve/fixtures/stellar-workspace-root.toml +0 -17
- package/tests/resolve/fixtures/stellar-workspace-with-tests.toml +0 -15
- package/tests/resolve/fixtures/target-cfg-path-dep.toml +0 -10
- package/tests/resolve/fixtures/with-features.toml +0 -2
- package/tests/resolve/fixtures/workspace-at-end.toml +0 -6
- package/tests/resolve/fixtures/workspace-at-top.toml +0 -10
- package/tests/resolve/fixtures/workspace-middle.toml +0 -10
- package/tests/resolve/fixtures/workspace-with-default-members.toml +0 -8
- package/tests/resolve/fixtures/workspace-with-path-deps.toml +0 -8
- package/tests/resolve/index.test.ts +0 -468
- package/tests/resolve/rewrite.test.ts +0 -507
- package/tsconfig.json +0 -21
- package/tsup.config.ts +0 -8
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
existsSync,
|
|
3
|
-
mkdirSync,
|
|
4
|
-
mkdtempSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
realpathSync,
|
|
7
|
-
rmSync,
|
|
8
|
-
writeFileSync,
|
|
9
|
-
} from 'fs';
|
|
10
|
-
import os from 'os';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
import { parse } from 'smol-toml';
|
|
13
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
14
|
-
|
|
15
|
-
import { resolveDependencies } from '../../src/resolve';
|
|
16
|
-
import { fixture } from './fixtures';
|
|
17
|
-
|
|
18
|
-
// Unique per run so concurrent runs (other checkouts, worktrees) can't delete each other's fixtures.
|
|
19
|
-
// realpath'd because resolve/ looks paths up by their real path — macOS /var/folders is a symlink.
|
|
20
|
-
const TMP = realpathSync(mkdtempSync(join(os.tmpdir(), 'build-utils-resolve-')));
|
|
21
|
-
|
|
22
|
-
const createCrate = (path: string, cargoContent: string) => {
|
|
23
|
-
mkdirSync(path, { recursive: true });
|
|
24
|
-
writeFileSync(join(path, 'Cargo.toml'), cargoContent);
|
|
25
|
-
mkdirSync(join(path, 'src'), { recursive: true });
|
|
26
|
-
writeFileSync(join(path, 'src', 'lib.rs'), '// placeholder');
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const readToml = (path: string) => readFileSync(path, 'utf-8');
|
|
30
|
-
|
|
31
|
-
beforeEach(() => mkdirSync(TMP, { recursive: true }));
|
|
32
|
-
afterEach(() => rmSync(TMP, { recursive: true, force: true }));
|
|
33
|
-
|
|
34
|
-
describe('resolveDependencies — single crate mode', () => {
|
|
35
|
-
it('copies discovered packages into dependencies/ and rewrites transitive paths', async () => {
|
|
36
|
-
const root = join(TMP, 'single-crate');
|
|
37
|
-
|
|
38
|
-
createCrate(root, fixture('program-with-deps.toml'));
|
|
39
|
-
|
|
40
|
-
const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'rbac-solana-contracts');
|
|
41
|
-
createCrate(rbacSource, fixture('minimal.toml'));
|
|
42
|
-
writeFileSync(join(rbacSource, 'package.json'), '{}');
|
|
43
|
-
|
|
44
|
-
await resolveDependencies({ cwd: root });
|
|
45
|
-
|
|
46
|
-
expect(existsSync(join(root, 'dependencies', 'rbac-solana-contracts', 'Cargo.toml'))).toBe(
|
|
47
|
-
true,
|
|
48
|
-
);
|
|
49
|
-
expect(
|
|
50
|
-
existsSync(join(root, 'dependencies', 'rbac-solana-contracts', 'src', 'lib.rs')),
|
|
51
|
-
).toBe(true);
|
|
52
|
-
// package.json should NOT be copied
|
|
53
|
-
expect(
|
|
54
|
-
existsSync(join(root, 'dependencies', 'rbac-solana-contracts', 'package.json')),
|
|
55
|
-
).toBe(false);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
describe('resolveDependencies — workspace mode ([workspace] members)', () => {
|
|
60
|
-
it('places dependencies/ at workspace root when root Cargo.toml has [workspace]', async () => {
|
|
61
|
-
const root = join(TMP, 'workspace');
|
|
62
|
-
// Root is a real Cargo workspace listing its members (Solana `programs/*`).
|
|
63
|
-
createCrate(root, '[workspace]\nresolver = "2"\nmembers = ["programs/*"]');
|
|
64
|
-
|
|
65
|
-
const programDir = join(root, 'programs', 'my_program');
|
|
66
|
-
createCrate(programDir, fixture('program-workspace-member.toml'));
|
|
67
|
-
|
|
68
|
-
const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'rbac-solana-contracts');
|
|
69
|
-
createCrate(rbacSource, fixture('minimal.toml'));
|
|
70
|
-
writeFileSync(join(rbacSource, 'package.json'), '{}');
|
|
71
|
-
|
|
72
|
-
await resolveDependencies({ cwd: root });
|
|
73
|
-
|
|
74
|
-
expect(existsSync(join(root, 'dependencies', 'rbac-solana-contracts', 'Cargo.toml'))).toBe(
|
|
75
|
-
true,
|
|
76
|
-
);
|
|
77
|
-
expect(existsSync(join(programDir, 'dependencies'))).toBe(false);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe('resolveDependencies — transitive dep rewriting', () => {
|
|
82
|
-
it('rewrites paths inside copied crates to point to flat siblings', async () => {
|
|
83
|
-
const root = join(TMP, 'transitive');
|
|
84
|
-
|
|
85
|
-
createCrate(root, fixture('program-with-deps.toml'));
|
|
86
|
-
|
|
87
|
-
// oapp depends on rbac (stale dependencies/ path from previous build)
|
|
88
|
-
const oappSource = join(root, 'node_modules', '@layerzerolabs', 'oapp-solana-contracts');
|
|
89
|
-
createCrate(oappSource, fixture('oapp-with-stale-deps.toml'));
|
|
90
|
-
writeFileSync(join(oappSource, 'package.json'), '{}');
|
|
91
|
-
|
|
92
|
-
const rbacSource = join(
|
|
93
|
-
oappSource,
|
|
94
|
-
'node_modules',
|
|
95
|
-
'@layerzerolabs',
|
|
96
|
-
'rbac-solana-contracts',
|
|
97
|
-
);
|
|
98
|
-
createCrate(rbacSource, fixture('minimal.toml'));
|
|
99
|
-
writeFileSync(join(rbacSource, 'package.json'), '{}');
|
|
100
|
-
|
|
101
|
-
await resolveDependencies({ cwd: root });
|
|
102
|
-
|
|
103
|
-
const copiedOappToml = readToml(
|
|
104
|
-
join(root, 'dependencies', 'oapp-solana-contracts', 'Cargo.toml'),
|
|
105
|
-
);
|
|
106
|
-
expect(copiedOappToml).toContain('path = "../rbac-solana-contracts"');
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it('strips root-only Cargo tables from copied dependency manifests', async () => {
|
|
110
|
-
const root = join(TMP, 'root-only-sections');
|
|
111
|
-
|
|
112
|
-
createCrate(root, fixture('program-with-deps.toml'));
|
|
113
|
-
|
|
114
|
-
const oappSource = join(root, 'node_modules', '@layerzerolabs', 'oapp-solana-contracts');
|
|
115
|
-
createCrate(oappSource, fixture('root-only-sections.toml'));
|
|
116
|
-
writeFileSync(join(oappSource, 'package.json'), '{}');
|
|
117
|
-
|
|
118
|
-
await resolveDependencies({ cwd: root });
|
|
119
|
-
|
|
120
|
-
const copiedOapp = parse(
|
|
121
|
-
readToml(join(root, 'dependencies', 'oapp-solana-contracts', 'Cargo.toml')),
|
|
122
|
-
);
|
|
123
|
-
expect(copiedOapp.package).toBeDefined();
|
|
124
|
-
expect(copiedOapp.dependencies).toBeDefined();
|
|
125
|
-
expect(copiedOapp.patch).toBeUndefined();
|
|
126
|
-
expect(copiedOapp.profile).toBeUndefined();
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe('resolveDependencies — Stellar workspace dependency vendoring', () => {
|
|
131
|
-
// Build a consumer (single crate) that path-deps into sub-crates of a
|
|
132
|
-
// protocol-stellar-v2 workspace dependency living in node_modules.
|
|
133
|
-
const setupStellarConsumer = (root: string) => {
|
|
134
|
-
createCrate(root, fixture('stellar-consumer.toml'));
|
|
135
|
-
|
|
136
|
-
const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar-v2');
|
|
137
|
-
createCrate(protocol, fixture('stellar-workspace-root.toml'));
|
|
138
|
-
writeFileSync(join(protocol, 'package.json'), '{}');
|
|
139
|
-
// members: endpoint-v2 + message-libs/* — incl. a deep inheriting member
|
|
140
|
-
createCrate(join(protocol, 'endpoint-v2'), fixture('stellar-member-inheriting.toml'));
|
|
141
|
-
createCrate(
|
|
142
|
-
join(protocol, 'message-libs', 'message-lib-common'),
|
|
143
|
-
fixture('stellar-member-inheriting.toml'),
|
|
144
|
-
);
|
|
145
|
-
createCrate(
|
|
146
|
-
join(protocol, 'message-libs', 'simple-message-lib'),
|
|
147
|
-
fixture('stellar-member-inheriting.toml'),
|
|
148
|
-
);
|
|
149
|
-
return protocol;
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
it('copies the whole workspace tree, including deeply nested members', async () => {
|
|
153
|
-
const root = join(TMP, 'stellar-consumer');
|
|
154
|
-
setupStellarConsumer(root);
|
|
155
|
-
|
|
156
|
-
await resolveDependencies({ cwd: root });
|
|
157
|
-
|
|
158
|
-
const vendored = join(root, 'dependencies', 'protocol-stellar-v2');
|
|
159
|
-
expect(existsSync(join(vendored, 'Cargo.toml'))).toBe(true);
|
|
160
|
-
expect(existsSync(join(vendored, 'endpoint-v2', 'Cargo.toml'))).toBe(true);
|
|
161
|
-
// the deep member — the case the old one-level scan missed
|
|
162
|
-
expect(existsSync(join(vendored, 'message-libs', 'simple-message-lib', 'Cargo.toml'))).toBe(
|
|
163
|
-
true,
|
|
164
|
-
);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('preserves the [workspace] root manifest so member inheritance still resolves', async () => {
|
|
168
|
-
const root = join(TMP, 'stellar-preserve-ws');
|
|
169
|
-
setupStellarConsumer(root);
|
|
170
|
-
|
|
171
|
-
await resolveDependencies({ cwd: root });
|
|
172
|
-
|
|
173
|
-
const vendoredRoot = readToml(
|
|
174
|
-
join(root, 'dependencies', 'protocol-stellar-v2', 'Cargo.toml'),
|
|
175
|
-
);
|
|
176
|
-
// The root-only-table strip MUST be skipped for a vendored workspace root.
|
|
177
|
-
expect(vendoredRoot).toContain('[workspace]');
|
|
178
|
-
expect(vendoredRoot).toContain('[workspace.package]');
|
|
179
|
-
expect(vendoredRoot).toContain('[workspace.dependencies]');
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('leaves the consumer manifest untouched (it already points at dependencies/)', async () => {
|
|
183
|
-
const root = join(TMP, 'stellar-consumer-manifest');
|
|
184
|
-
setupStellarConsumer(root);
|
|
185
|
-
const original = readToml(join(root, 'Cargo.toml'));
|
|
186
|
-
|
|
187
|
-
await resolveDependencies({ cwd: root });
|
|
188
|
-
|
|
189
|
-
// Like Solana, the resolver only fills dependencies/; the consumer's own
|
|
190
|
-
// Cargo.toml (already pointing at dependencies/...) is the source of truth.
|
|
191
|
-
expect(readToml(join(root, 'Cargo.toml'))).toBe(original);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('vendors the deep member the consumer path-deps into', async () => {
|
|
195
|
-
const root = join(TMP, 'stellar-deep-member');
|
|
196
|
-
setupStellarConsumer(root);
|
|
197
|
-
|
|
198
|
-
await resolveDependencies({ cwd: root });
|
|
199
|
-
|
|
200
|
-
// The consumer's `path = "dependencies/protocol-stellar-v2/message-libs/simple-message-lib"`
|
|
201
|
-
// resolves because that crate was vendored at exactly that location.
|
|
202
|
-
expect(
|
|
203
|
-
existsSync(
|
|
204
|
-
join(
|
|
205
|
-
root,
|
|
206
|
-
'dependencies',
|
|
207
|
-
'protocol-stellar-v2',
|
|
208
|
-
'message-libs',
|
|
209
|
-
'simple-message-lib',
|
|
210
|
-
'Cargo.toml',
|
|
211
|
-
),
|
|
212
|
-
),
|
|
213
|
-
).toBe(true);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('rewrites arbitrary-depth paths inside a vendored oft-core crate', async () => {
|
|
217
|
-
const root = join(TMP, 'stellar-oft-core-deep-paths');
|
|
218
|
-
createCrate(root, fixture('program-with-deps.toml'));
|
|
219
|
-
|
|
220
|
-
const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar-v2');
|
|
221
|
-
createCrate(protocol, fixture('stellar-workspace-root.toml'));
|
|
222
|
-
writeFileSync(join(protocol, 'package.json'), '{}');
|
|
223
|
-
createCrate(join(protocol, 'endpoint-v2'), fixture('minimal.toml'));
|
|
224
|
-
createCrate(join(protocol, 'message-libs', 'simple-message-lib'), fixture('minimal.toml'));
|
|
225
|
-
createCrate(join(protocol, 'message-libs', 'message-lib-common'), fixture('minimal.toml'));
|
|
226
|
-
|
|
227
|
-
const oftCore = join(root, 'node_modules', '@layerzerolabs', 'oft-core-stellar-contracts');
|
|
228
|
-
createCrate(oftCore, fixture('oft-core-with-stale-deep-deps.toml'));
|
|
229
|
-
writeFileSync(join(oftCore, 'package.json'), '{}');
|
|
230
|
-
|
|
231
|
-
await resolveDependencies({ cwd: root });
|
|
232
|
-
|
|
233
|
-
const copiedOftCore = readToml(
|
|
234
|
-
join(root, 'dependencies', 'oft-core-stellar-contracts', 'Cargo.toml'),
|
|
235
|
-
);
|
|
236
|
-
expect(copiedOftCore).toContain(
|
|
237
|
-
'path = "../protocol-stellar-v2/message-libs/simple-message-lib"',
|
|
238
|
-
);
|
|
239
|
-
expect(copiedOftCore).toContain(
|
|
240
|
-
'path = "../protocol-stellar-v2/message-libs/message-lib-common"',
|
|
241
|
-
);
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
describe('resolveDependencies — production npm dependency closure', () => {
|
|
246
|
-
const writePkgJson = (dir: string, deps: Record<string, string>) => {
|
|
247
|
-
writeFileSync(
|
|
248
|
-
join(dir, 'package.json'),
|
|
249
|
-
JSON.stringify({ name: 'fixture', version: '0.0.0', dependencies: deps }),
|
|
250
|
-
);
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
const setupOappProductionLayout = (root: string) => {
|
|
254
|
-
createCrate(root, fixture('stellar-consumer.toml'));
|
|
255
|
-
writePkgJson(root, {
|
|
256
|
-
'@layerzerolabs/protocol-stellar-v2': '*',
|
|
257
|
-
'@layerzerolabs/common-utils-stellar-contracts': '*',
|
|
258
|
-
'@layerzerolabs/common-utils-macros-stellar-contracts': '*',
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar-v2');
|
|
262
|
-
createCrate(protocol, fixture('stellar-workspace-root.toml'));
|
|
263
|
-
writePkgJson(protocol, {
|
|
264
|
-
'@layerzerolabs/common-utils-stellar-contracts': '*',
|
|
265
|
-
});
|
|
266
|
-
createCrate(join(protocol, 'endpoint-v2'), fixture('minimal.toml'));
|
|
267
|
-
createCrate(join(protocol, 'message-libs', 'simple-message-lib'), fixture('minimal.toml'));
|
|
268
|
-
|
|
269
|
-
const utils = join(
|
|
270
|
-
root,
|
|
271
|
-
'node_modules',
|
|
272
|
-
'@layerzerolabs',
|
|
273
|
-
'common-utils-stellar-contracts',
|
|
274
|
-
);
|
|
275
|
-
createCrate(utils, fixture('minimal.toml'));
|
|
276
|
-
writePkgJson(utils, {
|
|
277
|
-
'@layerzerolabs/common-utils-macros-stellar-contracts': '*',
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
// Sibling proc-macro package (published separately from common-utils).
|
|
281
|
-
const macros = join(
|
|
282
|
-
root,
|
|
283
|
-
'node_modules',
|
|
284
|
-
'@layerzerolabs',
|
|
285
|
-
'common-utils-macros-stellar-contracts',
|
|
286
|
-
);
|
|
287
|
-
createCrate(macros, fixture('minimal.toml'));
|
|
288
|
-
writePkgJson(macros, {});
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
it('vendors the full production closure reachable through npm dependencies only', async () => {
|
|
292
|
-
const root = join(TMP, 'production-closure');
|
|
293
|
-
setupOappProductionLayout(root);
|
|
294
|
-
|
|
295
|
-
await resolveDependencies({ cwd: root });
|
|
296
|
-
|
|
297
|
-
expect(existsSync(join(root, 'dependencies', 'protocol-stellar-v2', 'Cargo.toml'))).toBe(
|
|
298
|
-
true,
|
|
299
|
-
);
|
|
300
|
-
expect(
|
|
301
|
-
existsSync(join(root, 'dependencies', 'common-utils-stellar-contracts', 'Cargo.toml')),
|
|
302
|
-
).toBe(true);
|
|
303
|
-
expect(
|
|
304
|
-
existsSync(
|
|
305
|
-
join(root, 'dependencies', 'common-utils-macros-stellar-contracts', 'Cargo.toml'),
|
|
306
|
-
),
|
|
307
|
-
).toBe(true);
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
it('does not vendor crates that exist only as npm devDependencies', async () => {
|
|
311
|
-
const root = join(TMP, 'production-missing-devdep');
|
|
312
|
-
createCrate(root, fixture('stellar-consumer.toml'));
|
|
313
|
-
writeFileSync(
|
|
314
|
-
join(root, 'package.json'),
|
|
315
|
-
JSON.stringify({
|
|
316
|
-
name: 'oapp-stellar-contracts',
|
|
317
|
-
version: '0.0.0',
|
|
318
|
-
dependencies: {
|
|
319
|
-
'@layerzerolabs/protocol-stellar-v2': '*',
|
|
320
|
-
},
|
|
321
|
-
devDependencies: {
|
|
322
|
-
'@layerzerolabs/common-utils-stellar-contracts': '*',
|
|
323
|
-
},
|
|
324
|
-
}),
|
|
325
|
-
);
|
|
326
|
-
|
|
327
|
-
const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar-v2');
|
|
328
|
-
createCrate(protocol, fixture('stellar-workspace-root.toml'));
|
|
329
|
-
writePkgJson(protocol, {});
|
|
330
|
-
createCrate(join(protocol, 'endpoint-v2'), fixture('minimal.toml'));
|
|
331
|
-
createCrate(join(protocol, 'message-libs', 'simple-message-lib'), fixture('minimal.toml'));
|
|
332
|
-
|
|
333
|
-
await resolveDependencies({ cwd: root });
|
|
334
|
-
|
|
335
|
-
expect(existsSync(join(root, 'dependencies', 'protocol-stellar-v2', 'Cargo.toml'))).toBe(
|
|
336
|
-
true,
|
|
337
|
-
);
|
|
338
|
-
expect(
|
|
339
|
-
existsSync(join(root, 'dependencies', 'common-utils-stellar-contracts', 'Cargo.toml')),
|
|
340
|
-
).toBe(false);
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
describe('resolveDependencies — prune excluded workspace members', () => {
|
|
345
|
-
// A vendored workspace whose root manifest lists a literal member under an
|
|
346
|
-
// excluded dir (tests/mock_vault). The tests/ subtree is never copied, so the
|
|
347
|
-
// dangling member must be pruned from the preserved manifest — else cargo fails
|
|
348
|
-
// loading a missing workspace member.
|
|
349
|
-
const setupConsumerWithTestMember = (root: string) => {
|
|
350
|
-
createCrate(root, fixture('stellar-consumer.toml'));
|
|
351
|
-
|
|
352
|
-
const protocol = join(root, 'node_modules', '@layerzerolabs', 'protocol-stellar-v2');
|
|
353
|
-
createCrate(protocol, fixture('stellar-workspace-with-tests.toml'));
|
|
354
|
-
writeFileSync(join(protocol, 'package.json'), '{}');
|
|
355
|
-
createCrate(join(protocol, 'endpoint-v2'), fixture('stellar-member-inheriting.toml'));
|
|
356
|
-
// Consumer also path-deps into message-libs; create a stub so the layout is complete.
|
|
357
|
-
createCrate(join(protocol, 'message-libs', 'simple-message-lib'), fixture('minimal.toml'));
|
|
358
|
-
|
|
359
|
-
// The excluded test member + extra files — none of this should be vendored.
|
|
360
|
-
const mock = join(protocol, 'tests', 'mock_vault');
|
|
361
|
-
createCrate(mock, '[package]\nname = "mock_vault"\nversion = "0.0.0"\nedition = "2021"');
|
|
362
|
-
writeFileSync(join(protocol, 'tests', 'integration.rs'), '// must NOT be vendored');
|
|
363
|
-
return protocol;
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
it('drops the excluded member from the preserved root manifest, keeps real members', async () => {
|
|
367
|
-
const root = join(TMP, 'prune-member');
|
|
368
|
-
setupConsumerWithTestMember(root);
|
|
369
|
-
|
|
370
|
-
await resolveDependencies({ cwd: root });
|
|
371
|
-
|
|
372
|
-
const vendoredRoot = readToml(
|
|
373
|
-
join(root, 'dependencies', 'protocol-stellar-v2', 'Cargo.toml'),
|
|
374
|
-
);
|
|
375
|
-
// The dangling test member is gone...
|
|
376
|
-
expect(vendoredRoot).not.toContain('tests/mock_vault');
|
|
377
|
-
// ...but the workspace table and real members/globs remain intact.
|
|
378
|
-
expect(vendoredRoot).toContain('[workspace]');
|
|
379
|
-
expect(vendoredRoot).toContain('endpoint-v2');
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
it('does not vendor the excluded subtree at all', async () => {
|
|
383
|
-
const root = join(TMP, 'prune-no-tests');
|
|
384
|
-
setupConsumerWithTestMember(root);
|
|
385
|
-
|
|
386
|
-
await resolveDependencies({ cwd: root });
|
|
387
|
-
|
|
388
|
-
const vendored = join(root, 'dependencies', 'protocol-stellar-v2');
|
|
389
|
-
expect(existsSync(join(vendored, 'tests'))).toBe(false);
|
|
390
|
-
// real members are still vendored
|
|
391
|
-
expect(existsSync(join(vendored, 'endpoint-v2', 'Cargo.toml'))).toBe(true);
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
describe('resolveDependencies — excludes integration test dirs from vendored crates', () => {
|
|
396
|
-
// Mirrors the real oft-core → oft leak: a vendored dependency carries
|
|
397
|
-
// integration-tests/ source that is compiled only under #[cfg(test)] (via a
|
|
398
|
-
// #[path] mod). Left in dependencies/ it would never build but would enter the
|
|
399
|
-
// consumer's snapshot + verifiable source zip, coupling test churn to a deployed
|
|
400
|
-
// contract's source_sha256. It must be pruned like the existing tests/ exclusion.
|
|
401
|
-
it('does not vendor integration-tests/ or integration_tests/ subtrees', async () => {
|
|
402
|
-
const root = join(TMP, 'exclude-integration-tests');
|
|
403
|
-
createCrate(root, fixture('program-with-deps.toml'));
|
|
404
|
-
|
|
405
|
-
const dep = join(root, 'node_modules', '@layerzerolabs', 'rbac-solana-contracts');
|
|
406
|
-
createCrate(dep, fixture('minimal.toml'));
|
|
407
|
-
writeFileSync(join(dep, 'package.json'), '{}');
|
|
408
|
-
// Both spellings are used across the stellar contracts (hyphen: oft/oft-core;
|
|
409
|
-
// underscore: omni-counter).
|
|
410
|
-
for (const dir of ['integration-tests', 'integration_tests']) {
|
|
411
|
-
mkdirSync(join(dep, dir), { recursive: true });
|
|
412
|
-
writeFileSync(join(dep, dir, 'mod.rs'), '// must NOT be vendored');
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
await resolveDependencies({ cwd: root });
|
|
416
|
-
|
|
417
|
-
const vendored = join(root, 'dependencies', 'rbac-solana-contracts');
|
|
418
|
-
expect(existsSync(join(vendored, 'src', 'lib.rs'))).toBe(true);
|
|
419
|
-
expect(existsSync(join(vendored, 'integration-tests'))).toBe(false);
|
|
420
|
-
expect(existsSync(join(vendored, 'integration_tests'))).toBe(false);
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
describe('resolveDependencies — single-crate consumer (no [workspace])', () => {
|
|
425
|
-
it('places dependencies/ next to the crate Cargo.toml', async () => {
|
|
426
|
-
const root = join(TMP, 'leaf-consumer');
|
|
427
|
-
createCrate(root, fixture('program-with-deps.toml')); // bare [package], no [workspace]
|
|
428
|
-
|
|
429
|
-
const rbacSource = join(root, 'node_modules', '@layerzerolabs', 'rbac-solana-contracts');
|
|
430
|
-
createCrate(rbacSource, fixture('minimal.toml'));
|
|
431
|
-
writeFileSync(join(rbacSource, 'package.json'), '{}');
|
|
432
|
-
|
|
433
|
-
await resolveDependencies({ cwd: root });
|
|
434
|
-
|
|
435
|
-
expect(existsSync(join(root, 'dependencies', 'rbac-solana-contracts', 'Cargo.toml'))).toBe(
|
|
436
|
-
true,
|
|
437
|
-
);
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
|
|
441
|
-
describe('resolveDependencies — error handling', () => {
|
|
442
|
-
it('throws when --cargo-dir does not contain Cargo.toml', async () => {
|
|
443
|
-
const root = join(TMP, 'bad-cargo-dir');
|
|
444
|
-
mkdirSync(join(root, 'programs', 'nope'), { recursive: true });
|
|
445
|
-
|
|
446
|
-
await expect(resolveDependencies({ cwd: root, cargoDir: 'programs/nope' })).rejects.toThrow(
|
|
447
|
-
'does not contain a Cargo.toml',
|
|
448
|
-
);
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
describe('empty node_modules does not change dependencies state', () => {
|
|
452
|
-
const root = join(TMP, 'empty');
|
|
453
|
-
beforeEach(() => {
|
|
454
|
-
createCrate(root, fixture('minimal.toml'));
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
it('dependencies does not exist', async () => {
|
|
458
|
-
await resolveDependencies({ cwd: root });
|
|
459
|
-
expect(existsSync(join(root, 'dependencies'))).toBe(false);
|
|
460
|
-
});
|
|
461
|
-
|
|
462
|
-
it('dependencies already exists', async () => {
|
|
463
|
-
mkdirSync(join(root, 'dependencies'), { recursive: true });
|
|
464
|
-
await resolveDependencies({ cwd: root });
|
|
465
|
-
expect(existsSync(join(root, 'dependencies'))).toBe(true);
|
|
466
|
-
});
|
|
467
|
-
});
|
|
468
|
-
});
|