@untangle-code/config 0.0.0-stage → 0.1.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 (86) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +262 -2
  4. package/THIRD_PARTY_LICENSES.md +29 -0
  5. package/dist/chunker-budget.d.ts +58 -0
  6. package/dist/chunker-budget.d.ts.map +1 -0
  7. package/dist/chunker-budget.js +11 -0
  8. package/dist/chunker-budget.js.map +1 -0
  9. package/dist/defaults.d.ts +50 -0
  10. package/dist/defaults.d.ts.map +1 -0
  11. package/dist/defaults.js +179 -0
  12. package/dist/defaults.js.map +1 -0
  13. package/dist/discovery.d.ts +40 -0
  14. package/dist/discovery.d.ts.map +1 -0
  15. package/dist/discovery.js +76 -0
  16. package/dist/discovery.js.map +1 -0
  17. package/dist/env.d.ts +37 -0
  18. package/dist/env.d.ts.map +1 -0
  19. package/dist/env.js +100 -0
  20. package/dist/env.js.map +1 -0
  21. package/dist/hash.d.ts +37 -0
  22. package/dist/hash.d.ts.map +1 -0
  23. package/dist/hash.js +52 -0
  24. package/dist/hash.js.map +1 -0
  25. package/dist/index.d.ts +22 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +37 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/load.d.ts +61 -0
  30. package/dist/load.d.ts.map +1 -0
  31. package/dist/load.js +264 -0
  32. package/dist/load.js.map +1 -0
  33. package/dist/merge.d.ts +32 -0
  34. package/dist/merge.d.ts.map +1 -0
  35. package/dist/merge.js +65 -0
  36. package/dist/merge.js.map +1 -0
  37. package/dist/migrations.d.ts +26 -0
  38. package/dist/migrations.d.ts.map +1 -0
  39. package/dist/migrations.js +40 -0
  40. package/dist/migrations.js.map +1 -0
  41. package/dist/parse.d.ts +7 -0
  42. package/dist/parse.d.ts.map +1 -0
  43. package/dist/parse.js +14 -0
  44. package/dist/parse.js.map +1 -0
  45. package/dist/paths.d.ts +14 -0
  46. package/dist/paths.d.ts.map +1 -0
  47. package/dist/paths.js +37 -0
  48. package/dist/paths.js.map +1 -0
  49. package/dist/schema.d.ts +5 -0
  50. package/dist/schema.d.ts.map +1 -0
  51. package/dist/schema.js +19 -0
  52. package/dist/schema.js.map +1 -0
  53. package/dist/secrets.d.ts +33 -0
  54. package/dist/secrets.d.ts.map +1 -0
  55. package/dist/secrets.js +69 -0
  56. package/dist/secrets.js.map +1 -0
  57. package/dist/types.d.ts +323 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +20 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/user-config.d.ts +13 -0
  62. package/dist/user-config.d.ts.map +1 -0
  63. package/dist/user-config.js +34 -0
  64. package/dist/user-config.js.map +1 -0
  65. package/dist/validate.d.ts +36 -0
  66. package/dist/validate.d.ts.map +1 -0
  67. package/dist/validate.js +337 -0
  68. package/dist/validate.js.map +1 -0
  69. package/package.json +65 -3
  70. package/schemas/config-v1.json +375 -0
  71. package/src/chunker-budget.ts +63 -0
  72. package/src/defaults.ts +207 -0
  73. package/src/discovery.ts +95 -0
  74. package/src/env.ts +141 -0
  75. package/src/hash.ts +71 -0
  76. package/src/index.ts +51 -0
  77. package/src/load.ts +346 -0
  78. package/src/merge.ts +69 -0
  79. package/src/migrations.ts +64 -0
  80. package/src/parse.ts +18 -0
  81. package/src/paths.ts +42 -0
  82. package/src/schema.ts +23 -0
  83. package/src/secrets.ts +78 -0
  84. package/src/types.ts +366 -0
  85. package/src/user-config.ts +48 -0
  86. package/src/validate.ts +430 -0
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Configuration validation (spec.md §4.8):
3
+ *
4
+ * - unknown top-level fields SHOULD warn, never be silently dropped;
5
+ * - invalid enum values or unresolvable core values MUST abort startup;
6
+ * - dimension misconfiguration MUST be detectable before the first index upsert;
7
+ * - the validated effective profile MUST be stored with the index.
8
+ *
9
+ * This module never throws for warnings. It returns both lists; callers that
10
+ * want spec.md §4.8's "MUST abort" behavior call {@link assertConfigValid}.
11
+ */
12
+ import { isErrorCode, UntangleError } from "@untangle-code/domain";
13
+ import { UNTANGLE_CONFIG_V1_KEYS } from "./types.js";
14
+ function isRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ /** URI-backed and network locations are outside the embedded backend contract. */
18
+ function isLocalStoragePath(value) {
19
+ if (typeof value !== "string" || value.trim() === "" || value.includes("\0"))
20
+ return false;
21
+ if (/^[\\/]{2}/u.test(value))
22
+ return false;
23
+ if (/^[A-Za-z]:[\\/]/u.test(value))
24
+ return true;
25
+ return !/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(value);
26
+ }
27
+ function checkEnum(value, allowed, path, errors) {
28
+ if (value === undefined) {
29
+ return;
30
+ }
31
+ if (typeof value !== "string" || !allowed.includes(value)) {
32
+ errors.push({
33
+ code: "CONFIG_INVALID",
34
+ message: `"${path}" must be one of ${allowed.map((v) => `"${v}"`).join(", ")}, got ${JSON.stringify(value)}`,
35
+ path,
36
+ });
37
+ }
38
+ }
39
+ function checkPositiveInteger(value, path, errors) {
40
+ if (value === undefined) {
41
+ return;
42
+ }
43
+ if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
44
+ errors.push({
45
+ code: "CONFIG_INVALID",
46
+ message: `"${path}" must be a positive integer, got ${JSON.stringify(value)}`,
47
+ path,
48
+ });
49
+ }
50
+ }
51
+ function checkFiniteRange(value, minimum, maximum, path, errors) {
52
+ if (typeof value !== "number" || !Number.isFinite(value) || value < minimum || value > maximum) {
53
+ errors.push({
54
+ code: "CONFIG_INVALID",
55
+ message: `"${path}" must be a finite number in [${String(minimum)}, ${String(maximum)}], got ${JSON.stringify(value)}`,
56
+ path,
57
+ });
58
+ }
59
+ }
60
+ function validateRelevancePolicies(search, errors) {
61
+ const policies = search["relevancePolicies"];
62
+ if (policies === undefined)
63
+ return;
64
+ if (!isRecord(policies)) {
65
+ errors.push({
66
+ code: "CONFIG_INVALID",
67
+ message: '"search.relevancePolicies" must be an object keyed by embedding profile id',
68
+ path: "search.relevancePolicies",
69
+ });
70
+ return;
71
+ }
72
+ for (const [profileId, value] of Object.entries(policies)) {
73
+ const basePath = `search.relevancePolicies.${profileId}`;
74
+ if (profileId.trim() === "") {
75
+ errors.push({
76
+ code: "CONFIG_INVALID",
77
+ message: '"search.relevancePolicies" keys must be non-empty embedding profile ids',
78
+ path: "search.relevancePolicies",
79
+ });
80
+ }
81
+ if (!isRecord(value)) {
82
+ errors.push({
83
+ code: "CONFIG_INVALID",
84
+ message: `"${basePath}" must be a relevance policy object`,
85
+ path: basePath,
86
+ });
87
+ continue;
88
+ }
89
+ for (const scopeField of ["workspaceId", "collection"]) {
90
+ if (typeof value[scopeField] !== "string" || value[scopeField].trim() === "") {
91
+ errors.push({
92
+ code: "CONFIG_INVALID",
93
+ message: `"${basePath}.${scopeField}" must be a non-empty string`,
94
+ path: `${basePath}.${scopeField}`,
95
+ });
96
+ }
97
+ }
98
+ const policy = value["policy"];
99
+ if (!isRecord(policy)) {
100
+ errors.push({
101
+ code: "CONFIG_INVALID",
102
+ message: `"${basePath}.policy" must be a relevance policy object`,
103
+ path: `${basePath}.policy`,
104
+ });
105
+ continue;
106
+ }
107
+ const policyPath = `${basePath}.policy`;
108
+ if (typeof policy["calibrationId"] !== "string" || policy["calibrationId"].trim() === "") {
109
+ errors.push({
110
+ code: "CONFIG_INVALID",
111
+ message: `"${policyPath}.calibrationId" must be a non-empty string`,
112
+ path: `${policyPath}.calibrationId`,
113
+ });
114
+ }
115
+ checkFiniteRange(policy["minimumDenseScore"], -1, 1, `${policyPath}.minimumDenseScore`, errors);
116
+ checkFiniteRange(policy["minimumDenseSpread"], 0, 2, `${policyPath}.minimumDenseSpread`, errors);
117
+ const referenceRank = policy["denseReferenceRank"];
118
+ if (typeof referenceRank !== "number" ||
119
+ !Number.isInteger(referenceRank) ||
120
+ referenceRank < 2) {
121
+ errors.push({
122
+ code: "CONFIG_INVALID",
123
+ message: `"${policyPath}.denseReferenceRank" must be an integer >= 2, got ${JSON.stringify(referenceRank)}`,
124
+ path: `${policyPath}.denseReferenceRank`,
125
+ });
126
+ }
127
+ checkFiniteRange(policy["minimumCandidateIdfCoverage"], 0, 1, `${policyPath}.minimumCandidateIdfCoverage`, errors);
128
+ }
129
+ }
130
+ /**
131
+ * Validates a fully layer-merged (but not yet necessarily complete-with-defaults)
132
+ * configuration object. Returns warnings for unknown top-level fields and
133
+ * errors for invalid enums, unresolvable core values, and structural
134
+ * uniqueness violations (spec.md §4.3 repository ids; portfolio.md §14.4
135
+ * blueprint weight sum).
136
+ */
137
+ export function validateEffectiveConfig(config) {
138
+ const errors = [];
139
+ const warnings = [];
140
+ // Unknown top-level fields (spec.md §4.8). `$schema` is an accepted,
141
+ // ignored editor/tooling hint (product.md §11's example config carries it).
142
+ for (const key of Object.keys(config)) {
143
+ if (key === "$schema") {
144
+ continue;
145
+ }
146
+ if (!UNTANGLE_CONFIG_V1_KEYS.includes(key)) {
147
+ warnings.push({
148
+ code: "unknown_field",
149
+ message: `unknown top-level config field "${key}" is ignored`,
150
+ path: key,
151
+ });
152
+ }
153
+ }
154
+ if (config["schemaVersion"] !== undefined && config["schemaVersion"] !== 1) {
155
+ errors.push({
156
+ code: "CONFIG_INVALID",
157
+ message: `unsupported "schemaVersion" ${JSON.stringify(config["schemaVersion"])}; only 1 is understood without migration`,
158
+ path: "schemaVersion",
159
+ });
160
+ }
161
+ const storage = config["storage"];
162
+ if (storage !== undefined) {
163
+ if (!isRecord(storage)) {
164
+ errors.push({
165
+ code: "CONFIG_INVALID",
166
+ message: '"storage" must be an object',
167
+ path: "storage",
168
+ });
169
+ }
170
+ else {
171
+ checkEnum(storage["backend"], ["lancedb", "qdrant"], "storage.backend", errors);
172
+ if (storage["path"] !== undefined && !isLocalStoragePath(storage["path"])) {
173
+ errors.push({
174
+ code: "CONFIG_INVALID",
175
+ message: '"storage.path" must be a non-empty local filesystem path, not a URI or network path',
176
+ path: "storage.path",
177
+ });
178
+ }
179
+ }
180
+ }
181
+ const qdrant = config["qdrant"];
182
+ if (isRecord(qdrant)) {
183
+ checkEnum(qdrant["mode"], ["managed", "external"], "qdrant.mode", errors);
184
+ if (qdrant["mode"] === "external" &&
185
+ (typeof qdrant["url"] !== "string" || qdrant["url"].length === 0)) {
186
+ errors.push({
187
+ code: "CONFIG_INVALID",
188
+ message: `"qdrant.url" is required when "qdrant.mode" is "external"`,
189
+ path: "qdrant.url",
190
+ });
191
+ }
192
+ }
193
+ const embeddings = config["embeddings"];
194
+ if (isRecord(embeddings)) {
195
+ checkEnum(embeddings["provider"], ["ollama"], "embeddings.provider", errors);
196
+ checkEnum(embeddings["mode"], ["auto", "managed", "external"], "embeddings.mode", errors);
197
+ checkPositiveInteger(embeddings["dimensions"], "embeddings.dimensions", errors);
198
+ if (embeddings["mode"] === "external" &&
199
+ (typeof embeddings["url"] !== "string" || embeddings["url"].length === 0)) {
200
+ errors.push({
201
+ code: "CONFIG_INVALID",
202
+ message: `"embeddings.url" is required when "embeddings.mode" is "external"`,
203
+ path: "embeddings.url",
204
+ });
205
+ }
206
+ }
207
+ const search = config["search"];
208
+ if (isRecord(search)) {
209
+ validateRelevancePolicies(search, errors);
210
+ }
211
+ const qualityGate = config["qualityGate"];
212
+ if (isRecord(qualityGate)) {
213
+ checkEnum(qualityGate["mode"], ["off", "warn", "fail"], "qualityGate.mode", errors);
214
+ checkEnum(qualityGate["minimumParseQuality"], ["failed", "partial", "complete"], "qualityGate.minimumParseQuality", errors);
215
+ }
216
+ const complexity = config["complexity"];
217
+ if (isRecord(complexity)) {
218
+ checkEnum(complexity["cyclomaticVariant"], ["classic", "extended", "both"], "complexity.cyclomaticVariant", errors);
219
+ }
220
+ const telemetry = config["telemetry"];
221
+ if (isRecord(telemetry)) {
222
+ checkEnum(telemetry["logLevel"], ["error", "warn", "info", "debug", "trace"], "telemetry.logLevel", errors);
223
+ checkEnum(telemetry["metricsExport"], ["none", "prometheus"], "telemetry.metricsExport", errors);
224
+ }
225
+ const portfolio = config["portfolio"];
226
+ if (isRecord(portfolio)) {
227
+ const enrichment = portfolio["enrichment"];
228
+ if (isRecord(enrichment) && Array.isArray(enrichment["registries"])) {
229
+ const allowed = ["npm", "pypi", "crates", "maven", "nuget", "go", "composer"];
230
+ for (const [index, registry] of enrichment["registries"].entries()) {
231
+ checkEnum(registry, allowed, `portfolio.enrichment.registries[${index}]`, errors);
232
+ }
233
+ }
234
+ const weights = isRecord(portfolio["blueprint"])
235
+ ? portfolio["blueprint"]["weights"]
236
+ : undefined;
237
+ if (isRecord(weights)) {
238
+ const adoption = typeof weights["adoption"] === "number" ? weights["adoption"] : 0;
239
+ const recency = typeof weights["recency"] === "number" ? weights["recency"] : 0;
240
+ const health = typeof weights["health"] === "number" ? weights["health"] : 0;
241
+ const versionConsistency = typeof weights["versionConsistency"] === "number" ? weights["versionConsistency"] : 0;
242
+ const sum = adoption + recency + health + versionConsistency;
243
+ if (Math.abs(sum - 1.0) > 0.001) {
244
+ errors.push({
245
+ code: "CONFIG_INVALID",
246
+ message: `"portfolio.blueprint.weights" must sum to 1.0 (±0.001), got ${sum}`,
247
+ path: "portfolio.blueprint.weights",
248
+ });
249
+ }
250
+ }
251
+ }
252
+ // Repository id uniqueness (spec.md §4.3: "id MUSS innerhalb eines Workspaces eindeutig sein").
253
+ const repositories = config["repositories"];
254
+ if (Array.isArray(repositories)) {
255
+ const seen = new Set();
256
+ for (const [index, repo] of repositories.entries()) {
257
+ const id = isRecord(repo) ? repo["id"] : undefined;
258
+ if (typeof id !== "string" || id.length === 0) {
259
+ errors.push({
260
+ code: "CONFIG_INVALID",
261
+ message: `"repositories[${index}].id" is required`,
262
+ path: `repositories[${index}].id`,
263
+ });
264
+ continue;
265
+ }
266
+ if (seen.has(id)) {
267
+ errors.push({
268
+ code: "CONFIG_INVALID",
269
+ message: `duplicate repository id "${id}"`,
270
+ path: `repositories[${index}].id`,
271
+ });
272
+ }
273
+ seen.add(id);
274
+ }
275
+ }
276
+ // Context artifact name uniqueness (spec.md §19.2: unique per project).
277
+ const contextArtifacts = config["contextArtifacts"];
278
+ if (Array.isArray(contextArtifacts)) {
279
+ const seen = new Set();
280
+ for (const [index, artifact] of contextArtifacts.entries()) {
281
+ const name = isRecord(artifact) ? artifact["name"] : undefined;
282
+ if (typeof name !== "string" || name.length === 0) {
283
+ errors.push({
284
+ code: "CONFIG_INVALID",
285
+ message: `"contextArtifacts[${index}].name" is required`,
286
+ path: `contextArtifacts[${index}].name`,
287
+ });
288
+ continue;
289
+ }
290
+ if (seen.has(name)) {
291
+ errors.push({
292
+ code: "CONFIG_INVALID",
293
+ message: `duplicate context artifact name "${name}"`,
294
+ path: `contextArtifacts[${index}].name`,
295
+ });
296
+ }
297
+ seen.add(name);
298
+ }
299
+ }
300
+ return { errors, warnings };
301
+ }
302
+ /**
303
+ * Throws `UntangleError("CONFIG_INVALID", …)` when `errors` is non-empty
304
+ * (spec.md §4.8: invalid enums / unresolvable core values MUST abort
305
+ * startup). Callers decide when to call this — `loadConfig` itself never
306
+ * throws for either warnings or errors, so a caller can inspect both lists
307
+ * first (e.g. to print them) before deciding to abort.
308
+ */
309
+ export function assertConfigValid(errors) {
310
+ if (errors.length === 0) {
311
+ return;
312
+ }
313
+ const code = isErrorCode(errors[0]?.code) ? errors[0].code : "CONFIG_INVALID";
314
+ throw new UntangleError(code, `configuration is invalid: ${errors.map((e) => e.message).join("; ")}`, {
315
+ operation: "config.validate",
316
+ context: { issues: errors },
317
+ });
318
+ }
319
+ /**
320
+ * Pre-upsert dimension check (spec.md §4.8: "Falsch konfigurierte Dimensionen
321
+ * MÜSSEN vor dem ersten Index-Upsert erkannt werden."). Callers invoke this
322
+ * with the configured `embeddings.dimensions` and the dimension already
323
+ * committed to an existing Qdrant collection (from `MetadataStore`/
324
+ * `VectorStore` introspection) before ANY upsert into that collection.
325
+ */
326
+ export function assertEmbeddingDimensionsMatch(configuredDimensions, existingCollectionDimensions) {
327
+ if (existingCollectionDimensions === undefined) {
328
+ return;
329
+ }
330
+ if (configuredDimensions !== existingCollectionDimensions) {
331
+ throw new UntangleError("EMBEDDING_DIMENSION_MISMATCH", `configured embedding dimensions (${configuredDimensions}) do not match the existing collection's dimensions (${existingCollectionDimensions})`, {
332
+ operation: "config.validate",
333
+ context: { configuredDimensions, existingCollectionDimensions },
334
+ });
335
+ }
336
+ }
337
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAerD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAChB,KAAc,EACd,OAA0B,EAC1B,IAAY,EACZ,MAAqB;IAErB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI,IAAI,oBAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC5G,IAAI;SACL,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,IAAY,EAAE,MAAqB;IAC/E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI,IAAI,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC7E,IAAI;SACL,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc,EACd,OAAe,EACf,OAAe,EACf,IAAY,EACZ,MAAqB;IAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI,IAAI,iCAAiC,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACtH,IAAI;SACL,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAA+B,EAAE,MAAqB;IACvF,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,4EAA4E;YACrF,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,4BAA4B,SAAS,EAAE,CAAC;QACzD,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,yEAAyE;gBAClF,IAAI,EAAE,0BAA0B;aACjC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,QAAQ,qCAAqC;gBAC1D,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,CAAC,aAAa,EAAE,YAAY,CAAU,EAAE,CAAC;YAChE,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC7E,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,IAAI,QAAQ,IAAI,UAAU,8BAA8B;oBACjE,IAAI,EAAE,GAAG,QAAQ,IAAI,UAAU,EAAE;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,QAAQ,4CAA4C;gBACjE,IAAI,EAAE,GAAG,QAAQ,SAAS;aAC3B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,QAAQ,SAAS,CAAC;QACxC,IAAI,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,UAAU,4CAA4C;gBACnE,IAAI,EAAE,GAAG,UAAU,gBAAgB;aACpC,CAAC,CAAC;QACL,CAAC;QACD,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAChG,gBAAgB,CACd,MAAM,CAAC,oBAAoB,CAAC,EAC5B,CAAC,EACD,CAAC,EACD,GAAG,UAAU,qBAAqB,EAClC,MAAM,CACP,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACnD,IACE,OAAO,aAAa,KAAK,QAAQ;YACjC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;YAChC,aAAa,GAAG,CAAC,EACjB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,UAAU,qDAAqD,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;gBAC3G,IAAI,EAAE,GAAG,UAAU,qBAAqB;aACzC,CAAC,CAAC;QACL,CAAC;QACD,gBAAgB,CACd,MAAM,CAAC,6BAA6B,CAAC,EACrC,CAAC,EACD,CAAC,EACD,GAAG,UAAU,8BAA8B,EAC3C,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA+B;IACrE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,qEAAqE;IACrE,4EAA4E;IAC5E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,CAAE,uBAA6C,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mCAAmC,GAAG,cAAc;gBAC7D,IAAI,EAAE,GAAG;aACV,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,+BAA+B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,0CAA0C;YACzH,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,6BAA6B;gBACtC,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EACL,qFAAqF;oBACvF,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAC1E,IACE,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU;YAC7B,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EACjE,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,2DAA2D;gBACpE,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC7E,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC1F,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAChF,IACE,UAAU,CAAC,MAAM,CAAC,KAAK,UAAU;YACjC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EACzE,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,mEAAmE;gBAC5E,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACpF,SAAS,CACP,WAAW,CAAC,qBAAqB,CAAC,EAClC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EACjC,iCAAiC,EACjC,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,SAAS,CACP,UAAU,CAAC,mBAAmB,CAAC,EAC/B,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAC/B,8BAA8B,EAC9B,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,SAAS,CACP,SAAS,CAAC,UAAU,CAAC,EACrB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAC3C,oBAAoB,EACpB,MAAM,CACP,CAAC;QACF,SAAS,CACP,SAAS,CAAC,eAAe,CAAC,EAC1B,CAAC,MAAM,EAAE,YAAY,CAAC,EACtB,yBAAyB,EACzB,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAC9E,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAK,UAAU,CAAC,YAAY,CAAe,CAAC,OAAO,EAAE,EAAE,CAAC;gBAClF,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,mCAAmC,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC;YACnC,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,oBAAoB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,GAAG,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;YAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,+DAA+D,GAAG,EAAE;oBAC7E,IAAI,EAAE,6BAA6B;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iBAAiB,KAAK,mBAAmB;oBAClD,IAAI,EAAE,gBAAgB,KAAK,MAAM;iBAClC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,4BAA4B,EAAE,GAAG;oBAC1C,IAAI,EAAE,gBAAgB,KAAK,MAAM;iBAClC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,qBAAqB,KAAK,qBAAqB;oBACxD,IAAI,EAAE,oBAAoB,KAAK,QAAQ;iBACxC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,oCAAoC,IAAI,GAAG;oBACpD,IAAI,EAAE,oBAAoB,KAAK,QAAQ;iBACxC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC9E,MAAM,IAAI,aAAa,CACrB,IAAI,EACJ,6BAA6B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACtE;QACE,SAAS,EAAE,iBAAiB;QAC5B,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;KAC5B,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAC5C,oBAA4B,EAC5B,4BAAgD;IAEhD,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,IAAI,oBAAoB,KAAK,4BAA4B,EAAE,CAAC;QAC1D,MAAM,IAAI,aAAa,CACrB,8BAA8B,EAC9B,oCAAoC,oBAAoB,wDAAwD,4BAA4B,GAAG,EAC/I;YACE,SAAS,EAAE,iBAAiB;YAC5B,OAAO,EAAE,EAAE,oBAAoB,EAAE,4BAA4B,EAAE;SAChE,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,68 @@
1
1
  {
2
2
  "name": "@untangle-code/config",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Untangle configuration: types, discovery, layering, JSON Schema, secret redaction and canonical effective config.",
7
+ "license": "AGPL-3.0-only",
8
+ "homepage": "https://github.com/lboel/untangle",
9
+ "bugs": {
10
+ "url": "https://github.com/lboel/untangle/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/lboel/untangle.git",
15
+ "directory": "packages/config"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "engines": {
21
+ "node": "^22.13.0 || >=24.0.0"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./schema": {
29
+ "types": "./dist/schema.d.ts",
30
+ "default": "./dist/schema.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "!dist/**/*.test.*",
36
+ "!dist/**/test-helpers.*",
37
+ "!dist/**/test-support.*",
38
+ "!dist/**/test-support/**",
39
+ "!dist/**/testing/**",
40
+ "!dist/**/__tests__/**",
41
+ "src",
42
+ "!src/**/*.test.ts",
43
+ "!src/**/test-helpers.ts",
44
+ "!src/**/test-support.ts",
45
+ "!src/**/test-support/**",
46
+ "!src/**/testing/**",
47
+ "schemas",
48
+ "LICENSE",
49
+ "NOTICE",
50
+ "README.md",
51
+ "THIRD_PARTY_LICENSES.md"
52
+ ],
53
+ "dependencies": {
54
+ "smol-toml": "1.8.0",
55
+ "@untangle-code/domain": "0.1.1"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "22.19.7",
59
+ "typescript": "5.9.3",
60
+ "vitest": "3.2.7"
61
+ },
62
+ "scripts": {
63
+ "build": "node ../../scripts/tsc-build.mjs tsconfig.json",
64
+ "typecheck": "tsc -p tsconfig.typecheck.json",
65
+ "test": "vitest run",
66
+ "clean": "rm -rf dist *.tsbuildinfo"
67
+ }
6
68
  }