alchemy 0.32.0 → 0.33.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.
@@ -38,17 +38,56 @@ import { createStripeClient, handleStripeDeleteError } from "./client.js";
38
38
  * });
39
39
  *
40
40
  * @example
41
- * // Create a tiered price with tax behavior
42
- * const tieredPrice = await Price("enterprise", {
41
+ * // Create a graduated tiered price with usage-based billing
42
+ * const tieredPrice = await Price("api-usage", {
43
43
  * currency: "usd",
44
- * unitAmount: 10000, // $100.00
45
44
  * product: "prod_xyz",
46
45
  * billingScheme: "tiered",
47
- * taxBehavior: "exclusive",
48
- * metadata: {
49
- * tier: "enterprise",
50
- * features: "all"
51
- * }
46
+ * tiersMode: "graduated",
47
+ * recurring: {
48
+ * interval: "month",
49
+ * usageType: "metered"
50
+ * },
51
+ * tiers: [
52
+ * {
53
+ * upTo: 10000,
54
+ * unitAmount: 0 // First 10k API calls free
55
+ * },
56
+ * {
57
+ * upTo: 50000,
58
+ * unitAmount: 2 // $0.02 per call up to 50k
59
+ * },
60
+ * {
61
+ * upTo: "inf",
62
+ * unitAmount: 1 // $0.01 per call beyond 50k
63
+ * }
64
+ * ]
65
+ * });
66
+ *
67
+ * @example
68
+ * // Create a volume-based tiered price with overage cap
69
+ * const volumePrice = await Price("storage", {
70
+ * currency: "usd",
71
+ * product: "prod_xyz",
72
+ * billingScheme: "tiered",
73
+ * tiersMode: "volume",
74
+ * recurring: {
75
+ * interval: "month"
76
+ * },
77
+ * tiers: [
78
+ * {
79
+ * upTo: 100,
80
+ * unitAmount: 500 // $5 per GB for up to 100GB
81
+ * },
82
+ * {
83
+ * upTo: 1000,
84
+ * unitAmount: 400 // $4 per GB for 101-1000GB
85
+ * },
86
+ * {
87
+ * upTo: "inf",
88
+ * flatAmount: 300000 // Cap at $3000 for unlimited storage
89
+ * }
90
+ * ]
52
91
  * });
53
92
  */
54
93
  export const Price = Resource("stripe::Price", async function (_id, props) {
@@ -65,6 +104,16 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
65
104
  }
66
105
  return this.destroy();
67
106
  }
107
+ // Validate tier-related constraints
108
+ if (props.tiers && props.billingScheme !== "tiered") {
109
+ throw new Error("Tiers can only be used with billingScheme: 'tiered'");
110
+ }
111
+ if (props.tiers && (props.unitAmount || props.unitAmountDecimal)) {
112
+ throw new Error("Cannot set both tiers and unitAmount/unitAmountDecimal");
113
+ }
114
+ if (props.tiersMode && !props.tiers) {
115
+ throw new Error("tiersMode requires tiers to be defined");
116
+ }
68
117
  try {
69
118
  let price;
70
119
  if (this.phase === "update" && this.output?.id) {
@@ -75,6 +124,7 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
75
124
  nickname: props.nickname,
76
125
  lookup_key: props.lookupKey,
77
126
  transfer_lookup_key: props.transferLookupKey,
127
+ expand: ["tiers"],
78
128
  };
79
129
  price = await stripe.prices.update(this.output.id, updateParams);
80
130
  }
@@ -90,6 +140,7 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
90
140
  tax_behavior: props.taxBehavior,
91
141
  lookup_key: props.lookupKey,
92
142
  transfer_lookup_key: props.transferLookupKey,
143
+ expand: ["tiers"],
93
144
  };
94
145
  // Add unit amount fields
95
146
  if (props.unitAmount !== undefined) {
@@ -107,6 +158,26 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
107
158
  aggregate_usage: props.recurring.aggregateUsage,
108
159
  };
109
160
  }
