digital-products 2.1.3 → 2.4.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 (122) hide show
  1. package/.turbo/turbo-build.log +4 -5
  2. package/CHANGELOG.md +17 -0
  3. package/README.md +2 -0
  4. package/dist/api.js +7 -7
  5. package/dist/api.js.map +1 -1
  6. package/dist/app.js +6 -6
  7. package/dist/app.js.map +1 -1
  8. package/dist/client.d.ts +157 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +69 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/content.js +7 -7
  13. package/dist/content.js.map +1 -1
  14. package/dist/data.d.ts.map +1 -1
  15. package/dist/data.js +6 -6
  16. package/dist/data.js.map +1 -1
  17. package/dist/dataset.js +5 -5
  18. package/dist/dataset.js.map +1 -1
  19. package/dist/index.d.ts +92 -13
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +139 -15
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp.d.ts +1 -1
  24. package/dist/mcp.d.ts.map +1 -1
  25. package/dist/mcp.js +17 -10
  26. package/dist/mcp.js.map +1 -1
  27. package/dist/product.js +2 -2
  28. package/dist/product.js.map +1 -1
  29. package/dist/sdk.d.ts.map +1 -1
  30. package/dist/sdk.js +52 -16
  31. package/dist/sdk.js.map +1 -1
  32. package/dist/site.d.ts.map +1 -1
  33. package/dist/site.js +12 -8
  34. package/dist/site.js.map +1 -1
  35. package/dist/types.d.ts +830 -12
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/types.js +495 -2
  38. package/dist/types.js.map +1 -1
  39. package/dist/worker.d.ts +205 -0
  40. package/dist/worker.d.ts.map +1 -0
  41. package/dist/worker.js +356 -0
  42. package/dist/worker.js.map +1 -0
  43. package/package.json +29 -13
  44. package/src/api.ts +7 -7
  45. package/src/app.ts +6 -6
  46. package/src/client.ts +192 -0
  47. package/src/content.ts +7 -7
  48. package/src/data.ts +12 -7
  49. package/src/dataset.ts +5 -5
  50. package/src/index.ts +151 -15
  51. package/src/mcp.ts +18 -11
  52. package/src/product.ts +2 -2
  53. package/src/sdk.ts +54 -15
  54. package/src/site.ts +12 -8
  55. package/src/types.ts +821 -12
  56. package/src/worker.ts +525 -0
  57. package/test/product.test.ts +53 -198
  58. package/test/unified-types.test.ts +589 -0
  59. package/test/worker.test.ts +912 -0
  60. package/vitest.config.ts +42 -0
  61. package/wrangler.jsonc +36 -0
  62. package/LICENSE +0 -21
  63. package/dist/features/define.d.ts +0 -63
  64. package/dist/features/define.d.ts.map +0 -1
  65. package/dist/features/define.js +0 -72
  66. package/dist/features/define.js.map +0 -1
  67. package/dist/features/flags.d.ts +0 -98
  68. package/dist/features/flags.d.ts.map +0 -1
  69. package/dist/features/flags.js +0 -145
  70. package/dist/features/flags.js.map +0 -1
  71. package/dist/features/toggles.d.ts +0 -75
  72. package/dist/features/toggles.d.ts.map +0 -1
  73. package/dist/features/toggles.js +0 -107
  74. package/dist/features/toggles.js.map +0 -1
  75. package/dist/tiers/define.d.ts +0 -63
  76. package/dist/tiers/define.d.ts.map +0 -1
  77. package/dist/tiers/define.js +0 -78
  78. package/dist/tiers/define.js.map +0 -1
  79. package/dist/tiers/entitlements.d.ts +0 -94
  80. package/dist/tiers/entitlements.d.ts.map +0 -1
  81. package/dist/tiers/entitlements.js +0 -94
  82. package/dist/tiers/entitlements.js.map +0 -1
  83. package/src/api.js +0 -128
  84. package/src/app.js +0 -106
  85. package/src/content.js +0 -77
  86. package/src/data.js +0 -106
  87. package/src/dataset.js +0 -49
  88. package/src/entities/ai.js +0 -858
  89. package/src/entities/content.js +0 -783
  90. package/src/entities/index.js +0 -88
  91. package/src/entities/interfaces.js +0 -929
  92. package/src/entities/lifecycle.js +0 -803
  93. package/src/entities/products.js +0 -797
  94. package/src/entities/web.js +0 -657
  95. package/src/features/define.ts +0 -130
  96. package/src/features/flags.ts +0 -247
  97. package/src/features/toggles.ts +0 -189
  98. package/src/index.js +0 -35
  99. package/src/mcp.js +0 -139
  100. package/src/pricing/billing.ts +0 -386
  101. package/src/pricing/plans.ts +0 -214
  102. package/src/product.js +0 -53
  103. package/src/registry.js +0 -31
  104. package/src/sdk.js +0 -127
  105. package/src/site.js +0 -112
  106. package/src/tiers/define.ts +0 -137
  107. package/src/tiers/entitlements.ts +0 -201
  108. package/src/types.js +0 -4
  109. package/test/analytics/events.test.ts +0 -319
  110. package/test/analytics/experiments.test.ts +0 -327
  111. package/test/features/define.test.ts +0 -187
  112. package/test/features/flags.test.ts +0 -259
  113. package/test/features/toggles.test.ts +0 -178
  114. package/test/lifecycle/stages.test.ts +0 -233
  115. package/test/lifecycle/transitions.test.ts +0 -207
  116. package/test/onboarding/flows.test.ts +0 -307
  117. package/test/pricing/billing.test.ts +0 -287
  118. package/test/pricing/plans.test.ts +0 -307
  119. package/test/roadmap/milestones.test.ts +0 -231
  120. package/test/roadmap/priorities.test.ts +0 -239
  121. package/test/tiers/define.test.ts +0 -192
  122. package/test/tiers/entitlements.test.ts +0 -220
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Worker Export - WorkerEntrypoint for RPC access to Digital Products
3
+ *
4
+ * Exposes ProductServiceCore methods via Cloudflare RPC.
5
+ * Uses in-memory storage for products, features, versions, and bundles.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // wrangler.jsonc
10
+ * {
11
+ * "services": [
12
+ * { "binding": "PRODUCTS", "service": "digital-products" }
13
+ * ]
14
+ * }
15
+ *
16
+ * // worker.ts - consuming service
17
+ * export default {
18
+ * async fetch(request: Request, env: Env) {
19
+ * const service = env.PRODUCTS.connect()
20
+ * const product = await service.create({ name: 'My Product', description: 'Test', version: '1.0.0' })
21
+ * return Response.json(product)
22
+ * }
23
+ * }
24
+ * ```
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ import { WorkerEntrypoint, RpcTarget } from 'cloudflare:workers';
29
+ export interface ProductData {
30
+ id: string;
31
+ name: string;
32
+ description: string;
33
+ version: string;
34
+ status: 'draft' | 'active' | 'deprecated' | 'archived';
35
+ type?: string;
36
+ features?: FeatureData[];
37
+ metadata?: Record<string, unknown>;
38
+ tags?: string[];
39
+ createdAt: Date;
40
+ updatedAt: Date;
41
+ }
42
+ export interface FeatureData {
43
+ id: string;
44
+ name: string;
45
+ description: string;
46
+ status: 'draft' | 'beta' | 'ga' | 'deprecated';
47
+ productId: string;
48
+ metadata?: Record<string, unknown>;
49
+ createdAt: Date;
50
+ updatedAt: Date;
51
+ }
52
+ export interface VersionData {
53
+ id: string;
54
+ productId: string;
55
+ version: string;
56
+ changelog?: string;
57
+ status: 'draft' | 'published' | 'deprecated';
58
+ features?: string[];
59
+ metadata?: Record<string, unknown>;
60
+ createdAt: Date;
61
+ publishedAt?: Date;
62
+ }
63
+ export interface BundleData {
64
+ id: string;
65
+ name: string;
66
+ description: string;
67
+ productIds: string[];
68
+ pricing?: PricingData;
69
+ metadata?: Record<string, unknown>;
70
+ createdAt: Date;
71
+ updatedAt: Date;
72
+ }
73
+ export interface PricingData {
74
+ model: 'free' | 'one-time' | 'subscription' | 'usage-based';
75
+ amount?: number;
76
+ currency?: string;
77
+ interval?: 'month' | 'year';
78
+ }
79
+ export interface ListOptions {
80
+ limit?: number;
81
+ offset?: number;
82
+ status?: string;
83
+ type?: string;
84
+ orderBy?: string;
85
+ order?: 'asc' | 'desc';
86
+ }
87
+ /**
88
+ * DurableObjectNamespace type declaration for Cloudflare Workers
89
+ */
90
+ declare interface DurableObjectNamespace {
91
+ idFromName(name: string): DurableObjectId;
92
+ idFromString(id: string): DurableObjectId;
93
+ newUniqueId(): DurableObjectId;
94
+ get(id: DurableObjectId): DurableObjectStub;
95
+ }
96
+ declare interface DurableObjectId {
97
+ toString(): string;
98
+ }
99
+ declare interface DurableObjectStub {
100
+ fetch(request: Request): Promise<Response>;
101
+ }
102
+ /**
103
+ * Environment bindings for the worker
104
+ */
105
+ export interface Env {
106
+ AI?: unknown;
107
+ PRODUCT_CATALOG?: DurableObjectNamespace;
108
+ }
109
+ /**
110
+ * ProductServiceCore - RpcTarget with all product operations
111
+ *
112
+ * Provides CRUD for products, features, versions, and bundles.
113
+ */
114
+ export declare class ProductServiceCore extends RpcTarget {
115
+ private env;
116
+ constructor(env: Env);
117
+ /**
118
+ * Create a new product
119
+ */
120
+ create(data: Partial<ProductData>): Promise<ProductData>;
121
+ /**
122
+ * Get a product by ID
123
+ */
124
+ get(id: string): Promise<ProductData | null>;
125
+ /**
126
+ * Update a product
127
+ */
128
+ update(id: string, data: Partial<ProductData>): Promise<ProductData>;
129
+ /**
130
+ * Delete a product
131
+ */
132
+ delete(id: string): Promise<boolean>;
133
+ /**
134
+ * List products with optional filtering
135
+ */
136
+ list(options?: ListOptions): Promise<ProductData[]>;
137
+ /**
138
+ * Add a feature to a product
139
+ */
140
+ addFeature(productId: string, featureData: Partial<FeatureData>): Promise<FeatureData>;
141
+ /**
142
+ * Update a feature
143
+ */
144
+ updateFeature(featureId: string, data: Partial<FeatureData>): Promise<FeatureData>;
145
+ /**
146
+ * Remove a feature
147
+ */
148
+ removeFeature(featureId: string): Promise<boolean>;
149
+ /**
150
+ * List features for a product
151
+ */
152
+ listFeatures(productId: string): Promise<FeatureData[]>;
153
+ /**
154
+ * Publish a new version
155
+ */
156
+ publish(productId: string, versionStr: string, changelog?: string): Promise<VersionData>;
157
+ /**
158
+ * List versions for a product
159
+ */
160
+ listVersions(productId: string): Promise<VersionData[]>;
161
+ /**
162
+ * Get a specific version
163
+ */
164
+ getVersion(productId: string, versionStr: string): Promise<VersionData | null>;
165
+ /**
166
+ * Deprecate a version
167
+ */
168
+ deprecateVersion(productId: string, versionStr: string): Promise<VersionData>;
169
+ /**
170
+ * Compose a bundle from multiple products
171
+ */
172
+ compose(name: string, productIds: string[], options?: Partial<BundleData>): Promise<BundleData>;
173
+ /**
174
+ * Get a bundle by ID
175
+ */
176
+ getBundle(bundleId: string): Promise<BundleData | null>;
177
+ /**
178
+ * Update a bundle
179
+ */
180
+ updateBundle(bundleId: string, data: Partial<BundleData>): Promise<BundleData>;
181
+ /**
182
+ * List all bundles
183
+ */
184
+ listBundles(): Promise<BundleData[]>;
185
+ }
186
+ /**
187
+ * ProductService - WorkerEntrypoint for RPC access
188
+ *
189
+ * Provides `connect()` method that returns a ProductServiceCore instance
190
+ * with all product management operations.
191
+ */
192
+ export declare class ProductService extends WorkerEntrypoint<Env> {
193
+ env: Env;
194
+ /**
195
+ * Connect and get an RPC-enabled service
196
+ *
197
+ * @returns ProductServiceCore instance for RPC calls
198
+ */
199
+ connect(): ProductServiceCore;
200
+ }
201
+ /**
202
+ * Default export for Cloudflare Workers
203
+ */
204
+ export default ProductService;
205
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/dist/worker.js ADDED
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Worker Export - WorkerEntrypoint for RPC access to Digital Products
3
+ *
4
+ * Exposes ProductServiceCore methods via Cloudflare RPC.
5
+ * Uses in-memory storage for products, features, versions, and bundles.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // wrangler.jsonc
10
+ * {
11
+ * "services": [
12
+ * { "binding": "PRODUCTS", "service": "digital-products" }
13
+ * ]
14
+ * }
15
+ *
16
+ * // worker.ts - consuming service
17
+ * export default {
18
+ * async fetch(request: Request, env: Env) {
19
+ * const service = env.PRODUCTS.connect()
20
+ * const product = await service.create({ name: 'My Product', description: 'Test', version: '1.0.0' })
21
+ * return Response.json(product)
22
+ * }
23
+ * }
24
+ * ```
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ // @ts-expect-error cloudflare:workers is a Cloudflare Workers runtime module
29
+ import { WorkerEntrypoint, RpcTarget } from 'cloudflare:workers';
30
+ // =============================================================================
31
+ // In-Memory Storage
32
+ // =============================================================================
33
+ // Global storage maps for persistence across connect() calls
34
+ const products = new Map();
35
+ const features = new Map();
36
+ const versions = new Map();
37
+ const bundles = new Map();
38
+ /**
39
+ * Generate a unique ID
40
+ */
41
+ function generateId() {
42
+ return crypto.randomUUID();
43
+ }
44
+ // =============================================================================
45
+ // ProductServiceCore
46
+ // =============================================================================
47
+ /**
48
+ * ProductServiceCore - RpcTarget with all product operations
49
+ *
50
+ * Provides CRUD for products, features, versions, and bundles.
51
+ */
52
+ export class ProductServiceCore extends RpcTarget {
53
+ env;
54
+ constructor(env) {
55
+ super();
56
+ this.env = env;
57
+ }
58
+ // ==================== Product CRUD ====================
59
+ /**
60
+ * Create a new product
61
+ */
62
+ async create(data) {
63
+ // Validate required fields
64
+ if (!data.name || !data.description || !data.version) {
65
+ throw new Error('Missing required fields: name, description, and version are required');
66
+ }
67
+ const now = new Date();
68
+ const product = {
69
+ id: data.id || generateId(),
70
+ name: data.name,
71
+ description: data.description,
72
+ version: data.version,
73
+ status: data.status || 'draft',
74
+ createdAt: now,
75
+ updatedAt: now,
76
+ ...(data.type !== undefined && { type: data.type }),
77
+ ...(data.metadata !== undefined && { metadata: data.metadata }),
78
+ ...(data.tags !== undefined && { tags: data.tags }),
79
+ };
80
+ products.set(product.id, product);
81
+ return product;
82
+ }
83
+ /**
84
+ * Get a product by ID
85
+ */
86
+ async get(id) {
87
+ return products.get(id) || null;
88
+ }
89
+ /**
90
+ * Update a product
91
+ */
92
+ async update(id, data) {
93
+ const existing = products.get(id);
94
+ if (!existing) {
95
+ throw new Error(`Product not found: ${id}`);
96
+ }
97
+ const updated = {
98
+ ...existing,
99
+ ...data,
100
+ id: existing.id, // ID cannot be changed
101
+ createdAt: existing.createdAt, // createdAt cannot be changed
102
+ updatedAt: new Date(),
103
+ // Merge metadata if provided
104
+ ...(data.metadata ? { metadata: { ...existing.metadata, ...data.metadata } } : {}),
105
+ };
106
+ products.set(id, updated);
107
+ return updated;
108
+ }
109
+ /**
110
+ * Delete a product
111
+ */
112
+ async delete(id) {
113
+ const exists = products.has(id);
114
+ if (!exists) {
115
+ return false;
116
+ }
117
+ // Cascade delete features
118
+ for (const [featureId, feature] of features) {
119
+ if (feature.productId === id) {
120
+ features.delete(featureId);
121
+ }
122
+ }
123
+ // Cascade delete versions
124
+ for (const [versionId, version] of versions) {
125
+ if (version.productId === id) {
126
+ versions.delete(versionId);
127
+ }
128
+ }
129
+ products.delete(id);
130
+ return true;
131
+ }
132
+ /**
133
+ * List products with optional filtering
134
+ */
135
+ async list(options) {
136
+ let result = Array.from(products.values());
137
+ // Filter by status
138
+ if (options?.status) {
139
+ result = result.filter((p) => p.status === options.status);
140
+ }
141
+ // Filter by type
142
+ if (options?.type) {
143
+ result = result.filter((p) => p.type === options.type);
144
+ }
145
+ // Sort
146
+ if (options?.orderBy) {
147
+ const order = options.order || 'asc';
148
+ result.sort((a, b) => {
149
+ const aVal = a[options.orderBy];
150
+ const bVal = b[options.orderBy];
151
+ if (typeof aVal === 'string' && typeof bVal === 'string') {
152
+ return order === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);
153
+ }
154
+ if (aVal instanceof Date && bVal instanceof Date) {
155
+ return order === 'asc' ? aVal.getTime() - bVal.getTime() : bVal.getTime() - aVal.getTime();
156
+ }
157
+ return 0;
158
+ });
159
+ }
160
+ // Pagination
161
+ const offset = options?.offset || 0;
162
+ const limit = options?.limit || result.length;
163
+ result = result.slice(offset, offset + limit);
164
+ return result;
165
+ }
166
+ // ==================== Feature Operations ====================
167
+ /**
168
+ * Add a feature to a product
169
+ */
170
+ async addFeature(productId, featureData) {
171
+ const product = products.get(productId);
172
+ if (!product) {
173
+ throw new Error(`Product not found: ${productId}`);
174
+ }
175
+ if (!featureData.name || !featureData.description) {
176
+ throw new Error('Missing required fields: name and description are required');
177
+ }
178
+ const now = new Date();
179
+ const feature = {
180
+ id: featureData.id || generateId(),
181
+ name: featureData.name,
182
+ description: featureData.description,
183
+ status: featureData.status || 'draft',
184
+ productId,
185
+ createdAt: now,
186
+ updatedAt: now,
187
+ ...(featureData.metadata !== undefined && { metadata: featureData.metadata }),
188
+ };
189
+ features.set(feature.id, feature);
190
+ return feature;
191
+ }
192
+ /**
193
+ * Update a feature
194
+ */
195
+ async updateFeature(featureId, data) {
196
+ const existing = features.get(featureId);
197
+ if (!existing) {
198
+ throw new Error(`Feature not found: ${featureId}`);
199
+ }
200
+ const updated = {
201
+ ...existing,
202
+ ...data,
203
+ id: existing.id,
204
+ productId: existing.productId,
205
+ createdAt: existing.createdAt,
206
+ updatedAt: new Date(),
207
+ };
208
+ features.set(featureId, updated);
209
+ return updated;
210
+ }
211
+ /**
212
+ * Remove a feature
213
+ */
214
+ async removeFeature(featureId) {
215
+ return features.delete(featureId);
216
+ }
217
+ /**
218
+ * List features for a product
219
+ */
220
+ async listFeatures(productId) {
221
+ return Array.from(features.values()).filter((f) => f.productId === productId);
222
+ }
223
+ // ==================== Version Operations ====================
224
+ /**
225
+ * Publish a new version
226
+ */
227
+ async publish(productId, versionStr, changelog) {
228
+ const product = products.get(productId);
229
+ if (!product) {
230
+ throw new Error(`Product not found: ${productId}`);
231
+ }
232
+ // Check for duplicate version
233
+ const existingVersion = Array.from(versions.values()).find((v) => v.productId === productId && v.version === versionStr);
234
+ if (existingVersion) {
235
+ throw new Error(`Version ${versionStr} already exists for product ${productId}`);
236
+ }
237
+ const now = new Date();
238
+ const version = {
239
+ id: generateId(),
240
+ productId,
241
+ version: versionStr,
242
+ status: 'published',
243
+ createdAt: now,
244
+ publishedAt: now,
245
+ ...(changelog !== undefined && { changelog }),
246
+ };
247
+ versions.set(version.id, version);
248
+ return version;
249
+ }
250
+ /**
251
+ * List versions for a product
252
+ */
253
+ async listVersions(productId) {
254
+ return Array.from(versions.values()).filter((v) => v.productId === productId);
255
+ }
256
+ /**
257
+ * Get a specific version
258
+ */
259
+ async getVersion(productId, versionStr) {
260
+ return (Array.from(versions.values()).find((v) => v.productId === productId && v.version === versionStr) || null);
261
+ }
262
+ /**
263
+ * Deprecate a version
264
+ */
265
+ async deprecateVersion(productId, versionStr) {
266
+ const version = Array.from(versions.values()).find((v) => v.productId === productId && v.version === versionStr);
267
+ if (!version) {
268
+ throw new Error(`Version ${versionStr} not found for product ${productId}`);
269
+ }
270
+ version.status = 'deprecated';
271
+ versions.set(version.id, version);
272
+ return version;
273
+ }
274
+ // ==================== Bundle Operations ====================
275
+ /**
276
+ * Compose a bundle from multiple products
277
+ */
278
+ async compose(name, productIds, options) {
279
+ if (!productIds || productIds.length === 0) {
280
+ throw new Error('Bundle must contain at least one product');
281
+ }
282
+ // Verify all products exist
283
+ for (const productId of productIds) {
284
+ if (!products.has(productId)) {
285
+ throw new Error(`Product not found: ${productId}`);
286
+ }
287
+ }
288
+ const now = new Date();
289
+ const bundle = {
290
+ id: generateId(),
291
+ name,
292
+ description: options?.description || '',
293
+ productIds,
294
+ createdAt: now,
295
+ updatedAt: now,
296
+ ...(options?.pricing !== undefined && { pricing: options.pricing }),
297
+ ...(options?.metadata !== undefined && { metadata: options.metadata }),
298
+ };
299
+ bundles.set(bundle.id, bundle);
300
+ return bundle;
301
+ }
302
+ /**
303
+ * Get a bundle by ID
304
+ */
305
+ async getBundle(bundleId) {
306
+ return bundles.get(bundleId) || null;
307
+ }
308
+ /**
309
+ * Update a bundle
310
+ */
311
+ async updateBundle(bundleId, data) {
312
+ const existing = bundles.get(bundleId);
313
+ if (!existing) {
314
+ throw new Error(`Bundle not found: ${bundleId}`);
315
+ }
316
+ const updated = {
317
+ ...existing,
318
+ ...data,
319
+ id: existing.id,
320
+ createdAt: existing.createdAt,
321
+ updatedAt: new Date(),
322
+ };
323
+ bundles.set(bundleId, updated);
324
+ return updated;
325
+ }
326
+ /**
327
+ * List all bundles
328
+ */
329
+ async listBundles() {
330
+ return Array.from(bundles.values());
331
+ }
332
+ }
333
+ // =============================================================================
334
+ // ProductService (WorkerEntrypoint)
335
+ // =============================================================================
336
+ /**
337
+ * ProductService - WorkerEntrypoint for RPC access
338
+ *
339
+ * Provides `connect()` method that returns a ProductServiceCore instance
340
+ * with all product management operations.
341
+ */
342
+ export class ProductService extends WorkerEntrypoint {
343
+ /**
344
+ * Connect and get an RPC-enabled service
345
+ *
346
+ * @returns ProductServiceCore instance for RPC calls
347
+ */
348
+ connect() {
349
+ return new ProductServiceCore(this.env);
350
+ }
351
+ }
352
+ /**
353
+ * Default export for Cloudflare Workers
354
+ */
355
+ export default ProductService;
356
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "digital-products",
3
- "version": "2.1.3",
3
+ "version": "2.4.0",
4
4
  "description": "Primitives for defining and building digital products",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,11 +9,35 @@
