@executor-js/emulate 0.6.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 +1044 -0
- package/dist/api.d.ts +24 -0
- package/dist/api.js +2665 -0
- package/dist/api.js.map +1 -0
- package/dist/chunk-D6EKRYGP.js +1615 -0
- package/dist/chunk-D6EKRYGP.js.map +1 -0
- package/dist/chunk-WVQMFHQM.js +83 -0
- package/dist/chunk-WVQMFHQM.js.map +1 -0
- package/dist/dist-7FDUSG5I.js +24368 -0
- package/dist/dist-7FDUSG5I.js.map +1 -0
- package/dist/dist-7N4COJHK.js +1814 -0
- package/dist/dist-7N4COJHK.js.map +1 -0
- package/dist/dist-BTEY33DJ.js +2334 -0
- package/dist/dist-BTEY33DJ.js.map +1 -0
- package/dist/dist-DK26ESP2.js +595 -0
- package/dist/dist-DK26ESP2.js.map +1 -0
- package/dist/dist-IYZPDKJW.js +1284 -0
- package/dist/dist-IYZPDKJW.js.map +1 -0
- package/dist/dist-JJ2ZRCAX.js +189 -0
- package/dist/dist-JJ2ZRCAX.js.map +1 -0
- package/dist/dist-K4CVTD6K.js +1570 -0
- package/dist/dist-K4CVTD6K.js.map +1 -0
- package/dist/dist-M3GVASMR.js +1254 -0
- package/dist/dist-M3GVASMR.js.map +1 -0
- package/dist/dist-OYYGWKZQ.js +1533 -0
- package/dist/dist-OYYGWKZQ.js.map +1 -0
- package/dist/dist-P3SBBRFR.js +3169 -0
- package/dist/dist-P3SBBRFR.js.map +1 -0
- package/dist/dist-RMPDKZUA.js +1183 -0
- package/dist/dist-RMPDKZUA.js.map +1 -0
- package/dist/dist-WBKONLOE.js +2154 -0
- package/dist/dist-WBKONLOE.js.map +1 -0
- package/dist/dist-XM5HSBDC.js +1090 -0
- package/dist/dist-XM5HSBDC.js.map +1 -0
- package/dist/dist-XVVIYXQG.js +4241 -0
- package/dist/dist-XVVIYXQG.js.map +1 -0
- package/dist/dist-YPRJYQHW.js +5109 -0
- package/dist/dist-YPRJYQHW.js.map +1 -0
- package/dist/dist-ZEC77OKZ.js +913 -0
- package/dist/dist-ZEC77OKZ.js.map +1 -0
- package/dist/fonts/GeistPixel-Square.woff2 +0 -0
- package/dist/fonts/favicon.ico +0 -0
- package/dist/fonts/geist-sans.woff2 +0 -0
- package/dist/helpers-LXLP3DFE-LBOTATT5.js +17 -0
- package/dist/helpers-LXLP3DFE-LBOTATT5.js.map +1 -0
- package/dist/index.js +3005 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// ../@emulators/autumn/dist/index.js
|
|
2
|
+
function getAutumnStore(store) {
|
|
3
|
+
return {
|
|
4
|
+
customers: store.collection("autumn.customers", ["customer_id"]),
|
|
5
|
+
events: store.collection("autumn.events", ["customer_id", "feature_id"])
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function serializeCustomer(customer) {
|
|
9
|
+
return {
|
|
10
|
+
id: customer.customer_id,
|
|
11
|
+
created_at: Date.parse(customer.created_at),
|
|
12
|
+
name: customer.name,
|
|
13
|
+
email: customer.email,
|
|
14
|
+
fingerprint: null,
|
|
15
|
+
stripe_id: `cus_emulate_${customer.id}`,
|
|
16
|
+
env: "sandbox",
|
|
17
|
+
metadata: {},
|
|
18
|
+
subscriptions: customer.subscriptions,
|
|
19
|
+
products: [],
|
|
20
|
+
features: {},
|
|
21
|
+
invoices: [],
|
|
22
|
+
purchases: [],
|
|
23
|
+
balances: {},
|
|
24
|
+
flags: {},
|
|
25
|
+
billing_controls: {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function ensureCustomer(as, id, data) {
|
|
29
|
+
const existing = as.customers.findOneBy("customer_id", id);
|
|
30
|
+
if (existing) return existing;
|
|
31
|
+
return as.customers.insert({
|
|
32
|
+
customer_id: id,
|
|
33
|
+
name: typeof data.name === "string" ? data.name : null,
|
|
34
|
+
email: typeof data.email === "string" ? data.email : null,
|
|
35
|
+
subscriptions: []
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function autumnApiRoutes(ctx) {
|
|
39
|
+
const { app, store } = ctx;
|
|
40
|
+
const as = () => getAutumnStore(store);
|
|
41
|
+
app.post("/v1/customers.get_or_create", async (c) => {
|
|
42
|
+
const body = await c.req.json().catch(() => ({}));
|
|
43
|
+
const id = String(body.customer_id ?? body.id ?? "");
|
|
44
|
+
if (!id) return c.json({ message: "customer_id is required", code: "invalid_request" }, 400);
|
|
45
|
+
const data = body.customer_data ?? body;
|
|
46
|
+
const customer = ensureCustomer(as(), id, data);
|
|
47
|
+
return c.json(serializeCustomer(customer));
|
|
48
|
+
});
|
|
49
|
+
app.post("/v1/customers.list", async (c) => {
|
|
50
|
+
const customers = as().customers.all().map(serializeCustomer);
|
|
51
|
+
return c.json({ list: customers, total: customers.length, offset: 0, limit: 100 });
|
|
52
|
+
});
|
|
53
|
+
app.post("/v1/customers.update", async (c) => {
|
|
54
|
+
const body = await c.req.json().catch(() => ({}));
|
|
55
|
+
const id = String(body.customer_id ?? body.id ?? "");
|
|
56
|
+
const customer = as().customers.findOneBy("customer_id", id);
|
|
57
|
+
if (!customer) return c.json({ message: "Customer not found", code: "not_found" }, 404);
|
|
58
|
+
const updated = as().customers.update(customer.id, {
|
|
59
|
+
name: typeof body.name === "string" ? body.name : customer.name,
|
|
60
|
+
email: typeof body.email === "string" ? body.email : customer.email
|
|
61
|
+
});
|
|
62
|
+
return c.json(serializeCustomer(updated));
|
|
63
|
+
});
|
|
64
|
+
app.post("/v1/balances.track", async (c) => {
|
|
65
|
+
const body = await c.req.json().catch(() => ({}));
|
|
66
|
+
const customerId = String(body.customer_id ?? "");
|
|
67
|
+
const featureId = String(body.feature_id ?? body.event_name ?? "");
|
|
68
|
+
if (!customerId || !featureId) {
|
|
69
|
+
return c.json({ message: "customer_id and feature_id are required", code: "invalid_request" }, 400);
|
|
70
|
+
}
|
|
71
|
+
ensureCustomer(as(), customerId, {});
|
|
72
|
+
const event = as().events.insert({
|
|
73
|
+
customer_id: customerId,
|
|
74
|
+
feature_id: featureId,
|
|
75
|
+
value: typeof body.value === "number" ? body.value : 1
|
|
76
|
+
});
|
|
77
|
+
return c.json({
|
|
78
|
+
id: `evt_emulate_${event.id}`,
|
|
79
|
+
code: "event_received",
|
|
80
|
+
customer_id: customerId,
|
|
81
|
+
feature_id: featureId
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
app.post("/v1/plans.list", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));
|
|
85
|
+
app.post(
|
|
86
|
+
"/v1/features.list",
|
|
87
|
+
async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 })
|
|
88
|
+
);
|
|
89
|
+
app.post("/v1/events.list", async (c) => {
|
|
90
|
+
const events = as().events.all().map((event) => ({
|
|
91
|
+
id: `evt_emulate_${event.id}`,
|
|
92
|
+
customer_id: event.customer_id,
|
|
93
|
+
feature_id: event.feature_id,
|
|
94
|
+
value: event.value,
|
|
95
|
+
timestamp: Date.parse(event.created_at)
|
|
96
|
+
}));
|
|
97
|
+
return c.json({ list: events, total: events.length, offset: 0, limit: 100 });
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
var manifest = {
|
|
101
|
+
id: "autumn",
|
|
102
|
+
name: "Autumn",
|
|
103
|
+
description: "Stateful Autumn billing emulator: customers (with seedable subscriptions), usage tracking, and list endpoints for plans, features, and events.",
|
|
104
|
+
docsUrl: "https://docs.emulators.dev/autumn",
|
|
105
|
+
surfaces: [{ id: "rest", kind: "rest", title: "Autumn v1 API", status: "partial", basePath: "/v1" }],
|
|
106
|
+
auth: [{ id: "api-key", title: "Autumn secret key", type: "api-key", status: "supported" }],
|
|
107
|
+
specs: [
|
|
108
|
+
{
|
|
109
|
+
kind: "manual",
|
|
110
|
+
title: "Autumn v1 subset",
|
|
111
|
+
coverage: "hand-authored",
|
|
112
|
+
operations: [
|
|
113
|
+
{ operationId: "customers.get_or_create", method: "POST", path: "/v1/customers.get_or_create", status: "hand-authored" },
|
|
114
|
+
{ operationId: "customers.list", method: "POST", path: "/v1/customers.list", status: "hand-authored" },
|
|
115
|
+
{ operationId: "customers.update", method: "POST", path: "/v1/customers.update", status: "hand-authored" },
|
|
116
|
+
{ operationId: "balances.track", method: "POST", path: "/v1/balances.track", status: "hand-authored" },
|
|
117
|
+
{ operationId: "plans.list", method: "POST", path: "/v1/plans.list", status: "hand-authored" },
|
|
118
|
+
{ operationId: "features.list", method: "POST", path: "/v1/features.list", status: "hand-authored" },
|
|
119
|
+
{ operationId: "events.list", method: "POST", path: "/v1/events.list", status: "hand-authored" }
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
seedSchema: {
|
|
124
|
+
description: "Seed customers with subscriptions (e.g. a paid plan).",
|
|
125
|
+
fields: [
|
|
126
|
+
{
|
|
127
|
+
key: "customers",
|
|
128
|
+
title: "Customers",
|
|
129
|
+
description: "Customers keyed by id, each with optional subscriptions.",
|
|
130
|
+
example: [{ id: "org_123", subscriptions: [{ plan_id: "pro", status: "active" }] }]
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
example: {
|
|
134
|
+
customers: [{ id: "org_123", subscriptions: [{ plan_id: "pro", status: "active" }] }]
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
stateModel: {
|
|
138
|
+
description: "Entities mutated by Autumn provider calls.",
|
|
139
|
+
collections: [{ name: "autumn.customers" }, { name: "autumn.events" }]
|
|
140
|
+
},
|
|
141
|
+
connections: [
|
|
142
|
+
{
|
|
143
|
+
id: "autumn-js",
|
|
144
|
+
title: "autumn-js SDK",
|
|
145
|
+
kind: "sdk",
|
|
146
|
+
language: "typescript",
|
|
147
|
+
description: "Point autumn-js at the emulator via serverURL.",
|
|
148
|
+
template: 'import { Autumn } from "autumn-js";\n\nconst autumn = new Autumn({ secretKey: "{{token}}", serverURL: "{{baseUrl}}" });'
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
};
|
|
152
|
+
function seedFromConfig(store, _baseUrl, config) {
|
|
153
|
+
const as = getAutumnStore(store);
|
|
154
|
+
for (const customer of config.customers ?? []) {
|
|
155
|
+
const existing = as.customers.findOneBy("customer_id", customer.id);
|
|
156
|
+
if (existing) {
|
|
157
|
+
as.customers.update(existing.id, {
|
|
158
|
+
name: customer.name ?? existing.name,
|
|
159
|
+
email: customer.email ?? existing.email,
|
|
160
|
+
subscriptions: customer.subscriptions ?? existing.subscriptions
|
|
161
|
+
});
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
as.customers.insert({
|
|
165
|
+
customer_id: customer.id,
|
|
166
|
+
name: customer.name ?? null,
|
|
167
|
+
email: customer.email ?? null,
|
|
168
|
+
subscriptions: customer.subscriptions ?? []
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
var autumnPlugin = {
|
|
173
|
+
name: "autumn",
|
|
174
|
+
register(app, store, webhooks, baseUrl, tokenMap) {
|
|
175
|
+
const ctx = { app, store, webhooks, baseUrl, tokenMap };
|
|
176
|
+
autumnApiRoutes(ctx);
|
|
177
|
+
},
|
|
178
|
+
seed(_store, _baseUrl) {
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
var index_default = autumnPlugin;
|
|
182
|
+
export {
|
|
183
|
+
autumnPlugin,
|
|
184
|
+
index_default as default,
|
|
185
|
+
getAutumnStore,
|
|
186
|
+
manifest,
|
|
187
|
+
seedFromConfig
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=dist-JJ2ZRCAX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../@emulators/autumn/src/store.ts","../../@emulators/autumn/src/routes/api.ts","../../@emulators/autumn/src/manifest.ts","../../@emulators/autumn/src/index.ts"],"sourcesContent":["import { Store, type Collection } from \"@emulators/core\";\n\nimport type { AutumnCustomer, AutumnTrackEvent } from \"./entities.js\";\n\nexport interface AutumnStore {\n customers: Collection<AutumnCustomer>;\n events: Collection<AutumnTrackEvent>;\n}\n\nexport function getAutumnStore(store: Store): AutumnStore {\n return {\n customers: store.collection<AutumnCustomer>(\"autumn.customers\", [\"customer_id\"]),\n events: store.collection<AutumnTrackEvent>(\"autumn.events\", [\"customer_id\", \"feature_id\"]),\n };\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nimport { getAutumnStore, type AutumnStore } from \"../store.js\";\nimport type { AutumnCustomer } from \"../entities.js\";\n\nfunction serializeCustomer(customer: AutumnCustomer): Record<string, unknown> {\n return {\n id: customer.customer_id,\n created_at: Date.parse(customer.created_at),\n name: customer.name,\n email: customer.email,\n fingerprint: null,\n stripe_id: `cus_emulate_${customer.id}`,\n env: \"sandbox\",\n metadata: {},\n subscriptions: customer.subscriptions,\n products: [],\n features: {},\n invoices: [],\n purchases: [],\n balances: {},\n flags: {},\n billing_controls: {},\n };\n}\n\nfunction ensureCustomer(\n as: AutumnStore,\n id: string,\n data: { name?: unknown; email?: unknown },\n): AutumnCustomer {\n const existing = as.customers.findOneBy(\"customer_id\", id);\n if (existing) return existing;\n return as.customers.insert({\n customer_id: id,\n name: typeof data.name === \"string\" ? data.name : null,\n email: typeof data.email === \"string\" ? data.email : null,\n subscriptions: [],\n });\n}\n\n/** Autumn v1 RPC-style API (paths mirror autumn-js: /v1/<group>.<method>). */\nexport function autumnApiRoutes(ctx: RouteContext): void {\n const { app, store } = ctx;\n const as = () => getAutumnStore(store);\n\n app.post(\"/v1/customers.get_or_create\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const id = String(body.customer_id ?? body.id ?? \"\");\n if (!id) return c.json({ message: \"customer_id is required\", code: \"invalid_request\" }, 400);\n const data = (body.customer_data as Record<string, unknown> | undefined) ?? body;\n const customer = ensureCustomer(as(), id, data);\n return c.json(serializeCustomer(customer));\n });\n\n app.post(\"/v1/customers.list\", async (c) => {\n const customers = as().customers.all().map(serializeCustomer);\n return c.json({ list: customers, total: customers.length, offset: 0, limit: 100 });\n });\n\n app.post(\"/v1/customers.update\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const id = String(body.customer_id ?? body.id ?? \"\");\n const customer = as().customers.findOneBy(\"customer_id\", id);\n if (!customer) return c.json({ message: \"Customer not found\", code: \"not_found\" }, 404);\n const updated = as().customers.update(customer.id, {\n name: typeof body.name === \"string\" ? body.name : customer.name,\n email: typeof body.email === \"string\" ? body.email : customer.email,\n })!;\n return c.json(serializeCustomer(updated));\n });\n\n app.post(\"/v1/balances.track\", async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const customerId = String(body.customer_id ?? \"\");\n const featureId = String(body.feature_id ?? body.event_name ?? \"\");\n if (!customerId || !featureId) {\n return c.json({ message: \"customer_id and feature_id are required\", code: \"invalid_request\" }, 400);\n }\n ensureCustomer(as(), customerId, {});\n const event = as().events.insert({\n customer_id: customerId,\n feature_id: featureId,\n value: typeof body.value === \"number\" ? body.value : 1,\n });\n return c.json({\n id: `evt_emulate_${event.id}`,\n code: \"event_received\",\n customer_id: customerId,\n feature_id: featureId,\n });\n });\n\n app.post(\"/v1/plans.list\", async (c) => c.json({ list: [], total: 0, offset: 0, limit: 100 }));\n app.post(\"/v1/features.list\", async (c) =>\n c.json({ list: [], total: 0, offset: 0, limit: 100 }),\n );\n app.post(\"/v1/events.list\", async (c) => {\n const events = as()\n .events.all()\n .map((event) => ({\n id: `evt_emulate_${event.id}`,\n customer_id: event.customer_id,\n feature_id: event.feature_id,\n value: event.value,\n timestamp: Date.parse(event.created_at),\n }));\n return c.json({ list: events, total: events.length, offset: 0, limit: 100 });\n });\n}\n","import type { ServiceManifest } from \"@emulators/core\";\n\nexport const manifest: ServiceManifest = {\n id: \"autumn\",\n name: \"Autumn\",\n description:\n \"Stateful Autumn billing emulator: customers (with seedable subscriptions), usage tracking, and list endpoints for plans, features, and events.\",\n docsUrl: \"https://docs.emulators.dev/autumn\",\n surfaces: [{ id: \"rest\", kind: \"rest\", title: \"Autumn v1 API\", status: \"partial\", basePath: \"/v1\" }],\n auth: [{ id: \"api-key\", title: \"Autumn secret key\", type: \"api-key\", status: \"supported\" }],\n specs: [\n {\n kind: \"manual\",\n title: \"Autumn v1 subset\",\n coverage: \"hand-authored\",\n operations: [\n { operationId: \"customers.get_or_create\", method: \"POST\", path: \"/v1/customers.get_or_create\", status: \"hand-authored\" },\n { operationId: \"customers.list\", method: \"POST\", path: \"/v1/customers.list\", status: \"hand-authored\" },\n { operationId: \"customers.update\", method: \"POST\", path: \"/v1/customers.update\", status: \"hand-authored\" },\n { operationId: \"balances.track\", method: \"POST\", path: \"/v1/balances.track\", status: \"hand-authored\" },\n { operationId: \"plans.list\", method: \"POST\", path: \"/v1/plans.list\", status: \"hand-authored\" },\n { operationId: \"features.list\", method: \"POST\", path: \"/v1/features.list\", status: \"hand-authored\" },\n { operationId: \"events.list\", method: \"POST\", path: \"/v1/events.list\", status: \"hand-authored\" },\n ],\n },\n ],\n seedSchema: {\n description: \"Seed customers with subscriptions (e.g. a paid plan).\",\n fields: [\n {\n key: \"customers\",\n title: \"Customers\",\n description: \"Customers keyed by id, each with optional subscriptions.\",\n example: [{ id: \"org_123\", subscriptions: [{ plan_id: \"pro\", status: \"active\" }] }],\n },\n ],\n example: {\n customers: [{ id: \"org_123\", subscriptions: [{ plan_id: \"pro\", status: \"active\" }] }],\n },\n },\n stateModel: {\n description: \"Entities mutated by Autumn provider calls.\",\n collections: [{ name: \"autumn.customers\" }, { name: \"autumn.events\" }],\n },\n connections: [\n {\n id: \"autumn-js\",\n title: \"autumn-js SDK\",\n kind: \"sdk\",\n language: \"typescript\",\n description: \"Point autumn-js at the emulator via serverURL.\",\n template:\n 'import { Autumn } from \"autumn-js\";\\n\\nconst autumn = new Autumn({ secretKey: \"{{token}}\", serverURL: \"{{baseUrl}}\" });',\n },\n ],\n};\n","import type { Hono, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext, ServicePlugin } from \"@emulators/core\";\n\nimport { getAutumnStore, type AutumnStore } from \"./store.js\";\nimport { autumnApiRoutes } from \"./routes/api.js\";\nimport { manifest } from \"./manifest.js\";\nimport type { AutumnSubscription } from \"./entities.js\";\n\nexport { getAutumnStore, type AutumnStore } from \"./store.js\";\nexport * from \"./entities.js\";\nexport { manifest } from \"./manifest.js\";\n\nexport interface AutumnSeedConfig {\n customers?: Array<{\n id: string;\n name?: string;\n email?: string;\n subscriptions?: AutumnSubscription[];\n }>;\n}\n\nexport function seedFromConfig(store: Store, _baseUrl: string, config: AutumnSeedConfig): void {\n const as = getAutumnStore(store);\n for (const customer of config.customers ?? []) {\n const existing = as.customers.findOneBy(\"customer_id\", customer.id);\n if (existing) {\n as.customers.update(existing.id, {\n name: customer.name ?? existing.name,\n email: customer.email ?? existing.email,\n subscriptions: customer.subscriptions ?? existing.subscriptions,\n });\n continue;\n }\n as.customers.insert({\n customer_id: customer.id,\n name: customer.name ?? null,\n email: customer.email ?? null,\n subscriptions: customer.subscriptions ?? [],\n });\n }\n}\n\nexport const autumnPlugin: ServicePlugin = {\n name: \"autumn\",\n register(\n app: Hono<AppEnv>,\n store: Store,\n webhooks: WebhookDispatcher,\n baseUrl: string,\n tokenMap?: TokenMap,\n ): void {\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n autumnApiRoutes(ctx);\n },\n seed(_store: Store, _baseUrl: string): void {\n // No default seed; customers are created on first get_or_create.\n },\n};\n\nexport default autumnPlugin;\n"],"mappings":"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","names":[]}
|