161
+ // Add tier configuration if present
162
+ if (props.tiers) {
163
+ createParams.tiers = props.tiers.map((tier) => ({
164
+ up_to: tier.upTo === "inf" ? "inf" : tier.upTo,
165
+ flat_amount: tier.flatAmount,
166
+ flat_amount_decimal: tier.flatAmountDecimal,
167
+ unit_amount: tier.unitAmount,
168
+ unit_amount_decimal: tier.unitAmountDecimal,
169
+ }));
170
+ }
171
+ if (props.tiersMode) {
172
+ createParams.tiers_mode = props.tiersMode;
173
+ }
174
+ // Add transform quantity if present
175
+ if (props.transformQuantity) {
176
+ createParams.transform_quantity = {
177
+ divide_by: props.transformQuantity.divideBy,
178
+ round: props.transformQuantity.round,
179
+ };
180
+ }
110
181
  if (props.lookupKey) {
111
182
  const existingPrices = await stripe.prices.list({
112
183
  lookup_keys: [props.lookupKey],
@@ -121,11 +192,15 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
121
192
  nickname: props.nickname,
122
193
  lookup_key: props.lookupKey,
123
194
  transfer_lookup_key: props.transferLookupKey,
195
+ expand: ["tiers"],
124
196
  };
125
197
  price = await stripe.prices.update(existingPrice.id, updateParams);
126
198
  }
127
199
  else {
128
- price = existingPrices.data[0];
200
+ // Need to retrieve with expanded tiers
201
+ price = await stripe.prices.retrieve(existingPrices.data[0].id, {
202
+ expand: ["tiers"],
203
+ });
129
204
  }
130
205
  }
131
206
  else {
@@ -148,6 +223,23 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
148
223
  .aggregate_usage,
149
224
  }
150
225
  : undefined;
226
+ // Transform Stripe tiers array to our format
227
+ const tiers = price.tiers
228
+ ? price.tiers.map((tier) => ({
229
+ flatAmount: tier.flat_amount || undefined,
230
+ flatAmountDecimal: tier.flat_amount_decimal || undefined,
231
+ unitAmount: tier.unit_amount || undefined,
232
+ unitAmountDecimal: tier.unit_amount_decimal || undefined,
233
+ upTo: tier.up_to === null ? "inf" : tier.up_to,
234
+ }))
235
+ : undefined;
236
+ // Transform transform_quantity if present
237
+ const transformQuantity = price.transform_quantity
238
+ ? {
239
+ divideBy: price.transform_quantity.divide_by,
240
+ round: price.transform_quantity.round,
241
+ }
242
+ : undefined;
151
243
  // Map Stripe API response to our output format
