@itssergio91/sandman 0.1.2 → 0.2.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 (80) hide show
  1. package/dist/cli/commands/connect.d.ts +5 -1
  2. package/dist/cli/commands/connect.d.ts.map +1 -1
  3. package/dist/cli/commands/connect.js +22 -20
  4. package/dist/cli/commands/connect.js.map +1 -1
  5. package/dist/cli/commands/create.d.ts +3 -2
  6. package/dist/cli/commands/create.d.ts.map +1 -1
  7. package/dist/cli/commands/create.js +53 -16
  8. package/dist/cli/commands/create.js.map +1 -1
  9. package/dist/cli/commands/destroy.d.ts +1 -0
  10. package/dist/cli/commands/destroy.d.ts.map +1 -1
  11. package/dist/cli/commands/destroy.js +15 -6
  12. package/dist/cli/commands/destroy.js.map +1 -1
  13. package/dist/cli/commands/enable.d.ts +5 -1
  14. package/dist/cli/commands/enable.d.ts.map +1 -1
  15. package/dist/cli/commands/enable.js +29 -14
  16. package/dist/cli/commands/enable.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +6 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +13 -6
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/status.d.ts +1 -1
  22. package/dist/cli/commands/status.d.ts.map +1 -1
  23. package/dist/cli/commands/status.js +34 -23
  24. package/dist/cli/commands/status.js.map +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +14 -9
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/core/state-store.d.ts +3 -3
  29. package/dist/core/state-store.d.ts.map +1 -1
  30. package/dist/core/state-store.js +1 -1
  31. package/dist/core/state-store.js.map +1 -1
  32. package/dist/providers/aws/adapter.d.ts +3 -0
  33. package/dist/providers/aws/adapter.d.ts.map +1 -1
  34. package/dist/providers/aws/adapter.js +331 -9
  35. package/dist/providers/aws/adapter.js.map +1 -1
  36. package/dist/providers/aws/adapter.test.js +107 -0
  37. package/dist/providers/aws/adapter.test.js.map +1 -1
  38. package/dist/providers/base.d.ts +2 -0
  39. package/dist/providers/base.d.ts.map +1 -1
  40. package/dist/providers/base.js +14 -0
  41. package/dist/providers/base.js.map +1 -1
  42. package/dist/providers/cloudflare/adapter.d.ts +12 -0
  43. package/dist/providers/cloudflare/adapter.d.ts.map +1 -0
  44. package/dist/providers/cloudflare/adapter.js +85 -0
  45. package/dist/providers/cloudflare/adapter.js.map +1 -0
  46. package/dist/providers/cloudflare/adapter.test.d.ts +2 -0
  47. package/dist/providers/cloudflare/adapter.test.d.ts.map +1 -0
  48. package/dist/providers/cloudflare/adapter.test.js +178 -0
  49. package/dist/providers/cloudflare/adapter.test.js.map +1 -0
  50. package/dist/providers/gcp/adapter.d.ts +3 -0
  51. package/dist/providers/gcp/adapter.d.ts.map +1 -1
  52. package/dist/providers/gcp/adapter.js +150 -18
  53. package/dist/providers/gcp/adapter.js.map +1 -1
  54. package/dist/providers/gcp/adapter.test.js +122 -15
  55. package/dist/providers/gcp/adapter.test.js.map +1 -1
  56. package/dist/providers/index.d.ts +4 -0
  57. package/dist/providers/index.d.ts.map +1 -0
  58. package/dist/providers/index.js +13 -0
  59. package/dist/providers/index.js.map +1 -0
  60. package/dist/providers/vercel/adapter.d.ts +12 -0
  61. package/dist/providers/vercel/adapter.d.ts.map +1 -0
  62. package/dist/providers/vercel/adapter.js +74 -0
  63. package/dist/providers/vercel/adapter.js.map +1 -0
  64. package/dist/providers/vercel/adapter.test.d.ts +2 -0
  65. package/dist/providers/vercel/adapter.test.d.ts.map +1 -0
  66. package/dist/providers/vercel/adapter.test.js +166 -0
  67. package/dist/providers/vercel/adapter.test.js.map +1 -0
  68. package/dist/types/index.d.ts +21 -21
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/types/index.js +18 -4
  71. package/dist/types/index.js.map +1 -1
  72. package/dist/utils/cost-estimator.d.ts +36 -0
  73. package/dist/utils/cost-estimator.d.ts.map +1 -0
  74. package/dist/utils/cost-estimator.js +87 -0
  75. package/dist/utils/cost-estimator.js.map +1 -0
  76. package/dist/utils/cost-estimator.test.d.ts +2 -0
  77. package/dist/utils/cost-estimator.test.d.ts.map +1 -0
  78. package/dist/utils/cost-estimator.test.js +77 -0
  79. package/dist/utils/cost-estimator.test.js.map +1 -0
  80. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { GCP_SERVICES } from "../base.js";
