@bedrock-engineer/bro-xml-parser 0.2.0 → 0.3.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 (47) hide show
  1. package/dist/browser.d.ts +1 -1
  2. package/dist/browser.d.ts.map +1 -1
  3. package/dist/browser.js.map +1 -1
  4. package/dist/node.d.ts +1 -1
  5. package/dist/node.d.ts.map +1 -1
  6. package/dist/node.js.map +1 -1
  7. package/dist/resolvers/bhrg-resolvers.d.ts +3 -18
  8. package/dist/resolvers/bhrg-resolvers.d.ts.map +1 -1
  9. package/dist/resolvers/bhrg-resolvers.js +294 -41
  10. package/dist/resolvers/bhrg-resolvers.js.map +1 -1
  11. package/dist/resolvers/bore-resolver-utils.d.ts +21 -2
  12. package/dist/resolvers/bore-resolver-utils.d.ts.map +1 -1
  13. package/dist/resolvers/bore-resolver-utils.js +69 -22
  14. package/dist/resolvers/bore-resolver-utils.js.map +1 -1
  15. package/dist/resolvers/bore-resolvers.d.ts +34 -17
  16. package/dist/resolvers/bore-resolvers.d.ts.map +1 -1
  17. package/dist/resolvers/bore-resolvers.js +342 -175
  18. package/dist/resolvers/bore-resolvers.js.map +1 -1
  19. package/dist/resolvers/cpt-resolvers.d.ts +1 -8
  20. package/dist/resolvers/cpt-resolvers.d.ts.map +1 -1
  21. package/dist/resolvers/cpt-resolvers.js +2 -29
  22. package/dist/resolvers/cpt-resolvers.js.map +1 -1
  23. package/dist/resolvers/type-resolvers.d.ts +12 -4
  24. package/dist/resolvers/type-resolvers.d.ts.map +1 -1
  25. package/dist/resolvers/type-resolvers.js +12 -4
  26. package/dist/resolvers/type-resolvers.js.map +1 -1
  27. package/dist/resolvers.d.ts +3 -2
  28. package/dist/resolvers.d.ts.map +1 -1
  29. package/dist/resolvers.js +4 -2
  30. package/dist/resolvers.js.map +1 -1
  31. package/dist/schemas/bhrg-schema.d.ts.map +1 -1
  32. package/dist/schemas/bhrg-schema.js +35 -8
  33. package/dist/schemas/bhrg-schema.js.map +1 -1
  34. package/dist/schemas/bore-schema.d.ts.map +1 -1
  35. package/dist/schemas/bore-schema.js +46 -11
  36. package/dist/schemas/bore-schema.js.map +1 -1
  37. package/dist/schemas/common-fields.d.ts +16 -0
  38. package/dist/schemas/common-fields.d.ts.map +1 -0
  39. package/dist/schemas/common-fields.js +31 -0
  40. package/dist/schemas/common-fields.js.map +1 -0
  41. package/dist/schemas/cpt-schema.d.ts.map +1 -1
  42. package/dist/schemas/cpt-schema.js +20 -10
  43. package/dist/schemas/cpt-schema.js.map +1 -1
  44. package/dist/types/index.d.ts +465 -49
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/index.js.map +1 -1
  47. package/package.json +3 -2
@@ -144,15 +144,41 @@ export interface DissipationTest {
144
144
  phenomenonTime: string | null;
145
145
  measurements: Array<DissipationMeasurement>;
146
146
  }
147
+ /**
148
+ * Common `brocom:RegistrationObject` fields shared by every BRO registration
149
+ * type (CPT, BHR-GT, BHR-G, ...).
150
+ *
151
+ * Mirrors how the XSDs model these: each registration object extends
152
+ * `brocom:RegistrationObject` via complexContent. Domain data interfaces extend
153
+ * this so the shared surface is declared once and stays consistent. The runtime
154
+ * counterpart is `COMMON_REGISTRATION_FIELDS` in schemas/common-fields.ts.
155
+ */
156
+ export interface BRORegistrationObject {
157
+ broId: string | null;
158
+ /**
159
+ * BRO quality regime
160
+ *
161
+ * - IMBRO: Strict regime (all mandatory fields required)
162
+ * - IMBRO/A: Relaxed regime for historical data (allows missing fields)
163
+ */
164
+ qualityRegime: QualityRegime | null;
165
+ /** Party responsible for delivering the data to the BRO (bronhouder, KvK number or name) */
166
+ deliveryAccountableParty: string | null;
167
+ /** Object identifier assigned by the accountable party (their own reference) */
168
+ objectIdAccountableParty: string | null;
169
+ /** KvK number of the party responsible for the delivery */
170
+ deliveryResponsibleParty: string | null;
171
+ /** BRO registration history */
172
+ registrationHistory: RegistrationHistory | null;
173
+ }
147
174
  /**
148
175
  * Complete CPT data (metadata + measurements)
149
176
  */
