@fgv/ts-res 5.1.0-28 → 5.1.0-29

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 (57) hide show
  1. package/dist/packlets/conditions/conditionDecls.js.map +1 -1
  2. package/dist/packlets/conditions/conditionSet.js +14 -5
  3. package/dist/packlets/conditions/conditionSet.js.map +1 -1
  4. package/dist/packlets/conditions/conditionSetDecls.js.map +1 -1
  5. package/dist/packlets/conditions/convert/conditionSetDecls.js +50 -6
  6. package/dist/packlets/conditions/convert/conditionSetDecls.js.map +1 -1
  7. package/dist/packlets/conditions/convert/decls.js +61 -5
  8. package/dist/packlets/conditions/convert/decls.js.map +1 -1
  9. package/dist/packlets/qualifiers/qualifierCollector.js +151 -7
  10. package/dist/packlets/qualifiers/qualifierCollector.js.map +1 -1
  11. package/dist/packlets/resource-json/convert.js +225 -0
  12. package/dist/packlets/resource-json/convert.js.map +1 -1
  13. package/dist/packlets/resource-json/json.js +2 -2
  14. package/dist/packlets/resource-json/json.js.map +1 -1
  15. package/dist/packlets/runtime/context/simpleContextQualifierProvider.js +3 -0
  16. package/dist/packlets/runtime/context/simpleContextQualifierProvider.js.map +1 -1
  17. package/dist/packlets/runtime/context/validatingSimpleContextQualifierProvider.js +3 -5
  18. package/dist/packlets/runtime/context/validatingSimpleContextQualifierProvider.js.map +1 -1
  19. package/dist/ts-res.d.ts +442 -52
  20. package/lib/packlets/conditions/conditionDecls.d.ts +6 -1
  21. package/lib/packlets/conditions/conditionDecls.d.ts.map +1 -1
  22. package/lib/packlets/conditions/conditionDecls.js.map +1 -1
  23. package/lib/packlets/conditions/conditionSet.d.ts.map +1 -1
  24. package/lib/packlets/conditions/conditionSet.js +14 -5
  25. package/lib/packlets/conditions/conditionSet.js.map +1 -1
  26. package/lib/packlets/conditions/conditionSetDecls.d.ts +7 -2
  27. package/lib/packlets/conditions/conditionSetDecls.d.ts.map +1 -1
  28. package/lib/packlets/conditions/conditionSetDecls.js.map +1 -1
  29. package/lib/packlets/conditions/convert/conditionSetDecls.d.ts +30 -2
  30. package/lib/packlets/conditions/convert/conditionSetDecls.d.ts.map +1 -1
  31. package/lib/packlets/conditions/convert/conditionSetDecls.js +51 -5
  32. package/lib/packlets/conditions/convert/conditionSetDecls.js.map +1 -1
  33. package/lib/packlets/conditions/convert/decls.d.ts +39 -3
  34. package/lib/packlets/conditions/convert/decls.d.ts.map +1 -1
  35. package/lib/packlets/conditions/convert/decls.js +63 -5
  36. package/lib/packlets/conditions/convert/decls.js.map +1 -1
  37. package/lib/packlets/qualifiers/qualifierCollector.d.ts +104 -6
  38. package/lib/packlets/qualifiers/qualifierCollector.d.ts.map +1 -1
  39. package/lib/packlets/qualifiers/qualifierCollector.js +150 -6
  40. package/lib/packlets/qualifiers/qualifierCollector.js.map +1 -1
  41. package/lib/packlets/resource-json/convert.d.ts +85 -0
  42. package/lib/packlets/resource-json/convert.d.ts.map +1 -1
  43. package/lib/packlets/resource-json/convert.js +237 -0
  44. package/lib/packlets/resource-json/convert.js.map +1 -1
  45. package/lib/packlets/resource-json/json.d.ts +128 -39
  46. package/lib/packlets/resource-json/json.d.ts.map +1 -1
  47. package/lib/packlets/resource-json/json.js +2 -2
  48. package/lib/packlets/resource-json/json.js.map +1 -1
  49. package/lib/packlets/runtime/context/simpleContextQualifierProvider.d.ts +9 -2
  50. package/lib/packlets/runtime/context/simpleContextQualifierProvider.d.ts.map +1 -1
  51. package/lib/packlets/runtime/context/simpleContextQualifierProvider.js +3 -0
  52. package/lib/packlets/runtime/context/simpleContextQualifierProvider.js.map +1 -1
  53. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.d.ts +8 -1
  54. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.d.ts.map +1 -1
  55. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.js +3 -5
  56. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.js.map +1 -1
  57. package/package.json +9 -9
@@ -22,6 +22,18 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.importerResourceCollectionDecl = exports.resourceCollectionDecl = exports.resourceTreeRootDecl = exports.resourceTreeChildNodeDecl = exports.containerContextDecl = exports.childResourceDecl = exports.looseResourceDecl = exports.childResourceCandidateDecl = exports.importerResourceCandidateDecl = exports.looseResourceCandidateDecl = exports.conditionSetDecl = exports.childConditionDecl = exports.looseConditionDecl = void 0;
25
+ exports.typedLooseConditionDecl = typedLooseConditionDecl;
26
+ exports.typedConditionSetDecl = typedConditionSetDecl;
27
+ exports.typedLooseResourceCandidateDecl = typedLooseResourceCandidateDecl;
28
+ exports.typedImporterResourceCandidateDecl = typedImporterResourceCandidateDecl;
29
+ exports.typedChildResourceCandidateDecl = typedChildResourceCandidateDecl;
30
+ exports.typedLooseResourceDecl = typedLooseResourceDecl;
31
+ exports.typedChildResourceDecl = typedChildResourceDecl;
32
+ exports.typedContainerContextDecl = typedContainerContextDecl;
33
+ exports.typedResourceTreeChildNodeDecl = typedResourceTreeChildNodeDecl;
34
+ exports.typedResourceTreeRootDecl = typedResourceTreeRootDecl;
35
+ exports.typedResourceCollectionDecl = typedResourceCollectionDecl;
36
+ exports.typedImporterResourceCollectionDecl = typedImporterResourceCollectionDecl;
25
37
  const ts_utils_1 = require("@fgv/ts-utils");
