@bedrock-engineer/bro-xml-parser 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +21 -12
  2. package/dist/browser.d.ts +15 -5
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +7 -5
  5. package/dist/browser.js.map +1 -1
  6. package/dist/core/columns.d.ts +80 -0
  7. package/dist/core/columns.d.ts.map +1 -0
  8. package/dist/core/columns.js +100 -0
  9. package/dist/core/columns.js.map +1 -0
  10. package/dist/core/producer.d.ts +216 -0
  11. package/dist/core/producer.d.ts.map +1 -0
  12. package/dist/core/producer.js +85 -0
  13. package/dist/core/producer.js.map +1 -0
  14. package/dist/core/schema-parser.d.ts +41 -17
  15. package/dist/core/schema-parser.d.ts.map +1 -1
  16. package/dist/core/schema-parser.js +178 -73
  17. package/dist/core/schema-parser.js.map +1 -1
  18. package/dist/core/version-detector.d.ts +3 -1
  19. package/dist/core/version-detector.d.ts.map +1 -1
  20. package/dist/core/version-detector.js +37 -0
  21. package/dist/core/version-detector.js.map +1 -1
  22. package/dist/decoders/constants.d.ts +2 -0
  23. package/dist/decoders/constants.d.ts.map +1 -0
  24. package/dist/decoders/constants.js +2 -0
  25. package/dist/decoders/constants.js.map +1 -0
  26. package/dist/decoders/type-decoders.d.ts +38 -0
  27. package/dist/decoders/type-decoders.d.ts.map +1 -0
  28. package/dist/decoders/type-decoders.js +134 -0
  29. package/dist/decoders/type-decoders.js.map +1 -0
  30. package/dist/namespaces.d.ts.map +1 -1
  31. package/dist/namespaces.js +16 -0
  32. package/dist/namespaces.js.map +1 -1
  33. package/dist/node.d.ts +15 -5
  34. package/dist/node.d.ts.map +1 -1
  35. package/dist/node.js +7 -5
  36. package/dist/node.js.map +1 -1
  37. package/dist/parser.d.ts +69 -19
  38. package/dist/parser.d.ts.map +1 -1
  39. package/dist/parser.js +103 -29
  40. package/dist/parser.js.map +1 -1
  41. package/dist/producers.d.ts +36 -0
  42. package/dist/producers.d.ts.map +1 -0
  43. package/dist/producers.js +35 -0
  44. package/dist/producers.js.map +1 -0
  45. package/dist/resolvers/bhrg-resolvers.d.ts +3 -18
  46. package/dist/resolvers/bhrg-resolvers.d.ts.map +1 -1
  47. package/dist/resolvers/bhrg-resolvers.js +294 -41
  48. package/dist/resolvers/bhrg-resolvers.js.map +1 -1
  49. package/dist/resolvers/bore-resolver-utils.d.ts +21 -2
  50. package/dist/resolvers/bore-resolver-utils.d.ts.map +1 -1
  51. package/dist/resolvers/bore-resolver-utils.js +69 -22
  52. package/dist/resolvers/bore-resolver-utils.js.map +1 -1
  53. package/dist/resolvers/bore-resolvers.d.ts +34 -17
  54. package/dist/resolvers/bore-resolvers.d.ts.map +1 -1
  55. package/dist/resolvers/bore-resolvers.js +342 -175
  56. package/dist/resolvers/bore-resolvers.js.map +1 -1
  57. package/dist/resolvers/cpt-resolvers.d.ts +1 -8
  58. package/dist/resolvers/cpt-resolvers.d.ts.map +1 -1
  59. package/dist/resolvers/cpt-resolvers.js +2 -29
  60. package/dist/resolvers/cpt-resolvers.js.map +1 -1
  61. package/dist/resolvers/gld-resolvers.d.ts +30 -0
  62. package/dist/resolvers/gld-resolvers.d.ts.map +1 -0
  63. package/dist/resolvers/gld-resolvers.js +76 -0
  64. package/dist/resolvers/gld-resolvers.js.map +1 -0
  65. package/dist/resolvers/gmw-resolvers.d.ts +37 -0
  66. package/dist/resolvers/gmw-resolvers.d.ts.map +1 -0
  67. package/dist/resolvers/gmw-resolvers.js +101 -0
  68. package/dist/resolvers/gmw-resolvers.js.map +1 -0
  69. package/dist/resolvers/type-resolvers.d.ts +12 -4
  70. package/dist/resolvers/type-resolvers.d.ts.map +1 -1
  71. package/dist/resolvers/type-resolvers.js +12 -4
  72. package/dist/resolvers/type-resolvers.js.map +1 -1
  73. package/dist/resolvers.d.ts +5 -2
  74. package/dist/resolvers.d.ts.map +1 -1
  75. package/dist/resolvers.js +8 -2
  76. package/dist/resolvers.js.map +1 -1
  77. package/dist/schema-presets.d.ts +67 -16
  78. package/dist/schema-presets.d.ts.map +1 -1
  79. package/dist/schema-presets.js +51 -114
  80. package/dist/schema-presets.js.map +1 -1
  81. package/dist/schemas/bhrg-schema.d.ts +528 -9
  82. package/dist/schemas/bhrg-schema.d.ts.map +1 -1
  83. package/dist/schemas/bhrg-schema.js +330 -162
  84. package/dist/schemas/bhrg-schema.js.map +1 -1
  85. package/dist/schemas/bhrgt-analysis.d.ts +1057 -0
  86. package/dist/schemas/bhrgt-analysis.d.ts.map +1 -0
  87. package/dist/schemas/bhrgt-analysis.js +454 -0
  88. package/dist/schemas/bhrgt-analysis.js.map +1 -0
  89. package/dist/schemas/bore-schema.d.ts +773 -9
  90. package/dist/schemas/bore-schema.d.ts.map +1 -1
  91. package/dist/schemas/bore-schema.js +344 -257
  92. package/dist/schemas/bore-schema.js.map +1 -1
  93. package/dist/schemas/common-fields.d.ts +61 -0
  94. package/dist/schemas/common-fields.d.ts.map +1 -0
  95. package/dist/schemas/common-fields.js +82 -0
  96. package/dist/schemas/common-fields.js.map +1 -0
  97. package/dist/schemas/cpt-schema.d.ts +126 -9
  98. package/dist/schemas/cpt-schema.d.ts.map +1 -1
  99. package/dist/schemas/cpt-schema.js +182 -275
  100. package/dist/schemas/cpt-schema.js.map +1 -1
  101. package/dist/schemas/generated/gld.generated.d.ts +9 -0
  102. package/dist/schemas/generated/gld.generated.d.ts.map +1 -0
  103. package/dist/schemas/generated/gld.generated.js +19 -0
  104. package/dist/schemas/generated/gld.generated.js.map +1 -0
  105. package/dist/schemas/gld-schema.d.ts +92 -0
  106. package/dist/schemas/gld-schema.d.ts.map +1 -0
  107. package/dist/schemas/gld-schema.js +88 -0
  108. package/dist/schemas/gld-schema.js.map +1 -0
  109. package/dist/schemas/gmw-schema.d.ts +180 -0
  110. package/dist/schemas/gmw-schema.d.ts.map +1 -0
  111. package/dist/schemas/gmw-schema.js +131 -0
  112. package/dist/schemas/gmw-schema.js.map +1 -0
  113. package/dist/types/index.d.ts +51 -1005
  114. package/dist/types/index.d.ts.map +1 -1
  115. package/dist/types/index.js.map +1 -1
  116. package/package.json +3 -2
