@aerostack/cli 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +15 -0
  2. package/bin/postinstall.js +8 -39
  3. package/bin/run.js +85 -83
  4. package/dist/commands/add.d.ts +21 -0
  5. package/dist/commands/add.d.ts.map +1 -0
  6. package/dist/commands/add.js +248 -0
  7. package/dist/commands/add.js.map +1 -0
  8. package/dist/commands/init.d.ts +11 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +114 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/list.d.ts +13 -0
  13. package/dist/commands/list.d.ts.map +1 -0
  14. package/dist/commands/list.js +79 -0
  15. package/dist/commands/list.js.map +1 -0
  16. package/dist/commands/login.d.ts +12 -0
  17. package/dist/commands/login.d.ts.map +1 -0
  18. package/dist/commands/login.js +59 -0
  19. package/dist/commands/login.js.map +1 -0
  20. package/dist/commands/publish.d.ts +11 -0
  21. package/dist/commands/publish.d.ts.map +1 -0
  22. package/dist/commands/publish.js +230 -0
  23. package/dist/commands/publish.js.map +1 -0
  24. package/dist/index.d.ts +13 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +93 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/lib/config.d.ts +9 -0
  29. package/dist/lib/config.d.ts.map +1 -0
  30. package/dist/lib/config.js +24 -0
  31. package/dist/lib/config.js.map +1 -0
  32. package/dist/lib/injector.d.ts +30 -0
  33. package/dist/lib/injector.d.ts.map +1 -0
  34. package/dist/lib/injector.js +84 -0
  35. package/dist/lib/injector.js.map +1 -0
  36. package/dist/lib/registry.d.ts +81 -0
  37. package/dist/lib/registry.d.ts.map +1 -0
  38. package/dist/lib/registry.js +124 -0
  39. package/dist/lib/registry.js.map +1 -0
  40. package/package.json +16 -3
  41. package/templates/drizzle.config.ts +16 -0
  42. package/templates/package.json +23 -0
  43. package/templates/src/db/client.ts +12 -0
  44. package/templates/src/db/schema.ts +14 -0
  45. package/templates/src/index.ts +28 -0
  46. package/templates/tsconfig.json +29 -0
  47. package/templates/wrangler.toml +16 -0
package/README.md CHANGED
@@ -29,6 +29,21 @@ npx aerostack deploy
29
29
 
30
30
  The first run downloads the binary from GitHub releases. Subsequent runs use the cached binary at `~/.aerostack/bin` (shared with the curl install).
31
31
 
32
+ ## Registry: add community functions
33
+
34
+ Install open-source functions from the Aerostack registry into your project (Cloudflare or Node.js):
35
+
36
+ ```bash
37
+ npx aerostack add stripe-checkout
38
+ npx aerostack add alice/stripe-checkout
39
+ npx aerostack add stripe-checkout --runtime=node
40
+ ```
41
+
42
+ - **Cloudflare** (default): Adds Hono + D1 adapter and wires the route. Uses Drizzle in `src/db/` when the function has a schema.
43
+ - **Node.js** (`--runtime=node`): Adds a Node/Express adapter. Pass your own Drizzle client (pg or sqlite) and mount the router in your app.
44
+
45
+ Functions follow the **Open Function Standard**: one portable core, multiple adapters. You can use them in any Node.js project, not only on the Aerostack platform. See `planning/OPEN_FUNCTION_STANDARD.md` for the spec.
46
+
32
47
  ## Uninstall
33
48
 
