@loadnetwork/permaweb-deploy 2.5.1-loadnetwork.0
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/LICENSE +21 -0
- package/README.md +581 -0
- package/bin/dev.js +5 -0
- package/bin/run.js +5 -0
- package/dist/commands/deploy.js +384 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/constants/flags.js +195 -0
- package/dist/constants/flags.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/arns.js +89 -0
- package/dist/prompts/arns.js.map +1 -0
- package/dist/prompts/deployment.js +27 -0
- package/dist/prompts/deployment.js.map +1 -0
- package/dist/prompts/wallet.js +51 -0
- package/dist/prompts/wallet.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +9 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/constants/flags.d.ts +96 -0
- package/dist/src/constants/flags.d.ts.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/prompts/arns.d.ts +13 -0
- package/dist/src/prompts/arns.d.ts.map +1 -0
- package/dist/src/prompts/deployment.d.ts +6 -0
- package/dist/src/prompts/deployment.d.ts.map +1 -0
- package/dist/src/prompts/wallet.d.ts +11 -0
- package/dist/src/prompts/wallet.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +31 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/utils/__tests__/constants.test.d.ts +2 -0
- package/dist/src/utils/__tests__/constants.test.d.ts.map +1 -0
- package/dist/src/utils/config-resolver.d.ts +72 -0
- package/dist/src/utils/config-resolver.d.ts.map +1 -0
- package/dist/src/utils/constants.d.ts +4 -0
- package/dist/src/utils/constants.d.ts.map +1 -0
- package/dist/src/utils/path.d.ts +5 -0
- package/dist/src/utils/path.d.ts.map +1 -0
- package/dist/src/utils/signer.d.ts +17 -0
- package/dist/src/utils/signer.d.ts.map +1 -0
- package/dist/src/utils/uploader.d.ts +8 -0
- package/dist/src/utils/uploader.d.ts.map +1 -0
- package/dist/src/utils/validators.d.ts +29 -0
- package/dist/src/utils/validators.d.ts.map +1 -0
- package/dist/tests/constants.d.ts +11 -0
- package/dist/tests/constants.d.ts.map +1 -0
- package/dist/tests/e2e/deploy-command.test.d.ts +2 -0
- package/dist/tests/e2e/deploy-command.test.d.ts.map +1 -0
- package/dist/tests/global-setup.d.ts +6 -0
- package/dist/tests/global-setup.d.ts.map +1 -0
- package/dist/tests/mocks/turbo-handlers.d.ts +105 -0
- package/dist/tests/mocks/turbo-handlers.d.ts.map +1 -0
- package/dist/tests/setup.d.ts +11 -0
- package/dist/tests/setup.d.ts.map +1 -0
- package/dist/tests/types/payment-service.d.ts +218 -0
- package/dist/tests/types/payment-service.d.ts.map +1 -0
- package/dist/tests/types/upload-service.d.ts +168 -0
- package/dist/tests/types/upload-service.d.ts.map +1 -0
- package/dist/tests/unit/validators.test.d.ts +2 -0
- package/dist/tests/unit/validators.test.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config-resolver.js +39 -0
- package/dist/utils/config-resolver.js.map +1 -0
- package/dist/utils/constants.js +6 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/path.js +15 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/signer.js +40 -0
- package/dist/utils/signer.js.map +1 -0
- package/dist/utils/uploader.js +86 -0
- package/dist/utils/uploader.js.map +1 -0
- package/dist/utils/validators.js +62 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ArweaveSigner } from '@ar.io/sdk';
|
|
2
|
+
import { EthereumSigner } from '@ardrive/turbo-sdk';
|
|
3
|
+
|
|
4
|
+
function createSigner(sigType, deployKey) {
|
|
5
|
+
switch (sigType) {
|
|
6
|
+
case "ethereum": {
|
|
7
|
+
return {
|
|
8
|
+
signer: new EthereumSigner(deployKey),
|
|
9
|
+
token: "ethereum"
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
case "polygon": {
|
|
13
|
+
return {
|
|
14
|
+
signer: new EthereumSigner(deployKey),
|
|
15
|
+
token: "pol"
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
case "arweave": {
|
|
19
|
+
const jwk = JSON.parse(Buffer.from(deployKey, "base64").toString("utf8"));
|
|
20
|
+
return {
|
|
21
|
+
signer: new ArweaveSigner(jwk),
|
|
22
|
+
token: "arweave"
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
case "kyve": {
|
|
26
|
+
return {
|
|
27
|
+
signer: new EthereumSigner(deployKey),
|
|
28
|
+
token: "kyve"
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
default: {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Invalid sig-type provided: ${sigType}. Allowed values are 'arweave', 'ethereum', 'polygon', or 'kyve'.`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { createSigner };
|
|
40
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sources":["../../src/utils/signer.ts"],"sourcesContent":["import { ArweaveSigner } from '@ar.io/sdk'\nimport { EthereumSigner } from '@ardrive/turbo-sdk'\n\nimport type { SignerType } from '../types/index.js'\n\nexport function createSigner(sigType: SignerType, deployKey: string) {\n switch (sigType) {\n case 'ethereum': {\n return {\n signer: new EthereumSigner(deployKey),\n token: 'ethereum' as const,\n }\n }\n\n case 'polygon': {\n return {\n signer: new EthereumSigner(deployKey),\n token: 'pol' as const,\n }\n }\n\n case 'arweave': {\n const jwk = JSON.parse(Buffer.from(deployKey, 'base64').toString('utf8'))\n return {\n signer: new ArweaveSigner(jwk),\n token: 'arweave' as const,\n }\n }\n\n case 'kyve': {\n return {\n signer: new EthereumSigner(deployKey),\n token: 'kyve' as const,\n }\n }\n\n default: {\n throw new Error(\n `Invalid sig-type provided: ${sigType}. Allowed values are 'arweave', 'ethereum', 'polygon', or 'kyve'.`,\n )\n }\n }\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,YAAA,CAAa,SAAqB,SAAA,EAAmB;AACnE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,UAAA,EAAY;AACf,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAI,cAAA,CAAe,SAAS,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAI,cAAA,CAAe,SAAS,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,WAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACxE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAI,aAAA,CAAc,GAAG,CAAA;AAAA,QAC7B,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAI,cAAA,CAAe,SAAS,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,IAEA,SAAS;AACP,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,8BAA8B,OAAO,CAAA,iEAAA;AAAA,OACvC;AAAA,IACF;AAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import * as mime from 'mime-types';
|
|
3
|
+
|
|
4
|
+
async function uploadFile(turbo, filePath, options) {
|
|
5
|
+
const mimeType = mime.lookup(filePath) || "application/octet-stream";
|
|
6
|
+
const uploadResult = await turbo.uploadFile({
|
|
7
|
+
dataItemOpts: {
|
|
8
|
+
tags: [
|
|
9
|
+
{
|
|
10
|
+
name: "App-Name",
|
|
11
|
+
value: "Permaweb-Deploy"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "anchor",
|
|
15
|
+
value: (/* @__PURE__ */ new Date()).toISOString()
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "Content-Type",
|
|
19
|
+
value: mimeType
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "Variant",
|
|
23
|
+
value: "Load-Network"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
file: filePath,
|
|
28
|
+
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
29
|
+
});
|
|
30
|
+
return uploadResult.id;
|
|
31
|
+
}
|
|
32
|
+
async function uploadFolder(turbo, folderPath, options) {
|
|
33
|
+
const uploadResult = await turbo.uploadFolder({
|
|
34
|
+
dataItemOpts: {
|
|
35
|
+
tags: [
|
|
36
|
+
{
|
|
37
|
+
name: "App-Name",
|
|
38
|
+
value: "Permaweb-Deploy"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "anchor",
|
|
42
|
+
value: (/* @__PURE__ */ new Date()).toISOString()
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "Variant",
|
|
46
|
+
value: "Load-Network"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
folderPath,
|
|
51
|
+
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
52
|
+
});
|
|
53
|
+
let txOrManifestId = uploadResult.manifestResponse?.id;
|
|
54
|
+
const origPaths = uploadResult.manifest?.paths || {};
|
|
55
|
+
const newPaths = {};
|
|
56
|
+
let replaceManifest = false;
|
|
57
|
+
for (const [key, value] of Object.entries(origPaths)) {
|
|
58
|
+
newPaths[key] = value;
|
|
59
|
+
if (key.endsWith("/index.html")) {
|
|
60
|
+
const newKey = key.replace(/\/index\.html$/, "");
|
|
61
|
+
newPaths[newKey] = value;
|
|
62
|
+
replaceManifest = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (replaceManifest && uploadResult.manifest) {
|
|
66
|
+
console.info("Replacing manifest to support directory indexes");
|
|
67
|
+
const newManifest = { ...uploadResult.manifest, paths: newPaths };
|
|
68
|
+
const buffer = Buffer.from(JSON.stringify(newManifest));
|
|
69
|
+
const { id } = await turbo.uploadFile({
|
|
70
|
+
dataItemOpts: {
|
|
71
|
+
tags: [{ name: "Content-Type", value: "application/x.arweave-manifest+json" }]
|
|
72
|
+
},
|
|
73
|
+
fileSizeFactory: () => buffer.length,
|
|
74
|
+
fileStreamFactory: () => Readable.from(buffer),
|
|
75
|
+
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
76
|
+
});
|
|
77
|
+
txOrManifestId = id;
|
|
78
|
+
}
|
|
79
|
+
if (!txOrManifestId) {
|
|
80
|
+
throw new Error("Failed to upload folder");
|
|
81
|
+
}
|
|
82
|
+
return txOrManifestId;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { uploadFile, uploadFolder };
|
|
86
|
+
//# sourceMappingURL=uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.js","sources":["../../src/utils/uploader.ts"],"sourcesContent":["import { Readable } from 'node:stream'\n\nimport { OnDemandFunding, type TurboAuthenticatedClient } from '@ardrive/turbo-sdk'\nimport * as mime from 'mime-types'\n\nexport async function uploadFile(\n turbo: TurboAuthenticatedClient,\n filePath: string,\n options?: {\n fundingMode?: OnDemandFunding\n },\n): Promise<string> {\n const mimeType = mime.lookup(filePath) || 'application/octet-stream'\n\n const uploadResult = await turbo.uploadFile({\n dataItemOpts: {\n tags: [\n {\n name: 'App-Name',\n value: 'Permaweb-Deploy',\n },\n {\n name: 'anchor',\n value: new Date().toISOString(),\n },\n {\n name: 'Content-Type',\n value: mimeType,\n },\n {\n name: 'Variant',\n value: 'Load-Network'\n }\n ],\n },\n file: filePath,\n ...(options?.fundingMode && { fundingMode: options.fundingMode }),\n })\n\n return uploadResult.id\n}\n\nexport async function uploadFolder(\n turbo: TurboAuthenticatedClient,\n folderPath: string,\n options?: {\n fundingMode?: OnDemandFunding\n },\n): Promise<string> {\n const uploadResult = await turbo.uploadFolder({\n dataItemOpts: {\n tags: [\n {\n name: 'App-Name',\n value: 'Permaweb-Deploy',\n },\n {\n name: 'anchor',\n value: new Date().toISOString(),\n },\n {\n name: 'Variant',\n value: 'Load-Network'\n }\n ],\n },\n folderPath,\n ...(options?.fundingMode && { fundingMode: options.fundingMode }),\n })\n\n let txOrManifestId = uploadResult.manifestResponse?.id\n\n // Make default folder paths work by adding extra path entries\n const origPaths = uploadResult.manifest?.paths || {}\n const newPaths: Record<string, { id: string }> = {}\n let replaceManifest = false\n\n for (const [key, value] of Object.entries(origPaths)) {\n newPaths[key] = value\n if (key.endsWith('/index.html')) {\n const newKey = key.replace(/\\/index\\.html$/, '')\n newPaths[newKey] = value\n replaceManifest = true\n }\n }\n\n if (replaceManifest && uploadResult.manifest) {\n console.info('Replacing manifest to support directory indexes')\n const newManifest = { ...uploadResult.manifest, paths: newPaths }\n const buffer = Buffer.from(JSON.stringify(newManifest))\n const { id } = await turbo.uploadFile({\n dataItemOpts: {\n tags: [{ name: 'Content-Type', value: 'application/x.arweave-manifest+json' }],\n },\n fileSizeFactory: () => buffer.length,\n fileStreamFactory: () => Readable.from(buffer),\n ...(options?.fundingMode && { fundingMode: options.fundingMode }),\n })\n txOrManifestId = id\n }\n\n if (!txOrManifestId) {\n throw new Error('Failed to upload folder')\n }\n\n return txOrManifestId\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { ARIO_MAINNET_PROCESS_ID, ARIO_TESTNET_PROCESS_ID } from '@ar.io/sdk';
|
|
3
|
+
import { ARWEAVE_TX_ID_REGEX, TTL_MIN, TTL_MAX } from './constants.js';
|
|
4
|
+
import { expandPath } from './path.js';
|
|
5
|
+
|
|
6
|
+
function validateTtl(value) {
|
|
7
|
+
const num = Number.parseInt(value, 10);
|
|
8
|
+
if (Number.isNaN(num)) {
|
|
9
|
+
return "TTL must be a valid number";
|
|
10
|
+
}
|
|
11
|
+
if (num < TTL_MIN || num > TTL_MAX) {
|
|
12
|
+
return `TTL must be between ${TTL_MIN} and ${TTL_MAX} seconds`;
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
function validateUndername(value) {
|
|
17
|
+
if (value.length === 0) {
|
|
18
|
+
return "Undername must not be empty";
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
function validateArioProcess(value) {
|
|
23
|
+
if (value === "mainnet" || value === "testnet") {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (!ARWEAVE_TX_ID_REGEX.test(value)) {
|
|
27
|
+
return 'ARIO process must be a valid Arweave transaction ID, "mainnet", or "testnet"';
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
function validateFileExists(value) {
|
|
32
|
+
const filePath = expandPath(value);
|
|
33
|
+
if (!fs.existsSync(filePath)) {
|
|
34
|
+
return `File ${value} does not exist`;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function validateFolderExists(value) {
|
|
39
|
+
const folderPath = expandPath(value);
|
|
40
|
+
if (!fs.existsSync(folderPath)) {
|
|
41
|
+
return `Folder ${value} does not exist`;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
function resolveArioProcess(value) {
|
|
46
|
+
if (value === "mainnet") {
|
|
47
|
+
return ARIO_MAINNET_PROCESS_ID;
|
|
48
|
+
}
|
|
49
|
+
if (value === "testnet") {
|
|
50
|
+
return ARIO_TESTNET_PROCESS_ID;
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function validateArnsName(value) {
|
|
55
|
+
if (value.length === 0) {
|
|
56
|
+
return "ArNS name is required";
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { resolveArioProcess, validateArioProcess, validateArnsName, validateFileExists, validateFolderExists, validateTtl, validateUndername };
|
|
62
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sources":["../../src/utils/validators.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { ARIO_MAINNET_PROCESS_ID, ARIO_TESTNET_PROCESS_ID } from '@ar.io/sdk'\n\nimport { ARWEAVE_TX_ID_REGEX, TTL_MAX, TTL_MIN } from './constants.js'\nimport { expandPath } from './path.js'\n\n/**\n * Validate TTL seconds\n */\nexport function validateTtl(value: string): string | true {\n const num = Number.parseInt(value, 10)\n if (Number.isNaN(num)) {\n return 'TTL must be a valid number'\n }\n\n if (num < TTL_MIN || num > TTL_MAX) {\n return `TTL must be between ${TTL_MIN} and ${TTL_MAX} seconds`\n }\n\n return true\n}\n\n/**\n * Validate undername\n */\nexport function validateUndername(value: string): string | true {\n if (value.length === 0) {\n return 'Undername must not be empty'\n }\n\n return true\n}\n\n/**\n * Validate ARIO process ID\n */\nexport function validateArioProcess(value: string): string | true {\n // Allow shorthand values\n if (value === 'mainnet' || value === 'testnet') {\n return true\n }\n\n if (!ARWEAVE_TX_ID_REGEX.test(value)) {\n return 'ARIO process must be a valid Arweave transaction ID, \"mainnet\", or \"testnet\"'\n }\n\n return true\n}\n\n/**\n * Validate file path exists\n */\nexport function validateFileExists(value: string): string | true {\n const filePath = expandPath(value)\n if (!fs.existsSync(filePath)) {\n return `File ${value} does not exist`\n }\n\n return true\n}\n\n/**\n * Validate folder path exists\n */\nexport function validateFolderExists(value: string): string | true {\n const folderPath = expandPath(value)\n if (!fs.existsSync(folderPath)) {\n return `Folder ${value} does not exist`\n }\n\n return true\n}\n\n/**\n * Resolve ARIO process from shorthand to actual ID\n */\nexport function resolveArioProcess(value: string): string {\n if (value === 'mainnet') {\n return ARIO_MAINNET_PROCESS_ID\n }\n\n if (value === 'testnet') {\n return ARIO_TESTNET_PROCESS_ID\n }\n\n return value\n}\n\n/**\n * Validate ArNS name is not empty\n */\nexport function validateArnsName(value: string): string | true {\n if (value.length === 0) {\n return 'ArNS name is required'\n }\n\n return true\n}\n"],"names":[],"mappings":";;;;;AAUO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACrC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrB,IAAA,OAAO,4BAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA,GAAM,OAAA,IAAW,GAAA,GAAM,OAAA,EAAS;AAClC,IAAA,OAAO,CAAA,oBAAA,EAAuB,OAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,QAAA,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,kBAAkB,KAAA,EAA8B;AAC9D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,6BAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,oBAAoB,KAAA,EAA8B;AAEhE,EAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,SAAA,EAAW;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,OAAO,8EAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO,QAAQ,KAAK,CAAA,eAAA,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,qBAAqB,KAAA,EAA8B;AACjE,EAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AACnC,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,UAAU,KAAK,CAAA,eAAA,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,uBAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,uBAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,uBAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@loadnetwork/permaweb-deploy",
|
|
3
|
+
"version": "2.5.1-loadnetwork.0",
|
|
4
|
+
"description": "Permaweb App Deployment Package",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"permaweb-deploy": "./bin/run.js",
|
|
10
|
+
"load-permaweb-deploy": "./bin/run.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "vite build && tsc --emitDeclarationOnly",
|
|
14
|
+
"dev": "./bin/dev.js",
|
|
15
|
+
"test": "vitest",
|
|
16
|
+
"test:run": "vitest run",
|
|
17
|
+
"test:unit": "vitest run src",
|
|
18
|
+
"test:e2e": "vitest run tests/e2e",
|
|
19
|
+
"test:coverage": "vitest run --coverage",
|
|
20
|
+
"lint": "eslint . --ext .ts",
|
|
21
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
22
|
+
"format": "prettier --write .",
|
|
23
|
+
"format:check": "prettier --check .",
|
|
24
|
+
"generate:types": "openapi-typescript tests/fixtures/upload-service.openapi.yaml -o tests/types/upload-service.ts && openapi-typescript tests/fixtures/payment-service.openapi.yaml -o tests/types/payment-service.ts",
|
|
25
|
+
"prepare": "husky install",
|
|
26
|
+
"changeset": "changeset",
|
|
27
|
+
"version": "changeset version",
|
|
28
|
+
"version:alpha": "changeset version --snapshot alpha",
|
|
29
|
+
"version:snapshot": "changeset version --snapshot rc",
|
|
30
|
+
"release": "changeset publish --tag latest",
|
|
31
|
+
"release:alpha": "changeset publish --tag alpha",
|
|
32
|
+
"release:snapshot": "changeset publish --tag rc --no-git-tag"
|
|
33
|
+
},
|
|
34
|
+
"oclif": {
|
|
35
|
+
"bin": "permaweb-deploy",
|
|
36
|
+
"dirname": "permaweb-deploy",
|
|
37
|
+
"commands": "./dist/commands",
|
|
38
|
+
"topicSeparator": " ",
|
|
39
|
+
"default": "interactive",
|
|
40
|
+
"topics": {
|
|
41
|
+
"deploy": {
|
|
42
|
+
"description": "Deploy to the permaweb"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"bin",
|
|
49
|
+
"oclif.manifest.json"
|
|
50
|
+
],
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@ar.io/sdk": "^3.22.1",
|
|
53
|
+
"@ardrive/turbo-sdk": "^1.39.1",
|
|
54
|
+
"@inquirer/prompts": "^7.2.0",
|
|
55
|
+
"@oclif/core": "^4.0.30",
|
|
56
|
+
"@permaweb/aoconnect": "^0.0.85",
|
|
57
|
+
"boxen": "^8.0.1",
|
|
58
|
+
"chalk": "^5.3.0",
|
|
59
|
+
"cli-table3": "^0.6.5",
|
|
60
|
+
"mime-types": "^3.0.1",
|
|
61
|
+
"ora": "^8.1.1"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@changesets/cli": "^2.27.10",
|
|
65
|
+
"@commitlint/cli": "^19.6.0",
|
|
66
|
+
"@commitlint/config-conventional": "^19.6.0",
|
|
67
|
+
"@oclif/prettier-config": "^0.2.1",
|
|
68
|
+
"@oclif/test": "^4.1.14",
|
|
69
|
+
"@types/mime-types": "^2.1.4",
|
|
70
|
+
"@types/node": "^22.10.2",
|
|
71
|
+
"@typescript-eslint/eslint-plugin": "^8.18.1",
|
|
72
|
+
"@typescript-eslint/parser": "^8.18.1",
|
|
73
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
74
|
+
"eslint": "^8.57.1",
|
|
75
|
+
"eslint-config-oclif": "^5.2.1",
|
|
76
|
+
"eslint-config-oclif-typescript": "^3.1.12",
|
|
77
|
+
"eslint-config-prettier": "^9.1.0",
|
|
78
|
+
"eslint-import-resolver-typescript": "^3.7.0",
|
|
79
|
+
"eslint-plugin-import": "^2.31.0",
|
|
80
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
81
|
+
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
82
|
+
"husky": "^9.1.7",
|
|
83
|
+
"msw": "^2.11.3",
|
|
84
|
+
"openapi-typescript": "^7.9.1",
|
|
85
|
+
"prettier": "^3.4.2",
|
|
86
|
+
"tsx": "^4.19.2",
|
|
87
|
+
"typescript": "^5.7.2",
|
|
88
|
+
"vite": "^6.0.5",
|
|
89
|
+
"vite-plugin-dts": "^4.3.0",
|
|
90
|
+
"vite-tsconfig-paths": "^5.1.4",
|
|
91
|
+
"vitest": "^2.1.8"
|
|
92
|
+
},
|
|
93
|
+
"publishConfig": {
|
|
94
|
+
"access": "public",
|
|
95
|
+
"registry": "https://registry.npmjs.org/"
|
|
96
|
+
},
|
|
97
|
+
"engines": {
|
|
98
|
+
"node": ">=18.0.0"
|
|
99
|
+
},
|
|
100
|
+
"repository": {
|
|
101
|
+
"type": "git",
|
|
102
|
+
"url": "git+https://github.com/loadnetwork/permaweb-deploy.git"
|
|
103
|
+
},
|
|
104
|
+
"author": "charmful0x",
|
|
105
|
+
"license": "ISC",
|
|
106
|
+
"bugs": {
|
|
107
|
+
"url": "https://github.com/loadnetwork/permaweb-deploy/issues"
|
|
108
|
+
},
|
|
109
|
+
"homepage": "https://github.com/loadnetwork/permaweb-deploy#readme"
|
|
110
|
+
}
|