package/README.md CHANGED
@@ -60,24 +60,33 @@ const bhr_g = parser.parseBHRG(xmlText);
60
60
 
61
61
  Extract only the fields you need:
62
62
 
63
+ Build a schema from the `producers` combinators — a map of field name → producer.
64
+ The return type is inferred from the map, so `result.depth` is `number | null`,
65
+ `result.location` is `Location | null`, with no casts:
66
+
63
67
  ```typescript
64
- import { BROParser, XMLAdapter, resolvers } from "@bedrock-engineer/bro-xml-parser/node";
68
+ import { BROParser, XMLAdapter, producers as p } from "@bedrock-engineer/bro-xml-parser/node";
65
69
 
66
70
  const parser = new BROParser(new XMLAdapter());
67
71
 
68
- const mySchema = {
69
- id: { xpath: "brocom:broId" },
70
- depth: { xpath: ".//cptcommon:finalDepth", resolver: resolvers.parseFloat },
71
- location: {
72
- xpath: "./dscpt:deliveredLocation/cptcommon:location",
73
- resolver: resolvers.parseGMLLocation,
72
+ const result = parser.parseCustom(
73
+ xmlText,
74
+ {
75
+ id: p.text("brocom:broId"),
76
+ depth: p.number_(".//cptcommon:finalDepth"),
77
+ location: p.gmlLocation("./dscpt:deliveredLocation/cptcommon:location"),
74
78
  },
75
- };
76
-
77
- const result = parser.parseCustom(xmlText, mySchema, "CPT");
78
- // { id: "CPT000000099543", depth: 25.5, location: { x: 155000, y: 463000, epsg: "28992" } }
79
+ "CPT",
80
+ );
81
+ // { id: "CPT000000099543", depth: 25.5, location: { x: 155000, y: 463000, epsg: "28992" }, meta: {…} }
79
82
  ```
80
83
 
84
+ The `producers` namespace carries every building block the library uses internally:
85
+ scalar combinators (`text`, `number_`, `integer`, `date`, `boolean_`, `qualityClass`),
86
+ structural combinators (`object_`, `array`, `oneOf`, `custom`), the domain helpers
87
+ (`gmlLocation`, `columns`), and the shared field-maps (`COMMON_REGISTRATION_PRODUCERS`,
88
+ `REGISTRATION_HISTORY`) you can spread into a schema.
89
+
81
90
  ## API
82
91
 
83
92
  | Method | Returns | Description |
@@ -86,7 +95,7 @@ const result = parser.parseCustom(xmlText, mySchema, "CPT");
86
95
  | `parseCPT(xml)` | `CPTData` | Parse CPT file |
87
96
  | `parseBHRGT(xml)` | `BHRGTData` | Parse BHR-GT file |