34
49
  ```bash
@@ -1,41 +1,10 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Postinstall: print PATH fix if aerostack bin not in PATH.
4
- */
5
- const path = require("path");
6
- const fs = require("fs");
7
-
8
- // Assuming there's a download function that might be added or already exists
9
- // and the user wants to wrap its execution.
10
- // For the purpose of this edit, we'll assume `downloadBinary()` is a placeholder
11
- // for the actual download logic that would be placed here.
12
- try {
13
- // Original download logic (placeholder, as it's not in the provided original code)
14
- // If downloadBinary() is not defined, this will cause a ReferenceError.
15
- // The user's instruction implies this function exists or will be added.
16
- // downloadBinary(); // Uncomment and define if actual download logic is intended here
17
- } catch (e) {
18
- console.warn('⚠️ Aerostack CLI download failed. You may need to install it manually or check your connection.');
19
- console.warn(' Details: ' + e.message);
20
- // Do not exit with error, allow install to continue
21
- process.exit(0);
22
- }
23
-
24
- // Global install: package at prefix/node_modules/aerostack, bin at prefix/bin
25
- const pkgRoot = path.resolve(__dirname, "..");
26
- const prefix = path.dirname(path.dirname(pkgRoot));
27
- const binDir = path.join(prefix, "bin");
28
- const binPath = path.join(binDir, process.platform === "win32" ? "aerostack.cmd" : "aerostack");
29
-
30
- if (!fs.existsSync(binDir)) return;
31
-
32
- const pathEnv = (process.env.PATH || "").split(path.delimiter);
33
- const inPath = pathEnv.some((p) => path.resolve(p) === path.resolve(binDir));
34
-
35
- if (!inPath) {
36
- console.log("\n\u001b[33mAerostack installed. Add to PATH (run once, or add to ~/.zshrc):\u001b[0m");
37
- console.log(` \u001b[36mexport PATH="$PATH:${binDir}"\u001b[0m\n`);
38
- console.log("Or use \u001b[32mnpx aerostack\u001b[0m (no PATH config needed).\n");
39
- } else {
40
- console.log("\n\u001b[32mAerostack installed. Run: aerostack --version\u001b[0m\n");
2
+ import { existsSync } from 'fs';
3
+ import { join } from 'path';
4
+
5
+ // Just a polite notice
6
+ const binDir = join(process.env.HOME || process.env.USERPROFILE || '.', '.aerostack', 'bin');
7
+ if (existsSync(binDir)) {
8
+ console.log(`\nAerostack is installed.`);
9
+ console.log(`To use the binary directly, add ${binDir} to your PATH.\n`);
41
10
  }
package/bin/run.js CHANGED
@@ -1,20 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Aerostack CLI - npm/pnpm/yarn wrapper
4
- * Downloads the Go binary from GitHub releases on first run.
3
+ * Aerostack CLI - Hybrid Dispatcher
4
+ *
5
+ * Routes specific commands (init, add, publish, list, login) to the
6
+ * pure Node.js implementation (drizzle/hono support).
7
+ *
8
+ * All other commands map to the Go binary (legacy/platform).
5
9
  */
6
10
 
7
- const { spawn } = require("child_process");
8
- const fs = require("fs");
9
- const path = require("path");
11
+ import { spawn } from 'child_process';
12
+ import { existsSync, mkdirSync, chmodSync, writeFileSync, rmSync, renameSync } from 'fs';
13
+ import { join, resolve } from 'path';
14
+ import { platform as getOsPlatform, arch as getOsArch, tmpdir } from 'os';
15
+ import { fileURLToPath } from 'url';
16
+
17
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
18
+
19
+ // ─── 1. Hybrid Dispatcher ──────────────────────────────────────────────────────
20
+
21
+ const args = process.argv.slice(2);
22
+ const command = args[0];
23
+ const NODE_COMMANDS = ['init', 'add', 'publish', 'list', 'login'];
24
+
25
+ if (command && NODE_COMMANDS.includes(command)) {
26
+ // Dispatch to Node.js implementation
27
+ import('../dist/index.js').then(m => m.run(args)).catch(err => {
28
+ console.error('Failed to run Node.js CLI:', err);
29
+ process.exit(1);
30
+ });
31
+ } else {
32
+ // Dispatch to Go implementation
33
+ ensureBinary().then(binPath => {
34
+ const child = spawn(binPath, args, { stdio: 'inherit' });
35
+ child.on('exit', code => process.exit(code ?? 0));
36
+ }).catch(err => {
37
+ console.error('Error:', err.message);
38
+ process.exit(1);
39
+ });
40
+ }
41
+
42
+ // ─── 2. Go Binary Downloader (Legacy) ──────────────────────────────────────────
10
43
 
11
44
  const REPO = "aerostackdev/cli";
12
45
  const BINARY = "aerostack";
13
- const INSTALL_DIR = process.env.AEROSTACK_INSTALL_DIR || path.join(process.env.HOME || process.env.USERPROFILE, ".aerostack", "bin");
46
+ // Use HOME or USERPROFILE for global install location
47
+ const HOME = process.env.HOME || process.env.USERPROFILE || tmpdir();
48
+ const INSTALL_DIR = process.env.AEROSTACK_INSTALL_DIR || join(HOME, ".aerostack", "bin");
14
49
 
15
50
  function getPlatform() {
16
- const platform = process.platform;
17
- const arch = process.arch;
51
+ const platform = getOsPlatform();
52
+ const arch = getOsArch();
18
53
  const map = {
19
54
  darwin: { arm64: "darwin_arm64", x64: "darwin_amd64" },
20
55
  linux: { arm64: "linux_arm64", x64: "linux_amd64" },
@@ -26,102 +61,69 @@ function getPlatform() {
26
61
  }
27
62
 
28
63
  async function getLatestVersion() {
29
- const res = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`, {
30
- headers: { "User-Agent": "aerostack-cli-npm/1.0" },
31
- });
32
- if (!res.ok) throw new Error("Failed to fetch latest version");
33
- const data = await res.text();
34
- const m = data.match(/"tag_name":\s*"v([^"]+)"/);
35
- if (!m) throw new Error("Could not parse version");
36
- return m[1];
64
+ // If we can't check, fallback or fail. Here we try checking.
65
+ try {
66
+ const res = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`, {
67
+ headers: { "User-Agent": "aerostack-cli-npm/1.5.0" },
68
+ });
69
+ if (!res.ok) return "1.3.0"; // Fallback if rate limited
70
+ const data = await res.json();
71
+ return data.tag_name.replace(/^v/, '');
72
+ } catch {
73
+ return "1.3.0";
74
+ }
37
75
  }
38
76
 
39
77
  async function downloadBinary(version, asset) {
40
78
  const ext = asset.startsWith("windows") ? "zip" : "tar.gz";
41
- const archive = `${BINARY}_${version}_${asset}.${ext}`;
42
- const url = `https://github.com/${REPO}/releases/download/v${version}/${archive}`;
79
+ const archive = `${BINARY}_v${version}_${asset}.${ext}`; // Check github release naming convention
80
+ // Usually: aerostack_1.3.0_darwin_arm64.tar.gz
81
+ // Let's assume standard GoReleaser naming: name_version_os_arch
82
+ const releaseName = `${BINARY}_${version}_${asset}.${ext}`;
43
83
 
44
- const tmpDir = path.join(require("os").tmpdir(), `aerostack-${Date.now()}`);
45
- fs.mkdirSync(tmpDir, { recursive: true });
46
- const archivePath = path.join(tmpDir, archive);
84
+ const url = `https://github.com/${REPO}/releases/download/v${version}/${releaseName}`;
85
+ const tmpDir = join(tmpdir(), `aerostack-${Date.now()}`);
86
+ mkdirSync(tmpDir, { recursive: true });
87
+
88
+ const archivePath = join(tmpDir, releaseName);
89
+
90
+ console.error(`Downloading Aerostack Go Core v${version}...`);
91
+ const res = await fetch(url, { redirect: "follow" });
92
+ if (!res.ok) throw new Error(`Download failed: ${url} (${res.status})`);
47
93
 
48
- const res = await fetch(url, {
49
- headers: { "User-Agent": "aerostack-cli-npm/1.0" },
50
- redirect: "follow",
51
- });
52
- if (!res.ok) throw new Error(`Download failed: ${url}`);
53
94
  const buffer = Buffer.from(await res.arrayBuffer());
54
- fs.writeFileSync(archivePath, buffer);
95
+ writeFileSync(archivePath, buffer);
55
96
 
56
97
  const binDir = INSTALL_DIR;
57
- fs.mkdirSync(binDir, { recursive: true });
58
- const binPath = path.join(binDir, process.platform === "win32" ? `${BINARY}.exe` : BINARY);
98
+ mkdirSync(binDir, { recursive: true });
99
+ const binPath = join(binDir, process.platform === "win32" ? `${BINARY}.exe` : BINARY);
59
100
 
60
101
  if (ext === "zip") {
61
- const AdmZip = require("adm-zip");
102
+ const AdmZip = (await import("adm-zip")).default;
62
103
  const zip = new AdmZip(archivePath);
63
104
  zip.extractAllTo(tmpDir, true);
64
- const extracted = path.join(tmpDir, `${BINARY}.exe`);
65
- fs.renameSync(extracted, binPath);
105
+ const extracted = join(tmpDir, `${BINARY}.exe`);
106
+ if (existsSync(extracted)) renameSync(extracted, binPath);
66
107
  } else {
67
- const tar = require("tar");
108
+ const tar = (await import("tar")).default;
68
109
  await tar.x({ file: archivePath, cwd: tmpDir });
69
- fs.renameSync(path.join(tmpDir, BINARY), binPath);
110
+ const extracted = join(tmpDir, BINARY);
111
+ if (existsSync(extracted)) renameSync(extracted, binPath);
70
112
  }
71
113
 
72
- fs.chmodSync(binPath, 0o755);
73
- fs.rmSync(tmpDir, { recursive: true, force: true });
114
+ chmodSync(binPath, 0o755);
115
+ try { rmSync(tmpDir, { recursive: true, force: true }); } catch { }
74
116
  return binPath;
75
117
  }
