Skip to content

Commit bb2fe46

Browse files
committed
fix IPFS deployer subdirectory duplication issue, refactor IPFS deployer to be unit-testable
1 parent 796a880 commit bb2fe46

9 files changed

Lines changed: 119 additions & 84 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { GetPathToCliTestFiles } from "@polywrap/test-cases";
2+
import { readDirContents } from "../../lib/defaults/deploy-modules/ipfs/utils";
3+
import path from "path";
4+
5+
describe("IPFS Deployer", () => {
6+
const sampleBuildDir = path.join(
7+
GetPathToCliTestFiles(),
8+
"lib",
9+
"deployers",
10+
"mock-build-output"
11+
);
12+
13+
it("properly reads build dir contents and builds out an IPFS-compatible directory entry", async () => {
14+
const dirents = await readDirContents(sampleBuildDir, "");
15+
16+
expect(dirents).toMatchObject({
17+
name: "",
18+
files: [{ name: "wrap.info" }, { name: "wrap.wasm" }],
19+
directories: [
20+
{
21+
name: "docs",
22+
files: [{ name: "polywrap.docs.json" }],
23+
directories: [
24+
{
25+
name: "pages",
26+
files: [{ name: "readme.md" }],
27+
},
28+
],
29+
},
30+
],
31+
});
32+
});
33+
});

packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,12 @@ import { Uri } from "@polywrap/core-js";
44
import { PolywrapClient } from "@polywrap/client-js";
55
import * as Sys from "@polywrap/sys-config-bundle-js";
66
import { PolywrapClientConfigBuilder } from "@polywrap/client-config-builder-js";
7-
import fs from "fs";
7+
import { AddResult, ArgsAddDir, DirectoryEntry } from "./types";
8+
import { readDirContents } from "./utils";
89

910
const isValidUri = (uri: Uri) =>
1011
uri.authority === "fs" || uri.authority === "file";
1112

