@alcedocore/cli 0.0.1-rc.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.md +102 -0
- package/dist/commands/add-endpoint.js +104 -0
- package/dist/commands/add-migration.js +80 -0
- package/dist/commands/add-nav-item.js +72 -0
- package/dist/commands/add-page.js +64 -0
- package/dist/commands/build-frontend.js +126 -0
- package/dist/commands/compile-pages.js +120 -0
- package/dist/commands/connect.js +122 -0
- package/dist/commands/deploy.js +74 -0
- package/dist/commands/dev.js +13 -0
- package/dist/commands/init-core.js +900 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.test.js +84 -0
- package/dist/commands/migrate.js +22 -0
- package/dist/commands/proxy.js +157 -0
- package/dist/commands/publish.js +81 -0
- package/dist/commands/replay.js +142 -0
- package/dist/commands/serve-frontend.js +92 -0
- package/dist/config.js +110 -0
- package/dist/config.test.js +48 -0
- package/dist/index.js +81 -0
- package/dist/integration/cli-api.test.js +116 -0
- package/dist/utils/ejs-renderer.js +46 -0
- package/dist/utils/ejs-renderer.test.js +93 -0
- package/dist/utils/formatting.js +65 -0
- package/dist/utils/generateTimestamp.js +17 -0
- package/dist/utils/logger.js +33 -0
- package/dist/utils/validation.js +15 -0
- package/package.json +41 -0
- package/src/commands/add-endpoint.ts +157 -0
- package/src/commands/add-migration.ts +102 -0
- package/src/commands/add-nav-item.ts +106 -0
- package/src/commands/add-page.ts +100 -0
- package/src/commands/build-frontend.ts +148 -0
- package/src/commands/connect.ts +98 -0
- package/src/commands/deploy.ts +85 -0
- package/src/commands/dev.ts +12 -0
- package/src/commands/init-core.ts +1019 -0
- package/src/commands/init.test.ts +92 -0
- package/src/commands/init.ts +171 -0
- package/src/commands/migrate.ts +20 -0
- package/src/commands/proxy.ts +206 -0
- package/src/commands/publish.ts +106 -0
- package/src/commands/serve-frontend.ts +103 -0
- package/src/config.test.ts +50 -0
- package/src/config.ts +125 -0
- package/src/index.ts +100 -0
- package/src/integration/cli-api.test.ts +143 -0
- package/src/utils/ejs-renderer.ts +55 -0
- package/src/utils/formatting.ts +62 -0
- package/src/utils/generateTimestamp.ts +16 -0
- package/src/utils/logger.ts +27 -0
- package/src/utils/validation.ts +13 -0
- package/templates/endpoint/handler.js.ejs +23 -0
- package/templates/endpoint/handler.py.ejs +23 -0
- package/templates/migration/down.sql.ejs +6 -0
- package/templates/migration/up.sql.ejs +11 -0
- package/templates/page/page.vue.ejs +63 -0
- package/templates/plugin/Dockerfile.ejs +13 -0
- package/templates/plugin/Dockerfile.node.ejs +14 -0
- package/templates/plugin/README.md.ejs +19 -0
- package/templates/plugin/gitignore.ejs +6 -0
- package/templates/plugin/manifest.json.ejs +18 -0
- package/templates/plugin/migrations/.gitkeep +0 -0
- package/templates/plugin/pages/.gitkeep +0 -0
- package/templates/plugin/public/.gitkeep +0 -0
- package/templates/plugin/server.js.ejs +27 -0
- package/templates/plugin/server.py.ejs +32 -0
- package/tsconfig.json +16 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,120 @@
|
|
|
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.compilePagesCommand = void 0;
|
|
7
|
+
const esbuild_1 = __importDefault(require("esbuild"));
|
|
8
|
+
// @ts-ignore - unplugin-vue exports ./esbuild but types are not fully resolved
|
|
9
|
+
const esbuild_2 = __importDefault(require("unplugin-vue/esbuild"));
|
|
10
|
+
const esbuild_plugin_postcss_1 = __importDefault(require("@chialab/esbuild-plugin-postcss"));
|
|
11
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const node_url_1 = require("node:url");
|
|
14
|
+
const node_process_1 = require("node:process");
|
|
15
|
+
const commander_1 = require("commander");
|
|
16
|
+
exports.compilePagesCommand = new commander_1.Command("compile-pages")
|
|
17
|
+
.description("Compile all pages into a dist directory")
|
|
18
|
+
.action(async (opts, cmd) => {
|
|
19
|
+
renderPages().catch((err) => {
|
|
20
|
+
console.error(`[page-compiler] Failed:`, err);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
const compilerDir = path_1.default.dirname((0, node_url_1.fileURLToPath)((0, node_process_1.cwd)()));
|
|
25
|
+
const compilerRootDir = path_1.default.join(compilerDir, "..");
|
|
26
|
+
const compilerNodeModules = path_1.default.join(compilerRootDir, "node_modules");
|
|
27
|
+
function parseArgs() {
|
|
28
|
+
let plugin = "./pages";
|
|
29
|
+
let output = "./pages/dist";
|
|
30
|
+
for (let i = 0; i < process.argv.length; i++) {
|
|
31
|
+
const arg = process.argv[i];
|
|
32
|
+
if (arg === "--plugin" && i + 1 < process.argv.length) {
|
|
33
|
+
plugin = process.argv[i + 1];
|
|
34
|
+
}
|
|
35
|
+
else if (arg.startsWith("--plugin=")) {
|
|
36
|
+
plugin = arg.split("=")[1];
|
|
37
|
+
}
|
|
38
|
+
if (arg === "--output" && i + 1 < process.argv.length) {
|
|
39
|
+
output = process.argv[i + 1];
|
|
40
|
+
}
|
|
41
|
+
else if (arg.startsWith("--output=")) {
|
|
42
|
+
output = arg.split("=")[1];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { plugin, output };
|
|
46
|
+
}
|
|
47
|
+
let currentImportsGlobalVue = new Set();
|
|
48
|
+
let importingModules = "createTextVNode,defineComponent,toDisplayString,createElementVNode,openBlock,createElementBlock,Fragment,renderSlot,createCommentVNode,useModel,vModelText,vModelSelect,withDirectives,withKeys,normalizeClass,renderList,computed,ref,onMounted,normalizeStyle,createComment,resolveComponent,resolveDirective,withCtx,toHandlers,mergeProps,createSlots,withScopeId,createStaticVNode,createBlock,popScopeId,pushScopeId,isRef,unref,isReactive,toRef,toRefs,isProxy,isReadonly,shallowRef,triggerRef,customRef,markRaw,toRaw,reactive,readonly,watch,watchEffect,watchPostEffect,watchSyncEffect,provide,inject,getCurrentInstance,h,nextTick,onBeforeMount,onBeforeUpdate,onBeforeUnmount,onUpdated,onUnmounted,onActivated,onDeactivated,onErrorCaptured,onRenderTracked,onRenderTriggered,isVNode,cloneVNode,createVNode,Transition,TransitionGroup,Teleport,Suspense,KeepAlive,defineAsyncComponent,defineEmits,defineExpose,defineProps,withDefaults,useAttrs,useSlots,useCssModule,useCssVars,EffectScope,effectScope,getCurrentScope,onScopeDispose,useId,resolveDynamicComponent,normalizeProps,withModifiers,vShow";
|
|
49
|
+
currentImportsGlobalVue = new Set(importingModules.split(","));
|
|
50
|
+
const vueGlobalPlugin = {
|
|
51
|
+
name: "vue-global",
|
|
52
|
+
setup(build) {
|
|
53
|
+
build.onResolve({ filter: /^vue$/ }, async (args) => {
|
|
54
|
+
let source = await node_fs_1.default.promises.readFile(args.importer, "utf8");
|
|
55
|
+
const matchingImports = source.match(/import\s*{\s*([^}]*)\s*}\s*from\s*["']vue["']/) ||
|
|
56
|
+
[];
|
|
57
|
+
// console.log(matchingImports);
|
|
58
|
+
if (matchingImports[1]) {
|
|
59
|
+
importingModules = matchingImports[1] + "," + importingModules;
|
|
60
|
+
for (const imp of importingModules.split(",")) {
|
|
61
|
+
currentImportsGlobalVue.add(imp.trim());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
path: args.path,
|
|
66
|
+
namespace: "vue-global",
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
build.onLoad({ filter: /.*/, namespace: "vue-global" }, () => {
|
|
70
|
+
return {
|
|
71
|
+
contents: `
|
|
72
|
+
export const { ${[...currentImportsGlobalVue].join(",")} } = window.vue;
|
|
73
|
+
export default window.vue;
|
|
74
|
+
`,
|
|
75
|
+
loader: "js",
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
async function renderPages() {
|
|
81
|
+
const args = parseArgs();
|
|
82
|
+
const pluginPath = path_1.default.resolve(process.cwd(), args.plugin);
|
|
83
|
+
const outputDir = path_1.default.resolve(process.cwd(), args.output);
|
|
84
|
+
const mainPath = path_1.default.join(pluginPath, "main.ts");
|
|
85
|
+
console.log(`[page-compiler] Compiling pages from: ${pluginPath}`);
|
|
86
|
+
console.log(`[page-compiler] Output directory: ${outputDir}`);
|
|
87
|
+
if (!node_fs_1.default.existsSync(mainPath)) {
|
|
88
|
+
console.error(`[page-compiler] Entry point not found: ${mainPath}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
await node_fs_1.default.promises.mkdir(outputDir, { recursive: true });
|
|
92
|
+
const buildOptions = {
|
|
93
|
+
entryPoints: [mainPath],
|
|
94
|
+
bundle: true,
|
|
95
|
+
format: "esm",
|
|
96
|
+
target: "es2020",
|
|
97
|
+
platform: "browser",
|
|
98
|
+
sourcemap: false,
|
|
99
|
+
minify: false,
|
|
100
|
+
outdir: outputDir,
|
|
101
|
+
plugins: [(0, esbuild_plugin_postcss_1.default)(), vueGlobalPlugin, (0, esbuild_2.default)({ sourceMap: false })],
|
|
102
|
+
alias: {
|
|
103
|
+
vue: path_1.default.join(compilerNodeModules, "vue", "dist", "vue.esm-bundler.js"),
|
|
104
|
+
},
|
|
105
|
+
loader: {
|
|
106
|
+
".css": "css",
|
|
107
|
+
},
|
|
108
|
+
write: true,
|
|
109
|
+
external: ["vue"],
|
|
110
|
+
};
|
|
111
|
+
await esbuild_1.default.build(buildOptions);
|
|
112
|
+
const mainJsPath = path_1.default.join(outputDir, "main.js");
|
|
113
|
+
const pluginPagesJsPath = path_1.default.join(outputDir, "plugin-pages.js");
|
|
114
|
+
if (node_fs_1.default.existsSync(mainJsPath)) {
|
|
115
|
+
await node_fs_1.default.promises.rename(mainJsPath, pluginPagesJsPath);
|
|
116
|
+
console.log(`[page-compiler] Renamed main.js -> plugin-pages.js`);
|
|
117
|
+
}
|
|
118
|
+
console.log(`[page-compiler] Build complete`);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=compile-pages.js.map
|
|
@@ -0,0 +1,122 @@
|
|
|
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.connectCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
42
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
43
|
+
const config_1 = require("../config");
|
|
44
|
+
const logger_1 = require("../utils/logger");
|
|
45
|
+
exports.connectCommand = new commander_1.Command("connect")
|
|
46
|
+
.description("Connect to a core instance and save credentials")
|
|
47
|
+
.option("-u, --url <url>", "Core URL")
|
|
48
|
+
.option("-k, --api-key <key>", "API key")
|
|
49
|
+
.action(async (opts, cmd) => {
|
|
50
|
+
const config = (0, config_1.loadConfig)(cmd.optsWithGlobals());
|
|
51
|
+
let coreUrl = opts.url || config.coreUrl || "http://localhost:8080";
|
|
52
|
+
let apiKey = opts.apiKey || "";
|
|
53
|
+
// If no flags, prompt interactively
|
|
54
|
+
if (!opts.url || !opts.apiKey) {
|
|
55
|
+
const inquirer = (await Promise.resolve().then(() => __importStar(require("inquirer")))).default;
|
|
56
|
+
const prompts = [];
|
|
57
|
+
if (!opts.url) {
|
|
58
|
+
prompts.push({
|
|
59
|
+
type: "input",
|
|
60
|
+
name: "coreUrl",
|
|
61
|
+
message: "Core URL:",
|
|
62
|
+
default: coreUrl,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (!opts.apiKey) {
|
|
66
|
+
prompts.push({
|
|
67
|
+
type: "password",
|
|
68
|
+
name: "apiKey",
|
|
69
|
+
message: "API Key:",
|
|
70
|
+
mask: "*",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const answers = await inquirer.prompt(prompts);
|
|
74
|
+
if (answers.coreUrl)
|
|
75
|
+
coreUrl = answers.coreUrl;
|
|
76
|
+
if (answers.apiKey)
|
|
77
|
+
apiKey = answers.apiKey;
|
|
78
|
+
}
|
|
79
|
+
if (!coreUrl) {
|
|
80
|
+
(0, logger_1.error)("Core URL is required");
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
if (!apiKey) {
|
|
84
|
+
(0, logger_1.error)("API key is required");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
// Validate by registering a test request ID
|
|
88
|
+
const validateSpinner = (0, logger_1.createSpinner)("Validating connection...");
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetch(`${coreUrl.replace(/\/$/, "")}/api/dev/request-id`, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: {
|
|
93
|
+
"Content-Type": "application/json",
|
|
94
|
+
Authorization: `Bearer ${apiKey}`,
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ slug: "alcedo-connect" }),
|
|
97
|
+
});
|
|
98
|
+
if (!res.ok) {
|
|
99
|
+
let errMsg = `HTTP ${res.status}`;
|
|
100
|
+
try {
|
|
101
|
+
const errBody = (await res.json());
|
|
102
|
+
if (errBody.error)
|
|
103
|
+
errMsg = errBody.error;
|
|
104
|
+
}
|
|
105
|
+
catch { }
|
|
106
|
+
throw new Error(errMsg);
|
|
107
|
+
}
|
|
108
|
+
validateSpinner.succeed();
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
validateSpinner.fail();
|
|
112
|
+
(0, logger_1.error)(`Failed to connect: ${err.message}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
// Write to .alcedocore.dev.env
|
|
116
|
+
const envPath = node_path_1.default.join(process.cwd(), ".alcedocore.dev.env");
|
|
117
|
+
node_fs_1.default.writeFileSync(envPath, `CORE_URL=${coreUrl}\nAPI_KEY=${apiKey}\n`);
|
|
118
|
+
(0, logger_1.success)(`Credentials saved to ${envPath}`);
|
|
119
|
+
(0, logger_1.info)(` CORE_URL=${coreUrl}`);
|
|
120
|
+
(0, logger_1.info)(" API_KEY=********");
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deployCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
const config_1 = require("../config");
|
|
7
|
+
function parseEnvVars(env = []) {
|
|
8
|
+
const result = {};
|
|
9
|
+
for (const e of env) {
|
|
10
|
+
const eqIdx = e.indexOf("=");
|
|
11
|
+
if (eqIdx === -1) {
|
|
12
|
+
result[e] = "";
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
result[e.slice(0, eqIdx)] = e.slice(eqIdx + 1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
exports.deployCommand = new commander_1.Command("deploy")
|
|
21
|
+
.argument("<slug>", "Plugin slug (e.g., my-plugin)")
|
|
22
|
+
.option("-t, --tag <version>", "Plugin version tag", "1.0.0")
|
|
23
|
+
.option("-i, --image <image>", "Docker image (default: {registry}/{slug}:{tag})")
|
|
24
|
+
.option("--no-start", "Register only, don't start the container")
|
|
25
|
+
.option("-e, --env <key=value>", "Environment variables (repeatable)", collectEnv, [])
|
|
26
|
+
.description("Deploy a plugin to Alcedo Core")
|
|
27
|
+
.action(async (slug, options, cmd) => {
|
|
28
|
+
const config = (0, config_1.loadConfig)(cmd.optsWithGlobals());
|
|
29
|
+
const registryUrl = (config.registryUrl || "localhost:5000").replace(/^https?:\/\//, "");
|
|
30
|
+
const coreUrl = config.coreUrl;
|
|
31
|
+
const tag = options.tag || "1.0.0";
|
|
32
|
+
const image = options.image || `${registryUrl}/${slug}:${tag}`;
|
|
33
|
+
const spinner = (0, logger_1.createSpinner)(`Deploying plugin: ${slug} v${tag}`);
|
|
34
|
+
try {
|
|
35
|
+
const body = JSON.stringify({
|
|
36
|
+
slug,
|
|
37
|
+
version: tag,
|
|
38
|
+
image,
|
|
39
|
+
env: parseEnvVars(options.env),
|
|
40
|
+
start_container: options.start !== false,
|
|
41
|
+
});
|
|
42
|
+
const res = await fetch(`${coreUrl}/api/plugins/deploy`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "Content-Type": "application/json" },
|
|
45
|
+
body,
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const errBody = await res.text().catch(() => "Unknown error");
|
|
49
|
+
throw new Error(`Deploy failed (${res.status}): ${errBody}`);
|
|
50
|
+
}
|
|
51
|
+
const contentType = res.headers.get("content-type") || "";
|
|
52
|
+
if (!contentType.includes("json")) {
|
|
53
|
+
const text = await res.text();
|
|
54
|
+
throw new Error(`Expected JSON but got ${contentType}: ${text.slice(0, 200)}`);
|
|
55
|
+
}
|
|
56
|
+
const result = await res.json();
|
|
57
|
+
const data = result.data || result;
|
|
58
|
+
spinner.succeed();
|
|
59
|
+
(0, logger_1.success)(`Plugin "${slug}" v${tag} deployed`);
|
|
60
|
+
if (data.container_id) {
|
|
61
|
+
(0, logger_1.info)(`Container: ${data.container_id}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
spinner.fail();
|
|
66
|
+
(0, logger_1.error)(`Failed to deploy: ${err.message}`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
function collectEnv(val, prev) {
|
|
71
|
+
prev.push(val);
|
|
72
|
+
return prev;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.devCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const proxy_1 = require("./proxy");
|
|
6
|
+
const build_frontend_1 = require("./build-frontend");
|
|
7
|
+
const serve_frontend_1 = require("./serve-frontend");
|
|
8
|
+
exports.devCommand = new commander_1.Command("dev")
|
|
9
|
+
.description("Plugin development commands (use 'alcedo dev proxy' to start the dev proxy)")
|
|
10
|
+
.addCommand(proxy_1.proxyCommand)
|
|
11
|
+
.addCommand(build_frontend_1.buildFrontendCommand)
|
|
12
|
+
.addCommand(serve_frontend_1.serveFrontendCommand);
|
|
13
|
+
//# sourceMappingURL=dev.js.map
|