76
118
 
77
- async function getInstalledVersion(binPath) {
78
- try {
79
- const { execFileSync } = require("child_process");
80
- const out = execFileSync(binPath, ["--version"], { encoding: "utf8" });
81
- const m = out.match(/v?(\d+\.\d+\.\d+)/);
82
- return m ? m[1] : null;
83
- } catch {
84
- return null;
85
- }
86
- }
87
-
88
119
  async function ensureBinary() {
89
- const binPath = path.join(INSTALL_DIR, process.platform === "win32" ? `${BINARY}.exe` : BINARY);
90
- const { platform, arch, asset } = getPlatform();
91
- const latestVersion = await getLatestVersion();
92
-
93
- if (fs.existsSync(binPath)) {
94
- const installed = await getInstalledVersion(binPath);
95
- if (installed && installed === latestVersion) return binPath;
96
- if (installed) console.error(`Updating Aerostack CLI v${installed} → v${latestVersion}...`);
97
- } else {
98
- console.error(`Downloading Aerostack CLI v${latestVersion}...`);
99
- }
120
+ const binPath = join(INSTALL_DIR, process.platform === "win32" ? `${BINARY}.exe` : BINARY);
121
+ const { arch, asset } = getPlatform();
100
122
 
101
- try {
102
- return await downloadBinary(latestVersion, asset);
103
- } catch (err) {
104
- // Windows on ARM64 can run x64 binaries via emulation.
105
- // If arm64 artifact is unavailable, fall back to windows_amd64.
106
- if (platform === "win32" && arch === "arm64" && asset === "windows_arm64") {
107
- return downloadBinary(latestVersion, "windows_amd64");
108
- }
109
- throw err;
110
- }
111
- }
123
+ // For now, always try to grab latest or fallback
124
+ // In production we should cache version check
125
+ if (existsSync(binPath)) return binPath;
112
126
 