88
97
  | `parseBHRG(xml)` | `BHRGData` | Parse BHR-G file |
89
- | `parseCustom(xml, schema, type?)` | `T` | Parse with custom schema |
98
+ | `parseCustom(xml, fields, type?)` | `T` | Parse with a producer map |
90
99
 
91
100
  See [`src/types/index.ts`](./src/types/index.ts) for full type definitions.
92
101
 
package/dist/browser.d.ts CHANGED
@@ -13,15 +13,25 @@
13
13
  */
14
14
  export { BROParser } from "./parser.js";
15
15
  export { BrowserXMLAdapter as XMLAdapter } from "./adapters/browser-adapter.js";
16
- export type { CPTData, CPTMeasurement, BHRGTData, BHRGTLayer, Grainshape, BHRGData, BHRGLayer, BROData, BROFileType, Location, ParseMeta, Schema, SchemaField, ResolverFunction, ResolverContext, Namespaces, BoreholeSampleAnalysis, InvestigatedInterval, ParticleSizeDistributionDetermination, ConsistencyLimitsDetermination, SettlementCharacteristicsDetermination, SaturatedPermeabilityDetermination, SaturatedPermeabilityAtSpecificDensity, ShearStressChangeDuringLoadingDetermination, SettlementDeterminationStep, ShearStressAtSpecificStrain, MaximumUndrainedShearStrengthDetermination, ShearStressChangeDuringHorizontalDeformationDetermination, ConsolidationStageAtHorizontalDeformation, ConsolidationStepAtHorizontalDeformation, ShearStageAtHorizontalDeformation, HorizontalDeformationDataPoint, HeightAtSpecificConsolidationTime, DissipationTest, DissipationMeasurement, QualityRegime, PlasticityAtSpecificWaterContent, HeightAtSpecificTime, MembraneCorrection, DrainageStripCorrection, SaturationStageAtLoading, SaturationStageAtCompression, SpecimenMadeForLoading, StressAtSpecificSettlement, VolumeChangeAtSpecificTime, ConsolidationStageAtLoading, LoadStage, RemovedLayer, RegistrationHistory, ReportHistory, IntermediateEvent, BoredInterval, SamplerDetails, SampledInterval, CompletedInterval, NotDescribedInterval, WaterContentDetermination, VolumetricMassDensityDetermination, OrganicMatterContentDetermination, CarbonateContentDetermination, VolumetricMassDensityOfSolidsDetermination, } from "./types/index.js";
16
+ export type { CPTData, CPTMeasurement, DissipationMeasurement, BHRGTData, BHRGData, GMWData, GLDData, BROData, BROFileType, Location, ParseMeta, Namespaces, QualityRegime, } from "./types/index.js";
17
+ export type { RegistrationHistory } from "./schemas/common-fields.js";
17
18
  export { BROParseError } from "./types/index.js";
18
19
  export { SUPPORTED_VERSIONS } from "./core/version-detector.js";
19
20
  export type { DataType } from "./core/version-detector.js";
20
- export { CPT_SCHEMA } from "./schemas/cpt-schema.js";
21
- export { BORE_SCHEMA } from "./schemas/bore-schema.js";
22
- export { BHRG_SCHEMA } from "./schemas/bhrg-schema.js";
21
+ export { CPT_PRODUCER } from "./schemas/cpt-schema.js";
22
+ export type { DissipationTest, RemovedLayer } from "./schemas/cpt-schema.js";
23
+ export { BORE_PRODUCER } from "./schemas/bore-schema.js";
24
+ export type { BHRGTLayer, BHRGTLayerBase, BHRGTSoilLayer, BHRGTRockLayer, RockDescription, RockWeatheringDegree, Grainshape, BoredInterval, SampledInterval, SamplerDetails, CoreRecovery, CompletedInterval, PostSedimentaryDiscontinuity, ExcavatedLayer, BoringVelocityMeasurement, NotDescribedInterval, FluidMudLayer, } from "./schemas/bore-schema.js";
25
+ export type { HeightAtSpecificTime, StressAtSpecificSettlement, VolumeChangeAtSpecificTime, ShearStressAtSpecificStrain, HorizontalDeformationDataPoint, BoreholeSampleAnalysis, InvestigatedInterval, WaterContentDetermination, VolumetricMassDensityDetermination, OrganicMatterContentDetermination, CarbonateContentDetermination, VolumetricMassDensityOfSolidsDetermination, MaximumUndrainedShearStrengthDetermination, ParticleSizeDistributionDetermination, ConsistencyLimitsDetermination, SettlementCharacteristicsDetermination, SettlementDeterminationStep, SaturationStageAtCompression, SaturatedPermeabilityDetermination, ShearStressChangeDuringLoadingDetermination, ConsolidationStepAtHorizontalDeformation, ShearStressChangeDuringHorizontalDeformationDetermination, PlasticityAtSpecificWaterContent, SaturatedPermeabilityAtSpecificDensity, SaturatedPermeabilityAtSpecificLoad, MembraneCorrection, DrainageStripCorrection, SpecimenMadeForLoading, SaturationStageAtLoading, ConsolidationStageAtLoading, LoadStage, ConsolidationStageAtHorizontalDeformation, ShearStageAtHorizontalDeformation, } from "./schemas/bhrgt-analysis.js";
26
+ export type { GLDObservation, GLDObservationPoint, GroundwaterMonitoringTubeRef, } from "./schemas/gld-schema.js";
27
+ export { BHRG_PRODUCER } from "./schemas/bhrg-schema.js";
28
+ export type { BHRGLayer, MunsellColour, SandFraction, SandConstituent, ShellFraction, ShellConstituent, GravelFraction, GravelConstituent, PeatFraction, PeatConstituent, Chunk, FractionDistribution, FineFractionDistributionOrganicSoil, FineFractionDistributionShellySoil, Mottle, ThinStratum, ReportHistory, IntermediateEvent, } from "./schemas/bhrg-schema.js";
29
+ export { GMW_PRODUCER } from "./schemas/gmw-schema.js";
30
+ export type { MonitoringTube, GeoOhmCable, Electrode, GMWIntermediateEvent, } from "./schemas/gmw-schema.js";
31
+ export { GLD_PRODUCER } from "./schemas/gld-schema.js";
23
32
  export { BRO_NAMESPACES, KNOWN_BRO_PREFIXES } from "./namespaces.js";
