@arthurzakharov/convert-service 1.0.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 (54) hide show
  1. package/README.md +428 -0
  2. package/dist/app.d.ts +3 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +37 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/client.d.ts +60 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +207 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/contracts.d.ts +205 -0
  11. package/dist/contracts.d.ts.map +1 -0
  12. package/dist/contracts.js +3 -0
  13. package/dist/contracts.js.map +1 -0
  14. package/dist/convert/client.d.ts +7 -0
  15. package/dist/convert/client.d.ts.map +1 -0
  16. package/dist/convert/client.js +61 -0
  17. package/dist/convert/client.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +23 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/routes/bucket.d.ts +3 -0
  23. package/dist/routes/bucket.d.ts.map +1 -0
  24. package/dist/routes/bucket.js +52 -0
  25. package/dist/routes/bucket.js.map +1 -0
  26. package/dist/routes/convert-route-utils.d.ts +20 -0
  27. package/dist/routes/convert-route-utils.d.ts.map +1 -0
  28. package/dist/routes/convert-route-utils.js +123 -0
  29. package/dist/routes/convert-route-utils.js.map +1 -0
  30. package/dist/routes/experiences.d.ts +3 -0
  31. package/dist/routes/experiences.d.ts.map +1 -0
  32. package/dist/routes/experiences.js +120 -0
  33. package/dist/routes/experiences.js.map +1 -0
  34. package/dist/routes/features.d.ts +3 -0
  35. package/dist/routes/features.d.ts.map +1 -0
  36. package/dist/routes/features.js +126 -0
  37. package/dist/routes/features.js.map +1 -0
  38. package/dist/routes/health.d.ts +3 -0
  39. package/dist/routes/health.d.ts.map +1 -0
  40. package/dist/routes/health.js +16 -0
  41. package/dist/routes/health.js.map +1 -0
  42. package/dist/routes/track.d.ts +3 -0
  43. package/dist/routes/track.d.ts.map +1 -0
  44. package/dist/routes/track.js +37 -0
  45. package/dist/routes/track.js.map +1 -0
  46. package/dist/utils/logger.d.ts +11 -0
  47. package/dist/utils/logger.d.ts.map +1 -0
  48. package/dist/utils/logger.js +136 -0
  49. package/dist/utils/logger.js.map +1 -0
  50. package/dist/utils/segments.d.ts +25 -0
  51. package/dist/utils/segments.d.ts.map +1 -0
  52. package/dist/utils/segments.js +103 -0
  53. package/dist/utils/segments.js.map +1 -0
  54. package/package.json +60 -0
