@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/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Aerostack CLI — Main Entry Point
4
+ *
5
+ * Usage:
6
+ * npx aerostack init [directory] — scaffold a new project
7
+ * npx aerostack add <slug> — install a function from registry
8
+ * npx aerostack list — browse available functions
9
+ * npx aerostack publish — push local function to registry
10
+ * npx aerostack login — authenticate with Aerostack
11
+ */
12
+ import chalk from 'chalk';
13
+ import { initCommand } from './commands/init.js';
14
+ import { addCommand } from './commands/add.js';
15
+ import { listCommand } from './commands/list.js';
16
+ import { publishCommand } from './commands/publish.js';
17
+ import { loginCommand } from './commands/login.js';
18
+ // args parsed inside run()
19
+ const VERSION = '1.0.0';
20
+ function printHelp() {
21
+ console.log(`
22
+ ${chalk.bold.blue(' ⚡ Aerostack CLI')} ${chalk.gray(`v${VERSION}`)}
23
+
24
+ ${chalk.bold('Usage:')}
25
+ ${chalk.cyan('npx aerostack')} <command> [options]
26
+
27
+ ${chalk.bold('Commands:')}
28
+ ${chalk.cyan('init')} [directory] Scaffold a new Aerostack project (Drizzle + Hono)
29
+ ${chalk.cyan('add')} <slug> Install a community function from the registry
30
+ ${chalk.cyan('list')} Browse available functions in the registry
31
+ ${chalk.cyan('publish')} Publish a local function to the community registry
32
+ ${chalk.cyan('login')} Authenticate with your Aerostack account
33
+
34
+ ${chalk.bold('Examples:')}
35
+ ${chalk.gray('# Create a new project')}
36
+ npx aerostack init my-backend
37
+
38
+ ${chalk.gray('# Install a community function')}
39
+ npx aerostack add stripe-checkout
40
+ npx aerostack add alice/stripe-checkout ${chalk.gray('# specific author')}
41
+ npx aerostack add stripe-checkout --runtime=node ${chalk.gray('# with Node.js adapter')}
42
+
43
+ ${chalk.gray('# Browse the registry')}
44
+ npx aerostack list --category=payments
45
+
46
+ ${chalk.gray('# Publish your function')}
47
+ npx aerostack publish ./src/modules/my-fn
48
+
49
+ ${chalk.bold('Documentation:')} ${chalk.underline('https://aerostack.dev/docs/cli')}
50
+ `);
51
+ }
52
+ export async function run(args) {
53
+ const command = args[0];
54
+ const rest = args.slice(1);
55
+ if (!command || command === '--help' || command === '-h') {
56
+ printHelp();
57
+ // If it's the Node.js handler, we exit. If falling through to Go, we wouldn't be here.
58
+ process.exit(0);
59
+ }
60
+ if (command === '--version' || command === '-v') {
61
+ console.log(VERSION);
62
+ process.exit(0);
63
+ }
64
+ try {
65
+ switch (command) {
66
+ case 'init':
67
+ await initCommand(rest);
68
+ break;
69
+ case 'add':
70
+ await addCommand(rest);
71
+ break;
72
+ case 'list':
73
+ await listCommand(rest);
74
+ break;
75
+ case 'publish':
76
+ await publishCommand(rest);
77
+ break;
78
+ case 'login':
79
+ await loginCommand(rest);
80
+ break;
81
+ default:
82
+ // Should not happen if run.js filters correctly
83
+ console.error(chalk.red(`\n Unknown command: ${command}\n`));
84
+ printHelp();
85
+ process.exit(1);
86
+ }
87
+ }
88
+ catch (err) {
89
+ console.error(chalk.red(`\n Error: ${err.message}\n`));
90
+ process.exit(1);
91
+ }
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,2BAA2B;AAE3B,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAS,SAAS;IACd,OAAO,CAAC,GAAG,CAAC;EACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;;EAEjE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;;EAE7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;;EAErB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;;;IAGpC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;;kDAEE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;sDAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;;IAEtF,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC;;;IAGnC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC;;;EAGvC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,gCAAgC,CAAC;CACnF,CAAC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvD,SAAS,EAAE,CAAC;QACZ,uFAAuF;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACD,QAAQ,OAAO,EAAE,CAAC;YACd,KAAK,MAAM;gBACP,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;YACV,KAAK,KAAK;gBACN,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;gBACvB,MAAM;YACV,KAAK,MAAM;gBACP,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;YACV,KAAK,SAAS;gBACV,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM;YACV,KAAK,OAAO;gBACR,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;gBACzB,MAAM;YACV;gBACI,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,OAAO,IAAI,CAAC,CAAC,CAAC;gBAC9D,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface AerostackConfig {
2
+ token?: string;
3
+ email?: string;
4
+ registry?: string;
5
+ }
6
+ export declare function getConfig(): AerostackConfig;
7
+ export declare function saveConfig(config: AerostackConfig): void;
8
+ export declare function isAuthenticated(): boolean;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,SAAS,IAAI,eAAe,CAO3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAGxD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
@@ -0,0 +1,24 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const CONFIG_DIR = join(homedir(), '.aerostack');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ export function getConfig() {
7
+ if (!existsSync(CONFIG_FILE))
8
+ return {};
9
+ try {
10
+ return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
11
+ }
12
+ catch {
13
+ return {};
14
+ }
15
+ }
16
+ export function saveConfig(config) {
17
+ if (!existsSync(CONFIG_DIR))
18
+ mkdirSync(CONFIG_DIR, { recursive: true });
19
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
20
+ }
21
+ export function isAuthenticated() {
22
+ return !!getConfig().token;
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAQpD,MAAM,UAAU,SAAS;IACrB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAuB;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * AST-safe injector for src/index.ts and src/db/schema.ts
3
+ *
4
+ * Uses marker comments so injections are idempotent and predictable.
5
+ * Markers set during `aerostack init` — never modifies files without them.
6
+ */
7
+ export interface InjectionResult {
8
+ modified: boolean;
9
+ reason?: string;
10
+ }
11
+ /**
12
+ * Injects an import + route into src/index.ts.
13
+ * Returns false if already injected (idempotent).
14
+ */
15
+ export declare function injectRoute(indexPath: string, opts: {
16
+ importStatement: string;
17
+ routeStatement: string;
18
+ }): InjectionResult;
19
+ /**
20
+ * Injects schema import + export re-export into src/db/schema.ts
21
+ */
22
+ export declare function injectSchema(schemaPath: string, opts: {
23
+ importStatement: string;
24
+ exportStatement: string;
25
+ }): InjectionResult;
26
+ /**
27
+ * Replace template tokens like {{PROJECT_NAME}} in a file string.
28
+ */
29
+ export declare function applyTokens(content: string, tokens: Record<string, string>): string;
30
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CAC1B,GACF,eAAe,CA+CjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CAC3B,GACF,eAAe,CA8BjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEnF"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * AST-safe injector for src/index.ts and src/db/schema.ts
3
+ *
4
+ * Uses marker comments so injections are idempotent and predictable.
5
+ * Markers set during `aerostack init` — never modifies files without them.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
8
+ // Marker constants — must match templates/src/index.ts
9
+ const IMPORTS_MARKER = '// aerostack:imports';
10
+ const ROUTES_MARKER = '// aerostack:routes';
11
+ const SCHEMA_IMPORTS_MARKER = '// aerostack:schema-imports';
12
+ const SCHEMA_EXPORTS_MARKER = '// aerostack:schema-exports';
13
+ /**
14
+ * Injects an import + route into src/index.ts.
15
+ * Returns false if already injected (idempotent).
16
+ */
17
+ export function injectRoute(indexPath, opts) {
18
+ if (!existsSync(indexPath)) {
19
+ return { modified: false, reason: `File not found: ${indexPath}` };
20
+ }
21
+ let content = readFileSync(indexPath, 'utf-8');
22
+ // Check if already injected (idempotent)
23
+ if (content.includes(opts.importStatement)) {
24
+ return { modified: false, reason: 'Already injected' };
25
+ }
26
+ // Inject import before the marker
27
+ if (content.includes(IMPORTS_MARKER)) {
28
+ content = content.replace(IMPORTS_MARKER, `${opts.importStatement}\n${IMPORTS_MARKER}`);
29
+ }
30
+ else {
31
+ // Fallback: add near top after last existing import
32
+ const lines = content.split('\n');
33
+ let lastImportIdx = -1;
34
+ for (let i = 0; i < lines.length; i++) {
35
+ if (lines[i].startsWith('import '))
36
+ lastImportIdx = i;
37
+ }
38
+ if (lastImportIdx >= 0) {
39
+ lines.splice(lastImportIdx + 1, 0, opts.importStatement);
40
+ content = lines.join('\n');
41
+ }
42
+ }
43
+ // Inject route before the marker
44
+ if (content.includes(ROUTES_MARKER)) {
45
+ content = content.replace(ROUTES_MARKER, `${opts.routeStatement}\n${ROUTES_MARKER}`);
46
+ }
47
+ else {
48
+ // Fallback: add before export default
49
+ content = content.replace('export default app', `${opts.routeStatement}\n\nexport default app`);
50
+ }
51
+ writeFileSync(indexPath, content, 'utf-8');
52
+ return { modified: true };
53
+ }
54
+ /**
55
+ * Injects schema import + export re-export into src/db/schema.ts
56
+ */
57
+ export function injectSchema(schemaPath, opts) {
58
+ if (!existsSync(schemaPath)) {
59
+ // Non-fatal: db/schema.ts might not exist (users can run drizzle-kit directly)
60
+ return { modified: false, reason: 'db/schema.ts not found — skipping schema injection' };
61
+ }
62
+ let content = readFileSync(schemaPath, 'utf-8');
63
+ if (content.includes(opts.exportStatement)) {
64
+ return { modified: false, reason: 'Already injected' };
65
+ }
66
+ if (content.includes(SCHEMA_IMPORTS_MARKER)) {
67
+ content = content.replace(SCHEMA_IMPORTS_MARKER, `${opts.importStatement}\n${SCHEMA_IMPORTS_MARKER}`);
68
+ }
69
+ if (content.includes(SCHEMA_EXPORTS_MARKER)) {
70
+ content = content.replace(SCHEMA_EXPORTS_MARKER, `${opts.exportStatement}\n${SCHEMA_EXPORTS_MARKER}`);
71
+ }
72
+ else {
73
+ content += `\n${opts.exportStatement}\n`;
74
+ }
75
+ writeFileSync(schemaPath, content, 'utf-8');
76
+ return { modified: true };
77
+ }
78
+ /**
79
+ * Replace template tokens like {{PROJECT_NAME}} in a file string.
80
+ */
81
+ export function applyTokens(content, tokens) {
82
+ return content.replace(/\{\{(\w+)\}\}/g, (_, key) => tokens[key] ?? `{{${key}}}`);
83
+ }
84
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Registry API client
3
+ * Communicates with the Aerostack community API to fetch and publish functions.
4
+ */
5
+ export declare const DEFAULT_REGISTRY = "https://api.aerostack.dev/api";
6
+ export interface FunctionManifest {
7
+ id: string;
8
+ name: string;
9
+ slug: string;
10
+ description: string;
11
+ category: string;
12
+ type: 'feature' | 'utility';
13
+ author: string;
14
+ version: string;
15
+ language: string;
16
+ starCount: number;
17
+ cloneCount: number;
18
+ license: string;
19
+ tags: string[];
20
+ npmDependencies?: string[];
21
+ envVars?: string[];
22
+ routeExport?: string;
23
+ routePath?: string;
24
+ drizzleSchema?: boolean;
25
+ aiConfig?: any;
26
+ monetization?: any;
27
+ files: Array<{
28
+ path: string;
29
+ content: string;
30
+ }>;
31
+ }
32
+ export interface FunctionListItem {
33
+ id: string;
34
+ name: string;
35
+ slug: string;
36
+ description: string;
37
+ category: string;
38
+ author_username: string;
39
+ star_count: number;
40
+ clone_count: number;
41
+ version: string;
42
+ tags: string[];
43
+ }
44
+ export declare function fetchInstallManifest(registry: string, slug: string): Promise<FunctionManifest>;
45
+ export declare function listFunctions(registry: string, opts?: {
46
+ category?: string;
47
+ search?: string;
48
+ sort?: string;
49
+ limit?: number;
50
+ }): Promise<FunctionListItem[]>;
51
+ export declare function createFunction(registry: string, payload: {
52
+ name: string;
53
+ description: string;
54
+ category: string;
55
+ code: string;
56
+ language?: string;
57
+ tags?: string[];
58
+ readme?: string;
59
+ license?: string;
60
+ aiConfig?: any;
61
+ monetization?: any;
62
+ }): Promise<{
63
+ id: string;
64
+ slug: string;
65
+ author: string;
66
+ }>;
67
+ export declare function updateFunction(registry: string, id: string, payload: Partial<{
68
+ name: string;
69
+ description: string;
70
+ code: string;
71
+ tags: string[];
72
+ readme: string;
73
+ version: string;
74
+ aiConfig?: any;
75
+ monetization?: any;
76
+ }>): Promise<void>;
77
+ export declare function publishFunction(registry: string, id: string): Promise<{
78
+ url: string;
79
+ }>;
80
+ export declare function loginToRegistry(registry: string, email: string, password: string): Promise<string>;
81
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Registry API client
3
+ * Communicates with the Aerostack community API to fetch and publish functions.
4
+ */
5
+ import { getConfig } from './config.js';
6
+ export const DEFAULT_REGISTRY = 'https://api.aerostack.dev/api';
7
+ function getRegistryUrl() {
8
+ try {
9
+ const config = getConfig();
10
+ return config.registry || DEFAULT_REGISTRY;
11
+ }
12
+ catch {
13
+ return DEFAULT_REGISTRY;
14
+ }
15
+ }
16
+ function getAuthToken() {
17
+ try {
18
+ const config = getConfig();
19
+ return config.token || null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ function buildHeaders(requireAuth = false) {
26
+ const headers = {
27
+ 'Content-Type': 'application/json',
28
+ 'User-Agent': 'aerostack-cli/1.0.0',
29
+ };
30
+ const token = getAuthToken();
31
+ if (token) {
32
+ headers['Authorization'] = `Bearer ${token}`;
33
+ }
34
+ else if (requireAuth) {
35
+ throw new Error('Not authenticated. Run: npx aerostack login');
36
+ }
37
+ return headers;
38
+ }
39
+ export async function fetchInstallManifest(registry, slug) {
40
+ // Support "author/slug" or just "slug"
41
+ let url;
42
+ if (slug.includes('/')) {
43
+ const [author, fnSlug] = slug.split('/');
44
+ url = `${registry}/community/functions/${author}/${fnSlug}/install`;
45
+ }
46
+ else {
47
+ // Search by slug directly
48
+ url = `${registry}/community/functions/install/${slug}`;
49
+ }
50
+ const res = await fetch(url, { headers: buildHeaders() });
51
+ if (res.status === 404) {
52
+ throw new Error(`Function "${slug}" not found in registry. Run: npx aerostack list`);
53
+ }
54
+ if (!res.ok) {
55
+ const body = await res.json().catch(() => ({}));
56
+ throw new Error(body?.error || `Registry error: ${res.status}`);
57
+ }
58
+ return res.json();
59
+ }
60
+ export async function listFunctions(registry, opts = {}) {
61
+ const params = new URLSearchParams();
62
+ if (opts.category)
63
+ params.set('category', opts.category);
64
+ if (opts.search)
65
+ params.set('search', opts.search);
66
+ if (opts.sort)
67
+ params.set('sort', opts.sort);
68
+ if (opts.limit)
69
+ params.set('limit', String(opts.limit));
70
+ const url = `${registry}/community/functions?${params}`;
71
+ const res = await fetch(url, { headers: buildHeaders() });
72
+ if (!res.ok)
73
+ throw new Error(`Registry error: ${res.status}`);
74
+ const data = await res.json();
75
+ return data.functions || [];
76
+ }
77
+ export async function createFunction(registry, payload) {
78
+ const res = await fetch(`${registry}/community/functions`, {
79
+ method: 'POST',
80
+ headers: buildHeaders(true),
81
+ body: JSON.stringify(payload),
82
+ });
83
+ if (!res.ok) {
84
+ const body = await res.json().catch(() => ({}));
85
+ throw new Error(body?.error || `Failed to create function: ${res.status}`);
86
+ }
87
+ return res.json();
88
+ }
89
+ export async function updateFunction(registry, id, payload) {
90
+ const res = await fetch(`${registry}/community/functions/${id}`, {
91
+ method: 'PATCH',
92
+ headers: buildHeaders(true),
93
+ body: JSON.stringify(payload),
94
+ });
95
+ if (!res.ok) {
96
+ const body = await res.json().catch(() => ({}));
97
+ throw new Error(body?.error || `Failed to update function: ${res.status}`);
98
+ }
99
+ }
100
+ export async function publishFunction(registry, id) {
101
+ const res = await fetch(`${registry}/community/functions/${id}/publish`, {
102
+ method: 'POST',
103
+ headers: buildHeaders(true),
104
+ });
105
+ if (!res.ok) {
106
+ const body = await res.json().catch(() => ({}));
107
+ throw new Error(body?.error || `Failed to publish function: ${res.status}`);
108
+ }
109
+ return res.json();
110
+ }
111
+ export async function loginToRegistry(registry, email, password) {
112
+ const res = await fetch(`${registry}/auth/login`, {
113
+ method: 'POST',
114
+ headers: { 'Content-Type': 'application/json' },
115
+ body: JSON.stringify({ email, password }),
116
+ });
117
+ if (!res.ok) {
118
+ const body = await res.json().catch(() => ({}));
119
+ throw new Error(body?.error || 'Login failed');
120
+ }
121
+ const data = await res.json();
122
+ return data.token;
123
+ }
124
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,33 @@
1
1
  {
2
2
  "name": "@aerostack/cli",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Aerostack CLI - Zero-config serverless development for Cloudflare",
5
+ "type": "module",
5
6
  "files": [
6
- "bin"
7
+ "bin",
8
+ "dist",
9
+ "templates"
7
10
  ],
8
11
  "bin": {
9
12
  "aerostack": "bin/run.js"
10
13
  },
11
14
  "scripts": {
15
+ "build": "tsc",
12
16
  "postinstall": "node bin/postinstall.js",
13
17
  "uninstall": "node bin/uninstall.js"
14
18
  },
15
19
  "dependencies": {
16
20
  "adm-zip": "^0.5.16",
17
- "tar": "^7.0.0"
21
+ "tar": "^7.0.0",
22
+ "chalk": "^5.3.0",
23
+ "ora": "^8.0.1",
24
+ "prompts": "^2.4.2",
25
+ "node-fetch": "^3.3.2"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.0.0",
29
+ "@types/prompts": "^2.4.9",
30
+ "typescript": "^5.9.3"
18
31
  },
19
32
  "keywords": [
20
33
  "aerostack",
@@ -0,0 +1,16 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ export default defineConfig({
4
+ schema: [
5
+ './src/db/schema.ts', // Base/core tables
6
+ './src/modules/**/schema.ts' // Auto-discover all installed module schemas
7
+ ],
8
+ out: './drizzle',
9
+ dialect: 'sqlite',
10
+ driver: 'd1-http',
11
+ dbCredentials: {
12
+ accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
13
+ databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
14
+ token: process.env.CLOUDFLARE_D1_TOKEN!,
15
+ },
16
+ });
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "{{PROJECT_NAME}}",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "private": true,
6
+ "scripts": {
7
+ "dev": "wrangler dev",
8
+ "deploy": "wrangler deploy",
9
+ "db:push": "drizzle-kit push",
10
+ "db:generate": "drizzle-kit generate",
11
+ "db:studio": "drizzle-kit studio"
12
+ },
13
+ "dependencies": {
14
+ "drizzle-orm": "^0.45.1",
15
+ "hono": "^4.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@cloudflare/workers-types": "^4.20250219.0",
19
+ "drizzle-kit": "^0.31.0",
20
+ "typescript": "^5.9.0",
21
+ "wrangler": "^4.0.0"
22
+ }
23
+ }
@@ -0,0 +1,12 @@
1
+ import { drizzle } from 'drizzle-orm/d1';
2
+ import * as schema from './schema';
3
+
4
+ export type DrizzleDB = ReturnType<typeof createDb>;
5
+
6
+ /**
7
+ * Creates a Drizzle database client bound to the Cloudflare D1 instance.
8
+ * Call this inside each request handler: const db = createDb(c.env.DB);
9
+ */
10
+ export function createDb(d1: D1Database) {
11
+ return drizzle(d1, { schema });
12
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * src/db/schema.ts — Central Schema Hub
3
+ *
4
+ * This file re-exports all table schemas from installed modules.
5
+ * Drizzle uses this for type-safe query building.
6
+ *
7
+ * When you run `npx aerostack add <module>`, the module's schema
8
+ * is imported here automatically.
9
+ */
10
+
11
+ // aerostack:schema-imports — module schemas are auto-imported above this line
12
+
13
+ // Export everything for Drizzle's relational queries
14
+ // aerostack:schema-exports — exports are auto-added above this line
@@ -0,0 +1,28 @@
1
+ /**
2
+ * src/index.ts — Aerostack Base Project
3
+ *
4
+ * This is the main entry point for your Cloudflare Worker.
5
+ * Routes from installed modules are mounted here automatically
6
+ * when you run `npx aerostack add <function-name>`.
7
+ */
8
+ import { Hono } from 'hono';
9
+
10
+ // ─── Module Routes ─────────────────────────────────────────────────────────────
11
+ // aerostack:imports — imports are auto-injected above this line
12
+
13
+ const app = new Hono<{
14
+ Bindings: {
15
+ DB: D1Database;
16
+ CACHE: KVNamespace;
17
+ AI: Ai;
18
+ [key: string]: unknown;
19
+ }
20
+ }>();
21
+
22
+ // ─── Installed Module Routes ──────────────────────────────────────────────────
23
+ // aerostack:routes — routes are auto-injected above this line
24
+
25
+ // ─── Health Check ─────────────────────────────────────────────────────────────
26
+ app.get('/health', (c) => c.json({ status: 'ok', timestamp: Date.now() }));
27
+
28
+ export default app;
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": [
7
+ "ES2022"
8
+ ],
9
+ "types": [
10
+ "@cloudflare/workers-types"
11
+ ],
12
+ "strict": true,
13
+ "noEmit": true,
14
+ "allowImportingTsExtensions": true,
15
+ "paths": {
16
+ "@/*": [
17
+ "./src/*"
18
+ ]
19
+ }
20
+ },
21
+ "include": [
22
+ "src",
23
+ "**/*.ts"
24
+ ],
25
+ "exclude": [
26
+ "node_modules",
27
+ "dist"
28
+ ]
29
+ }