24
33
  export { BRO_SOIL_COLORS, getSoilColor, isValidSoilColor, getSoilColorNames } from "./colors.js";
25
- export * as resolvers from "./resolvers.js";
34
+ export * as producers from "./producers.js";
35
+ export type { Producer, NodeLens, Produced, ProducedFields } from "./core/producer.js";
26
36
  export * as presets from "./schema-presets.js";
27
37
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iBAAiB,IAAI,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhF,YAAY,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,EACT,OAAO,EACP,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qCAAqC,EACrC,8BAA8B,EAC9B,sCAAsC,EACtC,kCAAkC,EAClC,sCAAsC,EACtC,2CAA2C,EAC3C,2BAA2B,EAC3B,2BAA2B,EAC3B,0CAA0C,EAC1C,yDAAyD,EACzD,yCAAyC,EACzC,wCAAwC,EACxC,iCAAiC,EACjC,8BAA8B,EAC9B,iCAAiC,EACjC,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,gCAAgC,EAChC,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,EAClC,iCAAiC,EACjC,6BAA6B,EAC7B,0CAA0C,GAC3C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGjG,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAG5C,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
package/dist/browser.js CHANGED
@@ -15,13 +15,15 @@ export { BROParser } from "./parser.js";
15
15
  export { BrowserXMLAdapter as XMLAdapter } from "./adapters/browser-adapter.js";
16
16
  export { BROParseError } from "./types/index.js";
17
17
  export { SUPPORTED_VERSIONS } from "./core/version-detector.js";
18
- export { CPT_SCHEMA } from "./schemas/cpt-schema.js";
19
- export { BORE_SCHEMA } from "./schemas/bore-schema.js";
20
- export { BHRG_SCHEMA } from "./schemas/bhrg-schema.js";
18
+ export { CPT_PRODUCER } from "./schemas/cpt-schema.js";
19
+ export { BORE_PRODUCER } from "./schemas/bore-schema.js";
20
+ export { BHRG_PRODUCER } from "./schemas/bhrg-schema.js";
21
+ export { GMW_PRODUCER } from "./schemas/gmw-schema.js";
22
+ export { GLD_PRODUCER } from "./schemas/gld-schema.js";
21
23
  export { BRO_NAMESPACES, KNOWN_BRO_PREFIXES } from "./namespaces.js";
22
24
  export { BRO_SOIL_COLORS, getSoilColor, isValidSoilColor, getSoilColorNames } from "./colors.js";
23
- // Export resolvers for custom schema definitions
24
- export * as resolvers from "./resolvers.js";
25
+ // The authoring surface for custom schemas (combinators + domain helpers).
26
+ export * as producers from "./producers.js";
25
27
  // Export schema presets for common use cases
26
28
  export * as presets from "./schema-presets.js";