26
38
  const common_1 = require("../common");
27
39
  const ts_json_base_1 = require("@fgv/ts-json-base");
@@ -171,4 +183,229 @@ exports.importerResourceCollectionDecl = ts_utils_1.Converters.generic((from, se
171
183
  metadata: ts_json_base_1.Converters.jsonObject.optional()
172
184
  }).convert(from, context);
173
185
  });
186
+ // --- Typed sibling converters (Phase B-2) -----------------------------------
187
+ //
188
+ // Each `typed*<TQualifierNames>(qualifierNameConverter)` returns a converter
189
+ // whose result type is narrowed on `TQualifierNames`. The existing untyped
190
+ // exports above remain unchanged at the signature and behavior level; consumers
191
+ // opt in by calling a typed sibling. Internally each typed factory composes
192
+ // lower-level typed factories so a single `qualifierNameConverter` flows
193
+ // end-to-end through the converter tree.
194
+ //
195
+ // DRIFT HAZARD: each typed sibling duplicates the field list of its untyped
196
+ // twin (the duplication exists to preserve `ObjectConverter` return types on
197
+ // the defaults — see phase-b2-result.md). If a field is added, removed, or
198
+ // re-typed on an untyped converter above, the typed sibling MUST be updated
199
+ // in lockstep. The per-pair `keep in sync with X` markers below flag each
200
+ // pair at the call site.
201
+ /**
202
+ * Returns a `Converter` for a `Json.ILooseConditionDecl<TQualifierNames>`
203
+ * narrowed on a supplied `qualifierName` converter.
204
+ *
205
+ * @public
206
+ */
207
+ // Keep in sync with `looseConditionDecl` above.
208
+ function typedLooseConditionDecl(qualifierNameConverter) {
209
+ return ts_utils_1.Converters.strictObject({
210
+ qualifierName: qualifierNameConverter,
211
+ value: ts_utils_1.Converters.string,
212
+ operator: common_1.Convert.conditionOperator.optional(),
213
+ priority: common_1.Convert.conditionPriority.optional(),
214
+ scoreAsDefault: ts_utils_1.Converters.number.optional()
215
+ });
216
+ }
217
+ function _typedConditionSetDeclFromArray(innerLooseConditionDecl) {
218
+ return ts_utils_1.Converters.arrayOf(innerLooseConditionDecl);
219
+ }
220
+ function _typedConditionSetDeclFromRecord(innerLooseConditionDecl) {
221
+ return ts_utils_1.Converters.generic((from, __self, context) => {
222
+ /* c8 ignore next 3 - branch covered by underlying record check */
223
+ if (!_isConditionSetRecord(from)) {
224
+ return (0, ts_utils_1.fail)('Expected an object');
225
+ }
226
+ return (0, ts_utils_1.mapResults)(Array.from(Object.entries(from)).map(([qualifierName, value]) => {
227
+ const toConvert = typeof value === 'string' ? { qualifierName, value } : Object.assign({ qualifierName }, value);
228
+ return innerLooseConditionDecl.convert(toConvert, context);
229
+ }));
230
+ });
231
+ }
232
+ /**
233
+ * Returns a `Converter` for a `Json.ConditionSetDecl<TQualifierNames>`
234
+ * (either array form or record form) narrowed on a supplied `qualifierName`
235
+ * converter.
236
+ *
237
+ * @public
238
+ */
239
+ // Keep in sync with `conditionSetDecl` (and its two private feeder converters
240
+ // `conditionSetDeclFromArray` / `conditionSetDeclFromRecord`) above.
241
+ function typedConditionSetDecl(qualifierNameConverter) {
242
+ const inner = typedLooseConditionDecl(qualifierNameConverter);
243
+ return ts_utils_1.Converters.oneOf([
244
+ _typedConditionSetDeclFromArray(inner),
245
+ _typedConditionSetDeclFromRecord(inner)
246
+ ]);
247
+ }
248
+ /**
249
+ * Returns a `Converter` for a `Json.ILooseResourceCandidateDecl<TQualifierNames>`
250
+ * narrowed on a supplied `qualifierName` converter.
251
+ *
252
+ * @public
253
+ */
254
+ // Keep in sync with `looseResourceCandidateDecl` above.
255
+ function typedLooseResourceCandidateDecl(qualifierNameConverter) {
256
+ return ts_utils_1.Converters.strictObject({
257
+ id: common_1.Convert.resourceId,
258
+ json: ts_json_base_1.Converters.jsonObject,
259
+ conditions: typedConditionSetDecl(qualifierNameConverter).optional(),
260
+ mergeMethod: common_1.Convert.resourceValueMergeMethod.optional(),
261
+ isPartial: ts_utils_1.Converters.boolean.optional(),
262
+ resourceTypeName: common_1.Convert.resourceTypeName.optional()
263
+ });
264
+ }
265
+ /**
266
+ * Returns a `Converter` for a `Json.IImporterResourceCandidateDecl<TQualifierNames>`
267
+ * narrowed on a supplied `qualifierName` converter.
268
+ *
269
+ * @public
270
+ */
271
+ // Keep in sync with `importerResourceCandidateDecl` above.
272
+ function typedImporterResourceCandidateDecl(qualifierNameConverter) {
273
+ return ts_utils_1.Converters.strictObject({
274
+ id: common_1.Convert.resourceId.optional(),
275
+ json: ts_json_base_1.Converters.jsonObject,
276
+ conditions: typedConditionSetDecl(qualifierNameConverter).optional(),
277
+ mergeMethod: common_1.Convert.resourceValueMergeMethod.optional(),
278
+ isPartial: ts_utils_1.Converters.boolean.optional(),
279
+ resourceTypeName: common_1.Convert.resourceTypeName.optional()
280
+ });
281
+ }
282
+ /**
283
+ * Returns a `Converter` for a `Json.IChildResourceCandidateDecl<TQualifierNames>`
284
+ * narrowed on a supplied `qualifierName` converter.
285
+ *
286
+ * @public
287
+ */
288
+ // Keep in sync with `childResourceCandidateDecl` above.
289
+ function typedChildResourceCandidateDecl(qualifierNameConverter) {
290
+ return ts_utils_1.Converters.strictObject({
291
+ json: ts_json_base_1.Converters.jsonObject,
292
+ conditions: typedConditionSetDecl(qualifierNameConverter).optional(),
293
+ isPartial: ts_utils_1.Converters.boolean.optional(),
294
+ mergeMethod: common_1.Convert.resourceValueMergeMethod.optional()
295
+ });
296
+ }
297
+ /**
298
+ * Returns a `Converter` for a `Json.ILooseResourceDecl<TQualifierNames>`
299
+ * narrowed on a supplied `qualifierName` converter.
300
+ *
301
+ * @public
302
+ */
303
+ // Keep in sync with `looseResourceDecl` above.
304
+ function typedLooseResourceDecl(qualifierNameConverter) {
305
+ return ts_utils_1.Converters.strictObject({
306
+ id: common_1.Convert.resourceId,
307
+ resourceTypeName: common_1.Convert.resourceTypeName,
308
+ candidates: ts_utils_1.Converters.arrayOf(typedChildResourceCandidateDecl(qualifierNameConverter)).optional()
309
+ });
310
+ }
311
+ /**
312
+ * Returns a `Converter` for a `Json.IChildResourceDecl<TQualifierNames>`
313
+ * narrowed on a supplied `qualifierName` converter.
314
+ *
315
+ * @public
316
+ */
317
+ // Keep in sync with `childResourceDecl` above.
318
+ function typedChildResourceDecl(qualifierNameConverter) {
319
+ return ts_utils_1.Converters.strictObject({
320
+ resourceTypeName: common_1.Convert.resourceTypeName,
321
+ candidates: ts_utils_1.Converters.arrayOf(typedChildResourceCandidateDecl(qualifierNameConverter)).optional()
322
+ });
323
+ }
324
+ /**
325
+ * Returns a `Converter` for a `Json.IContainerContextDecl<TQualifierNames>`
326
+ * narrowed on a supplied `qualifierName` converter.
327
+ *
328
+ * @public
329
+ */
330
+ // Keep in sync with `containerContextDecl` above.
331
+ function typedContainerContextDecl(qualifierNameConverter) {
332
+ return ts_utils_1.Converters.strictObject({
333
+ baseId: ts_utils_1.Converters.oneOf([common_1.Convert.resourceId, ts_utils_1.Converters.literal('')]).optional(),
334
+ conditions: typedConditionSetDecl(qualifierNameConverter).optional(),
335
+ mergeMethod: common_1.Convert.resourceValueMergeMethod.optional()
336
+ });
337
+ }
338
+ /**
339
+ * Returns a `Converter` for a `Json.IResourceTreeChildNodeDecl<TQualifierNames>`
340
+ * narrowed on a supplied `qualifierName` converter.
341
+ *
342
+ * @public
343
+ */
344
+ // Keep in sync with `resourceTreeChildNodeDecl` above.
345
+ function typedResourceTreeChildNodeDecl(qualifierNameConverter) {
346
+ const childResource = typedChildResourceDecl(qualifierNameConverter);
347
+ return ts_utils_1.Converters.generic((from, self, context) => {
348
+ return ts_utils_1.Converters.strictObject({
349
+ resources: ts_utils_1.Converters.recordOf(childResource).optional(),
350
+ children: ts_utils_1.Converters.recordOf(self).optional()
351
+ }).convert(from, context);
352
+ });
353
+ }
354
+ /**
355
+ * Returns a `Converter` for a `Json.IResourceTreeRootDecl<TQualifierNames>`
356
+ * narrowed on a supplied `qualifierName` converter.
357
+ *
358
+ * @public
359
+ */
360
+ // Keep in sync with `resourceTreeRootDecl` above.
361
+ function typedResourceTreeRootDecl(qualifierNameConverter) {
362
+ return ts_utils_1.Converters.strictObject({
363
+ context: typedContainerContextDecl(qualifierNameConverter).optional(),
364
+ resources: ts_utils_1.Converters.recordOf(typedChildResourceDecl(qualifierNameConverter)).optional(),
365
+ children: ts_utils_1.Converters.recordOf(typedResourceTreeChildNodeDecl(qualifierNameConverter)).optional()
366
+ });
367
+ }
368
+ /**
369
+ * Returns a `Converter` for a `Json.IResourceCollectionDecl<TQualifierNames>`
370
+ * narrowed on a supplied `qualifierName` converter.
371
+ *
372
+ * @public
373
+ */
374
+ // Keep in sync with `resourceCollectionDecl` above.
375
+ function typedResourceCollectionDecl(qualifierNameConverter) {
376
+ const containerContext = typedContainerContextDecl(qualifierNameConverter);
377
+ const looseCandidate = typedLooseResourceCandidateDecl(qualifierNameConverter);
378
+ const looseResource = typedLooseResourceDecl(qualifierNameConverter);
379
+ return ts_utils_1.Converters.generic((from, self, context) => {
380
+ return ts_utils_1.Converters.strictObject({
381
+ context: containerContext.optional(),
382
+ candidates: ts_utils_1.Converters.arrayOf(looseCandidate).optional(),
383
+ resources: ts_utils_1.Converters.arrayOf(looseResource).optional(),
384
+ collections: ts_utils_1.Converters.arrayOf(self).optional(),
385
+ metadata: ts_json_base_1.Converters.jsonObject.optional()
386
+ }).convert(from, context);
387
+ });
388
+ }
389
+ /**
390
+ * Returns a `Converter` for a `Json.IImporterResourceCollectionDecl<TQualifierNames>`
391
+ * narrowed on a supplied `qualifierName` converter.
392
+ *
393
+ * @public
394
+ */
395
+ // Keep in sync with `importerResourceCollectionDecl` above.
396
+ function typedImporterResourceCollectionDecl(qualifierNameConverter) {
397
+ const containerContext = typedContainerContextDecl(qualifierNameConverter);
398
+ const importerCandidate = typedImporterResourceCandidateDecl(qualifierNameConverter);
399
+ const looseResource = typedLooseResourceDecl(qualifierNameConverter);
400
+ const childResource = typedChildResourceDecl(qualifierNameConverter);
401
+ return ts_utils_1.Converters.generic((from, self, context) => {
402
+ return ts_utils_1.Converters.strictObject({
403
+ context: containerContext.optional(),
404
+ candidates: ts_utils_1.Converters.arrayOf(importerCandidate).optional(),
405
+ resources: ts_utils_1.Converters.arrayOf(ts_utils_1.Converters.oneOf([looseResource, childResource])).optional(),
406
+ collections: ts_utils_1.Converters.arrayOf(self).optional(),
407
+ metadata: ts_json_base_1.Converters.jsonObject.optional()
408
+ }).convert(from, context);
409
+ });
410
+ }
174
411
  //# sourceMappingURL=convert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/packlets/resource-json/convert.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, mapResults, Result, fail } from '@fgv/ts-utils';\nimport { Convert as CommonConvert } from '../common';\nimport { isJsonObject, Converters as JsonConverters } from '@fgv/ts-json-base';\nimport * as Json from './json';\nimport * as Normalized from './normalized';\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.ILooseConditionDecl | loose condition declaration}.\n * @public\n */\nexport const looseConditionDecl: Converter<Json.ILooseConditionDecl> =\n Converters.strictObject<Json.ILooseConditionDecl>({\n qualifierName: CommonConvert.qualifierName,\n value: Converters.string,\n operator: CommonConvert.conditionOperator.optional(),\n priority: CommonConvert.conditionPriority.optional(),\n scoreAsDefault: Converters.number.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.IChildConditionDecl | child condition declaration}.\n * @public\n */\nexport const childConditionDecl: Converter<Json.IChildConditionDecl> =\n Converters.strictObject<Json.IChildConditionDecl>({\n value: Converters.string,\n operator: CommonConvert.conditionOperator.optional(),\n priority: CommonConvert.conditionPriority.optional(),\n scoreAsDefault: Converters.number.optional()\n });\n\nfunction _isConditionSetRecord(from: unknown): from is Record<string, string | Json.IChildConditionDecl> {\n return isJsonObject(from);\n}\n\nconst conditionSetDeclFromArray: Converter<Normalized.ConditionSetDecl> =\n Converters.arrayOf(looseConditionDecl);\nconst conditionSetDeclFromRecord: Converter<Normalized.ConditionSetDecl> = Converters.generic<\n Normalized.ConditionSetDecl,\n unknown\n>(\n (\n from: unknown,\n __self: Converter<Normalized.ConditionSetDecl, unknown>,\n context?: unknown\n ): Result<Normalized.ConditionSetDecl> => {\n /* c8 ignore next 3 - this is tested but coverage is confused */\n if (!_isConditionSetRecord(from)) {\n return fail('Expected an object');\n }\n return mapResults(\n Array.from(Object.entries(from)).map(([qualifierName, value]) => {\n const toConvert: Json.ILooseConditionDecl =\n typeof value === 'string' ? { qualifierName, value } : { qualifierName, ...value };\n return looseConditionDecl.convert(toConvert, context);\n })\n );\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.ConditionSetDecl | condition set declaration}.\n * @public\n */\nexport const conditionSetDecl: Converter<Normalized.ConditionSetDecl> =\n Converters.oneOf<Normalized.ConditionSetDecl>([conditionSetDeclFromArray, conditionSetDeclFromRecord]);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.ILooseResourceCandidateDecl | loose resource candidate declaration}.\n * @public\n */\nexport const looseResourceCandidateDecl: Converter<Normalized.ILooseResourceCandidateDecl> =\n Converters.strictObject<Normalized.ILooseResourceCandidateDecl>({\n id: CommonConvert.resourceId,\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IImporterResourceCandidateDecl | importer resource candidate declaration}.\n * @public\n */\nexport const importerResourceCandidateDecl: Converter<Normalized.IImporterResourceCandidateDecl> =\n Converters.strictObject<Normalized.IImporterResourceCandidateDecl>({\n id: CommonConvert.resourceId.optional(),\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.IChildResourceCandidateDecl | child resource candidate declaration}.\n * @public\n */\nexport const childResourceCandidateDecl: Converter<Normalized.IChildResourceCandidateDecl> =\n Converters.strictObject<Normalized.IChildResourceCandidateDecl>({\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n isPartial: Converters.boolean.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.ILooseResourceDecl | loose resource declaration}.\n * @public\n */\nexport const looseResourceDecl: Converter<Normalized.ILooseResourceDecl> =\n Converters.strictObject<Normalized.ILooseResourceDecl>({\n id: CommonConvert.resourceId,\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(childResourceCandidateDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IChildResourceDecl | child resource declaration}.\n * @public\n */\nexport const childResourceDecl: Converter<Normalized.IChildResourceDecl> =\n Converters.strictObject<Normalized.IChildResourceDecl>({\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(childResourceCandidateDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IContainerContextDecl | resource context declaration}.\n * @public\n */\nexport const containerContextDecl: Converter<Normalized.IContainerContextDecl> =\n Converters.strictObject<Normalized.IContainerContextDecl>({\n baseId: Converters.oneOf([CommonConvert.resourceId, Converters.literal('')]).optional(),\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceTreeChildNodeDecl | resource tree child node declaration}.\n * @public\n */\nexport const resourceTreeChildNodeDecl: Converter<Normalized.IResourceTreeChildNodeDecl> = Converters.generic<\n Normalized.IResourceTreeChildNodeDecl,\n unknown\n>(\n (\n from: unknown,\n self: Converter<Normalized.IResourceTreeChildNodeDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IResourceTreeChildNodeDecl> => {\n return Converters.strictObject<Normalized.IResourceTreeChildNodeDecl>({\n resources: Converters.recordOf(childResourceDecl).optional(),\n children: Converters.recordOf(self).optional()\n }).convert(from, context);\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceTreeRootDecl | resource tree root declaration}.\n * @public\n */\nexport const resourceTreeRootDecl: Converter<Normalized.IResourceTreeRootDecl> =\n Converters.strictObject<Normalized.IResourceTreeRootDecl>({\n context: containerContextDecl.optional(),\n resources: Converters.recordOf(childResourceDecl).optional(),\n children: Converters.recordOf(resourceTreeChildNodeDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceCollectionDecl | resource collection declaration}.\n * @public\n */\nexport const resourceCollectionDecl: Converter<Normalized.IResourceCollectionDecl> = Converters.generic<\n Normalized.IResourceCollectionDecl,\n unknown\n>(\n (\n from: unknown,\n self: Converter<Normalized.IResourceCollectionDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IResourceCollectionDecl> => {\n return Converters.strictObject<Normalized.IResourceCollectionDecl>({\n context: containerContextDecl.optional(),\n candidates: Converters.arrayOf(looseResourceCandidateDecl).optional(),\n resources: Converters.arrayOf(looseResourceDecl).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IImporterResourceCollectionDecl | importer resource collection declaration}.\n * This allows for a mix of loose and child resource declarations.\n * @public\n */\nexport const importerResourceCollectionDecl: Converter<Normalized.IImporterResourceCollectionDecl> =\n Converters.generic<Normalized.IImporterResourceCollectionDecl, unknown>(\n (\n from: unknown,\n self: Converter<Normalized.IImporterResourceCollectionDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IImporterResourceCollectionDecl> => {\n return Converters.strictObject<Normalized.IImporterResourceCollectionDecl>({\n context: containerContextDecl.optional(),\n candidates: Converters.arrayOf(importerResourceCandidateDecl).optional(),\n resources: Converters.arrayOf(Converters.oneOf([looseResourceDecl, childResourceDecl])).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n );\n"]}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/packlets/resource-json/convert.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Converter, Converters, mapResults, Result, fail } from '@fgv/ts-utils';\nimport { Convert as CommonConvert } from '../common';\nimport { isJsonObject, Converters as JsonConverters } from '@fgv/ts-json-base';\nimport * as Json from './json';\nimport * as Normalized from './normalized';\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.ILooseConditionDecl | loose condition declaration}.\n * @public\n */\nexport const looseConditionDecl: Converter<Json.ILooseConditionDecl> =\n Converters.strictObject<Json.ILooseConditionDecl>({\n qualifierName: CommonConvert.qualifierName,\n value: Converters.string,\n operator: CommonConvert.conditionOperator.optional(),\n priority: CommonConvert.conditionPriority.optional(),\n scoreAsDefault: Converters.number.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.IChildConditionDecl | child condition declaration}.\n * @public\n */\nexport const childConditionDecl: Converter<Json.IChildConditionDecl> =\n Converters.strictObject<Json.IChildConditionDecl>({\n value: Converters.string,\n operator: CommonConvert.conditionOperator.optional(),\n priority: CommonConvert.conditionPriority.optional(),\n scoreAsDefault: Converters.number.optional()\n });\n\nfunction _isConditionSetRecord(from: unknown): from is Record<string, string | Json.IChildConditionDecl> {\n return isJsonObject(from);\n}\n\nconst conditionSetDeclFromArray: Converter<Normalized.ConditionSetDecl> =\n Converters.arrayOf(looseConditionDecl);\nconst conditionSetDeclFromRecord: Converter<Normalized.ConditionSetDecl> = Converters.generic<\n Normalized.ConditionSetDecl,\n unknown\n>(\n (\n from: unknown,\n __self: Converter<Normalized.ConditionSetDecl, unknown>,\n context?: unknown\n ): Result<Normalized.ConditionSetDecl> => {\n /* c8 ignore next 3 - this is tested but coverage is confused */\n if (!_isConditionSetRecord(from)) {\n return fail('Expected an object');\n }\n return mapResults(\n Array.from(Object.entries(from)).map(([qualifierName, value]) => {\n const toConvert: Json.ILooseConditionDecl =\n typeof value === 'string' ? { qualifierName, value } : { qualifierName, ...value };\n return looseConditionDecl.convert(toConvert, context);\n })\n );\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.ConditionSetDecl | condition set declaration}.\n * @public\n */\nexport const conditionSetDecl: Converter<Normalized.ConditionSetDecl> =\n Converters.oneOf<Normalized.ConditionSetDecl>([conditionSetDeclFromArray, conditionSetDeclFromRecord]);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.ILooseResourceCandidateDecl | loose resource candidate declaration}.\n * @public\n */\nexport const looseResourceCandidateDecl: Converter<Normalized.ILooseResourceCandidateDecl> =\n Converters.strictObject<Normalized.ILooseResourceCandidateDecl>({\n id: CommonConvert.resourceId,\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IImporterResourceCandidateDecl | importer resource candidate declaration}.\n * @public\n */\nexport const importerResourceCandidateDecl: Converter<Normalized.IImporterResourceCandidateDecl> =\n Converters.strictObject<Normalized.IImporterResourceCandidateDecl>({\n id: CommonConvert.resourceId.optional(),\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Json.IChildResourceCandidateDecl | child resource candidate declaration}.\n * @public\n */\nexport const childResourceCandidateDecl: Converter<Normalized.IChildResourceCandidateDecl> =\n Converters.strictObject<Normalized.IChildResourceCandidateDecl>({\n json: JsonConverters.jsonObject,\n conditions: conditionSetDecl.optional(),\n isPartial: Converters.boolean.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.ILooseResourceDecl | loose resource declaration}.\n * @public\n */\nexport const looseResourceDecl: Converter<Normalized.ILooseResourceDecl> =\n Converters.strictObject<Normalized.ILooseResourceDecl>({\n id: CommonConvert.resourceId,\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(childResourceCandidateDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IChildResourceDecl | child resource declaration}.\n * @public\n */\nexport const childResourceDecl: Converter<Normalized.IChildResourceDecl> =\n Converters.strictObject<Normalized.IChildResourceDecl>({\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(childResourceCandidateDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IContainerContextDecl | resource context declaration}.\n * @public\n */\nexport const containerContextDecl: Converter<Normalized.IContainerContextDecl> =\n Converters.strictObject<Normalized.IContainerContextDecl>({\n baseId: Converters.oneOf([CommonConvert.resourceId, Converters.literal('')]).optional(),\n conditions: conditionSetDecl.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceTreeChildNodeDecl | resource tree child node declaration}.\n * @public\n */\nexport const resourceTreeChildNodeDecl: Converter<Normalized.IResourceTreeChildNodeDecl> = Converters.generic<\n Normalized.IResourceTreeChildNodeDecl,\n unknown\n>(\n (\n from: unknown,\n self: Converter<Normalized.IResourceTreeChildNodeDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IResourceTreeChildNodeDecl> => {\n return Converters.strictObject<Normalized.IResourceTreeChildNodeDecl>({\n resources: Converters.recordOf(childResourceDecl).optional(),\n children: Converters.recordOf(self).optional()\n }).convert(from, context);\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceTreeRootDecl | resource tree root declaration}.\n * @public\n */\nexport const resourceTreeRootDecl: Converter<Normalized.IResourceTreeRootDecl> =\n Converters.strictObject<Normalized.IResourceTreeRootDecl>({\n context: containerContextDecl.optional(),\n resources: Converters.recordOf(childResourceDecl).optional(),\n children: Converters.recordOf(resourceTreeChildNodeDecl).optional()\n });\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IResourceCollectionDecl | resource collection declaration}.\n * @public\n */\nexport const resourceCollectionDecl: Converter<Normalized.IResourceCollectionDecl> = Converters.generic<\n Normalized.IResourceCollectionDecl,\n unknown\n>(\n (\n from: unknown,\n self: Converter<Normalized.IResourceCollectionDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IResourceCollectionDecl> => {\n return Converters.strictObject<Normalized.IResourceCollectionDecl>({\n context: containerContextDecl.optional(),\n candidates: Converters.arrayOf(looseResourceCandidateDecl).optional(),\n resources: Converters.arrayOf(looseResourceDecl).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n);\n\n/**\n * `Converter` for a normalized {@link ResourceJson.Normalized.IImporterResourceCollectionDecl | importer resource collection declaration}.\n * This allows for a mix of loose and child resource declarations.\n * @public\n */\nexport const importerResourceCollectionDecl: Converter<Normalized.IImporterResourceCollectionDecl> =\n Converters.generic<Normalized.IImporterResourceCollectionDecl, unknown>(\n (\n from: unknown,\n self: Converter<Normalized.IImporterResourceCollectionDecl, unknown>,\n context?: unknown\n ): Result<Normalized.IImporterResourceCollectionDecl> => {\n return Converters.strictObject<Normalized.IImporterResourceCollectionDecl>({\n context: containerContextDecl.optional(),\n candidates: Converters.arrayOf(importerResourceCandidateDecl).optional(),\n resources: Converters.arrayOf(Converters.oneOf([looseResourceDecl, childResourceDecl])).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n );\n\n// --- Typed sibling converters (Phase B-2) -----------------------------------\n//\n// Each `typed*<TQualifierNames>(qualifierNameConverter)` returns a converter\n// whose result type is narrowed on `TQualifierNames`. The existing untyped\n// exports above remain unchanged at the signature and behavior level; consumers\n// opt in by calling a typed sibling. Internally each typed factory composes\n// lower-level typed factories so a single `qualifierNameConverter` flows\n// end-to-end through the converter tree.\n//\n// DRIFT HAZARD: each typed sibling duplicates the field list of its untyped\n// twin (the duplication exists to preserve `ObjectConverter` return types on\n// the defaults — see phase-b2-result.md). If a field is added, removed, or\n// re-typed on an untyped converter above, the typed sibling MUST be updated\n// in lockstep. The per-pair `keep in sync with X` markers below flag each\n// pair at the call site.\n\n/**\n * Returns a `Converter` for a `Json.ILooseConditionDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `looseConditionDecl` above.\nexport function typedLooseConditionDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.ILooseConditionDecl<TQualifierNames>> {\n return Converters.strictObject<Json.ILooseConditionDecl<TQualifierNames>>({\n qualifierName: qualifierNameConverter,\n value: Converters.string,\n operator: CommonConvert.conditionOperator.optional(),\n priority: CommonConvert.conditionPriority.optional(),\n scoreAsDefault: Converters.number.optional()\n });\n}\n\nfunction _typedConditionSetDeclFromArray<TQualifierNames extends string>(\n innerLooseConditionDecl: Converter<Json.ILooseConditionDecl<TQualifierNames>>\n): Converter<Json.ConditionSetDeclAsArray<TQualifierNames>> {\n return Converters.arrayOf(innerLooseConditionDecl);\n}\n\nfunction _typedConditionSetDeclFromRecord<TQualifierNames extends string>(\n innerLooseConditionDecl: Converter<Json.ILooseConditionDecl<TQualifierNames>>\n): Converter<Json.ConditionSetDecl<TQualifierNames>> {\n return Converters.generic<Json.ConditionSetDecl<TQualifierNames>, unknown>(\n (\n from: unknown,\n __self: Converter<Json.ConditionSetDecl<TQualifierNames>, unknown>,\n context?: unknown\n ): Result<Json.ConditionSetDecl<TQualifierNames>> => {\n /* c8 ignore next 3 - branch covered by underlying record check */\n if (!_isConditionSetRecord(from)) {\n return fail('Expected an object');\n }\n return mapResults(\n Array.from(Object.entries(from)).map(([qualifierName, value]) => {\n const toConvert: Json.ILooseConditionDecl =\n typeof value === 'string' ? { qualifierName, value } : { qualifierName, ...value };\n return innerLooseConditionDecl.convert(toConvert, context);\n })\n );\n }\n );\n}\n\n/**\n * Returns a `Converter` for a `Json.ConditionSetDecl<TQualifierNames>`\n * (either array form or record form) narrowed on a supplied `qualifierName`\n * converter.\n *\n * @public\n */\n// Keep in sync with `conditionSetDecl` (and its two private feeder converters\n// `conditionSetDeclFromArray` / `conditionSetDeclFromRecord`) above.\nexport function typedConditionSetDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.ConditionSetDecl<TQualifierNames>> {\n const inner = typedLooseConditionDecl(qualifierNameConverter);\n return Converters.oneOf<Json.ConditionSetDecl<TQualifierNames>>([\n _typedConditionSetDeclFromArray(inner),\n _typedConditionSetDeclFromRecord(inner)\n ]);\n}\n\n/**\n * Returns a `Converter` for a `Json.ILooseResourceCandidateDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `looseResourceCandidateDecl` above.\nexport function typedLooseResourceCandidateDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.ILooseResourceCandidateDecl<TQualifierNames>> {\n return Converters.strictObject<Json.ILooseResourceCandidateDecl<TQualifierNames>>({\n id: CommonConvert.resourceId,\n json: JsonConverters.jsonObject,\n conditions: typedConditionSetDecl(qualifierNameConverter).optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IImporterResourceCandidateDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `importerResourceCandidateDecl` above.\nexport function typedImporterResourceCandidateDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IImporterResourceCandidateDecl<TQualifierNames>> {\n return Converters.strictObject<Json.IImporterResourceCandidateDecl<TQualifierNames>>({\n id: CommonConvert.resourceId.optional(),\n json: JsonConverters.jsonObject,\n conditions: typedConditionSetDecl(qualifierNameConverter).optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional(),\n isPartial: Converters.boolean.optional(),\n resourceTypeName: CommonConvert.resourceTypeName.optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IChildResourceCandidateDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `childResourceCandidateDecl` above.\nexport function typedChildResourceCandidateDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IChildResourceCandidateDecl<TQualifierNames>> {\n return Converters.strictObject<Json.IChildResourceCandidateDecl<TQualifierNames>>({\n json: JsonConverters.jsonObject,\n conditions: typedConditionSetDecl(qualifierNameConverter).optional(),\n isPartial: Converters.boolean.optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.ILooseResourceDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `looseResourceDecl` above.\nexport function typedLooseResourceDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.ILooseResourceDecl<TQualifierNames>> {\n return Converters.strictObject<Json.ILooseResourceDecl<TQualifierNames>>({\n id: CommonConvert.resourceId,\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(typedChildResourceCandidateDecl(qualifierNameConverter)).optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IChildResourceDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `childResourceDecl` above.\nexport function typedChildResourceDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IChildResourceDecl<TQualifierNames>> {\n return Converters.strictObject<Json.IChildResourceDecl<TQualifierNames>>({\n resourceTypeName: CommonConvert.resourceTypeName,\n candidates: Converters.arrayOf(typedChildResourceCandidateDecl(qualifierNameConverter)).optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IContainerContextDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `containerContextDecl` above.\nexport function typedContainerContextDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IContainerContextDecl<TQualifierNames>> {\n return Converters.strictObject<Json.IContainerContextDecl<TQualifierNames>>({\n baseId: Converters.oneOf([CommonConvert.resourceId, Converters.literal('')]).optional(),\n conditions: typedConditionSetDecl(qualifierNameConverter).optional(),\n mergeMethod: CommonConvert.resourceValueMergeMethod.optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IResourceTreeChildNodeDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `resourceTreeChildNodeDecl` above.\nexport function typedResourceTreeChildNodeDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IResourceTreeChildNodeDecl<TQualifierNames>> {\n const childResource = typedChildResourceDecl(qualifierNameConverter);\n return Converters.generic<Json.IResourceTreeChildNodeDecl<TQualifierNames>, unknown>(\n (\n from: unknown,\n self: Converter<Json.IResourceTreeChildNodeDecl<TQualifierNames>, unknown>,\n context?: unknown\n ): Result<Json.IResourceTreeChildNodeDecl<TQualifierNames>> => {\n return Converters.strictObject<Json.IResourceTreeChildNodeDecl<TQualifierNames>>({\n resources: Converters.recordOf(childResource).optional(),\n children: Converters.recordOf(self).optional()\n }).convert(from, context);\n }\n );\n}\n\n/**\n * Returns a `Converter` for a `Json.IResourceTreeRootDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `resourceTreeRootDecl` above.\nexport function typedResourceTreeRootDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IResourceTreeRootDecl<TQualifierNames>> {\n return Converters.strictObject<Json.IResourceTreeRootDecl<TQualifierNames>>({\n context: typedContainerContextDecl(qualifierNameConverter).optional(),\n resources: Converters.recordOf(typedChildResourceDecl(qualifierNameConverter)).optional(),\n children: Converters.recordOf(typedResourceTreeChildNodeDecl(qualifierNameConverter)).optional()\n });\n}\n\n/**\n * Returns a `Converter` for a `Json.IResourceCollectionDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `resourceCollectionDecl` above.\nexport function typedResourceCollectionDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IResourceCollectionDecl<TQualifierNames>> {\n const containerContext = typedContainerContextDecl(qualifierNameConverter);\n const looseCandidate = typedLooseResourceCandidateDecl(qualifierNameConverter);\n const looseResource = typedLooseResourceDecl(qualifierNameConverter);\n return Converters.generic<Json.IResourceCollectionDecl<TQualifierNames>, unknown>(\n (\n from: unknown,\n self: Converter<Json.IResourceCollectionDecl<TQualifierNames>, unknown>,\n context?: unknown\n ): Result<Json.IResourceCollectionDecl<TQualifierNames>> => {\n return Converters.strictObject<Json.IResourceCollectionDecl<TQualifierNames>>({\n context: containerContext.optional(),\n candidates: Converters.arrayOf(looseCandidate).optional(),\n resources: Converters.arrayOf(looseResource).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n );\n}\n\n/**\n * Returns a `Converter` for a `Json.IImporterResourceCollectionDecl<TQualifierNames>`\n * narrowed on a supplied `qualifierName` converter.\n *\n * @public\n */\n// Keep in sync with `importerResourceCollectionDecl` above.\nexport function typedImporterResourceCollectionDecl<TQualifierNames extends string>(\n qualifierNameConverter: Converter<TQualifierNames>\n): Converter<Json.IImporterResourceCollectionDecl<TQualifierNames>> {\n const containerContext = typedContainerContextDecl(qualifierNameConverter);\n const importerCandidate = typedImporterResourceCandidateDecl(qualifierNameConverter);\n const looseResource = typedLooseResourceDecl(qualifierNameConverter);\n const childResource = typedChildResourceDecl(qualifierNameConverter);\n return Converters.generic<Json.IImporterResourceCollectionDecl<TQualifierNames>, unknown>(\n (\n from: unknown,\n self: Converter<Json.IImporterResourceCollectionDecl<TQualifierNames>, unknown>,\n context?: unknown\n ): Result<Json.IImporterResourceCollectionDecl<TQualifierNames>> => {\n return Converters.strictObject<Json.IImporterResourceCollectionDecl<TQualifierNames>>({\n context: containerContext.optional(),\n candidates: Converters.arrayOf(importerCandidate).optional(),\n resources: Converters.arrayOf(Converters.oneOf([looseResource, childResource])).optional(),\n collections: Converters.arrayOf(self).optional(),\n metadata: JsonConverters.jsonObject.optional()\n }).convert(from, context);\n }\n );\n}\n"]}