9
9
  ".": {
10
10
  "import": "./dist/index.js",
11
11
  "types": "./dist/index.d.ts"
12
+ },
13
+ "./worker": {
14
+ "import": "./dist/worker.js",
15
+ "types": "./dist/worker.d.ts"
16
+ },
17
+ "./client": {
18
+ "import": "./dist/client.js",
19
+ "types": "./dist/client.d.ts"
12
20
  }
13
21
  },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc --watch",
25
+ "test": "vitest run",
26
+ "typecheck": "tsc --noEmit",
27
+ "lint": "eslint .",
28
+ "clean": "rm -rf dist"
29
+ },
14
30
  "dependencies": {
15
- "ai-database": "2.1.3",
16
- "ai-functions": "2.1.3"
31
+ "ai-database": "2.4.0",
32
+ "ai-functions": "2.4.0",
33
+ "rpc.do": "*",
34
+ "zod": "^3.23.0"
35
+ },
36
+ "devDependencies": {
37
+ "@cloudflare/vitest-pool-workers": "^0.8.0",
38
+ "@cloudflare/workers-types": "^4.20250124.0",
39
+ "vitest": "^2.0.0",
40
+ "wrangler": "^4.0.0"
17
41
  },
18
42
  "keywords": [
19
43
  "products",
@@ -22,13 +46,5 @@
22
46
  "digital",
23
47
  "primitives"
24
48
  ],