113
- async function main() {
114
- try {
115
- const binPath = await ensureBinary();
116
- const child = spawn(binPath, process.argv.slice(2), {
117
- stdio: "inherit",
118
- shell: false,
119
- });
120
- child.on("exit", (code) => process.exit(code ?? 0));
121
- } catch (err) {
122
- console.error("Error:", err.message);
123
- process.exit(1);
124
- }
127
+ const version = await getLatestVersion();
128
+ return await downloadBinary(version, asset);
125
129
  }
126
-
127
- main();
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `aerostack add <slug>` — The Game Changer
3
+ *
4
+ * Downloads a community function from the registry and wires it into
5
+ * your project automatically.
6
+ *
7
+ * What it does:
8
+ * 1. Fetches the install manifest from the registry API
9
+ * 2. Places all source files into src/modules/<name>/ or src/lib/<name>/
10
+ * 3. Patches src/index.ts with the import + app.route() call
11
+ * 4. (Optional) Generates a Node.js adapter
12
+ * 5. Prints next steps (drizzle-kit push, env vars to set)
13
+ *
14
+ * Usage:
15
+ * npx aerostack add stripe-checkout
16
+ * npx aerostack add alice/stripe-checkout
17
+ * npx aerostack add stripe-checkout --runtime=node
18
+ * npx aerostack add stripe-checkout --registry=http://localhost:8787/api
19
+ */
20
+ export declare function addCommand(args: string[]): Promise<void>;
21
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuFH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,iBAmK9C"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * `aerostack add <slug>` — The Game Changer
3
+ *
4
+ * Downloads a community function from the registry and wires it into
5
+ * your project automatically.
6
+ *
7
+ * What it does:
8
+ * 1. Fetches the install manifest from the registry API
9
+ * 2. Places all source files into src/modules/<name>/ or src/lib/<name>/
10
+ * 3. Patches src/index.ts with the import + app.route() call
11
+ * 4. (Optional) Generates a Node.js adapter
12
+ * 5. Prints next steps (drizzle-kit push, env vars to set)
13
+ *
14
+ * Usage:
15
+ * npx aerostack add stripe-checkout
16
+ * npx aerostack add alice/stripe-checkout
17
+ * npx aerostack add stripe-checkout --runtime=node
18
+ * npx aerostack add stripe-checkout --registry=http://localhost:8787/api
19
+ */
20
+ import chalk from 'chalk';
21
+ import ora from 'ora';
22
+ import { mkdirSync, writeFileSync, existsSync } from 'fs';
23
+ import { join, resolve } from 'path';
24
+ import { execSync } from 'child_process';
25
+ import { fetchInstallManifest, DEFAULT_REGISTRY } from '../lib/registry.js';
26
+ import { injectRoute, injectSchema } from '../lib/injector.js';
27
+ function parseArgs(args) {
28
+ const slug = args.find(a => !a.startsWith('--'));
29
+ const flags = {};
30
+ for (const arg of args) {
31
+ if (arg.startsWith('--')) {
32
+ const [key, val] = arg.slice(2).split('=');
33
+ flags[key] = val || 'true';
34
+ }
35
+ }
36
+ return { slug, flags };
37
+ }
38
+ function toPascalCase(str) {
39
+ return str.split(/[-_]/).map(s => s[0]?.toUpperCase() + s.slice(1)).join('');
40
+ }
41
+ function toCamelCase(str) {
42
+ const p = toPascalCase(str);
43
+ return p[0].toLowerCase() + p.slice(1);
44
+ }
45
+ function generateNodeAdapter(manifest, moduleName) {
46
+ const pascal = toPascalCase(moduleName);
47
+ const camel = toCamelCase(moduleName);
48
+ const coreFile = manifest.files.find(f => f.path === 'core.ts');
49
+ const hasSchema = manifest.drizzleSchema;
50
+ // Extract exported function names from core.ts if available
51
+ let coreImports = '// import { yourFunction } from \'./core\';';
52
+ if (coreFile) {
53
+ const exports = Array.from(coreFile.content.matchAll(/^export (?:async )?function (\w+)/gm))
54
+ .map(m => m[1]);
55
+ if (exports.length > 0) {
56
+ coreImports = `import { ${exports.join(', ')} } from './core';`;
57
+ }
58
+ }
59
+ return `/**
60
+ * ${moduleName}/node-adapter.ts — Node.js / Express Adapter
61
+ *
62
+ * Generated by Aerostack CLI. Do not edit directly.
63
+ *
64
+ * This adapter wraps the platform-agnostic core.ts functions
65
+ * for use in Node.js + Express applications.
66
+ *
67
+ * Usage:
68
+ * import { create${pascal}Router } from './modules/${moduleName}/node-adapter';
69
+ * app.use('/api/${moduleName}', create${pascal}Router(db));
70
+ */
71
+ import { Router } from 'express';
72
+ ${hasSchema ? "import { drizzle } from 'drizzle-orm/node-postgres';" : ''}
73
+ ${hasSchema ? "import * as schema from './schema';" : ''}
74
+ ${coreImports}
75
+
76
+ export function create${pascal}Router(d1OrPgClient: any) {
77
+ const router = Router();
78
+ ${hasSchema ? ` const db = typeof d1OrPgClient?.prepare === 'function'
79
+ ? drizzle(d1OrPgClient, { schema }) // SQLite/D1
80
+ : drizzle(d1OrPgClient, { schema }); // PostgreSQL
81
+ ` : ''}
82
+
83
+ // TODO: Mount your core function calls here
84
+ // Example:
85
+ // router.get('/', async (req, res) => {
86
+ // const result = await yourFunction({ db }, req.query);
87
+ // res.json(result);
88
+ // });
89
+
90
+ router.get('/health', (_req, res) => res.json({ module: '${moduleName}', ok: true }));
91
+
92
+ return router;
93
+ }
94
+
95
+ export { create${pascal}Router as ${camel}Router };
96
+ `;
97
+ }
98
+ export async function addCommand(args) {
99
+ const { slug, flags } = parseArgs(args);
100
+ if (!slug) {
101
+ console.error(chalk.red('\n Usage: npx aerostack add <function-name>\n'));
102
+ console.log(chalk.gray(' Example: npx aerostack add stripe-checkout\n'));
103
+ process.exit(1);
104
+ }
105
+ const registry = flags['registry'] || DEFAULT_REGISTRY;
106
+ const runtime = flags['runtime'] || 'cloudflare'; // 'cloudflare' | 'node'
107
+ const dryRun = flags['dry-run'] === 'true';
108
+ const projectRoot = resolve(process.cwd());
109
+ console.log(`\n${chalk.bold.blue(' ⚡ Aerostack Add')}\n`);
110
+ console.log(` Installing ${chalk.cyan(slug)} from registry...\n`);
111
+ // ─── Step 1: Fetch install manifest ──────────────────────────────────────
112
+ const spinner = ora(`Fetching "${slug}" from registry`).start();
113
+ let manifest;
114
+ try {
115
+ manifest = await fetchInstallManifest(registry, slug);
116
+ spinner.succeed(`Found: ${chalk.bold(manifest.name)} by ${chalk.cyan(manifest.author)} ${chalk.gray(`v${manifest.version}`)}`);
117
+ }
118
+ catch (err) {
119
+ spinner.fail(err.message);
120
+ process.exit(1);
121
+ }
122
+ const moduleName = manifest.slug;
123
+ const moduleType = manifest.type || 'feature'; // 'feature' → src/modules/, 'utility' → src/lib/
124
+ const moduleDir = moduleType === 'utility'
125
+ ? join(projectRoot, 'src', 'lib', moduleName)
126
+ : join(projectRoot, 'src', 'modules', moduleName);
127
+ // ─── Step 2: Write source files ──────────────────────────────────────────
128
+ const writeSpinner = ora('Writing source files').start();
129
+ try {
130
+ if (!dryRun) {
131
+ mkdirSync(moduleDir, { recursive: true });
132
+ for (const file of manifest.files) {
133
+ const filePath = join(moduleDir, file.path);
134
+ writeFileSync(filePath, file.content, 'utf-8');
135
+ }
136
+ // Write aerostack-manifest.json (for publish command to read later)
137
+ writeFileSync(join(moduleDir, 'aerostack-manifest.json'), JSON.stringify({
138
+ id: manifest.id,
139
+ name: manifest.name,
140
+ slug: manifest.slug,
141
+ author: manifest.author,
142
+ version: manifest.version,
143
+ type: manifest.type,
144
+ routeExport: manifest.routeExport,
145
+ routePath: manifest.routePath,
146
+ drizzleSchema: manifest.drizzleSchema,
147
+ npmDependencies: manifest.npmDependencies || [],
148
+ envVars: manifest.envVars || [],
149
+ installedAt: new Date().toISOString(),
150
+ }, null, 2), 'utf-8');
151
+ // Optionally generate node adapter
152
+ if (runtime === 'node') {
153
+ const nodeAdapterContent = generateNodeAdapter(manifest, moduleName);
154
+ writeFileSync(join(moduleDir, 'node-adapter.ts'), nodeAdapterContent, 'utf-8');
155
+ }
156
+ }
157
+ writeSpinner.succeed(`Files placed in ${chalk.cyan(`src/${moduleType === 'utility' ? 'lib' : 'modules'}/${moduleName}/`)}`);
158
+ }
159
+ catch (err) {
160
+ writeSpinner.fail(`Failed to write files: ${err.message}`);
161
+ process.exit(1);
162
+ }
163
+ // ─── Step 3: Patch src/index.ts ──────────────────────────────────────────
164
+ if (moduleType === 'feature' && manifest.routeExport && manifest.routePath) {
165
+ const injectSpinner = ora('Patching src/index.ts').start();
166
+ const indexPath = join(projectRoot, 'src', 'index.ts');
167
+ const relPath = `./modules/${moduleName}/adapter`;
168
+ const importStmt = `import { ${manifest.routeExport} } from '${relPath}';`;
169
+ const routeStmt = `app.route('${manifest.routePath}', ${manifest.routeExport});`;
170
+ if (!dryRun && existsSync(indexPath)) {
171
+ const result = injectRoute(indexPath, {
172
+ importStatement: importStmt,
173
+ routeStatement: routeStmt,
174
+ });
175
+ if (result.modified) {
176
+ injectSpinner.succeed('src/index.ts patched');
177
+ }
178
+ else {
179
+ injectSpinner.info(`src/index.ts: ${result.reason}`);
180
+ }
181
+ }
182
+ else if (!existsSync(indexPath)) {
183
+ injectSpinner.warn('src/index.ts not found — add these manually:');
184
+ console.log(chalk.gray(`\n ${importStmt}`));
185
+ console.log(chalk.gray(` ${routeStmt}\n`));
186
+ }
187
+ else {
188
+ injectSpinner.succeed('src/index.ts (dry run — would inject)');
189
+ }
190
+ }
191
+ // ─── Step 4: Patch src/db/schema.ts ──────────────────────────────────────
192
+ if (manifest.drizzleSchema) {
193
+ const schemaPath = join(projectRoot, 'src', 'db', 'schema.ts');
194
+ if (!dryRun && existsSync(schemaPath)) {
195
+ const relPath = `../modules/${moduleName}/schema`;
196
+ injectSchema(schemaPath, {
197
+ importStatement: `import * as ${toCamelCase(moduleName)}Schema from '${relPath}';`,
198
+ exportStatement: `export * from '${relPath}';`,
199
+ });
200
+ }
201
+ }
202
+ // ─── Step 5: Install npm dependencies ────────────────────────────────────
203
+ if (manifest.npmDependencies && manifest.npmDependencies.length > 0) {
204
+ const depsSpinner = ora(`Installing npm deps: ${manifest.npmDependencies.join(', ')}`).start();
205
+ if (!dryRun) {
206
+ try {
207
+ execSync(`npm install ${manifest.npmDependencies.join(' ')}`, {
208
+ cwd: projectRoot,
209
+ stdio: 'pipe',
210
+ });
211
+ depsSpinner.succeed(`npm packages installed`);
212
+ }
213
+ catch {
214
+ depsSpinner.warn(`npm install failed — run manually: npm install ${manifest.npmDependencies.join(' ')}`);
215
+ }
216
+ }
217
+ else {
218
+ depsSpinner.succeed('(dry run)');
219
+ }
220
+ }
221
+ // ─── Done ─────────────────────────────────────────────────────────────────
222
+ console.log(`\n${chalk.green(' ✓ Done!')} ${chalk.bold(manifest.name)} is installed.\n`);
223
+ const nextSteps = [];
224
+ if (manifest.drizzleSchema) {
225
+ nextSteps.push(`${chalk.gray('→')} Apply schema: ${chalk.cyan('npx drizzle-kit push')}`);
226
+ }
227
+ if (manifest.envVars && manifest.envVars.length > 0) {
228
+ nextSteps.push(`${chalk.gray('→')} Add to wrangler.toml [vars] or .env:`);
229
+ for (const v of manifest.envVars) {
230
+ nextSteps.push(` ${chalk.yellow(v)}=your_value`);
231
+ }
232
+ }
233
+ if (manifest.routePath) {
234
+ nextSteps.push(`${chalk.gray('→')} Route available at: ${chalk.cyan(manifest.routePath)}`);
235
+ }
236
+ if (runtime === 'node') {
237
+ nextSteps.push(`${chalk.gray('→')} Node adapter: ${chalk.cyan(`src/modules/${moduleName}/node-adapter.ts`)}`);
238
+ }
239
+ if (nextSteps.length > 0) {
240
+ console.log(chalk.bold(' Next steps:'));
241
+ for (const step of nextSteps) {
242
+ console.log(` ${step}`);
243
+ }
244
+ console.log();
245
+ }
246
+ console.log(` ${chalk.gray('View source:')} ${chalk.underline(`https://hub.aerostack.dev/functions/${manifest.author}/${manifest.slug}`)}\n`);
247
+ }
248
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `aerostack init [directory]`
3
+ *
4
+ * Scaffolds a new Aerostack project with:
5
+ * - Hono framework (Cloudflare Workers)
6
+ * - Drizzle ORM (D1 Database)
7
+ * - Standard module structure (src/modules/, src/lib/, src/db/)
8
+ * - Injection markers so `aerostack add` can auto-wire modules
9
+ */
10
+ export declare function initCommand(args: string[]): Promise<void>;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,iBAkG/C"}