@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.
- package/README.md +15 -0
- package/bin/postinstall.js +8 -39
- package/bin/run.js +85 -83
- package/dist/commands/add.d.ts +21 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +248 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +114 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +13 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +79 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +12 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +59 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +11 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +230 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +24 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/injector.d.ts +30 -0
- package/dist/lib/injector.d.ts.map +1 -0
- package/dist/lib/injector.js +84 -0
- package/dist/lib/injector.js.map +1 -0
- package/dist/lib/registry.d.ts +81 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +124 -0
- package/dist/lib/registry.js.map +1 -0
- package/package.json +16 -3
- package/templates/drizzle.config.ts +16 -0
- package/templates/package.json +23 -0
- package/templates/src/db/client.ts +12 -0
- package/templates/src/db/schema.ts +14 -0
- package/templates/src/index.ts +28 -0
- package/templates/tsconfig.json +29 -0
- 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
|
package/bin/postinstall.js
CHANGED
|
@@ -1,41 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 -
|
|
4
|
-
*
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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 =
|
|
17
|
-
const 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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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}
|
|
42
|
-
|
|
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
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
95
|
+
writeFileSync(archivePath, buffer);
|
|
55
96
|
|
|
56
97
|
const binDir = INSTALL_DIR;
|
|
57
|
-
|
|
58
|
-
const binPath =
|
|
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 =
|
|
102
|
+
const AdmZip = (await import("adm-zip")).default;
|
|
62
103
|
const zip = new AdmZip(archivePath);
|
|
63
104
|
zip.extractAllTo(tmpDir, true);
|
|
64
|
-
const extracted =
|
|
65
|
-
|
|
105
|
+
const extracted = join(tmpDir, `${BINARY}.exe`);
|
|
106
|
+
if (existsSync(extracted)) renameSync(extracted, binPath);
|
|
66
107
|
} else {
|
|
67
|
-
const tar =
|
|
108
|
+
const tar = (await import("tar")).default;
|
|
68
109
|
await tar.x({ file: archivePath, cwd: tmpDir });
|
|
69
|
-
|
|
110
|
+
const extracted = join(tmpDir, BINARY);
|
|
111
|
+
if (existsSync(extracted)) renameSync(extracted, binPath);
|
|
70
112
|
}
|
|
71
113
|
|
|
72
|
-
|
|
73
|
-
|
|
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 =
|
|
90
|
-
const {
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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"}
|