2
2
  export class GcpAdapter {
3
3
  projectId = null;
4
+ projectNumber = null;
4
5
  billingAccountId = null;
5
6
  async init() {
6
7
  try {
@@ -42,25 +43,93 @@ export class GcpAdapter {
42
43
  }
43
44
  }
44
45
  async createEnvironment(name) {
46
+ if (!this.projectId) {
47
+ throw new Error("No GCP project configured. Set GCP_PROJECT environment variable or run 'gcloud config set project PROJECT_ID'");
48
+ }
49
+ // Generate a unique project ID for the sandman environment
45
50
  const timestamp = Date.now();
46
- const projectId = `sandman-${name}-${timestamp}`;
47
- const now = new Date().toISOString();
48
- return {
49
- name,
50
- provider: "gcp",
51
- projectId,
52
- status: "active",
53
- services: [],
54
- resources: {},
55
- createdAt: now,
56
- updatedAt: now,
57
- };
51
+ const sandmanProjectId = `sandman-${name}-${timestamp}`;
52
+ try {
53
+ const { ProjectsClient } = await import("@google-cloud/resource-manager");
54
+ const resourceManagerClient = new ProjectsClient();
55
+ // Create the project
56
+ const [operation] = await resourceManagerClient.createProject({
57
+ project: {
58
+ projectId: sandmanProjectId,
59
+ name: `Sandman Environment: ${name}`,
60
+ },
61
+ });
62
+ // Wait for the operation to complete
63
+ const [projectOperation] = await operation.promise();
64
+ // Get the project details to get the project number
65
+ const [project] = await resourceManagerClient.getProject({
66
+ name: `projects/${sandmanProjectId}`,
67
+ });
68
+ // Store the project ID and number
69
+ this.projectId = sandmanProjectId;
70
+ this.projectNumber = project.projectNumber?.toString() || null;
71
+ // Link billing account if provided
72
+ if (this.billingAccountId) {
73
+ await this.linkBillingAccount(sandmanProjectId);
74
+ }
75
+ const now = new Date().toISOString();
76
+ return {
77
+ name,
78
+ provider: "gcp",
79
+ projectId: sandmanProjectId,
80
+ status: "active",
81
+ services: [],
82
+ resources: {},
83
+ createdAt: now,
84
+ updatedAt: now,
85
+ };
86
+ }
87
+ catch (error) {
88
+ throw new Error(`Failed to create GCP project: ${error.message ?? "Unknown error"}`);
89
+ }
90
+ }
91
+ async linkBillingAccount(projectId) {
92
+ if (!this.billingAccountId) {
93
+ return;
94
+ }
95
+ try {
96
+ const { CloudBillingClient } = await import("@google-cloud/billing");
97
+ const billingClient = new CloudBillingClient();
98
+ // Update project billing info to link the billing account
99
+ await billingClient.updateProjectBillingInfo({
100
+ name: `projects/${projectId}`,
101
+ projectBillingInfo: {
102
+ billingAccountName: `billingAccounts/${this.billingAccountId}`,
103
+ },
104
+ });
105
+ }
106
+ catch (error) {
107
+ throw new Error(`Failed to link billing account: ${error.message ?? "Unknown error"}`);
108
+ }
58
109
  }
59
110
  async enableServices(env, services) {
60
- const enabledServices = services
61
- .map((s) => GCP_SERVICES[s])
62
- .filter(Boolean);
63
- console.log(`Enabling GCP services: ${enabledServices.join(", ")}`);
111
+ if (!env.projectId) {
112
+ throw new Error("Project ID is required to enable services");
113
+ }
114
+ try {
115
+ const { ServiceUsageClient } = await import("@google-cloud/service-usage");
116
+ const serviceUsageClient = new ServiceUsageClient();
117
+ const serviceNames = services.map((s) => GCP_SERVICES[s]).filter(Boolean);
118
+ if (serviceNames.length === 0) {
119
+ return;
120
+ }
121
+ console.log(`Enabling GCP services: ${serviceNames.join(", ")}`);
122
+ // Enable each service
123
+ for (const serviceName of serviceNames) {
124
+ const request = {
125
+ name: `projects/${env.projectId}/services/${serviceName}`,
126
+ };
127
+ await serviceUsageClient.enableService(request);
128
+ }
129
+ }
130
+ catch (error) {
131
+ throw new Error(`Failed to enable GCP services: ${error.message ?? "Unknown error"}`);
132
+ }
64
133
  }
65
134
  async connect(env) {
66
135
  const result = {
@@ -72,10 +141,70 @@ export class GcpAdapter {
72
141
  return result;
73
142
  }
74
143
  async destroyEnvironment(env) {
75
- console.log(`Would delete GCP project: ${env.projectId}`);
144
+ if (!env.projectId) {
145
+ throw new Error("Project ID is required to destroy environment");
146
+ }
147
+ try {
148
+ const { ProjectsClient } = await import("@google-cloud/resource-manager");
149
+ const resourceManagerClient = new ProjectsClient();
150
+ // Delete the project
151
+ const [operation] = await resourceManagerClient.deleteProject({
152
+ name: `projects/${env.projectId}`,
153
+ });
154
+ // Wait for the operation to complete
155
+ await operation.promise();
156
+ console.log(`Deleted GCP project: ${env.projectId}`);
157
+ }
158
+ catch (error) {
159
+ throw new Error(`Failed to delete GCP project: ${error.message ?? "Unknown error"}`);
160
+ }
76
161
  }
77
162
  async getStatus(env) {
78
- return env;
163
+ if (!env.projectId) {
164
+ return {
165
+ ...env,
166
+ status: "failed",
167
+ error: "Project ID not available",
168
+ };
169
+ }
170
+ try {
171
+ const { ProjectsClient } = await import("@google-cloud/resource-manager");
172
+ const resourceManagerClient = new ProjectsClient();
173
+ // Get the project to check its status
174
+ const [project] = await resourceManagerClient.getProject({
175
+ name: `projects/${env.projectId}`,
176
+ });
177
+ // Map GCP project lifecycle state to our status
178
+ let status = env.status;
179
+ const lifecycleState = project.lifecycleState;
180
+ switch (lifecycleState) {
181
+ case "ACTIVE":
182
+ status = "active";
183
+ break;
184
+ case "DELETE_REQUESTED":
185
+ case "DELETE_IN_PROGRESS":
186
+ status = "destroyed";
187
+ break;
188
+ case "FAILED":
189
+ status = "failed";
190
+ break;
191
+ default:
192
+ status = "pending";
193
+ }
194
+ return {
195
+ ...env,
196
+ status,
197
+ updatedAt: new Date().toISOString(),
198
+ };
199
+ }
200
+ catch (error) {
201
+ // If we can't get the project, it might have been deleted
202
+ return {
203
+ ...env,
204
+ status: "destroyed",
205
+ updatedAt: new Date().toISOString(),
206
+ };
207
+ }
79
208
  }
80
209
  setBillingAccount(accountId) {
81
210
  this.billingAccountId = accountId;
@@ -83,5 +212,8 @@ export class GcpAdapter {
83
212
  getProjectId() {
84
213
  return this.projectId;
85
214
  }
215
+ getProjectNumber() {
216
+ return this.projectNumber;
217
+ }
86
218
  }
87
219
  //# sourceMappingURL=adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import { GcpAdapter } from "./adapter.js";
3
+ const mockEnableService = vi.fn();
4
+ const mockCreateProject = vi.fn();
5
+ const mockGetProject = vi.fn();
6
+ const mockDeleteProject = vi.fn();
7
+ const mockGetOperation = vi.fn();
3
8
  vi.mock("@google-cloud/resource-manager", () => ({
4
9
  ProjectsClient: vi.fn().mockImplementation(() => ({
5
10
  searchProjects: vi
@@ -7,15 +12,32 @@ vi.mock("@google-cloud/resource-manager", () => ({
7
12
  .mockResolvedValue([
8
13
  [{ projectId: "test-project", name: "Test Project" }],
9
14
  ]),
10
- getProject: vi
11
- .fn()
12
- .mockResolvedValue([{ projectId: "test-project", name: "Test" }]),
15
+ getProject: mockGetProject,
16
+ createProject: mockCreateProject,
17
+ deleteProject: mockDeleteProject,
18
+ })),
19
+ }));
20
+ vi.mock("@google-cloud/service-usage", () => ({
21
+ ServiceUsageClient: vi.fn().mockImplementation(() => ({
22
+ enableService: mockEnableService,
13
23
  })),
14
24
  }));
15
25
  describe("GcpAdapter", () => {
16
26
  let adapter;
17
27
  beforeEach(() => {
18
28
  vi.clearAllMocks();
29
+ mockEnableService.mockResolvedValue([{}]);
30
+ // Mock successful project creation
31
+ const mockOperation = {
32
+ promise: vi
33
+ .fn()
34
+ .mockResolvedValue([{ name: "projects/sandman-test-env-123456789" }]),
35
+ };
36
+ mockCreateProject.mockResolvedValue([mockOperation]);
37
+ mockGetProject.mockResolvedValue([
38
+ { projectId: "sandman-test-env-123456789", projectNumber: "1234567890" },
39
+ ]);
40
+ mockDeleteProject.mockResolvedValue([mockOperation]);
19
41
  adapter = new GcpAdapter();
20
42
  });
21
43
  describe("init", () => {
@@ -39,15 +61,36 @@ describe("GcpAdapter", () => {
39
61
  });
40
62
  describe("createEnvironment", () => {
41
63
  it("should create an environment record", async () => {
64
+ await adapter.init(); // Initialize first
42
65
  const env = await adapter.createEnvironment("test-env");
43
66
  expect(env.name).toBe("test-env");
44
67
  expect(env.provider).toBe("gcp");
45
68
  expect(env.status).toBe("active");
46
69
  expect(env.projectId).toMatch(/^sandman-test-env-/);
47
70
  });
71
+ it("should create actual GCP project via Resource Manager API", async () => {
72
+ await adapter.init(); // Initialize first
73
+ await adapter.createEnvironment("test-env");
74
+ expect(mockCreateProject).toHaveBeenCalledWith({
75
+ project: expect.objectContaining({
76
+ projectId: expect.stringMatching(/^sandman-test-env-/),
77
+ name: "Sandman Environment: test-env",
78
+ }),
79
+ });
80
+ });
81
+ it("should throw error when no project configured", async () => {
82
+ // Create a mock that returns no projects
83
+ const { ProjectsClient } = await import("@google-cloud/resource-manager");
84
+ ProjectsClient.mockImplementationOnce(() => ({
85
+ searchProjects: vi.fn().mockResolvedValue([[]]), // Empty projects array
86
+ }));
87
+ const freshAdapter = new GcpAdapter();
88
+ await freshAdapter.init();
89
+ await expect(freshAdapter.createEnvironment("test-env")).rejects.toThrow("No GCP project configured");
90
+ });
48
91
  });
49
92
  describe("enableServices", () => {
50
- it("should log services to enable", async () => {
93
+ it("should call Service Usage API to enable services", async () => {
51
94
  const env = {
52
95
  name: "test",
53
96
  provider: "gcp",
@@ -58,10 +101,42 @@ describe("GcpAdapter", () => {
58
101
  createdAt: new Date().toISOString(),
59
102
  updatedAt: new Date().toISOString(),
60
103
  };
61
- const consoleSpy = vi.spyOn(console, "log");
62
104
  await adapter.enableServices(env, ["compute", "storage"]);
63
- expect(consoleSpy).toHaveBeenCalledWith("Enabling GCP services: compute.googleapis.com, storage.googleapis.com");
64
- consoleSpy.mockRestore();
105
+ // Verify Service Usage API was called for each service
106
+ expect(mockEnableService).toHaveBeenCalledTimes(2);
107
+ expect(mockEnableService).toHaveBeenCalledWith({
108
+ name: "projects/test-project/services/compute.googleapis.com",
109
+ });
110
+ expect(mockEnableService).toHaveBeenCalledWith({
111
+ name: "projects/test-project/services/storage.googleapis.com",
112
+ });
113
+ });
114
+ it("should throw error when projectId is missing", async () => {
115
+ const env = {
116
+ name: "test",
117
+ provider: "gcp",
118
+ status: "active",
119
+ services: [],
120
+ resources: {},
121
+ projectId: undefined,
122
+ createdAt: new Date().toISOString(),
123
+ updatedAt: new Date().toISOString(),
124
+ };
125
+ await expect(adapter.enableServices(env, ["compute"])).rejects.toThrow("Project ID is required to enable services");
126
+ });
127
+ it("should handle API errors gracefully", async () => {
128
+ const env = {
129
+ name: "test",
130
+ provider: "gcp",
131
+ status: "active",
132
+ services: [],
133
+ resources: {},
134
+ projectId: "test-project",
135
+ createdAt: new Date().toISOString(),
136
+ updatedAt: new Date().toISOString(),
137
+ };
138
+ mockEnableService.mockRejectedValueOnce(new Error("API Error"));
139
+ await expect(adapter.enableServices(env, ["compute"])).rejects.toThrow("Failed to enable GCP services");
65
140
  });
66
141
  });
67
142
  describe("connect", () => {
@@ -82,29 +157,45 @@ describe("GcpAdapter", () => {
82
157
  });
83
158
  });
84
159
  describe("destroyEnvironment", () => {
85
- it("should log project deletion", async () => {
160
+ it("should delete GCP project via Resource Manager API", async () => {
86
161
  const env = {
87
162
  name: "test",
88
163
  provider: "gcp",
89
164
  status: "active",
90
165
  services: [],
91
166
  resources: {},
92
- projectId: "test-project",
167
+ projectId: "sandman-test-env-123456789",
93
168
  createdAt: new Date().toISOString(),
94
169
  updatedAt: new Date().toISOString(),
95
170
  };
96
- const consoleSpy = vi.spyOn(console, "log");
97
171
  await adapter.destroyEnvironment(env);
98
- expect(consoleSpy).toHaveBeenCalledWith("Would delete GCP project: test-project");
99
- consoleSpy.mockRestore();
172
+ expect(mockDeleteProject).toHaveBeenCalledWith({
173
+ name: "projects/sandman-test-env-123456789",
174
+ });
175
+ });
176
+ it("should throw error when projectId is missing", async () => {
177
+ const env = {
178
+ name: "test",
179
+ provider: "gcp",
180
+ status: "active",
181
+ services: [],
182
+ resources: {},
183
+ projectId: "",
184
+ createdAt: new Date().toISOString(),
185
+ updatedAt: new Date().toISOString(),
186
+ };
187
+ await expect(adapter.destroyEnvironment(env)).rejects.toThrow("Project ID is required to destroy environment");
100
188
  });
101
189
  });
102
190
  describe("getStatus", () => {
103
- it("should return environment as-is", async () => {
191
+ it("should return active status when project is ACTIVE", async () => {
192
+ mockGetProject.mockResolvedValueOnce([
193
+ { projectId: "test-project", lifecycleState: "ACTIVE" },
194
+ ]);
104
195
  const env = {
105
196
  name: "test",
106
197
  provider: "gcp",
107
- status: "active",
198
+ status: "pending",
108
199
  services: ["compute"],
109
200
  resources: {},
110
201
  projectId: "test-project",
@@ -112,7 +203,23 @@ describe("GcpAdapter", () => {
112
203
  updatedAt: "2026-01-01T00:00:00.000Z",
113
204
  };
114
205
  const result = await adapter.getStatus(env);
115
- expect(result).toEqual(env);
206
+ expect(result.status).toBe("active");
207
+ expect(result.projectId).toBe("test-project");
208
+ });
209
+ it("should return destroyed status when project is deleted", async () => {
210
+ mockGetProject.mockRejectedValueOnce(new Error("Project not found"));
211
+ const env = {
212
+ name: "test",
213
+ provider: "gcp",
214
+ status: "active",
215
+ services: [],
216
+ resources: {},
217
+ projectId: "test-project",
218
+ createdAt: "2026-01-01T00:00:00.000Z",
219
+ updatedAt: "2026-01-01T00:00:00.000Z",
220
+ };
221
+ const result = await adapter.getStatus(env);
222
+ expect(result.status).toBe("destroyed");
116
223
  });
117
224
  });
118
225
  describe("setBillingAccount", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ProviderAdapter } from './base.js';
2
+ import { ProviderType } from '../types/index.js';
3
+ export declare function getAdapter(providerType: ProviderType): ProviderAdapter;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAgB,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,eAAe,CAOtE"}
@@ -0,0 +1,13 @@
1
+ import { AwsAdapter } from './aws/adapter.js';
2
+ import { GcpAdapter } from './gcp/adapter.js';
3
+ import { CloudflareAdapter } from './cloudflare/adapter.js';
4
+ import { VercelAdapter } from './vercel/adapter.js';
5
+ export function getAdapter(providerType) {
6
+ switch (providerType) {
7
+ case 'aws': return new AwsAdapter();
8
+ case 'gcp': return new GcpAdapter();
9
+ case 'cloudflare': return new CloudflareAdapter();
10
+ case 'vercel': return new VercelAdapter();
11
+ }
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,UAAU,UAAU,CAAC,YAA0B;IACnD,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QACpC,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QACpC,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ProviderAdapter } from "../base.js";
2
+ import { EnvironmentRecord, ServiceName } from "../../types/index.js";
3
+ export declare class VercelAdapter implements ProviderAdapter {
4
+ private teamId;
5
+ init(): Promise<void>;
6
+ createEnvironment(name: string): Promise<EnvironmentRecord>;
7
+ enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<void>;
8
+ connect(env: EnvironmentRecord): Promise<Record<string, string>>;
9
+ destroyEnvironment(env: EnvironmentRecord): Promise<void>;
10
+ getStatus(env: EnvironmentRecord): Promise<EnvironmentRecord>;
11
+ }
12
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAuB;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB3D,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAOV,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGpE"}
@@ -0,0 +1,74 @@
1
+ import { VERCEL_SERVICES } from "../base.js";
2
+ export class VercelAdapter {
3
+ teamId = null;
4
+ async init() {
5
+ const token = process.env.VERCEL_TOKEN;
6
+ if (!token) {
7
+ throw new Error("VERCEL_TOKEN environment variable is required. " +
8
+ "Create a token at https://vercel.com/account/tokens");
9
+ }
10
+ // Verify token by fetching the authenticated user
11
+ const response = await fetch("https://api.vercel.com/v2/user", {
12
+ headers: {
13
+ Authorization: `Bearer ${token}`,
14
+ "Content-Type": "application/json",
15
+ },
16
+ });
17
+ if (!response.ok) {
18
+ const body = (await response.json());
19
+ const msg = body.error?.message || response.statusText;
20
+ throw new Error(`Vercel authentication failed: ${msg}`);
21
+ }
22
+ // Optionally capture team ID for team-scoped deployments
23
+ const teamId = process.env.VERCEL_TEAM_ID;
24
+ if (teamId) {
25
+ this.teamId = teamId;
26
+ }
27
+ }
28
+ async createEnvironment(name) {
29
+ const now = new Date().toISOString();
30
+ const projectName = `sandman-${name}-${Date.now()}`;
31
+ return {
32
+ name,
33
+ provider: "vercel",
34
+ projectId: projectName,
35
+ status: "active",
36
+ services: [],
37
+ resources: {
38
+ projectName,
39
+ },
40
+ createdAt: now,
41
+ updatedAt: now,
42
+ };
43
+ }
44
+ async enableServices(env, services) {
45
+ const enabledServices = services
46
+ .map((s) => VERCEL_SERVICES[s])
47
+ .filter(Boolean);
48
+ console.log(`Enabling Vercel services: ${enabledServices.join(", ")}`);
49
+ }
50
+ async connect(env) {
51
+ const result = {
52
+ provider: "vercel",
53
+ };
54
+ if (process.env.VERCEL_TOKEN) {
55
+ result.VERCEL_TOKEN = process.env.VERCEL_TOKEN;
56
+ }
57
+ if (env.projectId) {
58
+ result.VERCEL_PROJECT_NAME = env.projectId;
59
+ }
60
+ if (process.env.VERCEL_TEAM_ID) {
61
+ result.VERCEL_TEAM_ID = process.env.VERCEL_TEAM_ID;
62
+ }
63
+ return result;
64
+ }
65
+ async destroyEnvironment(env) {
66
+ console.log(`Cleaning up Vercel resources for environment: ${env.name}`);
67
+ // Future: delete Vercel project via API
68
+ // DELETE /v9/projects/{projectId}
69
+ }
70
+ async getStatus(env) {
71
+ return env;
72
+ }
73
+ }
74
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.test.d.ts","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.test.ts"],"names":[],"mappings":""}