@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
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * Type definitions for BRO/XML parser
3
3
  */
4
+ import type { Produced } from "../core/producer.js";
5
+ import type { CPT_PRODUCER } from "../schemas/cpt-schema.js";
6
+ import type { BORE_PRODUCER } from "../schemas/bore-schema.js";
7
+ import type { BHRG_PRODUCER } from "../schemas/bhrg-schema.js";
8
+ import type { GMW_PRODUCER } from "../schemas/gmw-schema.js";
9
+ import type { GLD_PRODUCER } from "../schemas/gld-schema.js";
4
10
  /**
5
11
  * Namespace mapping (prefix -> URI)
6
12
  */
@@ -21,9 +27,9 @@ export interface ParseMeta {
21
27
  */
22
28
  schemaNamespace: string;
23
29
  /**
24
- * Data type detected (CPT, BHR-GT, BHR-G)
30
+ * Data type detected (CPT, BHR-GT, BHR-G, GMW, GLD)
25
31
  */
26
- dataType: "CPT" | "BHR-GT" | "BHR-G";
32
+ dataType: "CPT" | "BHR-GT" | "BHR-G" | "GMW" | "GLD";
27
33
  /**
28
34
  * Warnings encountered during parsing
29
35
  *
@@ -41,32 +47,6 @@ export interface XMLAdapter {
41
47
  evaluateXPath(doc: Document | Node, query: string, namespaceResolver: (prefix: string | null) => string | null): Node | null;
42
48
  evaluateXPathAll(doc: Document | Node, query: string, namespaceResolver: (prefix: string | null) => string | null): Array<Node>;
43
49
  }
44
- /**
45
- * Context passed to resolver functions
46
- */
47
- export interface ResolverContext {
48
- node: Node;
49
- element: Node;
50
- namespaces: Namespaces;
51
- adapter: XMLAdapter;
52
- }
53
- /**
54
- * Resolver function type
55
- */
56
- export type ResolverFunction = (value: string | null, context: ResolverContext) => unknown;
57
- /**
58
- * Schema field definition
59
- */
60
- export interface SchemaField {
61
- xpath: string;
62
- resolver?: ResolverFunction;
63
- attribute?: string;
64
- required?: boolean;
65
- }
66
- /**
67
- * Schema definition (field name -> field config)
68
- */
69
- export type Schema = Record<string, SchemaField>;
70
50
  /**
71
51
  * BRO quality regime
72
52
  *
@@ -82,19 +62,9 @@ export interface Location {
82
62
  y: number;
83
63
  epsg: string;
84
64
  }
85
- /**
86
- * Layer of material removed before CPT was performed (e.g. asphalt, gravel fill)
87
- *
88
- * Found in additionalInvestigation. Directly affects depth interpretation.
89
- */
90
- export interface RemovedLayer {
91
- sequenceNumber: number;
92
- upperBoundary: number;
93
- lowerBoundary: number;
94
- description: string | null;
95
- }
96
65
  /**
97
66
  * CPT measurement row (dynamic fields based on parameters)
67
+ * @internal
98
68
  */
99
69
  export interface CPTMeasurement {
100
70
  penetrationLength: number;
@@ -125,6 +95,7 @@ export interface CPTMeasurement {
125
95
  }
126
96
  /**
127
97
  * Single measurement row in a dissipation test (pore pressure decay over time)
98
+ * @internal
128
99
  */
129
100
  export interface DissipationMeasurement {
130
101
  elapsedTime: number;
@@ -134,985 +105,38 @@ export interface DissipationMeasurement {
134
105
  porePressureU3: number | null;
135
106
  }
136
107
  /**
137
- * Dissipation test performed at a specific depth
108
+ * Complete CPT data (metadata + measurements).
138
109
  *
139
- * During a CPT, the cone can be paused at a given depth to measure
140
- * pore pressure decay over time. A CPT can contain multiple dissipation tests.
141
- */
142
- export interface DissipationTest {
143
- penetrationLength: number;
144
- phenomenonTime: string | null;
145
- measurements: Array<DissipationMeasurement>;
146
- }
147
- /**
148
- * Complete CPT data (metadata + measurements)
110
+ * Inferred from `CPT_PRODUCER`; `meta` (parse metadata) and the optional
111
+ * user-set `alias` are the only fields not produced from the XML.
149
112
  */
150
- export interface CPTData {
151
- /**
152
- * Metadata about the parsed document (schema version, warnings)
153
- */
113
+ export type CPTData = {
154
114
  meta: ParseMeta;
155
- broId: string | null;
156
- /**
157
- * User-defined identifier (not parsed from XML)
158
- *
159
- * Useful for tracking data that doesn't have a broId yet,
160
- * such as during data collection or before BRO registration.
161
- *
162
- * @example
163
- * ```typescript
164
- * const cpt = parser.parseCPT(xmlString);
165
- * cpt.alias = "Site A - Test 1";
166
- * ```
167
- */
168
115
  alias?: string;
169
- /**
170
- * BRO quality regime
171
- *
172
- * - IMBRO: Strict regime (all mandatory fields required)
173
- * - IMBRO/A: Relaxed regime for historical data (allows missing fields)
174
- */
175
- qualityRegime: QualityRegime | null;
176
- /** Party responsible for delivering the data to the BRO (bronhouder, KvK number or name) */
177
- deliveryAccountableParty: string | null;
178
- researchReportDate: string | null;
179
- /** When the cone penetration test was physically performed in the field (om:phenomenonTime) */
180
- conePenetrationTestPhenomenonTime: string | null;
181
- /** When the cone penetration test result was produced (om:resultTime) */
182
- conePenetrationTestResultTime: string | null;
183
- deliveredLocation: Location | null;
184
- standardizedLocation: Location | null;
185
- /** Date horizontal position was determined */
186
- horizontalPositioningDate: string | null;
187
- /** Method used to determine horizontal position (e.g., "onbekend", "GNSS") */
188
- horizontalPositioningMethod: string | null;
189
- deliveredVerticalPositionOffset: number | null;
190
- deliveredVerticalPositionDatum: string | null;
191
- deliveredVerticalPositionReferencePoint: string | null;
192
- /** Date vertical position was determined */
193
- verticalPositioningDate: string | null;
194
- /** Method used to determine vertical position (e.g., "onbekend", "waterpassingKlasse2") */
195
- verticalPositioningMethod: string | null;
196
- /** Delivery context (e.g., "publiekeTaak", "archiefoverdracht") */
197
- deliveryContext: string | null;
198
- /** Survey purpose (e.g., "waterkering", "onbekend") */
199
- surveyPurpose: string | null;
200
- /** Whether additional investigation was performed alongside the CPT */
201
- additionalInvestigationPerformed: boolean | null;
202
- cptStandard: string | null;
203
- /** CPT method used (e.g., "elektrisch", "mechanisch") */
204
- cptMethod: string | null;
205
- /** Stop criterion for the test */
206
- stopCriterion: string | null;
207
- /** Azimuth orientation of the sensor (degrees from north) */
208
- sensorAzimuth: number | null;
209
- dissipationtestPerformed: boolean | null;
210
- qualityClass: number | null;
211
- predrilledDepth: number | null;
212
- finalDepth: number | null;
213
- groundwaterLevel: number | null;
214
- /** Date of additional investigation (e.g. groundwater level measurement) */
215
- investigationDate: string | null;
216
- /** Site conditions at time of investigation */
217
- conditions: string | null;
218
- /** Description of surface at CPT location */
219
- surfaceDescription: string | null;
220
- /** Layers removed before CPT (e.g. asphalt, gravel fill) - affects depth interpretation */
221
- removedLayers: Array<RemovedLayer>;
222
- /** Date of final processing */
223
- finalProcessingDate: string | null;
224
- /** Whether signal processing was performed */
225
- signalProcessingPerformed: boolean | null;
226
- /** Whether interruption processing was performed */
227
- interruptionProcessingPerformed: boolean | null;
228
- /** Whether expert correction was performed */
229
- expertCorrectionPerformed: boolean | null;
230
- cptDescription: string | null;
231
- cptType: string | null;
232
- coneSurfaceArea: number | null;
233
- coneDiameter: number | null;
234
- coneSurfaceQuotient: number | null;
235
- coneToFrictionSleeveDistance: number | null;
236
- coneToFrictionSleeveSurfaceArea: number | null;
237
- coneToFrictionSleeveSurfaceQuotient: number | null;
238
- zlmConeResistanceBefore: number | null;
239
- zlmConeResistanceAfter: number | null;
240
- zlmInclinationEwBefore: number | null;
241
- zlmInclinationEwAfter: number | null;
242
- zlmInclinationNsBefore: number | null;
243
- zlmInclinationNsAfter: number | null;
244
- zlmInclinationResultantBefore: number | null;
245
- zlmInclinationResultantAfter: number | null;
246
- zlmLocalFrictionBefore: number | null;
247
- zlmLocalFrictionAfter: number | null;
248
- zlmPorePressureU1Before: number | null;
249
- zlmPorePressureU2Before: number | null;
250
- zlmPorePressureU3Before: number | null;
251
- zlmPorePressureU1After: number | null;
252
- zlmPorePressureU2After: number | null;
253
- zlmPorePressureU3After: number | null;
254
- /** Electrical conductivity before test (mS/m) - zero-load calibration */
255
- zlmElectricalConductivityBefore: number | null;
256
- /** Electrical conductivity after test (mS/m) - zero-load calibration */
257
- zlmElectricalConductivityAfter: number | null;
258
- data: Array<CPTMeasurement>;
259
- dissipationTests: Array<DissipationTest>;
260
- registrationHistory: RegistrationHistory | null;
261
- }
262
- /**
263
- * Grain shape properties for sand/gravel fractions
264
- */
265
- export interface Grainshape {
266
- /** Size fraction this shape applies to (e.g., "zand", "grind") */
267
- sizeFraction: string | null;
268
- /** Angularity of grains (e.g., "hoekig", "subhoekig", "afgerond") */
269
- angularity: string | null;
270
- /** Sphericity of grains (e.g., "bol", "plat", "langwerpig") */
271
- sphericity: string | null;
272
- /** Roughness of grains (e.g., "ruw", "glad") */
273
- roughness: string | null;
274
- }
116
+ } & Produced<typeof CPT_PRODUCER>;
275
117
  /**
276
- * BHR-GT (Borehole Research Geotechnical) layer data
118
+ * Complete Bore data (metadata + layers).
277
119
  *
278
- * Contains all fields from the BRO BHR-GT schema for a single soil layer.
279
- */
280
- export interface BHRGTLayer {
281
- upperBoundary: number;
282
- lowerBoundary: number;
283
- upperBoundaryDetermination?: string | null;
284
- lowerBoundaryDetermination?: string | null;
285
- /** Whether the layer is anthropogenic (man-made) */
286
- anthropogenic?: boolean | null;
287
- geotechnicalSoilName: string;
288
- /** Soil name per NEN 5104 (IMBRO/A archive data; geotechnicalSoilName is often nil there) */
289
- soilNameNEN5104?: string | null;
290
- /** Gravel content classification per NEN 5104 (IMBRO/A) */
291
- gravelContentClassNEN5104?: string | null;
292
- /** Organic matter content classification per NEN 5104 (IMBRO/A) */
293
- organicMatterContentClassNEN5104?: string | null;
294
- /** Tertiary soil constituent (e.g., "schelpMateriaal", "plantenresten") */
295
- tertiaryConstituent?: string | null;
296
- /** Soil color code */
297
- color?: string;
298
- /** Dispersed inhomogeneity presence */
299
- dispersedInhomogeneity?: boolean | null;
300
- /** Organic matter content classification */
301
- organicMatterContentClass?: string | null;
302
- /** Carbonate content classification */
303
- carbonateContentClass?: string | null;
304
- /** Sand median grain size classification */
305
- sandMedianClass?: string | null;
306
- /** Gravel median grain size classification (e.g., "fijn", "middelgrof") */
307
- gravelMedianClass?: string | null;
308
- /** Depositional characteristic of the soil (e.g., "nietBepaald") */
309
- geotechnicalDepositionalCharacteristic?: string | null;
310
- /** Interbedding of other material in the soil (e.g., "kleiWeinigDikkeLaminae") */
311
- interbedding?: string | null;
312
- /** Grain shape properties (for sand/gravel) */
313
- grainshape?: Grainshape;
314
- /** Whether the layer boundary is slanted */
315
- slant?: boolean | null;
316
- /** Whether the layer is bedded/stratified */
317
- bedded?: boolean | null;
318
- /** Bedding type of the layer (e.g., "dikGelamineerd") */
319
- bedding?: string | null;
320
- /** Whether the layer is a composite layer */
321
- compositeLayer?: boolean | null;
322
- /** Human activity type observed in the layer (e.g., "nietBepaald") */
323
- activityType?: string | null;
324
- /** Whether the internal structure is intact (undisturbed) */
325
- internalStructureIntact?: boolean | null;
326
- /** Whether the soil is mixed */
327
- mixed?: boolean | null;
328
- /** Whether the soil has mottled appearance */
329
- mottled?: boolean | null;
330
- /** Consistency of fine-grained soils (e.g., "slap", "stevig", "vast") */
331
- fineSoilConsistency?: string | null;
332
- /** Consistency of organic soils */
333
- organicSoilConsistency?: string | null;
334
- /** Texture of organic soils (e.g., "vezeligGrof", "vezeligFijn") */
335
- organicSoilTexture?: string | null;
336
- /** Tensile strength of peat */
337
- peatTensileStrength?: string | null;
338
- }
339
- /**
340
- * Complete Bore data (metadata + layers)
120
+ * Represents BHR-GT-BMB (Boormonsterbeschrijving — visual/textural description);
121
+ * laboratory analysis (BHR-GT-BMA) is the optional `analysis` field.
341
122
  *
342
- * Note: BHRGTData represents BHR-GT-BMB (Boormonsterbeschrijving - visual/textural description)
343
- * For laboratory analysis data, see the optional `analysis` field (BHR-GT-BMA)
123
+ * Inferred from `BORE_PRODUCER`; `meta` (parse metadata) and the optional
124
+ * user-set `alias` are the only fields not produced from the XML.
344
125
  */
345
- export interface BHRGTData {
346
- /**
347
- * Metadata about the parsed document (schema version, warnings)
348
- */
126
+ export type BHRGTData = {
349
127
  meta: ParseMeta;
350
- broId: string | null;
351
- /**
352
- * User-defined identifier (not parsed from XML)
353
- *
354
- * Useful for tracking data that doesn't have a broId yet,
355
- * such as during data collection or before BRO registration.
356
- *
357
- * @example
358
- * ```typescript
359
- * const bore = parser.parseBHRGT(xmlString);
360
- * bore.alias = "Borehole 7 - North Field";
361
- * ```
362
- */
363
128
  alias?: string;
364
- /**
365
- * BRO quality regime
366
- *
367
- * - IMBRO: Strict regime (all mandatory fields required)
368
- * - IMBRO/A: Relaxed regime for historical data (allows missing fields)
369
- */
370
- qualityRegime: QualityRegime | null;
371
- /** Party responsible for delivering the data to the BRO (bronhouder, KvK number or name) */
372
- deliveryAccountableParty: string | null;
373
- researchReportDate: string | null;
374
- deliveredLocation: Location | null;
375
- standardizedLocation: Location | null;
376
- deliveredVerticalPositionOffset: number | null;
377
- deliveredVerticalPositionDatum: string | null;
378
- deliveredVerticalPositionReferencePoint: string | null;
379
- /** Soil use at the site (e.g., "akker", "grasland", "geenBodemgebruik") */
380
- soilUse: string | null;
381
- descriptionProcedure: string | null;
382
- groundwaterLevel: number | null;
383
- /** Mean highest groundwater level in m relative to local reference (GHG) */
384
- meanHighestGroundwaterLevel: number | null;
385
- /** Mean lowest groundwater level in m relative to local reference (GLG) */
386
- meanLowestGroundwaterLevel: number | null;
387
- boreRockReached: boolean | null;
388
- finalBoreDepth: number | null;
389
- finalSampleDepth: number | null;
390
- boreHoleCompleted: boolean | null;
391
- /** Start date of the boring operation */
392
- boringStartDate: string | null;
393
- /** End date of the boring operation */
394
- boringEndDate: string | null;
395
- /** Boring procedure standard used (e.g., "EN1997d2v2007") */
396
- boringProcedure: string | null;
397
- /** Boring technique used (e.g., "gestoken", "mechanischGestoken") */
398
- boringTechnique: string | null;
399
- /** Whether the trajectory was excavated */
400
- trajectoryExcavated: boolean | null;
401
- /** Whether the subsurface is contaminated */
402
- subsurfaceContaminated: boolean | null;
403
- /** Stop criterion for boring */
404
- stopCriterion: string | null;
405
- /** Whether a flushing medium was used during boring */
406
- flushingMediumUsed: boolean | null;
407
- /** Whether a temporary casing was used during boring */
408
- temporaryCasingUsed: boolean | null;
409
- /** Site preparation before boring (e.g., "geen") */
410
- preparation: string | null;
411
- /** Type of sampler used */
412
- samplerType: string | null;
413
- /** Sampling procedure standard */
414
- samplingProcedure: string | null;
415
- /** Sampling method used */
416
- samplingMethod: string | null;
417
- /** Sampling quality assessment */
418
- samplingQuality: string | null;
419
- /** Whether the sample was orientated */
420
- orientatedSampled: boolean | null;
421
- /** Sample container diameter in mm */
422
- sampleContainerDiameter: number | null;
423
- /** Sample container length in mm */
424
- sampleContainerLength: number | null;
425
- /** Piston presence in sampler */
426
- pistonPresent: boolean | null;
427
- /** Core catcher presence */
428
- coreCatcherPresent: boolean | null;
429
- /** Stocking used in sampling */
430
- stockingUsed: boolean | null;
431
- /** Lubrication fluid used */
432
- lubricationFluidUsed: boolean | null;
433
- /** Right-angled cutting shoe */
434
- rightAngledCuttingShoe: boolean | null;
435
- /** Cutting shoe inside diameter in mm */
436
- cuttingShoeInsideDiameter: number | null;
437
- /** Cutting shoe outside diameter in mm */
438
- cuttingShoeOutsideDiameter: number | null;
439
- /** Taper angle of cutting shoe */
440
- taperAngle: number | null;
441
- /** Whether the borehole log was checked */
442
- boreholeLogChecked: boolean | null;
443
- /** Description quality assessment */
444
- descriptionQuality: string | null;
445
- /** Description location (field/lab) */
446
- descriptionLocation: string | null;
447
- /** Date of description report */
448
- descriptionReportDate: string | null;
449
- /** Described material type */
450
- describedMaterial: string | null;
451
- /** Whether sampling was continuous */
452
- continuouslySampled: boolean | null;
453
- /** Sample moistness during description */
454
- sampleMoistness: string | null;
455
- data: Array<BHRGTLayer>;
456
- analysis?: BoreholeSampleAnalysis;
457
- /** Array of bored intervals with technique and diameter */
458
- boredIntervals: Array<BoredInterval>;
459
- /** Array of sampled intervals with method and quality */
460
- sampledIntervals: Array<SampledInterval>;
461
- /** Array of completed/backfilled intervals */
462
- completedIntervals: Array<CompletedInterval>;
463
- /** Array of intervals not described (with reason) */
464
- notDescribedIntervals: Array<NotDescribedInterval>;
465
- /** BRO registration history */
466
- registrationHistory: RegistrationHistory | null;
467
- /** Report history with events */
468
- reportHistory: ReportHistory | null;
469
- /** Delivery context (e.g., "publiekeTaak") */
470
- deliveryContext: string | null;
471
- /** Survey purpose (e.g., "bouwwerk") */
472
- surveyPurpose: string | null;
473
- /** Discipline (e.g., "geotechniek") */
474
- discipline: string | null;
475
- /** Survey procedure standard (e.g., "EN1997d2v2007") */
476
- surveyProcedure: string | null;
477
- /** Whether site characteristics were determined */
478
- siteCharacteristicDetermined: boolean | null;
479
- }
129
+ } & Produced<typeof BORE_PRODUCER>;
480
130
  /**
481
- * BHR-G (Geological Borehole) layer data
131
+ * Complete BHR-G (Geological Borehole) data (metadata + layers).
482
132
  *
483
- * Contains all fields from the BRO BHR-G schema for a single soil layer.
484
- */
485
- export interface BHRGLayer {
486
- upperBoundary: number;
487
- lowerBoundary: number;
488
- upperBoundaryDetermination?: string | null;
489
- lowerBoundaryDetermination?: string | null;
490
- soilNameNEN5104: string;
491
- color?: string;
492
- /** Whether the layer is anthropogenic (man-made) - uses string codes in BHR-G (ja/nee/onbekend) */
493
- anthropogenic?: string | null;
494
- /** Whether the layer is rooted - uses string codes in BHR-G (ja/nee/onbekend) */
495
- rooted?: string | null;
496
- organicMatterContentClassNEN5104?: string | null;
497
- gravelContentClass?: string | null;
498
- carbonateContentClass?: string | null;
499
- sandMedianClass?: string | null;
500
- }
501
- /**
502
- * Complete BHR-G (Geological Borehole) data (metadata + layers)
133
+ * Inferred from `BHRG_PRODUCER`; `meta` (parse metadata) and the optional
134
+ * user-set `alias` are the only fields not produced from the XML.
503
135
  */
504
- export interface BHRGData {
505
- /**
506
- * Metadata about the parsed document (schema version, warnings)
507
- */
136
+ export type BHRGData = {
508
137
  meta: ParseMeta;
509
- broId: string | null;
510
- /**
511
- * User-defined identifier (not parsed from XML)
512
- */
513
138
  alias?: string;
514
- /**
515
- * BRO quality regime
516
- *
517
- * - IMBRO: Strict regime (all mandatory fields required)
518
- * - IMBRO/A: Relaxed regime for historical data (allows missing fields)
519
- */
520
- qualityRegime: QualityRegime | null;
521
- researchReportDate: string | null;
522
- deliveredLocation: Location | null;
523
- standardizedLocation: Location | null;
524
- deliveredVerticalPositionOffset: number | null;
525
- deliveredVerticalPositionDatum: string | null;
526
- deliveredVerticalPositionReferencePoint: string | null;
527
- descriptionProcedure: string | null;
528
- boreRockReached: boolean | null;
529
- finalBoreDepth: number | null;
530
- finalSampleDepth: number | null;
531
- boreHoleCompleted: string | null;
532
- /** Start date of the boring operation */
533
- boringStartDate: string | null;
534
- /** End date of the boring operation */
535
- boringEndDate: string | null;
536
- /** Boring procedure standard used */
537
- boringProcedure: string | null;
538
- /** Boring technique used */
539
- boringTechnique: string | null;
540
- /** Whether the trajectory was excavated */
541
- trajectoryExcavated: boolean | null;
542
- /** Whether the subsurface is contaminated */
543
- subsurfaceContaminated: boolean | null;
544
- /** Stop criterion for boring */
545
- stopCriterion: string | null;
546
- /** Sampling procedure standard */
547
- samplingProcedure: string | null;
548
- /** Sampling method used */
549
- samplingMethod: string | null;
550
- /** Sampling quality assessment */
551
- samplingQuality: string | null;
552
- /** Description quality assessment */
553
- descriptionQuality: string | null;
554
- /** Described samples quality */
555
- describedSamplesQuality: string | null;
556
- /** Description location (field/lab) */
557
- descriptionLocation: string | null;
558
- /** Date of description report */
559
- descriptionReportDate: string | null;
560
- /** Described material type */
561
- describedMaterial: string | null;
562
- /** Whether sampling was continuous */
563
- continuouslySampled: boolean | null;
564
- /** Sample moistness during description */
565
- sampleMoistness: string | null;
566
- data: Array<BHRGLayer>;
567
- /** Array of bored intervals with technique and diameter */
568
- boredIntervals: Array<BoredInterval>;
569
- /** Array of sampled intervals with method and quality */
570
- sampledIntervals: Array<SampledInterval>;
571
- /** BRO registration history */
572
- registrationHistory: RegistrationHistory | null;
573
- /** Report history with events */
574
- reportHistory: ReportHistory | null;
575
- /** Delivery context (e.g., "archiefoverdracht") */
576
- deliveryContext: string | null;
577
- /** Survey purpose */
578
- surveyPurpose: string | null;
579
- /** Discipline (e.g., "geologie") */
580
- discipline: string | null;
581
- /** Survey procedure standard */
582
- surveyProcedure: string | null;
583
- /** NITG code (legacy identifier) */
584
- nitgCode: string | null;
585
- }
586
- /**
587
- * Bored interval - records boring technique and diameter at specific depth ranges
588
- */
589
- export interface BoredInterval {
590
- beginDepth: number;
591
- endDepth: number;
592
- boringTechnique: string | null;
593
- boredDiameter: number | null;
594
- }
595
- /**
596
- * Sampler equipment details within a sampled interval
597
- */
598
- export interface SamplerDetails {
599
- samplerType: string | null;
600
- sampleContainerDiameter: number | null;
601
- sampleContainerLength: number | null;
602
- cuttingShoeInsideDiameter: number | null;
603
- cuttingShoeOutsideDiameter: number | null;
604
- stockingUsed: boolean | null;
605
- rightAngledCuttingShoe: boolean | null;
606
- taperAngle: number | null;
607
- lubricationFluidUsed: boolean | null;
608
- coreCatcherPresent: boolean | null;
609
- pistonPresent: boolean | null;
610
- }
611
- /**
612
- * Sampled interval - records sampling method and quality at specific depth ranges
613
- */
614
- export interface SampledInterval {
615
- beginDepth: number;
616
- endDepth: number;
617
- preTreatment: string | null;
618
- samplingMethod: string | null;
619
- samplingQuality: string | null;
620
- orientatedSampled: boolean | null;
621
- sampler?: SamplerDetails;
622
- }
623
- /**
624
- * Completed interval - records how the borehole was completed/backfilled
625
- */
626
- export interface CompletedInterval {
627
- beginDepth: number;
628
- endDepth: number;
629
- permanentCasingPresent: boolean | null;
630
- backfillMaterial: string | null;
631
- backfillMaterialWashed: boolean | null;
632
- backfillMaterialCertified: boolean | null;
633
- }
634
- /**
635
- * Not described interval - records depth ranges that were not described and why
636
- */
637
- export interface NotDescribedInterval {
638
- beginDepth: number;
639
- endDepth: number;
640
- noDescriptionReason: string | null;
641
- }
642
- /**
643
- * Intermediate event in report history
644
- */
645
- export interface IntermediateEvent {
646
- eventName: string | null;
647
- eventDate: string | null;
648
- }
649
- /**
650
- * Registration history - BRO administrative registration information
651
- */
652
- export interface RegistrationHistory {
653
- objectRegistrationTime: string | null;
654
- registrationStatus: string | null;
655
- registrationCompletionTime: string | null;
656
- /** Time of the latest correction to the registered object */
657
- latestCorrectionTime: string | null;
658
- corrected: boolean | null;
659
- underReview: boolean | null;
660
- deregistered: boolean | null;
661
- reregistered: boolean | null;
662
- }
663
- /**
664
- * Report history - records when and how data was reported
665
- */
666
- export interface ReportHistory {
667
- reportStartDate: string | null;
668
- reportEndDate: string | null;
669
- intermediateEvents: Array<IntermediateEvent>;
670
- }
671
- /**
672
- * BHR-GT-BMA (Borehole Sample Analysis) - Laboratory Determinations
673
- */
674
- /**
675
- * Water content determination result
676
- */
677
- export interface WaterContentDetermination {
678
- determinationProcedure: string | null;
679
- determinationMethod: string | null;
680
- sampleMoistness: string | null;
681
- removedMaterial: string | null;
682
- waterContent: number | null;
683
- dryingTemperature: string | null;
684
- dryingPeriod: string | null;
685
- saltCorrectionMethod: string | null;
686
- }
687
- /**
688
- * Volumetric mass density (bulk density) determination result
689
- */
690
- export interface VolumetricMassDensityDetermination {
691
- determinationProcedure: string | null;
692
- determinationMethod: string | null;
693
- sampleMoistness: string | null;
694
- volumetricMassDensity: number | null;
695
- }
696
- /**
697
- * Organic matter content determination result
698
- */
699
- export interface OrganicMatterContentDetermination {
700
- determinationProcedure: string | null;
701
- determinationMethod: string | null;
702
- removedMaterial: string | null;
703
- /** Whether a lutum (clay fraction) correction was applied to the result */
704
- lutumCorrectionApplied: boolean | null;
705
- organicMatterContent: number | null;
706
- }
707
- /**
708
- * Carbonate content determination result
709
- */
710
- export interface CarbonateContentDetermination {
711
- determinationProcedure: string | null;
712
- determinationMethod: string | null;
713
- removedMaterial: string | null;
714
- carbonateContent: number | null;
715
- }
716
- /**
717
- * Volumetric mass density of solids determination result
718
- */
719
- export interface VolumetricMassDensityOfSolidsDetermination {
720
- determinationProcedure: string | null;
721
- determinationMethod: string | null;
722
- liquidUsed: string | null;
723
- /** Volume of the sample container used (e.g., "100ml") */
724
- sampleContainerVolume: string | null;
725
- volumetricMassDensityOfSolids: number | null;
726
- }
727
- /**
728
- * Particle size distribution determination result
729
- * Contains detailed grain size fractions
730
- */
731
- export interface ParticleSizeDistributionDetermination {
732
- determinationProcedure: string | null;
733
- determinationMethod: string | null;
734
- fractionDistribution: string | null;
735
- dispersionMethod: string | null;
736
- removedMaterial: string | null;
737
- equivalentMassDeterminationMethod: string | null;
738
- equivalentMass: number | null;
739
- fractionSmaller63um: number | null;
740
- fractionLarger63um: number | null;
741
- fraction0to2um?: number | null;
742
- /** 2–32 µm fraction — only present in the coarser standardDistributionFractionSmaller63um group */
743
- fraction2to32um?: number | null;
744
- fraction2to4um?: number | null;
745
- fraction4to8um?: number | null;
746
- fraction8to16um?: number | null;
747
- fraction16to32um?: number | null;
748
- fraction32to50um?: number | null;
749
- fraction50to63um?: number | null;
750
- fraction63to90um?: number | null;
751
- fraction90to125um?: number | null;
752
- fraction125to180um?: number | null;
753
- fraction180to250um?: number | null;
754
- fraction250to355um?: number | null;
755
- fraction355to500um?: number | null;
756
- fraction500to710um?: number | null;
757
- fraction710to1000um?: number | null;
758
- fraction1000to1400um?: number | null;
759
- fraction1400umto2mm?: number | null;
760
- fraction2to4mm?: number | null;
761
- fraction4to8mm?: number | null;
762
- fraction8to16mm?: number | null;
763
- fraction16to31_5mm?: number | null;
764
- fraction31_5to63mm?: number | null;
765
- fractionLarger63mm?: number | null;
766
- }
767
- /**
768
- * Plasticity data point for Atterberg limits test
769
- * Used to construct the plasticity curve (Casagrande)
770
- */
771
- export interface PlasticityAtSpecificWaterContent {
772
- waterContent: number;
773
- numberOfFalls: number;
774
- /** Cone penetration depth in mm (fall-cone method) */
775
- penetrationDepth?: number | null;
776
- }
777
- /**
778
- * Consistency limits determination (Atterberg limits)
779
- * Used to determine soil plasticity characteristics
780
- */
781
- export interface ConsistencyLimitsDetermination {
782
- determinationProcedure: string | null;
783
- determinationMethod: string | null;
784
- fractionLarger500um: number | null;
785
- usedMedium: string | null;
786
- performanceIrregularity: string | null;
787
- /** Fall-cone apparatus type used (e.g., "zweedseConus30graden") */
788
- conusType: string | null;
789
- liquidLimit: number | null;
790
- plasticLimit: number | null;
791
- plasticityIndex: number | null;
792
- plasticityAtSpecificWaterContent: Array<PlasticityAtSpecificWaterContent>;
793
- }
794
- /**
795
- * Height measurement at specific time during settlement test
796
- * Used to construct compression/consolidation curves
797
- */
798
- export interface HeightAtSpecificTime {
799
- time: number;
800
- height: number;
801
- }
802
- /**
803
- * Stress/strain measurement at a specific time during a settlement step
804
- * Columns of the StressAtSpecificSettlement time-series (oedometer/consolidation).
805
- */
806
- export interface StressAtSpecificSettlement {
807
- elapsedTime: number;
808
- verticalStrain: number;
809
- excessPoreWaterPressure: number | null;
810
- verticalEffectiveStress: number | null;
811
- horizontalEffectiveStress: number | null;
812
- }
813
- /**
814
- * Single loading step in settlement characteristics test
815
- * Represents one stress increment in oedometer/consolidation test
816
- */
817
- export interface SettlementDeterminationStep {
818
- stepNumber: number;
819
- wetPerformed: boolean | null;
820
- swellObserved: boolean | null;
821
- strainPoint24hours: number | null;
822
- stepType: string | null;
823
- verticalStress: number | null;
824
- heightChangeDuringSettlement: Array<HeightAtSpecificTime>;
825
- /** Stress/strain time-series for the step (alternative to heightChangeDuringSettlement) */
826
- stressChangeDuringSettlement?: Array<StressAtSpecificSettlement>;
827
- }
828
- /**
829
- * Saturation stage preceding compression in the oedometer/settlement test
830
- * Documents how the specimen was saturated before loading.
831
- */
832
- export interface SaturationStageAtCompression {
833
- porousDiscWet: boolean | null;
834
- usedMedium: string | null;
835
- backPressure: number | null;
836
- constantHeight: boolean | null;
837
- specimenHeightAfterwards: number | null;
838
- disturbanceInduced: boolean | null;
839
- }
840
- /**
841
- * Settlement characteristics determination (oedometer/consolidation test)
842
- * Used to determine soil compressibility and consolidation behavior
843
- */
844
- export interface SettlementCharacteristicsDetermination {
845
- determinationProcedure: string | null;
846
- determinationMethod: string | null;
847
- ringDiameter: number | null;
848
- sampleMoistness: string | null;
849
- filterPaperUsed: boolean | null;
850
- temperature: number | null;
851
- wallFrictionCorrectionMethod: string | null;
852
- apparatusDeformationApplied: boolean | null;
853
- bearingFrictionCorrectionApplied: boolean | null;
854
- irregularResult: boolean | null;
855
- /** Saturation stage performed before compression (optional) */
856
- saturationStageAtCompression?: SaturationStageAtCompression;
857
- determinationSteps: Array<SettlementDeterminationStep>;
858
- }
859
- /**
860
- * Permeability at specific density measurement
861
- */
862
- export interface SaturatedPermeabilityAtSpecificDensity {
863
- dryVolumetricMassDensity: number | null;
864
- saturatedPermeability: number | null;
865
- }
866
- /**
867
- * Saturated permeability determination (hydraulic conductivity)
868
- * Used to determine water flow characteristics through soil
869
- */
870
- export interface SaturatedPermeabilityDetermination {
871
- determinationProcedure: string | null;
872
- determinationMethod: string | null;
873
- specimenMade: boolean | null;
874
- saturatedWithCO2: boolean | null;
875
- verticallyDetermined: boolean | null;
876
- currentDownwards: boolean | null;
877
- usedMedium: string | null;
878
- waterDegassed: boolean | null;
879
- temperature: number | null;
880
- maximumGradient: number | null;
881
- saturatedPermeabilityAtSpecificDensity: Array<SaturatedPermeabilityAtSpecificDensity>;
882
- }
883
- /**
884
- * Membrane correction data for triaxial test
885
- * Corrects for membrane stiffness effects during testing
886
- */
887
- export interface MembraneCorrection {
888
- correctionMethod: string | null;
889
- thickness: number | null;
890
- stiffnessClass: string | null;
891
- }
892
- /**
893
- * Drainage strip correction data for triaxial test
894
- * Corrects for drainage strip effects during testing
895
- */
896
- export interface DrainageStripCorrection {
897
- correctionMethod: string | null;
898
- orientation: string | null;
899
- coverage: string | null;
900
- }
901
- /**
902
- * Saturation stage data for triaxial test
903
- * Documents sample saturation process before testing
904
- */
905
- export interface SaturationStageAtLoading {
906
- porousDiscWet: boolean | null;
907
- porousDiscRough: boolean | null;
908
- usedMedium: string | null;
909
- constantHeight: boolean | null;
910
- cellPressureAutomaticallyControlled: boolean | null;
911
- backPressure: number | null;
912
- effectivePressure: number | null;
913
- skemptonBCoefficient: number | null;
914
- disturbanceInduced: boolean | null;
915
- }
916
- /**
917
- * Volume change measurement at specific time during consolidation
918
- */
919
- export interface VolumeChangeAtSpecificTime {
920
- time: number;
921
- volumeChange: number;
922
- }
923
- /**
924
- * Consolidation stage data for triaxial test
925
- * Documents specimen consolidation under specified stresses
926
- */
927
- export interface ConsolidationStageAtLoading {
928
- drainageTwoSided: boolean | null;
929
- consolidationMethod: string | null;
930
- verticalConsolidationStress: number | null;
931
- horizontalConsolidationStress: number | null;
932
- verticalStrain: number | null;
933
- lateralEarthPressureCoefficient: number | null;
934
- volumeChangeDuringConsolidation: Array<VolumeChangeAtSpecificTime>;
935
- }
936
- /**
937
- * Shear stress measurement at specific strain during loading
938
- * Used to construct stress-strain curves for soil strength analysis
939
- */
940
- export interface ShearStressAtSpecificStrain {
941
- time: number;
942
- axialStrain: number;
943
- deviatorStress: number;
944
- cellPressure: number;
945
- porePressure?: number | null;
946
- volumeChange?: number | null;
947
- }
948
- /**
949
- * Reconstituted/remoulded specimen preparation for a triaxial loading test
950
- * Present when the specimen was made in the lab rather than taken intact.
951
- */
952
- export interface SpecimenMadeForLoading {
953
- makingMethod: string | null;
954
- dryVolumetricMassDensity: number | null;
955
- }
956
- /**
957
- * Load stage data for triaxial test
958
- * Documents the shearing/loading phase of the test
959
- */
960
- export interface LoadStage {
961
- deformationRate: number | null;
962
- specimenShape: string | null;
963
- shearStressChangeDuringLoading: Array<ShearStressAtSpecificStrain>;
964
- }
965
- /**
966
- * Shear stress change during loading determination (triaxial/direct shear test)
967
- * ISO 17892-9 (triaxial) or ISO 17892-10 (direct shear)
968
- *
969
- * Measures soil shear strength and stress-strain behavior under controlled loading.
970
- * Common test types:
971
- * - CU: Consolidated Undrained (belastenGeconsolideerdOngedraineerd)
972
- * - CD: Consolidated Drained (belastenGeconsolideerdGedraineerd)
973
- * - UU: Unconsolidated Undrained (belastenOngeconsolideerdOngedraineerd)
974
- */
975
- export interface ShearStressChangeDuringLoadingDetermination {
976
- determinationProcedure: string | null;
977
- determinationMethod: string | null;
978
- specimenDisturbed: boolean | null;
979
- specimenTrimmed: boolean | null;
980
- sampleMoistness: string | null;
981
- beginDiameter: number | null;
982
- beginHeight: number | null;
983
- topCapTiltable: boolean | null;
984
- filterPaperUsed: boolean | null;
985
- drainageStripsUsed: boolean | null;
986
- membraneSaturatedBefore: boolean | null;
987
- apparatusDeformationApplied: boolean | null;
988
- cellDeformationApplied: boolean | null;
989
- stopCriterion: string | null;
990
- membraneCorrection?: MembraneCorrection;
991
- drainageStripCorrection?: DrainageStripCorrection;
992
- madeSpecimenForLoading?: SpecimenMadeForLoading;
993
- saturationStageAtLoading?: SaturationStageAtLoading;
994
- consolidationStageAtLoading?: ConsolidationStageAtLoading;
995
- loadStage?: LoadStage;
996
- }
997
- /**
998
- * Maximum undrained shear strength determination (vane shear test)
999
- * ISO 14688-2 - Measures peak undrained shear strength using hand vane
1000
- */
1001
- export interface MaximumUndrainedShearStrengthDetermination {
1002
- determinationProcedure: string | null;
1003
- determinationMethod: string | null;
1004
- determinationDiameter: string | null;
1005
- verticallyDetermined: boolean | null;
1006
- sampleMoistness: string | null;
1007
- maximumUndrainedShearStrength: number | null;
1008
- }
1009
- /**
1010
- * Height measurement at specific time during consolidation in horizontal deformation test
1011
- */
1012
- export interface HeightAtSpecificConsolidationTime {
1013
- time: number;
1014
- height: number;
1015
- }
1016
- /**
1017
- * Single consolidation step in horizontal deformation test
1018
- */
1019
- export interface ConsolidationStepAtHorizontalDeformation {
1020
- stepNumber: number | null;
1021
- verticalStress: number | null;
1022
- heightChangeDuringConsolidation: Array<HeightAtSpecificConsolidationTime>;
1023
- }
1024
- /**
1025
- * Consolidation stage for horizontal deformation (direct shear) test
1026
- */
1027
- export interface ConsolidationStageAtHorizontalDeformation {
1028
- pedestalFixed: boolean | null;
1029
- consolidationSteps: Array<ConsolidationStepAtHorizontalDeformation>;
1030
- }
1031
- /**
1032
- * Shear stress measurement at specific deformation during horizontal shearing
1033
- */
1034
- export interface HorizontalDeformationDataPoint {
1035
- time: number;
1036
- horizontalDisplacement: number;
1037
- shearStress: number;
1038
- verticalStress: number;
1039
- heightChange?: number | null;
1040
- }
1041
- /**
1042
- * Shear stage for horizontal deformation (direct shear) test
1043
- */
1044
- export interface ShearStageAtHorizontalDeformation {
1045
- deformationRate: number | null;
1046
- activeHeightControl: boolean | null;
1047
- shearStressChangeDuringHorizontalDeformation: Array<HorizontalDeformationDataPoint>;
1048
- }
1049
- /**
1050
- * Shear stress change during horizontal deformation determination (direct shear test)
1051
- * ASTM D6528 - Measures soil shear strength under horizontal deformation
1052
- */
1053
- export interface ShearStressChangeDuringHorizontalDeformationDetermination {
1054
- determinationProcedure: string | null;
1055
- determinationMethod: string | null;
1056
- specimenDisturbed: boolean | null;
1057
- sampleMoistness: string | null;
1058
- specimenWaterSaturated: boolean | null;
1059
- porousDiscWet: boolean | null;
1060
- drained: boolean | null;
1061
- lateralSupport: string | null;
1062
- beginDiameter: number | null;
1063
- beginHeight: number | null;
1064
- stopCriterion: string | null;
1065
- membraneCorrectionApplied: boolean | null;
1066
- apparatusDeformationApplied: boolean | null;
1067
- bearingFrictionCorrectionApplied: boolean | null;
1068
- consolidationStageAtHorizontalDeformation?: ConsolidationStageAtHorizontalDeformation;
1069
- shearStage?: ShearStageAtHorizontalDeformation;
1070
- }
1071
- /**
1072
- * Investigated interval with laboratory determinations
1073
- * Each interval represents a depth range with analysis results
1074
- */
1075
- export interface InvestigatedInterval {
1076
- beginDepth: number;
1077
- endDepth: number;
1078
- sampleQuality: string | null;
1079
- analysisType: string | null;
1080
- waterContentDetermined: boolean | null;
1081
- organicMatterContentDetermined: boolean | null;
1082
- carbonateContentDetermined: boolean | null;
1083
- volumetricMassDensityDetermined: boolean | null;
1084
- volumetricMassDensitySolidsDetermined: boolean | null;
1085
- described: boolean | null;
1086
- waterContentDetermination?: WaterContentDetermination;
1087
- organicMatterContentDetermination?: OrganicMatterContentDetermination;
1088
- carbonateContentDetermination?: CarbonateContentDetermination;
1089
- volumetricMassDensityDetermination?: VolumetricMassDensityDetermination;
1090
- volumetricMassDensityOfSolidsDetermination?: VolumetricMassDensityOfSolidsDetermination;
1091
- particleSizeDistributionDetermination?: ParticleSizeDistributionDetermination;
1092
- consistencyLimitsDetermination?: ConsistencyLimitsDetermination;
1093
- settlementCharacteristicsDetermination?: SettlementCharacteristicsDetermination;
1094
- saturatedPermeabilityDetermination?: SaturatedPermeabilityDetermination;
1095
- shearStressChangeDuringLoadingDetermination?: Array<ShearStressChangeDuringLoadingDetermination>;
1096
- maximumUndrainedShearStrengthDetermination?: MaximumUndrainedShearStrengthDetermination;
1097
- shearStressChangeDuringHorizontalDeformationDetermination?: Array<ShearStressChangeDuringHorizontalDeformationDetermination>;
1098
- }
1099
- /**
1100
- * Borehole sample analysis data (BHR-GT-BMA)
1101
- * Contains laboratory test results for soil samples
1102
- */
1103
- export interface BoreholeSampleAnalysis {
1104
- analysisReportDate: string | null;
1105
- analysisProcedure: string | null;
1106
- investigatedIntervals: Array<InvestigatedInterval>;
1107
- }
1108
- /**
1109
- * Configuration for determination type parsing in registry pattern
1110
- */
1111
- export interface DeterminationConfig<T> {
1112
- xpath: string;
1113
- propertyName: keyof InvestigatedInterval;
1114
- parser: (node: Node, adapter: XMLAdapter, namespaces: Namespaces) => T;
1115
- }
139
+ } & Produced<typeof BHRG_PRODUCER>;
1116
140
  /**
1117
141
  * Union type for all BRO data types
1118
142
  *
@@ -1124,11 +148,33 @@ export interface DeterminationConfig<T> {
1124
148
  * }
1125
149
  * ```
1126
150
  */
1127
- export type BROData = CPTData | BHRGTData | BHRGData;
151
+ export type BROData = CPTData | BHRGTData | BHRGData | GMWData | GLDData;
1128
152
  /**
1129
153
  * BRO file type identifier
1130
154
  */
1131
- export type BROFileType = "CPT" | "BHR-GT" | "BHR-G";
155
+ export type BROFileType = "CPT" | "BHR-GT" | "BHR-G" | "GMW" | "GLD";
156
+ /**
157
+ * Complete GLD (groundwater level research) data.
158
+ *
159
+ * Inferred from `GLD_PRODUCER`; `meta` (parse metadata) and the optional
160
+ * user-set `alias` are the only fields not produced from the XML.
161
+ */
162
+ export type GLDData = {
163
+ meta: ParseMeta;
164
+ alias?: string;
165
+ } & Produced<typeof GLD_PRODUCER>;
166
+ /**
167
+ * Complete GMW (groundwater monitoring well) data.
168
+ *
169
+ * The registration object carries well-level metadata plus one or more
170
+ * monitoring tubes. Inferred from `GMW_PRODUCER`; `meta` (parse
171
+ * metadata) and the optional user-set `alias` are the only fields not produced
172
+ * from the XML.
173
+ */
174
+ export type GMWData = {
175
+ meta: ParseMeta;
176
+ alias?: string;
177
+ } & Produced<typeof GMW_PRODUCER>;
1132
178
  /**
1133
179
  * Parse error with context
1134
180
  */