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.
Files changed (122) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +2 -0
  3. package/dist/api.js +7 -7
  4. package/dist/api.js.map +1 -1
  5. package/dist/app.js +6 -6
  6. package/dist/app.js.map +1 -1
  7. package/dist/client.d.ts +157 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +69 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/content.js +7 -7
  12. package/dist/content.js.map +1 -1
  13. package/dist/data.d.ts.map +1 -1
  14. package/dist/data.js +6 -6
  15. package/dist/data.js.map +1 -1
  16. package/dist/dataset.js +5 -5
  17. package/dist/dataset.js.map +1 -1
  18. package/dist/index.d.ts +92 -13
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +139 -15
  21. package/dist/index.js.map +1 -1
  22. package/dist/mcp.d.ts +1 -1
  23. package/dist/mcp.d.ts.map +1 -1
  24. package/dist/mcp.js +17 -10
  25. package/dist/mcp.js.map +1 -1
  26. package/dist/product.js +2 -2
  27. package/dist/product.js.map +1 -1
  28. package/dist/sdk.d.ts.map +1 -1
  29. package/dist/sdk.js +52 -16
  30. package/dist/sdk.js.map +1 -1
  31. package/dist/site.d.ts.map +1 -1
  32. package/dist/site.js +12 -8
  33. package/dist/site.js.map +1 -1
  34. package/dist/types.d.ts +830 -12
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js +495 -2
  37. package/dist/types.js.map +1 -1
  38. package/dist/worker.d.ts +205 -0
  39. package/dist/worker.d.ts.map +1 -0
  40. package/dist/worker.js +356 -0
  41. package/dist/worker.js.map +1 -0
  42. package/package.json +29 -13
  43. package/src/api.ts +7 -7
  44. package/src/app.ts +6 -6
  45. package/src/client.ts +192 -0
  46. package/src/content.ts +7 -7
  47. package/src/data.ts +12 -7
  48. package/src/dataset.ts +5 -5
  49. package/src/index.ts +151 -15
  50. package/src/mcp.ts +18 -11
  51. package/src/product.ts +2 -2
  52. package/src/sdk.ts +54 -15
  53. package/src/site.ts +12 -8
  54. package/src/types.ts +821 -12
  55. package/src/worker.ts +525 -0
  56. package/test/product.test.ts +53 -198
  57. package/test/unified-types.test.ts +589 -0
  58. package/test/worker.test.ts +912 -0
  59. package/vitest.config.ts +42 -0
  60. package/wrangler.jsonc +36 -0
  61. package/.turbo/turbo-build.log +0 -5
  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
