@welldot/core 0.2.2 → 0.2.3
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.
- package/LICENSE +76 -53
- package/dist/index.cjs.map +1 -1
- package/docs/schema/v2/well.schema.json +11 -6
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
Apache License
|
|
2
3
|
Version 2.0, January 2004
|
|
3
4
|
http://www.apache.org/licenses/
|
|
@@ -32,9 +33,10 @@
|
|
|
32
33
|
not limited to compiled object code, generated documentation,
|
|
33
34
|
and conversions to other media types.
|
|
34
35
|
|
|
35
|
-
"Work" shall mean the work of authorship
|
|
36
|
-
the License, as indicated by a
|
|
37
|
-
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
38
40
|
|
|
39
41
|
"Derivative Works" shall mean any work, whether in Source or Object
|
|
40
42
|
form, that is based on (or derived from) the Work and for which the
|
|
@@ -44,21 +46,23 @@
|
|
|
44
46
|
separable from, or merely link (or bind by name) to the interfaces of,
|
|
45
47
|
the Work and Derivative Works thereof.
|
|
46
48
|
|
|
47
|
-
"Contribution" shall mean
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
or
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
62
66
|
|
|
63
67
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
64
68
|
this License, each Contributor hereby grants to You a perpetual,
|
|
@@ -74,22 +78,22 @@
|
|
|
74
78
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
75
79
|
where such license applies only to those patent claims licensable
|
|
76
80
|
by such Contributor that are necessarily infringed by their
|
|
77
|
-
Contribution(s) alone or by
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
78
82
|
with the Work to which such Contribution(s) was submitted. If You
|
|
79
|
-
institute patent litigation against any entity (including a
|
|
80
|
-
or counterclaim in a lawsuit) alleging that the Work
|
|
81
|
-
Contribution
|
|
82
|
-
patent infringement, then any patent licenses
|
|
83
|
-
this License for that Work shall terminate
|
|
84
|
-
litigation is filed.
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
85
89
|
|
|
86
90
|
4. Redistribution. You may reproduce and distribute copies of the
|
|
87
91
|
Work or Derivative Works thereof in any medium, with or without
|
|
88
92
|
modifications, and in Source or Object form, provided that You
|
|
89
93
|
meet the following conditions:
|
|
90
94
|
|
|
91
|
-
(a) You must give any other recipients of the Work or
|
|
92
|
-
Works a copy of this License; and
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
93
97
|
|
|
94
98
|
(b) You must cause any modified files to carry prominent notices
|
|
95
99
|
stating that You changed the files; and
|
|
@@ -101,24 +105,28 @@
|
|
|
101
105
|
the Derivative Works; and
|
|
102
106
|
|
|
103
107
|
(d) If the Work includes a "NOTICE" text file as part of its
|
|
104
|
-
distribution,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
the
|
|
109
|
-
Derivative Works;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
122
130
|
|
|
123
131
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
124
132
|
any Contribution intentionally submitted for inclusion in the Work
|
|
@@ -140,7 +148,7 @@
|
|
|
140
148
|
implied, including, without limitation, any warranties or conditions
|
|
141
149
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
142
150
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
143
|
-
appropriateness of using or
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
144
152
|
risks associated with Your exercise of permissions under this License.
|
|
145
153
|
|
|
146
154
|
8. Limitation of Liability. In no event and under no legal theory,
|
|
@@ -148,23 +156,38 @@
|
|
|
148
156
|
unless required by applicable law (such as deliberate and grossly
|
|
149
157
|
negligent acts) or agreed to in writing, shall any Contributor be
|
|
150
158
|
liable to You for damages, including any direct, indirect, special,
|
|
151
|
-
incidental, or
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
152
160
|
result of this License or out of the use or inability to use the
|
|
153
161
|
Work (including but not limited to damages for loss of goodwill,
|
|
154
|
-
work stoppage, computer failure or malfunction, or all
|
|
155
|
-
commercial damages or losses), even if such Contributor
|
|
156
|
-
advised of the possibility of such damages.
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
157
165
|
|
|
158
166
|
9. Accepting Warranty or Additional Liability. While redistributing
|
|
159
167
|
the Work or Derivative Works thereof, You may choose to offer,
|
|
160
168
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
161
169
|
or other liability obligations and/or rights consistent with this
|
|
162
|
-
License. However, in accepting such obligations, You may
|
|
163
|
-
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
164
176
|
|
|
165
177
|
END OF TERMS AND CONDITIONS
|
|
166
178
|
|
|
167
|
-
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright 2024 Rafael Neto
|
|
168
191
|
|
|
169
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
170
193
|
you may not use this file except in compliance with the License.
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/validators/well.validators.ts","../src/utils/well.utils.ts","../src/utils/fgdc.textures.ts","../src/utils/units.ts"],"sourcesContent":["// Types\nexport type {\n AirliftEvent,\n AquiferAnalysis,\n Attachment,\n BoreHole,\n Cave,\n CementPad,\n ConstantRateEvent,\n Constructive,\n Fracture,\n Geologic,\n HistoryLogEntry,\n HoleFill,\n HydrodynamicEvent,\n HydrodynamicEventBase,\n LevelReading,\n Lithology,\n Location,\n LocationProperties,\n PumpingStep,\n RecoveryOnlyEvent,\n RecoveryPhase,\n Reduction,\n SectionKey,\n SectionVisibility,\n SpotMeasurementEvent,\n StepDrawdownEvent,\n SurfaceCase,\n Texture,\n Well,\n WellCase,\n WellId,\n WellScreen,\n} from './types/well.types';\n\nexport type {\n DiameterUnits,\n LengthUnits,\n Units,\n UnitsTypes,\n} from './types/units.types';\n\n// Validators\nexport {\n AirliftEventSchema,\n AquiferAnalysisSchema,\n AttachmentSchema,\n BoreHoleSchema,\n CaveSchema,\n CementPadSchema,\n ConstantRateEventSchema,\n FractureSchema,\n HistoryLogEntrySchema,\n HoleFillSchema,\n HydrodynamicEventBaseSchema,\n HydrodynamicEventSchema,\n LevelReadingSchema,\n LithologySchema,\n LocationPropertiesSchema,\n LocationSchema,\n PumpingStepSchema,\n RecoveryOnlyEventSchema,\n RecoveryPhaseSchema,\n ReductionSchema,\n SpotMeasurementEventSchema,\n StepDrawdownEventSchema,\n SurfaceCaseSchema,\n TextureSchema,\n WellCaseSchema,\n WellIdSchema,\n WellSchema,\n WellScreenSchema,\n parseWell,\n} from './validators/well.validators';\n\n// Format utilities (serialise/deserialise .well format only)\nexport {\n checkIfProfileIsEmpty,\n convertProfileFromJSON,\n deserializeWell,\n isWellEmpty,\n profileToWell,\n redactWell,\n SECTION_KEYS,\n serializeWell,\n} from './utils/well.utils';\n\nexport type { TextureCode, TextureOption } from './types/textures';\nexport { FGDC_TEXTURES_OPTIONS } from './utils/fgdc.textures';\n\n// Backward-compat alias for app migration\nexport type { Well as Profile } from './types/well.types';\n\n// Units conversion utilities\nexport {\n cubicMeterPerHourToLitersPerSecond,\n cubicMeterPerHourToUsGallonsPerMinute,\n decimalDegreesToDms,\n dmsToDecimalDegrees,\n feetToMeters,\n hoursToMinutes,\n inchesToMm,\n kilopascalToPsi,\n litersPerSecondToCubicMeterPerHour,\n metersToFeet,\n minutesToHours,\n mmToInches,\n mmToSlotNumber,\n psiToKilopascal,\n slotNumberToMm,\n squareMeterPerDayToSquareMeterPerSecond,\n squareMeterPerSecondToSquareMeterPerDay,\n usGallonsPerMinuteToCubicMeterPerHour,\n} from './utils/units';\nexport type { DmsCoordinate } from './utils/units';\n","import { createDefu } from 'defu';\nimport { z } from 'zod';\nimport type { Well } from '../types/well.types';\n\n// ─── defu custom merger ───────────────────────────────────────────────────────\n// In createDefu callbacks: obj = defaults object, key = key, value = source value.\n// When source has an array, assign it back to obj[key] so defu uses it as-is\n// (prevents defu's default array-concatenation behavior).\nexport const mergeWell = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] = value;\n return true;\n }\n});\n\n// ─── Datetime helper ──────────────────────────────────────────────────────────\nconst RFC3339_WITH_OFFSET =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\nconst rfc3339 = () =>\n z\n .string()\n .regex(RFC3339_WITH_OFFSET, 'datetime must be RFC 3339 with UTC offset');\n\n// ─── Location schemas ─────────────────────────────────────────────────────────\n\nexport const WellIdSchema = z.object({\n authority: z.string(),\n id: z.string(),\n primary: z.boolean().optional(),\n});\n\nexport const LocationPropertiesSchema = z.object({\n elevation_datum: z.string().optional(),\n crs: z.string().optional(),\n lat_precision: z.number().optional(),\n lng_precision: z.number().optional(),\n elevation_precision: z.number().optional(),\n original_crs: z.string().optional(),\n});\n\nexport const LocationSchema = z.object({\n lat: z.number(),\n lng: z.number(),\n elevation: z.number().optional(),\n properties: LocationPropertiesSchema.optional(),\n});\n\n// ─── Constructive schemas ─────────────────────────────────────────────────────\n\nexport const BoreHoleSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n drilling_method: z.string().optional(),\n});\n\nexport const WellCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n});\n\nexport const ReductionSchema = z.object({\n from: z.number(),\n to: z.number(),\n diam_from: z.number(),\n diam_to: z.number(),\n type: z.string(),\n});\n\nexport const WellScreenSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n screen_slot: z.number(),\n});\n\nexport const HoleFillSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.enum(['gravel_pack', 'seal']),\n diameter: z.number(),\n description: z.string(),\n});\n\nexport const SurfaceCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n});\n\nexport const CementPadSchema = z.object({\n type: z.string(),\n width: z.number(),\n thickness: z.number(),\n length: z.number(),\n});\n\n// ─── Geologic schemas ─────────────────────────────────────────────────────────\n\nexport const TextureSchema = z.object({\n code: z.union([z.string(), z.number()]),\n vocabulary: z.string().optional(),\n});\n\nexport const LithologySchema = z.object({\n from: z.number(),\n to: z.number(),\n description: z.string(),\n color: z.string(),\n texture: TextureSchema,\n geologic_unit: z.string(),\n aquifer_unit: z.string(),\n});\n\nexport const FractureSchema = z.object({\n depth: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n swarm: z.boolean(),\n azimuth: z.number(),\n dip: z.number(),\n depth_precision: z.number().optional(),\n});\n\nexport const CaveSchema = z.object({\n from: z.number(),\n to: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n});\n\n// ─── Hydrodynamic event schemas ───────────────────────────────────────────────\n\nexport const LevelReadingSchema = z.object({\n elapsed: z.number(),\n depth: z.number(),\n depth_precision: z.number().optional(),\n pressure: z.number().optional(),\n});\n\nexport const RecoveryPhaseSchema = z.object({\n readings: z.array(LevelReadingSchema),\n});\n\nexport const PumpingStepSchema = z.object({\n rate: z.number(),\n rate_precision: z.number().optional(),\n duration: z.number().optional(),\n readings: z.array(LevelReadingSchema).optional(),\n});\n\nexport const HydrodynamicEventBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n datetime: rfc3339(),\n sequence: z.number().int().optional(),\n operator: z.string().optional(),\n equipment: z.string().optional(),\n notes: z.string().optional(),\n});\n\nexport const SpotMeasurementEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('spot_measurement'),\n static_level: z.number(),\n static_level_precision: z.number().optional(),\n measurement_method: z.string().optional(),\n steps: z.array(PumpingStepSchema).max(1).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const ConstantRateEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('constant_rate'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.tuple([PumpingStepSchema]).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const StepDrawdownEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('step_drawdown'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const AirliftEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('airlift'),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const RecoveryOnlyEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('recovery_only'),\n pumping_rate: z.number().optional(),\n pumping_duration: z.number().optional(),\n recovery: RecoveryPhaseSchema,\n});\n\nexport const HydrodynamicEventSchema = z\n .discriminatedUnion('type', [\n SpotMeasurementEventSchema,\n ConstantRateEventSchema,\n StepDrawdownEventSchema,\n AirliftEventSchema,\n RecoveryOnlyEventSchema,\n ])\n .or(HydrodynamicEventBaseSchema.passthrough());\n\n// ─── Aquifer analysis + history log schemas ───────────────────────────────────\n\nexport const AttachmentSchema = z.object({\n id: z.string(),\n uri: z.string().url(),\n media_type: z.string(),\n filename: z.string().optional(),\n description: z.string().optional(),\n sha256: z.string().optional(),\n});\n\nexport const HistoryLogEntrySchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n updated_at: rfc3339().optional(),\n category: z.string(),\n description: z.string(),\n author: z.string().optional(),\n severity: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const AquiferAnalysisSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n analyst: z.string().optional(),\n source_event_ids: z.array(z.string()),\n method: z.string().optional(),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n static_level_source_id: z.string().optional(),\n dynamic_level: z.number().optional(),\n dynamic_level_precision: z.number().optional(),\n flow_rate: z.number().optional(),\n flow_rate_precision: z.number().optional(),\n max_flow_rate: z.number().optional(),\n max_flow_rate_precision: z.number().optional(),\n max_flow_rate_basis: z.string().optional(),\n specific_capacity: z.number().optional(),\n transmissivity: z.number().optional(),\n storativity: z.number().nullable().optional(),\n hydraulic_conductivity: z.number().optional(),\n aquifer_thickness: z.number().optional(),\n jacob_b: z.number().optional(),\n jacob_c: z.number().optional(),\n well_efficiency_pct: z.number().optional(),\n notes: z.string().optional(),\n});\n\n// ─── Well schema ──────────────────────────────────────────────────────────────\n\nexport const WellSchema = z\n .object({\n version: z.number().int(),\n '@context': z\n .union([z.string(), z.array(z.unknown()), z.record(z.unknown())])\n .optional(),\n well_id: z.array(WellIdSchema).optional(),\n location: LocationSchema.optional(),\n profiles: z\n .array(\n z\n .string()\n .url()\n .refine(u => u.startsWith('https://'), {\n message: 'profiles must be HTTPS URLs',\n }),\n )\n .optional(),\n well_type: z.string().optional(),\n name: z.string().optional(),\n well_driller: z.string().optional(),\n construction_date: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'construction_date must be YYYY-MM-DD')\n .optional(),\n obs: z.string().optional(),\n lat: z.number().optional(),\n lng: z.number().optional(),\n elevation: z.number().optional(),\n well_depth: z.number().optional(),\n bore_hole: z.array(BoreHoleSchema),\n well_case: z.array(WellCaseSchema),\n reduction: z.array(ReductionSchema),\n well_screen: z.array(WellScreenSchema),\n surface_case: z.array(SurfaceCaseSchema),\n hole_fill: z.array(HoleFillSchema),\n cement_pad: CementPadSchema.optional(),\n lithology: z.array(LithologySchema),\n fractures: z.array(FractureSchema),\n caves: z.array(CaveSchema),\n hydrodynamic_events: z.array(HydrodynamicEventSchema).optional(),\n aquifer_analysis: z.array(AquiferAnalysisSchema).optional(),\n history_logs: z.array(HistoryLogEntrySchema).optional(),\n })\n .passthrough();\n\n// ─── parseWell ────────────────────────────────────────────────────────────────\n\nfunction normalizeV1Fields(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const out = { ...raw };\n\n // v1 is treated as v2-equivalent after normalization\n out.version = 2;\n\n // bole_hole → bore_hole (v1 typo compatibility)\n if ('bole_hole' in out && !('bore_hole' in out)) {\n out.bore_hole = out.bole_hole;\n delete out.bole_hole;\n }\n\n // lat/lng/elevation → location object\n if (!('location' in out)) {\n const lat = out.lat as number | undefined;\n const lng = out.lng as number | undefined;\n const elevation = out.elevation as number | undefined;\n if (lat !== undefined && lng !== undefined) {\n out.location = {\n lat,\n lng,\n ...(elevation !== undefined && { elevation }),\n };\n }\n }\n\n // diam_pol (inches) → diameter (mm) on constructive arrays\n for (const key of [\n 'bore_hole',\n 'well_case',\n 'well_screen',\n 'surface_case',\n 'hole_fill',\n ]) {\n const items = out[key];\n if (Array.isArray(items)) {\n const hasDiamPol = (items as Record<string, unknown>[]).some(\n item => 'diam_pol' in item,\n );\n if (hasDiamPol) {\n out[key] = (items as Record<string, unknown>[]).map(item => {\n const { diam_pol, ...rest } = item;\n return { ...rest, diameter: ((diam_pol as number) || 0) * 25.4 };\n });\n }\n }\n }\n\n // fgdc_texture → texture on each lithology entry\n if (Array.isArray(out.lithology)) {\n out.lithology = (out.lithology as Record<string, unknown>[]).map(item => {\n if ('fgdc_texture' in item && !('texture' in item)) {\n const { fgdc_texture, ...rest } = item;\n return { ...rest, texture: { code: fgdc_texture, vocabulary: 'fgdc' } };\n }\n return item;\n });\n }\n\n // screen_slot_mm → screen_slot on each well_screen entry\n if (Array.isArray(out.well_screen)) {\n out.well_screen = (out.well_screen as Record<string, unknown>[]).map(\n item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return { ...rest, screen_slot: screen_slot_mm };\n }\n return item;\n },\n );\n }\n\n return out;\n}\n\nexport function parseWell(json: string): Well {\n const raw = JSON.parse(json) as Record<string, unknown>;\n const version = raw.version;\n\n if (version !== undefined && typeof version === 'number') {\n if (version !== 1 && version !== 2) {\n throw new Error(`Unsupported .well format version: ${version}`);\n }\n if (version === 1) {\n const normalized = normalizeV1Fields(raw);\n return mergeWell(\n WellSchema.parse(normalized) as Well,\n normalized,\n ) as Well;\n }\n } else if (version !== undefined) {\n throw new Error(`Unsupported .well format version: ${String(version)}`);\n } else {\n // version absent — normalize to v2\n raw.version = 2;\n }\n\n // version === 2 (explicit or normalized from absent)\n return mergeWell(WellSchema.parse(raw) as Well, raw) as Well;\n}\n","import {\n Constructive,\n Geologic,\n Lithology,\n Location,\n SectionKey,\n SectionVisibility,\n Well,\n} from '../types/well.types';\nimport { mergeWell } from '../validators/well.validators';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype RawJSON = Record<string, unknown>;\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst WELL_FORMAT_VERSION = 2;\nconst INCHES_TO_MM = 25.4;\n\n/** Fixed display order for the 5 redactable sections of a well. */\nexport const SECTION_KEYS: readonly SectionKey[] = [\n 'general',\n 'constructive',\n 'geology',\n 'hydrodynamic',\n 'history',\n];\n\nconst EMPTY_WELL: Well = {\n version: 2,\n bore_hole: [],\n well_case: [],\n reduction: [],\n well_screen: [],\n surface_case: [],\n hole_fill: [],\n cement_pad: { type: '', width: 0, thickness: 0, length: 0 },\n lithology: [],\n fractures: [],\n caves: [],\n};\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction createEmptyWell(): Well {\n return JSON.parse(JSON.stringify(EMPTY_WELL)) as Well;\n}\n\n/**\n * Deepest recorded point across a well's constructive arrays only (not\n * geologic — lithology/fractures/caves may extend past the actual\n * constructed well and would overstate it). Same \"last item's `to`\" logic\n * as `@welldot/utils`'s `getProfileLastItemsDepths`, duplicated here because\n * `packages/core` may not depend on `@welldot/utils` (dependency chain runs\n * the other way).\n */\nfunction calculatedWellDepth(well: Well): number {\n const lastTo = (items: { to: number }[]): number =>\n items.length ? items[items.length - 1]!.to : 0;\n\n return Math.max(\n 0,\n lastTo(well.bore_hole),\n lastTo(well.hole_fill),\n lastTo(well.reduction),\n lastTo(well.surface_case),\n lastTo(well.well_case),\n lastTo(well.well_screen),\n );\n}\n\n/** Fills in `well_depth` from the constructive data when the source didn't provide one. */\nfunction withCalculatedWellDepth(well: Well): Well {\n if (well.well_depth != null) return well;\n const calculated = calculatedWellDepth(well);\n return calculated > 0 ? { ...well, well_depth: calculated } : well;\n}\n\nfunction normalizeLithology(items: RawJSON[]): Lithology[] {\n return items.map(item => {\n const base = { aquifer_unit: '', ...item };\n // v1 fgdc_texture → texture object\n if ('fgdc_texture' in base && !('texture' in base)) {\n const { fgdc_texture, ...rest } = base as Record<string, unknown>;\n return {\n ...rest,\n texture: { code: fgdc_texture, vocabulary: 'fgdc' },\n } as Lithology;\n }\n return base as Lithology;\n });\n}\n\nfunction normalizeWellScreens(items: RawJSON[]): Well['well_screen'] {\n return items.map(item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return {\n ...rest,\n screen_slot: screen_slot_mm,\n } as Well['well_screen'][number];\n }\n return item as Well['well_screen'][number];\n });\n}\n\nfunction decodeV1Well(raw: RawJSON): Well {\n // v1→v2 normalizations for deserialize path\n const lat = raw.lat as number | undefined;\n const lng = raw.lng as number | undefined;\n const elevation = raw.elevation as number | undefined;\n const hasCoords =\n lat !== undefined || lng !== undefined || elevation !== undefined;\n\n const location: Location | undefined =\n hasCoords && lat !== undefined && lng !== undefined\n ? { lat, lng, ...(elevation !== undefined && { elevation }) }\n : undefined;\n\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(lat !== undefined && { lat }),\n ...(lng !== undefined && { lng }),\n ...(elevation !== undefined && { elevation }),\n ...(location !== undefined && { location }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction decodeV2Well(raw: RawJSON): Well {\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.version !== undefined && { version: raw.version as number }),\n ...(raw['@context'] !== undefined && {\n '@context': raw['@context'] as Well['@context'],\n }),\n ...(raw.well_id !== undefined && {\n well_id: raw.well_id as Well['well_id'],\n }),\n ...(raw.location !== undefined && {\n location: raw.location as Well['location'],\n }),\n ...(raw.profiles !== undefined && {\n profiles: raw.profiles as Well['profiles'],\n }),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n ...(raw.well_depth !== undefined && {\n well_depth: raw.well_depth as number,\n }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n ...(raw.hydrodynamic_events !== undefined && {\n hydrodynamic_events:\n raw.hydrodynamic_events as Well['hydrodynamic_events'],\n }),\n ...(raw.aquifer_analysis !== undefined && {\n aquifer_analysis: raw.aquifer_analysis as Well['aquifer_analysis'],\n }),\n ...(raw.history_logs !== undefined && {\n history_logs: raw.history_logs as Well['history_logs'],\n }),\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction convertLegacyDiameters(\n items: (RawJSON & { diam_pol?: number })[],\n): RawJSON[] {\n if (!items?.length) return items ?? [];\n if (!items.some(item => item.diam_pol !== undefined)) return items;\n\n return items.map(({ diam_pol, ...rest }) => ({\n ...rest,\n diameter: (diam_pol || 0) * INCHES_TO_MM,\n }));\n}\n\n// \"bole_hole\" is a typo present in older saved profiles; kept for compatibility\nfunction normalizeConstructive(src: RawJSON): Partial<Constructive> {\n const boreHoleData = (src.bole_hole ?? src.bore_hole ?? []) as (RawJSON & {\n diam_pol?: number;\n })[];\n\n const rawScreens = convertLegacyDiameters(\n (src.well_screen ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as RawJSON[];\n\n return {\n bore_hole: convertLegacyDiameters(boreHoleData) as Well['bore_hole'],\n hole_fill: convertLegacyDiameters(\n (src.hole_fill ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['hole_fill'],\n surface_case: convertLegacyDiameters(\n (src.surface_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['surface_case'],\n well_case: convertLegacyDiameters(\n (src.well_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['well_case'],\n well_screen: normalizeWellScreens(rawScreens),\n reduction: (src.reduction ?? []) as Well['reduction'],\n ...(src.cement_pad\n ? { cement_pad: src.cement_pad as Well['cement_pad'] }\n : {}),\n };\n}\n\nfunction normalizeGeologic(raw: RawJSON): Geologic {\n const lithologySource = (raw.lithology ?? raw.geologic ?? []) as RawJSON[];\n\n return {\n lithology: normalizeLithology(lithologySource),\n fractures: (raw.fractures ?? []) as Well['fractures'],\n caves: (raw.caves ?? []) as Well['caves'],\n };\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Serializes a {@link Well} object into a versioned JSON string suitable for\n * storage or transmission.\n *\n * @param well - The well profile to serialize.\n * @returns A JSON string containing the versioned well payload.\n */\nexport function serializeWell(well: Well): string {\n const payload: Record<string, unknown> = {\n version: WELL_FORMAT_VERSION,\n ...(well['@context'] !== undefined && { '@context': well['@context'] }),\n ...(well.well_id !== undefined && { well_id: well.well_id }),\n ...(well.location !== undefined && { location: well.location }),\n ...(well.profiles !== undefined && { profiles: well.profiles }),\n ...(well.well_type !== undefined && { well_type: well.well_type }),\n ...(well.name !== undefined && { name: well.name }),\n ...(well.well_driller !== undefined && { well_driller: well.well_driller }),\n ...(well.construction_date !== undefined && {\n construction_date: well.construction_date,\n }),\n ...(well.obs !== undefined && { obs: well.obs }),\n ...(well.well_depth !== undefined && { well_depth: well.well_depth }),\n bore_hole: well.bore_hole,\n well_case: well.well_case,\n reduction: well.reduction,\n well_screen: well.well_screen,\n surface_case: well.surface_case,\n hole_fill: well.hole_fill,\n ...(well.cement_pad && { cement_pad: well.cement_pad }),\n lithology: well.lithology,\n fractures: well.fractures,\n caves: well.caves,\n ...(well.hydrodynamic_events !== undefined && {\n hydrodynamic_events: well.hydrodynamic_events,\n }),\n ...(well.aquifer_analysis !== undefined && {\n aquifer_analysis: well.aquifer_analysis,\n }),\n ...(well.history_logs !== undefined && { history_logs: well.history_logs }),\n };\n\n return JSON.stringify(payload);\n}\n\n/**\n * Returns `true` when the well has no meaningful data — all constructive and\n * geologic arrays are empty and no legacy nested structure is present.\n *\n * @param well - The well profile to check. Accepts `null` / `undefined`\n * (both treated as empty).\n * @returns `true` if the well is considered empty, `false` otherwise.\n */\nexport function isWellEmpty(well: Well | null | undefined): boolean {\n if (!well) return true;\n\n const raw = well as RawJSON;\n if (raw.constructive || raw.geologic) return false;\n\n return (\n well.lithology?.length === 0 &&\n well.fractures?.length === 0 &&\n well.caves?.length === 0 &&\n well.bore_hole?.length === 0 &&\n well.hole_fill?.length === 0 &&\n well.well_case?.length === 0 &&\n well.well_screen?.length === 0\n );\n}\n\n/**\n * Returns a copy of `well` with hidden sections cleared: array fields become\n * `[]` and optional fields become `undefined`, so the result stays a\n * schema-valid {@link Well}. Sections marked visible in `visibility` are\n * carried over unchanged. Never mutates `well`.\n *\n * @param well - The well profile to redact.\n * @param visibility - Which of the 5 sections ({@link SECTION_KEYS}) to keep.\n * @returns A new {@link Well} with hidden sections emptied.\n */\nexport function redactWell(well: Well, visibility: SectionVisibility): Well {\n const redacted: Well = { ...well };\n\n if (!visibility.general) {\n delete redacted.well_id;\n delete redacted.location;\n delete redacted.well_type;\n delete redacted.name;\n delete redacted.well_driller;\n delete redacted.construction_date;\n delete redacted.obs;\n delete redacted.lat;\n delete redacted.lng;\n delete redacted.elevation;\n }\n\n if (!visibility.constructive) {\n redacted.bore_hole = [];\n redacted.well_case = [];\n redacted.reduction = [];\n redacted.well_screen = [];\n redacted.surface_case = [];\n redacted.hole_fill = [];\n delete redacted.cement_pad;\n delete redacted.well_depth;\n }\n\n if (!visibility.geology) {\n redacted.lithology = [];\n redacted.fractures = [];\n redacted.caves = [];\n }\n\n if (!visibility.hydrodynamic) {\n redacted.hydrodynamic_events = [];\n redacted.aquifer_analysis = [];\n }\n\n if (!visibility.history) {\n redacted.history_logs = [];\n }\n\n return redacted;\n}\n\n/**\n * Parses a JSON string produced by {@link serializeWell} (or older legacy\n * formats) and returns a normalized {@link Well} object.\n *\n * Handles:\n * - Versioned format v1 and v2\n * - Legacy format with `constructive` / `geologic` sub-objects\n * - Legacy `diam_pol` inch diameters → `diameter` mm conversion\n * - Typo `bole_hole` → `bore_hole` compatibility\n * - v1→v2 normalizations: `fgdc_texture`, `screen_slot_mm`, `lat/lng/elevation → location`\n *\n * @param jsonString - Raw JSON string to parse.\n * @returns A normalized {@link Well}, or `null` if the parsed data is empty.\n * @throws {Error} If `jsonString` is not valid JSON.\n * @throws {Error} If the `version` field is present but not supported.\n */\nexport function deserializeWell(jsonString: string): Well | null {\n let raw: RawJSON;\n try {\n raw = JSON.parse(jsonString) as RawJSON;\n } catch {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw.version === 'number') {\n if (raw.version === 2) return withCalculatedWellDepth(decodeV2Well(raw));\n if (raw.version === 1) return withCalculatedWellDepth(decodeV1Well(raw));\n throw new Error(`Unsupported .well format version: ${raw.version}`);\n }\n\n if (isWellEmpty(raw as unknown as Well)) return null;\n\n const constructiveSource = (raw.constructive ?? raw) as RawJSON;\n\n const metadata: Partial<Well> = {\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.lat !== undefined && { lat: raw.lat as number }),\n ...(raw.lng !== undefined && { lng: raw.lng as number }),\n ...(raw.elevation !== undefined && { elevation: raw.elevation as number }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n };\n\n return withCalculatedWellDepth({\n ...createEmptyWell(),\n ...metadata,\n ...normalizeConstructive(constructiveSource),\n ...normalizeGeologic(raw),\n });\n}\n\n// ─── Backward-compat aliases ─────────────────────────────────────────────────\n\n/** @deprecated Use {@link serializeWell} */\nexport const profileToWell = serializeWell;\n/** @deprecated Use {@link isWellEmpty} */\nexport const checkIfProfileIsEmpty = isWellEmpty;\n/** @deprecated Use {@link deserializeWell} */\nexport const convertProfileFromJSON = deserializeWell;\n","import { TextureOption } from '../types/textures';\n\nexport const FGDC_TEXTURES_OPTIONS: TextureOption[] = [\n // --- Surficial Patterns (Series 100) ---\n { code: 101, label: 'Unconsolidated material', pending: true },\n { code: 102, label: 'Alluvium', pending: true },\n { code: 103, label: 'Terrace deposit', pending: true },\n { code: 104, label: 'Floodplain deposit', pending: true },\n { code: 105, label: 'Fan or pediment deposit', pending: true },\n { code: 106, label: 'Eolian sand', pending: true },\n { code: 107, label: 'Silt or loess', pending: true },\n { code: 108, label: 'Clay deposit', pending: true },\n { code: 109, label: 'Colluvium', pending: true },\n { code: 110, label: 'Gravel deposit', pending: true },\n { code: 111, label: 'Residual deposit', pending: true },\n { code: 112, label: 'Playa deposit', pending: true },\n { code: 113, label: 'Lacustrine deposit', pending: true },\n { code: 114, label: 'Marine deposit', pending: true },\n { code: 115, label: 'Beach or bar deposit', pending: true },\n { code: 116, label: 'Organic deposit or peat', pending: true },\n { code: 117, label: 'Swamp or marsh deposit', pending: true },\n { code: 118, label: 'Soil', pending: true },\n { code: 119, label: 'Fill or artificial deposit', pending: true },\n { code: 120, label: 'Surficial pattern 120' },\n { code: 121, label: 'Surficial pattern 121', pending: true },\n { code: 122, label: 'Surficial pattern 122', pending: true },\n { code: 123, label: 'Surficial pattern 123' },\n { code: 124, label: 'Surficial pattern 124', pending: true },\n { code: 125, label: 'Surficial pattern 125', pending: true },\n { code: 126, label: 'Surficial pattern 126', pending: true },\n { code: 127, label: 'Surficial pattern 127', pending: true },\n { code: 128, label: 'Surficial pattern 128', pending: true },\n { code: 129, label: 'Surficial pattern 129', pending: true },\n { code: 130, label: 'Surficial pattern 130', pending: true },\n { code: 131, label: 'Surficial pattern 131', pending: true },\n { code: 132, label: 'Surficial pattern 132' },\n { code: 133, label: 'Surficial pattern 133', pending: true },\n { code: 134, label: 'Surficial pattern 134', pending: true },\n { code: 135, label: 'Surficial pattern 135', pending: true },\n { code: 136, label: 'Surficial pattern 136', pending: true },\n { code: 137, label: 'Surficial pattern 137', pending: true },\n // --- Sedimentary Patterns (Series 200) ---\n { code: 201, label: 'Sedimentary pattern 201', pending: true },\n { code: 202, label: 'Sedimentary pattern 202', pending: true },\n { code: 203, label: 'Sedimentary pattern 203', pending: true },\n { code: 204, label: 'Sedimentary pattern 204', pending: true },\n { code: 205, label: 'Sedimentary pattern 205', pending: true },\n { code: 206, label: 'Sedimentary pattern 206', pending: true },\n { code: 207, label: 'Sedimentary pattern 207', pending: true },\n { code: 208, label: 'Sedimentary pattern 208', pending: true },\n { code: 209, label: 'Sedimentary pattern 209', pending: true },\n { code: 210, label: 'Sedimentary pattern 210', pending: true },\n { code: 211, label: 'Sedimentary pattern 211', pending: true },\n { code: 212, label: 'Sedimentary pattern 212', pending: true },\n { code: 213, label: 'Sedimentary pattern 213', pending: true },\n { code: 214, label: 'Sedimentary pattern 214', pending: true },\n { code: 215, label: 'Sedimentary pattern 215', pending: true },\n { code: 216, label: 'Sedimentary pattern 216', pending: true },\n { code: 217, label: 'Sedimentary pattern 217', pending: true },\n { code: 218, label: 'Sedimentary pattern 218', pending: true },\n { code: 219, label: 'Sedimentary pattern 219', pending: true },\n { code: 220, label: 'Sedimentary pattern 220', pending: true },\n { code: 221, label: 'Sedimentary pattern 221', pending: true },\n { code: 222, label: 'Sedimentary pattern 222', pending: true },\n { code: 223, label: 'Sedimentary pattern 223', pending: true },\n { code: 224, label: 'Sedimentary pattern 224', pending: true },\n { code: 225, label: 'Sedimentary pattern 225', pending: true },\n { code: 226, label: 'Sedimentary pattern 226', pending: true },\n { code: 227, label: 'Sedimentary pattern 227', pending: true },\n { code: 228, label: 'Sedimentary pattern 228', pending: true },\n { code: 229, label: 'Sedimentary pattern 229', pending: true },\n { code: 230, label: 'Sedimentary pattern 230', pending: true },\n { code: 231, label: 'Sedimentary pattern 231', pending: true },\n { code: 232, label: 'Sedimentary pattern 232', pending: true },\n { code: 233, label: 'Sedimentary pattern 233', pending: true },\n // --- Igneous Patterns (Series 300) ---\n { code: 301, label: 'Igneous pattern 301', pending: true },\n { code: 302, label: 'Igneous pattern 302', pending: true },\n { code: 303, label: 'Igneous pattern 303', pending: true },\n { code: 304, label: 'Igneous pattern 304', pending: true },\n { code: 305, label: 'Igneous pattern 305', pending: true },\n { code: 306, label: 'Igneous pattern 306', pending: true },\n { code: 307, label: 'Igneous pattern 307', pending: true },\n { code: 308, label: 'Igneous pattern 308', pending: true },\n { code: 309, label: 'Igneous pattern 309', pending: true },\n { code: 310, label: 'Igneous pattern 310', pending: true },\n { code: 311, label: 'Igneous pattern 311', pending: true },\n { code: 312, label: 'Igneous pattern 312', pending: true },\n { code: 313, label: 'Igneous pattern 313', pending: true },\n { code: 314, label: 'Igneous pattern 314', pending: true },\n { code: 315, label: 'Igneous pattern 315', pending: true },\n { code: 316, label: 'Igneous pattern 316', pending: true },\n { code: 317, label: 'Igneous pattern 317', pending: true },\n { code: 318, label: 'Igneous pattern 318', pending: true },\n { code: 319, label: 'Igneous pattern 319', pending: true },\n { code: 320, label: 'Igneous pattern 320', pending: true },\n { code: 321, label: 'Igneous pattern 321', pending: true },\n { code: 322, label: 'Igneous pattern 322', pending: true },\n { code: 323, label: 'Igneous pattern 323', pending: true },\n { code: 324, label: 'Igneous pattern 324', pending: true },\n { code: 325, label: 'Igneous pattern 325', pending: true },\n { code: 326, label: 'Igneous pattern 326', pending: true },\n { code: 327, label: 'Igneous pattern 327', pending: true },\n { code: 328, label: 'Igneous pattern 328', pending: true },\n { code: 329, label: 'Igneous pattern 329', pending: true },\n { code: 330, label: 'Igneous pattern 330', pending: true },\n { code: 331, label: 'Igneous pattern 331', pending: true },\n // --- Miscellaneous and Metamorphic Patterns (Series 400) ---\n { code: 401, label: 'Miscellaneous pattern 401', pending: true },\n { code: 402, label: 'Miscellaneous pattern 402', pending: true },\n { code: 403, label: 'Miscellaneous pattern 403', pending: true },\n { code: 404, label: 'Miscellaneous pattern 404', pending: true },\n { code: 405, label: 'Miscellaneous pattern 405', pending: true },\n { code: 406, label: 'Miscellaneous pattern 406', pending: true },\n { code: 407, label: 'Miscellaneous pattern 407', pending: true },\n { code: 408, label: 'Miscellaneous pattern 408', pending: true },\n { code: 409, label: 'Miscellaneous pattern 409', pending: true },\n { code: 410, label: 'Miscellaneous pattern 410', pending: true },\n { code: 411, label: 'Miscellaneous pattern 411', pending: true },\n { code: 412, label: 'Miscellaneous pattern 412', pending: true },\n { code: 413, label: 'Miscellaneous pattern 413', pending: true },\n { code: 414, label: 'Miscellaneous pattern 414', pending: true },\n { code: 415, label: 'Miscellaneous pattern 415', pending: true },\n { code: 416, label: 'Miscellaneous pattern 416', pending: true },\n { code: 417, label: 'Miscellaneous pattern 417', pending: true },\n { code: 418, label: 'Miscellaneous pattern 418', pending: true },\n { code: 419, label: 'Miscellaneous pattern 419', pending: true },\n { code: 420, label: 'Miscellaneous pattern 420', pending: true },\n { code: 421, label: 'Miscellaneous pattern 421', pending: true },\n { code: 422, label: 'Miscellaneous pattern 422', pending: true },\n { code: 423, label: 'Miscellaneous pattern 423', pending: true },\n { code: 424, label: 'Miscellaneous pattern 424', pending: true },\n { code: 425, label: 'Miscellaneous pattern 425', pending: true },\n { code: 426, label: 'Miscellaneous pattern 426', pending: true },\n { code: 427, label: 'Miscellaneous pattern 427', pending: true },\n { code: 428, label: 'Miscellaneous pattern 428', pending: true },\n { code: 429, label: 'Miscellaneous pattern 429', pending: true },\n { code: 430, label: 'Miscellaneous pattern 430', pending: true },\n { code: 431, label: 'Miscellaneous pattern 431', pending: true },\n { code: 432, label: 'Miscellaneous pattern 432', pending: true },\n { code: 433, label: 'Miscellaneous pattern 433', pending: true },\n { code: 434, label: 'Miscellaneous pattern 434', pending: true },\n { code: 435, label: 'Miscellaneous pattern 435', pending: true },\n { code: 436, label: 'Miscellaneous pattern 436', pending: true },\n // --- Glacial Patterns (Series 500) ---\n { code: 521, label: 'Glacial pattern 521', pending: true },\n { code: 522, label: 'Glacial pattern 522', pending: true },\n { code: 523, label: 'Glacial pattern 523', pending: true },\n { code: 524, label: 'Glacial pattern 524', pending: true },\n { code: 530, label: 'Glacial pattern 530', pending: true },\n { code: 531, label: 'Glacial pattern 531', pending: true },\n { code: 532, label: 'Glacial pattern 532', pending: true },\n { code: 533, label: 'Glacial pattern 533', pending: true },\n { code: 534, label: 'Glacial pattern 534', pending: true },\n { code: 535, label: 'Glacial pattern 535', pending: true },\n { code: 536, label: 'Glacial pattern 536', pending: true },\n { code: 537, label: 'Glacial pattern 537', pending: true },\n { code: 538, label: 'Glacial pattern 538', pending: true },\n { code: 580, label: 'Glacial pattern 580', pending: true },\n { code: 581, label: 'Glacial pattern 581', pending: true },\n { code: 582, label: 'Glacial pattern 582', pending: true },\n { code: 583, label: 'Glacial pattern 583', pending: true },\n { code: 584, label: 'Glacial pattern 584', pending: true },\n { code: 585, label: 'Glacial pattern 585', pending: true },\n { code: 586, label: 'Glacial pattern 586', pending: true },\n { code: 587, label: 'Glacial pattern 587', pending: true },\n { code: 588, label: 'Glacial pattern 588', pending: true },\n { code: 589, label: 'Glacial pattern 589', pending: true },\n { code: 591, label: 'Periglacial pattern 591', pending: true },\n { code: 592, label: 'Periglacial pattern 592', pending: true },\n { code: 593, label: 'Periglacial pattern 593', pending: true },\n { code: 594, label: 'Periglacial pattern 594', pending: true },\n { code: 595, label: 'Periglacial pattern 595', pending: true },\n // --- Sedimentary Lithology Patterns (Series 600) ---\n { code: 601, label: 'Gravel or conglomerate (1st option)' },\n { code: 602, label: 'Gravel or conglomerate (2nd option)' },\n { code: 603, label: 'Crossbedded gravel or conglomerate' },\n { code: 605, label: 'Breccia (1st option)' },\n { code: 606, label: 'Breccia (2nd option)' },\n { code: 607, label: 'Massive sand or sandstone' },\n { code: 608, label: 'Bedded sand or sandstone' },\n { code: 609, label: 'Crossbedded sand or sandstone (1st option)' },\n { code: 610, label: 'Crossbedded sand or sandstone (2nd option)' },\n { code: 611, label: 'Ripple-bedded sand or sandstone' },\n { code: 612, label: 'Argillaceous or shaly sandstone' },\n { code: 613, label: 'Calcareous sandstone' },\n { code: 614, label: 'Dolomitic sandstone' },\n { code: 616, label: 'Silt, siltstone, or shaly silt' },\n { code: 617, label: 'Calcareous siltstone' },\n { code: 618, label: 'Dolomitic siltstone' },\n { code: 619, label: 'Sandy or silty shale' },\n { code: 620, label: 'Clay or clay shale' },\n { code: 621, label: 'Cherty shale' },\n { code: 622, label: 'Dolomitic shale' },\n { code: 623, label: 'Calcareous shale or marl' },\n { code: 624, label: 'Carbonaceous shale' },\n { code: 625, label: 'Oil shale' },\n { code: 626, label: 'Chalk' },\n { code: 627, label: 'Limestone' },\n { code: 628, label: 'Clastic limestone' },\n { code: 629, label: 'Fossiliferous clastic limestone' },\n { code: 630, label: 'Nodular or irregularly bedded limestone' },\n {\n code: 631,\n label: 'Limestone, irregular (burrow?) fillings of saccharoidal dolomite',\n },\n { code: 632, label: 'Crossbedded limestone' },\n { code: 633, label: 'Cherty crossbedded limestone' },\n { code: 634, label: 'Cherty and sandy crossbedded clastic limestone' },\n { code: 635, label: 'Oolitic limestone' },\n { code: 636, label: 'Sandy limestone' },\n { code: 637, label: 'Silty limestone' },\n { code: 638, label: 'Argillaceous or shaly limestone' },\n { code: 639, label: 'Cherty limestone (1st option)' },\n { code: 640, label: 'Cherty limestone (2nd option)' },\n { code: 641, label: 'Dolomitic limestone, limy dolostone, or limy dolomite' },\n { code: 642, label: 'Dolostone or dolomite' },\n { code: 643, label: 'Crossbedded dolostone or dolomite' },\n { code: 644, label: 'Oolitic dolostone or dolomite' },\n { code: 645, label: 'Sandy dolostone or dolomite' },\n { code: 646, label: 'Silty dolostone or dolomite' },\n { code: 647, label: 'Argillaceous or shaly dolostone or dolomite' },\n { code: 648, label: 'Cherty dolostone or dolomite' },\n { code: 649, label: 'Bedded chert (1st option)' },\n { code: 650, label: 'Bedded chert (2nd option)' },\n { code: 651, label: 'Fossiliferous bedded chert' },\n { code: 652, label: 'Fossiliferous rock' },\n { code: 653, label: 'Diatomaceous rock' },\n { code: 654, label: 'Subgraywacke' },\n { code: 655, label: 'Crossbedded subgraywacke' },\n { code: 656, label: 'Ripple-bedded subgraywacke' },\n { code: 657, label: 'Peat' },\n { code: 658, label: 'Coal' },\n { code: 659, label: 'Bony coal or impure coal' },\n { code: 660, label: 'Underclay' },\n { code: 661, label: 'Flint clay' },\n { code: 662, label: 'Bentonite' },\n { code: 663, label: 'Glauconite' },\n { code: 664, label: 'Limonite' },\n { code: 665, label: 'Siderite' },\n { code: 666, label: 'Phosphatic-nodular rock' },\n { code: 667, label: 'Gypsum' },\n { code: 668, label: 'Salt' },\n { code: 669, label: 'Interbedded sandstone and siltstone' },\n { code: 670, label: 'Interbedded sandstone and shale' },\n { code: 671, label: 'Interbedded ripple-bedded sandstone and shale' },\n {\n code: 672,\n label: 'Interbedded shale and silty limestone (shale dominant)',\n },\n {\n code: 673,\n label: 'Interbedded shale and limestone, shale dominant (1st option)',\n },\n {\n code: 674,\n label: 'Interbedded shale and limestone, shale dominant (2nd option)',\n },\n {\n code: 675,\n label: 'Interbedded calcareous shale and limestone (shale dominant)',\n },\n { code: 676, label: 'Interbedded silty limestone and shale' },\n { code: 677, label: 'Interbedded limestone and shale (1st option)' },\n { code: 678, label: 'Interbedded limestone and shale (2nd option)' },\n { code: 679, label: 'Interbedded limestone and shale (limestone dominant)' },\n { code: 680, label: 'Interbedded limestone and calcareous shale' },\n { code: 681, label: 'Till or diamicton (1st option)' },\n { code: 682, label: 'Till or diamicton (2nd option)' },\n { code: 683, label: 'Till or diamicton (3rd option)' },\n { code: 684, label: 'Loess (1st option)' },\n { code: 685, label: 'Loess (2nd option)' },\n { code: 686, label: 'Loess (3rd option)' },\n // --- Metamorphic Lithology Patterns (Series 700) ---\n { code: 701, label: 'Metamorphism' },\n { code: 702, label: 'Quartzite' },\n { code: 703, label: 'Slate' },\n { code: 704, label: 'Schistose or gneissoid granite' },\n { code: 705, label: 'Schist' },\n { code: 706, label: 'Contorted schist' },\n { code: 707, label: 'Schist and gneiss' },\n { code: 708, label: 'Gneiss' },\n { code: 709, label: 'Contorted gneiss' },\n { code: 710, label: 'Soapstone, talc, or serpentinite' },\n // --- Igneous and Vein-Matter Lithology Patterns (Series 700 continued) ---\n { code: 711, label: 'Tuffaceous rock' },\n { code: 712, label: 'Crystal tuff' },\n { code: 713, label: 'Devitrified tuff' },\n { code: 714, label: 'Volcanic breccia and tuff' },\n { code: 715, label: 'Volcanic breccia or agglomerate' },\n { code: 716, label: 'Zeolitic rock' },\n { code: 717, label: 'Basaltic flows' },\n { code: 718, label: 'Granite (1st option)' },\n { code: 719, label: 'Granite (2nd option)' },\n { code: 720, label: 'Banded igneous rock' },\n { code: 721, label: 'Igneous rock (1st option)' },\n { code: 722, label: 'Igneous rock (2nd option)' },\n { code: 723, label: 'Igneous rock (3rd option)' },\n { code: 724, label: 'Igneous rock (4th option)' },\n { code: 725, label: 'Igneous rock (5th option)' },\n { code: 726, label: 'Igneous rock (6th option)' },\n { code: 727, label: 'Igneous rock (7th option)' },\n { code: 728, label: 'Igneous rock (8th option)' },\n { code: 729, label: 'Porphyritic rock (1st option)' },\n { code: 730, label: 'Porphyritic rock (2nd option)' },\n { code: 731, label: 'Vitrophyre' },\n { code: 732, label: 'Quartz' },\n { code: 733, label: 'Ore' },\n];\n","// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst FEET_PER_METER = 3.280_839_895;\nconst METERS_PER_FOOT = 0.304_8; // exact (international foot)\nconst MM_PER_INCH = 25.4; // exact\nconst M3H_TO_LS = 1 / 3.6;\nconst M3H_TO_USGPM = 4.402_867_361;\nconst M2S_TO_M2D = 86_400;\nconst PSI_PER_KPA = 0.145_037_738;\nconst SLOT_MM = 0.025_4; // 1 slot = 0.001 in = 0.0254 mm\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type DmsCoordinate = {\n degrees: number;\n minutes: number;\n seconds: number;\n /** 'N' | 'S' for latitude axes; 'E' | 'W' for longitude axes */\n direction: 'N' | 'S' | 'E' | 'W';\n};\n\n// ─── Length ───────────────────────────────────────────────────────────────────\n\nexport function metersToFeet(m: number): number {\n return m * FEET_PER_METER;\n}\n\nexport function feetToMeters(ft: number): number {\n return ft * METERS_PER_FOOT;\n}\n\n// ─── Diameter ─────────────────────────────────────────────────────────────────\n\nexport function mmToInches(mm: number): number {\n return mm / MM_PER_INCH;\n}\n\nexport function inchesToMm(inches: number): number {\n return inches * MM_PER_INCH;\n}\n\n// ─── Flow Rate ────────────────────────────────────────────────────────────────\n\nexport function cubicMeterPerHourToLitersPerSecond(q: number): number {\n return q * M3H_TO_LS;\n}\n\nexport function litersPerSecondToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_LS;\n}\n\nexport function cubicMeterPerHourToUsGallonsPerMinute(q: number): number {\n return q * M3H_TO_USGPM;\n}\n\nexport function usGallonsPerMinuteToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_USGPM;\n}\n\n// ─── Transmissivity ───────────────────────────────────────────────────────────\n\nexport function squareMeterPerSecondToSquareMeterPerDay(t: number): number {\n return t * M2S_TO_M2D;\n}\n\nexport function squareMeterPerDayToSquareMeterPerSecond(t: number): number {\n return t / M2S_TO_M2D;\n}\n\n// ─── Coordinates ──────────────────────────────────────────────────────────────\n\n/**\n * Converts decimal degrees to DMS.\n * @param degrees - Signed decimal degrees (negative = S for lat, W for lng).\n * @param axis - 'lat' produces N/S; 'lng' produces E/W. Defaults to 'lat'.\n */\nexport function decimalDegreesToDms(\n degrees: number,\n axis: 'lat' | 'lng' = 'lat',\n): DmsCoordinate {\n const abs = Math.abs(degrees);\n const d = Math.floor(abs);\n const minFloat = (abs - d) * 60;\n const m = Math.floor(minFloat);\n const s = (minFloat - m) * 60;\n const direction =\n axis === 'lat' ? (degrees >= 0 ? 'N' : 'S') : degrees >= 0 ? 'E' : 'W';\n return { degrees: d, minutes: m, seconds: s, direction };\n}\n\n/** Converts DMS back to signed decimal degrees. */\nexport function dmsToDecimalDegrees(dms: DmsCoordinate): number {\n const abs = dms.degrees + dms.minutes / 60 + dms.seconds / 3600;\n return dms.direction === 'S' || dms.direction === 'W' ? -abs : abs;\n}\n\n// ─── Screen Slot ──────────────────────────────────────────────────────────────\n\n/** Converts a US slot number to millimeters (1 slot = 0.001 in = 0.0254 mm). */\nexport function slotNumberToMm(slotNumber: number): number {\n return slotNumber * SLOT_MM;\n}\n\n/** Converts millimeters to the nearest US slot number. */\nexport function mmToSlotNumber(mm: number): number {\n return Math.round(mm / SLOT_MM);\n}\n\n// ─── Pressure ─────────────────────────────────────────────────────────────────\n\nexport function kilopascalToPsi(kPa: number): number {\n return kPa * PSI_PER_KPA;\n}\n\nexport function psiToKilopascal(psi: number): number {\n return psi / PSI_PER_KPA;\n}\n\n// ─── Time ─────────────────────────────────────────────────────────────────────\n\nexport function minutesToHours(min: number): number {\n return min / 60;\n}\n\nexport function hoursToMinutes(h: number): number {\n return h * 60;\n}\n"],"mappings":"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SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/validators/well.validators.ts","../src/utils/well.utils.ts","../src/utils/fgdc.textures.ts","../src/utils/units.ts"],"sourcesContent":["// Types\nexport type {\n AirliftEvent,\n AquiferAnalysis,\n Attachment,\n BoreHole,\n Cave,\n CementPad,\n ConstantRateEvent,\n Constructive,\n Fracture,\n Geologic,\n HistoryLogEntry,\n HoleFill,\n HydrodynamicEvent,\n HydrodynamicEventBase,\n LevelReading,\n Lithology,\n Location,\n LocationProperties,\n PumpingStep,\n RecoveryOnlyEvent,\n RecoveryPhase,\n Reduction,\n SectionKey,\n SectionVisibility,\n SpotMeasurementEvent,\n StepDrawdownEvent,\n SurfaceCase,\n Texture,\n Well,\n WellCase,\n WellId,\n WellScreen,\n} from './types/well.types';\n\nexport type {\n DiameterUnits,\n LengthUnits,\n Units,\n UnitsTypes,\n} from './types/units.types';\n\n// Validators\nexport {\n AirliftEventSchema,\n AquiferAnalysisSchema,\n AttachmentSchema,\n BoreHoleSchema,\n CaveSchema,\n CementPadSchema,\n ConstantRateEventSchema,\n FractureSchema,\n HistoryLogEntrySchema,\n HoleFillSchema,\n HydrodynamicEventBaseSchema,\n HydrodynamicEventSchema,\n LevelReadingSchema,\n LithologySchema,\n LocationPropertiesSchema,\n LocationSchema,\n PumpingStepSchema,\n RecoveryOnlyEventSchema,\n RecoveryPhaseSchema,\n ReductionSchema,\n SpotMeasurementEventSchema,\n StepDrawdownEventSchema,\n SurfaceCaseSchema,\n TextureSchema,\n WellCaseSchema,\n WellIdSchema,\n WellSchema,\n WellScreenSchema,\n parseWell,\n} from './validators/well.validators';\n\n// Format utilities (serialise/deserialise .well format only)\nexport {\n SECTION_KEYS,\n checkIfProfileIsEmpty,\n convertProfileFromJSON,\n deserializeWell,\n isWellEmpty,\n profileToWell,\n redactWell,\n serializeWell,\n} from './utils/well.utils';\n\nexport type { TextureCode, TextureOption } from './types/textures';\nexport { FGDC_TEXTURES_OPTIONS } from './utils/fgdc.textures';\n\n// Backward-compat alias for app migration\nexport type { Well as Profile } from './types/well.types';\n\n// Units conversion utilities\nexport {\n cubicMeterPerHourToLitersPerSecond,\n cubicMeterPerHourToUsGallonsPerMinute,\n decimalDegreesToDms,\n dmsToDecimalDegrees,\n feetToMeters,\n hoursToMinutes,\n inchesToMm,\n kilopascalToPsi,\n litersPerSecondToCubicMeterPerHour,\n metersToFeet,\n minutesToHours,\n mmToInches,\n mmToSlotNumber,\n psiToKilopascal,\n slotNumberToMm,\n squareMeterPerDayToSquareMeterPerSecond,\n squareMeterPerSecondToSquareMeterPerDay,\n usGallonsPerMinuteToCubicMeterPerHour,\n} from './utils/units';\nexport type { DmsCoordinate } from './utils/units';\n","import { createDefu } from 'defu';\nimport { z } from 'zod';\nimport type { Well } from '../types/well.types';\n\n// ─── defu custom merger ───────────────────────────────────────────────────────\n// In createDefu callbacks: obj = defaults object, key = key, value = source value.\n// When source has an array, assign it back to obj[key] so defu uses it as-is\n// (prevents defu's default array-concatenation behavior).\nexport const mergeWell = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] = value;\n return true;\n }\n});\n\n// ─── Datetime helper ──────────────────────────────────────────────────────────\nconst RFC3339_WITH_OFFSET =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\nconst rfc3339 = () =>\n z\n .string()\n .regex(RFC3339_WITH_OFFSET, 'datetime must be RFC 3339 with UTC offset');\n\n// ─── Location schemas ─────────────────────────────────────────────────────────\n\nexport const WellIdSchema = z.object({\n authority: z.string(),\n id: z.string(),\n primary: z.boolean().optional(),\n});\n\nexport const LocationPropertiesSchema = z.object({\n elevation_datum: z.string().optional(),\n crs: z.string().optional(),\n lat_precision: z.number().optional(),\n lng_precision: z.number().optional(),\n elevation_precision: z.number().optional(),\n original_crs: z.string().optional(),\n});\n\nexport const LocationSchema = z.object({\n lat: z.number(),\n lng: z.number(),\n elevation: z.number().optional(),\n properties: LocationPropertiesSchema.optional(),\n});\n\n// ─── Constructive schemas ─────────────────────────────────────────────────────\n\nexport const BoreHoleSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n drilling_method: z.string().optional(),\n});\n\nexport const WellCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n});\n\nexport const ReductionSchema = z.object({\n from: z.number(),\n to: z.number(),\n diam_from: z.number(),\n diam_to: z.number(),\n type: z.string(),\n});\n\nexport const WellScreenSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n screen_slot: z.number(),\n});\n\nexport const HoleFillSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.enum(['gravel_pack', 'seal']),\n diameter: z.number(),\n description: z.string(),\n});\n\nexport const SurfaceCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n});\n\nexport const CementPadSchema = z.object({\n type: z.string(),\n width: z.number(),\n thickness: z.number(),\n length: z.number(),\n});\n\n// ─── Geologic schemas ─────────────────────────────────────────────────────────\n\nexport const TextureSchema = z.object({\n code: z.union([z.string(), z.number()]),\n vocabulary: z.string().optional(),\n});\n\nexport const LithologySchema = z.object({\n from: z.number(),\n to: z.number(),\n description: z.string(),\n color: z.string(),\n texture: TextureSchema,\n geologic_unit: z.string(),\n aquifer_unit: z.string(),\n});\n\nexport const FractureSchema = z.object({\n depth: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n swarm: z.boolean(),\n azimuth: z.number(),\n dip: z.number(),\n depth_precision: z.number().optional(),\n});\n\nexport const CaveSchema = z.object({\n from: z.number(),\n to: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n});\n\n// ─── Hydrodynamic event schemas ───────────────────────────────────────────────\n\nexport const LevelReadingSchema = z.object({\n elapsed: z.number(),\n depth: z.number(),\n depth_precision: z.number().optional(),\n pressure: z.number().optional(),\n});\n\nexport const RecoveryPhaseSchema = z.object({\n readings: z.array(LevelReadingSchema),\n});\n\nexport const PumpingStepSchema = z.object({\n rate: z.number(),\n rate_precision: z.number().optional(),\n duration: z.number().optional(),\n readings: z.array(LevelReadingSchema).optional(),\n});\n\nexport const HydrodynamicEventBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n datetime: rfc3339(),\n sequence: z.number().int().optional(),\n operator: z.string().optional(),\n equipment: z.string().optional(),\n notes: z.string().optional(),\n});\n\nexport const SpotMeasurementEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('spot_measurement'),\n static_level: z.number(),\n static_level_precision: z.number().optional(),\n measurement_method: z.string().optional(),\n steps: z.array(PumpingStepSchema).max(1).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const ConstantRateEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('constant_rate'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.tuple([PumpingStepSchema]).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const StepDrawdownEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('step_drawdown'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const AirliftEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('airlift'),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const RecoveryOnlyEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('recovery_only'),\n pumping_rate: z.number().optional(),\n pumping_duration: z.number().optional(),\n recovery: RecoveryPhaseSchema,\n});\n\nexport const HydrodynamicEventSchema = z\n .discriminatedUnion('type', [\n SpotMeasurementEventSchema,\n ConstantRateEventSchema,\n StepDrawdownEventSchema,\n AirliftEventSchema,\n RecoveryOnlyEventSchema,\n ])\n .or(HydrodynamicEventBaseSchema.passthrough());\n\n// ─── Aquifer analysis + history log schemas ───────────────────────────────────\n\nexport const AttachmentSchema = z.object({\n id: z.string(),\n uri: z.string().url(),\n media_type: z.string(),\n filename: z.string().optional(),\n description: z.string().optional(),\n sha256: z.string().optional(),\n});\n\nexport const HistoryLogEntrySchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n updated_at: rfc3339().optional(),\n category: z.string(),\n description: z.string(),\n author: z.string().optional(),\n severity: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const AquiferAnalysisSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n analyst: z.string().optional(),\n source_event_ids: z.array(z.string()),\n method: z.string().optional(),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n static_level_source_id: z.string().optional(),\n dynamic_level: z.number().optional(),\n dynamic_level_precision: z.number().optional(),\n flow_rate: z.number().optional(),\n flow_rate_precision: z.number().optional(),\n max_flow_rate: z.number().optional(),\n max_flow_rate_precision: z.number().optional(),\n max_flow_rate_basis: z.string().optional(),\n specific_capacity: z.number().optional(),\n transmissivity: z.number().optional(),\n storativity: z.number().nullable().optional(),\n hydraulic_conductivity: z.number().optional(),\n aquifer_thickness: z.number().optional(),\n jacob_b: z.number().optional(),\n jacob_c: z.number().optional(),\n well_efficiency_pct: z.number().optional(),\n notes: z.string().optional(),\n});\n\n// ─── Well schema ──────────────────────────────────────────────────────────────\n\nexport const WellSchema = z\n .object({\n version: z.number().int(),\n '@context': z\n .union([z.string(), z.array(z.unknown()), z.record(z.unknown())])\n .optional(),\n well_id: z.array(WellIdSchema).optional(),\n location: LocationSchema.optional(),\n profiles: z\n .array(\n z\n .string()\n .url()\n .refine(u => u.startsWith('https://'), {\n message: 'profiles must be HTTPS URLs',\n }),\n )\n .optional(),\n well_type: z.string().optional(),\n name: z.string().optional(),\n well_driller: z.string().optional(),\n construction_date: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'construction_date must be YYYY-MM-DD')\n .optional(),\n obs: z.string().optional(),\n lat: z.number().optional(),\n lng: z.number().optional(),\n elevation: z.number().optional(),\n well_depth: z.number().optional(),\n bore_hole: z.array(BoreHoleSchema),\n well_case: z.array(WellCaseSchema),\n reduction: z.array(ReductionSchema),\n well_screen: z.array(WellScreenSchema),\n surface_case: z.array(SurfaceCaseSchema),\n hole_fill: z.array(HoleFillSchema),\n cement_pad: CementPadSchema.optional(),\n lithology: z.array(LithologySchema),\n fractures: z.array(FractureSchema),\n caves: z.array(CaveSchema),\n hydrodynamic_events: z.array(HydrodynamicEventSchema).optional(),\n aquifer_analysis: z.array(AquiferAnalysisSchema).optional(),\n history_logs: z.array(HistoryLogEntrySchema).optional(),\n })\n .passthrough();\n\n// ─── parseWell ────────────────────────────────────────────────────────────────\n\nfunction normalizeV1Fields(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const out = { ...raw };\n\n // v1 is treated as v2-equivalent after normalization\n out.version = 2;\n\n // bole_hole → bore_hole (v1 typo compatibility)\n if ('bole_hole' in out && !('bore_hole' in out)) {\n out.bore_hole = out.bole_hole;\n delete out.bole_hole;\n }\n\n // lat/lng/elevation → location object\n if (!('location' in out)) {\n const lat = out.lat as number | undefined;\n const lng = out.lng as number | undefined;\n const elevation = out.elevation as number | undefined;\n if (lat !== undefined && lng !== undefined) {\n out.location = {\n lat,\n lng,\n ...(elevation !== undefined && { elevation }),\n };\n }\n }\n\n // diam_pol (inches) → diameter (mm) on constructive arrays\n for (const key of [\n 'bore_hole',\n 'well_case',\n 'well_screen',\n 'surface_case',\n 'hole_fill',\n ]) {\n const items = out[key];\n if (Array.isArray(items)) {\n const hasDiamPol = (items as Record<string, unknown>[]).some(\n item => 'diam_pol' in item,\n );\n if (hasDiamPol) {\n out[key] = (items as Record<string, unknown>[]).map(item => {\n const { diam_pol, ...rest } = item;\n return { ...rest, diameter: ((diam_pol as number) || 0) * 25.4 };\n });\n }\n }\n }\n\n // fgdc_texture → texture on each lithology entry\n if (Array.isArray(out.lithology)) {\n out.lithology = (out.lithology as Record<string, unknown>[]).map(item => {\n if ('fgdc_texture' in item && !('texture' in item)) {\n const { fgdc_texture, ...rest } = item;\n return { ...rest, texture: { code: fgdc_texture, vocabulary: 'fgdc' } };\n }\n return item;\n });\n }\n\n // screen_slot_mm → screen_slot on each well_screen entry\n if (Array.isArray(out.well_screen)) {\n out.well_screen = (out.well_screen as Record<string, unknown>[]).map(\n item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return { ...rest, screen_slot: screen_slot_mm };\n }\n return item;\n },\n );\n }\n\n return out;\n}\n\nexport function parseWell(json: string): Well {\n const raw = JSON.parse(json) as Record<string, unknown>;\n const version = raw.version;\n\n if (version !== undefined && typeof version === 'number') {\n if (version !== 1 && version !== 2) {\n throw new Error(`Unsupported .well format version: ${version}`);\n }\n if (version === 1) {\n const normalized = normalizeV1Fields(raw);\n return mergeWell(\n WellSchema.parse(normalized) as Well,\n normalized,\n ) as Well;\n }\n } else if (version !== undefined) {\n throw new Error(`Unsupported .well format version: ${String(version)}`);\n } else {\n // version absent — normalize to v2\n raw.version = 2;\n }\n\n // version === 2 (explicit or normalized from absent)\n return mergeWell(WellSchema.parse(raw) as Well, raw) as Well;\n}\n","import {\n Constructive,\n Geologic,\n Lithology,\n Location,\n SectionKey,\n SectionVisibility,\n Well,\n} from '../types/well.types';\nimport { mergeWell } from '../validators/well.validators';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype RawJSON = Record<string, unknown>;\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst WELL_FORMAT_VERSION = 2;\nconst INCHES_TO_MM = 25.4;\n\n/** Fixed display order for the 5 redactable sections of a well. */\nexport const SECTION_KEYS: readonly SectionKey[] = [\n 'general',\n 'constructive',\n 'geology',\n 'hydrodynamic',\n 'history',\n];\n\nconst EMPTY_WELL: Well = {\n version: 2,\n bore_hole: [],\n well_case: [],\n reduction: [],\n well_screen: [],\n surface_case: [],\n hole_fill: [],\n cement_pad: { type: '', width: 0, thickness: 0, length: 0 },\n lithology: [],\n fractures: [],\n caves: [],\n};\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction createEmptyWell(): Well {\n return JSON.parse(JSON.stringify(EMPTY_WELL)) as Well;\n}\n\n/**\n * Deepest recorded point across a well's constructive arrays only (not\n * geologic — lithology/fractures/caves may extend past the actual\n * constructed well and would overstate it). Same \"last item's `to`\" logic\n * as `@welldot/utils`'s `getProfileLastItemsDepths`, duplicated here because\n * `packages/core` may not depend on `@welldot/utils` (dependency chain runs\n * the other way).\n */\nfunction calculatedWellDepth(well: Well): number {\n const lastTo = (items: { to: number }[]): number =>\n items.length ? items[items.length - 1]!.to : 0;\n\n return Math.max(\n 0,\n lastTo(well.bore_hole),\n lastTo(well.hole_fill),\n lastTo(well.reduction),\n lastTo(well.surface_case),\n lastTo(well.well_case),\n lastTo(well.well_screen),\n );\n}\n\n/** Fills in `well_depth` from the constructive data when the source didn't provide one. */\nfunction withCalculatedWellDepth(well: Well): Well {\n if (well.well_depth != null) return well;\n const calculated = calculatedWellDepth(well);\n return calculated > 0 ? { ...well, well_depth: calculated } : well;\n}\n\nfunction normalizeLithology(items: RawJSON[]): Lithology[] {\n return items.map(item => {\n const base = { aquifer_unit: '', ...item };\n // v1 fgdc_texture → texture object\n if ('fgdc_texture' in base && !('texture' in base)) {\n const { fgdc_texture, ...rest } = base as Record<string, unknown>;\n return {\n ...rest,\n texture: { code: fgdc_texture, vocabulary: 'fgdc' },\n } as Lithology;\n }\n return base as Lithology;\n });\n}\n\nfunction normalizeWellScreens(items: RawJSON[]): Well['well_screen'] {\n return items.map(item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return {\n ...rest,\n screen_slot: screen_slot_mm,\n } as Well['well_screen'][number];\n }\n return item as Well['well_screen'][number];\n });\n}\n\nfunction decodeV1Well(raw: RawJSON): Well {\n // v1→v2 normalizations for deserialize path\n const lat = raw.lat as number | undefined;\n const lng = raw.lng as number | undefined;\n const elevation = raw.elevation as number | undefined;\n const hasCoords =\n lat !== undefined || lng !== undefined || elevation !== undefined;\n\n const location: Location | undefined =\n hasCoords && lat !== undefined && lng !== undefined\n ? { lat, lng, ...(elevation !== undefined && { elevation }) }\n : undefined;\n\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(lat !== undefined && { lat }),\n ...(lng !== undefined && { lng }),\n ...(elevation !== undefined && { elevation }),\n ...(location !== undefined && { location }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction decodeV2Well(raw: RawJSON): Well {\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.version !== undefined && { version: raw.version as number }),\n ...(raw['@context'] !== undefined && {\n '@context': raw['@context'] as Well['@context'],\n }),\n ...(raw.well_id !== undefined && {\n well_id: raw.well_id as Well['well_id'],\n }),\n ...(raw.location !== undefined && {\n location: raw.location as Well['location'],\n }),\n ...(raw.profiles !== undefined && {\n profiles: raw.profiles as Well['profiles'],\n }),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n ...(raw.well_depth !== undefined && {\n well_depth: raw.well_depth as number,\n }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n ...(raw.hydrodynamic_events !== undefined && {\n hydrodynamic_events:\n raw.hydrodynamic_events as Well['hydrodynamic_events'],\n }),\n ...(raw.aquifer_analysis !== undefined && {\n aquifer_analysis: raw.aquifer_analysis as Well['aquifer_analysis'],\n }),\n ...(raw.history_logs !== undefined && {\n history_logs: raw.history_logs as Well['history_logs'],\n }),\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction convertLegacyDiameters(\n items: (RawJSON & { diam_pol?: number })[],\n): RawJSON[] {\n if (!items?.length) return items ?? [];\n if (!items.some(item => item.diam_pol !== undefined)) return items;\n\n return items.map(({ diam_pol, ...rest }) => ({\n ...rest,\n diameter: (diam_pol || 0) * INCHES_TO_MM,\n }));\n}\n\n// \"bole_hole\" is a typo present in older saved profiles; kept for compatibility\nfunction normalizeConstructive(src: RawJSON): Partial<Constructive> {\n const boreHoleData = (src.bole_hole ?? src.bore_hole ?? []) as (RawJSON & {\n diam_pol?: number;\n })[];\n\n const rawScreens = convertLegacyDiameters(\n (src.well_screen ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as RawJSON[];\n\n return {\n bore_hole: convertLegacyDiameters(boreHoleData) as Well['bore_hole'],\n hole_fill: convertLegacyDiameters(\n (src.hole_fill ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['hole_fill'],\n surface_case: convertLegacyDiameters(\n (src.surface_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['surface_case'],\n well_case: convertLegacyDiameters(\n (src.well_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['well_case'],\n well_screen: normalizeWellScreens(rawScreens),\n reduction: (src.reduction ?? []) as Well['reduction'],\n ...(src.cement_pad\n ? { cement_pad: src.cement_pad as Well['cement_pad'] }\n : {}),\n };\n}\n\nfunction normalizeGeologic(raw: RawJSON): Geologic {\n const lithologySource = (raw.lithology ?? raw.geologic ?? []) as RawJSON[];\n\n return {\n lithology: normalizeLithology(lithologySource),\n fractures: (raw.fractures ?? []) as Well['fractures'],\n caves: (raw.caves ?? []) as Well['caves'],\n };\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Serializes a {@link Well} object into a versioned JSON string suitable for\n * storage or transmission.\n *\n * @param well - The well profile to serialize.\n * @returns A JSON string containing the versioned well payload.\n */\nexport function serializeWell(well: Well): string {\n const payload: Record<string, unknown> = {\n version: WELL_FORMAT_VERSION,\n ...(well['@context'] !== undefined && { '@context': well['@context'] }),\n ...(well.well_id !== undefined && { well_id: well.well_id }),\n ...(well.location !== undefined && { location: well.location }),\n ...(well.profiles !== undefined && { profiles: well.profiles }),\n ...(well.well_type !== undefined && { well_type: well.well_type }),\n ...(well.name !== undefined && { name: well.name }),\n ...(well.well_driller !== undefined && { well_driller: well.well_driller }),\n ...(well.construction_date !== undefined && {\n construction_date: well.construction_date,\n }),\n ...(well.obs !== undefined && { obs: well.obs }),\n ...(well.well_depth !== undefined && { well_depth: well.well_depth }),\n bore_hole: well.bore_hole,\n well_case: well.well_case,\n reduction: well.reduction,\n well_screen: well.well_screen,\n surface_case: well.surface_case,\n hole_fill: well.hole_fill,\n ...(well.cement_pad && { cement_pad: well.cement_pad }),\n lithology: well.lithology,\n fractures: well.fractures,\n caves: well.caves,\n ...(well.hydrodynamic_events !== undefined && {\n hydrodynamic_events: well.hydrodynamic_events,\n }),\n ...(well.aquifer_analysis !== undefined && {\n aquifer_analysis: well.aquifer_analysis,\n }),\n ...(well.history_logs !== undefined && { history_logs: well.history_logs }),\n };\n\n return JSON.stringify(payload);\n}\n\n/**\n * Returns `true` when the well has no meaningful data — all constructive and\n * geologic arrays are empty and no legacy nested structure is present.\n *\n * @param well - The well profile to check. Accepts `null` / `undefined`\n * (both treated as empty).\n * @returns `true` if the well is considered empty, `false` otherwise.\n */\nexport function isWellEmpty(well: Well | null | undefined): boolean {\n if (!well) return true;\n\n const raw = well as RawJSON;\n if (raw.constructive || raw.geologic) return false;\n\n return (\n well.lithology?.length === 0 &&\n well.fractures?.length === 0 &&\n well.caves?.length === 0 &&\n well.bore_hole?.length === 0 &&\n well.hole_fill?.length === 0 &&\n well.well_case?.length === 0 &&\n well.well_screen?.length === 0\n );\n}\n\n/**\n * Returns a copy of `well` with hidden sections cleared: array fields become\n * `[]` and optional fields become `undefined`, so the result stays a\n * schema-valid {@link Well}. Sections marked visible in `visibility` are\n * carried over unchanged. Never mutates `well`.\n *\n * @param well - The well profile to redact.\n * @param visibility - Which of the 5 sections ({@link SECTION_KEYS}) to keep.\n * @returns A new {@link Well} with hidden sections emptied.\n */\nexport function redactWell(well: Well, visibility: SectionVisibility): Well {\n const redacted: Well = { ...well };\n\n if (!visibility.general) {\n delete redacted.well_id;\n delete redacted.location;\n delete redacted.well_type;\n delete redacted.name;\n delete redacted.well_driller;\n delete redacted.construction_date;\n delete redacted.obs;\n delete redacted.lat;\n delete redacted.lng;\n delete redacted.elevation;\n }\n\n if (!visibility.constructive) {\n redacted.bore_hole = [];\n redacted.well_case = [];\n redacted.reduction = [];\n redacted.well_screen = [];\n redacted.surface_case = [];\n redacted.hole_fill = [];\n delete redacted.cement_pad;\n delete redacted.well_depth;\n }\n\n if (!visibility.geology) {\n redacted.lithology = [];\n redacted.fractures = [];\n redacted.caves = [];\n }\n\n if (!visibility.hydrodynamic) {\n redacted.hydrodynamic_events = [];\n redacted.aquifer_analysis = [];\n }\n\n if (!visibility.history) {\n redacted.history_logs = [];\n }\n\n return redacted;\n}\n\n/**\n * Parses a JSON string produced by {@link serializeWell} (or older legacy\n * formats) and returns a normalized {@link Well} object.\n *\n * Handles:\n * - Versioned format v1 and v2\n * - Legacy format with `constructive` / `geologic` sub-objects\n * - Legacy `diam_pol` inch diameters → `diameter` mm conversion\n * - Typo `bole_hole` → `bore_hole` compatibility\n * - v1→v2 normalizations: `fgdc_texture`, `screen_slot_mm`, `lat/lng/elevation → location`\n *\n * @param jsonString - Raw JSON string to parse.\n * @returns A normalized {@link Well}, or `null` if the parsed data is empty.\n * @throws {Error} If `jsonString` is not valid JSON.\n * @throws {Error} If the `version` field is present but not supported.\n */\nexport function deserializeWell(jsonString: string): Well | null {\n let raw: RawJSON;\n try {\n raw = JSON.parse(jsonString) as RawJSON;\n } catch {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw.version === 'number') {\n if (raw.version === 2) return withCalculatedWellDepth(decodeV2Well(raw));\n if (raw.version === 1) return withCalculatedWellDepth(decodeV1Well(raw));\n throw new Error(`Unsupported .well format version: ${raw.version}`);\n }\n\n if (isWellEmpty(raw as unknown as Well)) return null;\n\n const constructiveSource = (raw.constructive ?? raw) as RawJSON;\n\n const metadata: Partial<Well> = {\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.lat !== undefined && { lat: raw.lat as number }),\n ...(raw.lng !== undefined && { lng: raw.lng as number }),\n ...(raw.elevation !== undefined && { elevation: raw.elevation as number }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n };\n\n return withCalculatedWellDepth({\n ...createEmptyWell(),\n ...metadata,\n ...normalizeConstructive(constructiveSource),\n ...normalizeGeologic(raw),\n });\n}\n\n// ─── Backward-compat aliases ─────────────────────────────────────────────────\n\n/** @deprecated Use {@link serializeWell} */\nexport const profileToWell = serializeWell;\n/** @deprecated Use {@link isWellEmpty} */\nexport const checkIfProfileIsEmpty = isWellEmpty;\n/** @deprecated Use {@link deserializeWell} */\nexport const convertProfileFromJSON = deserializeWell;\n","import { TextureOption } from '../types/textures';\n\nexport const FGDC_TEXTURES_OPTIONS: TextureOption[] = [\n // --- Surficial Patterns (Series 100) ---\n { code: 101, label: 'Unconsolidated material', pending: true },\n { code: 102, label: 'Alluvium', pending: true },\n { code: 103, label: 'Terrace deposit', pending: true },\n { code: 104, label: 'Floodplain deposit', pending: true },\n { code: 105, label: 'Fan or pediment deposit', pending: true },\n { code: 106, label: 'Eolian sand', pending: true },\n { code: 107, label: 'Silt or loess', pending: true },\n { code: 108, label: 'Clay deposit', pending: true },\n { code: 109, label: 'Colluvium', pending: true },\n { code: 110, label: 'Gravel deposit', pending: true },\n { code: 111, label: 'Residual deposit', pending: true },\n { code: 112, label: 'Playa deposit', pending: true },\n { code: 113, label: 'Lacustrine deposit', pending: true },\n { code: 114, label: 'Marine deposit', pending: true },\n { code: 115, label: 'Beach or bar deposit', pending: true },\n { code: 116, label: 'Organic deposit or peat', pending: true },\n { code: 117, label: 'Swamp or marsh deposit', pending: true },\n { code: 118, label: 'Soil', pending: true },\n { code: 119, label: 'Fill or artificial deposit', pending: true },\n { code: 120, label: 'Surficial pattern 120' },\n { code: 121, label: 'Surficial pattern 121', pending: true },\n { code: 122, label: 'Surficial pattern 122', pending: true },\n { code: 123, label: 'Surficial pattern 123' },\n { code: 124, label: 'Surficial pattern 124', pending: true },\n { code: 125, label: 'Surficial pattern 125', pending: true },\n { code: 126, label: 'Surficial pattern 126', pending: true },\n { code: 127, label: 'Surficial pattern 127', pending: true },\n { code: 128, label: 'Surficial pattern 128', pending: true },\n { code: 129, label: 'Surficial pattern 129', pending: true },\n { code: 130, label: 'Surficial pattern 130', pending: true },\n { code: 131, label: 'Surficial pattern 131', pending: true },\n { code: 132, label: 'Surficial pattern 132' },\n { code: 133, label: 'Surficial pattern 133', pending: true },\n { code: 134, label: 'Surficial pattern 134', pending: true },\n { code: 135, label: 'Surficial pattern 135', pending: true },\n { code: 136, label: 'Surficial pattern 136', pending: true },\n { code: 137, label: 'Surficial pattern 137', pending: true },\n // --- Sedimentary Patterns (Series 200) ---\n { code: 201, label: 'Sedimentary pattern 201', pending: true },\n { code: 202, label: 'Sedimentary pattern 202', pending: true },\n { code: 203, label: 'Sedimentary pattern 203', pending: true },\n { code: 204, label: 'Sedimentary pattern 204', pending: true },\n { code: 205, label: 'Sedimentary pattern 205', pending: true },\n { code: 206, label: 'Sedimentary pattern 206', pending: true },\n { code: 207, label: 'Sedimentary pattern 207', pending: true },\n { code: 208, label: 'Sedimentary pattern 208', pending: true },\n { code: 209, label: 'Sedimentary pattern 209', pending: true },\n { code: 210, label: 'Sedimentary pattern 210', pending: true },\n { code: 211, label: 'Sedimentary pattern 211', pending: true },\n { code: 212, label: 'Sedimentary pattern 212', pending: true },\n { code: 213, label: 'Sedimentary pattern 213', pending: true },\n { code: 214, label: 'Sedimentary pattern 214', pending: true },\n { code: 215, label: 'Sedimentary pattern 215', pending: true },\n { code: 216, label: 'Sedimentary pattern 216', pending: true },\n { code: 217, label: 'Sedimentary pattern 217', pending: true },\n { code: 218, label: 'Sedimentary pattern 218', pending: true },\n { code: 219, label: 'Sedimentary pattern 219', pending: true },\n { code: 220, label: 'Sedimentary pattern 220', pending: true },\n { code: 221, label: 'Sedimentary pattern 221', pending: true },\n { code: 222, label: 'Sedimentary pattern 222', pending: true },\n { code: 223, label: 'Sedimentary pattern 223', pending: true },\n { code: 224, label: 'Sedimentary pattern 224', pending: true },\n { code: 225, label: 'Sedimentary pattern 225', pending: true },\n { code: 226, label: 'Sedimentary pattern 226', pending: true },\n { code: 227, label: 'Sedimentary pattern 227', pending: true },\n { code: 228, label: 'Sedimentary pattern 228', pending: true },\n { code: 229, label: 'Sedimentary pattern 229', pending: true },\n { code: 230, label: 'Sedimentary pattern 230', pending: true },\n { code: 231, label: 'Sedimentary pattern 231', pending: true },\n { code: 232, label: 'Sedimentary pattern 232', pending: true },\n { code: 233, label: 'Sedimentary pattern 233', pending: true },\n // --- Igneous Patterns (Series 300) ---\n { code: 301, label: 'Igneous pattern 301', pending: true },\n { code: 302, label: 'Igneous pattern 302', pending: true },\n { code: 303, label: 'Igneous pattern 303', pending: true },\n { code: 304, label: 'Igneous pattern 304', pending: true },\n { code: 305, label: 'Igneous pattern 305', pending: true },\n { code: 306, label: 'Igneous pattern 306', pending: true },\n { code: 307, label: 'Igneous pattern 307', pending: true },\n { code: 308, label: 'Igneous pattern 308', pending: true },\n { code: 309, label: 'Igneous pattern 309', pending: true },\n { code: 310, label: 'Igneous pattern 310', pending: true },\n { code: 311, label: 'Igneous pattern 311', pending: true },\n { code: 312, label: 'Igneous pattern 312', pending: true },\n { code: 313, label: 'Igneous pattern 313', pending: true },\n { code: 314, label: 'Igneous pattern 314', pending: true },\n { code: 315, label: 'Igneous pattern 315', pending: true },\n { code: 316, label: 'Igneous pattern 316', pending: true },\n { code: 317, label: 'Igneous pattern 317', pending: true },\n { code: 318, label: 'Igneous pattern 318', pending: true },\n { code: 319, label: 'Igneous pattern 319', pending: true },\n { code: 320, label: 'Igneous pattern 320', pending: true },\n { code: 321, label: 'Igneous pattern 321', pending: true },\n { code: 322, label: 'Igneous pattern 322', pending: true },\n { code: 323, label: 'Igneous pattern 323', pending: true },\n { code: 324, label: 'Igneous pattern 324', pending: true },\n { code: 325, label: 'Igneous pattern 325', pending: true },\n { code: 326, label: 'Igneous pattern 326', pending: true },\n { code: 327, label: 'Igneous pattern 327', pending: true },\n { code: 328, label: 'Igneous pattern 328', pending: true },\n { code: 329, label: 'Igneous pattern 329', pending: true },\n { code: 330, label: 'Igneous pattern 330', pending: true },\n { code: 331, label: 'Igneous pattern 331', pending: true },\n // --- Miscellaneous and Metamorphic Patterns (Series 400) ---\n { code: 401, label: 'Miscellaneous pattern 401', pending: true },\n { code: 402, label: 'Miscellaneous pattern 402', pending: true },\n { code: 403, label: 'Miscellaneous pattern 403', pending: true },\n { code: 404, label: 'Miscellaneous pattern 404', pending: true },\n { code: 405, label: 'Miscellaneous pattern 405', pending: true },\n { code: 406, label: 'Miscellaneous pattern 406', pending: true },\n { code: 407, label: 'Miscellaneous pattern 407', pending: true },\n { code: 408, label: 'Miscellaneous pattern 408', pending: true },\n { code: 409, label: 'Miscellaneous pattern 409', pending: true },\n { code: 410, label: 'Miscellaneous pattern 410', pending: true },\n { code: 411, label: 'Miscellaneous pattern 411', pending: true },\n { code: 412, label: 'Miscellaneous pattern 412', pending: true },\n { code: 413, label: 'Miscellaneous pattern 413', pending: true },\n { code: 414, label: 'Miscellaneous pattern 414', pending: true },\n { code: 415, label: 'Miscellaneous pattern 415', pending: true },\n { code: 416, label: 'Miscellaneous pattern 416', pending: true },\n { code: 417, label: 'Miscellaneous pattern 417', pending: true },\n { code: 418, label: 'Miscellaneous pattern 418', pending: true },\n { code: 419, label: 'Miscellaneous pattern 419', pending: true },\n { code: 420, label: 'Miscellaneous pattern 420', pending: true },\n { code: 421, label: 'Miscellaneous pattern 421', pending: true },\n { code: 422, label: 'Miscellaneous pattern 422', pending: true },\n { code: 423, label: 'Miscellaneous pattern 423', pending: true },\n { code: 424, label: 'Miscellaneous pattern 424', pending: true },\n { code: 425, label: 'Miscellaneous pattern 425', pending: true },\n { code: 426, label: 'Miscellaneous pattern 426', pending: true },\n { code: 427, label: 'Miscellaneous pattern 427', pending: true },\n { code: 428, label: 'Miscellaneous pattern 428', pending: true },\n { code: 429, label: 'Miscellaneous pattern 429', pending: true },\n { code: 430, label: 'Miscellaneous pattern 430', pending: true },\n { code: 431, label: 'Miscellaneous pattern 431', pending: true },\n { code: 432, label: 'Miscellaneous pattern 432', pending: true },\n { code: 433, label: 'Miscellaneous pattern 433', pending: true },\n { code: 434, label: 'Miscellaneous pattern 434', pending: true },\n { code: 435, label: 'Miscellaneous pattern 435', pending: true },\n { code: 436, label: 'Miscellaneous pattern 436', pending: true },\n // --- Glacial Patterns (Series 500) ---\n { code: 521, label: 'Glacial pattern 521', pending: true },\n { code: 522, label: 'Glacial pattern 522', pending: true },\n { code: 523, label: 'Glacial pattern 523', pending: true },\n { code: 524, label: 'Glacial pattern 524', pending: true },\n { code: 530, label: 'Glacial pattern 530', pending: true },\n { code: 531, label: 'Glacial pattern 531', pending: true },\n { code: 532, label: 'Glacial pattern 532', pending: true },\n { code: 533, label: 'Glacial pattern 533', pending: true },\n { code: 534, label: 'Glacial pattern 534', pending: true },\n { code: 535, label: 'Glacial pattern 535', pending: true },\n { code: 536, label: 'Glacial pattern 536', pending: true },\n { code: 537, label: 'Glacial pattern 537', pending: true },\n { code: 538, label: 'Glacial pattern 538', pending: true },\n { code: 580, label: 'Glacial pattern 580', pending: true },\n { code: 581, label: 'Glacial pattern 581', pending: true },\n { code: 582, label: 'Glacial pattern 582', pending: true },\n { code: 583, label: 'Glacial pattern 583', pending: true },\n { code: 584, label: 'Glacial pattern 584', pending: true },\n { code: 585, label: 'Glacial pattern 585', pending: true },\n { code: 586, label: 'Glacial pattern 586', pending: true },\n { code: 587, label: 'Glacial pattern 587', pending: true },\n { code: 588, label: 'Glacial pattern 588', pending: true },\n { code: 589, label: 'Glacial pattern 589', pending: true },\n { code: 591, label: 'Periglacial pattern 591', pending: true },\n { code: 592, label: 'Periglacial pattern 592', pending: true },\n { code: 593, label: 'Periglacial pattern 593', pending: true },\n { code: 594, label: 'Periglacial pattern 594', pending: true },\n { code: 595, label: 'Periglacial pattern 595', pending: true },\n // --- Sedimentary Lithology Patterns (Series 600) ---\n { code: 601, label: 'Gravel or conglomerate (1st option)' },\n { code: 602, label: 'Gravel or conglomerate (2nd option)' },\n { code: 603, label: 'Crossbedded gravel or conglomerate' },\n { code: 605, label: 'Breccia (1st option)' },\n { code: 606, label: 'Breccia (2nd option)' },\n { code: 607, label: 'Massive sand or sandstone' },\n { code: 608, label: 'Bedded sand or sandstone' },\n { code: 609, label: 'Crossbedded sand or sandstone (1st option)' },\n { code: 610, label: 'Crossbedded sand or sandstone (2nd option)' },\n { code: 611, label: 'Ripple-bedded sand or sandstone' },\n { code: 612, label: 'Argillaceous or shaly sandstone' },\n { code: 613, label: 'Calcareous sandstone' },\n { code: 614, label: 'Dolomitic sandstone' },\n { code: 616, label: 'Silt, siltstone, or shaly silt' },\n { code: 617, label: 'Calcareous siltstone' },\n { code: 618, label: 'Dolomitic siltstone' },\n { code: 619, label: 'Sandy or silty shale' },\n { code: 620, label: 'Clay or clay shale' },\n { code: 621, label: 'Cherty shale' },\n { code: 622, label: 'Dolomitic shale' },\n { code: 623, label: 'Calcareous shale or marl' },\n { code: 624, label: 'Carbonaceous shale' },\n { code: 625, label: 'Oil shale' },\n { code: 626, label: 'Chalk' },\n { code: 627, label: 'Limestone' },\n { code: 628, label: 'Clastic limestone' },\n { code: 629, label: 'Fossiliferous clastic limestone' },\n { code: 630, label: 'Nodular or irregularly bedded limestone' },\n {\n code: 631,\n label: 'Limestone, irregular (burrow?) fillings of saccharoidal dolomite',\n },\n { code: 632, label: 'Crossbedded limestone' },\n { code: 633, label: 'Cherty crossbedded limestone' },\n { code: 634, label: 'Cherty and sandy crossbedded clastic limestone' },\n { code: 635, label: 'Oolitic limestone' },\n { code: 636, label: 'Sandy limestone' },\n { code: 637, label: 'Silty limestone' },\n { code: 638, label: 'Argillaceous or shaly limestone' },\n { code: 639, label: 'Cherty limestone (1st option)' },\n { code: 640, label: 'Cherty limestone (2nd option)' },\n { code: 641, label: 'Dolomitic limestone, limy dolostone, or limy dolomite' },\n { code: 642, label: 'Dolostone or dolomite' },\n { code: 643, label: 'Crossbedded dolostone or dolomite' },\n { code: 644, label: 'Oolitic dolostone or dolomite' },\n { code: 645, label: 'Sandy dolostone or dolomite' },\n { code: 646, label: 'Silty dolostone or dolomite' },\n { code: 647, label: 'Argillaceous or shaly dolostone or dolomite' },\n { code: 648, label: 'Cherty dolostone or dolomite' },\n { code: 649, label: 'Bedded chert (1st option)' },\n { code: 650, label: 'Bedded chert (2nd option)' },\n { code: 651, label: 'Fossiliferous bedded chert' },\n { code: 652, label: 'Fossiliferous rock' },\n { code: 653, label: 'Diatomaceous rock' },\n { code: 654, label: 'Subgraywacke' },\n { code: 655, label: 'Crossbedded subgraywacke' },\n { code: 656, label: 'Ripple-bedded subgraywacke' },\n { code: 657, label: 'Peat' },\n { code: 658, label: 'Coal' },\n { code: 659, label: 'Bony coal or impure coal' },\n { code: 660, label: 'Underclay' },\n { code: 661, label: 'Flint clay' },\n { code: 662, label: 'Bentonite' },\n { code: 663, label: 'Glauconite' },\n { code: 664, label: 'Limonite' },\n { code: 665, label: 'Siderite' },\n { code: 666, label: 'Phosphatic-nodular rock' },\n { code: 667, label: 'Gypsum' },\n { code: 668, label: 'Salt' },\n { code: 669, label: 'Interbedded sandstone and siltstone' },\n { code: 670, label: 'Interbedded sandstone and shale' },\n { code: 671, label: 'Interbedded ripple-bedded sandstone and shale' },\n {\n code: 672,\n label: 'Interbedded shale and silty limestone (shale dominant)',\n },\n {\n code: 673,\n label: 'Interbedded shale and limestone, shale dominant (1st option)',\n },\n {\n code: 674,\n label: 'Interbedded shale and limestone, shale dominant (2nd option)',\n },\n {\n code: 675,\n label: 'Interbedded calcareous shale and limestone (shale dominant)',\n },\n { code: 676, label: 'Interbedded silty limestone and shale' },\n { code: 677, label: 'Interbedded limestone and shale (1st option)' },\n { code: 678, label: 'Interbedded limestone and shale (2nd option)' },\n { code: 679, label: 'Interbedded limestone and shale (limestone dominant)' },\n { code: 680, label: 'Interbedded limestone and calcareous shale' },\n { code: 681, label: 'Till or diamicton (1st option)' },\n { code: 682, label: 'Till or diamicton (2nd option)' },\n { code: 683, label: 'Till or diamicton (3rd option)' },\n { code: 684, label: 'Loess (1st option)' },\n { code: 685, label: 'Loess (2nd option)' },\n { code: 686, label: 'Loess (3rd option)' },\n // --- Metamorphic Lithology Patterns (Series 700) ---\n { code: 701, label: 'Metamorphism' },\n { code: 702, label: 'Quartzite' },\n { code: 703, label: 'Slate' },\n { code: 704, label: 'Schistose or gneissoid granite' },\n { code: 705, label: 'Schist' },\n { code: 706, label: 'Contorted schist' },\n { code: 707, label: 'Schist and gneiss' },\n { code: 708, label: 'Gneiss' },\n { code: 709, label: 'Contorted gneiss' },\n { code: 710, label: 'Soapstone, talc, or serpentinite' },\n // --- Igneous and Vein-Matter Lithology Patterns (Series 700 continued) ---\n { code: 711, label: 'Tuffaceous rock' },\n { code: 712, label: 'Crystal tuff' },\n { code: 713, label: 'Devitrified tuff' },\n { code: 714, label: 'Volcanic breccia and tuff' },\n { code: 715, label: 'Volcanic breccia or agglomerate' },\n { code: 716, label: 'Zeolitic rock' },\n { code: 717, label: 'Basaltic flows' },\n { code: 718, label: 'Granite (1st option)' },\n { code: 719, label: 'Granite (2nd option)' },\n { code: 720, label: 'Banded igneous rock' },\n { code: 721, label: 'Igneous rock (1st option)' },\n { code: 722, label: 'Igneous rock (2nd option)' },\n { code: 723, label: 'Igneous rock (3rd option)' },\n { code: 724, label: 'Igneous rock (4th option)' },\n { code: 725, label: 'Igneous rock (5th option)' },\n { code: 726, label: 'Igneous rock (6th option)' },\n { code: 727, label: 'Igneous rock (7th option)' },\n { code: 728, label: 'Igneous rock (8th option)' },\n { code: 729, label: 'Porphyritic rock (1st option)' },\n { code: 730, label: 'Porphyritic rock (2nd option)' },\n { code: 731, label: 'Vitrophyre' },\n { code: 732, label: 'Quartz' },\n { code: 733, label: 'Ore' },\n];\n","// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst FEET_PER_METER = 3.280_839_895;\nconst METERS_PER_FOOT = 0.304_8; // exact (international foot)\nconst MM_PER_INCH = 25.4; // exact\nconst M3H_TO_LS = 1 / 3.6;\nconst M3H_TO_USGPM = 4.402_867_361;\nconst M2S_TO_M2D = 86_400;\nconst PSI_PER_KPA = 0.145_037_738;\nconst SLOT_MM = 0.025_4; // 1 slot = 0.001 in = 0.0254 mm\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type DmsCoordinate = {\n degrees: number;\n minutes: number;\n seconds: number;\n /** 'N' | 'S' for latitude axes; 'E' | 'W' for longitude axes */\n direction: 'N' | 'S' | 'E' | 'W';\n};\n\n// ─── Length ───────────────────────────────────────────────────────────────────\n\nexport function metersToFeet(m: number): number {\n return m * FEET_PER_METER;\n}\n\nexport function feetToMeters(ft: number): number {\n return ft * METERS_PER_FOOT;\n}\n\n// ─── Diameter ─────────────────────────────────────────────────────────────────\n\nexport function mmToInches(mm: number): number {\n return mm / MM_PER_INCH;\n}\n\nexport function inchesToMm(inches: number): number {\n return inches * MM_PER_INCH;\n}\n\n// ─── Flow Rate ────────────────────────────────────────────────────────────────\n\nexport function cubicMeterPerHourToLitersPerSecond(q: number): number {\n return q * M3H_TO_LS;\n}\n\nexport function litersPerSecondToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_LS;\n}\n\nexport function cubicMeterPerHourToUsGallonsPerMinute(q: number): number {\n return q * M3H_TO_USGPM;\n}\n\nexport function usGallonsPerMinuteToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_USGPM;\n}\n\n// ─── Transmissivity ───────────────────────────────────────────────────────────\n\nexport function squareMeterPerSecondToSquareMeterPerDay(t: number): number {\n return t * M2S_TO_M2D;\n}\n\nexport function squareMeterPerDayToSquareMeterPerSecond(t: number): number {\n return t / M2S_TO_M2D;\n}\n\n// ─── Coordinates ──────────────────────────────────────────────────────────────\n\n/**\n * Converts decimal degrees to DMS.\n * @param degrees - Signed decimal degrees (negative = S for lat, W for lng).\n * @param axis - 'lat' produces N/S; 'lng' produces E/W. Defaults to 'lat'.\n */\nexport function decimalDegreesToDms(\n degrees: number,\n axis: 'lat' | 'lng' = 'lat',\n): DmsCoordinate {\n const abs = Math.abs(degrees);\n const d = Math.floor(abs);\n const minFloat = (abs - d) * 60;\n const m = Math.floor(minFloat);\n const s = (minFloat - m) * 60;\n const direction =\n axis === 'lat' ? (degrees >= 0 ? 'N' : 'S') : degrees >= 0 ? 'E' : 'W';\n return { degrees: d, minutes: m, seconds: s, direction };\n}\n\n/** Converts DMS back to signed decimal degrees. */\nexport function dmsToDecimalDegrees(dms: DmsCoordinate): number {\n const abs = dms.degrees + dms.minutes / 60 + dms.seconds / 3600;\n return dms.direction === 'S' || dms.direction === 'W' ? -abs : abs;\n}\n\n// ─── Screen Slot ──────────────────────────────────────────────────────────────\n\n/** Converts a US slot number to millimeters (1 slot = 0.001 in = 0.0254 mm). */\nexport function slotNumberToMm(slotNumber: number): number {\n return slotNumber * SLOT_MM;\n}\n\n/** Converts millimeters to the nearest US slot number. */\nexport function mmToSlotNumber(mm: number): number {\n return Math.round(mm / SLOT_MM);\n}\n\n// ─── Pressure ─────────────────────────────────────────────────────────────────\n\nexport function kilopascalToPsi(kPa: number): number {\n return kPa * PSI_PER_KPA;\n}\n\nexport function psiToKilopascal(psi: number): number {\n return psi / PSI_PER_KPA;\n}\n\n// ─── Time ─────────────────────────────────────────────────────────────────────\n\nexport function minutesToHours(min: number): number {\n return min / 60;\n}\n\nexport function hoursToMinutes(h: number): number {\n return h * 60;\n}\n"],"mappings":"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SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,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","names":[]}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/rafaeelneto/welldot/main/packages/core/docs/schema/v2/well.schema.json",
|
|
4
|
+
"title": "well",
|
|
5
|
+
"description": "The .well open format — a JSON standard for water well data. Depths in meters, diameters in millimeters, measured from ground level.",
|
|
2
6
|
"type": "object",
|
|
3
7
|
"properties": {
|
|
4
8
|
"version": {
|
|
@@ -116,6 +120,9 @@
|
|
|
116
120
|
"elevation": {
|
|
117
121
|
"type": "number"
|
|
118
122
|
},
|
|
123
|
+
"well_depth": {
|
|
124
|
+
"type": "number"
|
|
125
|
+
},
|
|
119
126
|
"bore_hole": {
|
|
120
127
|
"type": "array",
|
|
121
128
|
"items": {
|
|
@@ -579,11 +586,9 @@
|
|
|
579
586
|
"type": "array",
|
|
580
587
|
"minItems": 1,
|
|
581
588
|
"maxItems": 1,
|
|
582
|
-
"items":
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
}
|
|
586
|
-
]
|
|
589
|
+
"items": {
|
|
590
|
+
"$ref": "#/properties/hydrodynamic_events/items/anyOf/0/anyOf/0/properties/steps/items"
|
|
591
|
+
}
|
|
587
592
|
},
|
|
588
593
|
"recovery": {
|
|
589
594
|
"$ref": "#/properties/hydrodynamic_events/items/anyOf/0/anyOf/0/properties/recovery"
|
|
@@ -946,4 +951,4 @@
|
|
|
946
951
|
"caves"
|
|
947
952
|
],
|
|
948
953
|
"additionalProperties": true
|
|
949
|
-
}
|
|
954
|
+
}
|
package/package.json
CHANGED