@agent-foundry/studio 1.0.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 +96 -0
- package/dist/db/client.d.ts +59 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +51 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/deployments.d.ts +65 -0
- package/dist/db/deployments.d.ts.map +1 -0
- package/dist/db/deployments.js +249 -0
- package/dist/db/deployments.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/projects.d.ts +48 -0
- package/dist/db/projects.d.ts.map +1 -0
- package/dist/db/projects.js +192 -0
- package/dist/db/projects.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/oss/client.d.ts +65 -0
- package/dist/oss/client.d.ts.map +1 -0
- package/dist/oss/client.js +146 -0
- package/dist/oss/client.js.map +1 -0
- package/dist/oss/index.d.ts +7 -0
- package/dist/oss/index.d.ts.map +1 -0
- package/dist/oss/index.js +7 -0
- package/dist/oss/index.js.map +1 -0
- package/dist/oss/types.d.ts +96 -0
- package/dist/oss/types.d.ts.map +1 -0
- package/dist/oss/types.js +5 -0
- package/dist/oss/types.js.map +1 -0
- package/dist/oss/uploader.d.ts +72 -0
- package/dist/oss/uploader.d.ts.map +1 -0
- package/dist/oss/uploader.js +185 -0
- package/dist/oss/uploader.js.map +1 -0
- package/dist/types/deployment.d.ts +112 -0
- package/dist/types/deployment.d.ts.map +1 -0
- package/dist/types/deployment.js +7 -0
- package/dist/types/deployment.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +90 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +8 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/user.d.ts +71 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +8 -0
- package/dist/types/user.js.map +1 -0
- package/dist/types/workspace.d.ts +88 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +27 -0
- package/dist/types/workspace.js.map +1 -0
- package/dist/utils/build.d.ts +78 -0
- package/dist/utils/build.d.ts.map +1 -0
- package/dist/utils/build.js +148 -0
- package/dist/utils/build.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/manifest.d.ts +106 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +109 -0
- package/dist/utils/manifest.js.map +1 -0
- package/package.json +62 -0
- package/src/db/client.ts +92 -0
- package/src/db/deployments.ts +316 -0
- package/src/db/index.ts +7 -0
- package/src/db/projects.ts +246 -0
- package/src/db/schema.sql +156 -0
- package/src/index.ts +18 -0
- package/src/oss/client.ts +183 -0
- package/src/oss/index.ts +7 -0
- package/src/oss/types.ts +126 -0
- package/src/oss/uploader.ts +254 -0
- package/src/types/deployment.ts +147 -0
- package/src/types/index.ts +8 -0
- package/src/types/project.ts +114 -0
- package/src/types/user.ts +91 -0
- package/src/types/workspace.ts +124 -0
- package/src/utils/build.ts +199 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/manifest.ts +224 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projects Repository
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for studio_projects table.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert database row to StudioProject
|
|
8
|
+
*/
|
|
9
|
+
function rowToProject(row) {
|
|
10
|
+
return {
|
|
11
|
+
id: row.id,
|
|
12
|
+
userId: row.user_id,
|
|
13
|
+
name: row.name,
|
|
14
|
+
slug: row.slug,
|
|
15
|
+
description: row.description ?? undefined,
|
|
16
|
+
rootPath: row.root_path,
|
|
17
|
+
framework: row.framework,
|
|
18
|
+
config: row.config,
|
|
19
|
+
parentProjectId: row.parent_project_id ?? undefined,
|
|
20
|
+
createdAt: row.created_at,
|
|
21
|
+
updatedAt: row.updated_at,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Projects Repository - manages studio_projects table
|
|
26
|
+
*/
|
|
27
|
+
export class ProjectsRepository {
|
|
28
|
+
constructor(supabase) {
|
|
29
|
+
this.supabase = supabase;
|
|
30
|
+
this.TABLE = 'studio_projects';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new project
|
|
34
|
+
*/
|
|
35
|
+
async create(input) {
|
|
36
|
+
const { data: { user } } = await this.supabase.auth.getUser();
|
|
37
|
+
if (!user) {
|
|
38
|
+
throw new Error('Not authenticated');
|
|
39
|
+
}
|
|
40
|
+
const { data, error } = await this.supabase
|
|
41
|
+
.from(this.TABLE)
|
|
42
|
+
.insert({
|
|
43
|
+
user_id: user.id,
|
|
44
|
+
name: input.name,
|
|
45
|
+
slug: input.slug,
|
|
46
|
+
description: input.description,
|
|
47
|
+
root_path: input.rootPath,
|
|
48
|
+
framework: input.framework ?? 'vite-react',
|
|
49
|
+
config: input.config ?? {},
|
|
50
|
+
parent_project_id: input.parentProjectId,
|
|
51
|
+
})
|
|
52
|
+
.select()
|
|
53
|
+
.single();
|
|
54
|
+
if (error) {
|
|
55
|
+
throw new Error(`Failed to create project: ${error.message}`);
|
|
56
|
+
}
|
|
57
|
+
return rowToProject(data);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a project by ID
|
|
61
|
+
*/
|
|
62
|
+
async getById(id) {
|
|
63
|
+
const { data, error } = await this.supabase
|
|
64
|
+
.from(this.TABLE)
|
|
65
|
+
.select()
|
|
66
|
+
.eq('id', id)
|
|
67
|
+
.single();
|
|
68
|
+
if (error) {
|
|
69
|
+
if (error.code === 'PGRST116') {
|
|
70
|
+
return null; // Not found
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Failed to get project: ${error.message}`);
|
|
73
|
+
}
|
|
74
|
+
return rowToProject(data);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get a project by slug (for current user)
|
|
78
|
+
*/
|
|
79
|
+
async getBySlug(slug) {
|
|
80
|
+
const { data, error } = await this.supabase
|
|
81
|
+
.from(this.TABLE)
|
|
82
|
+
.select()
|
|
83
|
+
.eq('slug', slug)
|
|
84
|
+
.single();
|
|
85
|
+
if (error) {
|
|
86
|
+
if (error.code === 'PGRST116') {
|
|
87
|
+
return null; // Not found
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`Failed to get project: ${error.message}`);
|
|
90
|
+
}
|
|
91
|
+
return rowToProject(data);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* List projects with optional filters
|
|
95
|
+
*/
|
|
96
|
+
async list(filters = {}) {
|
|
97
|
+
let query = this.supabase.from(this.TABLE).select();
|
|
98
|
+
// Apply filters
|
|
99
|
+
if (filters.framework) {
|
|
100
|
+
query = query.eq('framework', filters.framework);
|
|
101
|
+
}
|
|
102
|
+
if (filters.search) {
|
|
103
|
+
query = query.ilike('name', `%${filters.search}%`);
|
|
104
|
+
}
|
|
105
|
+
// Ordering
|
|
106
|
+
const orderBy = filters.orderBy ?? 'createdAt';
|
|
107
|
+
const orderColumn = orderBy === 'createdAt' ? 'created_at' :
|
|
108
|
+
orderBy === 'updatedAt' ? 'updated_at' : 'name';
|
|
109
|
+
const ascending = filters.orderDir === 'asc';
|
|
110
|
+
query = query.order(orderColumn, { ascending });
|
|
111
|
+
// Pagination
|
|
112
|
+
if (filters.limit) {
|
|
113
|
+
query = query.limit(filters.limit);
|
|
114
|
+
}
|
|
115
|
+
if (filters.offset) {
|
|
116
|
+
query = query.range(filters.offset, filters.offset + (filters.limit ?? 50) - 1);
|
|
117
|
+
}
|
|
118
|
+
const { data, error } = await query;
|
|
119
|
+
if (error) {
|
|
120
|
+
throw new Error(`Failed to list projects: ${error.message}`);
|
|
121
|
+
}
|
|
122
|
+
return data.map(rowToProject);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Update a project
|
|
126
|
+
*/
|
|
127
|
+
async update(id, input) {
|
|
128
|
+
const updateData = {};
|
|
129
|
+
if (input.name !== undefined) {
|
|
130
|
+
updateData.name = input.name;
|
|
131
|
+
}
|
|
132
|
+
if (input.description !== undefined) {
|
|
133
|
+
updateData.description = input.description;
|
|
134
|
+
}
|
|
135
|
+
if (input.config !== undefined) {
|
|
136
|
+
// Merge with existing config
|
|
137
|
+
const existing = await this.getById(id);
|
|
138
|
+
if (!existing) {
|
|
139
|
+
throw new Error('Project not found');
|
|
140
|
+
}
|
|
141
|
+
updateData.config = { ...existing.config, ...input.config };
|
|
142
|
+
}
|
|
143
|
+
const { data, error } = await this.supabase
|
|
144
|
+
.from(this.TABLE)
|
|
145
|
+
.update(updateData)
|
|
146
|
+
.eq('id', id)
|
|
147
|
+
.select()
|
|
148
|
+
.single();
|
|
149
|
+
if (error) {
|
|
150
|
+
throw new Error(`Failed to update project: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
return rowToProject(data);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Delete a project
|
|
156
|
+
*/
|
|
157
|
+
async delete(id) {
|
|
158
|
+
const { error } = await this.supabase
|
|
159
|
+
.from(this.TABLE)
|
|
160
|
+
.delete()
|
|
161
|
+
.eq('id', id);
|
|
162
|
+
if (error) {
|
|
163
|
+
throw new Error(`Failed to delete project: ${error.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Fork a project (create a copy)
|
|
168
|
+
*/
|
|
169
|
+
async fork(id, newSlug, newRootPath) {
|
|
170
|
+
const original = await this.getById(id);
|
|
171
|
+
if (!original) {
|
|
172
|
+
throw new Error('Original project not found');
|
|
173
|
+
}
|
|
174
|
+
return this.create({
|
|
175
|
+
name: `${original.name} (Fork)`,
|
|
176
|
+
slug: newSlug,
|
|
177
|
+
description: original.description,
|
|
178
|
+
rootPath: newRootPath,
|
|
179
|
+
framework: original.framework,
|
|
180
|
+
config: original.config,
|
|
181
|
+
parentProjectId: original.id,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if a slug is available for current user
|
|
186
|
+
*/
|
|
187
|
+
async isSlugAvailable(slug) {
|
|
188
|
+
const existing = await this.getBySlug(slug);
|
|
189
|
+
return existing === null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/db/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agent-foundry/studio
|
|
3
|
+
*
|
|
4
|
+
* Full SDK for Agent Foundry Build Studio.
|
|
5
|
+
* Provides types, Alibaba Cloud OSS upload utilities, and Supabase database client.
|
|
6
|
+
*/
|
|
7
|
+
export * from './types';
|
|
8
|
+
export * from './oss';
|
|
9
|
+
export * from './db';
|
|
10
|
+
export * from './utils';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,SAAS,CAAC;AAGxB,cAAc,OAAO,CAAC;AAGtB,cAAc,MAAM,CAAC;AAGrB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agent-foundry/studio
|
|
3
|
+
*
|
|
4
|
+
* Full SDK for Agent Foundry Build Studio.
|
|
5
|
+
* Provides types, Alibaba Cloud OSS upload utilities, and Supabase database client.
|
|
6
|
+
*/
|
|
7
|
+
// Re-export all types
|
|
8
|
+
export * from './types';
|
|
9
|
+
// Re-export OSS utilities
|
|
10
|
+
export * from './oss';
|
|
11
|
+
// Re-export database client
|
|
12
|
+
export * from './db';
|
|
13
|
+
// Re-export utilities
|
|
14
|
+
export * from './utils';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,cAAc,SAAS,CAAC;AAExB,0BAA0B;AAC1B,cAAc,OAAO,CAAC;AAEtB,4BAA4B;AAC5B,cAAc,MAAM,CAAC;AAErB,sBAAsB;AACtB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alibaba Cloud OSS Client
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around ali-oss SDK for browser/WebView usage.
|
|
5
|
+
*/
|
|
6
|
+
import type { OSSClientConfig, UploadFile } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Progress callback type
|
|
9
|
+
*/
|
|
10
|
+
export type ProgressCallback = (percent: number, checkpoint?: unknown) => void;
|
|
11
|
+
/**
|
|
12
|
+
* AliOSSClient - wrapper for ali-oss SDK
|
|
13
|
+
*
|
|
14
|
+
* Provides simplified interface for uploading files to Alibaba Cloud OSS
|
|
15
|
+
* using STS credentials.
|
|
16
|
+
*/
|
|
17
|
+
export declare class AliOSSClient {
|
|
18
|
+
private client;
|
|
19
|
+
private credentials;
|
|
20
|
+
constructor(config: OSSClientConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Check if credentials are expired
|
|
23
|
+
*/
|
|
24
|
+
isExpired(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Upload a single file
|
|
27
|
+
*
|
|
28
|
+
* @param key - Object key (path in bucket)
|
|
29
|
+
* @param content - File content
|
|
30
|
+
* @param contentType - MIME type
|
|
31
|
+
* @param _onProgress - Progress callback (not supported for simple uploads)
|
|
32
|
+
*/
|
|
33
|
+
uploadFile(key: string, content: Blob | ArrayBuffer | string, contentType?: string, _onProgress?: ProgressCallback): Promise<{
|
|
34
|
+
url: string;
|
|
35
|
+
etag: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Upload multiple files with progress tracking
|
|
39
|
+
*
|
|
40
|
+
* @param files - Array of files to upload
|
|
41
|
+
* @param keyPrefix - Prefix for all object keys
|
|
42
|
+
* @param onProgress - Progress callback for overall progress
|
|
43
|
+
*/
|
|
44
|
+
uploadFiles(files: UploadFile[], keyPrefix: string, onProgress?: (uploadedCount: number, totalCount: number, currentFile: string) => void): Promise<{
|
|
45
|
+
url: string;
|
|
46
|
+
totalBytes: number;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Get public URL for an object
|
|
50
|
+
*/
|
|
51
|
+
getPublicUrl(key: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Check if an object exists
|
|
54
|
+
*/
|
|
55
|
+
exists(key: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Delete an object
|
|
58
|
+
*/
|
|
59
|
+
delete(key: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* List objects with prefix
|
|
62
|
+
*/
|
|
63
|
+
list(prefix: string, maxKeys?: number): Promise<string[]>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/oss/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAkB,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/E;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAiB;gBAExB,MAAM,EAAE,eAAe;IAenC;;OAEG;IACH,SAAS,IAAI,OAAO;IAOpB;;;;;;;OAOG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,gBAAgB,GAC7B,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BzC;;;;;;OAMG;IACG,WAAW,CACf,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GACpF,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC/C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASjC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3C;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAQ7D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alibaba Cloud OSS Client
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around ali-oss SDK for browser/WebView usage.
|
|
5
|
+
*/
|
|
6
|
+
import OSS from 'ali-oss';
|
|
7
|
+
/**
|
|
8
|
+
* AliOSSClient - wrapper for ali-oss SDK
|
|
9
|
+
*
|
|
10
|
+
* Provides simplified interface for uploading files to Alibaba Cloud OSS
|
|
11
|
+
* using STS credentials.
|
|
12
|
+
*/
|
|
13
|
+
export class AliOSSClient {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.credentials = config.credentials;
|
|
16
|
+
this.client = new OSS({
|
|
17
|
+
region: config.region,
|
|
18
|
+
bucket: config.bucket,
|
|
19
|
+
accessKeyId: config.credentials.accessKeyId,
|
|
20
|
+
accessKeySecret: config.credentials.accessKeySecret,
|
|
21
|
+
stsToken: config.credentials.securityToken,
|
|
22
|
+
timeout: config.timeout ?? 60000,
|
|
23
|
+
// Enable for browser usage
|
|
24
|
+
secure: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if credentials are expired
|
|
29
|
+
*/
|
|
30
|
+
isExpired() {
|
|
31
|
+
const expiration = new Date(this.credentials.expiration);
|
|
32
|
+
// Consider expired 5 minutes before actual expiration
|
|
33
|
+
const buffer = 5 * 60 * 1000;
|
|
34
|
+
return Date.now() > expiration.getTime() - buffer;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Upload a single file
|
|
38
|
+
*
|
|
39
|
+
* @param key - Object key (path in bucket)
|
|
40
|
+
* @param content - File content
|
|
41
|
+
* @param contentType - MIME type
|
|
42
|
+
* @param _onProgress - Progress callback (not supported for simple uploads)
|
|
43
|
+
*/
|
|
44
|
+
async uploadFile(key, content, contentType, _onProgress) {
|
|
45
|
+
if (this.isExpired()) {
|
|
46
|
+
throw new Error('STS credentials have expired. Please refresh credentials.');
|
|
47
|
+
}
|
|
48
|
+
// Convert content to appropriate format
|
|
49
|
+
let body;
|
|
50
|
+
if (content instanceof ArrayBuffer) {
|
|
51
|
+
body = new Blob([content]);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
body = content;
|
|
55
|
+
}
|
|
56
|
+
const options = {
|
|
57
|
+
headers: contentType ? { 'Content-Type': contentType } : undefined,
|
|
58
|
+
};
|
|
59
|
+
// Note: Progress callback is not supported for simple put operations
|
|
60
|
+
// Only multipart uploads support progress tracking
|
|
61
|
+
const result = await this.client.put(key, body, options);
|
|
62
|
+
return {
|
|
63
|
+
url: result.url,
|
|
64
|
+
etag: result.res.headers['etag'],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Upload multiple files with progress tracking
|
|
69
|
+
*
|
|
70
|
+
* @param files - Array of files to upload
|
|
71
|
+
* @param keyPrefix - Prefix for all object keys
|
|
72
|
+
* @param onProgress - Progress callback for overall progress
|
|
73
|
+
*/
|
|
74
|
+
async uploadFiles(files, keyPrefix, onProgress) {
|
|
75
|
+
if (this.isExpired()) {
|
|
76
|
+
throw new Error('STS credentials have expired. Please refresh credentials.');
|
|
77
|
+
}
|
|
78
|
+
let totalBytes = 0;
|
|
79
|
+
const totalCount = files.length;
|
|
80
|
+
for (let i = 0; i < files.length; i++) {
|
|
81
|
+
const file = files[i];
|
|
82
|
+
const key = `${keyPrefix}/${file.path}`.replace(/\/+/g, '/');
|
|
83
|
+
// Get content size
|
|
84
|
+
let size = 0;
|
|
85
|
+
if (file.content instanceof Blob) {
|
|
86
|
+
size = file.content.size;
|
|
87
|
+
}
|
|
88
|
+
else if (file.content instanceof ArrayBuffer) {
|
|
89
|
+
size = file.content.byteLength;
|
|
90
|
+
}
|
|
91
|
+
else if (typeof file.content === 'string') {
|
|
92
|
+
size = new Blob([file.content]).size;
|
|
93
|
+
}
|
|
94
|
+
await this.uploadFile(key, file.content, file.contentType);
|
|
95
|
+
totalBytes += size;
|
|
96
|
+
if (onProgress) {
|
|
97
|
+
onProgress(i + 1, totalCount, file.path);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Return URL to index.html or root
|
|
101
|
+
const baseUrl = this.getPublicUrl(keyPrefix);
|
|
102
|
+
return {
|
|
103
|
+
url: baseUrl,
|
|
104
|
+
totalBytes,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get public URL for an object
|
|
109
|
+
*/
|
|
110
|
+
getPublicUrl(key) {
|
|
111
|
+
// Construct public URL based on bucket and region
|
|
112
|
+
const bucket = this.client.options.bucket;
|
|
113
|
+
const region = this.client.options.region;
|
|
114
|
+
// Standard OSS URL format
|
|
115
|
+
return `https://${bucket}.${region}.aliyuncs.com/${key}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if an object exists
|
|
119
|
+
*/
|
|
120
|
+
async exists(key) {
|
|
121
|
+
try {
|
|
122
|
+
await this.client.head(key);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Delete an object
|
|
131
|
+
*/
|
|
132
|
+
async delete(key) {
|
|
133
|
+
await this.client.delete(key);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* List objects with prefix
|
|
137
|
+
*/
|
|
138
|
+
async list(prefix, maxKeys = 100) {
|
|
139
|
+
const result = await this.client.list({
|
|
140
|
+
prefix,
|
|
141
|
+
'max-keys': maxKeys,
|
|
142
|
+
}, {});
|
|
143
|
+
return (result.objects || []).map((obj) => obj.name);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/oss/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oss/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oss/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAA6B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSS-specific types for Alibaba Cloud integration
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* STS (Security Token Service) credentials for temporary access
|
|
6
|
+
*/
|
|
7
|
+
export interface STSCredentials {
|
|
8
|
+
/** Temporary access key ID */
|
|
9
|
+
accessKeyId: string;
|
|
10
|
+
/** Temporary access key secret */
|
|
11
|
+
accessKeySecret: string;
|
|
12
|
+
/** Security token */
|
|
13
|
+
securityToken: string;
|
|
14
|
+
/** Token expiration timestamp (ISO string) */
|
|
15
|
+
expiration: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Response from BFF when requesting upload credentials
|
|
19
|
+
*/
|
|
20
|
+
export interface UploadTokenResponse {
|
|
21
|
+
/** STS credentials for OSS access */
|
|
22
|
+
credentials: STSCredentials;
|
|
23
|
+
/** OSS bucket name */
|
|
24
|
+
bucket: string;
|
|
25
|
+
/** Region endpoint (e.g., "oss-cn-hangzhou.aliyuncs.com") */
|
|
26
|
+
region: string;
|
|
27
|
+
/** Object key prefix for this upload */
|
|
28
|
+
keyPrefix: string;
|
|
29
|
+
/** Deployment ID for tracking */
|
|
30
|
+
deploymentId: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* File to upload
|
|
34
|
+
*/
|
|
35
|
+
export interface UploadFile {
|
|
36
|
+
/** Relative path within the bundle (e.g., "index.html", "assets/main.js") */
|
|
37
|
+
path: string;
|
|
38
|
+
/** File content */
|
|
39
|
+
content: Blob | ArrayBuffer | string;
|
|
40
|
+
/** Content type (MIME type) */
|
|
41
|
+
contentType?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Upload progress event
|
|
45
|
+
*/
|
|
46
|
+
export interface UploadProgress {
|
|
47
|
+
/** Current file being uploaded */
|
|
48
|
+
currentFile: string;
|
|
49
|
+
/** Number of files uploaded so far */
|
|
50
|
+
uploadedCount: number;
|
|
51
|
+
/** Total number of files to upload */
|
|
52
|
+
totalCount: number;
|
|
53
|
+
/** Bytes uploaded for current file */
|
|
54
|
+
uploadedBytes: number;
|
|
55
|
+
/** Total bytes for current file */
|
|
56
|
+
totalBytes: number;
|
|
57
|
+
/** Overall progress percentage (0-100) */
|
|
58
|
+
percent: number;
|
|
59
|
+
/** Current stage */
|
|
60
|
+
stage: 'preparing' | 'uploading' | 'finalizing';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Upload result
|
|
64
|
+
*/
|
|
65
|
+
export interface UploadResult {
|
|
66
|
+
/** Whether upload was successful */
|
|
67
|
+
success: boolean;
|
|
68
|
+
/** Deployment ID */
|
|
69
|
+
deploymentId: string;
|
|
70
|
+
/** Public URL of the deployed app */
|
|
71
|
+
url?: string;
|
|
72
|
+
/** OSS bucket */
|
|
73
|
+
bucket?: string;
|
|
74
|
+
/** OSS key prefix */
|
|
75
|
+
keyPrefix?: string;
|
|
76
|
+
/** Total bytes uploaded */
|
|
77
|
+
totalBytes: number;
|
|
78
|
+
/** Number of files uploaded */
|
|
79
|
+
fileCount: number;
|
|
80
|
+
/** Error message if failed */
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* OSS client configuration
|
|
85
|
+
*/
|
|
86
|
+
export interface OSSClientConfig {
|
|
87
|
+
/** Region (e.g., "oss-cn-hangzhou") */
|
|
88
|
+
region: string;
|
|
89
|
+
/** Bucket name */
|
|
90
|
+
bucket: string;
|
|
91
|
+
/** STS credentials */
|
|
92
|
+
credentials: STSCredentials;
|
|
93
|
+
/** Request timeout in milliseconds */
|
|
94
|
+
timeout?: number;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/oss/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IAEpB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IAExB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IAEtB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,WAAW,EAAE,cAAc,CAAC;IAE5B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IAEf,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IAEf,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAElB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IAEb,mBAAmB;IACnB,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC;IAErC,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IAEtB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IAEnB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IAEtB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IAEnB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAEhB,oBAAoB;IACpB,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IAEjB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IAEf,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,WAAW,EAAE,cAAc,CAAC;IAE5B,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/oss/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct Uploader
|
|
3
|
+
*
|
|
4
|
+
* High-level interface for uploading build artifacts to OSS.
|
|
5
|
+
* Handles STS credential fetching, multipart upload, and progress tracking.
|
|
6
|
+
*/
|
|
7
|
+
import type { UploadFile, UploadProgress, UploadResult } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for DirectUploader
|
|
10
|
+
*/
|
|
11
|
+
export interface DirectUploaderConfig {
|
|
12
|
+
/** BFF base URL (e.g., "http://localhost:11001") */
|
|
13
|
+
bffBaseUrl: string;
|
|
14
|
+
/** Supabase JWT token for authentication */
|
|
15
|
+
authToken: string;
|
|
16
|
+
/** Request timeout in milliseconds */
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Upload options
|
|
21
|
+
*/
|
|
22
|
+
export interface UploadOptions {
|
|
23
|
+
/** Project ID */
|
|
24
|
+
projectId: string;
|
|
25
|
+
/** Files to upload */
|
|
26
|
+
files: UploadFile[];
|
|
27
|
+
/** Optional: specific version string */
|
|
28
|
+
version?: string;
|
|
29
|
+
/** Progress callback */
|
|
30
|
+
onProgress?: (progress: UploadProgress) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* DirectUploader - handles the complete upload flow
|
|
34
|
+
*
|
|
35
|
+
* 1. Requests STS credentials from BFF
|
|
36
|
+
* 2. Uploads files directly to OSS
|
|
37
|
+
* 3. Notifies BFF of completion
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const uploader = new DirectUploader({
|
|
42
|
+
* bffBaseUrl: 'http://localhost:11001',
|
|
43
|
+
* authToken: 'eyJ...',
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* const result = await uploader.upload({
|
|
47
|
+
* projectId: 'project-uuid',
|
|
48
|
+
* files: [
|
|
49
|
+
* { path: 'index.html', content: indexHtml, contentType: 'text/html' },
|
|
50
|
+
* { path: 'assets/main.js', content: mainJs, contentType: 'application/javascript' },
|
|
51
|
+
* ],
|
|
52
|
+
* onProgress: (p) => console.log(`${p.percent}%`),
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare class DirectUploader {
|
|
57
|
+
private config;
|
|
58
|
+
constructor(config: DirectUploaderConfig);
|
|
59
|
+
/**
|
|
60
|
+
* Upload files to OSS
|
|
61
|
+
*/
|
|
62
|
+
upload(options: UploadOptions): Promise<UploadResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Request upload token from BFF
|
|
65
|
+
*/
|
|
66
|
+
private getUploadToken;
|
|
67
|
+
/**
|
|
68
|
+
* Notify BFF that upload is complete
|
|
69
|
+
*/
|
|
70
|
+
private completeUpload;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/oss/uploader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,sBAAsB;IACtB,KAAK,EAAE,UAAU,EAAE,CAAC;IAEpB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAIxC;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsH3D;;OAEG;YACW,cAAc;IAqB5B;;OAEG;YACW,cAAc;CA4B7B"}
|