@elpm/deploy 0.0.1
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/README.md +0 -0
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.js +27 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/command/build.d.ts +14 -0
- package/dist/command/build.js +76 -0
- package/dist/command/build.js.map +1 -0
- package/dist/command/index.d.ts +5 -0
- package/dist/command/index.js +11 -0
- package/dist/command/index.js.map +1 -0
- package/dist/command/uuid.d.ts +2 -0
- package/dist/command/uuid.js +4 -0
- package/dist/command/uuid.js.map +1 -0
- package/dist/fn/memoize.d.ts +1 -0
- package/dist/fn/memoize.js +11 -0
- package/dist/fn/memoize.js.map +1 -0
- package/dist/fn/nextVersion.d.ts +1 -0
- package/dist/fn/nextVersion.js +14 -0
- package/dist/fn/nextVersion.js.map +1 -0
- package/dist/fn/parseArgs.d.ts +23 -0
- package/dist/fn/parseArgs.js +83 -0
- package/dist/fn/parseArgs.js.map +1 -0
- package/dist/lib/index.d.ts +37 -0
- package/dist/lib/index.js +151 -0
- package/dist/lib/index.js.map +10 -0
- package/package.json +23 -0
package/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
var z={command:"",options:{},flags:[]},h=(U)=>{if(!U||typeof U!=="string")return{...z};switch(!0){case U.startsWith("--"):if(U.includes("=")){let[q,...G]=U.split("="),Q=G.join("="),w=q.slice(2);if(w)z.options[w]=Q||""}else{let q=U.slice(2);if(q&&!z.flags.includes(q))z.flags.push(q)}break;case U.startsWith("-"):let B=U.slice(1);if(B&&!z.flags.includes(B))z.flags.push(B);break;default:if(!z.command&&U.trim())z.command=U.trim();break}return{command:z.command,options:{...z.options},flags:[...z.flags]}},K=()=>{z={command:"",options:{},flags:[]};let U=process.argv.slice(2);if(U.length===0)return{...z};return U.forEach((B)=>{try{h(B)}catch(q){console.warn(`\u26A0\uFE0F \u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0438\u0442\u044C \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442: ${B}`)}}),{command:z.command,options:{...z.options},flags:[...z.flags]}};var C=async(U)=>{let q=JSON.parse(await Bun.file("./package.json").text()),G=q.version.split(".").map(Number);G[G.length-1]+=1,q.version=G.join("."),console.log("v",q.version),await Bun.write("./package.json",JSON.stringify(q,null,2))};var H=async(U,B)=>{await C();let q=B.includes("client"),G=U.dir||"./out",Q=U.name?U.name:q?"build":"api",w=U.folder?U.folder:"build";if(q){let X=Bun.spawn(["bun","run","build"],{stdout:"pipe",stderr:"pipe"}),Y=await new Response(X.stdout).text(),Z=await new Response(X.stderr).text();await X.exited,console.log("stdout:",Y),console.log("stderr:",Z),console.log("\u2699\uFE0F Build completed");let W=Bun.spawn(["tar","czf","build.tar","build"],{stderr:"pipe"});await W.exited;let $=await new Response(W.stderr).text();if($&&!$.includes("LIBARCHIVE.xattr")&&$.trim()!=="");let R=Bun.file("./build.tar"),y=new FormData;y.append("upload",R),y.append("name",Q),y.append("folder",w);let V=await(await fetch(U.url,{method:"POST",body:y})).text();console.log(V)}else{let X=await Bun.build({entrypoints:["./src/index.js"],outdir:G,minify:!0,target:"bun",naming:`${Q}.js`});if(!X.success){console.error("Build failed");for(let Y of X.logs)console.error(Y)}else if(U.url){let Y=Bun.file(`${G}/${Q}.js`),Z=new FormData;Z.append("upload",Y),Z.append("name",Q);let $=await(await fetch(U.url,{method:"POST",body:Z})).text();console.log($)}}};var O=async()=>{console.log(crypto.randomUUID())};var j={build:H,uuid:O};function F(){console.log(`
|
|
4
|
+
\uD83D\uDE80 elPMD Deploy Tool
|
|
5
|
+
|
|
6
|
+
\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435:
|
|
7
|
+
elpmd <\u043A\u043E\u043C\u0430\u043D\u0434\u0430> [\u043E\u043F\u0446\u0438\u0438] [\u0444\u043B\u0430\u0433\u0438]
|
|
8
|
+
|
|
9
|
+
\u041A\u043E\u043C\u0430\u043D\u0434\u044B:
|
|
10
|
+
build \u0421\u0431\u043E\u0440\u043A\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F
|
|
11
|
+
uuid \u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F UUIDv7
|
|
12
|
+
|
|
13
|
+
\u041E\u043F\u0446\u0438\u0438:
|
|
14
|
+
--url=<URL> URL \u0434\u043B\u044F \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F
|
|
15
|
+
--name=<\u0438\u043C\u044F> \u0418\u043C\u044F \u0444\u0430\u0439\u043B\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: api)
|
|
16
|
+
--dir=<\u043F\u0430\u043F\u043A\u0430> \u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F \u0441\u0431\u043E\u0440\u043A\u0438 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: ./out)
|
|
17
|
+
|
|
18
|
+
\u0424\u043B\u0430\u0433\u0438:
|
|
19
|
+
--client \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F
|
|
20
|
+
--dev \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C
|
|
21
|
+
--help, -h \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u044D\u0442\u0443 \u0441\u043F\u0440\u0430\u0432\u043A\u0443
|
|
22
|
+
|
|
23
|
+
\u041F\u0440\u0438\u043C\u0435\u0440\u044B:
|
|
24
|
+
elpmd build --client --url=https://example.com/deploy
|
|
25
|
+
elpmd build --name=my-api --dir=./dist --url=https://example.com/deploy
|
|
26
|
+
elpmd build --dev
|
|
27
|
+
`)}async function J(){try{let U=K(),B=U.flags.includes("dev"),q=U.flags.includes("help")||U.flags.includes("h");if(B)console.log("\uD83D\uDD0D \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F:"),console.log(JSON.stringify(U,null,2));if(q||!U.command){F();return}if(j[U.command])await j[U.command](U.options,U.flags);else console.error(`\u274C \u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430: ${U.command}`),console.log("\uD83D\uDCA1 \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 'elpmd --help' \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0441\u043F\u0440\u0430\u0432\u043A\u0438"),process.exit(1)}catch(U){console.error("\u274C \u041D\u0435\u043E\u0436\u0438\u0434\u0430\u043D\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430:",U),process.exit(1)}}J();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,SAAS,QAAQ;IACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBf,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACf,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAS,GACX,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEhE,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,4BAA4B;AAC5B,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Команда `build`: сборка и опциональная отправка на сервер.
|
|
3
|
+
*
|
|
4
|
+
* **CLI:** `--url`, `--dir`, `--name`, `--folder`, флаг `--client`.
|
|
5
|
+
* Подробно: docs/build-api.md
|
|
6
|
+
*
|
|
7
|
+
* **Режим `--client`:** `bun run build` → `tar` каталога `build` → POST `multipart/form-data`:
|
|
8
|
+
* поля `upload` (файл build.tar), `name`, `folder`.
|
|
9
|
+
*
|
|
10
|
+
* **Режим API (без `--client`):** `Bun.build` из `./src/index.js` → при наличии `--url` POST:
|
|
11
|
+
* поля `upload` (файл `${dir}/${name}.js`), `name`.
|
|
12
|
+
*/
|
|
13
|
+
declare const _default: (options: Record<string, string>, flags: string[]) => Promise<void>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { nextVersion } from "../fn/nextVersion";
|
|
2
|
+
export default async (options, flags) => {
|
|
3
|
+
await nextVersion();
|
|
4
|
+
const IS_CLIENT = flags.includes("client");
|
|
5
|
+
const DIR = options.dir || "./out";
|
|
6
|
+
const NAME = options.name ? options.name : IS_CLIENT ? "build" : "api";
|
|
7
|
+
const FOLDER = options.folder ? options.folder : "build";
|
|
8
|
+
if (IS_CLIENT) {
|
|
9
|
+
// CLIENT
|
|
10
|
+
let bu = Bun.spawn(["bun", "run", "build"], {
|
|
11
|
+
stdout: "pipe",
|
|
12
|
+
stderr: "pipe",
|
|
13
|
+
});
|
|
14
|
+
// Чтение вывода
|
|
15
|
+
const stdout = await new Response(bu.stdout).text();
|
|
16
|
+
const stderr = await new Response(bu.stderr).text();
|
|
17
|
+
await bu.exited;
|
|
18
|
+
console.log("stdout:", stdout);
|
|
19
|
+
console.log("stderr:", stderr);
|
|
20
|
+
console.log("⚙️ Build completed");
|
|
21
|
+
let proc = Bun.spawn(["tar", "czf", "build.tar", "build"], {
|
|
22
|
+
stderr: "pipe",
|
|
23
|
+
});
|
|
24
|
+
await proc.exited;
|
|
25
|
+
// Фильтруем stderr чтобы скрыть предупреждения о xattr
|
|
26
|
+
const stderrText = await new Response(proc.stderr).text();
|
|
27
|
+
// Выводим stderr только если он содержит что-то кроме предупреждений о xattr
|
|
28
|
+
if (stderrText &&
|
|
29
|
+
!stderrText.includes("LIBARCHIVE.xattr") &&
|
|
30
|
+
stderrText.trim() !== "") {
|
|
31
|
+
// console.error(stderrText);
|
|
32
|
+
}
|
|
33
|
+
const tar = Bun.file("./build.tar");
|
|
34
|
+
const formData = new FormData();
|
|
35
|
+
formData.append("upload", tar);
|
|
36
|
+
formData.append("name", NAME);
|
|
37
|
+
formData.append("folder", FOLDER);
|
|
38
|
+
let res = await fetch(options.url, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
body: formData,
|
|
41
|
+
});
|
|
42
|
+
let text = await res.text();
|
|
43
|
+
console.log(text);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// API
|
|
47
|
+
const result = await Bun.build({
|
|
48
|
+
entrypoints: ["./src/index.js"],
|
|
49
|
+
outdir: DIR,
|
|
50
|
+
minify: true,
|
|
51
|
+
target: "bun",
|
|
52
|
+
naming: `${NAME}.js`,
|
|
53
|
+
});
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
console.error("Build failed");
|
|
56
|
+
for (const message of result.logs) {
|
|
57
|
+
console.error(message);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (options.url) {
|
|
62
|
+
const foo = Bun.file(`${DIR}/${NAME}.js`);
|
|
63
|
+
const formData = new FormData();
|
|
64
|
+
formData.append("upload", foo);
|
|
65
|
+
formData.append("name", NAME);
|
|
66
|
+
let res = await fetch(options.url, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
body: formData,
|
|
69
|
+
});
|
|
70
|
+
let text = await res.text();
|
|
71
|
+
console.log(text);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/command/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B;;GAEG;AACH,MAAM,QAAQ,GAGV;IACA,KAAK;IACL,IAAI;CACP,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/command/uuid.ts"],"names":[],"mappings":"AAAA,eAAe,KAAK,IAAI,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function memoize<T extends (...args: any[]) => any>(n: T): (...arg: Parameters<T>) => any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoize.js","sourceRoot":"","sources":["../../src/fn/memoize.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAoC,CAAI;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAkB,EAAE,EAAE;QAC7B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACV,CAAC,GAAG,CAAC,CAAC;YACN,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACrB,CAAC;IACL,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const nextVersion: (version?: string) => Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const nextVersion = async (version) => {
|
|
2
|
+
// Обновление версии в package.json
|
|
3
|
+
const packageJsonPath = "./package.json";
|
|
4
|
+
const packageJson = JSON.parse(await Bun.file(packageJsonPath).text());
|
|
5
|
+
// Увеличиваем версию
|
|
6
|
+
const versionParts = packageJson.version.split(".").map(Number);
|
|
7
|
+
versionParts[versionParts.length - 1] += 1; // Увеличиваем последнюю часть версии
|
|
8
|
+
packageJson.version = versionParts.join(".");
|
|
9
|
+
// 🔄
|
|
10
|
+
console.log("v", packageJson.version);
|
|
11
|
+
// Записываем обновленную версию обратно в package.json
|
|
12
|
+
await Bun.write(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=nextVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextVersion.js","sourceRoot":"","sources":["../../src/fn/nextVersion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IAClD,mCAAmC;IACnC,MAAM,eAAe,GAAG,gBAAgB,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvE,qBAAqB;IACrB,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChE,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qCAAqC;IACjF,WAAW,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7C,KAAK;IACL,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,uDAAuD;IACvD,MAAM,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Тип данных для распарсенных аргументов командной строки
|
|
3
|
+
*/
|
|
4
|
+
type TParsed = {
|
|
5
|
+
/** Команда для выполнения */
|
|
6
|
+
command: string;
|
|
7
|
+
/** Опции с значениями (например --url=https://example.com) */
|
|
8
|
+
options: Record<string, string>;
|
|
9
|
+
/** Флаги без значений (например --client, --dev) */
|
|
10
|
+
flags: string[];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Парсит один аргумент из командной строки
|
|
14
|
+
* @param args - Аргумент для парсинга
|
|
15
|
+
* @returns Объект с распарсенными данными
|
|
16
|
+
*/
|
|
17
|
+
export declare const parseArg: (args: string) => TParsed;
|
|
18
|
+
/**
|
|
19
|
+
* Парсит все аргументы командной строки
|
|
20
|
+
* @returns Объект с всеми распарсенными аргументами
|
|
21
|
+
*/
|
|
22
|
+
export declare const parseArgs: () => TParsed;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Объект для хранения распарсенных аргументов
|
|
3
|
+
*/
|
|
4
|
+
let parsed = {
|
|
5
|
+
command: "",
|
|
6
|
+
options: {},
|
|
7
|
+
flags: [],
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Парсит один аргумент из командной строки
|
|
11
|
+
* @param args - Аргумент для парсинга
|
|
12
|
+
* @returns Объект с распарсенными данными
|
|
13
|
+
*/
|
|
14
|
+
export const parseArg = (args) => {
|
|
15
|
+
if (!args || typeof args !== "string") {
|
|
16
|
+
return { ...parsed };
|
|
17
|
+
}
|
|
18
|
+
switch (true) {
|
|
19
|
+
case args.startsWith("--"):
|
|
20
|
+
if (args.includes("=")) {
|
|
21
|
+
const [key, ...valueParts] = args.split("=");
|
|
22
|
+
const value = valueParts.join("="); // Поддержка знаков = в значениях
|
|
23
|
+
const optionKey = key.slice(2);
|
|
24
|
+
if (optionKey) {
|
|
25
|
+
parsed.options[optionKey] = value || "";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const flag = args.slice(2);
|
|
30
|
+
if (flag && !parsed.flags.includes(flag)) {
|
|
31
|
+
parsed.flags.push(flag);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case args.startsWith("-"):
|
|
36
|
+
const shortFlag = args.slice(1);
|
|
37
|
+
if (shortFlag && !parsed.flags.includes(shortFlag)) {
|
|
38
|
+
parsed.flags.push(shortFlag);
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
// Первая команда без префиксов
|
|
43
|
+
if (!parsed.command && args.trim()) {
|
|
44
|
+
parsed.command = args.trim();
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
command: parsed.command,
|
|
50
|
+
options: { ...parsed.options },
|
|
51
|
+
flags: [...parsed.flags],
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Парсит все аргументы командной строки
|
|
56
|
+
* @returns Объект с всеми распарсенными аргументами
|
|
57
|
+
*/
|
|
58
|
+
export const parseArgs = () => {
|
|
59
|
+
// Сбрасываем состояние перед парсингом
|
|
60
|
+
parsed = {
|
|
61
|
+
command: "",
|
|
62
|
+
options: {},
|
|
63
|
+
flags: [],
|
|
64
|
+
};
|
|
65
|
+
const args = process.argv.slice(2);
|
|
66
|
+
if (args.length === 0) {
|
|
67
|
+
return { ...parsed };
|
|
68
|
+
}
|
|
69
|
+
args.forEach((arg) => {
|
|
70
|
+
try {
|
|
71
|
+
parseArg(arg);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.warn(`⚠️ Не удалось распарсить аргумент: ${arg}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
command: parsed.command,
|
|
79
|
+
options: { ...parsed.options },
|
|
80
|
+
flags: [...parsed.flags],
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=parseArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/fn/parseArgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Тип данных для развертывания серверного приложения
|
|
3
|
+
*/
|
|
4
|
+
export type TServer = {
|
|
5
|
+
/** Содержимое JavaScript файла для развертывания */
|
|
6
|
+
upload: string | Buffer;
|
|
7
|
+
/** Имя файла (без расширения .js) */
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Тип данных для развертывания клиентского приложения
|
|
12
|
+
*/
|
|
13
|
+
export type TClient = {
|
|
14
|
+
/** Содержимое tar-архива с клиентской сборкой */
|
|
15
|
+
upload: string | Buffer;
|
|
16
|
+
/** Папка с клиентской сборкой */
|
|
17
|
+
folder: string;
|
|
18
|
+
};
|
|
19
|
+
export type TUpdateServer = {
|
|
20
|
+
[route: string]: (req: any) => Promise<Response>;
|
|
21
|
+
};
|
|
22
|
+
export declare namespace Upload {
|
|
23
|
+
/**
|
|
24
|
+
* Развертывание клиентского приложения из tar-архива
|
|
25
|
+
* @param body - Объект с данными для развертывания
|
|
26
|
+
* @throws {Error} При ошибке развертывания
|
|
27
|
+
*/
|
|
28
|
+
const client: (body: TClient) => Promise<Response>;
|
|
29
|
+
/**
|
|
30
|
+
* Развертывание серверного приложения из JS файла
|
|
31
|
+
* @param body - Объект с именем и содержимым файла
|
|
32
|
+
* @throws {Error} При ошибке развертывания
|
|
33
|
+
*/
|
|
34
|
+
const server: (req: any, name?: string) => Promise<Response>;
|
|
35
|
+
const updateServer: (router: string, name?: string) => TUpdateServer;
|
|
36
|
+
const updateClient: (router: string, name?: string) => TUpdateServer;
|
|
37
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/lib/index.ts
|
|
3
|
+
function getAllowedIps() {
|
|
4
|
+
const raw = process.env.DEPLOY_ALLOWED_IPS?.trim();
|
|
5
|
+
if (!raw)
|
|
6
|
+
return null;
|
|
7
|
+
return raw.split(",").map((ip) => ip.trim()).filter(Boolean);
|
|
8
|
+
}
|
|
9
|
+
function getClientIp(req) {
|
|
10
|
+
const forwarded = req.headers.get("x-forwarded-for");
|
|
11
|
+
if (forwarded)
|
|
12
|
+
return forwarded.split(",")[0].trim();
|
|
13
|
+
const real = req.headers.get("x-real-ip");
|
|
14
|
+
if (real)
|
|
15
|
+
return real.trim();
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
function isIpAllowed(req) {
|
|
19
|
+
const allowed = getAllowedIps();
|
|
20
|
+
if (!allowed || allowed.length === 0)
|
|
21
|
+
return true;
|
|
22
|
+
const ip = getClientIp(req);
|
|
23
|
+
return ip ? allowed.includes(ip) : false;
|
|
24
|
+
}
|
|
25
|
+
var Upload;
|
|
26
|
+
((Upload) => {
|
|
27
|
+
Upload.client = async (body) => {
|
|
28
|
+
try {
|
|
29
|
+
await Bun.write("build.tar", body.upload);
|
|
30
|
+
const extractProc = Bun.spawn([
|
|
31
|
+
"tar",
|
|
32
|
+
"-xzvf",
|
|
33
|
+
"build.tar",
|
|
34
|
+
"-C",
|
|
35
|
+
body.folder || "build",
|
|
36
|
+
"--strip-components=1"
|
|
37
|
+
], {
|
|
38
|
+
env: { ...process.env, TAR_OPTIONS: "--warning=no-xattr" },
|
|
39
|
+
stderr: "pipe"
|
|
40
|
+
});
|
|
41
|
+
const extractResult = await extractProc.exited;
|
|
42
|
+
const stderrText = await new Response(extractProc.stderr).text();
|
|
43
|
+
if (stderrText && !stderrText.includes("LIBARCHIVE.xattr") && stderrText.trim() !== "") {
|
|
44
|
+
console.error(stderrText);
|
|
45
|
+
}
|
|
46
|
+
if (extractResult !== 0) {
|
|
47
|
+
throw new Error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u0440\u0430\u0441\u043F\u0430\u043A\u043E\u0432\u043A\u0438 \u0430\u0440\u0445\u0438\u0432\u0430: \u043A\u043E\u0434 \u0432\u044B\u0445\u043E\u0434\u0430 ${extractResult}`);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const cleanupDotFiles = Bun.spawn([
|
|
51
|
+
"find",
|
|
52
|
+
".",
|
|
53
|
+
"-name",
|
|
54
|
+
"._*",
|
|
55
|
+
"-delete"
|
|
56
|
+
]);
|
|
57
|
+
await cleanupDotFiles.exited;
|
|
58
|
+
} catch (cleanupError) {
|
|
59
|
+
console.warn("\u26A0\uFE0F \u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432 macOS:", cleanupError.message);
|
|
60
|
+
}
|
|
61
|
+
const cleanupProc = Bun.spawn(["rm", "build.tar"]);
|
|
62
|
+
await cleanupProc.exited;
|
|
63
|
+
console.log("folder:", body.folder);
|
|
64
|
+
console.log(`\u2705 \u041A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u043E (elpm ID: ${process.env.ELPM_PROCESS_ID || "0"})`);
|
|
65
|
+
return new Response("\uD83D\uDDA5\uFE0F \uD83D\uDE0E\uD83E\uDD73");
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("\u274C \u041E\u0448\u0438\u0431\u043A\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F:", error);
|
|
68
|
+
return new Response("\u274C\u274C\u274C", { status: 500 });
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
Upload.server = async (req, name) => {
|
|
72
|
+
try {
|
|
73
|
+
const formdata = await req.formData();
|
|
74
|
+
const u = formdata.get("upload");
|
|
75
|
+
const n = formdata.get("name");
|
|
76
|
+
const body = { upload: u, name: name || n };
|
|
77
|
+
if (u) {
|
|
78
|
+
await Bun.write(`${body.name}.js`, body.upload);
|
|
79
|
+
const elpmId = process.env.ELPM_PROCESS_ID || "0";
|
|
80
|
+
console.log(`\u2705 \u0421\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 ${body.name}.js \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u043E (elpm ID: ${elpmId})`);
|
|
81
|
+
const response = new Response("\uD83D\uDDA5\uFE0F \uD83D\uDE0E\uD83E\uDD73");
|
|
82
|
+
setTimeout(async () => {
|
|
83
|
+
try {
|
|
84
|
+
const restartProc = Bun.spawn([
|
|
85
|
+
"elpm",
|
|
86
|
+
"restart",
|
|
87
|
+
elpmId
|
|
88
|
+
]);
|
|
89
|
+
const restartResult = await restartProc.exited;
|
|
90
|
+
if (restartResult !== 0) {
|
|
91
|
+
console.error(`\u274C \u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430 elpm \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 ${elpmId}: \u043A\u043E\u0434 \u0432\u044B\u0445\u043E\u0434\u0430 ${restartResult}`);
|
|
92
|
+
} else {
|
|
93
|
+
console.log(`\u2705 elpm \u043F\u0440\u043E\u0446\u0435\u0441\u0441 ${elpmId} \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0449\u0435\u043D`);
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
console.error(`\u274C \u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0435 elpm \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 ${elpmId}:`, error);
|
|
97
|
+
}
|
|
98
|
+
}, 0);
|
|
99
|
+
return response;
|
|
100
|
+
}
|
|
101
|
+
return new Response("\u274C\u274C\u274C", { status: 500 });
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error("\u274C \u041E\u0448\u0438\u0431\u043A\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F:", error);
|
|
104
|
+
return new Response("\u274C\u274C\u274C", { status: 500 });
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
Upload.updateServer = (router, name) => {
|
|
108
|
+
return {
|
|
109
|
+
[`/${router}`]: async (req) => {
|
|
110
|
+
try {
|
|
111
|
+
if (!isIpAllowed(req)) {
|
|
112
|
+
return new Response("Forbidden", { status: 403 });
|
|
113
|
+
}
|
|
114
|
+
return await Upload.server(req, name);
|
|
115
|
+
} catch {
|
|
116
|
+
return new Response("\u274C\u274C\u274C");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
Upload.updateClient = (router, name) => {
|
|
122
|
+
return {
|
|
123
|
+
[`/${router}-client`]: async (req) => {
|
|
124
|
+
try {
|
|
125
|
+
if (!isIpAllowed(req)) {
|
|
126
|
+
return new Response("Forbidden", { status: 403 });
|
|
127
|
+
}
|
|
128
|
+
console.log("\uD83D\uDE0E\uD83E\uDD73");
|
|
129
|
+
const formdata = await req.formData();
|
|
130
|
+
const u = formdata.get("upload");
|
|
131
|
+
const n = formdata.get("name");
|
|
132
|
+
const folder = name || n || "build";
|
|
133
|
+
if (u) {
|
|
134
|
+
return await Upload.client({
|
|
135
|
+
upload: u,
|
|
136
|
+
folder
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return new Response("\u274C\u274C\u274C", { status: 500 });
|
|
140
|
+
} catch {
|
|
141
|
+
return new Response("\u274C\u274C\u274C");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
})(Upload ||= {});
|
|
147
|
+
export {
|
|
148
|
+
Upload
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
//# debugId=ED291D5F50A818FB64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Тип данных для развертывания серверного приложения\n */\nexport type TServer = {\n /** Содержимое JavaScript файла для развертывания */\n upload: string | Buffer;\n /** Имя файла (без расширения .js) */\n name: string;\n};\n\n/**\n * Тип данных для развертывания клиентского приложения\n */\nexport type TClient = {\n /** Содержимое tar-архива с клиентской сборкой */\n upload: string | Buffer;\n /** Папка с клиентской сборкой */\n folder: string;\n};\n\nexport type TUpdateServer = {\n [route: string]: (req: any) => Promise<Response>;\n};\n\n/**\n * Утилиты для развертывания приложений elPMD\n *\n * Пример использования:\n *\n * Для развертывания клиентского приложения:\n * ```typescript\n * import { upload } from '@elpmd/deploy';\n *\n * const clientBody = {\n * upload: tarFileBuffer // Buffer с tar-архивом\n * };\n * await upload.client(clientBody);\n * ```\n *\n * Для развертывания серверного приложения:\n * ```typescript\n * import { upload } from '@elpmd/deploy';\n *\n * const serverBody = {\n * name: 'my-server', // Имя JS файла (без расширения .js)\n * upload: jsFileContent // Содержимое JS файла\n * };\n * await upload.server(serverBody);\n * ```\n *\n * Переменные окружения:\n * - pm_id: ID процесса PM2 для перезапуска (по умолчанию \"0\")\n * - DEPLOY_ALLOWED_IPS: список разрешённых IP через запятую (например \"1.2.3.4,10.0.0.1\"); если не задан — доступ без ограничения по IP\n */\n\n/** Читает список разрешённых IP из env (DEPLOY_ALLOWED_IPS). Пустая строка или отсутствие = без ограничений. */\nfunction getAllowedIps(): string[] | null {\n const raw = process.env.DEPLOY_ALLOWED_IPS?.trim();\n if (!raw) return null;\n return raw\n .split(\",\")\n .map((ip) => ip.trim())\n .filter(Boolean);\n}\n\n/** Достаёт IP клиента из запроса (x-forwarded-for, x-real-ip и т.д.). */\nfunction getClientIp(req: Request): string {\n const forwarded = req.headers.get(\"x-forwarded-for\");\n if (forwarded) return forwarded.split(\",\")[0].trim();\n const real = req.headers.get(\"x-real-ip\");\n if (real) return real.trim();\n return \"\";\n}\n\n/** Проверяет, разрешён ли IP для деплоя. Если список не задан — разрешён любой. */\nfunction isIpAllowed(req: Request): boolean {\n const allowed = getAllowedIps();\n if (!allowed || allowed.length === 0) return true;\n const ip = getClientIp(req);\n return ip ? allowed.includes(ip) : false;\n}\n\nexport namespace Upload {\n /**\n * Развертывание клиентского приложения из tar-архива\n * @param body - Объект с данными для развертывания\n * @throws {Error} При ошибке развертывания\n */\n export const client = async (body: TClient): Promise<Response> => {\n try {\n // Записываем tar-архив во временный файл\n await Bun.write(\"build.tar\", body.upload);\n\n // Распаковываем архив (подавляем предупреждения о расширенных атрибутах)\n const extractProc = Bun.spawn(\n [\n \"tar\",\n \"-xzvf\",\n \"build.tar\",\n \"-C\",\n body.folder || \"build\",\n \"--strip-components=1\",\n ],\n {\n env: { ...process.env, TAR_OPTIONS: \"--warning=no-xattr\" },\n stderr: \"pipe\",\n },\n );\n\n // Ждем завершения процесса и фильтруем вывод\n const extractResult = await extractProc.exited;\n\n // Читаем stderr и фильтруем предупреждения о xattr\n const stderrText = await new Response(extractProc.stderr).text();\n // Выводим stderr только если он содержит что-то кроме предупреждений о xattr\n if (\n stderrText &&\n !stderrText.includes(\"LIBARCHIVE.xattr\") &&\n stderrText.trim() !== \"\"\n ) {\n console.error(stderrText);\n }\n\n if (extractResult !== 0) {\n throw new Error(\n `Ошибка распаковки архива: код выхода ${extractResult}`,\n );\n }\n\n // Удаляем файлы, начинающиеся с ._ (файлы ресурсов macOS)\n try {\n const cleanupDotFiles = Bun.spawn([\n \"find\",\n \".\",\n \"-name\",\n \"._*\",\n \"-delete\",\n ]);\n await cleanupDotFiles.exited;\n } catch (cleanupError: any) {\n console.warn(\n \"⚠️ Не удалось удалить файлы ресурсов macOS:\",\n cleanupError.message,\n );\n }\n\n // Удаляем временный файл\n const cleanupProc = Bun.spawn([\"rm\", \"build.tar\"]);\n await cleanupProc.exited;\n\n // Перезапускаем PM2 процесс\n\n /* const restartProc = Bun.spawn([\"pm2\", \"restart\", pmId]);\n const restartResult = await restartProc.exited;\n if (restartResult !== 0) {\n throw new Error(\n `Ошибка перезапуска PM2 процесса ${pmId}: код выхода ${restartResult}`,\n );\n }\n*/\n\n console.log(\"folder:\", body.folder);\n console.log(\n `✅ Клиентское приложение успешно развернуто (elpm ID: ${process.env.ELPM_PROCESS_ID || \"0\"})`,\n );\n\n return new Response(\"🖥️ 😎🥳\");\n } catch (error) {\n console.error(\n \"❌ Ошибка развертывания клиентского приложения:\",\n error,\n );\n return new Response(\"❌❌❌\", { status: 500 });\n }\n };\n\n /**\n * Развертывание серверного приложения из JS файла\n * @param body - Объект с именем и содержимым файла\n * @throws {Error} При ошибке развертывания\n */\n export const server = async (\n req: any,\n name?: string,\n ): Promise<Response> => {\n try {\n const formdata = await req.formData();\n const u = formdata.get(\"upload\") as string;\n const n = formdata.get(\"name\") as string;\n const body = { upload: u, name: name || n };\n if (u) {\n // Записываем JS файл\n await Bun.write(`${body.name}.js`, body.upload);\n\n const elpmId = process.env.ELPM_PROCESS_ID || \"0\";\n console.log(\n `✅ Серверное приложение ${body.name}.js успешно развернуто (elpm ID: ${elpmId})`,\n );\n\n // Возвращаем ответ сразу\n const response = new Response(\"🖥️ 😎🥳\");\n\n // Перезапускаем elpm процесс в фоне после возврата ответа\n setTimeout(async () => {\n try {\n const restartProc = Bun.spawn([\n \"elpm\",\n \"restart\",\n elpmId,\n ]);\n const restartResult = await restartProc.exited;\n if (restartResult !== 0) {\n console.error(\n `❌ Ошибка перезапуска elpm процесса ${elpmId}: код выхода ${restartResult}`,\n );\n } else {\n console.log(\n `✅ elpm процесс ${elpmId} успешно перезапущен`,\n );\n }\n } catch (error) {\n console.error(\n `❌ Ошибка при перезапуске elpm процесса ${elpmId}:`,\n error,\n );\n }\n }, 0);\n\n return response;\n }\n return new Response(\"❌❌❌\", { status: 500 });\n } catch (error) {\n console.error(\n \"❌ Ошибка развертывания серверного приложения:\",\n error,\n );\n return new Response(\"❌❌❌\", { status: 500 });\n }\n };\n\n export const updateServer = (\n router: string,\n name?: string,\n ): TUpdateServer => {\n return {\n [`/${router}`]: async (req: any) => {\n try {\n if (!isIpAllowed(req)) {\n return new Response(\"Forbidden\", { status: 403 });\n }\n return await Upload.server(req, name);\n } catch {\n return new Response(\"❌❌❌\");\n }\n },\n };\n };\n\n export const updateClient = (\n router: string,\n name?: string,\n ): TUpdateServer => {\n return {\n [`/${router}-client`]: async (req: any) => {\n try {\n if (!isIpAllowed(req)) {\n return new Response(\"Forbidden\", { status: 403 });\n }\n console.log(\"😎🥳\");\n const formdata = await req.formData();\n const u = formdata.get(\"upload\") as string;\n const n = formdata.get(\"name\") as string;\n const folder = name || n || \"build\";\n if (u) {\n return await Upload.client({\n upload: u,\n folder: folder,\n }); // Temporal fix\n }\n return new Response(\"❌❌❌\", { status: 500 });\n } catch {\n return new Response(\"❌❌❌\");\n }\n },\n };\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "ED291D5F50A818FB64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elpm/deploy",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "tool for deploying applications elpm",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"author": "MaSkal <dev@elpmd.online>",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"main": "dist/lib/index.js",
|
|
9
|
+
"module": "dist/lib/index.js",
|
|
10
|
+
"types": "dist/lib/index.d.ts",
|
|
11
|
+
"bin": {
|
|
12
|
+
"el": "./dist/bin/index.js",
|
|
13
|
+
"elpmd": "./dist/bin/index.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"elpm",
|
|
20
|
+
"bun",
|
|
21
|
+
"deploy"
|
|
22
|
+
]
|
|
23
|
+
}
|