@easel-sh/cli 0.1.0-alpha.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.
Files changed (41) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +195 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/create-lambda-gateway.d.ts +11 -0
  6. package/dist/commands/create-lambda-gateway.d.ts.map +1 -0
  7. package/dist/commands/create-lambda-gateway.js +409 -0
  8. package/dist/commands/create-lambda-gateway.js.map +1 -0
  9. package/dist/commands/generate-manifest.d.ts +7 -0
  10. package/dist/commands/generate-manifest.d.ts.map +1 -0
  11. package/dist/commands/generate-manifest.js +145 -0
  12. package/dist/commands/generate-manifest.js.map +1 -0
  13. package/dist/commands/list-functions.d.ts +7 -0
  14. package/dist/commands/list-functions.d.ts.map +1 -0
  15. package/dist/commands/list-functions.js +140 -0
  16. package/dist/commands/list-functions.js.map +1 -0
  17. package/dist/commands/package-functions.d.ts +9 -0
  18. package/dist/commands/package-functions.d.ts.map +1 -0
  19. package/dist/commands/package-functions.js +292 -0
  20. package/dist/commands/package-functions.js.map +1 -0
  21. package/dist/commands/upload-manifest.d.ts +7 -0
  22. package/dist/commands/upload-manifest.d.ts.map +1 -0
  23. package/dist/commands/upload-manifest.js +53 -0
  24. package/dist/commands/upload-manifest.js.map +1 -0
  25. package/dist/commands/upload-static.d.ts +7 -0
  26. package/dist/commands/upload-static.d.ts.map +1 -0
  27. package/dist/commands/upload-static.js +142 -0
  28. package/dist/commands/upload-static.js.map +1 -0
  29. package/dist/utils/types.d.ts +38 -0
  30. package/dist/utils/types.d.ts.map +1 -0
  31. package/dist/utils/types.js +2 -0
  32. package/dist/utils/types.js.map +1 -0
  33. package/dist/utils/vercel-config.d.ts +60 -0
  34. package/dist/utils/vercel-config.d.ts.map +1 -0
  35. package/dist/utils/vercel-config.js +121 -0
  36. package/dist/utils/vercel-config.js.map +1 -0
  37. package/dist/utils.d.ts +31 -0
  38. package/dist/utils.d.ts.map +1 -0
  39. package/dist/utils.js +263 -0
  40. package/dist/utils.js.map +1 -0
  41. package/package.json +26 -0
