@zudojs/config 0.0.1

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 (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/configEntry/configEntry.type.d.ts +77 -0
  5. package/dist/configEntry/configEntry.type.d.ts.map +1 -0
  6. package/dist/configEntry/configEntry.type.js +149 -0
  7. package/dist/configEntry/configEntry.type.js.map +1 -0
  8. package/dist/configEntry/index.d.ts +7 -0
  9. package/dist/configEntry/index.d.ts.map +1 -0
  10. package/dist/configEntry/index.js +7 -0
  11. package/dist/configEntry/index.js.map +1 -0
  12. package/dist/configFactory/configFactory.core.d.ts +54 -0
  13. package/dist/configFactory/configFactory.core.d.ts.map +1 -0
  14. package/dist/configFactory/configFactory.core.js +69 -0
  15. package/dist/configFactory/configFactory.core.js.map +1 -0
  16. package/dist/configFactory/index.d.ts +7 -0
  17. package/dist/configFactory/index.d.ts.map +1 -0
  18. package/dist/configFactory/index.js +7 -0
  19. package/dist/configFactory/index.js.map +1 -0
  20. package/dist/configLoader/configLoader.core.d.ts +121 -0
  21. package/dist/configLoader/configLoader.core.d.ts.map +1 -0
  22. package/dist/configLoader/configLoader.core.js +292 -0
  23. package/dist/configLoader/configLoader.core.js.map +1 -0
  24. package/dist/configLoader/index.d.ts +7 -0
  25. package/dist/configLoader/index.d.ts.map +1 -0
  26. package/dist/configLoader/index.js +7 -0
  27. package/dist/configLoader/index.js.map +1 -0
  28. package/dist/configManager/configManager.core.d.ts +165 -0
  29. package/dist/configManager/configManager.core.d.ts.map +1 -0
  30. package/dist/configManager/configManager.core.js +328 -0
  31. package/dist/configManager/configManager.core.js.map +1 -0
  32. package/dist/configManager/configManager.error.d.ts +18 -0
  33. package/dist/configManager/configManager.error.d.ts.map +1 -0
  34. package/dist/configManager/configManager.error.js +24 -0
  35. package/dist/configManager/configManager.error.js.map +1 -0
  36. package/dist/configManager/configManager.factory.d.ts +11 -0
  37. package/dist/configManager/configManager.factory.d.ts.map +1 -0
  38. package/dist/configManager/configManager.factory.js +22 -0
  39. package/dist/configManager/configManager.factory.js.map +1 -0
  40. package/dist/configManager/configManager.type.d.ts +48 -0
  41. package/dist/configManager/configManager.type.d.ts.map +1 -0
  42. package/dist/configManager/configManager.type.js +13 -0
  43. package/dist/configManager/configManager.type.js.map +1 -0
  44. package/dist/configManager/index.d.ts +10 -0
  45. package/dist/configManager/index.d.ts.map +1 -0
  46. package/dist/configManager/index.js +10 -0
  47. package/dist/configManager/index.js.map +1 -0
  48. package/dist/configResolver/accessors/configResolver.accessors.d.ts +19 -0
  49. package/dist/configResolver/accessors/configResolver.accessors.d.ts.map +1 -0
  50. package/dist/configResolver/accessors/configResolver.accessors.js +237 -0
  51. package/dist/configResolver/accessors/configResolver.accessors.js.map +1 -0
  52. package/dist/configResolver/accessors/configResolver.scoped.d.ts +28 -0
  53. package/dist/configResolver/accessors/configResolver.scoped.d.ts.map +1 -0
  54. package/dist/configResolver/accessors/configResolver.scoped.js +54 -0
  55. package/dist/configResolver/accessors/configResolver.scoped.js.map +1 -0
  56. package/dist/configResolver/accessors/index.d.ts +8 -0
  57. package/dist/configResolver/accessors/index.d.ts.map +1 -0
  58. package/dist/configResolver/accessors/index.js +8 -0
  59. package/dist/configResolver/accessors/index.js.map +1 -0
  60. package/dist/configResolver/core/configResolver.core.d.ts +100 -0
  61. package/dist/configResolver/core/configResolver.core.d.ts.map +1 -0
  62. package/dist/configResolver/core/configResolver.core.js +347 -0
  63. package/dist/configResolver/core/configResolver.core.js.map +1 -0
  64. package/dist/configResolver/core/configResolver.error.d.ts +8 -0
  65. package/dist/configResolver/core/configResolver.error.d.ts.map +1 -0
  66. package/dist/configResolver/core/configResolver.error.js +8 -0
  67. package/dist/configResolver/core/configResolver.error.js.map +1 -0
  68. package/dist/configResolver/core/configResolver.factory.d.ts +8 -0
  69. package/dist/configResolver/core/configResolver.factory.d.ts.map +1 -0
  70. package/dist/configResolver/core/configResolver.factory.js +8 -0
  71. package/dist/configResolver/core/configResolver.factory.js.map +1 -0
  72. package/dist/configResolver/core/configResolver.type.d.ts +20 -0
  73. package/dist/configResolver/core/configResolver.type.d.ts.map +1 -0
  74. package/dist/configResolver/core/configResolver.type.js +2 -0
  75. package/dist/configResolver/core/configResolver.type.js.map +1 -0
  76. package/dist/configResolver/core/index.d.ts +10 -0
  77. package/dist/configResolver/core/index.d.ts.map +1 -0
  78. package/dist/configResolver/core/index.js +10 -0
  79. package/dist/configResolver/core/index.js.map +1 -0
  80. package/dist/configResolver/index.d.ts +8 -0
  81. package/dist/configResolver/index.d.ts.map +1 -0
  82. package/dist/configResolver/index.js +8 -0
  83. package/dist/configResolver/index.js.map +1 -0
  84. package/dist/configSchema/configSchema.core.d.ts +8 -0
  85. package/dist/configSchema/configSchema.core.d.ts.map +1 -0
  86. package/dist/configSchema/configSchema.core.js +8 -0
  87. package/dist/configSchema/configSchema.core.js.map +1 -0
  88. package/dist/configSchema/configSchema.rules.d.ts +18 -0
  89. package/dist/configSchema/configSchema.rules.d.ts.map +1 -0
  90. package/dist/configSchema/configSchema.rules.js +108 -0
  91. package/dist/configSchema/configSchema.rules.js.map +1 -0
  92. package/dist/configSchema/configSchema.type.d.ts +115 -0
  93. package/dist/configSchema/configSchema.type.d.ts.map +1 -0
  94. package/dist/configSchema/configSchema.type.js +24 -0
  95. package/dist/configSchema/configSchema.type.js.map +1 -0
  96. package/dist/configSchema/configSchema.validator.d.ts +37 -0
  97. package/dist/configSchema/configSchema.validator.d.ts.map +1 -0
  98. package/dist/configSchema/configSchema.validator.js +340 -0
  99. package/dist/configSchema/configSchema.validator.js.map +1 -0
  100. package/dist/configSchema/index.d.ts +8 -0
  101. package/dist/configSchema/index.d.ts.map +1 -0
  102. package/dist/configSchema/index.js +8 -0
  103. package/dist/configSchema/index.js.map +1 -0
  104. package/dist/configSource/configSource.core.d.ts +131 -0
  105. package/dist/configSource/configSource.core.d.ts.map +1 -0
  106. package/dist/configSource/configSource.core.js +195 -0
  107. package/dist/configSource/configSource.core.js.map +1 -0
  108. package/dist/configSource/index.d.ts +7 -0
  109. package/dist/configSource/index.d.ts.map +1 -0
  110. package/dist/configSource/index.js +7 -0
  111. package/dist/configSource/index.js.map +1 -0
  112. package/dist/configStore/configStore.core.d.ts +124 -0
  113. package/dist/configStore/configStore.core.d.ts.map +1 -0
  114. package/dist/configStore/configStore.core.js +306 -0
  115. package/dist/configStore/configStore.core.js.map +1 -0
  116. package/dist/configStore/configStore.factory.d.ts +13 -0
  117. package/dist/configStore/configStore.factory.d.ts.map +1 -0
  118. package/dist/configStore/configStore.factory.js +14 -0
  119. package/dist/configStore/configStore.factory.js.map +1 -0
  120. package/dist/configStore/configStore.type.d.ts +24 -0
  121. package/dist/configStore/configStore.type.d.ts.map +1 -0
  122. package/dist/configStore/configStore.type.js +2 -0
  123. package/dist/configStore/configStore.type.js.map +1 -0
  124. package/dist/configStore/index.d.ts +9 -0
  125. package/dist/configStore/index.d.ts.map +1 -0
  126. package/dist/configStore/index.js +9 -0
  127. package/dist/configStore/index.js.map +1 -0
  128. package/dist/configValue/configValue.core.d.ts +97 -0
  129. package/dist/configValue/configValue.core.d.ts.map +1 -0
  130. package/dist/configValue/configValue.core.js +293 -0
  131. package/dist/configValue/configValue.core.js.map +1 -0
  132. package/dist/configValue/index.d.ts +7 -0
  133. package/dist/configValue/index.d.ts.map +1 -0
  134. package/dist/configValue/index.js +7 -0
  135. package/dist/configValue/index.js.map +1 -0
  136. package/dist/index.d.ts +15 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +15 -0
  139. package/dist/index.js.map +1 -0
  140. package/package.json +51 -0
@@ -0,0 +1,108 @@
1
+ import { createConfigValidationIssue } from "./configSchema.validator.js";
2
+ /**
3
+ * Formats expected schema types.
4
+ */
5
+ export function formatExpectedType(type) {
6
+ if (Array.isArray(type)) {
7
+ return type.join(" | ");
8
+ }
9
+ return String(type);
10
+ }
11
+ /**
12
+ * Resolves a schema default.
13
+ */
14
+ export function resolveDefaultValue(schema) {
15
+ if (schema.default === undefined) {
16
+ return undefined;
17
+ }
18
+ return typeof schema.default === "function"
19
+ ? schema.default()
20
+ : schema.default;
21
+ }
22
+ /**
23
+ * Adds custom validation output to the issue list.
24
+ */
25
+ export function appendCustomValidationResult(result, path, issues) {
26
+ if (result === true) {
27
+ return;
28
+ }
29
+ if (result === false) {
30
+ issues.push(createConfigValidationIssue(path, "Configuration value failed validation.", "CUSTOM_VALIDATION"));
31
+ return;
32
+ }
33
+ if (typeof result === "string") {
34
+ issues.push(createConfigValidationIssue(path, result, "CUSTOM_VALIDATION"));
35
+ return;
36
+ }
37
+ if (Array.isArray(result)) {
38
+ issues.push(...result);
39
+ return;
40
+ }
41
+ issues.push(...(Array.isArray(result) ? result : [result]));
42
+ }
43
+ /**
44
+ * Built-in schema validation rules.
45
+ */
46
+ export function validateBuiltInRules(value, schema, context, issues) {
47
+ if (typeof value === "string") {
48
+ const stringSchema = schema;
49
+ if (stringSchema.minLength !== undefined &&
50
+ value.length < stringSchema.minLength) {
51
+ issues.push(createConfigValidationIssue(context.path, `Value must contain at least ${stringSchema.minLength} characters.`, "MIN_LENGTH"));
52
+ }
53
+ if (stringSchema.maxLength !== undefined &&
54
+ value.length > stringSchema.maxLength) {
55
+ issues.push(createConfigValidationIssue(context.path, `Value must contain at most ${stringSchema.maxLength} characters.`, "MAX_LENGTH"));
56
+ }
57
+ if (stringSchema.pattern) {
58
+ const pattern = typeof stringSchema.pattern === "string"
59
+ ? new RegExp(stringSchema.pattern)
60
+ : stringSchema.pattern;
61
+ if (!pattern.test(value)) {
62
+ issues.push(createConfigValidationIssue(context.path, "Value does not match the required pattern.", "PATTERN"));
63
+ }
64
+ }
65
+ if (stringSchema.enum && !stringSchema.enum.includes(value)) {
66
+ issues.push(createConfigValidationIssue(context.path, `Value must be one of: ${stringSchema.enum.join(", ")}.`, "ENUM"));
67
+ }
68
+ }
69
+ if (typeof value === "number") {
70
+ const numberSchema = schema;
71
+ if (numberSchema.min !== undefined && value < numberSchema.min) {
72
+ issues.push(createConfigValidationIssue(context.path, `Value must be greater than or equal to ${numberSchema.min}.`, "MIN"));
73
+ }
74
+ if (numberSchema.max !== undefined && value > numberSchema.max) {
75
+ issues.push(createConfigValidationIssue(context.path, `Value must be less than or equal to ${numberSchema.max}.`, "MAX"));
76
+ }
77
+ if (numberSchema.integer && !Number.isInteger(value)) {
78
+ issues.push(createConfigValidationIssue(context.path, "Value must be an integer.", "INTEGER"));
79
+ }
80
+ if (numberSchema.positive && value <= 0) {
81
+ issues.push(createConfigValidationIssue(context.path, "Value must be positive.", "POSITIVE"));
82
+ }
83
+ }
84
+ if (Array.isArray(value)) {
85
+ const arraySchema = schema;
86
+ if (arraySchema.minItems !== undefined &&
87
+ value.length < arraySchema.minItems) {
88
+ issues.push(createConfigValidationIssue(context.path, `Array must contain at least ${arraySchema.minItems} items.`, "MIN_ITEMS"));
89
+ }
90
+ if (arraySchema.maxItems !== undefined &&
91
+ value.length > arraySchema.maxItems) {
92
+ issues.push(createConfigValidationIssue(context.path, `Array must contain at most ${arraySchema.maxItems} items.`, "MAX_ITEMS"));
93
+ }
94
+ if (arraySchema.items) {
95
+ value.forEach((item, index) => {
96
+ const { validateConfigValue } = require("./configSchema.validator.js");
97
+ const result = validateConfigValue(item, arraySchema.items, {
98
+ path: `${context.path}[${index}]`,
99
+ root: context.root,
100
+ parent: value,
101
+ key: index,
102
+ });
103
+ issues.push(...result.issues);
104
+ });
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=configSchema.rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.rules.js","sourceRoot":"","sources":["../../src/configSchema/configSchema.rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import type { ConfigValue } from "../configValue/configValue.core.js";
2
+ /**
3
+ * Supported configuration value types.
4
+ */
5
+ export declare enum ConfigValueType {
6
+ STRING = "string",
7
+ NUMBER = "number",
8
+ BOOLEAN = "boolean",
9
+ BIGINT = "bigint",
10
+ DATE = "date",
11
+ OBJECT = "object",
12
+ ARRAY = "array",
13
+ NULL = "null",
14
+ ANY = "any"
15
+ }
16
+ /**
17
+ * Validation issue severity.
18
+ */
19
+ export declare enum ConfigValidationSeverity {
20
+ ERROR = "error",
21
+ WARNING = "warning"
22
+ }
23
+ /**
24
+ * A single schema validation issue.
25
+ */
26
+ export interface ConfigValidationIssue {
27
+ readonly path: string;
28
+ readonly message: string;
29
+ readonly code: string;
30
+ readonly severity: ConfigValidationSeverity;
31
+ readonly expected?: ConfigValueType | readonly ConfigValueType[];
32
+ readonly received?: ConfigValueType;
33
+ }
34
+ /**
35
+ * Result of validating a configuration value.
36
+ */
37
+ export interface ConfigValidationResult {
38
+ readonly valid: boolean;
39
+ readonly value?: ConfigValue;
40
+ readonly issues: readonly ConfigValidationIssue[];
41
+ }
42
+ /**
43
+ * Validation context.
44
+ */
45
+ export interface ConfigValidationContext {
46
+ readonly path: string;
47
+ readonly root: unknown;
48
+ readonly parent?: unknown;
49
+ readonly key?: string | number;
50
+ }
51
+ /**
52
+ * Configuration schema.
53
+ */
54
+ export interface ConfigSchema<T extends ConfigValue = ConfigValue> {
55
+ readonly type: ConfigValueType | readonly ConfigValueType[];
56
+ readonly required?: boolean;
57
+ readonly nullable?: boolean;
58
+ readonly default?: T | (() => T);
59
+ readonly description?: string;
60
+ readonly secret?: boolean;
61
+ readonly validate?: (value: T, context: ConfigValidationContext) => boolean | string | ConfigValidationIssue | readonly ConfigValidationIssue[];
62
+ readonly transform?: (value: ConfigValue, context: ConfigValidationContext) => T;
63
+ }
64
+ /**
65
+ * Object configuration schema.
66
+ */
67
+ export interface ConfigObjectSchema<T extends ConfigValue = ConfigValue> extends ConfigSchema<T> {
68
+ readonly type: ConfigValueType.OBJECT;
69
+ readonly properties: Readonly<Record<string, ConfigSchema>>;
70
+ readonly additionalProperties?: boolean | ConfigSchema;
71
+ }
72
+ /**
73
+ * Array configuration schema.
74
+ */
75
+ export interface ConfigArraySchema<T extends ConfigValue = ConfigValue> extends ConfigSchema<T> {
76
+ readonly type: ConfigValueType.ARRAY;
77
+ readonly items?: ConfigSchema;
78
+ readonly minItems?: number;
79
+ readonly maxItems?: number;
80
+ }
81
+ /**
82
+ * String configuration schema.
83
+ */
84
+ export interface ConfigStringSchema extends ConfigSchema<string> {
85
+ readonly type: ConfigValueType.STRING;
86
+ readonly minLength?: number;
87
+ readonly maxLength?: number;
88
+ readonly pattern?: string | RegExp;
89
+ readonly enum?: readonly string[];
90
+ }
91
+ /**
92
+ * Number configuration schema.
93
+ */
94
+ export interface ConfigNumberSchema extends ConfigSchema<number> {
95
+ readonly type: ConfigValueType.NUMBER;
96
+ readonly min?: number;
97
+ readonly max?: number;
98
+ readonly integer?: boolean;
99
+ readonly positive?: boolean;
100
+ }
101
+ /**
102
+ * Boolean configuration schema.
103
+ */
104
+ export interface ConfigBooleanSchema extends ConfigSchema<boolean> {
105
+ readonly type: ConfigValueType.BOOLEAN;
106
+ }
107
+ /**
108
+ * Schema definition shorthand.
109
+ */
110
+ export type ConfigSchemaDefinition = ConfigSchema | ConfigSchemaDefinition[] | ConfigSchemaBuilder;
111
+ /**
112
+ * Schema builder function.
113
+ */
114
+ export type ConfigSchemaBuilder = () => ConfigSchema;
115
+ //# sourceMappingURL=configSchema.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.type.d.ts","sourceRoot":"","sources":["../../src/configSchema/configSchema.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE;;GAEG;AACH,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,oBAAY,wBAAwB;IAClC,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,CAAC;IACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC/D,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAClB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,uBAAuB,KAEhC,OAAO,GAAG,MAAM,GAAG,qBAAqB,GAAG,SAAS,qBAAqB,EAAE,CAAC;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,CACnB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,uBAAuB,KAC7B,CAAC,CAAC;CACR;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,WAAW,GAAG,WAAW,CACnC,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,WAAW,GAAG,WAAW,CACnC,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY,CAAC,OAAO,CAAC;IAChE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAChC,YAAY,GAAG,sBAAsB,EAAE,GAAG,mBAAmB,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Supported configuration value types.
3
+ */
4
+ export var ConfigValueType;
5
+ (function (ConfigValueType) {
6
+ ConfigValueType["STRING"] = "string";
7
+ ConfigValueType["NUMBER"] = "number";
8
+ ConfigValueType["BOOLEAN"] = "boolean";
9
+ ConfigValueType["BIGINT"] = "bigint";
10
+ ConfigValueType["DATE"] = "date";
11
+ ConfigValueType["OBJECT"] = "object";
12
+ ConfigValueType["ARRAY"] = "array";
13
+ ConfigValueType["NULL"] = "null";
14
+ ConfigValueType["ANY"] = "any";
15
+ })(ConfigValueType || (ConfigValueType = {}));
16
+ /**
17
+ * Validation issue severity.
18
+ */
19
+ export var ConfigValidationSeverity;
20
+ (function (ConfigValidationSeverity) {
21
+ ConfigValidationSeverity["ERROR"] = "error";
22
+ ConfigValidationSeverity["WARNING"] = "warning";
23
+ })(ConfigValidationSeverity || (ConfigValidationSeverity = {}));
24
+ //# sourceMappingURL=configSchema.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.type.js","sourceRoot":"","sources":["../../src/configSchema/configSchema.type.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAN,IAAY,eAUX;AAVD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,sCAAmB,CAAA;IACnB,oCAAiB,CAAA;IACjB,gCAAa,CAAA;IACb,oCAAiB,CAAA;IACjB,kCAAe,CAAA;IACf,gCAAa,CAAA;IACb,8BAAW,CAAA;AACb,CAAC,EAVW,eAAe,KAAf,eAAe,QAU1B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,2CAAe,CAAA;IACf,+CAAmB,CAAA;AACrB,CAAC,EAHW,wBAAwB,KAAxB,wBAAwB,QAGnC"}
@@ -0,0 +1,37 @@
1
+ import type { ConfigValue } from "../configValue/configValue.core.js";
2
+ import type { ConfigSchema, ConfigValidationContext, ConfigValidationIssue, ConfigValidationResult } from "./configSchema.type.js";
3
+ import { ConfigValueType } from "./configSchema.type.js";
4
+ import type { ConfigObjectSchema } from "./configSchema.type.js";
5
+ /**
6
+ * Returns the runtime configuration value type.
7
+ */
8
+ export declare function getConfigValueType(value: unknown): ConfigValueType;
9
+ /**
10
+ * Checks whether a runtime value matches a schema type.
11
+ */
12
+ export declare function matchesConfigType(value: unknown, type: ConfigValueType | readonly ConfigValueType[]): boolean;
13
+ /**
14
+ * Creates a validation issue.
15
+ */
16
+ export declare function createConfigValidationIssue(path: string, message: string, code: string, options?: Partial<Pick<ConfigValidationIssue, "expected" | "received" | "severity">>): ConfigValidationIssue;
17
+ /**
18
+ * Validates a value against a schema.
19
+ */
20
+ export declare function validateConfigValue(value: unknown, schema: ConfigSchema, context?: Partial<ConfigValidationContext>): ConfigValidationResult;
21
+ /**
22
+ * Validates an entire configuration object.
23
+ */
24
+ export declare function validateConfigObject(value: Readonly<Record<string, unknown>>, schema: ConfigObjectSchema, path?: string): ConfigValidationResult;
25
+ /**
26
+ * Validates an object against a schema and throws when invalid.
27
+ */
28
+ export declare function assertValidConfig(value: unknown, schema: ConfigSchema): ConfigValue;
29
+ import { ConfigurationError } from "@zudojs/errors";
30
+ /**
31
+ * Error thrown when schema validation fails.
32
+ */
33
+ export declare class ConfigSchemaValidationError extends ConfigurationError {
34
+ readonly issues: readonly ConfigValidationIssue[];
35
+ constructor(issues: readonly ConfigValidationIssue[]);
36
+ }
37
+ //# sourceMappingURL=configSchema.validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.validator.d.ts","sourceRoot":"","sources":["../../src/configSchema/configSchema.validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,KAAK,EACV,YAAY,EAIZ,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAoClE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,GACjD,OAAO,CAiDT;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,OAAO,CACd,IAAI,CAAC,qBAAqB,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAC7D,GACL,qBAAqB,CASvB;AA8ND;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GACzC,sBAAsB,CAgGxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,SAAM,GACT,sBAAsB,CAwFxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,YAAY,GACnB,WAAW,CAQb;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAElD,YAAY,MAAM,EAAE,SAAS,qBAAqB,EAAE,EAYnD;CACF"}
@@ -0,0 +1,340 @@
1
+ import { ConfigValidationSeverity, ConfigValueType, } from "./configSchema.type.js";
2
+ /**
3
+ * Returns the runtime configuration value type.
4
+ */
5
+ export function getConfigValueType(value) {
6
+ if (value === null) {
7
+ return ConfigValueType.NULL;
8
+ }
9
+ if (value === undefined) {
10
+ return ConfigValueType.ANY;
11
+ }
12
+ if (value instanceof Date) {
13
+ return ConfigValueType.DATE;
14
+ }
15
+ if (Array.isArray(value)) {
16
+ return ConfigValueType.ARRAY;
17
+ }
18
+ switch (typeof value) {
19
+ case "string":
20
+ return ConfigValueType.STRING;
21
+ case "number":
22
+ return ConfigValueType.NUMBER;
23
+ case "boolean":
24
+ return ConfigValueType.BOOLEAN;
25
+ case "bigint":
26
+ return ConfigValueType.BIGINT;
27
+ case "object":
28
+ return ConfigValueType.OBJECT;
29
+ default:
30
+ return ConfigValueType.ANY;
31
+ }
32
+ }
33
+ /**
34
+ * Checks whether a runtime value matches a schema type.
35
+ */
36
+ export function matchesConfigType(value, type) {
37
+ if (Array.isArray(type)) {
38
+ return type.some((candidate) => matchesConfigType(value, candidate));
39
+ }
40
+ if (value === null) {
41
+ return type === ConfigValueType.NULL;
42
+ }
43
+ if (value === undefined) {
44
+ return false;
45
+ }
46
+ switch (type) {
47
+ case ConfigValueType.ANY:
48
+ return true;
49
+ case ConfigValueType.STRING:
50
+ return typeof value === "string";
51
+ case ConfigValueType.NUMBER:
52
+ return typeof value === "number" && Number.isFinite(value);
53
+ case ConfigValueType.BOOLEAN:
54
+ return typeof value === "boolean";
55
+ case ConfigValueType.BIGINT:
56
+ return typeof value === "bigint";
57
+ case ConfigValueType.DATE:
58
+ return value instanceof Date && !Number.isNaN(value.getTime());
59
+ case ConfigValueType.ARRAY:
60
+ return Array.isArray(value);
61
+ case ConfigValueType.OBJECT:
62
+ return (typeof value === "object" &&
63
+ value !== null &&
64
+ !Array.isArray(value) &&
65
+ !(value instanceof Date));
66
+ case ConfigValueType.NULL:
67
+ return value === null;
68
+ default:
69
+ return false;
70
+ }
71
+ }
72
+ /**
73
+ * Creates a validation issue.
74
+ */
75
+ export function createConfigValidationIssue(path, message, code, options = {}) {
76
+ return {
77
+ path,
78
+ message,
79
+ code,
80
+ severity: options.severity ?? ConfigValidationSeverity.ERROR,
81
+ expected: options.expected,
82
+ received: options.received,
83
+ };
84
+ }
85
+ /**
86
+ * Formats expected schema types.
87
+ */
88
+ function formatExpectedType(type) {
89
+ if (Array.isArray(type)) {
90
+ return type.join(" | ");
91
+ }
92
+ return String(type);
93
+ }
94
+ /**
95
+ * Resolves a schema default.
96
+ */
97
+ function resolveDefaultValue(schema) {
98
+ if (schema.default === undefined) {
99
+ return undefined;
100
+ }
101
+ return typeof schema.default === "function"
102
+ ? schema.default()
103
+ : schema.default;
104
+ }
105
+ /**
106
+ * Adds custom validation output to the issue list.
107
+ */
108
+ function appendCustomValidationResult(result, path, issues) {
109
+ if (result === true) {
110
+ return;
111
+ }
112
+ if (result === false) {
113
+ issues.push(createConfigValidationIssue(path, "Configuration value failed validation.", "CUSTOM_VALIDATION"));
114
+ return;
115
+ }
116
+ if (typeof result === "string") {
117
+ issues.push(createConfigValidationIssue(path, result, "CUSTOM_VALIDATION"));
118
+ return;
119
+ }
120
+ if (Array.isArray(result)) {
121
+ issues.push(...result);
122
+ return;
123
+ }
124
+ issues.push(...(Array.isArray(result) ? result : [result]));
125
+ }
126
+ /**
127
+ * Built-in schema validation rules.
128
+ */
129
+ function validateBuiltInRules(value, schema, context, issues) {
130
+ if (typeof value === "string") {
131
+ const stringSchema = schema;
132
+ if (stringSchema.minLength !== undefined &&
133
+ value.length < stringSchema.minLength) {
134
+ issues.push(createConfigValidationIssue(context.path, `Value must contain at least ${stringSchema.minLength} characters.`, "MIN_LENGTH"));
135
+ }
136
+ if (stringSchema.maxLength !== undefined &&
137
+ value.length > stringSchema.maxLength) {
138
+ issues.push(createConfigValidationIssue(context.path, `Value must contain at most ${stringSchema.maxLength} characters.`, "MAX_LENGTH"));
139
+ }
140
+ if (stringSchema.pattern) {
141
+ const pattern = typeof stringSchema.pattern === "string"
142
+ ? new RegExp(stringSchema.pattern)
143
+ : stringSchema.pattern;
144
+ if (!pattern.test(value)) {
145
+ issues.push(createConfigValidationIssue(context.path, "Value does not match the required pattern.", "PATTERN"));
146
+ }
147
+ }
148
+ if (stringSchema.enum && !stringSchema.enum.includes(value)) {
149
+ issues.push(createConfigValidationIssue(context.path, `Value must be one of: ${stringSchema.enum.join(", ")}.`, "ENUM"));
150
+ }
151
+ }
152
+ if (typeof value === "number") {
153
+ const numberSchema = schema;
154
+ if (numberSchema.min !== undefined && value < numberSchema.min) {
155
+ issues.push(createConfigValidationIssue(context.path, `Value must be greater than or equal to ${numberSchema.min}.`, "MIN"));
156
+ }
157
+ if (numberSchema.max !== undefined && value > numberSchema.max) {
158
+ issues.push(createConfigValidationIssue(context.path, `Value must be less than or equal to ${numberSchema.max}.`, "MAX"));
159
+ }
160
+ if (numberSchema.integer && !Number.isInteger(value)) {
161
+ issues.push(createConfigValidationIssue(context.path, "Value must be an integer.", "INTEGER"));
162
+ }
163
+ if (numberSchema.positive && value <= 0) {
164
+ issues.push(createConfigValidationIssue(context.path, "Value must be positive.", "POSITIVE"));
165
+ }
166
+ }
167
+ if (Array.isArray(value)) {
168
+ const arraySchema = schema;
169
+ if (arraySchema.minItems !== undefined &&
170
+ value.length < arraySchema.minItems) {
171
+ issues.push(createConfigValidationIssue(context.path, `Array must contain at least ${arraySchema.minItems} items.`, "MIN_ITEMS"));
172
+ }
173
+ if (arraySchema.maxItems !== undefined &&
174
+ value.length > arraySchema.maxItems) {
175
+ issues.push(createConfigValidationIssue(context.path, `Array must contain at most ${arraySchema.maxItems} items.`, "MAX_ITEMS"));
176
+ }
177
+ if (arraySchema.items) {
178
+ value.forEach((item, index) => {
179
+ const result = validateConfigValue(item, arraySchema.items, {
180
+ path: `${context.path}[${index}]`,
181
+ root: context.root,
182
+ parent: value,
183
+ key: index,
184
+ });
185
+ issues.push(...result.issues);
186
+ });
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Validates a value against a schema.
192
+ */
193
+ export function validateConfigValue(value, schema, context) {
194
+ const path = context?.path ?? "$";
195
+ const validationContext = {
196
+ path,
197
+ root: context?.root ?? value,
198
+ parent: context?.parent,
199
+ key: context?.key,
200
+ };
201
+ const issues = [];
202
+ if (value === undefined) {
203
+ if (schema.required) {
204
+ issues.push(createConfigValidationIssue(path, `Configuration value at "${path}" is required.`, "REQUIRED", {
205
+ expected: schema.type,
206
+ }));
207
+ return {
208
+ valid: false,
209
+ issues,
210
+ };
211
+ }
212
+ return {
213
+ valid: true,
214
+ value: resolveDefaultValue(schema),
215
+ issues,
216
+ };
217
+ }
218
+ if (value === null && schema.nullable) {
219
+ return {
220
+ valid: true,
221
+ value: value,
222
+ issues,
223
+ };
224
+ }
225
+ if (!matchesConfigType(value, schema.type)) {
226
+ issues.push(createConfigValidationIssue(path, `Expected ${formatExpectedType(schema.type)} but received ${getConfigValueType(value)}.`, "TYPE_MISMATCH", {
227
+ expected: schema.type,
228
+ received: getConfigValueType(value),
229
+ }));
230
+ return {
231
+ valid: false,
232
+ issues,
233
+ };
234
+ }
235
+ validateBuiltInRules(value, schema, validationContext, issues);
236
+ if (schema.validate) {
237
+ const result = schema.validate(value, validationContext);
238
+ appendCustomValidationResult(result, path, issues);
239
+ }
240
+ let transformed = value;
241
+ if (schema.transform) {
242
+ try {
243
+ transformed = schema.transform(value, validationContext);
244
+ }
245
+ catch (error) {
246
+ issues.push(createConfigValidationIssue(path, error instanceof Error ? error.message : String(error), "TRANSFORM_FAILED"));
247
+ }
248
+ }
249
+ return {
250
+ valid: !issues.some((issue) => issue.severity === ConfigValidationSeverity.ERROR),
251
+ value: transformed,
252
+ issues,
253
+ };
254
+ }
255
+ /**
256
+ * Validates an entire configuration object.
257
+ */
258
+ export function validateConfigObject(value, schema, path = "$") {
259
+ const issues = [];
260
+ if (!matchesConfigType(value, ConfigValueType.OBJECT)) {
261
+ return {
262
+ valid: false,
263
+ issues: [
264
+ createConfigValidationIssue(path, `Expected object but received ${getConfigValueType(value)}.`, "TYPE_MISMATCH", {
265
+ expected: ConfigValueType.OBJECT,
266
+ received: getConfigValueType(value),
267
+ }),
268
+ ],
269
+ };
270
+ }
271
+ const result = {};
272
+ for (const [key, propertySchema] of Object.entries(schema.properties)) {
273
+ const propertyPath = `${path}.${key}`;
274
+ const propertyResult = validateConfigValue(value[key], propertySchema, {
275
+ path: propertyPath,
276
+ root: value,
277
+ parent: value,
278
+ key,
279
+ });
280
+ issues.push(...propertyResult.issues);
281
+ if (propertyResult.value !== undefined) {
282
+ result[key] = propertyResult.value;
283
+ }
284
+ }
285
+ for (const [key, child] of Object.entries(value)) {
286
+ if (Object.prototype.hasOwnProperty.call(schema.properties, key)) {
287
+ continue;
288
+ }
289
+ if (schema.additionalProperties === false) {
290
+ issues.push(createConfigValidationIssue(`${path}.${key}`, `Unknown configuration property "${key}".`, "UNKNOWN_PROPERTY"));
291
+ continue;
292
+ }
293
+ if (schema.additionalProperties &&
294
+ typeof schema.additionalProperties === "object") {
295
+ const propertyResult = validateConfigValue(child, schema.additionalProperties, {
296
+ path: `${path}.${key}`,
297
+ root: value,
298
+ parent: value,
299
+ key,
300
+ });
301
+ issues.push(...propertyResult.issues);
302
+ if (propertyResult.value !== undefined) {
303
+ result[key] = propertyResult.value;
304
+ }
305
+ }
306
+ else {
307
+ result[key] = child;
308
+ }
309
+ }
310
+ return {
311
+ valid: !issues.some((issue) => issue.severity === ConfigValidationSeverity.ERROR),
312
+ value: result,
313
+ issues,
314
+ };
315
+ }
316
+ /**
317
+ * Validates an object against a schema and throws when invalid.
318
+ */
319
+ export function assertValidConfig(value, schema) {
320
+ const result = validateConfigValue(value, schema);
321
+ if (!result.valid) {
322
+ throw new ConfigSchemaValidationError(result.issues);
323
+ }
324
+ return result.value;
325
+ }
326
+ import { ConfigurationError } from "@zudojs/errors";
327
+ /**
328
+ * Error thrown when schema validation fails.
329
+ */
330
+ export class ConfigSchemaValidationError extends ConfigurationError {
331
+ issues;
332
+ constructor(issues) {
333
+ super(`Configuration validation failed with ${issues.length} issue${issues.length === 1 ? "" : "s"}.`, {
334
+ configKey: "schema",
335
+ component: "ConfigSchemaValidator",
336
+ });
337
+ this.issues = Object.freeze([...issues]);
338
+ }
339
+ }
340
+ //# sourceMappingURL=configSchema.validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.validator.js","sourceRoot":"","sources":["../../src/configSchema/configSchema.validator.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,eAAe,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC,GAAG,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,eAAe,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,eAAe,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,MAAM,CAAC;QAEhC,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,MAAM,CAAC;QAEhC,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,OAAO,CAAC;QAEjC,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,MAAM,CAAC;QAEhC,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,MAAM,CAAC;QAEhC;YACE,OAAO,eAAe,CAAC,GAAG,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,IAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe,CAAC,GAAG;YACtB,OAAO,IAAI,CAAC;QAEd,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;QAEnC,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE7D,KAAK,eAAe,CAAC,OAAO;YAC1B,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;QAEpC,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;QAEnC,KAAK,eAAe,CAAC,IAAI;YACvB,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEjE,KAAK,eAAe,CAAC,KAAK;YACxB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9B,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,KAAK,IAAI;gBACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CACzB,CAAC;QAEJ,KAAK,eAAe,CAAC,IAAI;YACvB,OAAO,KAAK,KAAK,IAAI,CAAC;QAExB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,OAAe,EACf,IAAY,EACZ,OAAO,GAEH,EAAE;IAEN,OAAO;QACL,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,wBAAwB,CAAC,KAAK;QAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,IAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAoB;IAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QACzC,CAAC,CAAE,MAAM,CAAC,OAA6B,EAAE;QACzC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CACnC,MAC6E,EAC7E,IAAY,EACZ,MAA+B;IAE/B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,IAAI,EACJ,wCAAwC,EACxC,mBAAmB,CACpB,CACF,CAAC;QAEF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAE5E,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAEvB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,KAAc,EACd,MAAoB,EACpB,OAAgC,EAChC,MAA+B;IAE/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,MAA4B,CAAC;QAElD,IACE,YAAY,CAAC,SAAS,KAAK,SAAS;YACpC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,SAAS,EACrC,CAAC;YACD,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,+BAA+B,YAAY,CAAC,SAAS,cAAc,EACnE,YAAY,CACb,CACF,CAAC;QACJ,CAAC;QAED,IACE,YAAY,CAAC,SAAS,KAAK,SAAS;YACpC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,SAAS,EACrC,CAAC;YACD,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,8BAA8B,YAAY,CAAC,SAAS,cAAc,EAClE,YAAY,CACb,CACF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,OAAO,GACX,OAAO,YAAY,CAAC,OAAO,KAAK,QAAQ;gBACtC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;gBAClC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YAE3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,4CAA4C,EAC5C,SAAS,CACV,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACxD,MAAM,CACP,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,MAA4B,CAAC;QAElD,IAAI,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,0CAA0C,YAAY,CAAC,GAAG,GAAG,EAC7D,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,uCAAuC,YAAY,CAAC,GAAG,GAAG,EAC1D,KAAK,CACN,CACF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,2BAA2B,EAC3B,SAAS,CACV,CACF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,yBAAyB,EACzB,UAAU,CACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAA2B,CAAC;QAEhD,IACE,WAAW,CAAC,QAAQ,KAAK,SAAS;YAClC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,EACnC,CAAC;YACD,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,+BAA+B,WAAW,CAAC,QAAQ,SAAS,EAC5D,WAAW,CACZ,CACF,CAAC;QACJ,CAAC;QAED,IACE,WAAW,CAAC,QAAQ,KAAK,SAAS;YAClC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,EACnC,CAAC;YACD,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,OAAO,CAAC,IAAI,EACZ,8BAA8B,WAAW,CAAC,QAAQ,SAAS,EAC3D,WAAW,CACZ,CACF,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,KAAM,EAAE;oBAC3D,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,GAAG;oBACjC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,KAAK;oBACb,GAAG,EAAE,KAAK;iBACX,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAc,EACd,MAAoB,EACpB,OAA0C;IAE1C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC;IAElC,MAAM,iBAAiB,GAA4B;QACjD,IAAI;QACJ,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK;QAC5B,MAAM,EAAE,OAAO,EAAE,MAAM;QACvB,GAAG,EAAE,OAAO,EAAE,GAAG;KAClB,CAAC;IAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,IAAI,EACJ,2BAA2B,IAAI,gBAAgB,EAC/C,UAAU,EACV;gBACE,QAAQ,EAAE,MAAM,CAAC,IAAI;aACtB,CACF,CACF,CAAC;YAEF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM;aACP,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC;YAClC,MAAM;SACP,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,KAAoB;YAC3B,MAAM;SACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,IAAI,EACJ,YAAY,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EACxF,eAAe,EACf;YACE,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,QAAQ,EAAE,kBAAkB,CAAC,KAAK,CAAC;SACpC,CACF,CACF,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM;SACP,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAoB,EAAE,iBAAiB,CAAC,CAAC;QAExE,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,WAAW,GAAgB,KAAoB,CAAC;IAEpD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,KAAoB,EAAE,iBAAiB,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,IAAI,EACJ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,kBAAkB,CACnB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CACjB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,wBAAwB,CAAC,KAAK,CAC7D;QACD,KAAK,EAAE,WAAW;QAClB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAwC,EACxC,MAA0B,EAC1B,IAAI,GAAG,GAAG;IAEV,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE;gBACN,2BAA2B,CACzB,IAAI,EACJ,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAC5D,eAAe,EACf;oBACE,QAAQ,EAAE,eAAe,CAAC,MAAM;oBAChC,QAAQ,EAAE,kBAAkB,CAAC,KAAK,CAAC;iBACpC,CACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,MAAM,YAAY,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QAEtC,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE;YACrE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,KAAK;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,cAAc,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACjE,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CACT,2BAA2B,CACzB,GAAG,IAAI,IAAI,GAAG,EAAE,EAChB,mCAAmC,GAAG,IAAI,EAC1C,kBAAkB,CACnB,CACF,CAAC;YAEF,SAAS;QACX,CAAC;QAED,IACE,MAAM,CAAC,oBAAoB;YAC3B,OAAO,MAAM,CAAC,oBAAoB,KAAK,QAAQ,EAC/C,CAAC;YACD,MAAM,cAAc,GAAG,mBAAmB,CACxC,KAAK,EACL,MAAM,CAAC,oBAAoB,EAC3B;gBACE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;gBACtB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;gBACb,GAAG;aACJ,CACF,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAEtC,IAAI,cAAc,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAoB,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CACjB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,wBAAwB,CAAC,KAAK,CAC7D;QACD,KAAK,EAAE,MAAM;QACb,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,MAAoB;IAEpB,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC,KAAoB,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,kBAAkB;IACxD,MAAM,CAAmC;IAElD,YAAY,MAAwC;QAClD,KAAK,CACH,wCAAwC,MAAM,CAAC,MAAM,SACnD,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC7B,GAAG,EACH;YACE,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,uBAAuB;SACnC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;CACF"}