27
29
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iBAAiB,IAAI,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAkEhF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjG,iDAAiD;AACjD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAE5C,6CAA6C;AAC7C,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iBAAiB,IAAI,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAmBhF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA4DzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqBzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjG,2EAA2E;AAC3E,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAK5C,6CAA6C;AAC7C,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `decodeColumns` — decode BRO's column time-series (space-separated rows of
3
+ * comma-delimited columns: settlement steps, triaxial/direct-shear loading
4
+ * stages, the CPT measurement block).
5
+ *
6
+ * A caller declares a typed column spec and gets typed rows back; the −999999 /
7
+ * "NaN" sentinel→null rule lives here. Decodes the *content* of one leaf's CSV
8
+ * text; the {@link columns} producer bridges it into the tree-shaped
9
+ * {@link Producer} DSL.
10
+ */
11
+ import type { CustomProducer } from "./producer.js";
12
+ /** Parse one CSV cell into a typed value. */
13
+ export type ColumnParser<V> = (raw: string) => V;
14
+ /** One column of a CSV time-series. */
15
+ export interface ColumnSpec<Name extends string = string, V = unknown> {
16
+ /** Output property name on each row object. */
17
+ name: Name;
18
+ /** Cell parser (see `col`). */
19
+ parse: ColumnParser<V>;
20
+ /**
21
+ * When true, a row missing this (trailing) column is still kept. By default a
22
+ * row with fewer cells than the number of required columns is dropped.
23
+ */
24
+ optional?: boolean;
25
+ }
26
+ /** Flatten an intersection into a single object literal for legible hovers. */
27
+ type Simplify<T> = {
28
+ [K in keyof T]: T[K];
29
+ } & {};
30
+ /**
31
+ * The row object inferred from a `const` column-spec tuple. Every non-`null`
32
+ * column contributes a **required** key (the decoder always assigns it — `null`
33
+ * when the cell is absent), typed as that column's cell-parser return type.
34
+ * A `null` spec entry (a skipped position) contributes nothing.
35
+ */
36
+ export type RowOf<Spec extends ReadonlyArray<ColumnSpec | null>> = Simplify<{
37
+ [S in Extract<Spec[number], ColumnSpec> as S["name"]]: ReturnType<S["parse"]>;
38
+ }>;
39
+ export interface DecodeColumnsOptions {
40
+ /** Row delimiter (default: any run of whitespace). */
41
+ rowSeparator?: string | RegExp;
42
+ /** Column delimiter within a row (default: `,`). */
43
+ colSeparator?: string;
44
+ }
45
+ /**
46
+ * Standard cell parsers. The −999999 sentinel and the literal "NaN" both decode
47
+ * to `null`.
48
+ */
49
+ export declare const col: {
50
+ /** Decimal number, or `null` for empty / sentinel / NaN. */
51
+ num: (raw: string) => number | null;
52
+ /** Integer, or `null` for empty / sentinel / NaN. */
53
+ int: (raw: string) => number | null;
54
+ /** Trimmed string, or `null` when empty. */
55
+ str: (raw: string) => string | null;
56
+ /** Boolean, understanding BRO's `ja`/`nee`. */
57
+ bool: (raw: string) => boolean | null;
58
+ };
59
+ /**
60
+ * Decode CSV text into typed row objects per a column spec.
61
+ *
62
+ * Rows are split on {@link DecodeColumnsOptions.rowSeparator} (default:
63
+ * whitespace) and cells on {@link DecodeColumnsOptions.colSeparator} (default:
64
+ * `,`). Each column is parsed positionally (a missing trailing cell yields
65
+ * `null`); a `null` entry in `columns` skips that position (for column masks
66
+ * where only some positions are wanted). A row with fewer cells than the number
67
+ * of required (non-`optional`, non-skipped) columns is dropped as malformed.
68
+ */
69
+ export declare function decodeColumns<T>(text: string | null | undefined, columns: ReadonlyArray<ColumnSpec | null>, options?: DecodeColumnsOptions): Array<T>;
70
+ /**
71
+ * A {@link Producer} that reads the CSV text at `valuesAt` (relative to the
72
+ * enclosing node) and decodes it with `decodeColumns`. Yields `[]` when the
73
+ * values element is absent.
74
+ *
75
+ * The row type is **inferred** from the (`as const`) `spec` — each column's name
76
+ * and cell-parser return type — so callers no longer declare it by hand.
77
+ */
78
+ export declare function columns<const Spec extends ReadonlyArray<ColumnSpec | null>>(valuesAt: string, spec: Spec, options?: DecodeColumnsOptions): CustomProducer<Array<RowOf<Spec>>>;
79
+ export {};
80
+ //# sourceMappingURL=columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/core/columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,6CAA6C;AAC7C,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;AAEjD,uCAAuC;AACvC,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO;IACnE,+CAA+C;IAC/C,IAAI,EAAE,IAAI,CAAC;IACX,+BAA+B;IAC/B,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,+EAA+E;AAC/E,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,KAAK,CAAC,IAAI,SAAS,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAC;KACzE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;CAC9E,CAAC,CAAC;AAEH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,GAAG;IACd,4DAA4D;eACjD,MAAM,KAAG,MAAM,GAAG,IAAI;IAQjC,qDAAqD;eAC1C,MAAM,KAAG,MAAM,GAAG,IAAI;IAQjC,4CAA4C;eACjC,MAAM,KAAG,MAAM,GAAG,IAAI;IAIjC,+CAA+C;gBACnC,MAAM,KAAG,OAAO,GAAG,IAAI;CACpC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,EAAE,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,EACzC,OAAO,GAAE,oBAAyB,GACjC,KAAK,CAAC,CAAC,CAAC,CAiCV;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,EACzE,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,oBAAoB,GAC7B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAIpC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `decodeColumns` — decode BRO's column time-series (space-separated rows of
3
+ * comma-delimited columns: settlement steps, triaxial/direct-shear loading
4
+ * stages, the CPT measurement block).
5
+ *
6
+ * A caller declares a typed column spec and gets typed rows back; the −999999 /
7
+ * "NaN" sentinel→null rule lives here. Decodes the *content* of one leaf's CSV
8
+ * text; the {@link columns} producer bridges it into the tree-shaped
9
+ * {@link Producer} DSL.
10
+ */
11
+ import { SENTINEL } from "../decoders/constants.js";
12
+ import { parseBoolean } from "../decoders/type-decoders.js";
13
+ import { custom } from "./producer.js";
14
+ /**
15
+ * Standard cell parsers. The −999999 sentinel and the literal "NaN" both decode
16
+ * to `null`.
17
+ */
18
+ export const col = {
19
+ /** Decimal number, or `null` for empty / sentinel / NaN. */
20
+ num: (raw) => {
21
+ const trimmed = raw.trim();
22
+ if (trimmed === "") {
23
+ return null;
24
+ }
25
+ const n = Number.parseFloat(trimmed);
26
+ return n === SENTINEL || isNaN(n) ? null : n;
27
+ },
28
+ /** Integer, or `null` for empty / sentinel / NaN. */
29
+ int: (raw) => {
30
+ const trimmed = raw.trim();
31
+ if (trimmed === "") {
32
+ return null;
33
+ }
34
+ const n = Number.parseInt(trimmed, 10);
35
+ return n === SENTINEL || isNaN(n) ? null : n;
36
+ },
37
+ /** Trimmed string, or `null` when empty. */
38
+ str: (raw) => {
39
+ const trimmed = raw.trim();
40
+ return trimmed === "" ? null : trimmed;
41
+ },
42
+ /** Boolean, understanding BRO's `ja`/`nee`. */
43
+ bool: (raw) => parseBoolean(raw),
44
+ };
45
+ /**
46
+ * Decode CSV text into typed row objects per a column spec.
47
+ *
48
+ * Rows are split on {@link DecodeColumnsOptions.rowSeparator} (default:
49
+ * whitespace) and cells on {@link DecodeColumnsOptions.colSeparator} (default:
50
+ * `,`). Each column is parsed positionally (a missing trailing cell yields
51
+ * `null`); a `null` entry in `columns` skips that position (for column masks
52
+ * where only some positions are wanted). A row with fewer cells than the number
53
+ * of required (non-`optional`, non-skipped) columns is dropped as malformed.
54
+ */
55
+ export function decodeColumns(text, columns, options = {}) {
56
+ if (!text) {
57
+ return [];
58
+ }
59
+ const trimmed = text.trim();
60
+ if (trimmed === "") {
61
+ return [];
62
+ }
63
+ const rowSeparator = options.rowSeparator ?? /\s+/;
64
+ const colSeparator = options.colSeparator ?? ",";
65
+ const requiredCount = columns.filter((c) => c && !c.optional).length;
66
+ const out = [];
67
+ for (const row of trimmed.split(rowSeparator)) {
68
+ if (row.trim() === "") {
69
+ continue;
70
+ }
71
+ const cells = row.split(colSeparator);
72
+ if (cells.length < requiredCount) {
73
+ continue;
74
+ }
75
+ const record = {};
76
+ columns.forEach((spec, i) => {
77
+ if (!spec) {
78
+ return;
79
+ }
80
+ const cell = cells[i];
81
+ record[spec.name] = cell === undefined ? null : spec.parse(cell);
82
+ });
83
+ out.push(record);
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * A {@link Producer} that reads the CSV text at `valuesAt` (relative to the
89
+ * enclosing node) and decodes it with `decodeColumns`. Yields `[]` when the
90
+ * values element is absent.
91
+ *
92
+ * The row type is **inferred** from the (`as const`) `spec` — each column's name
93
+ * and cell-parser return type — so callers no longer declare it by hand.
94
+ */
95
+ export function columns(valuesAt, spec, options) {
96
+ return custom({
97
+ produce: (lens) => decodeColumns(lens.textAt(valuesAt), spec, options),
98
+ });
99
+ }
100
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/core/columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * The Producer schema DSL.
3
+ *
4
+ * A {@link Producer} describes how to turn one XML node into one typed value. It
5
+ * is the single recursive unit of a schema: an object producer's fields are
6
+ * themselves producers, an array producer's item is a producer, and so on all
7
+ * the way down. {@link SchemaParser.produce} interprets this tree.
8
+ *
9
+ * Five kinds, each built by a combinator:
10
+ * - `scalar` — a leaf: text (or an attribute) decoded into `T`.
11
+ * - `object` — a fixed set of named fields, each a producer.
12
+ * - `array` — a repeated subtree: `each` selects item nodes, `item` produces one.
13
+ * - `oneOf` — an honest discriminated union (shared `base` + tagged `branches`).
14
+ * - `custom` — the sole escape hatch, handed a narrow {@link NodeLens}.
15
+ *
16
+ * Absence model (see CONTEXT.md): a `required` field that is missing nulls its
17
+ * *nearest enclosing object*; arrays *drop* null items (recording a warning);
18
+ * only the document root throws. `required` is opt-in, so nothing cascades unless
19
+ * a schema author asks for it.
20
+ */
21
+ /** How a producer behaves when it finds no data. */
22
+ export type Presence =
23
+ /** Missing → `null` (or `[]` for arrays). The default. */
24
+ "optional"
25
+ /** Missing → the nearest enclosing object becomes `null` (root throws). */
26
+ | "required"
27
+ /** Missing → the key is omitted entirely (needs `exactOptionalPropertyTypes`). */
28
+ | "omit";
29
+ /**
30
+ * The narrow, relative-only surface a `CustomProducer` receives.
31
+ *
32
+ * A custom producer never sees the raw {@link XMLAdapter} or escapes its subtree —
33
+ * it reads text and child nodes relative to the node it was mounted on.
34
+ */
35
+ export interface NodeLens {
36
+ /** Local (namespace-stripped) name of this lens' own node (`null` if none). */
37
+ name(): string | null;
38
+ /** Trimmed text content of this lens' own node (`null` if empty). */
39
+ text(): string | null;
40
+ /** Trimmed text at a relative XPath (`null` if the node is absent/empty). */
41
+ textAt(xpath: string): string | null;
42
+ /** Value of an attribute reached by a relative XPath ending in `/@name`. */
43
+ attr(xpath: string): string | null;
44
+ /** A lens per node matching a relative XPath. */
45
+ all(xpath: string): Array<NodeLens>;
46
+ }
47
+ /**
48
+ * Fields common to every producer kind. `presence` lives on each producer
49
+ * interface instead (typed as the literal `P`), so its value can be recovered at
50
+ * the type level.
51
+ */
52
+ interface ProducerMeta {
53
+ /** Relative XPath from the enclosing node to this producer's node. */
54
+ at?: string;
55
+ /** Docstring carried into generated types as `/** *\/`. */
56
+ doc?: string;
57
+ /** Group name carried into generated types as `@group`. */
58
+ group?: string;
59
+ }
60
+ /**
61
+ * A producer carries two type params: its output type `T`, and its
62
+ * {@link Presence} `P`. `P` is the literal type of the runtime `presence` field —
63
+ * the same value drives both parsing and {@link ProducedFields} (which reads `P`
64
+ * to decide whether a field's key is required or `omit` → optional). One field,
65
+ * one source of truth; no phantom to keep in sync.
66
+ */
67
+ export interface ScalarProducer<T, P extends Presence = "optional"> extends ProducerMeta {
68
+ kind: "scalar";
69
+ decode: (raw: string | null) => T;
70
+ /** Absence behaviour (default `"optional"`). */
71
+ presence?: P;
72
+ /** Phantom output type — never present at runtime. */
73
+ readonly _out?: T;
74
+ }
75
+ export interface ObjectProducer<T, P extends Presence = "optional"> extends ProducerMeta {
76
+ kind: "object";
77
+ fields: Record<string, Producer<unknown, Presence>>;
78
+ presence?: P;
79
+ readonly _out?: T;
80
+ }
81
+ export interface ArrayProducer<T, P extends Presence = "optional"> extends ProducerMeta {
82
+ kind: "array";
83
+ /** Relative XPath selecting each item node. */
84
+ each: string;
85
+ item: Producer<unknown, Presence>;
86
+ presence?: P;
87
+ readonly _out?: T;
88
+ }
89
+ export interface CustomProducer<T, P extends Presence = "optional"> extends ProducerMeta {
90
+ kind: "custom";
91
+ produce: (lens: NodeLens) => T;
92
+ presence?: P;
93
+ readonly _out?: T;
94
+ }
95
+ /** One tagged branch of a {@link OneOfProducer}. */
96
+ export interface OneOfBranch {
97
+ /** XPath whose existence selects this branch (first match wins). */
98
+ when: string;
99
+ /** Relative XPath to the branch's node (defaults to the oneOf node). */
100
+ at?: string;
101
+ /** Literal discriminant value written under the oneOf's `tagAs` key. */
102
+ tag: string;
103
+ fields: Record<string, Producer<unknown, Presence>>;
104
+ }
105
+ export interface OneOfProducer<T, P extends Presence = "optional"> extends ProducerMeta {
106
+ kind: "oneOf";
107
+ /** Field name that carries each branch's literal `tag`. */
108
+ tagAs: string;
109
+ /** Fields parsed once and merged into every branch. */
110
+ base: Record<string, Producer<unknown, Presence>>;
111
+ branches: ReadonlyArray<OneOfBranch>;
112
+ presence?: P;
113
+ readonly _out?: T;
114
+ }
115
+ export type Producer<T, P extends Presence = "optional"> = ScalarProducer<T, P> | ObjectProducer<T, P> | ArrayProducer<T, P> | CustomProducer<T, P> | OneOfProducer<T, P>;
116
+ /** Flatten an intersection into a single object literal for legible hovers. */
117
+ type Simplify<T> = {
118
+ [K in keyof T]: T[K];
119
+ } & {};
120
+ /** Recover a producer's output type. Recurses in parallel with the runtime. */
121
+ export type Produced<P> = P extends {
122
+ readonly _out?: infer T;
123
+ } ? T : never;
124
+ /** Recover a producer's {@link Presence} (absent → the `"optional"` default). */
125
+ type PresenceOf<X> = X extends {
126
+ presence?: infer P;
127
+ } ? (P extends Presence ? P : "optional") : "optional";
128
+ type OmitPresenceKeys<F> = {
129
+ [K in keyof F]: PresenceOf<F[K]> extends "omit" ? K : never;
130
+ }[keyof F];
131
+ /**
132
+ * The output type of an object built from a fields map. A field whose producer
133
+ * has `presence: "omit"` becomes an **optional** key (`key?:`); every other
134
+ * field is a required key. Under `exactOptionalPropertyTypes` this exactly
135
+ * mirrors the runtime absence model.
136
+ */
137
+ export type ProducedFields<F> = Simplify<{
138
+ [K in Exclude<keyof F, OmitPresenceKeys<F>>]: Produced<F[K]>;
139
+ } & {
140
+ [K in OmitPresenceKeys<F>]?: Produced<F[K]>;
141
+ }>;
142
+ /** Meta accepted by every combinator, minus `presence` (captured generically). */
143
+ interface BaseMeta {
144
+ at?: string;
145
+ doc?: string;
146
+ group?: string;
147
+ }
148
+ type LeafOpts<P extends Presence = "optional"> = BaseMeta & {
149
+ presence?: P;
150
+ };
151
+ type ScalarOpts<T, P extends Presence = "optional"> = LeafOpts<P> & {
152
+ decode: (raw: string | null) => T;
153
+ };
154
+ /** A leaf producer with an explicit decoder. */
155
+ export declare function scalar<T, P extends Presence = "optional">(opts: ScalarOpts<T, P>): ScalarProducer<T, P>;
156
+ /** Raw trimmed text (`string | null`). */
157
+ export declare function text<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<string | null, P>;
158
+ /** Precision-preserving ISO date/dateTime string (`string | null`). */
159
+ export declare function date<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<string | null, P>;
160
+ /** Decimal number (`number | null`). */
161
+ export declare function number_<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<number | null, P>;
162
+ /** Integer (`number | null`). */
163
+ export declare function integer<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<number | null, P>;
164
+ /** Boolean (`boolean | null`), understanding BRO's `ja`/`nee`. */
165
+ export declare function boolean_<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<boolean | null, P>;
166
+ /** BRO quality class (`number | null`), understanding `"klasse2"` and `"2"`. */
167
+ export declare function qualityClass<P extends Presence = "optional">(at?: string, opts?: LeafOpts<P>): ScalarProducer<number | null, P>;
168
+ /** A fixed set of named fields. Output type is inferred from `fields`. */
169
+ export declare function object_<F extends Record<string, Producer<unknown, Presence>>, P extends Presence = "optional">(opts: {
170
+ fields: F;
171
+ presence?: P;
172
+ } & BaseMeta): ObjectProducer<ProducedFields<F>, P>;
173
+ /** A repeated subtree. `each` selects item nodes; `item` produces one value. */
174
+ export declare function array<E, P extends Presence = "optional">(opts: {
175
+ each: string;
176
+ item: Producer<E, Presence>;
177
+ presence?: P;
178
+ } & BaseMeta): ArrayProducer<Array<E>, P>;
179
+ /** The escape hatch: a decoder handed a relative-only {@link NodeLens}. */
180
+ export declare function custom<T, P extends Presence = "optional">(opts: {
181
+ produce: (lens: NodeLens) => T;
182
+ presence?: P;
183
+ } & BaseMeta): CustomProducer<T, P>;
184
+ /** A branch as written at the `oneOf` call site (captured for type inference). */
185
+ interface BranchInput<Tag extends string = string, F extends Record<string, Producer<unknown, Presence>> = Record<string, Producer<unknown, Presence>>> {
186
+ when: string;
187
+ at?: string;
188
+ tag: Tag;
189
+ fields: F;
190
+ }
191
+ /** Output type of one branch: shared base ∪ branch fields ∪ the tag literal. */
192
+ type BranchOut<TagKey extends string, Base, B> = B extends {
193
+ tag: infer Tag extends string;
194
+ fields: infer F;
195
+ } ? Simplify<ProducedFields<Base> & ProducedFields<F> & Record<TagKey, Tag>> : never;
196
+ /** The discriminated union over all branches (mapped tuple → indexed union). */
197
+ type OneOfOut<TagKey extends string, Base, Branches extends ReadonlyArray<unknown>> = {
198
+ [I in keyof Branches]: BranchOut<TagKey, Base, Branches[I]>;
199
+ }[number];
200
+ /**
201
+ * An honest discriminated union. `base` fields are parsed once; the first branch
202
+ * whose `when` XPath exists is parsed and merged, with its literal `tag` written
203
+ * under `tagAs`.
204
+ *
205
+ * The output type is **inferred**: a discriminated union keyed on `tagAs`, each
206
+ * member being the shared `base` fields plus that branch's `fields` plus the
207
+ * literal `tag`. Presence is honoured throughout (`omit` → optional key).
208
+ */
209
+ export declare function oneOf<TagKey extends string, const Base extends Record<string, Producer<unknown, Presence>>, const Branches extends ReadonlyArray<BranchInput>, P extends Presence = "optional">(opts: {
210
+ tagAs: TagKey;
211
+ base?: Base;
212
+ branches: Branches;
213
+ presence?: P;
214
+ } & BaseMeta): OneOfProducer<OneOfOut<TagKey, Base, Branches>, P>;
215
+ export {};
216
+ //# sourceMappingURL=producer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"producer.d.ts","sourceRoot":"","sources":["../../src/core/producer.ts"],"names":[],"mappings":"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"}