@aklry/elpis-cli 0.1.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/dist/arguments.d.ts +19 -0
- package/dist/arguments.d.ts.map +1 -0
- package/dist/arguments.js +64 -0
- package/dist/arguments.js.map +1 -0
- package/dist/builder.d.ts +21 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +32 -0
- package/dist/builder.js.map +1 -0
- package/dist/create.d.ts +26 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +209 -0
- package/dist/create.js.map +1 -0
- package/dist/discovery.d.ts +4 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +57 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +5 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +33 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +112 -0
- package/dist/main.js.map +1 -0
- package/dist/templates.d.ts +9 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +57 -0
- package/dist/templates.js.map +1 -0
- package/package.json +49 -0
- package/templates/basic/app/App.vue +27 -0
- package/templates/basic/app/client.ts +4 -0
- package/templates/basic/app/public/robots.txt +2 -0
- package/templates/basic/app/server.ts +13 -0
- package/templates/basic/elpis.config.ts +9 -0
- package/templates/basic/env.d.ts +5 -0
- package/templates/basic/package.json.template +24 -0
- package/templates/basic/tsconfig.client.json +13 -0
- package/templates/basic/tsconfig.server.json +14 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Command, ConfigOverrides } from "@aklry/elpis-schema";
|
|
2
|
+
export interface CommandOptions {
|
|
3
|
+
action: "command";
|
|
4
|
+
command: Command;
|
|
5
|
+
root?: string;
|
|
6
|
+
config?: string;
|
|
7
|
+
env?: string;
|
|
8
|
+
overrides: ConfigOverrides;
|
|
9
|
+
}
|
|
10
|
+
export interface CreateOptions {
|
|
11
|
+
action: "create";
|
|
12
|
+
directory: string;
|
|
13
|
+
install: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type CliOptions = {
|
|
16
|
+
action: "help" | "version";
|
|
17
|
+
} | CommandOptions | CreateOptions;
|
|
18
|
+
export declare function parseCliArgs(args: string[]): CliOptions;
|
|
19
|
+
//# sourceMappingURL=arguments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;CAC5B;AACD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,cAAc,GAAG,aAAa,CAAC;AAEzF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoDvD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCliArgs = parseCliArgs;
|
|
4
|
+
const node_util_1 = require("node:util");
|
|
5
|
+
function parseCliArgs(args) {
|
|
6
|
+
const { positionals, values } = (0, node_util_1.parseArgs)({
|
|
7
|
+
args,
|
|
8
|
+
options: {
|
|
9
|
+
help: { type: "boolean", short: "h" },
|
|
10
|
+
version: { type: "boolean", short: "v" },
|
|
11
|
+
root: { type: "string" },
|
|
12
|
+
config: { type: "string" },
|
|
13
|
+
env: { type: "string" },
|
|
14
|
+
host: { type: "string" },
|
|
15
|
+
port: { type: "string" },
|
|
16
|
+
"no-install": { type: "boolean" },
|
|
17
|
+
},
|
|
18
|
+
allowPositionals: true,
|
|
19
|
+
strict: true,
|
|
20
|
+
});
|
|
21
|
+
if (values.help || args.length === 0)
|
|
22
|
+
return { action: "help" };
|
|
23
|
+
if (values.version)
|
|
24
|
+
return { action: "version" };
|
|
25
|
+
const command = positionals[0];
|
|
26
|
+
if (command === "create") {
|
|
27
|
+
if (positionals.length !== 2 || !positionals[1]?.trim()) {
|
|
28
|
+
throw new Error("create requires exactly one project directory.");
|
|
29
|
+
}
|
|
30
|
+
for (const key of ["root", "config", "env", "host", "port"]) {
|
|
31
|
+
if (values[key] !== undefined)
|
|
32
|
+
throw new Error("--" + key + " cannot be used with create.");
|
|
33
|
+
}
|
|
34
|
+
return { action: "create", directory: positionals[1], install: !values["no-install"] };
|
|
35
|
+
}
|
|
36
|
+
if (values["no-install"] !== undefined)
|
|
37
|
+
throw new Error("--no-install can only be used with create.");
|
|
38
|
+
if (positionals.length !== 1 || !["dev", "build", "start"].includes(command ?? "")) {
|
|
39
|
+
throw new Error("Unknown command. Use elpis dev, build or start; see elpis --help.");
|
|
40
|
+
}
|
|
41
|
+
if (command === "build" && (values.host !== undefined || values.port !== undefined)) {
|
|
42
|
+
throw new Error("--host and --port apply only to dev or start.");
|
|
43
|
+
}
|
|
44
|
+
for (const key of ["root", "config", "env", "host"]) {
|
|
45
|
+
if (values[key] !== undefined && !values[key].trim())
|
|
46
|
+
throw new Error("--" + key + " cannot be empty.");
|
|
47
|
+
}
|
|
48
|
+
const overrides = {};
|
|
49
|
+
if (values.host !== undefined)
|
|
50
|
+
overrides.host = values.host;
|
|
51
|
+
if (values.port !== undefined) {
|
|
52
|
+
if (!/^\d+$/.test(values.port) || Number(values.port) > 65535) {
|
|
53
|
+
throw new Error("--port must be an integer between 0 and 65535.");
|
|
54
|
+
}
|
|
55
|
+
overrides.port = Number(values.port);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
action: "command", command: command, overrides,
|
|
59
|
+
...(values.root !== undefined ? { root: values.root } : {}),
|
|
60
|
+
...(values.config !== undefined ? { config: values.config } : {}),
|
|
61
|
+
...(values.env !== undefined ? { env: values.env } : {}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type BuildManifest, type ConfigOverrides } from "@aklry/elpis-schema";
|
|
2
|
+
export interface BuilderOptions {
|
|
3
|
+
rootDir: string;
|
|
4
|
+
configFile: string;
|
|
5
|
+
env: string;
|
|
6
|
+
overrides?: ConfigOverrides;
|
|
7
|
+
log?: (message: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface DevelopmentServer {
|
|
10
|
+
url: string;
|
|
11
|
+
closed: Promise<void>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
interface BuilderModule {
|
|
15
|
+
FRAMEWORK_VERSION: string;
|
|
16
|
+
build(options: BuilderOptions): Promise<BuildManifest>;
|
|
17
|
+
dev(options: BuilderOptions): Promise<DevelopmentServer>;
|
|
18
|
+
}
|
|
19
|
+
export declare function loadBuilder(rootDir: string): BuilderModule;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAElG,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AACD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,UAAU,aAAa;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC1D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAqB1D"}
|
package/dist/builder.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadBuilder = loadBuilder;
|
|
7
|
+
const node_module_1 = require("node:module");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const elpis_schema_1 = require("@aklry/elpis-schema");
|
|
10
|
+
function loadBuilder(rootDir) {
|
|
11
|
+
const businessRequire = (0, node_module_1.createRequire)(node_path_1.default.join(rootDir, "package.json"));
|
|
12
|
+
let entry;
|
|
13
|
+
try {
|
|
14
|
+
entry = businessRequire.resolve("@aklry/elpis-builder");
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code !== "MODULE_NOT_FOUND")
|
|
18
|
+
throw error;
|
|
19
|
+
throw new Error("Cannot resolve @aklry/elpis-builder from " + rootDir +
|
|
20
|
+
". Add the matching builder version to this project's devDependencies and install it. In the framework workspace, run pnpm build first.", { cause: error });
|
|
21
|
+
}
|
|
22
|
+
// Keep dependency/runtime failures intact; they are not a missing builder.
|
|
23
|
+
const builder = businessRequire(entry);
|
|
24
|
+
if (typeof builder !== "object" || builder === null ||
|
|
25
|
+
!("FRAMEWORK_VERSION" in builder) || builder.FRAMEWORK_VERSION !== elpis_schema_1.FRAMEWORK_VERSION ||
|
|
26
|
+
!("build" in builder) || typeof builder.build !== "function" ||
|
|
27
|
+
!("dev" in builder) || typeof builder.dev !== "function") {
|
|
28
|
+
throw new Error("@aklry/elpis-builder must match CLI version " + elpis_schema_1.FRAMEWORK_VERSION + ".");
|
|
29
|
+
}
|
|
30
|
+
return builder;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":";;;;;AAsBA,kCAqBC;AA3CD,6CAA4C;AAC5C,0DAA6B;AAC7B,sDAAkG;AAoBlG,SAAgB,WAAW,CAAC,OAAe;IACzC,MAAM,eAAe,GAAG,IAAA,2BAAa,EAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1E,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QAAC,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAAC,CAAC;IAChE,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,kBAAkB;YAAE,MAAM,KAAK,CAAC;QAC9E,MAAM,IAAI,KAAK,CACb,2CAA2C,GAAG,OAAO;YACrD,wIAAwI,EACxI,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,2EAA2E;IAC3E,MAAM,OAAO,GAAY,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAC/C,CAAC,CAAC,mBAAmB,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,iBAAiB,KAAK,gCAAiB;QACpF,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU;QAC5D,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,gCAAiB,GAAG,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,OAAwB,CAAC;AAClC,CAAC"}
|
package/dist/create.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type PackageManager = "pnpm" | "npm" | "yarn";
|
|
2
|
+
export type InstallRunner = (file: string, args: string[], options: {
|
|
3
|
+
cwd: string;
|
|
4
|
+
}) => Promise<void>;
|
|
5
|
+
export interface CreateProjectOptions {
|
|
6
|
+
directory: string;
|
|
7
|
+
frameworkVersion: string;
|
|
8
|
+
install: boolean;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
stdinIsTTY?: boolean;
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
runner?: InstallRunner;
|
|
13
|
+
}
|
|
14
|
+
export interface CreateProjectResult {
|
|
15
|
+
rootDir: string;
|
|
16
|
+
projectName: string;
|
|
17
|
+
packageManager: PackageManager;
|
|
18
|
+
installed: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function detectPackageManager(rootDir: string, env?: NodeJS.ProcessEnv): Promise<PackageManager>;
|
|
21
|
+
export declare function installDependencies(rootDir: string, manager: PackageManager, runner?: InstallRunner): Promise<void>;
|
|
22
|
+
export declare function installCommand(manager: PackageManager): string;
|
|
23
|
+
export declare function devCommand(manager: PackageManager): string;
|
|
24
|
+
export declare function confirmInstall(input: NodeJS.ReadableStream, output: NodeJS.WritableStream): Promise<boolean>;
|
|
25
|
+
export declare function createProject(options: CreateProjectOptions): Promise<CreateProjectResult>;
|
|
26
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtG,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;CACpB;AAwBD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAazH;AAkBD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAE,aAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/I;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAE9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAE1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5G;AA4CD,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6B/F"}
|
package/dist/create.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.detectPackageManager = detectPackageManager;
|
|
40
|
+
exports.installDependencies = installDependencies;
|
|
41
|
+
exports.installCommand = installCommand;
|
|
42
|
+
exports.devCommand = devCommand;
|
|
43
|
+
exports.confirmInstall = confirmInstall;
|
|
44
|
+
exports.createProject = createProject;
|
|
45
|
+
const node_child_process_1 = require("node:child_process");
|
|
46
|
+
const promises_1 = require("node:fs/promises");
|
|
47
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
48
|
+
const readline = __importStar(require("node:readline"));
|
|
49
|
+
const templates_1 = require("./templates");
|
|
50
|
+
const LOCKFILES = [
|
|
51
|
+
["pnpm", "pnpm-lock.yaml"],
|
|
52
|
+
["yarn", "yarn.lock"],
|
|
53
|
+
["npm", "package-lock.json"],
|
|
54
|
+
];
|
|
55
|
+
function packageManagerFromUserAgent(userAgent) {
|
|
56
|
+
if (!userAgent)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (/(?:^|\s)pnpm\//.test(userAgent))
|
|
59
|
+
return "pnpm";
|
|
60
|
+
if (/(?:^|\s)yarn\//.test(userAgent))
|
|
61
|
+
return "yarn";
|
|
62
|
+
if (/(?:^|\s)npm\//.test(userAgent))
|
|
63
|
+
return "npm";
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
async function fileExists(file) {
|
|
67
|
+
try {
|
|
68
|
+
return (await (0, promises_1.lstat)(file)).isFile();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === "ENOENT")
|
|
72
|
+
return false;
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function detectPackageManager(rootDir, env = process.env) {
|
|
77
|
+
const fromAgent = packageManagerFromUserAgent(env.npm_config_user_agent);
|
|
78
|
+
if (fromAgent)
|
|
79
|
+
return fromAgent;
|
|
80
|
+
let directory = node_path_1.default.resolve(rootDir);
|
|
81
|
+
for (;;) {
|
|
82
|
+
for (const [manager, lockfile] of LOCKFILES) {
|
|
83
|
+
if (await fileExists(node_path_1.default.join(directory, lockfile)))
|
|
84
|
+
return manager;
|
|
85
|
+
}
|
|
86
|
+
const parent = node_path_1.default.dirname(directory);
|
|
87
|
+
if (parent === directory)
|
|
88
|
+
break;
|
|
89
|
+
directory = parent;
|
|
90
|
+
}
|
|
91
|
+
return "npm";
|
|
92
|
+
}
|
|
93
|
+
function commandFor(manager) {
|
|
94
|
+
const file = process.platform === "win32" ? manager + ".cmd" : manager;
|
|
95
|
+
return { file, args: ["install"], display: manager + " install" };
|
|
96
|
+
}
|
|
97
|
+
function defaultInstallRunner(file, args, options) {
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
const child = (0, node_child_process_1.spawn)(file, args, { cwd: options.cwd, stdio: "inherit", shell: false });
|
|
100
|
+
child.once("error", reject);
|
|
101
|
+
child.once("exit", (code, signal) => {
|
|
102
|
+
if (code === 0)
|
|
103
|
+
resolve();
|
|
104
|
+
else
|
|
105
|
+
reject(new Error(signal ? `process terminated by ${signal}` : `process exited with code ${code ?? "unknown"}`));
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async function installDependencies(rootDir, manager, runner = defaultInstallRunner) {
|
|
110
|
+
const command = commandFor(manager);
|
|
111
|
+
try {
|
|
112
|
+
await runner(command.file, command.args, { cwd: rootDir });
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw new Error(`Failed to install dependencies. Run "${command.display}" in ${rootDir} and try again.`, { cause: error });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function installCommand(manager) {
|
|
119
|
+
return commandFor(manager).display;
|
|
120
|
+
}
|
|
121
|
+
function devCommand(manager) {
|
|
122
|
+
return manager + " run dev";
|
|
123
|
+
}
|
|
124
|
+
function confirmInstall(input, output) {
|
|
125
|
+
const rl = readline.createInterface({ input, output });
|
|
126
|
+
return new Promise(resolve => {
|
|
127
|
+
rl.question("Install dependencies now? [Y/n] ", answer => {
|
|
128
|
+
rl.close();
|
|
129
|
+
resolve(answer.trim() === "" || /^(?:y|yes)$/i.test(answer.trim()));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function normalizeProjectName(directory) {
|
|
134
|
+
const base = node_path_1.default.basename(directory);
|
|
135
|
+
const projectName = base.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
136
|
+
if (!projectName)
|
|
137
|
+
throw new Error("Project directory name cannot produce a valid npm package name.");
|
|
138
|
+
return projectName;
|
|
139
|
+
}
|
|
140
|
+
async function targetState(rootDir) {
|
|
141
|
+
try {
|
|
142
|
+
const stats = await (0, promises_1.lstat)(rootDir);
|
|
143
|
+
if (!stats.isDirectory())
|
|
144
|
+
throw new Error("Project target already exists and is not a directory: " + rootDir);
|
|
145
|
+
if ((await (0, promises_1.readdir)(rootDir)).length !== 0)
|
|
146
|
+
throw new Error("Project target directory is not empty: " + rootDir);
|
|
147
|
+
return "empty";
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error.code === "ENOENT")
|
|
151
|
+
return "missing";
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function writeStaging(staging, files) {
|
|
156
|
+
for (const file of files) {
|
|
157
|
+
const destination = node_path_1.default.join(staging, file.relativePath);
|
|
158
|
+
await (0, promises_1.mkdir)(node_path_1.default.dirname(destination), { recursive: true });
|
|
159
|
+
await (0, promises_1.writeFile)(destination, file.content, { flag: "wx" });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function copyStagingIntoEmptyTarget(staging, target, files) {
|
|
163
|
+
const created = [];
|
|
164
|
+
try {
|
|
165
|
+
for (const file of files) {
|
|
166
|
+
const destination = node_path_1.default.join(target, file.relativePath);
|
|
167
|
+
await (0, promises_1.mkdir)(node_path_1.default.dirname(destination), { recursive: true });
|
|
168
|
+
await (0, promises_1.copyFile)(node_path_1.default.join(staging, file.relativePath), destination, promises_1.constants.COPYFILE_EXCL);
|
|
169
|
+
created.push(destination);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
await Promise.all(created.map(file => (0, promises_1.rm)(file, { force: true })));
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function createProject(options) {
|
|
178
|
+
const cwd = node_path_1.default.resolve(options.cwd ?? process.cwd());
|
|
179
|
+
const rootDir = node_path_1.default.resolve(cwd, options.directory);
|
|
180
|
+
const projectName = normalizeProjectName(rootDir);
|
|
181
|
+
const manager = await detectPackageManager(rootDir, options.env ?? process.env);
|
|
182
|
+
const state = await targetState(rootDir);
|
|
183
|
+
const files = await (0, templates_1.renderTemplate)({ projectName, frameworkVersion: options.frameworkVersion });
|
|
184
|
+
const parent = node_path_1.default.dirname(rootDir);
|
|
185
|
+
await (0, promises_1.mkdir)(parent, { recursive: true });
|
|
186
|
+
const staging = await (0, promises_1.mkdtemp)(node_path_1.default.join(parent, ".elpis-create-"));
|
|
187
|
+
try {
|
|
188
|
+
await writeStaging(staging, files);
|
|
189
|
+
if (state === "missing")
|
|
190
|
+
await (0, promises_1.rename)(staging, rootDir);
|
|
191
|
+
else
|
|
192
|
+
await copyStagingIntoEmptyTarget(staging, rootDir, files);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
await (0, promises_1.rm)(staging, { recursive: true, force: true });
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
await (0, promises_1.rm)(staging, { recursive: true, force: true });
|
|
199
|
+
let installed = false;
|
|
200
|
+
if (options.install) {
|
|
201
|
+
const interactive = options.stdinIsTTY ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
202
|
+
if (interactive && await confirmInstall(process.stdin, process.stdout)) {
|
|
203
|
+
await installDependencies(rootDir, manager, options.runner);
|
|
204
|
+
installed = true;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { rootDir, projectName, packageManager: manager, installed };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CommandOptions } from "./arguments";
|
|
2
|
+
export declare function discoverRoot(options: CommandOptions, cwd?: string): Promise<string>;
|
|
3
|
+
export declare function discoverConfig(rootDir: string, explicit?: string): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBhG;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.discoverRoot = discoverRoot;
|
|
7
|
+
exports.discoverConfig = discoverConfig;
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
async function isFile(file) {
|
|
11
|
+
try {
|
|
12
|
+
return (await (0, promises_1.stat)(file)).isFile();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error.code === "ENOENT")
|
|
16
|
+
return false;
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function discoverRoot(options, cwd = process.cwd()) {
|
|
21
|
+
if (options.root !== undefined || (options.config !== undefined && options.command !== "start")) {
|
|
22
|
+
const root = node_path_1.default.resolve(cwd, options.root ?? ".");
|
|
23
|
+
if (!(await (0, promises_1.stat)(root)).isDirectory())
|
|
24
|
+
throw new Error("Project root is not a directory: " + root);
|
|
25
|
+
return root;
|
|
26
|
+
}
|
|
27
|
+
let directory = node_path_1.default.resolve(cwd);
|
|
28
|
+
for (;;) {
|
|
29
|
+
if (options.command === "start") {
|
|
30
|
+
if (await isFile(node_path_1.default.join(directory, "dist/manifest.json")))
|
|
31
|
+
return directory;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
for (const name of ["elpis.config.ts", "elpis.config.js", "elpis.config.cjs"]) {
|
|
35
|
+
if (await isFile(node_path_1.default.join(directory, name)))
|
|
36
|
+
return directory;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const parent = node_path_1.default.dirname(directory);
|
|
40
|
+
if (parent === directory)
|
|
41
|
+
break;
|
|
42
|
+
directory = parent;
|
|
43
|
+
}
|
|
44
|
+
throw new Error(options.command === "start"
|
|
45
|
+
? "No dist/manifest.json found. Run elpis build first or specify --root."
|
|
46
|
+
: "No elpis.config.ts/.js/.cjs found. Specify --root and --config for a custom configuration.");
|
|
47
|
+
}
|
|
48
|
+
async function discoverConfig(rootDir, explicit) {
|
|
49
|
+
const candidates = explicit !== undefined ? [explicit] : ["elpis.config.ts", "elpis.config.js", "elpis.config.cjs"];
|
|
50
|
+
for (const candidate of candidates) {
|
|
51
|
+
const file = node_path_1.default.resolve(rootDir, candidate);
|
|
52
|
+
if (await isFile(file))
|
|
53
|
+
return file;
|
|
54
|
+
}
|
|
55
|
+
throw new Error("Project configuration does not exist in " + rootDir + ".");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":";;;;;AAYA,oCAsBC;AAED,wCAOC;AA3CD,+CAAwC;AACxC,0DAA6B;AAG7B,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QAAC,OAAO,CAAC,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAAC,CAAC;IAC3C,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,IAAI,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,SAAS,CAAC;QACR,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAChC,IAAI,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBAC9E,IAAI,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBAAE,OAAO,SAAS,CAAC;YACjE,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM;QAChC,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO;QACzC,CAAC,CAAC,uEAAuE;QACzE,CAAC,CAAC,4FAA4F,CAAC,CAAC;AACpG,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,QAAiB;IACrE,MAAM,UAAU,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IACpH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;AAC9E,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const main_1 = require("./main");
|
|
5
|
+
void (0, main_1.main)().catch((error) => {
|
|
6
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
7
|
+
process.exitCode = 1;
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iCAA8B;AAE9B,KAAK,IAAA,WAAI,GAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IAAG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE;AAEpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CA0BhF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.manageLifecycle = manageLifecycle;
|
|
4
|
+
function manageLifecycle(resource, closed) {
|
|
5
|
+
let closing;
|
|
6
|
+
const shutdown = (failure) => {
|
|
7
|
+
if (failure !== undefined) {
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
console.error(failure instanceof Error ? failure.message : String(failure));
|
|
10
|
+
}
|
|
11
|
+
if (closing)
|
|
12
|
+
return closing;
|
|
13
|
+
const timeout = setTimeout(() => {
|
|
14
|
+
console.error("Timed out while shutting down Elpis.");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}, 10000);
|
|
17
|
+
closing = Promise.resolve().then(() => resource.close()).catch((error) => {
|
|
18
|
+
process.exitCode = 1;
|
|
19
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
20
|
+
}).finally(() => {
|
|
21
|
+
clearTimeout(timeout);
|
|
22
|
+
process.off("SIGINT", onSignal);
|
|
23
|
+
process.off("SIGTERM", onSignal);
|
|
24
|
+
});
|
|
25
|
+
return closing;
|
|
26
|
+
};
|
|
27
|
+
const onSignal = () => { void shutdown(); };
|
|
28
|
+
process.on("SIGINT", onSignal);
|
|
29
|
+
process.on("SIGTERM", onSignal);
|
|
30
|
+
if (closed)
|
|
31
|
+
void closed.catch((error) => shutdown(error));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":";;AAEA,0CA0BC;AA1BD,SAAgB,eAAe,CAAC,QAAkB,EAAE,MAAsB;IACxE,IAAI,OAAkC,CAAC;IACvC,MAAM,QAAQ,GAAG,CAAC,OAAiB,EAAiB,EAAE;QACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAmEA,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCtE"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.main = main;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const elpis_core_1 = require("@aklry/elpis-core");
|
|
9
|
+
const elpis_schema_1 = require("@aklry/elpis-schema");
|
|
10
|
+
const arguments_1 = require("./arguments");
|
|
11
|
+
const create_1 = require("./create");
|
|
12
|
+
const discovery_1 = require("./discovery");
|
|
13
|
+
const builder_1 = require("./builder");
|
|
14
|
+
const lifecycle_1 = require("./lifecycle");
|
|
15
|
+
const help = [
|
|
16
|
+
"Usage: elpis <command> [options]",
|
|
17
|
+
"",
|
|
18
|
+
"Commands:",
|
|
19
|
+
" create Create a new TypeScript API and Vue project",
|
|
20
|
+
" dev Start the development API and Vue hot-reload server",
|
|
21
|
+
" build Typecheck and build production artifacts",
|
|
22
|
+
" start Run previously built production artifacts",
|
|
23
|
+
"",
|
|
24
|
+
"Options:",
|
|
25
|
+
" --root <directory> Business project root",
|
|
26
|
+
" --config <file> Configuration path relative to root",
|
|
27
|
+
" --env <name> Business environment (ELPIS_ENV)",
|
|
28
|
+
" --host <host> Listen address (dev/start)",
|
|
29
|
+
" --port <port> Listen port, 0 selects a free port (dev/start)",
|
|
30
|
+
" create <directory> Target directory for a new project",
|
|
31
|
+
" --no-install Skip dependency installation after create",
|
|
32
|
+
" -h, --help Show help",
|
|
33
|
+
" -v, --version Show framework version",
|
|
34
|
+
"",
|
|
35
|
+
"start --config accepts only compiled .js/.cjs files inside dist.",
|
|
36
|
+
].join("\n");
|
|
37
|
+
async function startProduction(options, rootDir, env) {
|
|
38
|
+
const outDir = node_path_1.default.join(rootDir, "dist");
|
|
39
|
+
const manifest = await (0, elpis_core_1.readManifest)(outDir).catch((error) => {
|
|
40
|
+
if (error.code === "ENOENT") {
|
|
41
|
+
throw new Error("Production manifest or artifacts are missing. Run elpis build first.", { cause: error });
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
});
|
|
45
|
+
let configRelative = manifest.config;
|
|
46
|
+
if (options.config !== undefined) {
|
|
47
|
+
if (!/\.(?:cjs|js)$/.test(options.config)) {
|
|
48
|
+
throw new Error("start --config requires a compiled .js or .cjs file inside dist.");
|
|
49
|
+
}
|
|
50
|
+
configRelative = node_path_1.default.relative(outDir, node_path_1.default.resolve(rootDir, options.config));
|
|
51
|
+
}
|
|
52
|
+
const [configFile, serverEntry, clientDir, publicDir] = await Promise.all([
|
|
53
|
+
(0, elpis_core_1.resolveArtifact)(outDir, configRelative),
|
|
54
|
+
manifest.serverEntry === undefined ? undefined : (0, elpis_core_1.resolveArtifact)(outDir, manifest.serverEntry),
|
|
55
|
+
(0, elpis_core_1.resolveArtifact)(outDir, manifest.clientDir),
|
|
56
|
+
(0, elpis_core_1.resolveArtifact)(outDir, manifest.publicDir),
|
|
57
|
+
]);
|
|
58
|
+
for (const moduleFile of [configFile, ...(serverEntry ? [serverEntry] : [])]) {
|
|
59
|
+
if (!/\.(?:cjs|js)$/.test(moduleFile)) {
|
|
60
|
+
throw new Error("Production config and server entry must be compiled .js or .cjs files inside dist.");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const modules = manifest.formatVersion === 2
|
|
64
|
+
? await Promise.all(manifest.modules.map(async (record) => ({ ...record, file: await (0, elpis_core_1.resolveArtifact)(outDir, record.file) })))
|
|
65
|
+
: [];
|
|
66
|
+
const config = await (0, elpis_core_1.loadConfig)(configFile, { rootDir, command: "start", env }, options.overrides);
|
|
67
|
+
const running = await (0, elpis_core_1.start)({ rootDir, config, ...(serverEntry ? { serverEntry } : {}), modules, env, clientDir, publicDir });
|
|
68
|
+
(0, lifecycle_1.manageLifecycle)(running);
|
|
69
|
+
console.log("Elpis listening at " + running.url);
|
|
70
|
+
}
|
|
71
|
+
async function main(args = process.argv.slice(2)) {
|
|
72
|
+
const options = (0, arguments_1.parseCliArgs)(args);
|
|
73
|
+
if (options.action === "help") {
|
|
74
|
+
console.log(help);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (options.action === "version") {
|
|
78
|
+
console.log(elpis_schema_1.FRAMEWORK_VERSION);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (options.action === "create") {
|
|
82
|
+
const result = await (0, create_1.createProject)({ directory: options.directory, frameworkVersion: elpis_schema_1.FRAMEWORK_VERSION, install: options.install });
|
|
83
|
+
console.log("Created Elpis project at " + result.rootDir);
|
|
84
|
+
if (!result.installed)
|
|
85
|
+
console.log("Install dependencies with: " + (0, create_1.installCommand)(result.packageManager));
|
|
86
|
+
console.log("Next steps:\n cd " + result.rootDir + "\n " + (0, create_1.devCommand)(result.packageManager));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// The discriminant's command branch contains the validated command options.
|
|
90
|
+
if (options.action !== "command")
|
|
91
|
+
return;
|
|
92
|
+
process.env.NODE_ENV = options.command === "dev" ? "development" : "production";
|
|
93
|
+
const env = options.env ?? process.env.ELPIS_ENV ?? (options.command === "dev" ? "local" : "prod");
|
|
94
|
+
process.env.ELPIS_ENV = env;
|
|
95
|
+
const rootDir = await (0, discovery_1.discoverRoot)(options);
|
|
96
|
+
if (options.command === "start") {
|
|
97
|
+
await startProduction(options, rootDir, env);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const configFile = await (0, discovery_1.discoverConfig)(rootDir, options.config);
|
|
101
|
+
const builder = (0, builder_1.loadBuilder)(rootDir);
|
|
102
|
+
const buildOptions = { rootDir, configFile, env, overrides: options.overrides, log: console.log };
|
|
103
|
+
if (options.command === "build") {
|
|
104
|
+
await builder.build(buildOptions);
|
|
105
|
+
console.log("Build complete: " + node_path_1.default.join(rootDir, "dist"));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const server = await builder.dev(buildOptions);
|
|
109
|
+
(0, lifecycle_1.manageLifecycle)(server, server.closed);
|
|
110
|
+
console.log("Elpis listening at " + server.url);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RenderedTemplateFile {
|
|
2
|
+
relativePath: string;
|
|
3
|
+
content: Buffer;
|
|
4
|
+
}
|
|
5
|
+
export declare function renderTemplate(options: {
|
|
6
|
+
projectName: string;
|
|
7
|
+
frameworkVersion: string;
|
|
8
|
+
}): Promise<RenderedTemplateFile[]>;
|
|
9
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AA2BD,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAmBlC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderTemplate = renderTemplate;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const TEMPLATE_ROOT = node_path_1.default.resolve(__dirname, "../templates/basic");
|
|
10
|
+
function assertSafeRelative(relativePath) {
|
|
11
|
+
if (!relativePath || node_path_1.default.isAbsolute(relativePath))
|
|
12
|
+
throw new Error("Template contains an invalid file path.");
|
|
13
|
+
const segments = relativePath.split(/[\\/]+/);
|
|
14
|
+
if (segments.some(segment => segment === "" || segment === "." || segment === "..")) {
|
|
15
|
+
throw new Error("Template contains an invalid file path: " + relativePath);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function collectFiles(directory, relative = "") {
|
|
19
|
+
const entries = await (0, promises_1.readdir)(directory, { withFileTypes: true });
|
|
20
|
+
const files = [];
|
|
21
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
22
|
+
const childRelative = relative ? node_path_1.default.join(relative, entry.name) : entry.name;
|
|
23
|
+
assertSafeRelative(childRelative);
|
|
24
|
+
const child = node_path_1.default.join(directory, entry.name);
|
|
25
|
+
if (entry.isSymbolicLink())
|
|
26
|
+
throw new Error("Template symlinks are not supported: " + childRelative);
|
|
27
|
+
if (entry.isDirectory())
|
|
28
|
+
files.push(...await collectFiles(child, childRelative));
|
|
29
|
+
else if (entry.isFile())
|
|
30
|
+
files.push(childRelative);
|
|
31
|
+
else
|
|
32
|
+
throw new Error("Template entry is not a regular file: " + childRelative);
|
|
33
|
+
}
|
|
34
|
+
return files;
|
|
35
|
+
}
|
|
36
|
+
async function renderTemplate(options) {
|
|
37
|
+
const rootStat = await (0, promises_1.lstat)(TEMPLATE_ROOT).catch(() => undefined);
|
|
38
|
+
if (!rootStat?.isDirectory())
|
|
39
|
+
throw new Error("The bundled basic project template is missing.");
|
|
40
|
+
const relativeFiles = await collectFiles(TEMPLATE_ROOT);
|
|
41
|
+
const rendered = [];
|
|
42
|
+
for (const relativePath of relativeFiles) {
|
|
43
|
+
const source = node_path_1.default.join(TEMPLATE_ROOT, relativePath);
|
|
44
|
+
const content = (await (0, promises_1.readFile)(source, "utf8"))
|
|
45
|
+
.replaceAll("__PROJECT_NAME__", options.projectName)
|
|
46
|
+
.replaceAll("__ELPIS_VERSION__", options.frameworkVersion);
|
|
47
|
+
if (/__PROJECT_|__ELPIS_/.test(content)) {
|
|
48
|
+
throw new Error("The bundled project template contains an unresolved placeholder: " + relativePath);
|
|
49
|
+
}
|
|
50
|
+
rendered.push({
|
|
51
|
+
relativePath: relativePath.endsWith(".template") ? relativePath.slice(0, -".template".length) : relativePath,
|
|
52
|
+
content: Buffer.from(content, "utf8"),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return rendered;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aklry/elpis-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Elpis 命令行入口",
|
|
5
|
+
"license": "ISC",
|
|
6
|
+
"type": "commonjs",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*.js",
|
|
17
|
+
"dist/**/*.d.ts",
|
|
18
|
+
"dist/**/*.map",
|
|
19
|
+
"templates/**/*"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.14.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@aklry/elpis-core": "0.1.0",
|
|
26
|
+
"@aklry/elpis-schema": "0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"bin": {
|
|
29
|
+
"elpis": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@aklry/elpis-builder": "0.1.0"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@aklry/elpis-builder": "^0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependenciesMeta": {
|
|
38
|
+
"@aklry/elpis-builder": {
|
|
39
|
+
"optional": true
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc -b",
|
|
44
|
+
"dev": "tsx src/index.ts",
|
|
45
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
46
|
+
"clean": "tsc -b --clean",
|
|
47
|
+
"start": "node dist/index.js"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from "vue";
|
|
3
|
+
|
|
4
|
+
const message = ref("Loading...");
|
|
5
|
+
const count = ref(0);
|
|
6
|
+
|
|
7
|
+
async function loadMessage(): Promise<void> {
|
|
8
|
+
const response = await fetch("/api/hello");
|
|
9
|
+
const body = await response.json() as { message?: string };
|
|
10
|
+
message.value = body.message ?? "No message";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
void loadMessage();
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<main>
|
|
18
|
+
<h1>{{ message }}</h1>
|
|
19
|
+
<button type="button" @click="count++">Clicked {{ count }} times</button>
|
|
20
|
+
<button type="button" @click="loadMessage">Refresh API</button>
|
|
21
|
+
</main>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<style scoped>
|
|
25
|
+
main { max-width: 720px; margin: 4rem auto; padding: 0 1rem; font-family: sans-serif; }
|
|
26
|
+
button { margin-right: 0.5rem; padding: 0.5rem 0.75rem; }
|
|
27
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ServerModule } from "@aklry/elpis-core";
|
|
2
|
+
|
|
3
|
+
const setup: ServerModule = ({ app, config }) => {
|
|
4
|
+
app.use(async (ctx, next) => {
|
|
5
|
+
if (ctx.method === "GET" && ctx.path === "/api/hello") {
|
|
6
|
+
ctx.body = { message: "Hello from " + config.name };
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
await next();
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default setup;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineConfig } from "@aklry/elpis-core";
|
|
2
|
+
|
|
3
|
+
export default defineConfig(({ env }) => ({
|
|
4
|
+
name: "Elpis App",
|
|
5
|
+
server: { entry: "app/server.ts", host: "127.0.0.1", port: 3000 },
|
|
6
|
+
client: { entry: "app/client.ts" },
|
|
7
|
+
publicDir: "app/public",
|
|
8
|
+
public: { title: "Elpis App", environment: env },
|
|
9
|
+
}));
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__PROJECT_NAME__",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "elpis dev",
|
|
8
|
+
"build": "elpis build",
|
|
9
|
+
"start": "elpis start"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@aklry/elpis-core": "__ELPIS_VERSION__",
|
|
13
|
+
"@aklry/elpis-cli": "__ELPIS_VERSION__"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@aklry/elpis-builder": "__ELPIS_VERSION__",
|
|
17
|
+
"@aklry/elpis-client": "__ELPIS_VERSION__",
|
|
18
|
+
"vue": "^3.5.21",
|
|
19
|
+
"vue-router": "^4.5.0",
|
|
20
|
+
"pinia": "^3.0.0",
|
|
21
|
+
"element-plus": "^2.10.0",
|
|
22
|
+
"@types/node": "^22.15.3"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
9
|
+
"types": [],
|
|
10
|
+
"noEmit": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["app/client.ts", "app/**/*.vue", "env.d.ts"]
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "Node16",
|
|
5
|
+
"moduleResolution": "Node16",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"types": ["node"],
|
|
10
|
+
"rootDir": ".",
|
|
11
|
+
"outDir": "dist/server"
|
|
12
|
+
},
|
|
13
|
+
"include": ["elpis.config.ts", "app/server.ts"]
|
|
14
|
+
}
|