150
- export interface CPTData {
177
+ export interface CPTData extends BRORegistrationObject {
151
178
  /**
152
179
  * Metadata about the parsed document (schema version, warnings)
153
180
  */
154
181
  meta: ParseMeta;
155
- broId: string | null;
156
182
  /**
157
183
  * User-defined identifier (not parsed from XML)
158
184
  *
@@ -166,15 +192,8 @@ export interface CPTData {
166
192
  * ```
167
193
  */
168
194
  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;
195
+ /** KvK number of the operator that carried out the research */
196
+ researchOperator: string | null;
178
197
  researchReportDate: string | null;
179
198
  /** When the cone penetration test was physically performed in the field (om:phenomenonTime) */
180
199
  conePenetrationTestPhenomenonTime: string | null;
@@ -182,17 +201,25 @@ export interface CPTData {
182
201
  conePenetrationTestResultTime: string | null;
183
202
  deliveredLocation: Location | null;
184
203
  standardizedLocation: Location | null;
204
+ /** Coordinate transformation applied to the standardized location (e.g. "RDNAPTRANS2018") */
205
+ coordinateTransformation: string | null;
185
206
  /** Date horizontal position was determined */
186
207
  horizontalPositioningDate: string | null;
187
208
  /** Method used to determine horizontal position (e.g., "onbekend", "GNSS") */
188
209
  horizontalPositioningMethod: string | null;
210
+ /** KvK number of the operator that determined the horizontal position */
211
+ horizontalPositioningOperator: string | null;
189
212
  deliveredVerticalPositionOffset: number | null;
190
213
  deliveredVerticalPositionDatum: string | null;
191
214
  deliveredVerticalPositionReferencePoint: string | null;
215
+ /** Water depth at the CPT location (m), when the survey was performed over water */
216
+ waterDepth: number | null;
192
217
  /** Date vertical position was determined */
193
218
  verticalPositioningDate: string | null;
194
219
  /** Method used to determine vertical position (e.g., "onbekend", "waterpassingKlasse2") */
195
220
  verticalPositioningMethod: string | null;
221
+ /** KvK number of the operator that determined the vertical position */
222
+ verticalPositioningOperator: string | null;
196
223
  /** Delivery context (e.g., "publiekeTaak", "archiefoverdracht") */
197
224
  deliveryContext: string | null;
198
225
  /** Survey purpose (e.g., "waterkering", "onbekend") */
@@ -257,7 +284,6 @@ export interface CPTData {
257
284
  zlmElectricalConductivityAfter: number | null;
258
285
  data: Array<CPTMeasurement>;
259
286
  dissipationTests: Array<DissipationTest>;
260
- registrationHistory: RegistrationHistory | null;
261
287
  }
262
288
  /**
263
289
  * Grain shape properties for sand/gravel fractions
@@ -272,18 +298,98 @@ export interface Grainshape {
272
298
  /** Roughness of grains (e.g., "ruw", "glad") */
273
299
  roughness: string | null;
274
300
  }
301
+ /**
302
+ * Weathering degree of a rock layer (three-axis classification)
303
+ */
304
+ export interface RockWeatheringDegree {
305
+ /** Degree of discolouration */
306
+ discolouration: string | null;
307
+ /** Degree of disintegration */
308
+ disintegration: string | null;
309
+ /** Degree of decomposition */
310
+ decomposition: string | null;
311
+ }
312
+ /**
313
+ * Rock description for a layer (BHR-GT `rock` element).
314
+ *
315
+ * A layer describes either soil (flattened onto BHRGTLayer) or rock (this
316
+ * nested object). Yes/no fields keep their raw code (e.g. "ja", "nee",
317
+ * "nietWaargenomen") to preserve archive nuance.
318
+ */
319
+ export interface RockDescription {
320
+ rockType: string | null;
321
+ cementType: string | null;
322
+ colour: string | null;
323
+ /** Tertiary rock constituents (1 or more) */
324
+ tertiaryRockConstituent: Array<string>;
325
+ interbedding: string | null;
326
+ /** Dispersed inhomogeneities (0-2) */
327
+ dispersedInhomogeneity: Array<string>;
328
+ carbonateContentClass: string | null;
329
+ crossBedding: string | null;
330
+ gradedBedding: string | null;
331
+ voidsPresent: string | null;
332
+ voidDistribution: string | null;
333
+ stability: string | null;
334
+ strengthClass: string | null;
335
+ weathered: string | null;
336
+ weatheringDegree?: RockWeatheringDegree;
337
+ }
338
+ /**
339
+ * Post-sedimentary discontinuity in the descriptive borehole log
340
+ * (e.g. a fracture or fault plane crossing the described interval)
341
+ */
342
+ export interface PostSedimentaryDiscontinuity {
343
+ beginDepth: number;
344
+ endDepth: number;
345
+ /** Whether the discontinuity is in rock (raw code, e.g. "ja"/"nee") */
346
+ inRock: string | null;
347
+ discontinuityType: string | null;
348
+ compositeDiscontinuity: string | null;
349
+ /** Spacing between discontinuities (m) */
350
+ spacing: number | null;
351
+ smooth: string | null;
352
+ apertureClass: string | null;
353
+ infillMaterial: string | null;
354
+ }
275
355
  /**
276
356
  * BHR-GT (Borehole Research Geotechnical) layer data
277
357
  *
278
358
  * Contains all fields from the BRO BHR-GT schema for a single soil layer.
279
359
  */
280
- export interface BHRGTLayer {
360
+ /**
361
+ * Fields shared by every BHR-GT described layer, regardless of whether it
362
+ * describes soil or rock (they live directly on the XSD `layer` element).
363
+ */
364
+ export interface BHRGTLayerBase {
281
365
  upperBoundary: number;
282
366
  lowerBoundary: number;
283
367
  upperBoundaryDetermination?: string | null;
284
368
  lowerBoundaryDetermination?: string | null;
285
369
  /** Whether the layer is anthropogenic (man-made) */
286
370
  anthropogenic?: boolean | null;
371
+ /** Whether the layer boundary is slanted */
372
+ slant?: boolean | null;
373
+ /** Whether the layer is bedded/stratified */
374
+ bedded?: boolean | null;
375
+ /** Bedding type of the layer (e.g., "dikGelamineerd") */
376
+ bedding?: string | null;
377
+ /** Whether the layer is a composite layer */
378
+ compositeLayer?: boolean | null;
379
+ /** Human activity type observed in the layer (e.g., "nietBepaald") */
380
+ activityType?: string | null;
381
+ /** Whether the internal structure is intact (undisturbed) */
382
+ internalStructureIntact?: boolean | null;
383
+ /** Special material in the layer (e.g. anthropogenic debris) */
384
+ specialMaterial?: string | null;
385
+ }
386
+ /**
387
+ * A BHR-GT layer that describes soil (the common case).
388
+ * Discriminate on `material === "soil"`.
389
+ */
390
+ export interface BHRGTSoilLayer extends BHRGTLayerBase {
391
+ material: "soil";
392
+ /** Geotechnical soil name (may be "" for IMBRO/A archive data using NEN 5104) */
287
393
  geotechnicalSoilName: string;
288
394
  /** Soil name per NEN 5104 (IMBRO/A archive data; geotechnicalSoilName is often nil there) */
289
395
  soilNameNEN5104?: string | null;
@@ -311,18 +417,6 @@ export interface BHRGTLayer {
311
417
  interbedding?: string | null;
312
418
  /** Grain shape properties (for sand/gravel) */
313
419
  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
420
  /** Whether the soil is mixed */
327
421
  mixed?: boolean | null;
328
422
  /** Whether the soil has mottled appearance */
@@ -335,19 +429,55 @@ export interface BHRGTLayer {
335
429
  organicSoilTexture?: string | null;
336
430
  /** Tensile strength of peat */
337
431
  peatTensileStrength?: string | null;
432
+ /** Cross bedding present (raw code) */
433
+ crossBedding?: string | null;
434
+ /** Graded bedding present (raw code) */
435
+ gradedBedding?: string | null;
436
+ /** Mixing type of the soil */
437
+ mixingType?: string | null;
438
+ /** Fine gravel content classification */
439
+ fineGravelContentClass?: string | null;
440
+ /** Medium-coarse gravel content classification */
441
+ mediumCoarseGravelContentClass?: string | null;
442
+ /** Very coarse gravel content classification */
443
+ veryCoarseGravelContentClass?: string | null;
444
+ /** Sand sorting classification per NEN 5104 */
445
+ sandSortingNEN5104?: string | null;
446
+ /** Peat type classification */
447
+ peatType?: string | null;
448
+ /** Depositional age of the layer */
449
+ depositionalAge?: string | null;
338
450
  }
451
+ /**
452
+ * A BHR-GT layer that describes rock.
453
+ * Discriminate on `material === "rock"`.
454
+ */
455
+ export interface BHRGTRockLayer extends BHRGTLayerBase {
456
+ material: "rock";
457
+ /** Rock description */
458
+ rock: RockDescription;
459
+ }
460
+ /**
461
+ * A BHR-GT described layer: either soil or rock.
462
+ *
463
+ * Narrow on the `material` discriminant:
464
+ * ```ts
465
+ * if (layer.material === "rock") layer.rock.rockType;
466
+ * else layer.geotechnicalSoilName;
467
+ * ```
468
+ */
469
+ export type BHRGTLayer = BHRGTSoilLayer | BHRGTRockLayer;
339
470
  /**
340
471
  * Complete Bore data (metadata + layers)
341
472
  *
342
473
  * Note: BHRGTData represents BHR-GT-BMB (Boormonsterbeschrijving - visual/textural description)
343
474
  * For laboratory analysis data, see the optional `analysis` field (BHR-GT-BMA)
344
475
  */
345
- export interface BHRGTData {
476
+ export interface BHRGTData extends BRORegistrationObject {
346
477
  /**
347
478
  * Metadata about the parsed document (schema version, warnings)
348
479
  */
349
480
  meta: ParseMeta;
350
- broId: string | null;
351
481
  /**
352
482
  * User-defined identifier (not parsed from XML)
353
483
  *
@@ -361,15 +491,6 @@ export interface BHRGTData {
361
491
  * ```
362
492
  */
363
493
  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
494
  researchReportDate: string | null;
374
495
  deliveredLocation: Location | null;
375
496
  standardizedLocation: Location | null;
@@ -378,6 +499,10 @@ export interface BHRGTData {
378
499
  deliveredVerticalPositionReferencePoint: string | null;
379
500
  /** Soil use at the site (e.g., "akker", "grasland", "geenBodemgebruik") */
380
501
  soilUse: string | null;
502
+ /** Position of the borehole on the ground body (e.g. "kruin", "talud") */
503
+ positionOnGroundBody: string | null;
504
+ /** Temporary change at the site at time of drilling (e.g. "geen") */
505
+ temporaryChange: string | null;
381
506
  descriptionProcedure: string | null;
382
507
  groundwaterLevel: number | null;
383
508
  /** Mean highest groundwater level in m relative to local reference (GHG) */
@@ -387,6 +512,12 @@ export interface BHRGTData {
387
512
  boreRockReached: boolean | null;
388
513
  finalBoreDepth: number | null;
389
514
  finalSampleDepth: number | null;
515
+ /** Final depth reached during site preparation (m) */
516
+ finalDepthPreparation: number | null;
517
+ /** Final depth reached by excavation (m) */
518
+ finalDepthExcavation: number | null;
519
+ /** Final depth reached with a temporary casing (m) */
520
+ finalDepthTemporaryCasing: number | null;
390
521
  boreHoleCompleted: boolean | null;
391
522
  /** Start date of the boring operation */
392
523
  boringStartDate: string | null;
@@ -404,10 +535,14 @@ export interface BHRGTData {
404
535
  stopCriterion: string | null;
405
536
  /** Whether a flushing medium was used during boring */
406
537
  flushingMediumUsed: boolean | null;
538
+ /** Flushing additive used during boring (e.g. "geen"), when a flushing medium was used */
539
+ flushingAdditive: string | null;
407
540
  /** Whether a temporary casing was used during boring */
408
541
  temporaryCasingUsed: boolean | null;
409
542
  /** Site preparation before boring (e.g., "geen") */
410
543
  preparation: string | null;
544
+ /** KvK number of the operator that carried out the research */
545
+ researchOperator: string | null;
411
546
  /** Type of sampler used */
412
547
  samplerType: string | null;
413
548
  /** Sampling procedure standard */
@@ -462,8 +597,14 @@ export interface BHRGTData {
462
597
  completedIntervals: Array<CompletedInterval>;
463
598
  /** Array of intervals not described (with reason) */
464
599
  notDescribedIntervals: Array<NotDescribedInterval>;
465
- /** BRO registration history */
466
- registrationHistory: RegistrationHistory | null;
600
+ /** Array of post-sedimentary discontinuities in the descriptive log */
601
+ postSedimentaryDiscontinuities: Array<PostSedimentaryDiscontinuity>;
602
+ /** Array of excavated layers (removed by excavation) */
603
+ excavatedLayers: Array<ExcavatedLayer>;
604
+ /** Boring velocity profile (elapsed time vs depth) */
605
+ boringVelocity: Array<BoringVelocityMeasurement>;
606
+ /** Fluid mud (slib) layer at the borehole, when present */
607
+ fluidMudLayer?: FluidMudLayer;
467
608
  /** Report history with events */
468
609
  reportHistory: ReportHistory | null;
469
610
  /** Delivery context (e.g., "publiekeTaak") */
@@ -477,10 +618,139 @@ export interface BHRGTData {
477
618
  /** Whether site characteristics were determined */
478
619
  siteCharacteristicDetermined: boolean | null;
479
620
  }
621
+ /** Munsell colour notation (BHR-G soil colour) */
622
+ export interface MunsellColour {
623
+ munsellHue: string | null;
624
+ munsellValue: string | null;
625
+ munsellChroma: string | null;
626
+ }
627
+ /** A constituent of the sand fraction */
628
+ export interface SandConstituent {
629
+ grainColour: string | null;
630
+ percentageClass: string | null;
631
+ archiveClass: string | null;
632
+ }
633
+ /** Sand fraction description (BHR-G soil) */
634
+ export interface SandFraction {
635
+ darkGrainContentClass: string | null;
636
+ darkGrainContentClassArchive: string | null;
637
+ angularity: string | null;
638
+ sandMedianClass: string | null;
639
+ sandSorting: string | null;
640
+ variegation: string | null;
641
+ anomalouslyCoarseContentClass: string | null;
642
+ anomalouslyCoarseContentClassArchive: string | null;
643
+ granuleContentClass: string | null;
644
+ granuleContentClassArchive: string | null;
645
+ estimatedMedian: number | null;
646
+ sandConstituents: Array<SandConstituent>;
647
+ }
648
+ /** A constituent of the shell fraction */
649
+ export interface ShellConstituent {
650
+ shellTaxon: string | null;
651
+ relativeAbundance: string | null;
652
+ relativeAbundanceClass: string | null;
653
+ relativeAbundanceClassArchive: string | null;
654
+ }
655
+ /** Shell fraction description (BHR-G soil) */
656
+ export interface ShellFraction {
657
+ gritContentClass: string | null;
658
+ fragmentContentClass: string | null;
659
+ remainsContentClass: string | null;
660
+ wholeContentClass: string | null;
661
+ doublets: string | null;
662
+ thickWalledContentClass: string | null;
663
+ thinWalledContentClass: string | null;
664
+ inSitu: string | null;
665
+ weatheringDegree: string | null;
666
+ shellConstituents: Array<ShellConstituent>;
667
+ }
668
+ /** A constituent of the gravel fraction */
669
+ export interface GravelConstituent {
670
+ gravelType: string | null;
671
+ fractionProportion: number | null;
672
+ archiveClass: string | null;
673
+ }
674
+ /** Gravel fraction description (BHR-G soil) */
675
+ export interface GravelFraction {
676
+ gravelMedianClass: string | null;
677
+ angularity: string | null;
678
+ fineGravelContentClass: string | null;
679
+ mediumCoarseGravelContentClass: string | null;
680
+ veryCoarseGravelContentClass: string | null;
681
+ ventifactPresent: string | null;
682
+ sphericity: string | null;
683
+ variegation: string | null;
684
+ gravelProvenance: string | null;
685
+ estimatedMedian: number | null;
686
+ gravelConstituents: Array<GravelConstituent>;
687
+ }
688
+ /** A constituent of the peat fraction */
689
+ export interface PeatConstituent {
690
+ plantRemainType: string | null;
691
+ percentageClass: string | null;
692
+ archiveClass: string | null;
693
+ }
694
+ /** Peat fraction description (BHR-G soil) */
695
+ export interface PeatFraction {
696
+ peatType: string | null;
697
+ peatConstituents: Array<PeatConstituent>;
698
+ }
699
+ /** A chunk (brok) of differing material within a layer */
700
+ export interface Chunk {
701
+ soilType: string | null;
702
+ sizeClass: string | null;
703
+ percentageClass: string | null;
704
+ archiveClass: string | null;
705
+ colour: string | null;
706
+ geologicalOrigin: string | null;
707
+ cemented: string | null;
708
+ }
709
+ /** Fine fraction distribution for organic soils (mass proportions, %) */
710
+ export interface FineFractionDistributionOrganicSoil {
711
+ estimatedMassProportionSand: number | null;
712
+ estimatedMassProportionSilt: number | null;
713
+ estimatedMassProportionLutum: number | null;
714
+ }
715
+ /** Fine fraction distribution for shelly soils (volume proportions, %) */
716
+ export interface FineFractionDistributionShellySoil {
717
+ estimatedVolumeProportionSand: number | null;
718
+ estimatedVolumeProportionSilt: number | null;
719
+ estimatedVolumeProportionLutum: number | null;
720
+ }
721
+ /** Estimated fraction distribution of a layer's soil */
722
+ export interface FractionDistribution {
723
+ fractionDistributionComplete: string | null;
724
+ estimatedMassProportionOrganicMatter: number | null;
725
+ estimatedMassProportionShellMatter: number | null;
726
+ estimatedVolumeProportionShellMatter: number | null;
727
+ estimatedMassProportionShell: number | null;
728
+ estimatedMassProportionGravel: number | null;
729
+ estimatedVolumeProportionGravel: number | null;
730
+ fineFractionDistributionOrganicSoil?: FineFractionDistributionOrganicSoil;
731
+ fineFractionDistributionShellySoil?: FineFractionDistributionShellySoil;
732
+ }
733
+ /** A mottle (vlek) in a layer */
734
+ export interface Mottle {
735
+ colour: string | null;
736
+ density: string | null;
737
+ inBands: string | null;
738
+ }
739
+ /** A thin stratum (laagje) interbedded in a layer */
740
+ export interface ThinStratum {
741
+ layerProportion: number | null;
742
+ layerProportionClass: string | null;
743
+ layerProportionClassArchive: string | null;
744
+ stratumThicknessClass: string | null;
745
+ geologicalOrigin: string | null;
746
+ }
480
747
  /**
481
748
  * BHR-G (Geological Borehole) layer data
482
749
  *
483
750
  * Contains all fields from the BRO BHR-G schema for a single soil layer.
751
+ * Soil-level fields are flattened directly onto the layer (matching the parser's
752
+ * existing style); genuinely nested sub-structures (fractions, mottles, chunks,
753
+ * thin strata) are modelled as nested objects/arrays.
484
754
  */
485
755
  export interface BHRGLayer {
486
756
  upperBoundary: number;
@@ -497,34 +767,82 @@ export interface BHRGLayer {
497
767
  gravelContentClass?: string | null;
498
768
  carbonateContentClass?: string | null;
499
769
  sandMedianClass?: string | null;
770
+ /** Whether a post-sedimentary change is present (raw code) */
771
+ postSedimentary?: string | null;
772
+ horizonCode?: string | null;
773
+ humanTrace?: string | null;
774
+ geologicalOrigin?: string | null;
775
+ bioturbated?: string | null;
776
+ /** Sedimentary structures (0-3) */
777
+ structure?: Array<string>;
778
+ /** Vertical trends (0-3) */
779
+ verticalTrend?: Array<string>;
780
+ /** Archeological constituent types (0-5) */
781
+ archeologicalConstituents?: Array<string>;
782
+ /** Geological soil name (lithostratigraphic) */
783
+ geologicalSoilName?: string | null;
784
+ /** Shell matter content classification */
785
+ shellMatterContentClass?: string | null;
786
+ micaContentClass?: string | null;
787
+ micaContentClassArchive?: string | null;
788
+ shellMatterContentClassArchive?: string | null;
789
+ /** Very coarse fraction content classes (0-2) */
790
+ veryCoarseFractionContentClass?: Array<string>;
791
+ /** Very coarse fraction content classes, archive coding (0-2) */
792
+ veryCoarseFractionContentClassArchive?: Array<string>;
793
+ glauconiteContentClass?: string | null;
794
+ glauconiteContentClassArchive?: string | null;
795
+ sedimentaryPhenomenon?: string | null;
796
+ /** Animal fossil types found in the soil (0+) */
797
+ animalFossils?: Array<string>;
798
+ munsellColour?: MunsellColour;
799
+ sandFraction?: SandFraction;
800
+ shellFraction?: ShellFraction;
801
+ gravelFraction?: GravelFraction;
802
+ peatFraction?: PeatFraction;
803
+ fractionDistribution?: FractionDistribution;
804
+ /** Chunks of differing material (0-3) */
805
+ chunks?: Array<Chunk>;
806
+ /** Mottles (0-3) */
807
+ mottles?: Array<Mottle>;
808
+ /** Thin interbedded strata (0-4) */
809
+ thinStrata?: Array<ThinStratum>;
500
810
  }
501
811
  /**
502
812
  * Complete BHR-G (Geological Borehole) data (metadata + layers)
503
813
  */
504
- export interface BHRGData {
814
+ export interface BHRGData extends BRORegistrationObject {
505
815
  /**
506
816
  * Metadata about the parsed document (schema version, warnings)
507
817
  */
508
818
  meta: ParseMeta;
509
- broId: string | null;
510
819
  /**
511
820
  * User-defined identifier (not parsed from XML)
512
821
  */
513
822
  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
823
  researchReportDate: string | null;
522
824
  deliveredLocation: Location | null;
523
825
  standardizedLocation: Location | null;
524
826
  deliveredVerticalPositionOffset: number | null;
525
827
  deliveredVerticalPositionDatum: string | null;
526
828
  deliveredVerticalPositionReferencePoint: string | null;
829
+ /** Water depth at the borehole location (m), when the survey was over water */
830
+ waterDepth: number | null;
831
+ /** Date vertical position was determined */
832
+ verticalPositioningDate: string | null;
833
+ /** Method used to determine vertical position */
834
+ verticalPositioningMethod: string | null;
835
+ /** KvK number of the operator that determined the vertical position */
836
+ verticalPositioningOperator: string | null;
837
+ /** Landscape element at the site */
838
+ landscapeElement: string | null;
839
+ /** Hydrological setting at the site */
840
+ hydrologicalSetting: string | null;
841
+ /** Current geomorphological process at the site */
842
+ currentProcess: string | null;
527
843
  descriptionProcedure: string | null;
844
+ /** Tool used for the sample description */
845
+ utensil: string | null;
528
846
  boreRockReached: boolean | null;
529
847
  finalBoreDepth: number | null;
530
848
  finalSampleDepth: number | null;
@@ -543,6 +861,8 @@ export interface BHRGData {
543
861
  subsurfaceContaminated: boolean | null;
544
862
  /** Stop criterion for boring */
545
863
  stopCriterion: string | null;
864
+ /** Whether a flushing additive was used (raw code) */
865
+ flushingAdditiveUsed: string | null;
546
866
  /** Sampling procedure standard */
547
867
  samplingProcedure: string | null;
548
868
  /** Sampling method used */
@@ -568,8 +888,6 @@ export interface BHRGData {
568
888
  boredIntervals: Array<BoredInterval>;
569
889
  /** Array of sampled intervals with method and quality */
570
890
  sampledIntervals: Array<SampledInterval>;
571
- /** BRO registration history */
572
- registrationHistory: RegistrationHistory | null;
573
891
  /** Report history with events */
574
892
  reportHistory: ReportHistory | null;
575
893
  /** Delivery context (e.g., "archiefoverdracht") */
@@ -608,6 +926,19 @@ export interface SamplerDetails {
608
926
  coreCatcherPresent: boolean | null;
609
927
  pistonPresent: boolean | null;
610
928
  }
929
+ /**
930
+ * Core recovery measurements for a sampled interval (rock coring)
931
+ */
932
+ export interface CoreRecovery {
933
+ /** Total core recovery (%) */
934
+ totalCoreRecovery: number | null;
935
+ /** Solid core recovery (%) */
936
+ solidCoreRecovery: number | null;
937
+ /** Rock Quality Designation (%) */
938
+ rockQualityDesignation: number | null;
939
+ /** Whether the core recovery was determined in the field */
940
+ fieldDetermined: boolean | null;
941
+ }
611
942
  /**
612
943
  * Sampled interval - records sampling method and quality at specific depth ranges
613
944
  */
@@ -619,6 +950,8 @@ export interface SampledInterval {
619
950
  samplingQuality: string | null;
620
951
  orientatedSampled: boolean | null;
621
952
  sampler?: SamplerDetails;
953
+ /** Core recovery measurements (rock coring), when determined */
954
+ coreRecovery?: CoreRecovery;
622
955
  }
623
956
  /**
624
957
  * Completed interval - records how the borehole was completed/backfilled
@@ -627,10 +960,45 @@ export interface CompletedInterval {
627
960
  beginDepth: number;
628
961
  endDepth: number;
629
962
  permanentCasingPresent: boolean | null;
963
+ /** Diameter of the permanent casing (mm) */
964
+ diameterPermanentCasing: number | null;
965
+ /** Material of the permanent casing */
966
+ materialPermanentCasing: string | null;
630
967
  backfillMaterial: string | null;
631
968
  backfillMaterialWashed: boolean | null;
632
969
  backfillMaterialCertified: boolean | null;
633
970
  }
971
+ /**
972
+ * Excavated layer - a layer removed by excavation before/during boring
973
+ */
974
+ export interface ExcavatedLayer {
975
+ upperBoundary: number;
976
+ lowerBoundary: number;
977
+ /** Material that was excavated */
978
+ excavatedMaterial: string | null;
979
+ }
980
+ /**
981
+ * Boring velocity measurement - drilling depth reached after a given elapsed time
982
+ */
983
+ export interface BoringVelocityMeasurement {
984
+ /** Elapsed time (s) */
985
+ elapsedTime: number | null;
986
+ /** Depth reached (m) */
987
+ depth: number | null;
988
+ }
989
+ /**
990
+ * Fluid mud layer - a layer of fluid mud (slib) recorded at the borehole
991
+ */
992
+ export interface FluidMudLayer {
993
+ /** Thickness of the fluid mud layer (m) */
994
+ thickness: number | null;
995
+ /** Colour of the fluid mud */
996
+ colour: string | null;
997
+ /** Method used to position the upper boundary */
998
+ upperBoundaryPositioningMethod: string | null;
999
+ /** Method used to position the lower boundary */
1000
+ lowerBoundaryPositioningMethod: string | null;
1001
+ }
634
1002
  /**
635
1003
  * Not described interval - records depth ranges that were not described and why
636
1004
  */
@@ -655,6 +1023,14 @@ export interface RegistrationHistory {
655
1023
  registrationCompletionTime: string | null;
656
1024
  /** Time of the latest correction to the registered object */
657
1025
  latestCorrectionTime: string | null;
1026
+ /** Time of the latest addition to the registered object */
1027
+ latestAdditionTime: string | null;
1028
+ /** Time the object was placed under review */
1029
+ underReviewTime: string | null;
1030
+ /** Time the object was deregistered */
1031
+ deregistrationTime: string | null;
1032
+ /** Time the object was reregistered after deregistration */
1033
+ reregistrationTime: string | null;
658
1034
  corrected: boolean | null;
659
1035
  underReview: boolean | null;
660
1036
  deregistered: boolean | null;
@@ -736,6 +1112,8 @@ export interface ParticleSizeDistributionDetermination {
736
1112
  removedMaterial: string | null;
737
1113
  equivalentMassDeterminationMethod: string | null;
738
1114
  equivalentMass: number | null;
1115
+ /** Optical model used (for laser-diffraction methods) */
1116
+ usedOpticalModel?: string | null;
739
1117
  fractionSmaller63um: number | null;
740
1118
  fractionLarger63um: number | null;
741
1119
  fraction0to2um?: number | null;
@@ -763,6 +1141,20 @@ export interface ParticleSizeDistributionDetermination {
763
1141
  fraction16to31_5mm?: number | null;
764
1142
  fraction31_5to63mm?: number | null;
765
1143
  fractionLarger63mm?: number | null;
1144
+ fraction63to75um?: number | null;
1145
+ fraction75to90um?: number | null;
1146
+ fraction90to106um?: number | null;
1147
+ fraction106to125um?: number | null;
1148
+ fraction125to150um?: number | null;
1149
+ fraction150to180um?: number | null;
1150
+ fraction180to212um?: number | null;
1151
+ fraction212to250um?: number | null;
1152
+ fraction4to5_6mm?: number | null;
1153
+ fraction5_6to8mm?: number | null;
1154
+ fraction8to11_2mm?: number | null;
1155
+ fraction11_2to16mm?: number | null;
1156
+ fraction16to20mm?: number | null;
1157
+ fraction20to31_5mm?: number | null;
766
1158
  }
767
1159
  /**
768
1160
  * Plasticity data point for Atterberg limits test
@@ -836,6 +1228,10 @@ export interface SaturationStageAtCompression {
836
1228
  constantHeight: boolean | null;
837
1229
  specimenHeightAfterwards: number | null;
838
1230
  disturbanceInduced: boolean | null;
1231
+ /** Maximum stress difference during saturation (kPa) */
1232
+ maximumStressDifference: number | null;
1233
+ /** Maximum strain during saturation (%) */
1234
+ maximumStrain: number | null;
839
1235
  }
840
1236
  /**
841
1237
  * Settlement characteristics determination (oedometer/consolidation test)
@@ -863,6 +1259,13 @@ export interface SaturatedPermeabilityAtSpecificDensity {
863
1259
  dryVolumetricMassDensity: number | null;
864
1260
  saturatedPermeability: number | null;
865
1261
  }
1262
+ /**
1263
+ * Permeability at specific load measurement
1264
+ */
1265
+ export interface SaturatedPermeabilityAtSpecificLoad {
1266
+ load: number | null;
1267
+ saturatedPermeability: number | null;
1268
+ }
866
1269
  /**
867
1270
  * Saturated permeability determination (hydraulic conductivity)
868
1271
  * Used to determine water flow characteristics through soil
@@ -878,7 +1281,14 @@ export interface SaturatedPermeabilityDetermination {
878
1281
  waterDegassed: boolean | null;
879
1282
  temperature: number | null;
880
1283
  maximumGradient: number | null;
1284
+ /** Whether the confining ring was water-repellent (raw code) */
1285
+ ringWaterRepellent: string | null;
1286
+ /** Water content after the test (%) */
1287
+ waterContentAfterwards: number | null;
1288
+ /** Material irregularities observed (0-2 codes) */
1289
+ materialIrregularity: Array<string>;
881
1290
  saturatedPermeabilityAtSpecificDensity: Array<SaturatedPermeabilityAtSpecificDensity>;
1291
+ saturatedPermeabilityAtSpecificLoad: Array<SaturatedPermeabilityAtSpecificLoad>;
882
1292
  }
883
1293
  /**
884
1294
  * Membrane correction data for triaxial test
@@ -912,6 +1322,8 @@ export interface SaturationStageAtLoading {
912
1322
  effectivePressure: number | null;
913
1323
  skemptonBCoefficient: number | null;
914
1324
  disturbanceInduced: boolean | null;
1325
+ /** Stress difference during saturation (kPa) */
1326
+ stressDifference: number | null;
915
1327
  }
916
1328
  /**
917
1329
  * Volume change measurement at specific time during consolidation
@@ -1005,6 +1417,10 @@ export interface MaximumUndrainedShearStrengthDetermination {
1005
1417
  verticallyDetermined: boolean | null;
1006
1418
  sampleMoistness: string | null;
1007
1419
  maximumUndrainedShearStrength: number | null;
1420
+ /** Lowest measured maximum undrained shear strength (kPa) */
1421
+ lowestMaximumUndrainedShearStrength: number | null;
1422
+ /** Highest measured maximum undrained shear strength (kPa) */
1423
+ highestMaximumUndrainedShearStrength: number | null;
1008
1424
  }
1009
1425
  /**
1010
1426
  * Height measurement at specific time during consolidation in horizontal deformation test