@aerostack/cli 1.5.0 → 1.5.2

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.
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@aerostack/cli",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Aerostack CLI - Zero-config serverless development for Cloudflare",
5
5
  "type": "module",
6
6
  "files": [