@@ -0,0 +1,53 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export async function uploadManifest(options) {
4
+ const { manifestFile, hostname, serviceUrl } = options;
5
+ // Read manifest file
6
+ const manifestPath = path.resolve(manifestFile);
7
+ if (!fs.existsSync(manifestPath)) {
8
+ throw new Error(`Manifest file not found: ${manifestPath}`);
9
+ }
10
+ const manifestContent = fs.readFileSync(manifestPath, 'utf8');
11
+ let manifest;
12
+ try {
13
+ manifest = JSON.parse(manifestContent);
14
+ }
15
+ catch (error) {
16
+ throw new Error(`Failed to parse manifest JSON: ${error.message}`);
17
+ }
18
+ // Validate manifest structure
19
+ if (!manifest.routes || !Array.isArray(manifest.routes)) {
20
+ throw new Error('Invalid manifest: routes must be an array');
21
+ }
22
+ if (!manifest.fileManifest || !Array.isArray(manifest.fileManifest)) {
23
+ throw new Error('Invalid manifest: fileManifest must be an array');
24
+ }
25
+ if (!manifest.resourceManifest || !Array.isArray(manifest.resourceManifest)) {
26
+ throw new Error('Invalid manifest: resourceManifest must be an array');
27
+ }
28
+ // Upload to metadata service
29
+ const url = `${serviceUrl.replace(/\/$/, '')}/manifests/${encodeURIComponent(hostname)}`;
30
+ try {
31
+ const response = await fetch(url, {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Content-Type': 'application/json',
35
+ },
36
+ body: manifestContent,
37
+ });
38
+ if (!response.ok) {
39
+ const errorText = await response.text();
40
+ throw new Error(`Upload failed: ${response.status} ${response.statusText} - ${errorText}`);
41
+ }
42
+ const result = await response.json();
43
+ console.log(`✓ Manifest uploaded successfully for hostname: ${hostname}`);
44
+ console.log(` Service URL: ${serviceUrl}`);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof TypeError && error.message.includes('fetch')) {
48
+ throw new Error(`Failed to connect to metadata service at ${serviceUrl}. Is it running?`);
49
+ }
50
+ throw error;
51
+ }
52
+ }
53
+ //# sourceMappingURL=upload-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-manifest.js","sourceRoot":"","sources":["../../src/commands/upload-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEvD,qBAAqB;IACrB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,6BAA6B;IAC7B,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEzF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,kDAAkD,QAAQ,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,4CAA4C,UAAU,kBAAkB,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface UploadStaticOptions {
2
+ vercelOutputDir: string;
3
+ hostname: string;
4
+ serviceUrl: string;
5
+ }
6
+ export declare function uploadStatic(options: UploadStaticOptions): Promise<void>;
7
+ //# sourceMappingURL=upload-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-static.d.ts","sourceRoot":"","sources":["../../src/commands/upload-static.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA8FD,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF9E"}
@@ -0,0 +1,142 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { resolveVercelOutputDir } from '../utils.js';
4
+ /**
5
+ * Recursively scan static directory and collect all files
6
+ */
7
+ function scanStaticDirectory(staticDir) {
8
+ const files = [];
9
+ function scanRecursive(currentDir, baseDir) {
10
+ if (!fs.existsSync(currentDir)) {
11
+ return;
12
+ }
13
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
14
+ for (const entry of entries) {
15
+ const fullPath = path.join(currentDir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ scanRecursive(fullPath, baseDir);
18
+ }
19
+ else if (entry.isFile()) {
20
+ const relativePath = path.relative(baseDir, fullPath);
21
+ // Convert to web path format (forward slashes, leading slash)
22
+ const webPath = '/' + relativePath.split(path.sep).join('/');
23
+ try {
24
+ const content = fs.readFileSync(fullPath);
25
+ files.push({
26
+ filePath: fullPath,
27
+ relativePath: webPath,
28
+ content,
29
+ });
30
+ }
31
+ catch (error) {
32
+ console.warn(`Warning: Failed to read file ${fullPath}: ${error.message}`);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ scanRecursive(staticDir, staticDir);
38
+ return files;
39
+ }
40
+ /**
41
+ * Get MIME type from file extension
42
+ * Note: We always use application/octet-stream for uploads to avoid any
43
+ * content-type parsing issues. We just need to store the binary data.
44
+ */
45
+ function getMimeType(filePath) {
46
+ // Always use octet-stream - we just need to store the binary blob
47
+ return 'application/octet-stream';
48
+ }
49
+ /**
50
+ * Upload a single file to the metadata service
51
+ */
52
+ async function uploadFile(serviceUrl, hostname, file) {
53
+ const url = `${serviceUrl.replace(/\/$/, '')}/static/${encodeURIComponent(hostname)}`;
54
+ // Determine content type
55
+ const contentType = getMimeType(file.relativePath);
56
+ try {
57
+ const response = await fetch(url, {
58
+ method: 'POST',
59
+ headers: {
60
+ 'Content-Type': contentType,
61
+ 'X-File-Path': file.relativePath,
62
+ },
63
+ body: file.content,
64
+ });
65
+ if (!response.ok) {
66
+ const errorText = await response.text();
67
+ throw new Error(`Upload failed: ${response.status} ${response.statusText} - ${errorText}`);
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (error instanceof TypeError && error.message.includes('fetch')) {
72
+ throw new Error(`Failed to connect to metadata service at ${serviceUrl}. Is it running?`);
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ export async function uploadStatic(options) {
78
+ const { vercelOutputDir, hostname, serviceUrl } = options;
79
+ // Resolve base Vercel output directory
80
+ const baseDir = resolveVercelOutputDir(vercelOutputDir);
81
+ const staticDir = path.join(baseDir, "static");
82
+ // Check if static directory exists
83
+ if (!fs.existsSync(staticDir)) {
84
+ throw new Error(`Static directory not found: ${staticDir}`);
85
+ }
86
+ if (!fs.statSync(staticDir).isDirectory()) {
87
+ throw new Error(`Path is not a directory: ${staticDir}`);
88
+ }
89
+ console.log(`Scanning static directory: ${staticDir}`);
90
+ const files = scanStaticDirectory(staticDir);
91
+ if (files.length === 0) {
92
+ console.warn("No files found in static directory");
93
+ return;
94
+ }
95
+ console.log(`Found ${files.length} file(s) to upload`);
96
+ console.log(`Uploading to metadata service at ${serviceUrl}...`);
97
+ // Upload files with rolling concurrency (maintain exactly N concurrent uploads)
98
+ const CONCURRENCY = 50; // Upload 50 files concurrently for maximum speed
99
+ let completed = 0;
100
+ const errors = [];
101
+ // Rolling concurrency: maintain exactly N concurrent operations
102
+ // As soon as one finishes, start the next one
103
+ const executing = new Set();
104
+ for (const file of files) {
105
+ // Create the upload promise
106
+ const uploadPromise = (async () => {
107
+ try {
108
+ await uploadFile(serviceUrl, hostname, file);
109
+ completed++;
110
+ process.stdout.write(`\rProgress: ${completed}/${files.length} files uploaded`);
111
+ }
112
+ catch (error) {
113
+ errors.push({ file: file.relativePath, error: error.message });
114
+ console.error(`\nFailed to upload ${file.relativePath}: ${error.message}`);
115
+ }
116
+ })();
117
+ // Add to executing set
118
+ executing.add(uploadPromise);
119
+ // Remove from executing set when done
120
+ uploadPromise.finally(() => {
121
+ executing.delete(uploadPromise);
122
+ });
123
+ // If we've hit the concurrency limit, wait for one to finish
124
+ if (executing.size >= CONCURRENCY) {
125
+ await Promise.race(executing);
126
+ }
127
+ }
128
+ // Wait for all remaining uploads to complete
129
+ await Promise.all(executing);
130
+ const uploaded = completed;
131
+ const failed = errors.length;
132
+ console.log(`\n✓ Upload complete: ${uploaded} succeeded, ${failed} failed`);
133
+ if (errors.length > 0) {
134
+ console.error("\nErrors:");
135
+ for (const { file, error } of errors) {
136
+ console.error(` - ${file}: ${error}`);
137
+ }
138
+ throw new Error(`Failed to upload ${failed} file(s)`);
139
+ }
140
+ console.log(`✓ All static assets uploaded successfully for hostname: ${hostname}`);
141
+ }
142
+ //# sourceMappingURL=upload-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-static.js","sourceRoot":"","sources":["../../src/commands/upload-static.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface Route {
2
+ handle?: string;
3
+ src?: string;
4
+ dest?: string;
5
+ headers?: Record<string, string>;
6
+ methods?: string[];
7
+ continue?: boolean;
8
+ caseSensitive?: boolean;
9
+ check?: boolean;
10
+ status?: number;
11
+ has?: any[];
12
+ missing?: any[];
13
+ locale?: {
14
+ redirect?: Record<string, string>;
15
+ cookie?: string;
16
+ };
17
+ mitigate?: {
18
+ action: string;
19
+ };
20
+ transforms?: any[];
21
+ override?: boolean;
22
+ important?: boolean;
23
+ }
24
+ export interface FileManifestEntry {
25
+ match: string;
26
+ path: string;
27
+ contentType?: string;
28
+ }
29
+ export type FileManifestItem = string | FileManifestEntry;
30
+ export interface DeploymentManifest {
31
+ routes: Route[];
32
+ fileManifest: FileManifestItem[];
33
+ resourceManifest: string[];
34
+ resourceHashes?: Record<string, string>;
35
+ version?: string;
36
+ createdAt?: string;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,KAAK;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import type { Route } from './types.js';
2
+ export interface FileOverride {
3
+ path?: string;
4
+ contentType?: string;
5
+ }
6
+ export interface VercelConfig {
7
+ routes?: VercelRoute[];
8
+ overrides?: Record<string, FileOverride>;
9
+ [key: string]: any;
10
+ }
11
+ export interface VercelRoute {
12
+ src?: string;
13
+ dest?: string;
14
+ headers?: Record<string, string>;
15
+ methods?: string[];
16
+ continue?: boolean;
17
+ caseSensitive?: boolean;
18
+ check?: boolean;
19
+ status?: number;
20
+ has?: VercelHasCondition[];
21
+ missing?: VercelHasCondition[];
22
+ locale?: {
23
+ redirect?: Record<string, string>;
24
+ cookie?: string;
25
+ };
26
+ mitigate?: {
27
+ action: string;
28
+ };
29
+ transforms?: VercelTransform[];
30
+ override?: boolean;
31
+ important?: boolean;
32
+ handle?: string;
33
+ }
34
+ export interface VercelHasCondition {
35
+ type: string;
36
+ key?: string;
37
+ value?: string | any;
38
+ }
39
+ export interface VercelTransform {
40
+ type: string;
41
+ op: string;
42
+ target: any;
43
+ args?: any;
44
+ }
45
+ /**
46
+ * Parse Vercel config.json and convert routes to our Route format
47
+ */
48
+ export declare function parseVercelConfig(configPath: string): Route[];
49
+ /**
50
+ * Parse overrides from config.json
51
+ */
52
+ export declare function parseOverrides(configPath: string): Record<string, {
53
+ path?: string;
54
+ contentType?: string;
55
+ }>;
56
+ /**
57
+ * Scan static files directory to build file manifest
58
+ */
59
+ export declare function buildFileManifest(staticDir: string): string[];
60
+ //# sourceMappingURL=vercel-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-config.d.ts","sourceRoot":"","sources":["../../src/utils/vercel-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,CAa7D;AA0ED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B7D"}
@@ -0,0 +1,121 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Parse Vercel config.json and convert routes to our Route format
5
+ */
6
+ export function parseVercelConfig(configPath) {
7
+ if (!fs.existsSync(configPath)) {
8
+ throw new Error(`Config file not found: ${configPath}`);
9
+ }
10
+ const configContent = fs.readFileSync(configPath, "utf8");
11
+ const config = JSON.parse(configContent);
12
+ if (!config.routes || !Array.isArray(config.routes)) {
13
+ return [];
14
+ }
15
+ return config.routes.map(convertVercelRoute);
16
+ }
17
+ /**
18
+ * Convert a Vercel route to our Route format
19
+ */
20
+ function convertVercelRoute(vercelRoute) {
21
+ const route = {};
22
+ // Handle field
23
+ if (vercelRoute.handle) {
24
+ route.handle = vercelRoute.handle;
25
+ }
26
+ // Source fields
27
+ if (vercelRoute.src) {
28
+ route.src = vercelRoute.src;
29
+ }
30
+ if (vercelRoute.dest !== undefined) {
31
+ route.dest = vercelRoute.dest;
32
+ }
33
+ if (vercelRoute.headers) {
34
+ route.headers = vercelRoute.headers;
35
+ }
36
+ if (vercelRoute.methods) {
37
+ route.methods = vercelRoute.methods;
38
+ }
39
+ if (vercelRoute.continue !== undefined) {
40
+ route.continue = vercelRoute.continue;
41
+ }
42
+ if (vercelRoute.caseSensitive !== undefined) {
43
+ route.caseSensitive = vercelRoute.caseSensitive;
44
+ }
45
+ if (vercelRoute.check !== undefined) {
46
+ route.check = vercelRoute.check;
47
+ }
48
+ if (vercelRoute.status !== undefined) {
49
+ route.status = vercelRoute.status;
50
+ }
51
+ if (vercelRoute.has) {
52
+ route.has = vercelRoute.has.map(convertHasCondition);
53
+ }
54
+ if (vercelRoute.missing) {
55
+ route.missing = vercelRoute.missing.map(convertHasCondition);
56
+ }
57
+ if (vercelRoute.locale) {
58
+ route.locale = vercelRoute.locale;
59
+ }
60
+ if (vercelRoute.mitigate) {
61
+ route.mitigate = vercelRoute.mitigate;
62
+ }
63
+ if (vercelRoute.transforms) {
64
+ route.transforms = vercelRoute.transforms;
65
+ }
66
+ if (vercelRoute.override !== undefined) {
67
+ route.override = vercelRoute.override;
68
+ }
69
+ if (vercelRoute.important !== undefined) {
70
+ route.important = vercelRoute.important;
71
+ }
72
+ return route;
73
+ }
74
+ /**
75
+ * Convert Vercel has condition to our format
76
+ */
77
+ function convertHasCondition(condition) {
78
+ return {
79
+ type: condition.type,
80
+ key: condition.key,
81
+ value: condition.value,
82
+ };
83
+ }
84
+ /**
85
+ * Parse overrides from config.json
86
+ */
87
+ export function parseOverrides(configPath) {
88
+ if (!fs.existsSync(configPath)) {
89
+ return {};
90
+ }
91
+ const configContent = fs.readFileSync(configPath, "utf8");
92
+ const config = JSON.parse(configContent);
93
+ return config.overrides || {};
94
+ }
95
+ /**
96
+ * Scan static files directory to build file manifest
97
+ */
98
+ export function buildFileManifest(staticDir) {
99
+ const files = [];
100
+ function scanDirectory(dir, baseDir) {
101
+ if (!fs.existsSync(dir)) {
102
+ return;
103
+ }
104
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
105
+ for (const entry of entries) {
106
+ const fullPath = path.join(dir, entry.name);
107
+ const relativePath = path.relative(baseDir, fullPath);
108
+ if (entry.isDirectory()) {
109
+ scanDirectory(fullPath, baseDir);
110
+ }
111
+ else if (entry.isFile()) {
112
+ // Convert to web path format (forward slashes, leading slash)
113
+ const webPath = '/' + relativePath.split(path.sep).join('/');
114
+ files.push(webPath);
115
+ }
116
+ }
117
+ }
118
+ scanDirectory(staticDir, staticDir);
119
+ return files.sort();
120
+ }
121
+ //# sourceMappingURL=vercel-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-config.js","sourceRoot":"","sources":["../../src/utils/vercel-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Resolve the Vercel output directory from a given path
3
+ * Handles cases where the path points to:
4
+ * - .vercel/output (use as-is)
5
+ * - .vercel (append 'output')
6
+ * - project root or other (append '.vercel/output')
7
+ */
8
+ export declare function resolveVercelOutputDir(inputDir: string): string;
9
+ /**
10
+ * Find the workspace root (where the Next.js app is located)
11
+ */
12
+ export declare function findWorkspaceRoot(): string;
13
+ export interface FunctionInfo {
14
+ resourceName: string;
15
+ configPath: string;
16
+ funcDir: string;
17
+ hash?: string;
18
+ prerenderConfigPath?: string;
19
+ prerenderFallbackPath?: string;
20
+ }
21
+ /**
22
+ * Recursively scan a directory for .func directories that contain .vc-config.json
23
+ * Follows symlinks to find all functions
24
+ */
25
+ export declare function scanFunctions(dir: string, baseDir: string): FunctionInfo[];
26
+ /**
27
+ * Calculate a deterministic hash for a function directory
28
+ * Similar to the bash script: uses sorted file names and contents
29
+ */
30
+ export declare function hashFunctionDirectory(funcDir: string): string;
31
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyC1C;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CA0I1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgE7D"}