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,42 @@
1
+ import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config'
2
+
3
+ export default defineWorkersConfig({
4
+ test: {
5
+ // CRITICAL: Limit concurrency to prevent resource exhaustion
6
+ maxConcurrency: 1,
7
+ maxWorkers: 1,
8
+ minWorkers: 1,
9
+ fileParallelism: false,
10
+
11
+ poolOptions: {
12
+ workers: {
13
+ wrangler: { configPath: './wrangler.jsonc' },
14
+ miniflare: {
15
+ compatibilityDate: '2025-01-20',
16
+ compatibilityFlags: ['nodejs_compat_v2'],
17
+ durableObjects: {
18
+ PRODUCT_CATALOG: 'ProductCatalog',
19
+ },
20
+ },
21
+ },
22
+ },
23
+
24
+ include: ['src/**/*.test.ts', 'test/**/*.test.ts'],
25
+ testTimeout: 60000, // AI calls can take time
26
+ hookTimeout: 30000,
27
+
28
+ // Coverage configuration
29
+ coverage: {
30
+ provider: 'v8',
31
+ reporter: ['text', 'json', 'html'],
32
+ include: ['src/**/*.ts'],
33
+ exclude: ['**/*.test.ts', '**/__tests__/**', '**/node_modules/**'],
34
+ thresholds: {
35
+ statements: 65,
36
+ branches: 60,
37
+ functions: 60,
38
+ lines: 65,
39
+ },
40
+ },
41
+ },
42
+ })
package/wrangler.jsonc ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ // Wrangler configuration for digital-products worker tests
3
+ // Used by @cloudflare/vitest-pool-workers for testing
4
+
5
+ "name": "digital-products",
6
+ "main": "src/worker.ts",
7
+ "compatibility_date": "2025-01-20",
8
+ "compatibility_flags": ["nodejs_compat_v2"],
9
+
10
+ // AI binding for Cloudflare Workers AI
11
+ // Enables real AI Gateway access in tests (cache: true for deterministic tests)
12
+ "ai": {
13
+ "binding": "AI"
14
+ },
15
+
16
+ // Durable Objects for product catalog persistence
17
+ "durable_objects": {
18
+ "bindings": [
19
+ { "name": "PRODUCT_CATALOG", "class_name": "ProductCatalog" }
20
+ ]
21
+ },
22
+
23
+ // Migrations for Durable Objects
24
+ "migrations": [
25
+ { "tag": "v1", "new_classes": ["ProductCatalog"] }
26
+ ],
27
+
28
+ // The default export (ProductService) extends WorkerEntrypoint
29
+ // All public methods are automatically exposed via RPC
30
+
31
+ // Environment variables for AI Gateway
32
+ // These are loaded from .dev.vars or .env in local development
33
+ "vars": {
34
+ // Placeholder - actual values come from .dev.vars
35
+ }
36
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 .org.ai
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,63 +0,0 @@
1
- /**
2
- * Feature Definition
3
- * Primitives for defining product features
4
- */
5
- /**
6
- * Feature status options
7
- */
8
- export type FeatureStatus = 'active' | 'beta' | 'deprecated' | 'disabled';
9
- /**
10
- * Feature definition
11
- */
12
- export interface FeatureDefinition {
13
- /** Unique identifier */
14
- id: string;
15
- /** Human-readable name */
16
- name: string;
17
- /** Description of the feature */
18
- description: string;
19
- /** Feature category */
20
- category?: string;
21
- /** Dependencies on other features */
22
- dependencies?: string[];
23
- /** Metadata */
24
- metadata?: Record<string, unknown>;
25
- /** Feature status */
26
- status?: FeatureStatus;
27
- /** Version */
28
- version?: string;
29
- }
30
- /**
31
- * Create a feature definition
32
- */
33
- export declare function Feature(config: Omit<FeatureDefinition, 'status'> & {
34
- status?: FeatureStatus;
35
- }): FeatureDefinition;
36
- /**
37
- * Create and validate a feature definition
38
- */
39
- export declare function defineFeature(config: Omit<FeatureDefinition, 'status'> & {
40
- status?: FeatureStatus;
41
- }): FeatureDefinition;
42
- /**
43
- * Feature registry interface
44
- */
45
- export interface FeatureRegistry {
46
- /** Register a feature */
47
- register(feature: FeatureDefinition): void;
48
- /** Get a feature by ID */
49
- get(id: string): FeatureDefinition | undefined;
50
- /** List all features */
51
- list(): FeatureDefinition[];
52
- /** List features by category */
53
- listByCategory(category: string): FeatureDefinition[];
54
- /** Get dependency graph for a feature */
55
- getDependencyGraph(featureId: string): string[];
56
- /** Clear registry */
57
- clear(): void;
58
- }
59
- /**
60
- * Create a feature registry
61
- */
62
- export declare function createFeatureRegistry(): FeatureRegistry;
63
- //# sourceMappingURL=define.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/features/define.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAA;AAEzE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,qBAAqB;IACrB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG,iBAAiB,CAWjH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GACrE,iBAAiB,CAMnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC1C,0BAA0B;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAA;IAC9C,wBAAwB;IACxB,IAAI,IAAI,iBAAiB,EAAE,CAAA;IAC3B,gCAAgC;IAChC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;IACrD,yCAAyC;IACzC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC/C,qBAAqB;IACrB,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CA+CvD"}
@@ -1,72 +0,0 @@
1
- /**
2
- * Feature Definition
3
- * Primitives for defining product features
4
- */
5
- /**
6
- * Create a feature definition
7
- */
8
- export function Feature(config) {
9
- return {
10
- id: config.id,
11
- name: config.name,
12
- description: config.description,
13
- category: config.category,
14
- dependencies: config.dependencies,
15
- metadata: config.metadata,
16
- status: config.status ?? 'active',
17
- version: config.version,
18
- };
19
- }
20
- /**
21
- * Create and validate a feature definition
22
- */
23
- export function defineFeature(config) {
24
- if (!config.id || config.id.trim() === '') {
25
- throw new Error('Feature ID is required');
26
- }
27
- return Feature(config);
28
- }
29
- /**
30
- * Create a feature registry
31
- */
32
- export function createFeatureRegistry() {
33
- const features = new Map();
34
- return {
35
- register(feature) {
36
- features.set(feature.id, feature);
37
- },
38
- get(id) {
39
- return features.get(id);
40
- },
41
- list() {
42
- return Array.from(features.values());
43
- },
44
- listByCategory(category) {
45
- return Array.from(features.values()).filter((f) => f.category === category);
46
- },
47
- getDependencyGraph(featureId) {
48
- const result = [];
49
- const visited = new Set();
50
- const traverse = (id) => {
51
- if (visited.has(id))
52
- return;
53
- visited.add(id);
54
- const feature = features.get(id);
55
- if (feature?.dependencies) {
56
- for (const depId of feature.dependencies) {
57
- traverse(depId);
58
- if (!result.includes(depId)) {
59
- result.push(depId);
60
- }
61
- }
62
- }
63
- };
64
- traverse(featureId);
65
- return result;
66
- },
67
- clear() {
68
- features.clear();
69
- },
70
- };
71
- }
72
- //# sourceMappingURL=define.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/features/define.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAsE;IAC5F,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsE;IAEtE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC;AAoBD;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAA;IAErD,OAAO;QACL,QAAQ,CAAC,OAA0B;YACjC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,EAAU;YACZ,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;QAED,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACtC,CAAC;QAED,cAAc,CAAC,QAAgB;YAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QAC7E,CAAC;QAED,kBAAkB,CAAC,SAAiB;YAClC,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;YAEjC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE;gBAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAM;gBAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAChC,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;oBAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;wBACzC,QAAQ,CAAC,KAAK,CAAC,CAAA;wBACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBACpB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;YAED,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,KAAK;YACH,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,98 +0,0 @@
1
- /**
2
- * Feature Flags
3
- * Runtime feature flag system
4
- */
5
- /**
6
- * Flag value types
7
- */
8
- export type FlagType = 'boolean' | 'string' | 'number' | 'json';
9
- /**
10
- * Targeting condition
11
- */
12
- export interface TargetingCondition {
13
- attribute: string;
14
- operator: 'equals' | 'not_equals' | 'in' | 'not_in' | 'gt' | 'lt' | 'gte' | 'lte' | 'contains';
15
- value: unknown;
16
- }
17
- /**
18
- * Targeting rule
19
- */
20
- export interface TargetingRule {
21
- condition: TargetingCondition;
22
- value: unknown;
23
- }
24
- /**
25
- * Feature flag definition
26
- */
27
- export interface FeatureFlagDefinition {
28
- /** Unique key */
29
- key: string;
30
- /** Human-readable name */
31
- name: string;
32
- /** Flag type */
33
- type: FlagType;
34
- /** Default value */
35
- defaultValue: unknown;
36
- /** Allowed variants (for string type) */
37
- variants?: string[];
38
- /** Min value (for number type) */
39
- min?: number;
40
- /** Max value (for number type) */
41
- max?: number;
42
- /** Targeting rules */
43
- rules?: TargetingRule[];
44
- /** Rollout percentage (0-100) */
45
- rolloutPercentage?: number;
46
- /** Description */
47
- description?: string;
48
- }
49
- /**
50
- * Create a feature flag
51
- */
52
- export declare function FeatureFlag(config: FeatureFlagDefinition): FeatureFlagDefinition;
53
- /**
54
- * Create a feature flag (alias)
55
- */
56
- export declare const createFeatureFlag: typeof FeatureFlag;
57
- /**
58
- * Evaluation context for flag evaluation
59
- */
60
- export interface FlagEvaluationContext {
61
- userId?: string;
62
- sessionId?: string;
63
- attributes?: Record<string, unknown>;
64
- }
65
- /**
66
- * Evaluation stats
67
- */
68
- export interface EvaluationStats {
69
- totalEvaluations: number;
70
- trueCount: number;
71
- falseCount: number;
72
- }
73
- /**
74
- * Feature flag manager interface
75
- */
76
- export interface FeatureFlagManager {
77
- /** Register a flag */
78
- register(flag: FeatureFlagDefinition): void;
79
- /** Get a flag by key */
80
- get(key: string): FeatureFlagDefinition | undefined;
81
- /** Evaluate a flag */
82
- evaluate(key: string, context: FlagEvaluationContext): unknown;
83
- /** Get evaluation stats */
84
- getEvaluationStats(key: string): EvaluationStats;
85
- /** Set override for testing */
86
- setOverride(key: string, value: unknown): void;
87
- /** Clear override */
88
- clearOverride(key: string): void;
89
- /** List all flags */
90
- list(): FeatureFlagDefinition[];
91
- /** Remove a flag */
92
- remove(key: string): void;
93
- }
94
- /**
95
- * Create a feature flag manager
96
- */
97
- export declare function createFeatureFlagManager(): FeatureFlagManager;
98
- //# sourceMappingURL=flags.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/features/flags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAA;IAC9F,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,kBAAkB,CAAA;IAC7B,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,CAahF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,oBAAc,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAC3C,wBAAwB;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAA;IACnD,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAA;IAC9D,2BAA2B;IAC3B,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;IAChD,+BAA+B;IAC/B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9C,qBAAqB;IACrB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,qBAAqB;IACrB,IAAI,IAAI,qBAAqB,EAAE,CAAA;IAC/B,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CA6H7D"}
@@ -1,145 +0,0 @@
1
- /**
2
- * Feature Flags
3
- * Runtime feature flag system
4
- */
5
- import { createHash } from 'crypto';
6
- /**
7
- * Create a feature flag
8
- */
9
- export function FeatureFlag(config) {
10
- return {
11
- key: config.key,
12
- name: config.name,
13
- type: config.type,
14
- defaultValue: config.defaultValue,
15
- variants: config.variants,
16
- min: config.min,
17
- max: config.max,
18
- rules: config.rules,
19
- rolloutPercentage: config.rolloutPercentage,
20
- description: config.description,
21
- };
22
- }
23
- /**
24
- * Create a feature flag (alias)
25
- */
26
- export const createFeatureFlag = FeatureFlag;
27
- /**
28
- * Create a feature flag manager
29
- */
30
- export function createFeatureFlagManager() {
31
- const flags = new Map();
32
- const overrides = new Map();
33
- const stats = new Map();
34
- const initStats = (key) => {
35
- if (!stats.has(key)) {
36
- stats.set(key, { totalEvaluations: 0, trueCount: 0, falseCount: 0 });
37
- }
38
- };
39
- const evaluateCondition = (condition, context) => {
40
- const attributeValue = context.attributes?.[condition.attribute];
41
- switch (condition.operator) {
42
- case 'equals':
43
- return attributeValue === condition.value;
44
- case 'not_equals':
45
- return attributeValue !== condition.value;
46
- case 'in':
47
- return Array.isArray(condition.value) && condition.value.includes(attributeValue);
48
- case 'not_in':
49
- return Array.isArray(condition.value) && !condition.value.includes(attributeValue);
50
- case 'gt':
51
- return typeof attributeValue === 'number' && attributeValue > condition.value;
52
- case 'lt':
53
- return typeof attributeValue === 'number' && attributeValue < condition.value;
54
- case 'gte':
55
- return typeof attributeValue === 'number' && attributeValue >= condition.value;
56
- case 'lte':
57
- return typeof attributeValue === 'number' && attributeValue <= condition.value;
58
- case 'contains':
59
- return typeof attributeValue === 'string' && attributeValue.includes(condition.value);
60
- default:
61
- return false;
62
- }
63
- };
64
- const hashUserToPercentage = (userId, key) => {
65
- const hash = createHash('md5').update(`${userId}-${key}`).digest('hex');
66
- const num = parseInt(hash.substring(0, 8), 16);
67
- return (num % 100) + 1;
68
- };
69
- return {
70
- register(flag) {
71
- flags.set(flag.key, flag);
72
- initStats(flag.key);
73
- },
74
- get(key) {
75
- return flags.get(key);
76
- },
77
- evaluate(key, context) {
78
- initStats(key);
79
- const flagStats = stats.get(key);
80
- flagStats.totalEvaluations++;
81
- // Check for override first
82
- if (overrides.has(key)) {
83
- const value = overrides.get(key);
84
- if (value === true)
85
- flagStats.trueCount++;
86
- else if (value === false)
87
- flagStats.falseCount++;
88
- return value;
89
- }
90
- const flag = flags.get(key);
91
- if (!flag) {
92
- return undefined;
93
- }
94
- // Check targeting rules
95
- if (flag.rules) {
96
- for (const rule of flag.rules) {
97
- if (evaluateCondition(rule.condition, context)) {
98
- const value = rule.value;
99
- if (value === true)
100
- flagStats.trueCount++;
101
- else if (value === false)
102
- flagStats.falseCount++;
103
- return value;
104
- }
105
- }
106
- }
107
- // Check rollout percentage
108
- if (flag.rolloutPercentage !== undefined && context.userId) {
109
- const userPercentage = hashUserToPercentage(context.userId, key);
110
- if (userPercentage <= flag.rolloutPercentage) {
111
- if (flag.type === 'boolean') {
112
- flagStats.trueCount++;
113
- return true;
114
- }
115
- }
116
- }
117
- // Return default value
118
- const value = flag.defaultValue;
119
- if (value === true)
120
- flagStats.trueCount++;
121
- else if (value === false)
122
- flagStats.falseCount++;
123
- return value;
124
- },
125
- getEvaluationStats(key) {
126
- initStats(key);
127
- return stats.get(key);
128
- },
129
- setOverride(key, value) {
130
- overrides.set(key, value);
131
- },
132
- clearOverride(key) {
133
- overrides.delete(key);
134
- },
135
- list() {
136
- return Array.from(flags.values());
137
- },
138
- remove(key) {
139
- flags.delete(key);
140
- overrides.delete(key);
141
- stats.delete(key);
142
- },
143
- };
144
- }
145
- //# sourceMappingURL=flags.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/features/flags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAkDnC;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAA6B;IACvD,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AA0C5C;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAA;IAEhD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;QACtE,CAAC;IACH,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CAAC,SAA6B,EAAE,OAA8B,EAAW,EAAE;QACnG,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAEhE,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC3B,KAAK,QAAQ;gBACX,OAAO,cAAc,KAAK,SAAS,CAAC,KAAK,CAAA;YAC3C,KAAK,YAAY;gBACf,OAAO,cAAc,KAAK,SAAS,CAAC,KAAK,CAAA;YAC3C,KAAK,IAAI;gBACP,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;YACnF,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;YACpF,KAAK,IAAI;gBACP,OAAO,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,GAAI,SAAS,CAAC,KAAgB,CAAA;YAC3F,KAAK,IAAI;gBACP,OAAO,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,GAAI,SAAS,CAAC,KAAgB,CAAA;YAC3F,KAAK,KAAK;gBACR,OAAO,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,IAAK,SAAS,CAAC,KAAgB,CAAA;YAC5F,KAAK,KAAK;gBACR,OAAO,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,IAAK,SAAS,CAAC,KAAgB,CAAA;YAC5F,KAAK,UAAU;gBACb,OAAO,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAe,CAAC,CAAA;YACjG;gBACE,OAAO,KAAK,CAAA;QAChB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,GAAW,EAAU,EAAE;QACnE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACvE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAA;IAED,OAAO;QACL,QAAQ,CAAC,IAA2B;YAClC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACzB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;QAED,GAAG,CAAC,GAAW;YACb,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QAED,QAAQ,CAAC,GAAW,EAAE,OAA8B;YAClD,SAAS,CAAC,GAAG,CAAC,CAAA;YACd,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YACjC,SAAS,CAAC,gBAAgB,EAAE,CAAA;YAE5B,2BAA2B;YAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAChC,IAAI,KAAK,KAAK,IAAI;oBAAE,SAAS,CAAC,SAAS,EAAE,CAAA;qBACpC,IAAI,KAAK,KAAK,KAAK;oBAAE,SAAS,CAAC,UAAU,EAAE,CAAA;gBAChD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,SAAS,CAAA;YAClB,CAAC;YAED,wBAAwB;YACxB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;wBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;wBACxB,IAAI,KAAK,KAAK,IAAI;4BAAE,SAAS,CAAC,SAAS,EAAE,CAAA;6BACpC,IAAI,KAAK,KAAK,KAAK;4BAAE,SAAS,CAAC,UAAU,EAAE,CAAA;wBAChD,OAAO,KAAK,CAAA;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC3D,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;gBAChE,IAAI,cAAc,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC5B,SAAS,CAAC,SAAS,EAAE,CAAA;wBACrB,OAAO,IAAI,CAAA;oBACb,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;YAC/B,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS,CAAC,SAAS,EAAE,CAAA;iBACpC,IAAI,KAAK,KAAK,KAAK;gBAAE,SAAS,CAAC,UAAU,EAAE,CAAA;YAChD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,kBAAkB,CAAC,GAAW;YAC5B,SAAS,CAAC,GAAG,CAAC,CAAA;YACd,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;QACxB,CAAC;QAED,WAAW,CAAC,GAAW,EAAE,KAAc;YACrC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3B,CAAC;QAED,aAAa,CAAC,GAAW;YACvB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QAED,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QACnC,CAAC;QAED,MAAM,CAAC,GAAW;YAChB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACjB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACrB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,75 +0,0 @@
1
- /**
2
- * Feature Toggles
3
- * Operational feature toggles for release management
4
- */
5
- /**
6
- * Toggle categories following Martin Fowler's feature toggle taxonomy
7
- */
8
- export type ToggleCategory = 'ops' | 'release' | 'experiment' | 'permission';
9
- /**
10
- * Feature toggle definition
11
- */
12
- export interface FeatureToggleDefinition {
13
- /** Toggle name */
14
- name: string;
15
- /** Category */
16
- category: ToggleCategory;
17
- /** Whether toggle is enabled */
18
- enabled: boolean;
19
- /** Description */
20
- description?: string;
21
- /** Release date (for release toggles) */
22
- releaseDate?: Date;
23
- /** Experiment ID (for experiment toggles) */
24
- experimentId?: string;
25
- /** Required roles (for permission toggles) */
26
- requiredRoles?: string[];
27
- /** Expiration date */
28
- expiresAt?: Date;
29
- }
30
- /**
31
- * Create a feature toggle
32
- */
33
- export declare function FeatureToggle(config: FeatureToggleDefinition): FeatureToggleDefinition;
34
- /**
35
- * Create a toggle (alias)
36
- */
37
- export declare const createToggle: typeof FeatureToggle;
38
- /**
39
- * Toggle evaluation context
40
- */
41
- export interface ToggleContext {
42
- roles?: string[];
43
- userId?: string;
44
- attributes?: Record<string, unknown>;
45
- }
46
- /**
47
- * Toggle service interface
48
- */
49
- export interface ToggleService {
50
- /** Register a toggle */
51
- register(toggle: FeatureToggleDefinition): void;
52
- /** Check if toggle is enabled */
53
- isEnabled(name: string, context?: ToggleContext): boolean;
54
- /** Enable a toggle */
55
- enable(name: string): void;
56
- /** Disable a toggle */
57
- disable(name: string): void;
58
- /** List toggles by category */
59
- listByCategory(category: ToggleCategory): FeatureToggleDefinition[];
60
- /** Bulk enable toggles */
61
- bulkEnable(names: string[]): void;
62
- /** Bulk disable toggles */
63
- bulkDisable(names: string[]): void;
64
- /** Export toggle state */
65
- export(): FeatureToggleDefinition[];
66
- /** Import toggle state */
67
- import(toggles: FeatureToggleDefinition[]): void;
68
- /** Get toggle by name */
69
- get(name: string): FeatureToggleDefinition | undefined;
70
- }
71
- /**
72
- * Create a toggle service
73
- */
74
- export declare function createToggleService(): ToggleService;
75
- //# sourceMappingURL=toggles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toggles.d.ts","sourceRoot":"","sources":["../../src/features/toggles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,sBAAsB;IACtB,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,uBAAuB,CAWtF;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,sBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAA;IAC/C,iCAAiC;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAA;IACzD,sBAAsB;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,uBAAuB;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,+BAA+B;IAC/B,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,uBAAuB,EAAE,CAAA;IACnE,0BAA0B;IAC1B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,2BAA2B;IAC3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAClC,0BAA0B;IAC1B,MAAM,IAAI,uBAAuB,EAAE,CAAA;IACnC,0BAA0B;IAC1B,MAAM,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAA;IAChD,yBAAyB;IACzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAAA;CACvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAiGnD"}