@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.
- package/dist/cli/commands/connect.d.ts +5 -1
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +22 -20
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/create.d.ts +3 -2
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +53 -16
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/destroy.d.ts +1 -0
- package/dist/cli/commands/destroy.d.ts.map +1 -1
- package/dist/cli/commands/destroy.js +15 -6
- package/dist/cli/commands/destroy.js.map +1 -1
- package/dist/cli/commands/enable.d.ts +5 -1
- package/dist/cli/commands/enable.d.ts.map +1 -1
- package/dist/cli/commands/enable.js +29 -14
- package/dist/cli/commands/enable.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +34 -23
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +14 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/core/state-store.d.ts +3 -3
- package/dist/core/state-store.d.ts.map +1 -1
- package/dist/core/state-store.js +1 -1
- package/dist/core/state-store.js.map +1 -1
- package/dist/providers/aws/adapter.d.ts +3 -0
- package/dist/providers/aws/adapter.d.ts.map +1 -1
- package/dist/providers/aws/adapter.js +331 -9
- package/dist/providers/aws/adapter.js.map +1 -1
- package/dist/providers/aws/adapter.test.js +107 -0
- package/dist/providers/aws/adapter.test.js.map +1 -1
- package/dist/providers/base.d.ts +2 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +14 -0
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/cloudflare/adapter.d.ts +12 -0
- package/dist/providers/cloudflare/adapter.d.ts.map +1 -0
- package/dist/providers/cloudflare/adapter.js +85 -0
- package/dist/providers/cloudflare/adapter.js.map +1 -0
- package/dist/providers/cloudflare/adapter.test.d.ts +2 -0
- package/dist/providers/cloudflare/adapter.test.d.ts.map +1 -0
- package/dist/providers/cloudflare/adapter.test.js +178 -0
- package/dist/providers/cloudflare/adapter.test.js.map +1 -0
- package/dist/providers/gcp/adapter.d.ts +3 -0
- package/dist/providers/gcp/adapter.d.ts.map +1 -1
- package/dist/providers/gcp/adapter.js +150 -18
- package/dist/providers/gcp/adapter.js.map +1 -1
- package/dist/providers/gcp/adapter.test.js +122 -15
- package/dist/providers/gcp/adapter.test.js.map +1 -1
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/vercel/adapter.d.ts +12 -0
- package/dist/providers/vercel/adapter.d.ts.map +1 -0
- package/dist/providers/vercel/adapter.js +74 -0
- package/dist/providers/vercel/adapter.js.map +1 -0
- package/dist/providers/vercel/adapter.test.d.ts +2 -0
- package/dist/providers/vercel/adapter.test.d.ts.map +1 -0
- package/dist/providers/vercel/adapter.test.js +166 -0
- package/dist/providers/vercel/adapter.test.js.map +1 -0
- package/dist/types/index.d.ts +21 -21
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +18 -4
- package/dist/types/index.js.map +1 -1
- package/dist/utils/cost-estimator.d.ts +36 -0
- package/dist/utils/cost-estimator.d.ts.map +1 -0
- package/dist/utils/cost-estimator.js +87 -0
- package/dist/utils/cost-estimator.js.map +1 -0
- package/dist/utils/cost-estimator.test.d.ts +2 -0
- package/dist/utils/cost-estimator.test.d.ts.map +1 -0
- package/dist/utils/cost-estimator.test.js +77 -0
- package/dist/utils/cost-estimator.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { VercelAdapter } from "./adapter.js";
|
|
3
|
+
global.fetch = vi.fn();
|
|
4
|
+
describe("VercelAdapter", () => {
|
|
5
|
+
let adapter;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.clearAllMocks();
|
|
8
|
+
vi.resetAllMocks();
|
|
9
|
+
adapter = new VercelAdapter();
|
|
10
|
+
delete process.env.VERCEL_TEAM_ID;
|
|
11
|
+
});
|
|
12
|
+
describe("init", () => {
|
|
13
|
+
it("should throw if VERCEL_TOKEN is missing", async () => {
|
|
14
|
+
delete process.env.VERCEL_TOKEN;
|
|
15
|
+
await expect(adapter.init()).rejects.toThrow("VERCEL_TOKEN environment variable is required");
|
|
16
|
+
});
|
|
17
|
+
it("should authenticate successfully", async () => {
|
|
18
|
+
process.env.VERCEL_TOKEN = "test-token";
|
|
19
|
+
global.fetch.mockResolvedValueOnce({
|
|
20
|
+
ok: true,
|
|
21
|
+
json: async () => ({ user: { id: "user123" } }),
|
|
22
|
+
});
|
|
23
|
+
await expect(adapter.init()).resolves.not.toThrow();
|
|
24
|
+
expect(global.fetch).toHaveBeenCalledWith("https://api.vercel.com/v2/user", expect.any(Object));
|
|
25
|
+
});
|
|
26
|
+
it("should throw on authentication failure", async () => {
|
|
27
|
+
process.env.VERCEL_TOKEN = "bad-token";
|
|
28
|
+
global.fetch.mockResolvedValueOnce({
|
|
29
|
+
ok: false,
|
|
30
|
+
json: async () => ({ error: { message: "Invalid token" } }),
|
|
31
|
+
});
|
|
32
|
+
await expect(adapter.init()).rejects.toThrow("Vercel authentication failed: Invalid token");
|
|
33
|
+
});
|
|
34
|
+
it("should capture team ID from env", async () => {
|
|
35
|
+
process.env.VERCEL_TOKEN = "test-token";
|
|
36
|
+
process.env.VERCEL_TEAM_ID = "team_abc123";
|
|
37
|
+
global.fetch.mockResolvedValueOnce({
|
|
38
|
+
ok: true,
|
|
39
|
+
json: async () => ({ user: { id: "user123" } }),
|
|
40
|
+
});
|
|
41
|
+
await adapter.init();
|
|
42
|
+
expect(global.fetch).toHaveBeenCalled();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("createEnvironment", () => {
|
|
46
|
+
it("should create an environment record with projectName", async () => {
|
|
47
|
+
const env = await adapter.createEnvironment("test-env");
|
|
48
|
+
expect(env.name).toBe("test-env");
|
|
49
|
+
expect(env.provider).toBe("vercel");
|
|
50
|
+
expect(env.status).toBe("active");
|
|
51
|
+
expect(env.projectId).toMatch(/^sandman-test-env-/);
|
|
52
|
+
expect(env.resources.projectName).toMatch(/^sandman-test-env-/);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("enableServices", () => {
|
|
56
|
+
it("should log services to enable", async () => {
|
|
57
|
+
const env = {
|
|
58
|
+
name: "test",
|
|
59
|
+
provider: "vercel",
|
|
60
|
+
status: "active",
|
|
61
|
+
services: [],
|
|
62
|
+
resources: {},
|
|
63
|
+
createdAt: new Date().toISOString(),
|
|
64
|
+
updatedAt: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
const consoleSpy = vi.spyOn(console, "log");
|
|
67
|
+
await adapter.enableServices(env, ["functions", "edge", "blob"]);
|
|
68
|
+
expect(consoleSpy).toHaveBeenCalledWith("Enabling Vercel services: functions, edge, blob");
|
|
69
|
+
consoleSpy.mockRestore();
|
|
70
|
+
});
|
|
71
|
+
it("should filter invalid services", async () => {
|
|
72
|
+
const env = {
|
|
73
|
+
name: "test",
|
|
74
|
+
provider: "vercel",
|
|
75
|
+
status: "active",
|
|
76
|
+
services: [],
|
|
77
|
+
resources: {},
|
|
78
|
+
createdAt: new Date().toISOString(),
|
|
79
|
+
updatedAt: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
const consoleSpy = vi.spyOn(console, "log");
|
|
82
|
+
await adapter.enableServices(env, ["invalid-service"]);
|
|
83
|
+
expect(consoleSpy).toHaveBeenCalledWith("Enabling Vercel services: ");
|
|
84
|
+
consoleSpy.mockRestore();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("connect", () => {
|
|
88
|
+
it("should return environment variables", async () => {
|
|
89
|
+
process.env.VERCEL_TOKEN = "my-token";
|
|
90
|
+
process.env.VERCEL_TEAM_ID = "team_abc";
|
|
91
|
+
const env = {
|
|
92
|
+
name: "test",
|
|
93
|
+
provider: "vercel",
|
|
94
|
+
status: "active",
|
|
95
|
+
services: [],
|
|
96
|
+
resources: { projectName: "my-project" },
|
|
97
|
+
createdAt: new Date().toISOString(),
|
|
98
|
+
updatedAt: new Date().toISOString(),
|
|
99
|
+
projectId: "my-project",
|
|
100
|
+
};
|
|
101
|
+
const creds = await adapter.connect(env);
|
|
102
|
+
expect(creds.provider).toBe("vercel");
|
|
103
|
+
expect(creds.VERCEL_TOKEN).toBe("my-token");
|
|
104
|
+
expect(creds.VERCEL_PROJECT_NAME).toBe("my-project");
|
|
105
|
+
expect(creds.VERCEL_TEAM_ID).toBe("team_abc");
|
|
106
|
+
});
|
|
107
|
+
it("should work without optional fields", async () => {
|
|
108
|
+
const env = {
|
|
109
|
+
name: "test",
|
|
110
|
+
provider: "vercel",
|
|
111
|
+
status: "active",
|
|
112
|
+
services: [],
|
|
113
|
+
resources: {},
|
|
114
|
+
createdAt: new Date().toISOString(),
|
|
115
|
+
updatedAt: new Date().toISOString(),
|
|
116
|
+
};
|
|
117
|
+
const creds = await adapter.connect(env);
|
|
118
|
+
expect(creds.provider).toBe("vercel");
|
|
119
|
+
expect(creds.VERCEL_TEAM_ID).toBeUndefined();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe("destroyEnvironment", () => {
|
|
123
|
+
it("should log cleanup message", async () => {
|
|
124
|
+
const env = {
|
|
125
|
+
name: "test",
|
|
126
|
+
provider: "vercel",
|
|
127
|
+
status: "active",
|
|
128
|
+
services: [],
|
|
129
|
+
resources: { projectName: "my-project" },
|
|
130
|
+
createdAt: new Date().toISOString(),
|
|
131
|
+
updatedAt: new Date().toISOString(),
|
|
132
|
+
};
|
|
133
|
+
const consoleSpy = vi.spyOn(console, "log");
|
|
134
|
+
await adapter.destroyEnvironment(env);
|
|
135
|
+
expect(consoleSpy).toHaveBeenCalledWith("Cleaning up Vercel resources for environment: test");
|
|
136
|
+
consoleSpy.mockRestore();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe("getStatus", () => {
|
|
140
|
+
it("should return environment as-is", async () => {
|
|
141
|
+
const env = {
|
|
142
|
+
name: "test",
|
|
143
|
+
provider: "vercel",
|
|
144
|
+
status: "active",
|
|
145
|
+
services: ["functions", "blob"],
|
|
146
|
+
resources: { projectName: "my-project" },
|
|
147
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
148
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
149
|
+
projectId: "my-project",
|
|
150
|
+
};
|
|
151
|
+
const result = await adapter.getStatus(env);
|
|
152
|
+
expect(result).toEqual(env);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe("interface compliance", () => {
|
|
156
|
+
it("should have all required methods", () => {
|
|
157
|
+
expect(typeof adapter.init).toBe("function");
|
|
158
|
+
expect(typeof adapter.createEnvironment).toBe("function");
|
|
159
|
+
expect(typeof adapter.enableServices).toBe("function");
|
|
160
|
+
expect(typeof adapter.connect).toBe("function");
|
|
161
|
+
expect(typeof adapter.destroyEnvironment).toBe("function");
|
|
162
|
+
expect(typeof adapter.getStatus).toBe("function");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const ProviderType: z.ZodEnum<["aws", "gcp"]>;
|
|
2
|
+
export declare const ProviderType: z.ZodEnum<["aws", "gcp", "cloudflare", "vercel"]>;
|
|
3
3
|
export type ProviderType = z.infer<typeof ProviderType>;
|
|
4
4
|
export declare const EnvironmentStatus: z.ZodEnum<["pending", "active", "failed", "destroyed"]>;
|
|
5
5
|
export type EnvironmentStatus = z.infer<typeof EnvironmentStatus>;
|
|
6
|
-
export declare const ServiceName: z.ZodEnum<["compute", "storage", "cloudrun", "lambda", "ec2", "s3", "
|
|
6
|
+
export declare const ServiceName: z.ZodEnum<["compute", "storage", "cloudrun", "iam", "pubsub", "container", "artifactregistry", "lambda", "ec2", "s3", "workers", "pages", "r2", "kv", "d1", "durable-objects", "functions", "edge", "blob", "postgres"]>;
|
|
7
7
|
export type ServiceName = z.infer<typeof ServiceName>;
|
|
8
8
|
export declare const EnvironmentRecordSchema: z.ZodObject<{
|
|
9
9
|
name: z.ZodString;
|
|
10
|
-
provider: z.ZodEnum<["aws", "gcp"]>;
|
|
10
|
+
provider: z.ZodEnum<["aws", "gcp", "cloudflare", "vercel"]>;
|
|
11
11
|
projectId: z.ZodOptional<z.ZodString>;
|
|
12
12
|
accountId: z.ZodOptional<z.ZodString>;
|
|
13
13
|
region: z.ZodOptional<z.ZodString>;
|
|
14
14
|
status: z.ZodEnum<["pending", "active", "failed", "destroyed"]>;
|
|
15
|
-
services: z.ZodDefault<z.ZodArray<z.ZodEnum<["compute", "storage", "cloudrun", "lambda", "ec2", "s3", "
|
|
15
|
+
services: z.ZodDefault<z.ZodArray<z.ZodEnum<["compute", "storage", "cloudrun", "iam", "pubsub", "container", "artifactregistry", "lambda", "ec2", "s3", "workers", "pages", "r2", "kv", "d1", "durable-objects", "functions", "edge", "blob", "postgres"]>, "many">>;
|
|
16
16
|
resources: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
17
17
|
createdAt: z.ZodString;
|
|
18
18
|
updatedAt: z.ZodString;
|
|
@@ -20,8 +20,8 @@ export declare const EnvironmentRecordSchema: z.ZodObject<{
|
|
|
20
20
|
}, "strip", z.ZodTypeAny, {
|
|
21
21
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
22
22
|
name: string;
|
|
23
|
-
provider: "aws" | "gcp";
|
|
24
|
-
services: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
23
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
24
|
+
services: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[];
|
|
25
25
|
resources: Record<string, any>;
|
|
26
26
|
createdAt: string;
|
|
27
27
|
updatedAt: string;
|
|
@@ -32,29 +32,29 @@ export declare const EnvironmentRecordSchema: z.ZodObject<{
|
|
|
32
32
|
}, {
|
|
33
33
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
34
34
|
name: string;
|
|
35
|
-
provider: "aws" | "gcp";
|
|
35
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
36
36
|
createdAt: string;
|
|
37
37
|
updatedAt: string;
|
|
38
38
|
projectId?: string | undefined;
|
|
39
39
|
accountId?: string | undefined;
|
|
40
40
|
region?: string | undefined;
|
|
41
|
-
services?: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
41
|
+
services?: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[] | undefined;
|
|
42
42
|
resources?: Record<string, any> | undefined;
|
|
43
43
|
error?: string | undefined;
|
|
44
44
|
}>;
|
|
45
45
|
export type EnvironmentRecord = z.infer<typeof EnvironmentRecordSchema>;
|
|
46
46
|
export declare const ConfigSchema: z.ZodObject<{
|
|
47
47
|
version: z.ZodDefault<z.ZodString>;
|
|
48
|
-
provider: z.ZodOptional<z.ZodEnum<["aws", "gcp"]>>;
|
|
48
|
+
provider: z.ZodOptional<z.ZodEnum<["aws", "gcp", "cloudflare", "vercel"]>>;
|
|
49
49
|
defaultRegion: z.ZodOptional<z.ZodString>;
|
|
50
50
|
environments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
51
51
|
name: z.ZodString;
|
|
52
|
-
provider: z.ZodEnum<["aws", "gcp"]>;
|
|
52
|
+
provider: z.ZodEnum<["aws", "gcp", "cloudflare", "vercel"]>;
|
|
53
53
|
projectId: z.ZodOptional<z.ZodString>;
|
|
54
54
|
accountId: z.ZodOptional<z.ZodString>;
|
|
55
55
|
region: z.ZodOptional<z.ZodString>;
|
|
56
56
|
status: z.ZodEnum<["pending", "active", "failed", "destroyed"]>;
|
|
57
|
-
services: z.ZodDefault<z.ZodArray<z.ZodEnum<["compute", "storage", "cloudrun", "lambda", "ec2", "s3", "
|
|
57
|
+
services: z.ZodDefault<z.ZodArray<z.ZodEnum<["compute", "storage", "cloudrun", "iam", "pubsub", "container", "artifactregistry", "lambda", "ec2", "s3", "workers", "pages", "r2", "kv", "d1", "durable-objects", "functions", "edge", "blob", "postgres"]>, "many">>;
|
|
58
58
|
resources: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
59
59
|
createdAt: z.ZodString;
|
|
60
60
|
updatedAt: z.ZodString;
|
|
@@ -62,8 +62,8 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
62
62
|
}, "strip", z.ZodTypeAny, {
|
|
63
63
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
64
64
|
name: string;
|
|
65
|
-
provider: "aws" | "gcp";
|
|
66
|
-
services: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
65
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
66
|
+
services: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[];
|
|
67
67
|
resources: Record<string, any>;
|
|
68
68
|
createdAt: string;
|
|
69
69
|
updatedAt: string;
|
|
@@ -74,13 +74,13 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
74
74
|
}, {
|
|
75
75
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
76
76
|
name: string;
|
|
77
|
-
provider: "aws" | "gcp";
|
|
77
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
78
78
|
createdAt: string;
|
|
79
79
|
updatedAt: string;
|
|
80
80
|
projectId?: string | undefined;
|
|
81
81
|
accountId?: string | undefined;
|
|
82
82
|
region?: string | undefined;
|
|
83
|
-
services?: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
83
|
+
services?: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[] | undefined;
|
|
84
84
|
resources?: Record<string, any> | undefined;
|
|
85
85
|
error?: string | undefined;
|
|
86
86
|
}>>>;
|
|
@@ -89,8 +89,8 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
89
89
|
environments: Record<string, {
|
|
90
90
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
91
91
|
name: string;
|
|
92
|
-
provider: "aws" | "gcp";
|
|
93
|
-
services: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
92
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
93
|
+
services: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[];
|
|
94
94
|
resources: Record<string, any>;
|
|
95
95
|
createdAt: string;
|
|
96
96
|
updatedAt: string;
|
|
@@ -99,22 +99,22 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
99
99
|
region?: string | undefined;
|
|
100
100
|
error?: string | undefined;
|
|
101
101
|
}>;
|
|
102
|
-
provider?: "aws" | "gcp" | undefined;
|
|
102
|
+
provider?: "aws" | "gcp" | "cloudflare" | "vercel" | undefined;
|
|
103
103
|
defaultRegion?: string | undefined;
|
|
104
104
|
}, {
|
|
105
|
-
provider?: "aws" | "gcp" | undefined;
|
|
105
|
+
provider?: "aws" | "gcp" | "cloudflare" | "vercel" | undefined;
|
|
106
106
|
version?: string | undefined;
|
|
107
107
|
defaultRegion?: string | undefined;
|
|
108
108
|
environments?: Record<string, {
|
|
109
109
|
status: "pending" | "active" | "failed" | "destroyed";
|
|
110
110
|
name: string;
|
|
111
|
-
provider: "aws" | "gcp";
|
|
111
|
+
provider: "aws" | "gcp" | "cloudflare" | "vercel";
|
|
112
112
|
createdAt: string;
|
|
113
113
|
updatedAt: string;
|
|
114
114
|
projectId?: string | undefined;
|
|
115
115
|
accountId?: string | undefined;
|
|
116
116
|
region?: string | undefined;
|
|
117
|
-
services?: ("compute" | "storage" | "cloudrun" | "lambda" | "ec2" | "s3" | "
|
|
117
|
+
services?: ("compute" | "storage" | "cloudrun" | "iam" | "pubsub" | "container" | "artifactregistry" | "lambda" | "ec2" | "s3" | "workers" | "pages" | "r2" | "kv" | "d1" | "durable-objects" | "functions" | "edge" | "blob" | "postgres")[] | undefined;
|
|
118
118
|
resources?: Record<string, any> | undefined;
|
|
119
119
|
error?: string | undefined;
|
|
120
120
|
}> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,mDAAiD,CAAC;AAE3E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,iBAAiB,yDAK5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,WAAW,0NAyBtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5D,cAAc,CACZ,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB"}
|
package/dist/types/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export const ProviderType = z.enum(["aws", "gcp"]);
|
|
2
|
+
export const ProviderType = z.enum(["aws", "gcp", "cloudflare", "vercel"]);
|
|
3
3
|
export const EnvironmentStatus = z.enum([
|
|
4
4
|
"pending",
|
|
5
5
|
"active",
|
|
@@ -7,16 +7,30 @@ export const EnvironmentStatus = z.enum([
|
|
|
7
7
|
"destroyed",
|
|
8
8
|
]);
|
|
9
9
|
export const ServiceName = z.enum([
|
|
10
|
+
// GCP
|
|
10
11
|
"compute",
|
|
11
12
|
"storage",
|
|
12
13
|
"cloudrun",
|
|
13
|
-
"lambda",
|
|
14
|
-
"ec2",
|
|
15
|
-
"s3",
|
|
16
14
|
"iam",
|
|
17
15
|
"pubsub",
|
|
18
16
|
"container",
|
|
19
17
|
"artifactregistry",
|
|
18
|
+
// AWS
|
|
19
|
+
"lambda",
|
|
20
|
+
"ec2",
|
|
21
|
+
"s3",
|
|
22
|
+
// Cloudflare
|
|
23
|
+
"workers",
|
|
24
|
+
"pages",
|
|
25
|
+
"r2",
|
|
26
|
+
"kv",
|
|
27
|
+
"d1",
|
|
28
|
+
"durable-objects",
|
|
29
|
+
// Vercel
|
|
30
|
+
"functions",
|
|
31
|
+
"edge",
|
|
32
|
+
"blob",
|
|
33
|
+
"postgres",
|
|
20
34
|
]);
|
|
21
35
|
export const EnvironmentRecordSchema = z.object({
|
|
22
36
|
name: z.string().min(1),
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAI3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,WAAW;CACZ,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC;IAChC,MAAM;IACN,SAAS;IACT,SAAS;IACT,UAAU;IACV,KAAK;IACL,QAAQ;IACR,WAAW;IACX,kBAAkB;IAClB,MAAM;IACN,QAAQ;IACR,KAAK;IACL,IAAI;IACJ,aAAa;IACb,SAAS;IACT,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,iBAAiB;IACjB,SAAS;IACT,WAAW;IACX,MAAM;IACN,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACpC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE;IACjC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxE,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ServiceName } from "../types/index.js";
|
|
2
|
+
export declare const SERVICE_COSTS: Record<string, Record<ServiceName, number>>;
|
|
3
|
+
export declare const BASE_COSTS: Record<string, number>;
|
|
4
|
+
export interface CostEstimate {
|
|
5
|
+
hourlyRate: number;
|
|
6
|
+
dailyRate: number;
|
|
7
|
+
monthlyRate: number;
|
|
8
|
+
services: Array<{
|
|
9
|
+
name: ServiceName;
|
|
10
|
+
hourlyRate: number;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export interface RunningCost {
|
|
14
|
+
hourlyRate: number;
|
|
15
|
+
hoursRunning: number;
|
|
16
|
+
totalCost: number;
|
|
17
|
+
estimatedDaily: number;
|
|
18
|
+
estimatedMonthly: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate estimated cost for a set of services
|
|
22
|
+
*/
|
|
23
|
+
export declare function calculateEstimate(provider: string, services: ServiceName[]): CostEstimate;
|
|
24
|
+
/**
|
|
25
|
+
* Calculate running cost based on elapsed time
|
|
26
|
+
*/
|
|
27
|
+
export declare function calculateRunningCost(provider: string, services: ServiceName[], createdAt: string): RunningCost;
|
|
28
|
+
/**
|
|
29
|
+
* Format cost as a readable string
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatCost(cost: number): string;
|
|
32
|
+
/**
|
|
33
|
+
* Format hourly rate with proper units
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatHourlyRate(rate: number): string;
|
|
36
|
+
//# sourceMappingURL=cost-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.d.ts","sourceRoot":"","sources":["../../src/utils/cost-estimator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAgBrE,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG7C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,WAAW,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EAAE,GACtB,YAAY,CA2Bd;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,WAAW,CAab;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Cost rates in USD per hour
|
|
2
|
+
export const SERVICE_COSTS = {
|
|
3
|
+
aws: {
|
|
4
|
+
ec2: 0.0116, // t2.micro on-demand
|
|
5
|
+
s3: 0.005, // per GB stored (simplified)
|
|
6
|
+
lambda: 0.0000166667, // per GB-second (simplified)
|
|
7
|
+
iam: 0, // IAM is free
|
|
8
|
+
},
|
|
9
|
+
gcp: {
|
|
10
|
+
compute: 0.0076, // e2-micro
|
|
11
|
+
storage: 0.004, // per GB stored (simplified)
|
|
12
|
+
cloudrun: 0.000024, // per vCPU-second (simplified)
|
|
13
|
+
iam: 0, // IAM is free
|
|
14
|
+
pubsub: 0.0, // per message (negligible for sandbox)
|
|
15
|
+
container: 0.0076, // GKE e2-micro
|
|
16
|
+
artifactregistry: 0.005, // per GB stored
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
// Base costs per provider per hour
|
|
20
|
+
export const BASE_COSTS = {
|
|
21
|
+
aws: 0.005, // VPC and basic infrastructure
|
|
22
|
+
gcp: 0.0, // GCP doesn't charge for project itself
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Calculate estimated cost for a set of services
|
|
26
|
+
*/
|
|
27
|
+
export function calculateEstimate(provider, services) {
|
|
28
|
+
const providerCosts = SERVICE_COSTS[provider] || {};
|
|
29
|
+
const baseCost = BASE_COSTS[provider] || 0;
|
|
30
|
+
let hourlyRate = baseCost;
|
|
31
|
+
const serviceBreakdown = [];
|
|
32
|
+
for (const service of services) {
|
|
33
|
+
const cost = providerCosts[service] || 0;
|
|
34
|
+
hourlyRate += cost;
|
|
35
|
+
serviceBreakdown.push({ name: service, hourlyRate: cost });
|
|
36
|
+
}
|
|
37
|
+
// Add base cost as a line item if > 0
|
|
38
|
+
if (baseCost > 0) {
|
|
39
|
+
serviceBreakdown.unshift({
|
|
40
|
+
name: "base",
|
|
41
|
+
hourlyRate: baseCost,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
hourlyRate,
|
|
46
|
+
dailyRate: hourlyRate * 24,
|
|
47
|
+
monthlyRate: hourlyRate * 24 * 30,
|
|
48
|
+
services: serviceBreakdown,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculate running cost based on elapsed time
|
|
53
|
+
*/
|
|
54
|
+
export function calculateRunningCost(provider, services, createdAt) {
|
|
55
|
+
const estimate = calculateEstimate(provider, services);
|
|
56
|
+
const created = new Date(createdAt);
|
|
57
|
+
const now = new Date();
|
|
58
|
+
const hoursRunning = (now.getTime() - created.getTime()) / (1000 * 60 * 60);
|
|
59
|
+
return {
|
|
60
|
+
hourlyRate: estimate.hourlyRate,
|
|
61
|
+
hoursRunning: Math.round(hoursRunning * 10) / 10, // Round to 1 decimal
|
|
62
|
+
totalCost: Math.round(estimate.hourlyRate * hoursRunning * 100) / 100,
|
|
63
|
+
estimatedDaily: estimate.dailyRate,
|
|
64
|
+
estimatedMonthly: estimate.monthlyRate,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format cost as a readable string
|
|
69
|
+
*/
|
|
70
|
+
export function formatCost(cost) {
|
|
71
|
+
if (cost === 0)
|
|
72
|
+
return "$0.00";
|
|
73
|
+
if (cost < 0.01)
|
|
74
|
+
return "<$0.01";
|
|
75
|
+
return `$${cost.toFixed(2)}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Format hourly rate with proper units
|
|
79
|
+
*/
|
|
80
|
+
export function formatHourlyRate(rate) {
|
|
81
|
+
if (rate === 0)
|
|
82
|
+
return "$0.00/hour";
|
|
83
|
+
if (rate < 0.01)
|
|
84
|
+
return "<$0.01/hour";
|
|
85
|
+
return `$${rate.toFixed(3)}/hour`;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cost-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../../src/utils/cost-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.test.d.ts","sourceRoot":"","sources":["../../src/utils/cost-estimator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { calculateEstimate, calculateRunningCost, formatCost, formatHourlyRate, SERVICE_COSTS, BASE_COSTS, } from "./cost-estimator.js";
|
|
3
|
+
describe("Cost Estimator", () => {
|
|
4
|
+
describe("calculateEstimate", () => {
|
|
5
|
+
it("should calculate cost for AWS services", () => {
|
|
6
|
+
const services = ["ec2", "s3"];
|
|
7
|
+
const estimate = calculateEstimate("aws", services);
|
|
8
|
+
expect(estimate.hourlyRate).toBeGreaterThan(0);
|
|
9
|
+
expect(estimate.services).toHaveLength(3); // base + ec2 + s3
|
|
10
|
+
expect(estimate.dailyRate).toBe(estimate.hourlyRate * 24);
|
|
11
|
+
expect(estimate.monthlyRate).toBe(estimate.hourlyRate * 24 * 30);
|
|
12
|
+
});
|
|
13
|
+
it("should calculate cost for GCP services", () => {
|
|
14
|
+
const services = ["compute", "storage", "cloudrun"];
|
|
15
|
+
const estimate = calculateEstimate("gcp", services);
|
|
16
|
+
expect(estimate.hourlyRate).toBeGreaterThan(0);
|
|
17
|
+
expect(estimate.services).toHaveLength(3);
|
|
18
|
+
expect(estimate.dailyRate).toBe(estimate.hourlyRate * 24);
|
|
19
|
+
});
|
|
20
|
+
it("should return base cost only when no services enabled", () => {
|
|
21
|
+
const estimate = calculateEstimate("aws", []);
|
|
22
|
+
expect(estimate.hourlyRate).toBe(BASE_COSTS.aws);
|
|
23
|
+
expect(estimate.services).toHaveLength(1); // Just base
|
|
24
|
+
});
|
|
25
|
+
it("should return zero for unknown provider", () => {
|
|
26
|
+
const estimate = calculateEstimate("unknown", ["ec2"]);
|
|
27
|
+
expect(estimate.hourlyRate).toBe(0);
|
|
28
|
+
});
|
|
29
|
+
it("should include IAM at no cost", () => {
|
|
30
|
+
const services = ["ec2", "iam"];
|
|
31
|
+
const estimate = calculateEstimate("aws", services);
|
|
32
|
+
const iamService = estimate.services.find((s) => s.name === "iam");
|
|
33
|
+
expect(iamService?.hourlyRate).toBe(0);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("calculateRunningCost", () => {
|
|
37
|
+
it("should calculate running cost based on elapsed time", () => {
|
|
38
|
+
// Create a date 5 hours ago
|
|
39
|
+
const createdAt = new Date(Date.now() - 5 * 60 * 60 * 1000).toISOString();
|
|
40
|
+
const services = ["ec2"];
|
|
41
|
+
const runningCost = calculateRunningCost("aws", services, createdAt);
|
|
42
|
+
expect(runningCost.hoursRunning).toBeCloseTo(5, 0);
|
|
43
|
+
expect(runningCost.totalCost).toBeGreaterThan(0);
|
|
44
|
+
expect(runningCost.hourlyRate).toBe(SERVICE_COSTS.aws.ec2 + BASE_COSTS.aws);
|
|
45
|
+
});
|
|
46
|
+
it("should handle newly created environments", () => {
|
|
47
|
+
const createdAt = new Date().toISOString();
|
|
48
|
+
const services = ["compute"];
|
|
49
|
+
const runningCost = calculateRunningCost("gcp", services, createdAt);
|
|
50
|
+
expect(runningCost.hoursRunning).toBeCloseTo(0, 1);
|
|
51
|
+
expect(runningCost.totalCost).toBeCloseTo(0, 2);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("formatCost", () => {
|
|
55
|
+
it("should format zero cost", () => {
|
|
56
|
+
expect(formatCost(0)).toBe("$0.00");
|
|
57
|
+
});
|
|
58
|
+
it("should format very small cost", () => {
|
|
59
|
+
expect(formatCost(0.001)).toBe("<$0.01");
|
|
60
|
+
});
|
|
61
|
+
it("should format normal cost", () => {
|
|
62
|
+
expect(formatCost(12.3456)).toBe("$12.35");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("formatHourlyRate", () => {
|
|
66
|
+
it("should format zero rate", () => {
|
|
67
|
+
expect(formatHourlyRate(0)).toBe("$0.00/hour");
|
|
68
|
+
});
|
|
69
|
+
it("should format very small rate", () => {
|
|
70
|
+
expect(formatHourlyRate(0.001)).toBe("<$0.01/hour");
|
|
71
|
+
});
|
|
72
|
+
it("should format normal rate", () => {
|
|
73
|
+
expect(formatHourlyRate(0.1234)).toBe("$0.123/hour");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=cost-estimator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.test.js","sourceRoot":"","sources":["../../src/utils/cost-estimator.test.ts"],"names":[],"mappings":"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"}
|