25
- "license": "MIT",
26
- "scripts": {
27
- "build": "tsc",
28
- "dev": "tsc --watch",
29
- "test": "vitest",
30
- "typecheck": "tsc --noEmit",
31
- "lint": "eslint .",
32
- "clean": "rm -rf dist"
33
- }
34
- }
49
+ "license": "MIT"
50
+ }
package/src/api.ts CHANGED
@@ -55,15 +55,15 @@ export function API(config: Omit<APIDefinition, 'type'>): APIDefinition {
55
55
  description: config.description,
56
56
  version: config.version,
57
57
  style: config.style || 'rest',
58
- baseUrl: config.baseUrl,
59
58
  endpoints: config.endpoints || [],
60
- auth: config.auth,
61
- rateLimit: config.rateLimit,
62
- docsUrl: config.docsUrl,
63
- openapi: config.openapi,
64
- metadata: config.metadata,
65
- tags: config.tags,
66
59
  status: config.status || 'active',
60
+ ...(config.baseUrl !== undefined && { baseUrl: config.baseUrl }),
61
+ ...(config.auth !== undefined && { auth: config.auth }),
62
+ ...(config.rateLimit !== undefined && { rateLimit: config.rateLimit }),
63
+ ...(config.docsUrl !== undefined && { docsUrl: config.docsUrl }),
64
+ ...(config.openapi !== undefined && { openapi: config.openapi }),
65
+ ...(config.metadata !== undefined && { metadata: config.metadata }),
66
+ ...(config.tags !== undefined && { tags: config.tags }),
67
67
  }
68
68
 
69
69
  return registerProduct(api)
package/src/app.ts CHANGED
@@ -44,13 +44,13 @@ export function App(config: Omit<AppDefinition, 'type'>): AppDefinition {
44
44
  version: config.version,
45
45
  framework: config.framework || 'react',
46
46
  routes: config.routes || [],
47
- config: config.config,
48
- state: config.state,
49
- auth: config.auth,
50
- deployments: config.deployments,
51
- metadata: config.metadata,
52
- tags: config.tags,
53
47
  status: config.status || 'active',
48
+ ...(config.config !== undefined && { config: config.config }),
49
+ ...(config.state !== undefined && { state: config.state }),
50
+ ...(config.auth !== undefined && { auth: config.auth }),
51
+ ...(config.deployments !== undefined && { deployments: config.deployments }),
52
+ ...(config.metadata !== undefined && { metadata: config.metadata }),
53
+ ...(config.tags !== undefined && { tags: config.tags }),
54
54
  }
55
55
 
56
56
  return registerProduct(app)