@@ -1,220 +0,0 @@
1
- /**
2
- * Tests for Entitlements
3
- * Phase 1: RED - These tests should FAIL initially
4
- */
5
-
6
- import { describe, it, expect, beforeEach } from 'vitest'
7
- import {
8
- Entitlement,
9
- EntitlementType,
10
- EntitlementManager,
11
- createEntitlementManager,
12
- EntitlementCheck,
13
- } from '../../src/tiers/entitlements.js'
14
-
15
- describe('Entitlements', () => {
16
- describe('Entitlement()', () => {
17
- it('creates a boolean entitlement', () => {
18
- const entitlement = Entitlement({
19
- id: 'api-access',
20
- name: 'API Access',
21
- type: 'boolean',
22
- description: 'Access to REST API',
23
- })
24
-
25
- expect(entitlement.id).toBe('api-access')
26
- expect(entitlement.type).toBe('boolean')
27
- })
28
-
29
- it('creates a limit entitlement', () => {
30
- const entitlement = Entitlement({
31
- id: 'storage',
32
- name: 'Storage',
33
- type: 'limit',
34
- limit: 10,
35
- unit: 'GB',
36
- })
37
-
38
- expect(entitlement.type).toBe('limit')
39
- expect(entitlement.limit).toBe(10)
40
- expect(entitlement.unit).toBe('GB')
41
- })
42
-
43
- it('creates a quota entitlement', () => {
44
- const entitlement = Entitlement({
45
- id: 'api-calls',
46
- name: 'API Calls',
47
- type: 'quota',
48
- quota: 10000,
49
- period: 'monthly',
50
- })
51
-
52
- expect(entitlement.type).toBe('quota')
53
- expect(entitlement.quota).toBe(10000)
54
- expect(entitlement.period).toBe('monthly')
55
- })
56
-
57
- it('creates a feature entitlement', () => {
58
- const entitlement = Entitlement({
59
- id: 'advanced-analytics',
60
- name: 'Advanced Analytics',
61
- type: 'feature',
62
- featureId: 'analytics-v2',
63
- })
64
-
65
- expect(entitlement.type).toBe('feature')
66
- expect(entitlement.featureId).toBe('analytics-v2')
67
- })
68
-
69
- it('supports tier associations', () => {
70
- const entitlement = Entitlement({
71
- id: 'premium-support',
72
- name: 'Premium Support',
73
- type: 'boolean',
74
- tiers: ['pro', 'enterprise'],
75
- })
76
-
77
- expect(entitlement.tiers).toContain('pro')
78
- expect(entitlement.tiers).toContain('enterprise')
79
- })
80
- })
81
-
82
- describe('EntitlementManager', () => {
83
- let manager: EntitlementManager
84
-
85
- beforeEach(() => {
86
- manager = createEntitlementManager()
87
- })
88
-
89
- it('registers entitlements', () => {
90
- const entitlement = Entitlement({
91
- id: 'test-ent',
92
- name: 'Test',
93
- type: 'boolean',
94
- })
95
-
96
- manager.register(entitlement)
97
- expect(manager.get('test-ent')).toEqual(entitlement)
98
- })
99
-
100
- it('checks boolean entitlement access', () => {
101
- manager.register(
102
- Entitlement({
103
- id: 'api',
104
- name: 'API',
105
- type: 'boolean',
106
- tiers: ['pro', 'enterprise'],
107
- })
108
- )
109
-
110
- expect(manager.hasEntitlement('api', 'free')).toBe(false)
111
- expect(manager.hasEntitlement('api', 'pro')).toBe(true)
112
- expect(manager.hasEntitlement('api', 'enterprise')).toBe(true)
113
- })
114
-
115
- it('checks limit entitlement', () => {
116
- manager.register(
117
- Entitlement({
118
- id: 'users',
119
- name: 'Users',
120
- type: 'limit',
121
- limit: 5,
122
- tierLimits: {
123
- free: 5,
124
- pro: 25,
125
- enterprise: -1, // unlimited
126
- },
127
- })
128
- )
129
-
130
- expect(manager.getLimit('users', 'free')).toBe(5)
131
- expect(manager.getLimit('users', 'pro')).toBe(25)
132
- expect(manager.getLimit('users', 'enterprise')).toBe(-1)
133
- })
134
-
135
- it('checks quota entitlement with usage', () => {
136
- manager.register(
137
- Entitlement({
138
- id: 'api-calls',
139
- name: 'API Calls',
140
- type: 'quota',
141
- quota: 1000,
142
- period: 'monthly',
143
- tierQuotas: {
144
- free: 1000,
145
- pro: 50000,
146
- enterprise: -1,
147
- },
148
- })
149
- )
150
-
151
- const check: EntitlementCheck = {
152
- entitlementId: 'api-calls',
153
- tier: 'free',
154
- currentUsage: 500,
155
- requestedUsage: 1,
156
- }
157
-
158
- expect(manager.checkQuota(check)).toEqual({
159
- allowed: true,
160
- remaining: 499,
161
- limit: 1000,
162
- })
163
- })
164
-
165
- it('denies quota when exceeded', () => {
166
- manager.register(
167
- Entitlement({
168
- id: 'requests',
169
- name: 'Requests',
170
- type: 'quota',
171
- quota: 100,
172
- period: 'daily',
173
- tierQuotas: {
174
- free: 100,
175
- },
176
- })
177
- )
178
-
179
- const check: EntitlementCheck = {
180
- entitlementId: 'requests',
181
- tier: 'free',
182
- currentUsage: 100,
183
- requestedUsage: 1,
184
- }
185
-
186
- expect(manager.checkQuota(check)).toEqual({
187
- allowed: false,
188
- remaining: 0,
189
- limit: 100,
190
- })
191
- })
192
-
193
- it('gets all entitlements for a tier', () => {
194
- manager.register(
195
- Entitlement({ id: 'e1', name: 'E1', type: 'boolean', tiers: ['free', 'pro'] })
196
- )
197
- manager.register(Entitlement({ id: 'e2', name: 'E2', type: 'boolean', tiers: ['pro'] }))
198
- manager.register(
199
- Entitlement({ id: 'e3', name: 'E3', type: 'boolean', tiers: ['enterprise'] })
200
- )
201
-
202
- const freeEnts = manager.getEntitlementsForTier('free')
203
- expect(freeEnts).toHaveLength(1)
204
-
205
- const proEnts = manager.getEntitlementsForTier('pro')
206
- expect(proEnts).toHaveLength(2)
207
- })
208
-
209
- it('compares tier entitlements', () => {
210
- manager.register(
211
- Entitlement({ id: 'e1', name: 'E1', type: 'boolean', tiers: ['free', 'pro'] })
212
- )
213
- manager.register(Entitlement({ id: 'e2', name: 'E2', type: 'boolean', tiers: ['pro'] }))
214
-
215
- const diff = manager.compareEntitlements('free', 'pro')
216
- expect(diff.added).toContain('e2')
217
- expect(diff.removed).toHaveLength(0)
218
- })
219
- })
220
- })