digital-products 2.1.3 → 2.3.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/CHANGELOG.md +9 -0
- package/README.md +2 -0
- package/dist/api.js +7 -7
- package/dist/api.js.map +1 -1
- package/dist/app.js +6 -6
- package/dist/app.js.map +1 -1
- package/dist/client.d.ts +157 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +69 -0
- package/dist/client.js.map +1 -0
- package/dist/content.js +7 -7
- package/dist/content.js.map +1 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -6
- package/dist/data.js.map +1 -1
- package/dist/dataset.js +5 -5
- package/dist/dataset.js.map +1 -1
- package/dist/index.d.ts +92 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -15
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +17 -10
- package/dist/mcp.js.map +1 -1
- package/dist/product.js +2 -2
- package/dist/product.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +52 -16
- package/dist/sdk.js.map +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +12 -8
- package/dist/site.js.map +1 -1
- package/dist/types.d.ts +830 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +495 -2
- package/dist/types.js.map +1 -1
- package/dist/worker.d.ts +205 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +356 -0
- package/dist/worker.js.map +1 -0
- package/package.json +29 -13
- package/src/api.ts +7 -7
- package/src/app.ts +6 -6
- package/src/client.ts +192 -0
- package/src/content.ts +7 -7
- package/src/data.ts +12 -7
- package/src/dataset.ts +5 -5
- package/src/index.ts +151 -15
- package/src/mcp.ts +18 -11
- package/src/product.ts +2 -2
- package/src/sdk.ts +54 -15
- package/src/site.ts +12 -8
- package/src/types.ts +821 -12
- package/src/worker.ts +525 -0
- package/test/product.test.ts +53 -198
- package/test/unified-types.test.ts +589 -0
- package/test/worker.test.ts +912 -0
- package/vitest.config.ts +42 -0
- package/wrangler.jsonc +36 -0
- package/.turbo/turbo-build.log +0 -5
- package/LICENSE +0 -21
- package/dist/features/define.d.ts +0 -63
- package/dist/features/define.d.ts.map +0 -1
- package/dist/features/define.js +0 -72
- package/dist/features/define.js.map +0 -1
- package/dist/features/flags.d.ts +0 -98
- package/dist/features/flags.d.ts.map +0 -1
- package/dist/features/flags.js +0 -145
- package/dist/features/flags.js.map +0 -1
- package/dist/features/toggles.d.ts +0 -75
- package/dist/features/toggles.d.ts.map +0 -1
- package/dist/features/toggles.js +0 -107
- package/dist/features/toggles.js.map +0 -1
- package/dist/tiers/define.d.ts +0 -63
- package/dist/tiers/define.d.ts.map +0 -1
- package/dist/tiers/define.js +0 -78
- package/dist/tiers/define.js.map +0 -1
- package/dist/tiers/entitlements.d.ts +0 -94
- package/dist/tiers/entitlements.d.ts.map +0 -1
- package/dist/tiers/entitlements.js +0 -94
- package/dist/tiers/entitlements.js.map +0 -1
- package/src/api.js +0 -128
- package/src/app.js +0 -106
- package/src/content.js +0 -77
- package/src/data.js +0 -106
- package/src/dataset.js +0 -49
- package/src/entities/ai.js +0 -858
- package/src/entities/content.js +0 -783
- package/src/entities/index.js +0 -88
- package/src/entities/interfaces.js +0 -929
- package/src/entities/lifecycle.js +0 -803
- package/src/entities/products.js +0 -797
- package/src/entities/web.js +0 -657
- package/src/features/define.ts +0 -130
- package/src/features/flags.ts +0 -247
- package/src/features/toggles.ts +0 -189
- package/src/index.js +0 -35
- package/src/mcp.js +0 -139
- package/src/pricing/billing.ts +0 -386
- package/src/pricing/plans.ts +0 -214
- package/src/product.js +0 -53
- package/src/registry.js +0 -31
- package/src/sdk.js +0 -127
- package/src/site.js +0 -112
- package/src/tiers/define.ts +0 -137
- package/src/tiers/entitlements.ts +0 -201
- package/src/types.js +0 -4
- package/test/analytics/events.test.ts +0 -319
- package/test/analytics/experiments.test.ts +0 -327
- package/test/features/define.test.ts +0 -187
- package/test/features/flags.test.ts +0 -259
- package/test/features/toggles.test.ts +0 -178
- package/test/lifecycle/stages.test.ts +0 -233
- package/test/lifecycle/transitions.test.ts +0 -207
- package/test/onboarding/flows.test.ts +0 -307
- package/test/pricing/billing.test.ts +0 -287
- package/test/pricing/plans.test.ts +0 -307
- package/test/roadmap/milestones.test.ts +0 -231
- package/test/roadmap/priorities.test.ts +0 -239
- package/test/tiers/define.test.ts +0 -192
- package/test/tiers/entitlements.test.ts +0 -220
package/dist/worker.d.ts
ADDED
|
@@ -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.
|
|
3
|
+
"version": "2.3.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.
|
|
16
|
-
"ai-functions": "2.
|
|
31
|
+
"ai-database": "2.3.0",
|
|
32
|
+
"ai-functions": "2.3.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
|
-
|
|
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)
|