152
244
  return this({
153
245
  id: price.id,
@@ -165,6 +257,9 @@ export const Price = Resource("stripe::Price", async function (_id, props) {
165
257
  livemode: price.livemode,
166
258
  type: price.type,
167
259
  lookupKey: price.lookup_key || undefined,
260
+ tiers: tiers,
261
+ tiersMode: price.tiers_mode ?? undefined,
262
+ transformQuantity: transformQuantity,
168
263
  });
169
264
  }
170
265
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"price.js","sourceRoot":"","sources":["../../src/stripe/price.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"price.js","sourceRoot":"","sources":["../../src/stripe/price.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.32.0",
3
+ "version": "0.33.0",
4
4
  "type": "module",
5
5
  "module": "./lib/index.js",
6
6
  "license": "Apache-2.0",
@@ -1,17 +1,9 @@
1
- import { writeFile } from "node:fs/promises";
2
1
  import path from "node:path";
3
- import { alchemy } from "../alchemy.ts";
4
- import { Exec } from "../os/exec.ts";
5
- import { Scope } from "../scope.ts";
6
- import { Assets } from "./assets.ts";
2
+ import type { Assets } from "./assets.ts";
7
3
  import type { Bindings } from "./bindings.ts";
8
- import type { Website, WebsiteProps } from "./website.ts";
9
- import {
10
- DEFAULT_COMPATIBILITY_DATE,
11
- Worker,
12
- type WorkerProps,
13
- } from "./worker.ts";
14
- import { WranglerJson } from "./wrangler.json.ts";
4
+ import type { WebsiteProps } from "./website.ts";
5
+ import { Website } from "./website.ts";
6
+ import type { Worker } from "./worker.ts";
15
7
 
16
8
  /**
17
9
  * Properties for creating an Astro resource.
@@ -71,7 +63,7 @@ export type Astro<B extends Bindings> = B extends { ASSETS: any }
71
63
  */
72
64
  export async function Astro<B extends Bindings>(
73
65
  id: string,
74
- props?: Partial<AstroProps<B>>,
66
+ props: AstroProps<B>,
75
67
  ): Promise<Astro<B>> {
76
68
  if (props?.bindings?.ASSETS) {
77
69
  throw new Error("ASSETS binding is reserved for internal use");
@@ -83,94 +75,15 @@ export async function Astro<B extends Bindings>(
83
75
  ? props?.assets
84
76
  : (props?.assets?.dist ?? "dist");
85
77
 
86
- return alchemy.run(
87
- id,
88
- {
89
- parent: Scope.current,
78
+ return Website(id, {
79
+ ...props,
80
+ noBundle: props.noBundle ?? true,
81
+ main,
82
+ assets: {
83
+ dist: assetsDir,
84
+ not_found_handling: "none",
85
+ run_worker_first: false,
90
86
  },
91
- async () => {
92
- const cwd = path.resolve(props?.cwd || process.cwd());
93
- const fileName =
94
- typeof wrangler === "boolean"
95
- ? "wrangler.jsonc"
96
- : typeof wrangler === "string"
97
- ? wrangler
98
- : (wrangler?.path ?? "wrangler.jsonc");
99
- const wranglerPath =
100
- fileName && path.relative(cwd, path.join(cwd, fileName));
101
- const wranglerMain =
102
- typeof wrangler === "object"
103
- ? (wrangler.main ?? props?.main)
104
- : props?.main;
105
-
106
- const workerName = props?.name ?? id;
107
-
108
- const workerProps = {
109
- ...props,
110
- compatibilityDate:
111
- props?.compatibilityDate ?? DEFAULT_COMPATIBILITY_DATE,
112
- compatibilityFlags: [
113
- "nodejs_compat",
114
- ...(props?.compatibilityFlags ?? []),
115
- ],
116
- name: workerName,
117
- entrypoint: main,
118
- assets: {
119
- html_handling: "auto-trailing-slash",
120
- not_found_handling: "single-page-application",
121
- run_worker_first: false,
122
- ...(typeof props?.assets === "string" ? {} : props?.assets),
123
- },
124
- script: props?.main
125
- ? undefined
126
- : `
127
- export default {
128
- async fetch(request, env) {
129
- return new Response("Not Found", { status: 404 });
130
- },
131
- };`,
132
- url: true,
133
- adopt: true,
134
- } as WorkerProps<any> & { name: string };
135
-
136
- if (wrangler) {
137
- await WranglerJson("wrangler.jsonc", {
138
- path: wranglerPath,
139
- worker: workerProps,
140
- main: wranglerMain,
141
- // hard-code the assets directory because we haven't yet included the assets binding
142
- assets: {
143
- binding: "ASSETS",
144
- directory: assetsDir,
145
- },
146
- });
147
- }
148
-
149
- if (props?.command) {
150
- await Exec("build", {
151
- cwd,
152
- command: props?.command,
153
- env: props?.env,
154
- memoize: props?.memoize,
155
- });
156
- }
157
-
158
- await writeFile(
159
- path.join(cwd, assetsDir, ".assetsignore"),
160
- ["_worker.js", "_routes.json"].join("\n"),
161
- );
162
-
163
- return (await Worker("worker", {
164
- ...workerProps,
165
- bindings: {
166
- ...workerProps.bindings,
167
- // we don't include the Assets binding until after build to make sure the asset manifest is correct
168
- // we generate the wrangler.json using all the bind
169
- ASSETS: await Assets("assets", {
170
- path: assetsDir,
171
- }),
172
- },
173
- } as WorkerProps<any> & { name: string })) as Website<B>;
174
- },
175
- );
87
+ wrangler,
88
+ });
176
89
  }
@@ -4,7 +4,8 @@ import type { Bindings } from "./bindings.ts";
4
4
  import { Website, type WebsiteProps } from "./website.ts";
5
5
  import type { Worker } from "./worker.ts";
6
6
 
7
- export interface ViteProps<B extends Bindings> extends WebsiteProps<B> {}
7
+ export interface ViteProps<B extends Bindings>
8
+ extends Omit<WebsiteProps<B>, "spa"> {}
8
9
 
9
10
  // don't allow the ASSETS to be overriden
10
11
  export type Vite<B extends Bindings> = B extends { ASSETS: any }
@@ -18,9 +19,11 @@ export async function Vite<B extends Bindings>(
18
19
  const defaultAssets = path.join("dist", "client");
19
20
  return Website(id, {
20
21
  ...props,
22
+ spa: true,
21
23
  assets:
22
24
  typeof props.assets === "object"
23
25
  ? {
26
+ ...props.assets,
24
27
  dist: props.assets.dist ?? defaultAssets,
25
28
  }
26
29
  : (props.assets ?? defaultAssets),
@@ -87,6 +87,13 @@ export interface WebsiteProps<B extends Bindings>
87
87
  // override main
88
88
  main?: string;
89
89
  };
90
+
91
+ /**
92
+ * Configures default routing to support client-side routing for Single Page Applications (SPA)
93
+ *
94
+ * @default false
95
+ */
96
+ spa?: boolean;
90
97
  }
91
98
 
92
99
  export type Website<B extends Bindings> = B extends { ASSETS: any }
@@ -137,7 +144,7 @@ export async function Website<B extends Bindings>(
137
144
  entrypoint: props.main,
138
145
  assets: {
139
146
  html_handling: "auto-trailing-slash",
140
- not_found_handling: "single-page-application",
147
+ not_found_handling: props.spa ? "single-page-application" : "none",
141
148
  run_worker_first: false,
142
149
  ...(typeof props.assets === "string" ? {} : props.assets),
143
150
  },
@@ -164,10 +164,6 @@ export function createAssetConfig(config?: AssetsConfig): AssetsConfig {
164
164
  if (config.run_worker_first !== undefined) {
165
165
  assetConfig.run_worker_first = config.run_worker_first;
166
166
  }
167
-
168
- if (config.serve_directly !== undefined) {
169
- assetConfig.serve_directly = config.serve_directly;
170
- }
171
167
  }
172
168
 
173
169
  return assetConfig;
@@ -80,7 +80,8 @@ export interface AssetsConfig {
80
80
 
81
81
  /**
82
82
  * Determines the redirects and rewrites of requests for HTML content
83
- * @default "auto-trailing-slash"
83
+ *
84
+ * @default auto-trailing-slash
84
85
  */
85
86
  html_handling?:
86
87
  | "auto-trailing-slash"
@@ -90,22 +91,18 @@ export interface AssetsConfig {
90
91
 
91
92
  /**
92
93
  * Determines the response when a request does not match a static asset, and there is no Worker script
94
+ *
95
+ * @default none
93
96
  */
94
97
  not_found_handling?: "none" | "404-page" | "single-page-application";
95
98
 
96
99
  /**
97
100
  * When true, requests will always invoke the Worker script.
98
101
  * Otherwise, attempt to serve an asset matching the request, falling back to the Worker script.
102
+ *
103
+ * @default false
99
104
  */
100
105
  run_worker_first?: boolean;
101
-
102
- /**
103
- * When true and the incoming request matches an asset, that will be served instead of invoking the Worker script.
104
- * When false, requests will always invoke the Worker script.
105
- * @default true
106
- * @deprecated
107
- */
108
- serve_directly?: boolean;
109
106
  }
110
107
 
111
108
  export interface BaseWorkerProps<