@laldigital/novaserve 2.2.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/README.md +384 -0
- package/bin/nova.js +2 -0
- package/dist/commands/ai.d.ts +9 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +152 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/build.d.ts +6 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +62 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/cost.d.ts +8 -0
- package/dist/commands/cost.d.ts.map +1 -0
- package/dist/commands/cost.js +50 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +25 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/deploy.d.ts +8 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +128 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +6 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +75 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +60 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/diff.d.ts +8 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +60 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +61 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/drift.d.ts +8 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +81 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/events.d.ts +8 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +102 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/graph.d.ts +8 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +55 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/impact.d.ts +9 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +65 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +339 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/invoke.d.ts +9 -0
- package/dist/commands/invoke.d.ts.map +1 -0
- package/dist/commands/invoke.js +64 -0
- package/dist/commands/invoke.js.map +1 -0
- package/dist/commands/ir.d.ts +8 -0
- package/dist/commands/ir.d.ts.map +1 -0
- package/dist/commands/ir.js +85 -0
- package/dist/commands/ir.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +50 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +81 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/plugins.d.ts +9 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +49 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/promote.d.ts +9 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +44 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/rollback.d.ts +9 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +129 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/security.d.ts +8 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +84 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +135 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/trace.d.ts +8 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +66 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +5 -0
- package/dist/runtime.js.map +1 -0
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.d.ts.map +1 -0
- package/dist/ui/banner.js +37 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/spinner.d.ts +15 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +39 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/utils/config-loader.d.ts +12 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +29 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nova init — Create a new NovaServe project
|
|
3
|
+
*
|
|
4
|
+
* Interactive project scaffolding with template selection.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
import { withSpinner } from "../ui/spinner.js";
|
|
11
|
+
const TEMPLATES = {
|
|
12
|
+
"basic-api": {
|
|
13
|
+
name: "REST API",
|
|
14
|
+
description: "A simple REST API with CRUD routes",
|
|
15
|
+
files: generateBasicApiFiles,
|
|
16
|
+
},
|
|
17
|
+
"cron-worker": {
|
|
18
|
+
name: "Cron Worker",
|
|
19
|
+
description: "Scheduled background tasks",
|
|
20
|
+
files: generateCronWorkerFiles,
|
|
21
|
+
},
|
|
22
|
+
"vite-react": {
|
|
23
|
+
name: "Vite + React",
|
|
24
|
+
description: "Single Page App + Serverless Backend",
|
|
25
|
+
files: generateViteReactFiles,
|
|
26
|
+
},
|
|
27
|
+
"nextjs": {
|
|
28
|
+
name: "Next.js Fullstack",
|
|
29
|
+
description: "Next.js frontend + NovaServe API backend",
|
|
30
|
+
files: generateNextjsFiles,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export function initCommand() {
|
|
34
|
+
return new Command("init")
|
|
35
|
+
.description("Create a new NovaServe project")
|
|
36
|
+
.argument("[name]", "Project name")
|
|
37
|
+
.option("-t, --template <template>", "Template to use", "basic-api")
|
|
38
|
+
.option("--runtime <runtime>", "Default runtime", "node20")
|
|
39
|
+
.option("--region <region>", "Default region", "ap-south-1")
|
|
40
|
+
.action(async (name, options) => {
|
|
41
|
+
const projectName = name || "my-nova-app";
|
|
42
|
+
const template = options.template;
|
|
43
|
+
const runtime = options.runtime;
|
|
44
|
+
const region = options.region;
|
|
45
|
+
// Validate template
|
|
46
|
+
if (!(template in TEMPLATES)) {
|
|
47
|
+
logger.error(`Unknown template "${template}". Available: ${Object.keys(TEMPLATES).join(", ")}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const projectDir = join(process.cwd(), projectName);
|
|
51
|
+
if (existsSync(projectDir)) {
|
|
52
|
+
logger.error(`Directory "${projectName}" already exists`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
await withSpinner(`Creating ${projectName}...`, async () => {
|
|
56
|
+
// Create project directory
|
|
57
|
+
mkdirSync(projectDir, { recursive: true });
|
|
58
|
+
// Generate template files
|
|
59
|
+
const templateConfig = TEMPLATES[template];
|
|
60
|
+
const files = templateConfig.files(projectName, runtime, region);
|
|
61
|
+
for (const [filePath, content] of Object.entries(files)) {
|
|
62
|
+
const fullPath = join(projectDir, filePath);
|
|
63
|
+
mkdirSync(join(fullPath, ".."), { recursive: true });
|
|
64
|
+
writeFileSync(fullPath, content);
|
|
65
|
+
}
|
|
66
|
+
// Create package.json
|
|
67
|
+
const packageJson = {
|
|
68
|
+
name: projectName,
|
|
69
|
+
version: "0.1.0",
|
|
70
|
+
private: true,
|
|
71
|
+
type: "module",
|
|
72
|
+
scripts: {
|
|
73
|
+
dev: "nova dev",
|
|
74
|
+
build: "nova build",
|
|
75
|
+
deploy: "nova deploy",
|
|
76
|
+
destroy: "nova destroy",
|
|
77
|
+
},
|
|
78
|
+
dependencies: {
|
|
79
|
+
novaserve: "^0.1.0",
|
|
80
|
+
},
|
|
81
|
+
devDependencies: {
|
|
82
|
+
typescript: "^5.7.0",
|
|
83
|
+
"@types/node": "^22.0.0",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
writeFileSync(join(projectDir, "package.json"), JSON.stringify(packageJson, null, 2));
|
|
87
|
+
// Create tsconfig.json
|
|
88
|
+
const tsconfig = {
|
|
89
|
+
compilerOptions: {
|
|
90
|
+
target: "ES2022",
|
|
91
|
+
module: "ESNext",
|
|
92
|
+
moduleResolution: "bundler",
|
|
93
|
+
strict: true,
|
|
94
|
+
esModuleInterop: true,
|
|
95
|
+
skipLibCheck: true,
|
|
96
|
+
outDir: "./dist",
|
|
97
|
+
rootDir: "./src",
|
|
98
|
+
declaration: true,
|
|
99
|
+
},
|
|
100
|
+
include: ["src/**/*.ts", "nova.config.ts"],
|
|
101
|
+
};
|
|
102
|
+
writeFileSync(join(projectDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2));
|
|
103
|
+
});
|
|
104
|
+
logger.blank();
|
|
105
|
+
logger.success(`Created project: ${projectName}`);
|
|
106
|
+
logger.blank();
|
|
107
|
+
logger.info("Next steps:");
|
|
108
|
+
logger.kv("", `cd ${projectName}`);
|
|
109
|
+
logger.kv("", "npm install");
|
|
110
|
+
logger.kv("", "nova dev # Start local development");
|
|
111
|
+
logger.kv("", "nova deploy # Deploy to cloud");
|
|
112
|
+
logger.blank();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// ── Template Generators ──────────────────────────────
|
|
116
|
+
function generateBasicApiFiles(name, runtime, region) {
|
|
117
|
+
return {
|
|
118
|
+
"nova.config.ts": `import { defineApp, api } from "novaserve";
|
|
119
|
+
|
|
120
|
+
export default defineApp({
|
|
121
|
+
name: "${name}",
|
|
122
|
+
region: "${region}",
|
|
123
|
+
runtime: "${runtime}",
|
|
124
|
+
|
|
125
|
+
resources: {
|
|
126
|
+
api: api.create({
|
|
127
|
+
routes: {
|
|
128
|
+
"GET /": "src/handlers/hello.handler",
|
|
129
|
+
"GET /health": "src/handlers/health.handler",
|
|
130
|
+
"GET /users": "src/handlers/users.list",
|
|
131
|
+
"POST /users": "src/handlers/users.create",
|
|
132
|
+
"GET /users/:id": "src/handlers/users.get",
|
|
133
|
+
},
|
|
134
|
+
cors: true,
|
|
135
|
+
}),
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
`,
|
|
139
|
+
"src/handlers/hello.ts": `import type { NovaContext } from "novaserve/runtime";
|
|
140
|
+
|
|
141
|
+
export const handler = async (ctx: NovaContext) => {
|
|
142
|
+
return ctx.json({
|
|
143
|
+
message: "Hello from NovaServe! 🚀",
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
`,
|
|
148
|
+
"src/handlers/health.ts": `import type { NovaContext } from "novaserve/runtime";
|
|
149
|
+
|
|
150
|
+
export const handler = async (ctx: NovaContext) => {
|
|
151
|
+
return ctx.json({
|
|
152
|
+
status: "healthy",
|
|
153
|
+
uptime: process.uptime(),
|
|
154
|
+
version: "0.1.0",
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
`,
|
|
158
|
+
"src/handlers/users.ts": `import type { NovaContext } from "novaserve/runtime";
|
|
159
|
+
|
|
160
|
+
// In-memory store for demo purposes
|
|
161
|
+
const users: Array<{ id: string; name: string; email: string }> = [
|
|
162
|
+
{ id: "1", name: "Alice Johnson", email: "alice@example.com" },
|
|
163
|
+
{ id: "2", name: "Bob Smith", email: "bob@example.com" },
|
|
164
|
+
];
|
|
165
|
+
|
|
166
|
+
export const list = async (ctx: NovaContext) => {
|
|
167
|
+
return ctx.json({ users, count: users.length });
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export const create = async (ctx: NovaContext) => {
|
|
171
|
+
const body = ctx.body<{ name: string; email: string }>();
|
|
172
|
+
|
|
173
|
+
if (!body?.name || !body?.email) {
|
|
174
|
+
return ctx.badRequest("Name and email are required");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const user = {
|
|
178
|
+
id: String(users.length + 1),
|
|
179
|
+
name: body.name,
|
|
180
|
+
email: body.email,
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
users.push(user);
|
|
184
|
+
return ctx.json({ user }, 201);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
export const get = async (ctx: NovaContext) => {
|
|
188
|
+
const user = users.find((u) => u.id === ctx.params.id);
|
|
189
|
+
|
|
190
|
+
if (!user) {
|
|
191
|
+
return ctx.notFound(\`User \${ctx.params.id} not found\`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return ctx.json({ user });
|
|
195
|
+
};
|
|
196
|
+
`,
|
|
197
|
+
".gitignore": `node_modules/
|
|
198
|
+
dist/
|
|
199
|
+
.nova/
|
|
200
|
+
.env
|
|
201
|
+
`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function generateCronWorkerFiles(name, runtime, region) {
|
|
205
|
+
return {
|
|
206
|
+
"nova.config.ts": `import { defineApp, cron } from "novaserve";
|
|
207
|
+
|
|
208
|
+
export default defineApp({
|
|
209
|
+
name: "${name}",
|
|
210
|
+
region: "${region}",
|
|
211
|
+
runtime: "${runtime}",
|
|
212
|
+
|
|
213
|
+
resources: {
|
|
214
|
+
healthCheck: cron.every("5 minutes", {
|
|
215
|
+
handler: "src/workers/health-check.handler",
|
|
216
|
+
description: "Check system health every 5 minutes",
|
|
217
|
+
}),
|
|
218
|
+
|
|
219
|
+
dailyReport: cron.schedule("0 9 * * *", {
|
|
220
|
+
handler: "src/workers/daily-report.handler",
|
|
221
|
+
description: "Generate daily report at 9 AM",
|
|
222
|
+
timeout: "5m",
|
|
223
|
+
}),
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
`,
|
|
227
|
+
"src/workers/health-check.ts": `export const handler = async () => {
|
|
228
|
+
console.log("[Health Check] Running system health check...");
|
|
229
|
+
console.log("[Health Check] All systems operational ✓");
|
|
230
|
+
};
|
|
231
|
+
`,
|
|
232
|
+
"src/workers/daily-report.ts": `export const handler = async () => {
|
|
233
|
+
console.log("[Daily Report] Generating daily report...");
|
|
234
|
+
console.log("[Daily Report] Report generated successfully ✓");
|
|
235
|
+
};
|
|
236
|
+
`,
|
|
237
|
+
".gitignore": `node_modules/
|
|
238
|
+
dist/
|
|
239
|
+
.nova/
|
|
240
|
+
.env
|
|
241
|
+
`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function generateViteReactFiles(name, runtime, region) {
|
|
245
|
+
return {
|
|
246
|
+
"nova.config.ts": `import { defineApp, api, staticSite } from "novaserve";
|
|
247
|
+
|
|
248
|
+
export default defineApp({
|
|
249
|
+
name: "${name}",
|
|
250
|
+
region: "${region}",
|
|
251
|
+
runtime: "${runtime}",
|
|
252
|
+
|
|
253
|
+
resources: {
|
|
254
|
+
frontend: staticSite.create({
|
|
255
|
+
buildDir: "dist",
|
|
256
|
+
buildCommand: "npm run build",
|
|
257
|
+
}),
|
|
258
|
+
api: api.create({
|
|
259
|
+
routes: {
|
|
260
|
+
"GET /api/hello": "src/api/hello.handler",
|
|
261
|
+
},
|
|
262
|
+
}),
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
`,
|
|
266
|
+
"src/api/hello.ts": `import type { NovaContext } from "novaserve/runtime";
|
|
267
|
+
|
|
268
|
+
export const handler = async (ctx: NovaContext) => {
|
|
269
|
+
return ctx.json({ message: "Hello from NovaServe API!" });
|
|
270
|
+
};
|
|
271
|
+
`,
|
|
272
|
+
"index.html": `<!DOCTYPE html>
|
|
273
|
+
<html lang="en">
|
|
274
|
+
<head>
|
|
275
|
+
<meta charset="UTF-8" />
|
|
276
|
+
<title>${name}</title>
|
|
277
|
+
</head>
|
|
278
|
+
<body>
|
|
279
|
+
<div id="root"></div>
|
|
280
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
281
|
+
</body>
|
|
282
|
+
</html>
|
|
283
|
+
`,
|
|
284
|
+
"src/main.tsx": `import React from 'react'
|
|
285
|
+
import ReactDOM from 'react-dom/client'
|
|
286
|
+
|
|
287
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
288
|
+
<React.StrictMode>
|
|
289
|
+
<h1>Welcome to ${name} powered by NovaServe</h1>
|
|
290
|
+
</React.StrictMode>
|
|
291
|
+
)
|
|
292
|
+
`,
|
|
293
|
+
".gitignore": `node_modules/
|
|
294
|
+
dist/
|
|
295
|
+
.nova/
|
|
296
|
+
.env
|
|
297
|
+
`,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function generateNextjsFiles(name, runtime, region) {
|
|
301
|
+
return {
|
|
302
|
+
"nova.config.ts": `import { defineApp, api } from "novaserve";
|
|
303
|
+
|
|
304
|
+
export default defineApp({
|
|
305
|
+
name: "${name}",
|
|
306
|
+
region: "${region}",
|
|
307
|
+
runtime: "${runtime}",
|
|
308
|
+
|
|
309
|
+
resources: {
|
|
310
|
+
api: api.create({
|
|
311
|
+
routes: {
|
|
312
|
+
"GET /api/v1/health": "src/api/health.handler",
|
|
313
|
+
},
|
|
314
|
+
}),
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
`,
|
|
318
|
+
"src/api/health.ts": `import type { NovaContext } from "novaserve/runtime";
|
|
319
|
+
|
|
320
|
+
export const handler = async (ctx: NovaContext) => {
|
|
321
|
+
return ctx.json({ status: "ok", framework: "Next.js + NovaServe" });
|
|
322
|
+
};
|
|
323
|
+
`,
|
|
324
|
+
"next.config.js": `/** @type {import('next').NextConfig} */
|
|
325
|
+
const nextConfig = {
|
|
326
|
+
reactStrictMode: true,
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
module.exports = nextConfig;
|
|
330
|
+
`,
|
|
331
|
+
".gitignore": `node_modules/
|
|
332
|
+
.next/
|
|
333
|
+
dist/
|
|
334
|
+
.nova/
|
|
335
|
+
.env
|
|
336
|
+
`,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nova invoke`
|
|
3
|
+
*
|
|
4
|
+
* Synchronously invokes a deployed cloud function (e.g. AWS Lambda)
|
|
5
|
+
* passing a payload and returning the actual execution response.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
export declare function invokeCommand(): Command;
|
|
9
|
+
//# sourceMappingURL=invoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,aAAa,IAAI,OAAO,CA0DvC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nova invoke`
|
|
3
|
+
*
|
|
4
|
+
* Synchronously invokes a deployed cloud function (e.g. AWS Lambda)
|
|
5
|
+
* passing a payload and returning the actual execution response.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
import { loadConfig } from "../utils/config-loader.js";
|
|
11
|
+
export function invokeCommand() {
|
|
12
|
+
return new Command("invoke")
|
|
13
|
+
.description("Invoke a deployed function synchronously on the active provider")
|
|
14
|
+
.argument("<function>", "Target function name to invoke")
|
|
15
|
+
.option("-p, --payload <json>", "JSON string payload to pass to the function", "{}")
|
|
16
|
+
.option("-e, --env <environment>", "Target environment", "production")
|
|
17
|
+
.action(async (functionName, options) => {
|
|
18
|
+
console.log(chalk.bold.yellow(`\n◆ NovaServe Function Invoke: ${functionName}\n`));
|
|
19
|
+
try {
|
|
20
|
+
const app = await loadConfig();
|
|
21
|
+
const providerName = app.config.provider || "aws";
|
|
22
|
+
let payloadObj = {};
|
|
23
|
+
try {
|
|
24
|
+
payloadObj = JSON.parse(options.payload);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
console.log(chalk.red(`Invalid JSON payload: "${options.payload}"`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
console.log(`Provider: ${chalk.bold.magenta(providerName.toUpperCase())}`);
|
|
31
|
+
console.log(`Function: ${chalk.cyan(functionName)}`);
|
|
32
|
+
console.log(`Payload: ${chalk.gray(options.payload)}\n`);
|
|
33
|
+
let result;
|
|
34
|
+
if (providerName === "aws") {
|
|
35
|
+
const { AWSProvider } = await import("novaserve-provider-aws");
|
|
36
|
+
const provider = new AWSProvider();
|
|
37
|
+
await provider.init(app.config);
|
|
38
|
+
result = await provider.invoke(functionName, payloadObj);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const { LocalProvider } = await import("novaserve-provider-local");
|
|
42
|
+
const provider = new LocalProvider({});
|
|
43
|
+
await provider.init(app.config);
|
|
44
|
+
result = await provider.invoke(functionName, payloadObj);
|
|
45
|
+
}
|
|
46
|
+
console.log(chalk.bold("Response:"));
|
|
47
|
+
console.log(`Status Code: ${result.statusCode >= 400 ? chalk.red(result.statusCode) : chalk.green(result.statusCode)}`);
|
|
48
|
+
console.log(`Duration: ${chalk.cyan(`${result.durationMs}ms`)}\n`);
|
|
49
|
+
console.log(chalk.bold("Payload Response:"));
|
|
50
|
+
console.log(JSON.stringify(result.body, null, 2));
|
|
51
|
+
if (result.logResult) {
|
|
52
|
+
console.log(chalk.bold("\nExecution Log Tail:"));
|
|
53
|
+
console.log(chalk.gray(result.logResult));
|
|
54
|
+
}
|
|
55
|
+
console.log("");
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
59
|
+
logger.error(`Invoke failed: ${msg}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=invoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/commands/ir.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,SAAS,IAAI,OAAO,CA6EnC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nova ir`
|
|
3
|
+
*
|
|
4
|
+
* Inspects, validates, and hashes the Nova Intermediate Representation (Nova IR 1.0.0).
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { NovaCompiler, toResource } from "novaserve-core";
|
|
9
|
+
import { loadConfig } from "../utils/config-loader.js";
|
|
10
|
+
export function irCommand() {
|
|
11
|
+
const cmd = new Command("ir").description("Inspect, validate, and hash Nova IR Graph (1.0.0)");
|
|
12
|
+
cmd
|
|
13
|
+
.command("validate")
|
|
14
|
+
.description("Validate Nova IR graph schema and check for circular dependencies")
|
|
15
|
+
.action(async () => {
|
|
16
|
+
console.log(chalk.bold.yellow("\n◆ Nova IR 1.0.0 Validation\n"));
|
|
17
|
+
try {
|
|
18
|
+
const app = await loadConfig();
|
|
19
|
+
const coreResources = (app.resources || []).map((r) => toResource(r));
|
|
20
|
+
const compileResult = NovaCompiler.compile({
|
|
21
|
+
appName: app.name || "nova-app",
|
|
22
|
+
resources: coreResources,
|
|
23
|
+
});
|
|
24
|
+
const { ir, validation } = compileResult;
|
|
25
|
+
console.log(`Application: ${chalk.cyan(ir.app.name)}`);
|
|
26
|
+
console.log(`IR Version: ${ir.schemaVersion}`);
|
|
27
|
+
console.log(`Resources: ${Object.keys(ir.resources).length}`);
|
|
28
|
+
console.log(`Dependencies:${ir.dependencies.length}\n`);
|
|
29
|
+
if (validation.valid) {
|
|
30
|
+
console.log(chalk.bold.green("✓ Nova IR Valid"));
|
|
31
|
+
console.log(chalk.bold.green("✓ Deterministic Canonical Graph"));
|
|
32
|
+
console.log(chalk.bold.green("✓ Zero Circular Dependency Cycles Detected\n"));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(chalk.bold.red("✗ IR Validation Failed:"));
|
|
36
|
+
for (const err of validation.errors) {
|
|
37
|
+
console.log(chalk.red(` • ${err}`));
|
|
38
|
+
}
|
|
39
|
+
console.log("");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44
|
+
console.log(chalk.red(`IR validation failed: ${msg}`));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
cmd
|
|
48
|
+
.command("inspect")
|
|
49
|
+
.description("Display raw Nova IR JSON representation")
|
|
50
|
+
.action(async () => {
|
|
51
|
+
try {
|
|
52
|
+
const app = await loadConfig();
|
|
53
|
+
const coreResources = (app.resources || []).map((r) => toResource(r));
|
|
54
|
+
const compileResult = NovaCompiler.compile({
|
|
55
|
+
appName: app.name || "nova-app",
|
|
56
|
+
resources: coreResources,
|
|
57
|
+
});
|
|
58
|
+
console.log(JSON.stringify(compileResult.ir, null, 2));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
62
|
+
console.log(chalk.red(`IR inspect failed: ${msg}`));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
cmd
|
|
66
|
+
.command("hash")
|
|
67
|
+
.description("Print canonical SHA256 hash of Nova IR graph")
|
|
68
|
+
.action(async () => {
|
|
69
|
+
try {
|
|
70
|
+
const app = await loadConfig();
|
|
71
|
+
const coreResources = (app.resources || []).map((r) => toResource(r));
|
|
72
|
+
const compileResult = NovaCompiler.compile({
|
|
73
|
+
appName: app.name || "nova-app",
|
|
74
|
+
resources: coreResources,
|
|
75
|
+
});
|
|
76
|
+
console.log(`sha256:${compileResult.ir.app.hash}`);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
console.log(chalk.red(`IR hash failed: ${msg}`));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return cmd;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=ir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.js","sourceRoot":"","sources":["../../src/commands/ir.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC;IAE/F,GAAG;SACA,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;gBACzC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU;gBAC/B,SAAS,EAAE,aAAa;aACzB,CAAC,CAAC;YAEH,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;YAExD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACvD,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvC,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;gBACzC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU;gBAC/B,SAAS,EAAE,aAAa;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;gBACzC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU;gBAC/B,SAAS,EAAE,aAAa;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,UAAU,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,IAAI,OAAO,CAoDrC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { loadConfig } from "../utils/config-loader.js";
|
|
5
|
+
export function logsCommand() {
|
|
6
|
+
return new Command("logs")
|
|
7
|
+
.description("View and stream live CloudWatch function logs")
|
|
8
|
+
.argument("[function]", "Function name to view logs for")
|
|
9
|
+
.option("-f, --follow", "Follow mode (tail live logs)")
|
|
10
|
+
.option("-n, --lines <count>", "Number of log events to fetch", "50")
|
|
11
|
+
.action(async (functionName, options) => {
|
|
12
|
+
const app = await loadConfig();
|
|
13
|
+
const targetFunction = functionName || "usersList";
|
|
14
|
+
logger.box([
|
|
15
|
+
{ key: "App:", value: app.name },
|
|
16
|
+
{ key: "Target Function:", value: targetFunction },
|
|
17
|
+
{ key: "Provider:", value: (app.config.provider || "aws").toUpperCase() },
|
|
18
|
+
{ key: "Mode:", value: options.follow ? "Tail/Follow" : "Snapshot" },
|
|
19
|
+
]);
|
|
20
|
+
try {
|
|
21
|
+
const { AWSProvider } = await import("novaserve-provider-aws");
|
|
22
|
+
const provider = new AWSProvider();
|
|
23
|
+
await provider.init(app.config);
|
|
24
|
+
logger.info(`Fetching live CloudWatch logs for /aws/lambda/${app.name}-${targetFunction}...`);
|
|
25
|
+
logger.blank();
|
|
26
|
+
const limit = parseInt(options.lines) || 50;
|
|
27
|
+
let count = 0;
|
|
28
|
+
for await (const entry of provider.getLogs(targetFunction, { limit, follow: options.follow })) {
|
|
29
|
+
count++;
|
|
30
|
+
const timeStr = entry.timestamp.toISOString().replace("T", " ").replace("Z", "");
|
|
31
|
+
const levelBadge = entry.level === "error"
|
|
32
|
+
? chalk.bgRed.black(" ERROR ")
|
|
33
|
+
: entry.level === "warn"
|
|
34
|
+
? chalk.bgYellow.black(" WARN ")
|
|
35
|
+
: chalk.bgBlue.black(" INFO ");
|
|
36
|
+
console.log(`${chalk.gray(timeStr)} ${levelBadge} ${entry.message}`);
|
|
37
|
+
}
|
|
38
|
+
if (count === 0) {
|
|
39
|
+
logger.warn(`No recent log events found for /aws/lambda/${app.name}-${targetFunction}.`);
|
|
40
|
+
}
|
|
41
|
+
logger.blank();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
45
|
+
logger.error(`Failed to stream logs: ${msg}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nova plan`
|
|
3
|
+
*
|
|
4
|
+
* Generates and displays the infrastructure deployment plan from Nova IR.
|
|
5
|
+
* Supports saving plan files for deterministic CI/CD deployment execution.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
export declare function planCommand(): Command;
|
|
9
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,WAAW,IAAI,OAAO,CAqErC"}
|