@1matrix/config-loader 0.1.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 +352 -0
  2. package/dist/config-loader.d.ts +26 -0
  3. package/dist/config-loader.d.ts.map +1 -0
  4. package/dist/config-loader.js +174 -0
  5. package/dist/config-loader.js.map +1 -0
  6. package/dist/fetcher/file-cache-fetcher.d.ts +9 -0
  7. package/dist/fetcher/file-cache-fetcher.d.ts.map +1 -0
  8. package/dist/fetcher/file-cache-fetcher.js +80 -0
  9. package/dist/fetcher/file-cache-fetcher.js.map +1 -0
  10. package/dist/fetcher/github-fetcher.d.ts +14 -0
  11. package/dist/fetcher/github-fetcher.d.ts.map +1 -0
  12. package/dist/fetcher/github-fetcher.js +123 -0
  13. package/dist/fetcher/github-fetcher.js.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +25 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/poller/config-poller.d.ts +13 -0
  19. package/dist/poller/config-poller.d.ts.map +1 -0
  20. package/dist/poller/config-poller.js +48 -0
  21. package/dist/poller/config-poller.js.map +1 -0
  22. package/dist/types/index.d.ts +32 -0
  23. package/dist/types/index.d.ts.map +1 -0
  24. package/dist/types/index.js +3 -0
  25. package/dist/types/index.js.map +1 -0
  26. package/dist/utils/deep-get.d.ts +2 -0
  27. package/dist/utils/deep-get.d.ts.map +1 -0
  28. package/dist/utils/deep-get.js +18 -0
  29. package/dist/utils/deep-get.js.map +1 -0
  30. package/dist/utils/env-mapper.d.ts +7 -0
  31. package/dist/utils/env-mapper.d.ts.map +1 -0
  32. package/dist/utils/env-mapper.js +15 -0
  33. package/dist/utils/env-mapper.js.map +1 -0
  34. package/dist/utils/logger.d.ts +9 -0
  35. package/dist/utils/logger.d.ts.map +1 -0
  36. package/dist/utils/logger.js +24 -0
  37. package/dist/utils/logger.js.map +1 -0
  38. package/dist/validator/default-schemas.d.ts +2 -0
  39. package/dist/validator/default-schemas.d.ts.map +1 -0
  40. package/dist/validator/default-schemas.js +46 -0
  41. package/dist/validator/default-schemas.js.map +1 -0
  42. package/dist/validator/schema-validator.d.ts +13 -0
  43. package/dist/validator/schema-validator.d.ts.map +1 -0
  44. package/dist/validator/schema-validator.js +52 -0
  45. package/dist/validator/schema-validator.js.map +1 -0
  46. package/dist/webhook/signature-validator.d.ts +6 -0
  47. package/dist/webhook/signature-validator.d.ts.map +1 -0
  48. package/dist/webhook/signature-validator.js +64 -0
  49. package/dist/webhook/signature-validator.js.map +1 -0
  50. package/dist/webhook/webhook-handler.d.ts +11 -0
  51. package/dist/webhook/webhook-handler.d.ts.map +1 -0
  52. package/dist/webhook/webhook-handler.js +60 -0
  53. package/dist/webhook/webhook-handler.js.map +1 -0
  54. package/package.json +50 -0
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubFetcher = void 0;
4
+ const rest_1 = require("@octokit/rest");
5
+ class GitHubFetcher {
6
+ constructor(options) {
7
+ this.owner = options.owner;
8
+ this.repo = options.repo;
9
+ this.branch = options.branch;
10
+ this.octokit = new rest_1.Octokit({
11
+ auth: options.token
12
+ });
13
+ }
14
+ async fetchConfig(env, configName) {
15
+ try {
16
+ const { directory, filePrefix } = this.getConfigPath(configName);
17
+ const filePath = `${directory}/${filePrefix}-${env}.json`;
18
+ const { data } = await this.octokit.repos.getContent({
19
+ owner: this.owner,
20
+ repo: this.repo,
21
+ path: filePath,
22
+ ref: this.branch
23
+ });
24
+ if (Array.isArray(data)) {
25
+ throw new Error(`Expected file but got directory: ${filePath}`);
26
+ }
27
+ if (!('content' in data)) {
28
+ throw new Error(`No content in response for: ${filePath}`);
29
+ }
30
+ const content = Buffer.from(data.content, 'base64').toString('utf8');
31
+ return JSON.parse(content);
32
+ }
33
+ catch (error) {
34
+ if (error.status === 404) {
35
+ const { directory, filePrefix } = this.getConfigPath(configName);
36
+ throw new Error(`Config file not found: ${directory}/${filePrefix}-${env}.json`);
37
+ }
38
+ throw new Error(`Failed to fetch config ${configName}: ${error.message}`);
39
+ }
40
+ }
41
+ getConfigPath(configName) {
42
+ const mappings = {
43
+ 'api-keys': { directory: 'api', filePrefix: 'keys' },
44
+ 'roles': { directory: 'roles', filePrefix: 'roles' },
45
+ 'intent-handlers': { directory: 'intent-handlers', filePrefix: 'handlers' }
46
+ };
47
+ return mappings[configName] || { directory: configName, filePrefix: configName };
48
+ }
49
+ async fetchSchema(schemaName) {
50
+ try {
51
+ const filePath = `schemas/${schemaName}.schema.json`;
52
+ const { data } = await this.octokit.repos.getContent({
53
+ owner: this.owner,
54
+ repo: this.repo,
55
+ path: filePath,
56
+ ref: this.branch
57
+ });
58
+ if (Array.isArray(data)) {
59
+ throw new Error(`Expected file but got directory: ${filePath}`);
60
+ }
61
+ if (!('content' in data)) {
62
+ return null;
63
+ }
64
+ const content = Buffer.from(data.content, 'base64').toString('utf8');
65
+ return JSON.parse(content);
66
+ }
67
+ catch (error) {
68
+ if (error.status === 404) {
69
+ return null;
70
+ }
71
+ throw new Error(`Failed to fetch schema ${schemaName}: ${error.message}`);
72
+ }
73
+ }
74
+ async fetchAllConfigs(env) {
75
+ const configTypes = ['api-keys', 'roles', 'intent-handlers'];
76
+ const configs = {};
77
+ const fetchPromises = configTypes.map(async (configName) => {
78
+ try {
79
+ configs[configName] = await this.fetchConfig(env, configName);
80
+ }
81
+ catch (error) {
82
+ if (error.message.includes('not found')) {
83
+ return;
84
+ }
85
+ throw error;
86
+ }
87
+ });
88
+ await Promise.all(fetchPromises);
89
+ return configs;
90
+ }
91
+ async fetchAllSchemas() {
92
+ try {
93
+ const { data } = await this.octokit.repos.getContent({
94
+ owner: this.owner,
95
+ repo: this.repo,
96
+ path: 'schemas',
97
+ ref: this.branch
98
+ });
99
+ if (!Array.isArray(data)) {
100
+ return {};
101
+ }
102
+ const schemaFiles = data.filter(file => file.type === 'file' && file.name.endsWith('.schema.json'));
103
+ const schemas = {};
104
+ const fetchPromises = schemaFiles.map(async (file) => {
105
+ const schemaName = file.name.replace('.schema.json', '');
106
+ const schema = await this.fetchSchema(schemaName);
107
+ if (schema) {
108
+ schemas[schemaName] = schema;
109
+ }
110
+ });
111
+ await Promise.all(fetchPromises);
112
+ return schemas;
113
+ }
114
+ catch (error) {
115
+ if (error.status === 404) {
116
+ return {};
117
+ }
118
+ throw new Error(`Failed to fetch schemas: ${error.message}`);
119
+ }
120
+ }
121
+ }
122
+ exports.GitHubFetcher = GitHubFetcher;
123
+ //# sourceMappingURL=github-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../../src/fetcher/github-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ConfigLoader } from "./config-loader";
2
+ export * from "./types";
3
+ export { EnvMapper } from "./utils/env-mapper";
4
+ export { deepGet } from "./utils/deep-get";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.deepGet = exports.EnvMapper = exports.ConfigLoader = void 0;
18
+ var config_loader_1 = require("./config-loader");
19
+ Object.defineProperty(exports, "ConfigLoader", { enumerable: true, get: function () { return config_loader_1.ConfigLoader; } });
20
+ __exportStar(require("./types"), exports);
21
+ var env_mapper_1 = require("./utils/env-mapper");
22
+ Object.defineProperty(exports, "EnvMapper", { enumerable: true, get: function () { return env_mapper_1.EnvMapper; } });
23
+ var deep_get_1 = require("./utils/deep-get");
24
+ Object.defineProperty(exports, "deepGet", { enumerable: true, get: function () { return deep_get_1.deepGet; } });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,0CAAwB;AACxB,iDAA+C;AAAtC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,mGAAA,OAAO,OAAA"}
@@ -0,0 +1,13 @@
1
+ import { ConfigLoader } from '../config-loader';
2
+ export declare class ConfigPoller {
3
+ private readonly configLoader;
4
+ private interval;
5
+ private timer;
6
+ private isRunning;
7
+ constructor(configLoader: ConfigLoader, interval: number);
8
+ start(): void;
9
+ stop(): void;
10
+ updateInterval(newInterval: number): void;
11
+ getIsRunning(): boolean;
12
+ }
13
+ //# sourceMappingURL=config-poller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-poller.d.ts","sourceRoot":"","sources":["../../src/poller/config-poller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMhD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAU;gBAMf,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM;IAUxD,KAAK,IAAI,IAAI;IAuBb,IAAI,IAAI,IAAI;IAYZ,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAYzC,YAAY,IAAI,OAAO;CAGxB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigPoller = void 0;
4
+ class ConfigPoller {
5
+ constructor(configLoader, interval) {
6
+ this.configLoader = configLoader;
7
+ this.interval = interval;
8
+ this.timer = null;
9
+ this.isRunning = false;
10
+ }
11
+ start() {
12
+ if (this.isRunning) {
13
+ return;
14
+ }
15
+ this.isRunning = true;
16
+ this.timer = setInterval(async () => {
17
+ try {
18
+ await this.configLoader.refresh();
19
+ }
20
+ catch (error) {
21
+ const err = error;
22
+ this.configLoader.emit('error', {
23
+ source: 'poller',
24
+ error: err.message
25
+ });
26
+ }
27
+ }, this.interval);
28
+ }
29
+ stop() {
30
+ if (this.timer) {
31
+ clearInterval(this.timer);
32
+ this.timer = null;
33
+ this.isRunning = false;
34
+ }
35
+ }
36
+ updateInterval(newInterval) {
37
+ this.interval = newInterval;
38
+ if (this.isRunning) {
39
+ this.stop();
40
+ this.start();
41
+ }
42
+ }
43
+ getIsRunning() {
44
+ return this.isRunning;
45
+ }
46
+ }
47
+ exports.ConfigPoller = ConfigPoller;
48
+ //# sourceMappingURL=config-poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-poller.js","sourceRoot":"","sources":["../../src/poller/config-poller.ts"],"names":[],"mappings":";;;AAMA,MAAa,YAAY;IAUvB,YAAY,YAA0B,EAAE,QAAgB;QACtD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAKD,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAc,CAAC;gBAE3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC9B,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG,CAAC,OAAO;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAKD,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAMD,cAAc,CAAC,WAAmB;QAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAMD,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAtED,oCAsEC"}
@@ -0,0 +1,32 @@
1
+ import { Request, Response } from 'express';
2
+ export interface ConfigLoaderOptions {
3
+ repository: string;
4
+ branch: string;
5
+ githubToken?: string;
6
+ webhookSecret?: string;
7
+ envMappings?: Record<string, string>;
8
+ defaultEnv?: string;
9
+ pollingInterval?: number;
10
+ cacheFile?: string;
11
+ usePackageSchemas?: boolean;
12
+ }
13
+ export interface WebhookHandlerOptions {
14
+ onUpdate?: (configs: Record<string, any>) => void;
15
+ onError?: (error: Error) => void;
16
+ }
17
+ export interface ValidationResult {
18
+ valid: boolean;
19
+ errors?: any[];
20
+ }
21
+ export interface GitHubFetcherOptions {
22
+ owner: string;
23
+ repo: string;
24
+ branch: string;
25
+ token?: string;
26
+ }
27
+ export type ExpressMiddleware = (req: Request, res: Response) => Promise<void | Response>;
28
+ export interface ConfigChangeEvent {
29
+ configs: Record<string, any>;
30
+ changedKeys: string[];
31
+ }
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAE1F,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function deepGet<T = any>(obj: Record<string, any> | null | undefined, path: string, defaultValue?: T): T | undefined;
2
+ //# sourceMappingURL=deep-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-get.d.ts","sourceRoot":"","sources":["../../src/utils/deep-get.ts"],"names":[],"mappings":"AAOA,wBAAgB,OAAO,CAAC,CAAC,GAAG,GAAG,EAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS,CAgBf"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deepGet = deepGet;
4
+ function deepGet(obj, path, defaultValue) {
5
+ if (!obj || typeof obj !== 'object') {
6
+ return defaultValue;
7
+ }
8
+ const keys = path.split('.');
9
+ let result = obj;
10
+ for (const key of keys) {
11
+ if (result == null || typeof result !== 'object') {
12
+ return defaultValue;
13
+ }
14
+ result = result[key];
15
+ }
16
+ return result !== undefined ? result : defaultValue;
17
+ }
18
+ //# sourceMappingURL=deep-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-get.js","sourceRoot":"","sources":["../../src/utils/deep-get.ts"],"names":[],"mappings":";;AAOA,0BAoBC;AApBD,SAAgB,OAAO,CACrB,GAA2C,EAC3C,IAAY,EACZ,YAAgB;IAEhB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAQ,GAAG,CAAC;IAEtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AACtD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class EnvMapper {
2
+ private readonly mappings;
3
+ private readonly defaultEnv;
4
+ constructor(mappings: Record<string, string>, defaultEnv: string);
5
+ resolve(nodeEnv?: string): string;
6
+ }
7
+ //# sourceMappingURL=env-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-mapper.d.ts","sourceRoot":"","sources":["../../src/utils/env-mapper.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAMxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM;IAUhE,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;CAIlC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvMapper = void 0;
4
+ class EnvMapper {
5
+ constructor(mappings, defaultEnv) {
6
+ this.mappings = mappings || {};
7
+ this.defaultEnv = defaultEnv || 'dev';
8
+ }
9
+ resolve(nodeEnv) {
10
+ const env = nodeEnv || process.env.NODE_ENV || '';
11
+ return this.mappings[env] || this.defaultEnv;
12
+ }
13
+ }
14
+ exports.EnvMapper = EnvMapper;
15
+ //# sourceMappingURL=env-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-mapper.js","sourceRoot":"","sources":["../../src/utils/env-mapper.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IAQpB,YAAY,QAAgC,EAAE,UAAkB;QAC9D,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC;IACxC,CAAC;IAOD,OAAO,CAAC,OAAgB;QACtB,MAAM,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;IAC/C,CAAC;CACF;AAtBD,8BAsBC"}
@@ -0,0 +1,9 @@
1
+ export declare class Logger {
2
+ private readonly prefix;
3
+ constructor(prefix?: string);
4
+ info(message: string, ...args: any[]): void;
5
+ warn(message: string, ...args: any[]): void;
6
+ error(message: string, ...args: any[]): void;
7
+ debug(message: string, ...args: any[]): void;
8
+ }
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAIA,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,GAAE,MAAuB;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;CAK7C"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = void 0;
4
+ class Logger {
5
+ constructor(prefix = 'ConfigLoader') {
6
+ this.prefix = prefix;
7
+ }
8
+ info(message, ...args) {
9
+ console.log(`[${this.prefix}] ${message}`, ...args);
10
+ }
11
+ warn(message, ...args) {
12
+ console.warn(`[${this.prefix}] ${message}`, ...args);
13
+ }
14
+ error(message, ...args) {
15
+ console.error(`[${this.prefix}] ${message}`, ...args);
16
+ }
17
+ debug(message, ...args) {
18
+ if (process.env.DEBUG) {
19
+ console.debug(`[${this.prefix}] ${message}`, ...args);
20
+ }
21
+ }
22
+ }
23
+ exports.Logger = Logger;
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;AAIA,MAAa,MAAM;IAGjB,YAAY,SAAiB,cAAc;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF;AAxBD,wBAwBC"}
@@ -0,0 +1,2 @@
1
+ export declare const defaultSchemas: Record<string, any>;
2
+ //# sourceMappingURL=default-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-schemas.d.ts","sourceRoot":"","sources":["../../src/validator/default-schemas.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAyC9C,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultSchemas = void 0;
4
+ exports.defaultSchemas = {
5
+ 'api-keys': {
6
+ "$schema": "http://json-schema.org/draft-07/schema#",
7
+ "type": "object",
8
+ "description": "API keys schema - maps Keccak256 hashes to service names",
9
+ "patternProperties": {
10
+ "^[a-f0-9]{64}$": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Service name for the hashed API key"
14
+ }
15
+ },
16
+ "additionalProperties": false
17
+ },
18
+ 'roles': {
19
+ "$schema": "http://json-schema.org/draft-07/schema#",
20
+ "type": "object",
21
+ "description": "Roles schema - maps role names to arrays of Ethereum addresses",
22
+ "patternProperties": {
23
+ "^[a-zA-Z0-9._-]+$": {
24
+ "type": "array",
25
+ "items": {
26
+ "type": "string",
27
+ "pattern": "^0x[a-fA-F0-9]{40}$",
28
+ "description": "Ethereum address"
29
+ },
30
+ "description": "Array of addresses with this role"
31
+ }
32
+ },
33
+ "additionalProperties": false
34
+ },
35
+ 'intent-handlers': {
36
+ "$schema": "http://json-schema.org/draft-07/schema#",
37
+ "type": "array",
38
+ "description": "Intent handlers schema - array of Ethereum contract addresses",
39
+ "items": {
40
+ "type": "string",
41
+ "pattern": "^0x[a-fA-F0-9]{40}$",
42
+ "description": "Ethereum contract address for intent handler"
43
+ }
44
+ }
45
+ };
46
+ //# sourceMappingURL=default-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-schemas.js","sourceRoot":"","sources":["../../src/validator/default-schemas.ts"],"names":[],"mappings":";;;AAIa,QAAA,cAAc,GAAwB;IACjD,UAAU,EAAE;QACV,SAAS,EAAE,yCAAyC;QACpD,MAAM,EAAE,QAAQ;QAChB,aAAa,EAAE,0DAA0D;QACzE,mBAAmB,EAAE;YACnB,gBAAgB,EAAE;gBAChB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,qCAAqC;aACrD;SACF;QACD,sBAAsB,EAAE,KAAK;KAC9B;IACD,OAAO,EAAE;QACP,SAAS,EAAE,yCAAyC;QACpD,MAAM,EAAE,QAAQ;QAChB,aAAa,EAAE,gEAAgE;QAC/E,mBAAmB,EAAE;YACnB,mBAAmB,EAAE;gBACnB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE;oBACP,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,qBAAqB;oBAChC,aAAa,EAAE,kBAAkB;iBAClC;gBACD,aAAa,EAAE,mCAAmC;aACnD;SACF;QACD,sBAAsB,EAAE,KAAK;KAC9B;IACD,iBAAiB,EAAE;QACjB,SAAS,EAAE,yCAAyC;QACpD,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,+DAA+D;QAC9E,OAAO,EAAE;YACP,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,qBAAqB;YAChC,aAAa,EAAE,8CAA8C;SAC9D;KACF;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Options as AjvOptions } from 'ajv';
2
+ import { ValidationResult } from '../types';
3
+ export declare class SchemaValidator {
4
+ private readonly ajv;
5
+ private readonly schemas;
6
+ constructor(options?: AjvOptions);
7
+ loadSchema(name: string, schema: any): void;
8
+ loadSchemas(schemas: Record<string, any>): void;
9
+ validate(configName: string, data: any): ValidationResult;
10
+ hasSchema(name: string): boolean;
11
+ getSchemaNames(): string[];
12
+ }
13
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/validator/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,KAAK,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAK/B,OAAO,GAAE,UAAe;IAcpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAQ3C,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAY/C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,gBAAgB;IA6BzD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQhC,cAAc,IAAI,MAAM,EAAE;CAG3B"}
@@ -0,0 +1,52 @@
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.SchemaValidator = void 0;
7
+ const ajv_1 = __importDefault(require("ajv"));
8
+ class SchemaValidator {
9
+ constructor(options = {}) {
10
+ this.ajv = new ajv_1.default({
11
+ allErrors: true,
12
+ strict: false,
13
+ ...options
14
+ });
15
+ this.schemas = new Map();
16
+ }
17
+ loadSchema(name, schema) {
18
+ this.schemas.set(name, schema);
19
+ }
20
+ loadSchemas(schemas) {
21
+ for (const [name, schema] of Object.entries(schemas)) {
22
+ this.loadSchema(name, schema);
23
+ }
24
+ }
25
+ validate(configName, data) {
26
+ const schema = this.schemas.get(configName);
27
+ if (!schema) {
28
+ return {
29
+ valid: false,
30
+ errors: [{
31
+ message: `No schema found for config: ${configName}`
32
+ }]
33
+ };
34
+ }
35
+ const valid = this.ajv.validate(schema, data);
36
+ if (!valid) {
37
+ return {
38
+ valid: false,
39
+ errors: this.ajv.errors || []
40
+ };
41
+ }
42
+ return { valid: true };
43
+ }
44
+ hasSchema(name) {
45
+ return this.schemas.has(name);
46
+ }
47
+ getSchemaNames() {
48
+ return Array.from(this.schemas.keys());
49
+ }
50
+ }
51
+ exports.SchemaValidator = SchemaValidator;
52
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/validator/schema-validator.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAiD;AAMjD,MAAa,eAAe;IAO1B,YAAY,UAAsB,EAAE;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC;YACjB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,GAAG,OAAO;SACX,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;IAOD,UAAU,CAAC,IAAY,EAAE,MAAW;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAMD,WAAW,CAAC,OAA4B;QACtC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAQD,QAAQ,CAAC,UAAkB,EAAE,IAAS;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC;wBACP,OAAO,EAAE,+BAA+B,UAAU,EAAE;qBACrD,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE;aAC9B,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAOD,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAMD,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;CACF;AAjFD,0CAiFC"}
@@ -0,0 +1,6 @@
1
+ export declare class SignatureValidator {
2
+ private readonly secret;
3
+ constructor(secret: string);
4
+ validate(payload: string | Buffer, signature: string | null | undefined): boolean;
5
+ }
6
+ //# sourceMappingURL=signature-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-validator.d.ts","sourceRoot":"","sources":["../../src/webhook/signature-validator.ts"],"names":[],"mappings":"AAKA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAKpB,MAAM,EAAE,MAAM;IAa1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;CA0BlF"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SignatureValidator = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ class SignatureValidator {
39
+ constructor(secret) {
40
+ if (!secret) {
41
+ throw new Error('Webhook secret is required');
42
+ }
43
+ this.secret = secret;
44
+ }
45
+ validate(payload, signature) {
46
+ if (!signature || !signature.startsWith('sha256=')) {
47
+ return false;
48
+ }
49
+ const payloadString = Buffer.isBuffer(payload)
50
+ ? payload.toString('utf8')
51
+ : payload;
52
+ const hmac = crypto.createHmac('sha256', this.secret);
53
+ hmac.update(payloadString);
54
+ const expectedSignature = 'sha256=' + hmac.digest('hex');
55
+ try {
56
+ return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
57
+ }
58
+ catch (error) {
59
+ return false;
60
+ }
61
+ }
62
+ }
63
+ exports.SignatureValidator = SignatureValidator;
64
+ //# sourceMappingURL=signature-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-validator.js","sourceRoot":"","sources":["../../src/webhook/signature-validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAKjC,MAAa,kBAAkB;IAM7B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAQD,QAAQ,CAAC,OAAwB,EAAE,SAAoC;QACrE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC;QAGZ,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3B,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAGzD,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EACtB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA7CD,gDA6CC"}
@@ -0,0 +1,11 @@
1
+ import { WebhookHandlerOptions, ExpressMiddleware } from '../types';
2
+ import { ConfigLoader } from '../config-loader';
3
+ export declare class WebhookHandler {
4
+ private readonly configLoader;
5
+ private readonly onUpdate;
6
+ private readonly onError;
7
+ private readonly signatureValidator;
8
+ constructor(configLoader: ConfigLoader, options?: WebhookHandlerOptions);
9
+ createMiddleware(): ExpressMiddleware;
10
+ }
11
+ //# sourceMappingURL=webhook-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-handler.d.ts","sourceRoot":"","sources":["../../src/webhook/webhook-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAM5C,YAAY,EAAE,YAAY,EAAE,OAAO,GAAE,qBAA0B;IAkB3E,gBAAgB,IAAI,iBAAiB;CAsDtC"}