package/dist/client.js ADDED
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConvertServiceClient = exports.ConvertServiceError = void 0;
4
+ exports.createConvertServiceClient = createConvertServiceClient;
5
+ class ConvertServiceError extends Error {
6
+ constructor(message, status, payload) {
7
+ super(message);
8
+ this.name = 'ConvertServiceError';
9
+ this.status = status;
10
+ this.payload = payload;
11
+ }
12
+ }
13
+ exports.ConvertServiceError = ConvertServiceError;
14
+ class ConvertServiceClient {
15
+ constructor(options) {
16
+ this.baseUrl = options.baseUrl.replace(/\/+$/, '');
17
+ this.projectKey = options.projectKey;
18
+ this.visitorId = options.visitorId;
19
+ this.visitorCookieName = options.visitorCookieName ?? 'convert_visitor_id';
20
+ this.visitorCookieMaxAgeDays = options.visitorCookieMaxAgeDays ?? 365;
21
+ this.fetcher = options.fetcher ?? fetch.bind(globalThis);
22
+ this.credentials = options.credentials ?? 'include';
23
+ this.defaultVisitorProperties = options.defaultVisitorProperties;
24
+ this.defaultLocationProperties = options.defaultLocationProperties;
25
+ this.defaultHeaders = options.defaultHeaders;
26
+ }
27
+ getVisitorId() {
28
+ if (this.visitorId)
29
+ return this.visitorId;
30
+ const existing = readCookie(this.visitorCookieName);
31
+ if (existing) {
32
+ this.visitorId = existing;
33
+ return existing;
34
+ }
35
+ const next = createVisitorId();
36
+ writeCookie(this.visitorCookieName, next, this.visitorCookieMaxAgeDays);
37
+ this.visitorId = next;
38
+ return next;
39
+ }
40
+ setVisitorId(visitorId) {
41
+ this.visitorId = visitorId;
42
+ writeCookie(this.visitorCookieName, visitorId, this.visitorCookieMaxAgeDays);
43
+ }
44
+ async request(endpoint, request) {
45
+ const [method, pathTemplate] = endpoint.split(' ');
46
+ const requestData = (request ?? {});
47
+ const path = interpolatePath(pathTemplate, requestData);
48
+ const url = new URL(`${this.baseUrl}${path}`);
49
+ const init = {
50
+ method,
51
+ credentials: this.credentials,
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ ...this.defaultHeaders,
55
+ },
56
+ };
57
+ if (method === 'GET') {
58
+ appendQueryParams(url, requestData, pathTemplate);
59
+ }
60
+ else {
61
+ init.body = JSON.stringify(request);
62
+ }
63
+ const response = await this.fetcher(url.toString(), init);
64
+ const payload = await parseResponse(response);
65
+ if (!response.ok) {
66
+ const message = payload && typeof payload === 'object' && 'error' in payload
67
+ ? String(payload.error)
68
+ : `Convert service request failed with ${response.status}`;
69
+ throw new ConvertServiceError(message, response.status, payload);
70
+ }
71
+ return payload;
72
+ }
73
+ health() {
74
+ return this.request('GET /health', undefined);
75
+ }
76
+ bucket(request = {}) {
77
+ return this.request('POST /bucket', this.withBucketingDefaults(request));
78
+ }
79
+ listExperiences(request = {}) {
80
+ return this.request('GET /experiences', this.withProject(request));
81
+ }
82
+ getExperienceByKey(request) {
83
+ return this.request('GET /experiences/:experienceKey', this.withProject(request));
84
+ }
85
+ getExperienceById(request) {
86
+ return this.request('GET /experiences/by-id/:experienceId', this.withProject(request));
87
+ }
88
+ getVariationByKey(request) {
89
+ return this.request('GET /experiences/:experienceKey/variations/:variationKey', this.withProject(request));
90
+ }
91
+ getVariationById(request) {
92
+ return this.request('GET /experiences/by-id/:experienceId/variations/:variationId', this.withProject(request));
93
+ }
94
+ runExperience(request) {
95
+ return this.request('POST /experiences/run', this.withBucketingDefaults(request));
96
+ }
97
+ runExperienceById(request) {
98
+ return this.request('POST /experiences/run-by-id', this.withBucketingDefaults(request));
99
+ }
100
+ listFeatures(request = {}) {
101
+ return this.request('GET /features', this.withProject(request));
102
+ }
103
+ getFeatureByKey(request) {
104
+ return this.request('GET /features/:featureKey', this.withProject(request));
105
+ }
106
+ getFeatureById(request) {
107
+ return this.request('GET /features/by-id/:featureId', this.withProject(request));
108
+ }
109
+ runFeatures(request = {}) {
110
+ return this.request('POST /features/run-all', this.withBucketingDefaults(request));
111
+ }
112
+ runFeature(request) {
113
+ return this.request('POST /features/run', this.withBucketingDefaults(request));
114
+ }
115
+ runFeatureById(request) {
116
+ return this.request('POST /features/run-by-id', this.withBucketingDefaults(request));
117
+ }
118
+ trackConversion(request) {
119
+ return this.request('POST /track', this.withVisitorDefaults(request));
120
+ }
121
+ withProject(request) {
122
+ return {
123
+ ...request,
124
+ projectKey: request.projectKey ?? this.projectKey,
125
+ };
126
+ }
127
+ withVisitorDefaults(request) {
128
+ return {
129
+ ...request,
130
+ projectKey: request.projectKey ?? this.projectKey,
131
+ visitorId: request.visitorId ?? this.getVisitorId(),
132
+ };
133
+ }
134
+ withBucketingDefaults(request) {
135
+ return {
136
+ ...request,
137
+ projectKey: request.projectKey ?? this.projectKey,
138
+ visitorId: request.visitorId ?? this.getVisitorId(),
139
+ visitorProperties: mergeRecords(this.defaultVisitorProperties, request.visitorProperties),
140
+ locationProperties: mergeRecords(this.defaultLocationProperties, request.locationProperties),
141
+ };
142
+ }
143
+ }
144
+ exports.ConvertServiceClient = ConvertServiceClient;
145
+ function createConvertServiceClient(options) {
146
+ return new ConvertServiceClient(options);
147
+ }
148
+ function interpolatePath(path, request) {
149
+ return path.replace(/:([A-Za-z0-9_]+)/g, (_, key) => {
150
+ const value = request[key];
151
+ if (value === undefined || value === null || value === '') {
152
+ throw new Error(`Missing path parameter: ${key}`);
153
+ }
154
+ return encodeURIComponent(String(value));
155
+ });
156
+ }
157
+ function appendQueryParams(url, request, pathTemplate) {
158
+ const pathParamNames = new Set([...pathTemplate.matchAll(/:([A-Za-z0-9_]+)/g)].map((match) => match[1]));
159
+ Object.entries(request).forEach(([key, value]) => {
160
+ if (pathParamNames.has(key) || value === undefined || value === null)
161
+ return;
162
+ url.searchParams.set(key, String(value));
163
+ });
164
+ }
165
+ async function parseResponse(response) {
166
+ const text = await response.text();
167
+ if (!text)
168
+ return null;
169
+ try {
170
+ return JSON.parse(text);
171
+ }
172
+ catch {
173
+ return text;
174
+ }
175
+ }
176
+ function readCookie(name) {
177
+ if (typeof document === 'undefined')
178
+ return undefined;
179
+ const encodedName = encodeURIComponent(name);
180
+ const cookie = document.cookie
181
+ .split('; ')
182
+ .find((item) => item.startsWith(`${encodedName}=`));
183
+ if (!cookie)
184
+ return undefined;
185
+ return decodeURIComponent(cookie.slice(encodedName.length + 1));
186
+ }
187
+ function writeCookie(name, value, maxAgeDays) {
188
+ if (typeof document === 'undefined')
189
+ return;
190
+ const maxAge = Math.round(maxAgeDays * 24 * 60 * 60);
191
+ document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; Path=/; Max-Age=${maxAge}; SameSite=Lax`;
192
+ }
193
+ function createVisitorId() {
194
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
195
+ return crypto.randomUUID();
196
+ }
197
+ return `visitor_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;
198
+ }
199
+ function mergeRecords(defaults, overrides) {
200
+ if (!defaults && !overrides)
201
+ return undefined;
202
+ return {
203
+ ...defaults,
204
+ ...overrides,
205
+ };
206
+ }
207
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import type { ConfigExperience, ConfigFeature, ConversionAttributes, ExperienceChange, ExperienceVariationConfig } from '@convertcom/js-sdk';
2
+ export type ProjectKey = 'passexperten' | 'bussgeldcheck';
3
+ export interface ApiErrorResponse {
4
+ error: string;
5
+ }
6
+ export interface SharedBucketingRequest {
7
+ projectKey: ProjectKey;
8
+ visitorId: string;
9
+ visitorProperties?: Record<string, unknown>;
10
+ locationProperties?: Record<string, unknown>;
11
+ pageUrl?: string;
12
+ campaign?: string;
13
+ updateVisitorProperties?: boolean;
14
+ forceVariationId?: string;
15
+ enableTracking?: boolean;
16
+ environment?: string;
17
+ typeCasting?: boolean;
18
+ experienceKeys?: string[];
19
+ }
20
+ export interface SerializedVariation {
21
+ id?: string;
22
+ experienceId?: string;
23
+ experienceKey?: string;
24
+ experienceName?: string;
25
+ variationKey?: string;
26
+ variationName?: string;
27
+ status?: string;
28
+ bucketingAllocation?: number;
29
+ changes: ExperienceChange[];
30
+ }
31
+ export interface SerializedFeature {
32
+ experienceId?: string;
33
+ experienceKey?: string;
34
+ experienceName?: string;
35
+ id?: string;
36
+ key?: string;
37
+ name?: string;
38
+ status: string;
39
+ variables: Record<string, unknown>;
40
+ }
41
+ export type BucketRequest = SharedBucketingRequest;
42
+ export interface BucketResponse {
43
+ visitorId: string;
44
+ variations: SerializedVariation[];
45
+ }
46
+ export interface ListExperiencesRequest {
47
+ projectKey: ProjectKey;
48
+ }
49
+ export interface ListExperiencesResponse {
50
+ experiences: ConfigExperience[];
51
+ }
52
+ export interface GetExperienceByKeyRequest {
53
+ projectKey: ProjectKey;
54
+ experienceKey: string;
55
+ }
56
+ export interface GetExperienceByIdRequest {
57
+ projectKey: ProjectKey;
58
+ experienceId: string;
59
+ }
60
+ export interface GetExperienceResponse {
61
+ experience: ConfigExperience;
62
+ }
63
+ export interface GetVariationByKeyRequest {
64
+ projectKey: ProjectKey;
65
+ experienceKey: string;
66
+ variationKey: string;
67
+ }
68
+ export interface GetVariationByIdRequest {
69
+ projectKey: ProjectKey;
70
+ experienceId: string;
71
+ variationId: string;
72
+ }
73
+ export interface GetVariationResponse {
74
+ variation: ExperienceVariationConfig;
75
+ }
76
+ export type RunExperienceRequest = SharedBucketingRequest & {
77
+ experienceKey: string;
78
+ };
79
+ export type RunExperienceByIdRequest = SharedBucketingRequest & {
80
+ experienceId: string;
81
+ };
82
+ export interface RunExperienceResponse {
83
+ visitorId: string;
84
+ variation: SerializedVariation | null;
85
+ reason?: string | null;
86
+ }
87
+ export interface ListFeaturesRequest {
88
+ projectKey: ProjectKey;
89
+ }
90
+ export interface ListFeaturesResponse {
91
+ features: ConfigFeature[];
92
+ }
93
+ export interface GetFeatureByKeyRequest {
94
+ projectKey: ProjectKey;
95
+ featureKey: string;
96
+ }
97
+ export interface GetFeatureByIdRequest {
98
+ projectKey: ProjectKey;
99
+ featureId: string;
100
+ }
101
+ export interface GetFeatureResponse {
102
+ feature: ConfigFeature;
103
+ }
104
+ export type RunFeaturesRequest = SharedBucketingRequest;
105
+ export interface RunFeaturesResponse {
106
+ visitorId: string;
107
+ features: SerializedFeature[];
108
+ }
109
+ export type RunFeatureRequest = SharedBucketingRequest & {
110
+ featureKey: string;
111
+ };
112
+ export type RunFeatureByIdRequest = SharedBucketingRequest & {
113
+ featureId: string;
114
+ };
115
+ export interface RunFeatureResponse {
116
+ visitorId: string;
117
+ feature: SerializedFeature | null;
118
+ features: SerializedFeature[];
119
+ reason?: string | string[] | null;
120
+ }
121
+ export interface TrackConversionRequest {
122
+ projectKey: ProjectKey;
123
+ visitorId: string;
124
+ goalKey: string;
125
+ attributes?: ConversionAttributes;
126
+ }
127
+ export interface TrackConversionResponse {
128
+ success: true;
129
+ }
130
+ export interface HealthResponse {
131
+ status: 'ok';
132
+ version: string;
133
+ commit: string;
134
+ timestamp: string;
135
+ }
136
+ export interface ConvertApiEndpoints {
137
+ 'GET /health': {
138
+ request: undefined;
139
+ response: HealthResponse;
140
+ };
141
+ 'POST /bucket': {
142
+ request: BucketRequest;
143
+ response: BucketResponse;
144
+ };
145
+ 'GET /experiences': {
146
+ request: ListExperiencesRequest;
147
+ response: ListExperiencesResponse;
148
+ };
149
+ 'GET /experiences/:experienceKey': {
150
+ request: GetExperienceByKeyRequest;
151
+ response: GetExperienceResponse;
152
+ };
153
+ 'GET /experiences/by-id/:experienceId': {
154
+ request: GetExperienceByIdRequest;
155
+ response: GetExperienceResponse;
156
+ };
157
+ 'GET /experiences/:experienceKey/variations/:variationKey': {
158
+ request: GetVariationByKeyRequest;
159
+ response: GetVariationResponse;
160
+ };
161
+ 'GET /experiences/by-id/:experienceId/variations/:variationId': {
162
+ request: GetVariationByIdRequest;
163
+ response: GetVariationResponse;
164
+ };
165
+ 'POST /experiences/run': {
166
+ request: RunExperienceRequest;
167
+ response: RunExperienceResponse;
168
+ };
169
+ 'POST /experiences/run-by-id': {
170
+ request: RunExperienceByIdRequest;
171
+ response: RunExperienceResponse;
172
+ };
173
+ 'GET /features': {
174
+ request: ListFeaturesRequest;
175
+ response: ListFeaturesResponse;
176
+ };
177
+ 'GET /features/:featureKey': {
178
+ request: GetFeatureByKeyRequest;
179
+ response: GetFeatureResponse;
180
+ };
181
+ 'GET /features/by-id/:featureId': {
182
+ request: GetFeatureByIdRequest;
183
+ response: GetFeatureResponse;
184
+ };
185
+ 'POST /features/run-all': {
186
+ request: RunFeaturesRequest;
187
+ response: RunFeaturesResponse;
188
+ };
189
+ 'POST /features/run': {
190
+ request: RunFeatureRequest;
191
+ response: RunFeatureResponse;
192
+ };
193
+ 'POST /features/run-by-id': {
194
+ request: RunFeatureByIdRequest;
195
+ response: RunFeatureResponse;
196
+ };
197
+ 'POST /track': {
198
+ request: TrackConversionRequest;
199
+ response: TrackConversionResponse;
200
+ };
201
+ }
202
+ export type EndpointKey = keyof ConvertApiEndpoints;
203
+ export type EndpointRequest<T extends EndpointKey> = ConvertApiEndpoints[T]['request'];
204
+ export type EndpointResponse<T extends EndpointKey> = ConvertApiEndpoints[T]['response'];
205
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,yBAAyB,CAAC;CACtC;AAED,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG;IAC1D,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,IAAI,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE;QACb,OAAO,EAAE,SAAS,CAAC;QACnB,QAAQ,EAAE,cAAc,CAAC;KAC1B,CAAC;IACF,cAAc,EAAE;QACd,OAAO,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,cAAc,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,OAAO,EAAE,sBAAsB,CAAC;QAChC,QAAQ,EAAE,uBAAuB,CAAC;KACnC,CAAC;IACF,iCAAiC,EAAE;QACjC,OAAO,EAAE,yBAAyB,CAAC;QACnC,QAAQ,EAAE,qBAAqB,CAAC;KACjC,CAAC;IACF,sCAAsC,EAAE;QACtC,OAAO,EAAE,wBAAwB,CAAC;QAClC,QAAQ,EAAE,qBAAqB,CAAC;KACjC,CAAC;IACF,0DAA0D,EAAE;QAC1D,OAAO,EAAE,wBAAwB,CAAC;QAClC,QAAQ,EAAE,oBAAoB,CAAC;KAChC,CAAC;IACF,8DAA8D,EAAE;QAC9D,OAAO,EAAE,uBAAuB,CAAC;QACjC,QAAQ,EAAE,oBAAoB,CAAC;KAChC,CAAC;IACF,uBAAuB,EAAE;QACvB,OAAO,EAAE,oBAAoB,CAAC;QAC9B,QAAQ,EAAE,qBAAqB,CAAC;KACjC,CAAC;IACF,6BAA6B,EAAE;QAC7B,OAAO,EAAE,wBAAwB,CAAC;QAClC,QAAQ,EAAE,qBAAqB,CAAC;KACjC,CAAC;IACF,eAAe,EAAE;QACf,OAAO,EAAE,mBAAmB,CAAC;QAC7B,QAAQ,EAAE,oBAAoB,CAAC;KAChC,CAAC;IACF,2BAA2B,EAAE;QAC3B,OAAO,EAAE,sBAAsB,CAAC;QAChC,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IACF,gCAAgC,EAAE;QAChC,OAAO,EAAE,qBAAqB,CAAC;QAC/B,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IACF,wBAAwB,EAAE;QACxB,OAAO,EAAE,kBAAkB,CAAC;QAC5B,QAAQ,EAAE,mBAAmB,CAAC;KAC/B,CAAC;IACF,oBAAoB,EAAE;QACpB,OAAO,EAAE,iBAAiB,CAAC;QAC3B,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IACF,0BAA0B,EAAE;QAC1B,OAAO,EAAE,qBAAqB,CAAC;QAC/B,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,sBAAsB,CAAC;QAChC,QAAQ,EAAE,uBAAuB,CAAC;KACnC,CAAC;CACH;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC;AACpD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvF,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,WAAW,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { ConvertInterface } from '@convertcom/js-sdk';
2
+ import type { ProjectKey } from '../contracts';
3
+ export type { ProjectKey } from '../contracts';
4
+ export declare const PROJECT_KEYS: ProjectKey[];
5
+ export declare function getClient(projectKey: ProjectKey): Promise<ConvertInterface>;
6
+ export declare function initAllClients(): Promise<void>;
7
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/convert/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,eAAO,MAAM,YAAY,EAAE,UAAU,EAAsC,CAAC;AA+B5E,wBAAsB,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBjF;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAWpD"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PROJECT_KEYS = void 0;
7
+ exports.getClient = getClient;
8
+ exports.initAllClients = initAllClients;
9
+ const js_sdk_1 = __importDefault(require("@convertcom/js-sdk"));
10
+ const logger_1 = require("../utils/logger");
11
+ const log = (0, logger_1.createLogger)('convert');
12
+ exports.PROJECT_KEYS = ['passexperten', 'bussgeldcheck'];
13
+ const PROJECT_CONFIGS = {
14
+ passexperten: {
15
+ sdkKey: process.env.CONVERT_SDK_KEY_PASSEXPERTEN ?? '',
16
+ },
17
+ bussgeldcheck: {
18
+ sdkKey: process.env.CONVERT_SDK_KEY_BUSSGELDCHECK ?? '',
19
+ },
20
+ };
21
+ const clients = new Map();
22
+ const readyPromises = new Map();
23
+ function buildConfig(project) {
24
+ return {
25
+ sdkKey: project.sdkKey,
26
+ ...(project.sdkKeySecret ? { sdkKeySecret: project.sdkKeySecret } : {}),
27
+ environment: (process.env.CONVERT_ENVIRONMENT ?? 'production'),
28
+ dataRefreshInterval: Number(process.env.CONVERT_DATA_REFRESH_INTERVAL ?? 300000),
29
+ logger: {
30
+ logLevel: process.env.NODE_ENV === 'development' ? 3 : 1,
31
+ },
32
+ };
33
+ }
34
+ async function getClient(projectKey) {
35
+ if (!clients.has(projectKey)) {
36
+ const config = PROJECT_CONFIGS[projectKey];
37
+ if (!config) {
38
+ throw new Error(`Unknown project: ${projectKey}`);
39
+ }
40
+ if (!config.sdkKey) {
41
+ throw new Error(`No SDK key configured for project: ${projectKey}`);
42
+ }
43
+ const sdk = new js_sdk_1.default(buildConfig(config));
44
+ const ready = sdk.onReady();
45
+ clients.set(projectKey, sdk);
46
+ readyPromises.set(projectKey, ready);
47
+ }
48
+ await readyPromises.get(projectKey);
49
+ return clients.get(projectKey);
50
+ }
51
+ async function initAllClients() {
52
+ await Promise.allSettled(exports.PROJECT_KEYS.map(async (key) => {
53
+ if (!PROJECT_CONFIGS[key].sdkKey) {
54
+ log.warn(`skipping ${key}: CONVERT_SDK_KEY_${key.toUpperCase()} not set`);
55
+ return;
56
+ }
57
+ await getClient(key);
58
+ log.info('SDK ready', { project: key });
59
+ }));
60
+ }
61
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/convert/client.ts"],"names":[],"mappings":";;;;;;AAuCA,8BAiBC;AAED,wCAWC;AArED,gEAA4C;AAE5C,0CAA6C;AAG7C,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,SAAS,CAAC,CAAC;AAGvB,QAAA,YAAY,GAAiB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;AAO5E,MAAM,eAAe,GAAsC;IACzD,YAAY,EAAE;QACZ,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE;KACvD;IACD,aAAa,EAAE;QACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE;KACxD;CACF,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;AACxD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE3D,SAAS,WAAW,CAAC,OAAsB;IACzC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,YAAY,CAAW;QACxE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,MAAO,CAAC;QACjF,MAAM,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzD;KACe,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,UAAsB;IACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,gBAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAgC,CAAC;QAC/E,MAAM,KAAK,GAAI,GAAW,CAAC,OAAO,EAAmB,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC7B,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,CAAC,UAAU,CACtB,oBAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,qBAAqB,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACrB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import 'dotenv/config';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("dotenv/config");
7
+ const _app_1 = __importDefault(require("./app"));
8
+ const client_1 = require("./convert/client");
9
+ const logger_1 = require("./utils/logger");
10
+ const log = (0, logger_1.createLogger)('convert-service');
11
+ const PORT = Number(process.env.PORT ?? 3100);
12
+ async function start() {
13
+ log.info('initializing Convert SDK clients');
14
+ await (0, client_1.initAllClients)();
15
+ _app_1.default.listen(PORT, () => {
16
+ log.info(`listening on port ${PORT}`);
17
+ });
18
+ }
19
+ start().catch((err) => {
20
+ log.error('fatal startup error', err);
21
+ process.exit(1);
22
+ });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yBAAuB;AACvB,gDAAuB;AACvB,4CAAiD;AACjD,0CAA6C;AAE7C,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,iBAAiB,CAAC,CAAC;AAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAE9C,KAAK,UAAU,KAAK;IAClB,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC7C,MAAM,IAAA,uBAAc,GAAE,CAAC;IAEvB,cAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACpB,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=bucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket.d.ts","sourceRoot":"","sources":["../../src/routes/bucket.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAkDxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const client_1 = require("../convert/client");
5
+ const segments_1 = require("../utils/segments");
6
+ const logger_1 = require("../utils/logger");
7
+ const log = (0, logger_1.createLogger)('bucket');
8
+ function isBucketedVariation(exp) {
9
+ return typeof exp === 'object' && exp !== null && 'experienceKey' in exp && 'key' in exp;
10
+ }
11
+ const router = (0, express_1.Router)();
12
+ router.post('/', async (req, res) => {
13
+ const { projectKey, visitorId, visitorProperties = {}, locationProperties, pageUrl, campaign } = req.body;
14
+ if (!projectKey || !visitorId) {
15
+ return res.status(400).json({ error: 'projectKey and visitorId are required' });
16
+ }
17
+ let sdk;
18
+ try {
19
+ sdk = await (0, client_1.getClient)(projectKey);
20
+ }
21
+ catch (err) {
22
+ const message = err instanceof Error ? err.message : 'SDK not available';
23
+ return res.status(503).json({ error: message });
24
+ }
25
+ try {
26
+ const context = sdk.createContext(visitorId, visitorProperties);
27
+ if (!context) {
28
+ return res.status(500).json({ error: 'Failed to create visitor context' });
29
+ }
30
+ const segments = (0, segments_1.buildSegments)(req, pageUrl, campaign);
31
+ context.setDefaultSegments(segments);
32
+ log.info('request', { projectKey, visitorId, locationProperties, segments });
33
+ const bucketedExperiences = context.runExperiences(locationProperties ? { locationProperties } : undefined);
34
+ const variations = bucketedExperiences
35
+ .filter(isBucketedVariation)
36
+ .map((exp) => ({
37
+ experienceKey: exp.experienceKey,
38
+ experienceName: exp.experienceName,
39
+ variationKey: exp.key,
40
+ variationName: exp.name,
41
+ changes: exp.changes ?? [],
42
+ }));
43
+ const response = { visitorId, variations };
44
+ return res.json(response);
45
+ }
46
+ catch (err) {
47
+ log.error('error running experiences', err);
48
+ return res.status(500).json({ error: 'Failed to bucket visitor' });
49
+ }
50
+ });
51
+ exports.default = router;
52
+ //# sourceMappingURL=bucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket.js","sourceRoot":"","sources":["../../src/routes/bucket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Request, Response } from 'express';
2
+ import type { BucketedFeature, BucketedVariation, BucketingAttributes, ConfigExperience, ConfigFeature, ConvertInterface, ContextInterface, ExperienceVariationConfig } from '@convertcom/js-sdk';
3
+ import type { SerializedFeature, SerializedVariation, SharedBucketingRequest } from '../contracts';
4
+ export type BucketingBody = Partial<SharedBucketingRequest>;
5
+ export declare function resolveClient(projectKey: string | undefined, res: Response): Promise<ConvertInterface | null>;
6
+ export declare function createVisitorContext(sdk: ConvertInterface, req: Request, res: Response, body: BucketingBody): ContextInterface | null;
7
+ export declare function buildBucketingAttributes(body: BucketingBody): BucketingAttributes;
8
+ export declare function getExperiences(sdk: ConvertInterface): ConfigExperience[];
9
+ export declare function getFeatures(sdk: ConvertInterface): ConfigFeature[];
10
+ export declare function findExperienceByKey(sdk: ConvertInterface, key: string): ConfigExperience | undefined;
11
+ export declare function findExperienceById(sdk: ConvertInterface, id: string): ConfigExperience | undefined;
12
+ export declare function findFeatureByKey(sdk: ConvertInterface, key: string): ConfigFeature | undefined;
13
+ export declare function findFeatureById(sdk: ConvertInterface, id: string): ConfigFeature | undefined;
14
+ export declare function findVariationByKey(experience: ConfigExperience, key: string): ExperienceVariationConfig | undefined;
15
+ export declare function findVariationById(experience: ConfigExperience, id: string): ExperienceVariationConfig | undefined;
16
+ export declare function isBucketedVariation(result: unknown): result is BucketedVariation;
17
+ export declare function isBucketedFeature(result: unknown): result is BucketedFeature;
18
+ export declare function serializeVariation(variation: BucketedVariation): SerializedVariation;
19
+ export declare function serializeFeature(feature: BucketedFeature): SerializedFeature;
20
+ //# sourceMappingURL=convert-route-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-route-utils.d.ts","sourceRoot":"","sources":["../../src/routes/convert-route-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAc,iBAAiB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE/G,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE5D,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAalC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,aAAa,GAClB,gBAAgB,GAAG,IAAI,CAczB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,mBAAmB,CAejF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAExE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAElE;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,gBAAgB,GAAG,SAAS,CAE9B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,EAAE,EAAE,MAAM,GACT,gBAAgB,GAAG,SAAS,CAE9B;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,aAAa,GAAG,SAAS,CAE3B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,EAAE,EAAE,MAAM,GACT,aAAa,GAAG,SAAS,CAE3B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,MAAM,GACV,yBAAyB,GAAG,SAAS,CAEvC;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,EAAE,EAAE,MAAM,GACT,yBAAyB,GAAG,SAAS,CAEvC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,iBAAiB,CAEhF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,eAAe,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,mBAAmB,CAYpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB,CAW5E"}