12-
interface FileEntry {
13-
name: string;
14-
data: Uint8Array;
15-
}
16-
17-
interface DirectoryEntry {
18-
name: string;
19-
directories?: DirectoryEntry[];
20-
files?: FileEntry[];
21-
}
22-
23-
interface AddOptions {
24-
pin?: boolean;
25-
onlyHash?: boolean;
26-
wrapWithDirectory?: boolean;
27-
}
28-
29-
interface AddResult {
30-
name: string;
31-
hash: string;
32-
size: string;
33-
}
34-
35-
interface ArgsAddDir {
36-
data: DirectoryEntry;
37-
ipfsProvider: string;
38-
timeout?: number;
39-
addOptions?: AddOptions;
40-
}
41-
42-
const readDirContents = async (
43-
path: string,
44-
dirName: string
45-
): Promise<DirectoryEntry> => {
46-
const dirents: fs.Dirent[] = await fs.promises.readdir(path, {
47-
withFileTypes: true,
48-
});
49-
const data: DirectoryEntry = { name: dirName };
50-
51-
for (const dirent of dirents) {
52-
if (dirent.isDirectory()) {
53-
const subDir = await readDirContents(
54-
`${path}/${dirent.name}`,
55-
`${dirName}/${dirent.name}`
56-
);
57-
data.directories = data.directories ?? [];
58-
data.directories?.push(subDir);
59-
} else {
60-
const fileData = await fs.promises.readFile(`${path}/${dirent.name}`);
61-
data.files = data.files ?? [];
62-
data.files?.push({
63-
name: dirent.name,
64-
data: fileData,
65-
});
66-
}
67-
}
68-
69-
return data;
70-
};
71-
7213
class IPFSDeployer implements DeployModule {
7314
async execute(uri: Uri, config?: { gatewayUri: string }): Promise<Uri> {
7415
if (!isValidUri(uri)) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
export interface FileEntry {
2+
name: string;
3+
data: Uint8Array;
4+
}
5+
6+
export interface DirectoryEntry {
7+
name: string;
8+
directories?: DirectoryEntry[];
9+
files?: FileEntry[];
10+
}
11+
12+
export interface AddOptions {
13+
pin?: boolean;
14+
onlyHash?: boolean;
15+
wrapWithDirectory?: boolean;
16+
}
17+
18+
export interface AddResult {
19+
name: string;
20+
hash: string;
21+
size: string;
22+
}
23+
24+
export interface ArgsAddDir {
25+
data: DirectoryEntry;
26+
ipfsProvider: string;
27+
timeout?: number;
28+
addOptions?: AddOptions;
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { DirectoryEntry } from "./types";
2+
import fs from "fs";
3+
4+
export const readDirContents = async (
5+
path: string,
6+
dirName: string
7+
): Promise<DirectoryEntry> => {
8+
const dirents: fs.Dirent[] = await fs.promises.readdir(path, {
9+
withFileTypes: true,
10+
});
11+
const data: DirectoryEntry = { name: dirName };
12+
13+
for (const dirent of dirents) {
14+
if (dirent.isDirectory()) {
15+
const subDir = await readDirContents(
16+
`${path}/${dirent.name}`,
17+
`${dirent.name}`
18+
);
19+
data.directories = data.directories ?? [];
20+
data.directories?.push(subDir);
21+
} else {
22+
const fileData = await fs.promises.readFile(`${path}/${dirent.name}`);
23+
data.files = data.files ?? [];
24+
data.files?.push({
25+
name: dirent.name,
26+
data: fileData,
27+
});
28+
}
29+
}
30+
31+
return data;
32+
};

packages/test-cases/cases/cli/lib/deployers/mock-build-output/docs/pages/readme.md

Whitespace-only changes.

packages/test-cases/cases/cli/lib/deployers/mock-build-output/docs/polywrap.docs.json

Whitespace-only changes.

packages/test-cases/cases/cli/lib/deployers/mock-build-output/wrap.info

Whitespace-only changes.

packages/test-cases/cases/cli/lib/deployers/mock-build-output/wrap.wasm

Whitespace-only changes.

yarn.lock

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3370,13 +3370,13 @@ browser-process-hrtime@^1.0.0:
33703370
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
33713371

33723372
browserslist@^4.21.9:
3373-
version "4.21.9"
3374-
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
3375-
integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
3373+
version "4.21.10"
3374+
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0"
3375+
integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==
33763376
dependencies:
3377-
caniuse-lite "^1.0.30001503"
3378-
electron-to-chromium "^1.4.431"
3379-
node-releases "^2.0.12"
3377+
caniuse-lite "^1.0.30001517"
3378+
electron-to-chromium "^1.4.477"
3379+
node-releases "^2.0.13"
33803380
update-browserslist-db "^1.0.11"
33813381

33823382
bs-logger@0.x:
@@ -3507,10 +3507,10 @@ camelcase@^6.0.0:
35073507
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
35083508
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
35093509

3510-
caniuse-lite@^1.0.30001503:
3511-
version "1.0.30001517"
3512-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8"
3513-
integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==
3510+
caniuse-lite@^1.0.30001517:
3511+
version "1.0.30001518"
3512+
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz#b3ca93904cb4699c01218246c4d77a71dbe97150"
3513+
integrity sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==
35143514

35153515
capture-exit@^2.0.0:
35163516
version "2.0.0"
@@ -4284,10 +4284,10 @@ ecc-jsbn@~0.1.1:
42844284
jsbn "~0.1.0"
42854285
safer-buffer "^2.1.0"
42864286

4287-
electron-to-chromium@^1.4.431:
4288-
version "1.4.473"
4289-
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz#4853de13a335c70fe1f9df8d4029be54068767d1"
4290-
integrity sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA==
4287+
electron-to-chromium@^1.4.477:
4288+
version "1.4.480"
4289+
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.480.tgz#40e32849ca50bc23ce29c1516c5adb3fddac919d"
4290+
integrity sha512-IXTgg+bITkQv/FLP9FjX6f9KFCs5hQWeh5uNSKxB9mqYj/JXhHDbu+ekS43LVvbkL3eW6/oZy4+r9Om6lan1Uw==
42914291

42924292
elliptic@6.5.4:
42934293
version "6.5.4"
@@ -4332,9 +4332,9 @@ end-of-stream@^1.1.0:
43324332
once "^1.4.0"
43334333

43344334
enquirer@^2.3.5:
4335-
version "2.4.0"
4336-
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.0.tgz#4f36f6c644137cc4fd2891da407ede2b1fea904a"
4337-
integrity sha512-ehu97t6FTYK2I3ZYtnp0BZ9vt0mvEL/cnHBds7Ct6jo9VX1VIkiFhOvVRWh6eblQqd7KOoICIQV+syZ3neXO/Q==
4335+
version "2.4.1"
4336+
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
4337+
integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
43384338
dependencies:
43394339
ansi-colors "^4.1.1"
43404340
strip-ansi "^6.0.1"
@@ -5353,12 +5353,12 @@ growly@^1.3.0:
53535353
integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==
53545354

53555355
handlebars@^4.7.7:
5356-
version "4.7.7"
5357-
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
5358-
integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
5356+
version "4.7.8"
5357+
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9"
5358+
integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==
53595359
dependencies:
53605360
minimist "^1.2.5"
5361-
neo-async "^2.6.0"
5361+
neo-async "^2.6.2"
53625362
source-map "^0.6.1"
53635363
wordwrap "^1.0.0"
53645364
optionalDependencies:
@@ -7415,7 +7415,7 @@ negotiator@^0.6.2:
74157415
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
74167416
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
74177417

7418-
neo-async@^2.6.0:
7418+
neo-async@^2.6.2:
74197419
version "2.6.2"
74207420
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
74217421
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
@@ -7487,7 +7487,7 @@ node-notifier@^8.0.0:
74877487
uuid "^8.3.0"
74887488
which "^2.0.2"
74897489

7490-
node-releases@^2.0.12:
7490+
node-releases@^2.0.13:
74917491
version "2.0.13"
74927492
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
74937493
integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==

0 commit comments

Comments
 (0)