From ecc0b49ad742f09d8b7dd5b573b4a8c550c06fd1 Mon Sep 17 00:00:00 2001 From: Mary <69809698+marykruk@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:50:00 -0600 Subject: [PATCH 01/51] Create LithologyType.json --- schemas/data/src/addition/LithologyType.json | 59 +++++++++++++++++ schemas/data/src/subset/LithologyType.json | 68 ++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 schemas/data/src/addition/LithologyType.json create mode 100644 schemas/data/src/subset/LithologyType.json diff --git a/schemas/data/src/addition/LithologyType.json b/schemas/data/src/addition/LithologyType.json new file mode 100644 index 00000000..8498b5b6 --- /dev/null +++ b/schemas/data/src/addition/LithologyType.json @@ -0,0 +1,59 @@ +[ + "Unknown material", + "Bedrock", + "Metamorphic rock", + "Quartzite", + "Marble", + "Gneiss", + "Schist", + "Slate", + "Igneous rock", + "Volcanic rock", + "Plutonic rock", + "Basalt", + "Gabbro", + "Andesite", + "Diorite", + "Rhyolite", + "Granite", + "Sedimentary rock", + "Conglomerate", + "Sandstone", + "Siltite", + "Shale", + "Carbonate sedimentary rock", + "Evaporite", + "Dolomite", + "Limestone", + "Coal", + "Unconsolidated material", + "Diamicton", + "Till", + "Gravel", + "Sand", + "Mud", + "Silt", + "Clay", + "Organic material", + "Humus", + "Soil", + "Peat", + "Anthropogenic material", + "Undifferentiated sediment", + "Sandy Clay", + "Silty Clay", + "Clayey Sand", + "Silty Sand", + "Sand, Silt, Clay", + "Clayey Silt", + "Sandy Silt", + "Gravely Sediment", + "Sandy Gravel", + "Gravelly Sand", + "Muddy Sand", + "Sandy Mud", + "Muddy Gravel", + "Muddy Sandy Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand" +] \ No newline at end of file diff --git a/schemas/data/src/subset/LithologyType.json b/schemas/data/src/subset/LithologyType.json new file mode 100644 index 00000000..afb866dd --- /dev/null +++ b/schemas/data/src/subset/LithologyType.json @@ -0,0 +1,68 @@ +[ + "Bedrock, Fractured", + "Bedrock, Interbedded sandstone/carbonate", + "Bedrock, Interbedded sandstone/shale", + "Bedrock, Interbedded sandstone/shale/carbonate", + "Bedrock, Interbedded sediments", + "Bedrock, Interbedded siltstone/carbonate/gypsum", + "Bedrock, Soluble Carbonate - Karst", + "Bedrock, Soluble gypsum/dolomite with shale interb", + "Unknown material", + "Bedrock", + "Metamorphic rock", + "Quartzite", + "Marble", + "Gneiss", + "Schist", + "Slate", + "Igneous rock", + "Volcanic rock", + "Plutonic rock", + "Basalt", + "Gabbro", + "Andesite", + "Diorite", + "Rhyolite", + "Granite", + "Sedimentary rock", + "Conglomerate", + "Sandstone", + "Siltite", + "Shale", + "Carbonate sedimentary rock", + "Evaporite", + "Dolomite", + "Limestone", + "Coal", + "Unconsolidated material", + "Diamicton", + "Till", + "Gravel", + "Sand", + "Mud", + "Silt", + "Clay", + "Organic material", + "Humus", + "Soil", + "Peat", + "Anthropogenic material", + "Undifferentiated sediment", + "Sandy Clay", + "Silty Clay", + "Clayey Sand", + "Silty Sand", + "Sand, Silt, Clay", + "Clayey Silt", + "Sandy Silt", + "Gravely Sediment", + "Sandy Gravel", + "Gravelly Sand", + "Muddy Sand", + "Sandy Mud", + "Muddy Gravel", + "Muddy Sandy Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand" + +] \ No newline at end of file From ac9ddffcd38e6a6fbc770b248cf43c8a1e4f4554 Mon Sep 17 00:00:00 2001 From: Mary <69809698+marykruk@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:42:36 -0600 Subject: [PATCH 02/51] sort LithologyType.json --- schemas/data/src/addition/LithologyType.json | 92 +++++++++---------- schemas/data/src/subset/LithologyType.json | 95 ++++++++++---------- 2 files changed, 93 insertions(+), 94 deletions(-) diff --git a/schemas/data/src/addition/LithologyType.json b/schemas/data/src/addition/LithologyType.json index 8498b5b6..17486b94 100644 --- a/schemas/data/src/addition/LithologyType.json +++ b/schemas/data/src/addition/LithologyType.json @@ -1,59 +1,59 @@ [ - "Unknown material", - "Bedrock", - "Metamorphic rock", - "Quartzite", - "Marble", - "Gneiss", - "Schist", - "Slate", - "Igneous rock", - "Volcanic rock", - "Plutonic rock", + "Andesite", + "Anthropogenic material", "Basalt", - "Gabbro", - "Andesite", - "Diorite", - "Rhyolite", - "Granite", - "Sedimentary rock", - "Conglomerate", - "Sandstone", - "Siltite", - "Shale", + "Bedrock", "Carbonate sedimentary rock", - "Evaporite", - "Dolomite", - "Limestone", + "Clay", + "Clayey Sand", + "Clayey Silt", "Coal", - "Unconsolidated material", + "Conglomerate", "Diamicton", - "Till", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Gneiss", + "Granite", "Gravel", - "Sand", + "Gravelly Mud", + "Gravelly Muddy Sand" + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", "Mud", - "Silt", - "Clay", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", "Organic material", - "Humus", - "Soil", "Peat", - "Anthropogenic material", - "Undifferentiated sediment", - "Sandy Clay", - "Silty Clay", - "Clayey Sand", - "Silty Sand", + "Plutonic rock", + "Quartzite", + "Rhyolite", "Sand, Silt, Clay", - "Clayey Silt", - "Sandy Silt", - "Gravely Sediment", + "Sand", + "Sandstone", + "Sandy Clay", "Sandy Gravel", - "Gravelly Sand", - "Muddy Sand", "Sandy Mud", - "Muddy Gravel", - "Muddy Sandy Gravel", - "Gravelly Mud", - "Gravelly Muddy Sand" + "Sandy Silt", + "Schist", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock", ] \ No newline at end of file diff --git a/schemas/data/src/subset/LithologyType.json b/schemas/data/src/subset/LithologyType.json index afb866dd..23cb5aaa 100644 --- a/schemas/data/src/subset/LithologyType.json +++ b/schemas/data/src/subset/LithologyType.json @@ -1,4 +1,7 @@ -[ + [ + "Andesite", + "Anthropogenic material", + "Basalt", "Bedrock, Fractured", "Bedrock, Interbedded sandstone/carbonate", "Bedrock, Interbedded sandstone/shale", @@ -7,62 +10,58 @@ "Bedrock, Interbedded siltstone/carbonate/gypsum", "Bedrock, Soluble Carbonate - Karst", "Bedrock, Soluble gypsum/dolomite with shale interb", - "Unknown material", "Bedrock", - "Metamorphic rock", - "Quartzite", - "Marble", - "Gneiss", - "Schist", - "Slate", - "Igneous rock", - "Volcanic rock", - "Plutonic rock", - "Basalt", - "Gabbro", - "Andesite", - "Diorite", - "Rhyolite", - "Granite", - "Sedimentary rock", - "Conglomerate", - "Sandstone", - "Siltite", - "Shale", "Carbonate sedimentary rock", - "Evaporite", - "Dolomite", - "Limestone", + "Clay", + "Clayey Sand", + "Clayey Silt", "Coal", - "Unconsolidated material", + "Conglomerate", "Diamicton", - "Till", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Gneiss", + "Granite", "Gravel", - "Sand", + "Gravelly Mud", + "Gravelly Muddy Sand" + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", "Mud", - "Silt", - "Clay", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", "Organic material", - "Humus", - "Soil", "Peat", - "Anthropogenic material", - "Undifferentiated sediment", - "Sandy Clay", - "Silty Clay", - "Clayey Sand", - "Silty Sand", + "Plutonic rock", + "Quartzite", + "Rhyolite", "Sand, Silt, Clay", - "Clayey Silt", - "Sandy Silt", - "Gravely Sediment", + "Sand", + "Sandstone", + "Sandy Clay", "Sandy Gravel", - "Gravelly Sand", - "Muddy Sand", "Sandy Mud", - "Muddy Gravel", - "Muddy Sandy Gravel", - "Gravelly Mud", - "Gravelly Muddy Sand" - + "Sandy Silt", + "Schist", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock", ] \ No newline at end of file From 76983e79d349859fa2e5c16653c70a38454e60f9 Mon Sep 17 00:00:00 2001 From: Mary <69809698+marykruk@users.noreply.github.com> Date: Thu, 10 Jul 2025 12:11:52 -0600 Subject: [PATCH 03/51] Update MonitoringLocationVerticalUnit.primary.json --- .../src/values/MonitoringLocationVerticalUnit.primary.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json index 931f88a2..6f77dce7 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json @@ -4,7 +4,8 @@ "description": "", "type": "string", "enum": [ - "MASL" + "ft", + "m" ], "maxLength": 4 } \ No newline at end of file From a35fae32fc1d973515ec0ccd65d6d3fc8ea87aab Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 20 Jan 2026 10:18:08 -0500 Subject: [PATCH 04/51] chore: wqx update --- .gitignore | 3 +++ schemas/data/package-lock.json | 8 +++--- schemas/data/package.json | 7 ++++- .../src/values/CharacteristicName.legacy.json | 27 ++++++++++++------- .../src/values/MeasurementUnit.legacy.json | 1 + ...DetectionQuantitationLimitUnit.legacy.json | 1 + .../data/src/values/ResultUnit.legacy.json | 1 + 7 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 98934793..5d49c10a 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,6 @@ typings/ # OS .DS_Store + +# AI +CLAUDE.md \ No newline at end of file diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index a4f3aa08..fb81f56e 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -9,7 +9,7 @@ "version": "2.28.1", "license": "MIT", "dependencies": { - "wqx": "3.0.241" + "wqx": "3.0.252" }, "devDependencies": { "change-case": "^5.0.0" @@ -23,9 +23,9 @@ "license": "MIT" }, "node_modules/wqx": { - "version": "3.0.241", - "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.241.tgz", - "integrity": "sha512-blnY5b5t3ZPZan0iLHRxhyiNh4DtHd4binKT8xTMifhAh3Fcz5WZNnQ3LDS/ZndCmL5ZV6cViuHG9ZJkI7cHog==", + "version": "3.0.252", + "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.252.tgz", + "integrity": "sha512-MjZFIDPh6qWSha0SXUeXtDvLfudUD/jRp3zeCoiBIS7C4FUrSIoUIF75nSc/nga+Odi0pniLsXEDFnYG1fcUnQ==", "license": "MIT" } } diff --git a/schemas/data/package.json b/schemas/data/package.json index 6c155df8..b97ea7bc 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/datastreamapp/schema#readme", "dependencies": { - "wqx": "3.0.241" + "wqx": "3.0.252" }, "devDependencies": { "change-case": "^5.0.0" @@ -41,5 +41,10 @@ "type": "git", "url": "github:datastreamapp/schema", "directory": "schemas/data" + }, + "c8": { + "exclude": [ + "locales/**" + ] } } diff --git a/schemas/data/src/values/CharacteristicName.legacy.json b/schemas/data/src/values/CharacteristicName.legacy.json index 22a7557d..f142b990 100644 --- a/schemas/data/src/values/CharacteristicName.legacy.json +++ b/schemas/data/src/values/CharacteristicName.legacy.json @@ -1637,7 +1637,6 @@ "1-Octanesulfonamide, N-ethenyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-N-methyl-", "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-", "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-, reaction products with succinic anhydride monopolyisobutylene derivs.", - "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-N-(2-hydroxyethyl)-", "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-N-(2-hydroxyethyl)-, reaction products with N-ethyl-1,1,2,2,3,3,4,4,4-nonafluoro-N-(2-hydroxyethyl)-1-butanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,7-pentadecafluoro-N", "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-N-[2-(phosphonooxy)ethyl]-", "1-Octanesulfonamide, N-ethyl-1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-N-[2-(phosphonooxy)ethyl]-, ammonium salt (1:2)", @@ -4904,6 +4903,7 @@ "2-Methyl(nonafluorobutyl)sulfonylaminoethyl 2-propenoate telomer with 2-mercaptoethanol", "2-Methylanthracene", "2-Methylbenzothiazole", + "2-Methylbicyclo[3.2.1]octane", "2-Methylbiphenyl", "2-Methylbut-1-en-3-yne", "2-Methylbutanal", @@ -7436,8 +7436,10 @@ "3-Methyl-1-butanol", "3-Methyl-1-butene & Cyclopentene", "3-Methyl-1-indanone", + "3-Methyl-1-pentene", "3-Methyl-1,2-butadiene", "3-Methyl-2-(nonafluorobutyl)-1H-indole", + "3-Methyl-2-hexene", "3-Methyl-2-pentanone", "3-Methyl-2,3-dihydrofuran", "3-Methyl-3-(2,2,3,3,3-pentafluoropropoxy)oxetane", @@ -8366,7 +8368,6 @@ "4-Nitrophenyl heptafluorobutanoate", "4-Nitroquinoline 1-oxide", "4-Nonylphenol decaethoxylate", - "4-Nonylphenol decaethoxylates", "4-Nonylphenol dodecaethoxylate", "4-Nonylphenol dodecaethoxylates", "4-Nonylphenol heptadecaethoxylate", @@ -8648,11 +8649,11 @@ "4,6,7-Trichloro-1,1,2,3,3,4,5,5,6,7,7-undecafluorohept-1-ene", "4,7-Dimethylindan", "4,7-Dimethylundecane", + "4,7-Methano-1H-indene, octahydro-, (3aR,4R,7S,7aS)-rel-", "4,7-Methanoisobenzofuran-1,3-dione, 3a,4,7,7a-tetrahydro-5-methyl-, reaction products with hexahydro-1,3-isobenzofurandi", "4,7-Methanoisobenzofuran-1,3-dione, 3a,4,7,7a-tetrahydro-5-methyl-, reaction products with hexahydro-1,3-isobenzofurandione and 2,2,3,3-tetrafluoro-1-propanol", "4,7-Methanoisobenzofuran-1,3-dione, hexahydro-, 5-[(.gamma.-.omega.-perfluoro-C8-20-alkyl)thio] derivs.", "4,7-Methanoisobenzofuran-1,3-dione, hexahydro-5-[(3,3,4,4,5,5,6,6,7,7,8,8,8-tridecafluorooctyl)thio]-, (3a,4,5,7,7a)-", - "4,7-Methanoisobenzofuran, 4,5,6,7,8,8-hexachloro-1,3,3a,4,7,7a-hexahydro-", "4,8-Dimethylundecane", "4,8-dioxa-3H-perfluorononanoate", "4,8-Dioxa-3H-perfluorononanoic acid", @@ -8869,6 +8870,7 @@ "5-Methylhexan-3-one", "5-Methylindan", "5-Methyltetrazole", + "5-Nitro-1-pentene", "5-Nitro-o-anisidine", "5-Nitro-o-toluidine", "5-Nitroacenaphthene", @@ -10840,6 +10842,7 @@ "Benzo[e]pyrene", "Benzo[e]pyrene-d12", "Benzo[e]pyrene-d14", + "Benzo[g,h,i]perylene", "Benzo[ghi]fluoranthene", "Benzo[ghi]perylene", "Benzo[j]fluoranthene", @@ -11534,6 +11537,7 @@ "C16 Hydrocarbons", "C16-C21 Aliphatics", "C16-C21 Aromatics", + "C16-C21 Hydrocarbons", "C16-C34 Hydrocarbons", "C18 Hydrocarbons", "C19-C36 Aliphatics", @@ -11557,6 +11561,7 @@ "C2-Phenanthrenes/anthracenes", "C20 Hydrocarbons", "C20-TAS", + "C21-C32 Hydrocarbons", "C21-C34 Aliphatics", "C21-C34 Aromatics", "C21-TAS", @@ -11774,6 +11779,7 @@ "Carbonic acid--2,2,3,3,4,4,5,5-octafluoropentan-1-ol (1/2)", "Carbonic acid, 3-(2,5-dimethylphenyl)-8-methoxy-2-oxo-1-azaspiro[4.5]dec-3-en-4-yl ethyl ester mixt. with N2-[1,1-dimethyl-2-(methylsulfonyl)ethyl]-3-iodo-N1-[2-methyl-4-[1,2,2,2-tetrafluoro-1-(trifluoromethyl)ethyl]phenyl]-1,2-benzenedicarboxamide", "Carbonic acid, compd. with 2,2,3,4,4,4-hexafluoro-1-butanol (1:2)", + "Carbonic acid, prop-1-en-2-yl tridecyl ester", "Carbonic dichloride, reaction products with reduced ammonia-Me esters of reduced polymd. oxidized tetrafluoroethylene reaction product", "Carbonodithioic acid, O-ethyl ester", "Carbonyls", @@ -12398,7 +12404,6 @@ "Cyanide + Thiocyanate", "Cyanide, available", "Cyanide, free", - "Cyanides", "Cyanides amenable to chlorination (HCN & CN)", "Cyano Habs- Benthic Mat (Y/N) (choice list)", "Cyano Habs- Dead Wildlife (Y/N) (choice list)", @@ -12535,6 +12540,7 @@ "Cyclopentane", "Cyclopentane & 2,3-dimethylbutane", "Cyclopentane, (1,1,2,3,3,3-hexafluoropropyl)-", + "Cyclopentane, 1-ethyl-2-methyl-", "Cyclopentane, 1-ethyl-2-methyl-, cis-", "Cyclopentane, 1-ethyl-3-methyl-, (1R,3S)-rel-", "Cyclopentane, 1,1,2,2,3,3-hexafluoro-", @@ -13310,6 +13316,8 @@ "Diphenyl disulfide", "Diphenyl ether", "Diphenyl isophthalate", + "Diphenyl o-isopropylphenylphenyl phosphate", + "Diphenyl p-tert-butylphenyl phosphate", "Diphenyl phthalate", "Diphenyl(2,4,6-trimethylphenyl)sulfonium perfluoro-1-octanesulfonate", "Diphenyl[4-(tridecafluorohexyl)phenyl]phosphine", @@ -13474,6 +13482,7 @@ "Ecgonine Methyl Ester", "Ecgonine methyl ester hydrochloride", "Ecgonine Methyl Ester-D3", + "Echo intensity", "Ecological Integrity (choice list)", "Ecolyst", "EDDP perchlorate", @@ -14941,6 +14950,7 @@ "Hilsenhoff Biotic Index", "Hind Femur Length", "Hindwing Length", + "HoF597 DNA marker", "Holmium", "Holmium, tris(6,6,7,7,8,8,8-heptafluoro-2,2-dimethyl-3,5-octanedionato-.beta.O3,.beta.O5)-", "Homoanatoxin", @@ -14980,8 +14990,8 @@ "Human Influence: Power Lines (choice list)", "Human norovirus", "human-specific Bacteroides species", - "HUMM2 DNA Marker", - "HUMM2 DNA Marker (purified)", + "HUMM2 DNA marker", + "HUMM2 DNA marker (purified)", "Hyaluronic acid", "Hydramethylnon", "Hydraulic Oil", @@ -17936,6 +17946,7 @@ "Particle size, 50 mesh, (0.297 mm)", "Particle size, coarse sediment (>75 um)", "Particle size, fine sediment (<75 um)", + "Particle size, Hydrometer", "Particle size, Hydrometer (.008 mm)", "Particle size, Hydrometer (.011 mm)", "Particle size, Hydrometer (.015 mm)", @@ -19378,8 +19389,6 @@ "Phycoerythrin", "Phycoerythrin (PE)", "Phycoerythrin fluorescence (fPE)", - "Phyllodocida", - "Phyllodocidae", "Phylloicus", "Phylocentropus", "Physical Substrate Habitat Alterations (Y/N) (choice list)", @@ -21422,6 +21431,7 @@ "Spiro[cyclopentane-1,2'-[1,5,6]triazabicyclo[3.1.0]hexane], 4',4',6'-tris(trifluoromethyl)-", "Spirodiclofen", "Spiromesifen", + "Spiropentane", "Spirotetramat", "Spiroxamine", "Split Count", @@ -22456,7 +22466,6 @@ "Tribromomethane", "Tribromonitromethane", "Tribufos", - "Tributlytin", "Tributoxy(3,3,4,4,5,5,6,6,7,7,8,8,8-tridecafluorooctyl)silane", "Tributyl phosphate", "tributyl(2-methoxypropyl)phosphanium 4-[1,1,1,3,3,3-hexafluoro-2-(4-hydroxyphenyl)propan-2-yl]phenolate", diff --git a/schemas/data/src/values/MeasurementUnit.legacy.json b/schemas/data/src/values/MeasurementUnit.legacy.json index f863cd61..7576c6f1 100644 --- a/schemas/data/src/values/MeasurementUnit.legacy.json +++ b/schemas/data/src/values/MeasurementUnit.legacy.json @@ -379,6 +379,7 @@ "ng/m3", "ng/mL", "ng/SPMD", + "ng/uL", "nm", "nm-1", "nmi", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json index d1cfb07f..ba8498f2 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json @@ -379,6 +379,7 @@ "ng/m3", "ng/mL", "ng/SPMD", + "ng/uL", "nm", "nm-1", "nmi", diff --git a/schemas/data/src/values/ResultUnit.legacy.json b/schemas/data/src/values/ResultUnit.legacy.json index 4bc4e1e4..2a75e24e 100644 --- a/schemas/data/src/values/ResultUnit.legacy.json +++ b/schemas/data/src/values/ResultUnit.legacy.json @@ -379,6 +379,7 @@ "ng/m3", "ng/mL", "ng/SPMD", + "ng/uL", "nm", "nm-1", "nmi", From 4837eb38d885b49dd6feae04ce96b273de1e36b9 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 21 Jan 2026 11:04:22 -0500 Subject: [PATCH 05/51] feat: support for new groudwater fields Add groundwater-related fields to the schema - Add 17 new field definitions with Strict/Loose enum patterns - Add WQX mappings and custom field support in build-lib.js - Refactor build-values.js to process custom (non-WQX) fields - Update all schema flavors with new properties and dependencies - Add toFriendlyName() utility with unit tests --- schemas/data/bin/build-lib.js | 40 +++++ schemas/data/bin/build-values.js | 58 +++--- .../ActivityDepthAltitudeReferencePoint.json | 7 + schemas/data/src/addition/AquiferCode.json | 1 + .../src/addition/AquiferUnitPorosityType.json | 1 + schemas/data/src/addition/LithologyType.json | 114 ++++++------ .../data/src/addition/SampleCondition.json | 8 + schemas/data/src/addition/WellIDContext.json | 15 ++ schemas/data/src/backend.json | 102 +++++++++++ schemas/data/src/definitions.json | 168 ++++++++++++++++++ schemas/data/src/extract.json | 99 ++++++++++- schemas/data/src/frontend.json | 116 +++++++++++- schemas/data/src/primary.json | 99 ++++++++++- schemas/data/src/quality-control.json | 27 +++ ...tivityDepthAltitudeReferencePointUnit.json | 1 + .../data/src/subset/BoreholeDepthUnit.json | 1 + schemas/data/src/subset/LithologyType.json | 132 +++++++------- ...onitoringLocationVerticalAccuracyUnit.json | 1 + .../MonitoringLocationVerticalUnit.json | 6 +- schemas/data/src/subset/WellDepthUnit.json | 1 + .../subset/WellOpenIntervalBottomUnit.json | 1 + .../src/subset/WellOpenIntervalTopUnit.json | 1 + ...ityDepthAltitudeReferencePoint.legacy.json | 14 ++ ...tyDepthAltitudeReferencePoint.primary.json | 14 ++ ...epthAltitudeReferencePointUnit.legacy.json | 13 ++ ...pthAltitudeReferencePointUnit.primary.json | 13 ++ .../data/src/values/AquiferCode.legacy.json | 10 ++ .../data/src/values/AquiferCode.primary.json | 10 ++ .../data/src/values/AquiferType.legacy.json | 12 ++ .../data/src/values/AquiferType.primary.json | 12 ++ .../AquiferUnitPorosityType.legacy.json | 13 ++ .../AquiferUnitPorosityType.primary.json | 13 ++ .../src/values/BoreholeDepthUnit.legacy.json | 11 ++ .../src/values/BoreholeDepthUnit.primary.json | 11 ++ .../data/src/values/LithologyType.legacy.json | 84 +++++++++ .../src/values/LithologyType.primary.json | 74 ++++++++ ...ngLocationVerticalAccuracyUnit.legacy.json | 11 ++ ...gLocationVerticalAccuracyUnit.primary.json | 11 ++ ...cationVerticalCollectionMethod.legacy.json | 26 +++ ...ationVerticalCollectionMethod.primary.json | 26 +++ ...ticalCoordinateReferenceSystem.legacy.json | 15 ++ ...icalCoordinateReferenceSystem.primary.json | 15 ++ ...MonitoringLocationVerticalUnit.legacy.json | 2 + ...onitoringLocationVerticalUnit.primary.json | 3 +- .../SampleCollectionMethodContext.legacy.json | 44 +++++ ...SampleCollectionMethodContext.primary.json | 44 +++++ .../src/values/SampleCondition.legacy.json | 15 ++ .../src/values/SampleCondition.primary.json | 15 ++ .../data/src/values/WellDepthUnit.legacy.json | 11 ++ .../src/values/WellDepthUnit.primary.json | 11 ++ .../data/src/values/WellIDContext.legacy.json | 22 +++ .../src/values/WellIDContext.primary.json | 22 +++ .../WellOpenIntervalBottomUnit.legacy.json | 11 ++ .../WellOpenIntervalBottomUnit.primary.json | 11 ++ .../WellOpenIntervalTopUnit.legacy.json | 11 ++ .../WellOpenIntervalTopUnit.primary.json | 11 ++ .../data/src/values/WellUseType.legacy.json | 37 ++++ .../data/src/values/WellUseType.primary.json | 37 ++++ schemas/data/test/build.js | 31 ++++ 59 files changed, 1595 insertions(+), 150 deletions(-) create mode 100644 schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json create mode 100644 schemas/data/src/addition/AquiferCode.json create mode 100644 schemas/data/src/addition/AquiferUnitPorosityType.json create mode 100644 schemas/data/src/addition/SampleCondition.json create mode 100644 schemas/data/src/addition/WellIDContext.json create mode 100644 schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json create mode 100644 schemas/data/src/subset/BoreholeDepthUnit.json create mode 100644 schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json create mode 100644 schemas/data/src/subset/WellDepthUnit.json create mode 100644 schemas/data/src/subset/WellOpenIntervalBottomUnit.json create mode 100644 schemas/data/src/subset/WellOpenIntervalTopUnit.json create mode 100644 schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json create mode 100644 schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json create mode 100644 schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json create mode 100644 schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json create mode 100644 schemas/data/src/values/AquiferCode.legacy.json create mode 100644 schemas/data/src/values/AquiferCode.primary.json create mode 100644 schemas/data/src/values/AquiferType.legacy.json create mode 100644 schemas/data/src/values/AquiferType.primary.json create mode 100644 schemas/data/src/values/AquiferUnitPorosityType.legacy.json create mode 100644 schemas/data/src/values/AquiferUnitPorosityType.primary.json create mode 100644 schemas/data/src/values/BoreholeDepthUnit.legacy.json create mode 100644 schemas/data/src/values/BoreholeDepthUnit.primary.json create mode 100644 schemas/data/src/values/LithologyType.legacy.json create mode 100644 schemas/data/src/values/LithologyType.primary.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json create mode 100644 schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json create mode 100644 schemas/data/src/values/SampleCollectionMethodContext.legacy.json create mode 100644 schemas/data/src/values/SampleCollectionMethodContext.primary.json create mode 100644 schemas/data/src/values/SampleCondition.legacy.json create mode 100644 schemas/data/src/values/SampleCondition.primary.json create mode 100644 schemas/data/src/values/WellDepthUnit.legacy.json create mode 100644 schemas/data/src/values/WellDepthUnit.primary.json create mode 100644 schemas/data/src/values/WellIDContext.legacy.json create mode 100644 schemas/data/src/values/WellIDContext.primary.json create mode 100644 schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json create mode 100644 schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json create mode 100644 schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json create mode 100644 schemas/data/src/values/WellOpenIntervalTopUnit.primary.json create mode 100644 schemas/data/src/values/WellUseType.legacy.json create mode 100644 schemas/data/src/values/WellUseType.primary.json create mode 100644 schemas/data/test/build.js diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index d74cb260..e813e60b 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -4,10 +4,32 @@ import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); +// Convert PascalCase field names to human-friendly titles +// e.g., "WellIDContext" → "Well ID Context" +export const toFriendlyName = (fieldName) => + fieldName + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") + .replace(/([a-z])([A-Z])/g, "$1 $2"); + export const subsetOnly = [ "MonitoringLocationHorizontalAccuracyUnit", "MonitoringLocationVerticalUnit", + "MonitoringLocationVerticalAccuracyUnit", "ActivityDepthHeightUnit", + "BoreholeDepthUnit", + "WellDepthUnit", + "WellOpenIntervalTopUnit", + "WellOpenIntervalBottomUnit", + "ActivityDepthAltitudeReferencePointUnit", +]; + +// Custom fields (non-WQX) that need value files generated +export const custom = [ + "WellIDContext", + "AquiferCode", + "AquiferUnitPorosityType", + "ActivityDepthAltitudeReferencePoint", + "SampleCondition", ]; // DS to WQX values name mapping @@ -16,12 +38,24 @@ export const wqx = { "HorizontalReferenceDatum", MonitoringLocationHorizontalAccuracyUnit: "MeasurementUnit", MonitoringLocationVerticalUnit: "MeasurementUnit", + MonitoringLocationVerticalAccuracyUnit: "MeasurementUnit", + MonitoringLocationVerticalCollectionMethod: "VerticalCollectionMethod", + MonitoringLocationVerticalCoordinateReferenceSystem: "VerticalReferenceDatum", MonitoringLocationType: "MonitoringLocationType", + WellUseType: "WellType", + AquiferType: "AquiferType", + LithologyType: "WellFormationType", + BoreholeDepthUnit: "MeasurementUnit", + WellDepthUnit: "MeasurementUnit", + WellOpenIntervalTopUnit: "MeasurementUnit", + WellOpenIntervalBottomUnit: "MeasurementUnit", ActivityType: "ActivityType", ActivityGroupType: "ActivityGroupType", ActivityMediaName: "ActivityMediaSubdivision", ActivityDepthHeightUnit: "MeasurementUnit", + ActivityDepthAltitudeReferencePointUnit: "MeasurementUnit", SampleCollectionEquipmentName: "SampleCollectionEquipment", + SampleCollectionMethodContext: "SampleCollectionMethodContext", CharacteristicName: "Characteristic", MethodSpeciation: "MethodSpeciation", ResultSampleFraction: "SampleFraction", @@ -82,7 +116,13 @@ export const retire = (column, list) => { // **$ "MonitoringLocationHorizontalAccuracyUnit", "MonitoringLocationVerticalUnit", + "MonitoringLocationVerticalAccuracyUnit", "ActivityDepthHeightUnit", + "BoreholeDepthUnit", + "WellDepthUnit", + "WellOpenIntervalTopUnit", + "WellOpenIntervalBottomUnit", + "ActivityDepthAltitudeReferencePointUnit", "ResultSampleFraction", "ResultUnit", "ResultDetectionQuantitationLimitUnit", diff --git a/schemas/data/bin/build-values.js b/schemas/data/bin/build-values.js index 99998693..1ed18aeb 100644 --- a/schemas/data/bin/build-values.js +++ b/schemas/data/bin/build-values.js @@ -1,32 +1,23 @@ -import { readFile, writeFile } from "node:fs/promises"; +import { writeFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - import { - subsetOnly, - wqx, + additions, + custom, getList, - sort, retire, - //override, - additions, - subtractions, + sort, subset, + subsetOnly, + subtractions, + toFriendlyName, + wqx, } from "./build-lib.js"; -for (const col of Object.keys(wqx)) { - console.log(col); - let object = await import(`wqx/values/${wqx[col]}.json.js`); - object = { ...object.default }; - - // Add alias - // if (col === 'CharacteristicName') { - // const alias = JSON.parse(JSON.stringify(require(`wqx/values/CharacteristicAlias.json`))) - // object.enum = object.enum.concat(alias.enum) - // } +const __dirname = dirname(fileURLToPath(import.meta.url)); +// Extract processing logic into reusable function +async function processValues(col, object) { let [retired, list] = await retire(col, object.enum); object.enum = list; //object.enum = await override(col, object.enum); @@ -38,7 +29,8 @@ for (const col of Object.keys(wqx)) { } object.enum = [...new Set(sort(object.enum))]; - object.maxLength = Math.max(...object.enum.map((el) => el.length)); // catch any additions that may be longer + // catch any additions that may be longer + object.maxLength = Math.max(...object.enum.map((el) => el.length), 0); object.$id = `https://datastream.org/schema/data/values/${col}.loose.json`; await writeFile( @@ -47,7 +39,7 @@ for (const col of Object.keys(wqx)) { { encoding: "utf8" }, ); - object.enum = await subset(col, object.enum); // getList('subset', col, object.enum) + object.enum = await subset(col, object.enum); // remove subset values from retire list const subsetList = await getList("subset", col); @@ -63,3 +55,25 @@ for (const col of Object.keys(wqx)) { { encoding: "utf8" }, ); } + +// Process WQX fields +for (const col of Object.keys(wqx)) { + console.log(col); + let object = await import(`wqx/values/${wqx[col]}.json.js`); + object = { ...object.default }; + + // Add alias + // if (col === 'CharacteristicName') { + // const alias = JSON.parse(JSON.stringify(require(`wqx/values/CharacteristicAlias.json`))) + // object.enum = object.enum.concat(alias.enum) + // } + + await processValues(col, object); +} + +// Process custom fields (non-WQX) +for (const col of custom) { + console.log(col); + const object = { $id: "", title: toFriendlyName(col), description: "", type: "string", enum: [] }; + await processValues(col, object); +} diff --git a/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json new file mode 100644 index 00000000..f30ce2c1 --- /dev/null +++ b/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json @@ -0,0 +1,7 @@ +[ + "Ground surface", + "Top of instrument shelf", + "Top of outer casing", + "Top of well casing", + "Unspecified" +] \ No newline at end of file diff --git a/schemas/data/src/addition/AquiferCode.json b/schemas/data/src/addition/AquiferCode.json new file mode 100644 index 00000000..84e6760f --- /dev/null +++ b/schemas/data/src/addition/AquiferCode.json @@ -0,0 +1 @@ +["12_NS"] diff --git a/schemas/data/src/addition/AquiferUnitPorosityType.json b/schemas/data/src/addition/AquiferUnitPorosityType.json new file mode 100644 index 00000000..cb8f1a95 --- /dev/null +++ b/schemas/data/src/addition/AquiferUnitPorosityType.json @@ -0,0 +1 @@ +["Fractured", "Granular", "Karstic", "Mixed"] diff --git a/schemas/data/src/addition/LithologyType.json b/schemas/data/src/addition/LithologyType.json index 17486b94..50ea354e 100644 --- a/schemas/data/src/addition/LithologyType.json +++ b/schemas/data/src/addition/LithologyType.json @@ -1,59 +1,59 @@ [ - "Andesite", - "Anthropogenic material", - "Basalt", - "Bedrock", - "Carbonate sedimentary rock", - "Clay", - "Clayey Sand", - "Clayey Silt", - "Coal", - "Conglomerate", - "Diamicton", - "Diorite", - "Dolomite", - "Evaporite", - "Gabbro", - "Gneiss", - "Granite", - "Gravel", - "Gravelly Mud", - "Gravelly Muddy Sand" - "Gravelly Sand", - "Gravely Sediment", - "Humus", - "Igneous rock", - "Limestone", - "Marble", - "Metamorphic rock", - "Mud", - "Muddy Gravel", - "Muddy Sand", - "Muddy Sandy Gravel", - "Organic material", - "Peat", - "Plutonic rock", - "Quartzite", - "Rhyolite", - "Sand, Silt, Clay", - "Sand", - "Sandstone", - "Sandy Clay", - "Sandy Gravel", - "Sandy Mud", - "Sandy Silt", - "Schist", - "Sedimentary rock", - "Shale", - "Silt", - "Siltite", - "Silty Clay", - "Silty Sand", - "Slate", - "Soil", - "Till", - "Unconsolidated material", - "Undifferentiated sediment", - "Unknown material", - "Volcanic rock", + "Andesite", + "Anthropogenic material", + "Basalt", + "Bedrock", + "Carbonate sedimentary rock", + "Clay", + "Clayey Sand", + "Clayey Silt", + "Coal", + "Conglomerate", + "Diamicton", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Gneiss", + "Granite", + "Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand", + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", + "Mud", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", + "Organic material", + "Peat", + "Plutonic rock", + "Quartzite", + "Rhyolite", + "Sand", + "Sand, Silt, Clay", + "Sandstone", + "Sandy Clay", + "Sandy Gravel", + "Sandy Mud", + "Sandy Silt", + "Schist", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock" ] \ No newline at end of file diff --git a/schemas/data/src/addition/SampleCondition.json b/schemas/data/src/addition/SampleCondition.json new file mode 100644 index 00000000..47cc0e9f --- /dev/null +++ b/schemas/data/src/addition/SampleCondition.json @@ -0,0 +1,8 @@ +[ + "Flowing", + "Nearby site is being pumped or pumped recently", + "Static", + "The site has been pumped recently", + "The site is being pumped", + "Unspecified" +] \ No newline at end of file diff --git a/schemas/data/src/addition/WellIDContext.json b/schemas/data/src/addition/WellIDContext.json new file mode 100644 index 00000000..8d322423 --- /dev/null +++ b/schemas/data/src/addition/WellIDContext.json @@ -0,0 +1,15 @@ +[ + "AB", + "BC", + "MB", + "NB", + "NL", + "NS", + "NT", + "ON", + "PE", + "QC", + "SK", + "YK", + "OTHER" +] \ No newline at end of file diff --git a/schemas/data/src/backend.json b/schemas/data/src/backend.json index fd9e0961..76e784f4 100644 --- a/schemas/data/src/backend.json +++ b/schemas/data/src/backend.json @@ -49,10 +49,85 @@ "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalUnitLoose", "transform": ["trim", "toEnumCase"] }, + "MonitoringLocationVerticalAccuracyMeasure": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyMeasure" + }, + "MonitoringLocationVerticalAccuracyUnit": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyUnitLoose", + "transform": ["trim", "toEnumCase"] + }, + "MonitoringLocationVerticalCollectionMethod": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCollectionMethodLoose", + "transform": ["trim", "toEnumCase"] + }, + "MonitoringLocationVerticalCoordinateReferenceSystem": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCoordinateReferenceSystemLoose", + "transform": ["trim", "toEnumCase"] + }, "MonitoringLocationType": { "$ref": "./definitions.json#/definitions/MonitoringLocationTypeLoose", "transform": ["trim", "toEnumCase"] }, + "WellID": { + "$ref": "./definitions.json#/definitions/WellID", + "transform": ["trim"] + }, + "WellIDContext": { + "$ref": "./definitions.json#/definitions/WellIDContextLoose", + "transform": ["trim", "toEnumCase"] + }, + "WellUseType": { + "$ref": "./definitions.json#/definitions/WellUseTypeLoose", + "transform": ["trim", "toEnumCase"] + }, + "AquiferCode": { + "$ref": "./definitions.json#/definitions/AquiferCodeLoose", + "transform": ["trim", "toEnumCase"] + }, + "AquiferUnitName": { + "$ref": "./definitions.json#/definitions/AquiferUnitName", + "transform": ["trim"] + }, + "AquiferType": { + "$ref": "./definitions.json#/definitions/AquiferTypeLoose", + "transform": ["trim", "toEnumCase"] + }, + "AquiferUnitPorosityType": { + "$ref": "./definitions.json#/definitions/AquiferUnitPorosityTypeLoose", + "transform": ["trim", "toEnumCase"] + }, + "LithologyType": { + "$ref": "./definitions.json#/definitions/LithologyTypeLoose", + "transform": ["trim", "toEnumCase"] + }, + "BoreholeDepthMeasure": { + "$ref": "./definitions.json#/definitions/BoreholeDepthMeasure" + }, + "BoreholeDepthUnit": { + "$ref": "./definitions.json#/definitions/BoreholeDepthUnitLoose", + "transform": ["trim", "toEnumCase"] + }, + "WellDepthMeasure": { + "$ref": "./definitions.json#/definitions/WellDepthMeasure" + }, + "WellDepthUnit": { + "$ref": "./definitions.json#/definitions/WellDepthUnitLoose", + "transform": ["trim", "toEnumCase"] + }, + "WellOpenIntervalTopMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopMeasure" + }, + "WellOpenIntervalTopUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopUnitLoose", + "transform": ["trim", "toEnumCase"] + }, + "WellOpenIntervalBottomMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomMeasure" + }, + "WellOpenIntervalBottomUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitLoose", + "transform": ["trim", "toEnumCase"] + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeLoose", "transform": ["trim", "toEnumCase"] @@ -86,10 +161,37 @@ "$ref": "./definitions.json#/definitions/ActivityDepthHeightUnitLoose", "transform": ["trim", "toEnumCase"] }, + "ActivityDepthAltitudeReferencePoint": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointLoose", + "transform": ["trim", "toEnumCase"] + }, + "ActivityDepthAltitudeReferencePointMeasure": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointMeasure" + }, + "ActivityDepthAltitudeReferencePointUnit": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointUnitLoose", + "transform": ["trim", "toEnumCase"] + }, + "SampleCondition": { + "$ref": "./definitions.json#/definitions/SampleConditionLoose", + "transform": ["trim", "toEnumCase"] + }, "SampleCollectionEquipmentName": { "$ref": "./definitions.json#/definitions/SampleCollectionEquipmentNameLoose", "transform": ["trim", "toEnumCase"] }, + "SampleCollectionMethodName": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodName", + "transform": ["trim"] + }, + "SampleCollectionMethodID": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodID", + "transform": ["trim"] + }, + "SampleCollectionMethodContext": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodContextLoose", + "transform": ["trim", "toEnumCase"] + }, "CharacteristicName": { "$ref": "./definitions.json#/definitions/CharacteristicNameLoose", "transform": ["trim", "toEnumCase"] diff --git a/schemas/data/src/definitions.json b/schemas/data/src/definitions.json index 5c53bd28..b7ba6e76 100644 --- a/schemas/data/src/definitions.json +++ b/schemas/data/src/definitions.json @@ -50,12 +50,137 @@ "MonitoringLocationVerticalUnitLoose": { "$ref": "./values/MonitoringLocationVerticalUnit.legacy.json" }, + "MonitoringLocationVerticalAccuracyMeasure": { + "title": "Monitoring Location Vertical Accuracy Measure", + "description": "The relative accuracy of the vertical measure of elevation of ground surface.", + "type": "number", + "minimum": 0, + "maximum": 9007199254740991 + }, + "MonitoringLocationVerticalAccuracyUnitStrict": { + "$ref": "./values/MonitoringLocationVerticalAccuracyUnit.primary.json" + }, + "MonitoringLocationVerticalAccuracyUnitLoose": { + "$ref": "./values/MonitoringLocationVerticalAccuracyUnit.legacy.json" + }, + "MonitoringLocationVerticalCollectionMethodStrict": { + "$ref": "./values/MonitoringLocationVerticalCollectionMethod.primary.json" + }, + "MonitoringLocationVerticalCollectionMethodLoose": { + "$ref": "./values/MonitoringLocationVerticalCollectionMethod.legacy.json" + }, + "MonitoringLocationVerticalCoordinateReferenceSystemStrict": { + "$ref": "./values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json" + }, + "MonitoringLocationVerticalCoordinateReferenceSystemLoose": { + "$ref": "./values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json" + }, "MonitoringLocationTypeStrict": { "$ref": "./values/MonitoringLocationType.primary.json" }, "MonitoringLocationTypeLoose": { "$ref": "./values/MonitoringLocationType.legacy.json" }, + "WellID": { + "title": "Well ID", + "description": "The well identifier assigned by the provincial/territorial well database and/or used in the federal Groundwater Information Network (GIN) database.", + "$ref": "#/definitions/string", + "maxLength": 55 + }, + "WellIDContextStrict": { + "$ref": "./values/WellIDContext.primary.json" + }, + "WellIDContextLoose": { + "$ref": "./values/WellIDContext.legacy.json" + }, + "WellUseTypeStrict": { + "$ref": "./values/WellUseType.primary.json" + }, + "WellUseTypeLoose": { + "$ref": "./values/WellUseType.legacy.json" + }, + "AquiferCodeStrict": { + "$ref": "./values/AquiferCode.primary.json" + }, + "AquiferCodeLoose": { + "$ref": "./values/AquiferCode.legacy.json" + }, + "AquiferUnitName": { + "title": "Aquifer Unit Name", + "description": "A name that designates the aquifer or geological unit from which the groundwater sample was collected or the well was screened within.", + "$ref": "#/definitions/string", + "maxLength": 120 + }, + "AquiferTypeStrict": { + "$ref": "./values/AquiferType.primary.json" + }, + "AquiferTypeLoose": { + "$ref": "./values/AquiferType.legacy.json" + }, + "AquiferUnitPorosityTypeStrict": { + "$ref": "./values/AquiferUnitPorosityType.primary.json" + }, + "AquiferUnitPorosityTypeLoose": { + "$ref": "./values/AquiferUnitPorosityType.legacy.json" + }, + "LithologyTypeStrict": { + "$ref": "./values/LithologyType.primary.json" + }, + "LithologyTypeLoose": { + "$ref": "./values/LithologyType.legacy.json" + }, + "BoreholeDepthMeasure": { + "title": "Borehole Depth Measure", + "description": "Depth below ground surface to the bottom of the hole on completion of drilling.", + "type": "number", + "minimum": -9007199254740991, + "maximum": 0 + }, + "BoreholeDepthUnitStrict": { + "$ref": "./values/BoreholeDepthUnit.primary.json" + }, + "BoreholeDepthUnitLoose": { + "$ref": "./values/BoreholeDepthUnit.legacy.json" + }, + "WellDepthMeasure": { + "title": "Well Depth Measure", + "description": "Depth below ground surface to the bottom of the cased well.", + "type": "number", + "minimum": -9007199254740991, + "maximum": 0 + }, + "WellDepthUnitStrict": { + "$ref": "./values/WellDepthUnit.primary.json" + }, + "WellDepthUnitLoose": { + "$ref": "./values/WellDepthUnit.legacy.json" + }, + "WellOpenIntervalTopMeasure": { + "title": "Well Open Interval Top Measure", + "description": "The upper vertical extent of the open or screened interval in a well measured as a depth from ground surface.", + "type": "number", + "minimum": -9007199254740991, + "maximum": 0 + }, + "WellOpenIntervalTopUnitStrict": { + "$ref": "./values/WellOpenIntervalTopUnit.primary.json" + }, + "WellOpenIntervalTopUnitLoose": { + "$ref": "./values/WellOpenIntervalTopUnit.legacy.json" + }, + "WellOpenIntervalBottomMeasure": { + "title": "Well Open Interval Bottom Measure", + "description": "The lower vertical extent of the open or screened interval in a well measured as a depth from ground surface.", + "type": "number", + "minimum": -9007199254740991, + "maximum": 0 + }, + "WellOpenIntervalBottomUnitStrict": { + "$ref": "./values/WellOpenIntervalBottomUnit.primary.json" + }, + "WellOpenIntervalBottomUnitLoose": { + "$ref": "./values/WellOpenIntervalBottomUnit.legacy.json" + }, "ActivityTypeStrict": { "$ref": "./values/ActivityType.primary.json" }, @@ -107,12 +232,55 @@ "ActivityDepthHeightUnitLoose": { "$ref": "./values/ActivityDepthHeightUnit.legacy.json" }, + "ActivityDepthAltitudeReferencePointStrict": { + "$ref": "./values/ActivityDepthAltitudeReferencePoint.primary.json" + }, + "ActivityDepthAltitudeReferencePointLoose": { + "$ref": "./values/ActivityDepthAltitudeReferencePoint.legacy.json" + }, + "ActivityDepthAltitudeReferencePointMeasure": { + "title": "Activity Depth Altitude Reference Point Measure", + "description": "The height from ground surface to the measurement point.", + "type": "number", + "minimum": 0, + "maximum": 9007199254740991 + }, + "ActivityDepthAltitudeReferencePointUnitStrict": { + "$ref": "./values/ActivityDepthAltitudeReferencePointUnit.primary.json" + }, + "ActivityDepthAltitudeReferencePointUnitLoose": { + "$ref": "./values/ActivityDepthAltitudeReferencePointUnit.legacy.json" + }, + "SampleConditionStrict": { + "$ref": "./values/SampleCondition.primary.json" + }, + "SampleConditionLoose": { + "$ref": "./values/SampleCondition.legacy.json" + }, "SampleCollectionEquipmentNameStrict": { "$ref": "./values/SampleCollectionEquipmentName.primary.json" }, "SampleCollectionEquipmentNameLoose": { "$ref": "./values/SampleCollectionEquipmentName.legacy.json" }, + "SampleCollectionMethodName": { + "title": "Sample Collection Method Name", + "description": "The title of the method from the method publisher.", + "$ref": "#/definitions/string", + "maxLength": 300 + }, + "SampleCollectionMethodID": { + "title": "Sample Collection Method ID", + "description": "The ID number or code assigned by the method publisher.", + "$ref": "#/definitions/string", + "maxLength": 50 + }, + "SampleCollectionMethodContextStrict": { + "$ref": "./values/SampleCollectionMethodContext.primary.json" + }, + "SampleCollectionMethodContextLoose": { + "$ref": "./values/SampleCollectionMethodContext.legacy.json" + }, "CharacteristicNameStrict": { "$ref": "./values/CharacteristicName.primary.json" }, diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index fd831b10..74286042 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -43,9 +43,69 @@ "MonitoringLocationVerticalUnit": { "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalUnitStrict" }, + "MonitoringLocationVerticalAccuracyMeasure": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyMeasure" + }, + "MonitoringLocationVerticalAccuracyUnit": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyUnitStrict" + }, + "MonitoringLocationVerticalCollectionMethod": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCollectionMethodStrict" + }, + "MonitoringLocationVerticalCoordinateReferenceSystem": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCoordinateReferenceSystemStrict" + }, "MonitoringLocationType": { "$ref": "./definitions.json#/definitions/MonitoringLocationTypeStrict" }, + "WellID": { + "$ref": "./definitions.json#/definitions/WellID" + }, + "WellIDContext": { + "$ref": "./definitions.json#/definitions/WellIDContextStrict" + }, + "WellUseType": { + "$ref": "./definitions.json#/definitions/WellUseTypeStrict" + }, + "AquiferCode": { + "$ref": "./definitions.json#/definitions/AquiferCodeStrict" + }, + "AquiferUnitName": { + "$ref": "./definitions.json#/definitions/AquiferUnitName" + }, + "AquiferType": { + "$ref": "./definitions.json#/definitions/AquiferTypeStrict" + }, + "AquiferUnitPorosityType": { + "$ref": "./definitions.json#/definitions/AquiferUnitPorosityTypeStrict" + }, + "LithologyType": { + "$ref": "./definitions.json#/definitions/LithologyTypeStrict" + }, + "BoreholeDepthMeasure": { + "$ref": "./definitions.json#/definitions/BoreholeDepthMeasure" + }, + "BoreholeDepthUnit": { + "$ref": "./definitions.json#/definitions/BoreholeDepthUnitStrict" + }, + "WellDepthMeasure": { + "$ref": "./definitions.json#/definitions/WellDepthMeasure" + }, + "WellDepthUnit": { + "$ref": "./definitions.json#/definitions/WellDepthUnitStrict" + }, + "WellOpenIntervalTopMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopMeasure" + }, + "WellOpenIntervalTopUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopUnitStrict" + }, + "WellOpenIntervalBottomMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomMeasure" + }, + "WellOpenIntervalBottomUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict" + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict" }, @@ -76,9 +136,30 @@ "ActivityDepthHeightUnit": { "$ref": "./definitions.json#/definitions/ActivityDepthHeightUnitStrict" }, + "ActivityDepthAltitudeReferencePoint": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointStrict" + }, + "ActivityDepthAltitudeReferencePointMeasure": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointMeasure" + }, + "ActivityDepthAltitudeReferencePointUnit": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointUnitStrict" + }, + "SampleCondition": { + "$ref": "./definitions.json#/definitions/SampleConditionStrict" + }, "SampleCollectionEquipmentName": { "$ref": "./definitions.json#/definitions/SampleCollectionEquipmentNameStrict" }, + "SampleCollectionMethodName": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodName" + }, + "SampleCollectionMethodID": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodID" + }, + "SampleCollectionMethodContext": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodContextStrict" + }, "CharacteristicName": { "$ref": "./definitions.json#/definitions/CharacteristicNameStrict" }, @@ -158,8 +239,24 @@ "MonitoringLocationHorizontalAccuracyMeasure": [ "MonitoringLocationHorizontalAccuracyUnit" ], - "MonitoringLocationVerticalMeasure": ["MonitoringLocationVerticalUnit"], + "MonitoringLocationVerticalMeasure": [ + "MonitoringLocationVerticalUnit", + "MonitoringLocationVerticalCollectionMethod", + "MonitoringLocationVerticalCoordinateReferenceSystem" + ], + "MonitoringLocationVerticalAccuracyMeasure": [ + "MonitoringLocationVerticalAccuracyUnit" + ], + "WellID": ["WellIDContext"], + "BoreholeDepthMeasure": ["BoreholeDepthUnit"], + "WellDepthMeasure": ["WellDepthUnit"], + "WellOpenIntervalTopMeasure": ["WellOpenIntervalTopUnit"], + "WellOpenIntervalBottomMeasure": ["WellOpenIntervalBottomUnit"], "ActivityDepthHeightMeasure": ["ActivityDepthHeightUnit"], + "ActivityDepthAltitudeReferencePointMeasure": [ + "ActivityDepthAltitudeReferencePointUnit" + ], + "SampleCollectionMethodID": ["SampleCollectionMethodContext"], "ResultValue": ["ResultUnit"], "ResultDetectionQuantitationLimitMeasure": [ "ResultDetectionQuantitationLimitUnit" diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 8ebf2a35..1d252cbf 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -47,10 +47,83 @@ "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalUnitStrict", "transform": ["trim", "toEnumCase"] }, + "MonitoringLocationVerticalAccuracyMeasure": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyMeasure" + }, + "MonitoringLocationVerticalAccuracyUnit": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyUnitStrict", + "transform": ["trim", "toEnumCase"] + }, + "MonitoringLocationVerticalCollectionMethod": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCollectionMethodStrict", + "transform": ["trim", "toEnumCase"] + }, + "MonitoringLocationVerticalCoordinateReferenceSystem": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCoordinateReferenceSystemStrict", + "transform": ["trim", "toEnumCase"] + }, "MonitoringLocationType": { "$ref": "./definitions.json#/definitions/MonitoringLocationTypeStrict", "transform": ["trim", "toEnumCase"] }, + "WellID": { + "$ref": "./definitions.json#/definitions/WellID" + }, + "WellIDContext": { + "$ref": "./definitions.json#/definitions/WellIDContextStrict", + "transform": ["trim", "toEnumCase"] + }, + "WellUseType": { + "$ref": "./definitions.json#/definitions/WellUseTypeStrict", + "transform": ["trim", "toEnumCase"] + }, + "AquiferCode": { + "$ref": "./definitions.json#/definitions/AquiferCodeStrict", + "transform": ["trim", "toEnumCase"] + }, + "AquiferUnitName": { + "$ref": "./definitions.json#/definitions/AquiferUnitName" + }, + "AquiferType": { + "$ref": "./definitions.json#/definitions/AquiferTypeStrict", + "transform": ["trim", "toEnumCase"] + }, + "AquiferUnitPorosityType": { + "$ref": "./definitions.json#/definitions/AquiferUnitPorosityTypeStrict", + "transform": ["trim", "toEnumCase"] + }, + "LithologyType": { + "$ref": "./definitions.json#/definitions/LithologyTypeStrict", + "transform": ["trim", "toEnumCase"] + }, + "BoreholeDepthMeasure": { + "$ref": "./definitions.json#/definitions/BoreholeDepthMeasure" + }, + "BoreholeDepthUnit": { + "$ref": "./definitions.json#/definitions/BoreholeDepthUnitStrict", + "transform": ["trim", "toEnumCase"] + }, + "WellDepthMeasure": { + "$ref": "./definitions.json#/definitions/WellDepthMeasure" + }, + "WellDepthUnit": { + "$ref": "./definitions.json#/definitions/WellDepthUnitStrict", + "transform": ["trim", "toEnumCase"] + }, + "WellOpenIntervalTopMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopMeasure" + }, + "WellOpenIntervalTopUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopUnitStrict", + "transform": ["trim", "toEnumCase"] + }, + "WellOpenIntervalBottomMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomMeasure" + }, + "WellOpenIntervalBottomUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict", + "transform": ["trim", "toEnumCase"] + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict", "transform": ["trim", "toEnumCase"] @@ -84,10 +157,35 @@ "$ref": "./definitions.json#/definitions/ActivityDepthHeightUnitStrict", "transform": ["trim", "toEnumCase"] }, + "ActivityDepthAltitudeReferencePoint": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointStrict", + "transform": ["trim", "toEnumCase"] + }, + "ActivityDepthAltitudeReferencePointMeasure": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointMeasure" + }, + "ActivityDepthAltitudeReferencePointUnit": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointUnitStrict", + "transform": ["trim", "toEnumCase"] + }, + "SampleCondition": { + "$ref": "./definitions.json#/definitions/SampleConditionStrict", + "transform": ["trim", "toEnumCase"] + }, "SampleCollectionEquipmentName": { "$ref": "./definitions.json#/definitions/SampleCollectionEquipmentNameStrict", "transform": ["trim", "toEnumCase"] }, + "SampleCollectionMethodName": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodName" + }, + "SampleCollectionMethodID": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodID" + }, + "SampleCollectionMethodContext": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodContextStrict", + "transform": ["trim", "toEnumCase"] + }, "CharacteristicName": { "$ref": "./definitions.json#/definitions/CharacteristicNameStrict", "transform": ["trim", "toEnumCase"] @@ -177,8 +275,24 @@ "MonitoringLocationHorizontalAccuracyMeasure": [ "MonitoringLocationHorizontalAccuracyUnit" ], - "MonitoringLocationVerticalMeasure": ["MonitoringLocationVerticalUnit"], + "MonitoringLocationVerticalMeasure": [ + "MonitoringLocationVerticalUnit", + "MonitoringLocationVerticalCollectionMethod", + "MonitoringLocationVerticalCoordinateReferenceSystem" + ], + "MonitoringLocationVerticalAccuracyMeasure": [ + "MonitoringLocationVerticalAccuracyUnit" + ], + "WellID": ["WellIDContext"], + "BoreholeDepthMeasure": ["BoreholeDepthUnit"], + "WellDepthMeasure": ["WellDepthUnit"], + "WellOpenIntervalTopMeasure": ["WellOpenIntervalTopUnit"], + "WellOpenIntervalBottomMeasure": ["WellOpenIntervalBottomUnit"], "ActivityDepthHeightMeasure": ["ActivityDepthHeightUnit"], + "ActivityDepthAltitudeReferencePointMeasure": [ + "ActivityDepthAltitudeReferencePointUnit" + ], + "SampleCollectionMethodID": ["SampleCollectionMethodContext"], "ResultValue": ["ResultUnit"], "ResultDetectionQuantitationLimitMeasure": [ "ResultDetectionQuantitationLimitUnit", diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index a56aaa08..ed721977 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -38,9 +38,69 @@ "MonitoringLocationVerticalUnit": { "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalUnitStrict" }, + "MonitoringLocationVerticalAccuracyMeasure": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyMeasure" + }, + "MonitoringLocationVerticalAccuracyUnit": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalAccuracyUnitStrict" + }, + "MonitoringLocationVerticalCollectionMethod": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCollectionMethodStrict" + }, + "MonitoringLocationVerticalCoordinateReferenceSystem": { + "$ref": "./definitions.json#/definitions/MonitoringLocationVerticalCoordinateReferenceSystemStrict" + }, "MonitoringLocationType": { "$ref": "./definitions.json#/definitions/MonitoringLocationTypeStrict" }, + "WellID": { + "$ref": "./definitions.json#/definitions/WellID" + }, + "WellIDContext": { + "$ref": "./definitions.json#/definitions/WellIDContextStrict" + }, + "WellUseType": { + "$ref": "./definitions.json#/definitions/WellUseTypeStrict" + }, + "AquiferCode": { + "$ref": "./definitions.json#/definitions/AquiferCodeStrict" + }, + "AquiferUnitName": { + "$ref": "./definitions.json#/definitions/AquiferUnitName" + }, + "AquiferType": { + "$ref": "./definitions.json#/definitions/AquiferTypeStrict" + }, + "AquiferUnitPorosityType": { + "$ref": "./definitions.json#/definitions/AquiferUnitPorosityTypeStrict" + }, + "LithologyType": { + "$ref": "./definitions.json#/definitions/LithologyTypeStrict" + }, + "BoreholeDepthMeasure": { + "$ref": "./definitions.json#/definitions/BoreholeDepthMeasure" + }, + "BoreholeDepthUnit": { + "$ref": "./definitions.json#/definitions/BoreholeDepthUnitStrict" + }, + "WellDepthMeasure": { + "$ref": "./definitions.json#/definitions/WellDepthMeasure" + }, + "WellDepthUnit": { + "$ref": "./definitions.json#/definitions/WellDepthUnitStrict" + }, + "WellOpenIntervalTopMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopMeasure" + }, + "WellOpenIntervalTopUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalTopUnitStrict" + }, + "WellOpenIntervalBottomMeasure": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomMeasure" + }, + "WellOpenIntervalBottomUnit": { + "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict" + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict" }, @@ -71,9 +131,30 @@ "ActivityDepthHeightUnit": { "$ref": "./definitions.json#/definitions/ActivityDepthHeightUnitStrict" }, + "ActivityDepthAltitudeReferencePoint": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointStrict" + }, + "ActivityDepthAltitudeReferencePointMeasure": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointMeasure" + }, + "ActivityDepthAltitudeReferencePointUnit": { + "$ref": "./definitions.json#/definitions/ActivityDepthAltitudeReferencePointUnitStrict" + }, + "SampleCondition": { + "$ref": "./definitions.json#/definitions/SampleConditionStrict" + }, "SampleCollectionEquipmentName": { "$ref": "./definitions.json#/definitions/SampleCollectionEquipmentNameStrict" }, + "SampleCollectionMethodName": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodName" + }, + "SampleCollectionMethodID": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodID" + }, + "SampleCollectionMethodContext": { + "$ref": "./definitions.json#/definitions/SampleCollectionMethodContextStrict" + }, "CharacteristicName": { "$ref": "./definitions.json#/definitions/CharacteristicNameStrict" }, @@ -153,8 +234,24 @@ "MonitoringLocationHorizontalAccuracyMeasure": [ "MonitoringLocationHorizontalAccuracyUnit" ], - "MonitoringLocationVerticalMeasure": ["MonitoringLocationVerticalUnit"], + "MonitoringLocationVerticalMeasure": [ + "MonitoringLocationVerticalUnit", + "MonitoringLocationVerticalCollectionMethod", + "MonitoringLocationVerticalCoordinateReferenceSystem" + ], + "MonitoringLocationVerticalAccuracyMeasure": [ + "MonitoringLocationVerticalAccuracyUnit" + ], + "WellID": ["WellIDContext"], + "BoreholeDepthMeasure": ["BoreholeDepthUnit"], + "WellDepthMeasure": ["WellDepthUnit"], + "WellOpenIntervalTopMeasure": ["WellOpenIntervalTopUnit"], + "WellOpenIntervalBottomMeasure": ["WellOpenIntervalBottomUnit"], "ActivityDepthHeightMeasure": ["ActivityDepthHeightUnit"], + "ActivityDepthAltitudeReferencePointMeasure": [ + "ActivityDepthAltitudeReferencePointUnit" + ], + "SampleCollectionMethodID": ["SampleCollectionMethodContext"], "ResultValue": ["ResultUnit"], "ResultDetectionQuantitationLimitMeasure": [ "ResultDetectionQuantitationLimitUnit", diff --git a/schemas/data/src/quality-control.json b/schemas/data/src/quality-control.json index 276f8c39..20e98790 100644 --- a/schemas/data/src/quality-control.json +++ b/schemas/data/src/quality-control.json @@ -21,7 +21,27 @@ "MonitoringLocationHorizontalAccuracyUnit": true, "MonitoringLocationVerticalMeasure": true, "MonitoringLocationVerticalUnit": true, + "MonitoringLocationVerticalAccuracyMeasure": true, + "MonitoringLocationVerticalAccuracyUnit": true, + "MonitoringLocationVerticalCollectionMethod": true, + "MonitoringLocationVerticalCoordinateReferenceSystem": true, "MonitoringLocationType": true, + "WellID": true, + "WellIDContext": true, + "WellUseType": true, + "AquiferCode": true, + "AquiferUnitName": true, + "AquiferType": true, + "AquiferUnitPorosityType": true, + "LithologyType": true, + "BoreholeDepthMeasure": true, + "BoreholeDepthUnit": true, + "WellDepthMeasure": true, + "WellDepthUnit": true, + "WellOpenIntervalTopMeasure": true, + "WellOpenIntervalTopUnit": true, + "WellOpenIntervalBottomMeasure": true, + "WellOpenIntervalBottomUnit": true, "ActivityType": true, "ActivityMediaName": true, "ActivityStartDate": true, @@ -68,7 +88,14 @@ }, "ActivityDepthHeightMeasure": true, "ActivityDepthHeightUnit": true, + "ActivityDepthAltitudeReferencePoint": true, + "ActivityDepthAltitudeReferencePointMeasure": true, + "ActivityDepthAltitudeReferencePointUnit": true, + "SampleCondition": true, "SampleCollectionEquipmentName": true, + "SampleCollectionMethodName": true, + "SampleCollectionMethodID": true, + "SampleCollectionMethodContext": true, "CharacteristicName": true, "MethodSpeciation": true, "ResultSampleFraction": true, diff --git a/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json b/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json new file mode 100644 index 00000000..64e356e2 --- /dev/null +++ b/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json @@ -0,0 +1 @@ +["cm", "ft", "in", "m"] \ No newline at end of file diff --git a/schemas/data/src/subset/BoreholeDepthUnit.json b/schemas/data/src/subset/BoreholeDepthUnit.json new file mode 100644 index 00000000..de7808f8 --- /dev/null +++ b/schemas/data/src/subset/BoreholeDepthUnit.json @@ -0,0 +1 @@ +["ft", "m"] diff --git a/schemas/data/src/subset/LithologyType.json b/schemas/data/src/subset/LithologyType.json index 23cb5aaa..bb59b413 100644 --- a/schemas/data/src/subset/LithologyType.json +++ b/schemas/data/src/subset/LithologyType.json @@ -1,67 +1,67 @@ - [ - "Andesite", - "Anthropogenic material", - "Basalt", - "Bedrock, Fractured", - "Bedrock, Interbedded sandstone/carbonate", - "Bedrock, Interbedded sandstone/shale", - "Bedrock, Interbedded sandstone/shale/carbonate", - "Bedrock, Interbedded sediments", - "Bedrock, Interbedded siltstone/carbonate/gypsum", - "Bedrock, Soluble Carbonate - Karst", - "Bedrock, Soluble gypsum/dolomite with shale interb", - "Bedrock", - "Carbonate sedimentary rock", - "Clay", - "Clayey Sand", - "Clayey Silt", - "Coal", - "Conglomerate", - "Diamicton", - "Diorite", - "Dolomite", - "Evaporite", - "Gabbro", - "Gneiss", - "Granite", - "Gravel", - "Gravelly Mud", - "Gravelly Muddy Sand" - "Gravelly Sand", - "Gravely Sediment", - "Humus", - "Igneous rock", - "Limestone", - "Marble", - "Metamorphic rock", - "Mud", - "Muddy Gravel", - "Muddy Sand", - "Muddy Sandy Gravel", - "Organic material", - "Peat", - "Plutonic rock", - "Quartzite", - "Rhyolite", - "Sand, Silt, Clay", - "Sand", - "Sandstone", - "Sandy Clay", - "Sandy Gravel", - "Sandy Mud", - "Sandy Silt", - "Schist", - "Sedimentary rock", - "Shale", - "Silt", - "Siltite", - "Silty Clay", - "Silty Sand", - "Slate", - "Soil", - "Till", - "Unconsolidated material", - "Undifferentiated sediment", - "Unknown material", - "Volcanic rock", +[ + "Andesite", + "Anthropogenic material", + "Basalt", + "Bedrock", + "Bedrock, Fractured", + "Bedrock, Interbedded sandstone/carbonate", + "Bedrock, Interbedded sandstone/shale", + "Bedrock, Interbedded sandstone/shale/carbonate", + "Bedrock, Interbedded sediments", + "Bedrock, Interbedded siltstone/carbonate/gypsum", + "Bedrock, Soluble Carbonate - Karst", + "Bedrock, Soluble gypsum/dolomite with shale interb", + "Carbonate sedimentary rock", + "Clay", + "Clayey Sand", + "Clayey Silt", + "Coal", + "Conglomerate", + "Diamicton", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Gneiss", + "Granite", + "Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand", + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", + "Mud", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", + "Organic material", + "Peat", + "Plutonic rock", + "Quartzite", + "Rhyolite", + "Sand", + "Sand, Silt, Clay", + "Sandstone", + "Sandy Clay", + "Sandy Gravel", + "Sandy Mud", + "Sandy Silt", + "Schist", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock" ] \ No newline at end of file diff --git a/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json b/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json new file mode 100644 index 00000000..6f194b61 --- /dev/null +++ b/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json @@ -0,0 +1 @@ +["ft", "m"] \ No newline at end of file diff --git a/schemas/data/src/subset/MonitoringLocationVerticalUnit.json b/schemas/data/src/subset/MonitoringLocationVerticalUnit.json index 09fbdc4c..1df607cc 100644 --- a/schemas/data/src/subset/MonitoringLocationVerticalUnit.json +++ b/schemas/data/src/subset/MonitoringLocationVerticalUnit.json @@ -1 +1,5 @@ -["MASL"] +[ + "ft", + "m", + "MASL" +] diff --git a/schemas/data/src/subset/WellDepthUnit.json b/schemas/data/src/subset/WellDepthUnit.json new file mode 100644 index 00000000..de7808f8 --- /dev/null +++ b/schemas/data/src/subset/WellDepthUnit.json @@ -0,0 +1 @@ +["ft", "m"] diff --git a/schemas/data/src/subset/WellOpenIntervalBottomUnit.json b/schemas/data/src/subset/WellOpenIntervalBottomUnit.json new file mode 100644 index 00000000..de7808f8 --- /dev/null +++ b/schemas/data/src/subset/WellOpenIntervalBottomUnit.json @@ -0,0 +1 @@ +["ft", "m"] diff --git a/schemas/data/src/subset/WellOpenIntervalTopUnit.json b/schemas/data/src/subset/WellOpenIntervalTopUnit.json new file mode 100644 index 00000000..de7808f8 --- /dev/null +++ b/schemas/data/src/subset/WellOpenIntervalTopUnit.json @@ -0,0 +1 @@ +["ft", "m"] diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json new file mode 100644 index 00000000..71499ab6 --- /dev/null +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.loose.json", + "title": "Activity Depth Altitude Reference Point", + "description": "", + "type": "string", + "enum": [ + "Ground surface", + "Top of instrument shelf", + "Top of outer casing", + "Top of well casing", + "Unspecified" + ], + "maxLength": 23 +} \ No newline at end of file diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json new file mode 100644 index 00000000..05138cb1 --- /dev/null +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.strict.json", + "title": "Activity Depth Altitude Reference Point", + "description": "", + "type": "string", + "enum": [ + "Ground surface", + "Top of instrument shelf", + "Top of outer casing", + "Top of well casing", + "Unspecified" + ], + "maxLength": 23 +} \ No newline at end of file diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json new file mode 100644 index 00000000..41f36f03 --- /dev/null +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json @@ -0,0 +1,13 @@ +{ + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "cm", + "ft", + "in", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json new file mode 100644 index 00000000..49b3f8c0 --- /dev/null +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json @@ -0,0 +1,13 @@ +{ + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "cm", + "ft", + "in", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferCode.legacy.json b/schemas/data/src/values/AquiferCode.legacy.json new file mode 100644 index 00000000..2a172e93 --- /dev/null +++ b/schemas/data/src/values/AquiferCode.legacy.json @@ -0,0 +1,10 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferCode.loose.json", + "title": "Aquifer Code", + "description": "", + "type": "string", + "enum": [ + "12_NS" + ], + "maxLength": 5 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferCode.primary.json b/schemas/data/src/values/AquiferCode.primary.json new file mode 100644 index 00000000..cb153bfb --- /dev/null +++ b/schemas/data/src/values/AquiferCode.primary.json @@ -0,0 +1,10 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferCode.strict.json", + "title": "Aquifer Code", + "description": "", + "type": "string", + "enum": [ + "12_NS" + ], + "maxLength": 5 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferType.legacy.json b/schemas/data/src/values/AquiferType.legacy.json new file mode 100644 index 00000000..7d54d207 --- /dev/null +++ b/schemas/data/src/values/AquiferType.legacy.json @@ -0,0 +1,12 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferType.loose.json", + "title": "Aquifer Type", + "description": "", + "type": "string", + "enum": [ + "CONFINED", + "SEMI-CONFINED", + "UNCONFINED" + ], + "maxLength": 13 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferType.primary.json b/schemas/data/src/values/AquiferType.primary.json new file mode 100644 index 00000000..5692c61a --- /dev/null +++ b/schemas/data/src/values/AquiferType.primary.json @@ -0,0 +1,12 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferType.strict.json", + "title": "Aquifer Type", + "description": "", + "type": "string", + "enum": [ + "CONFINED", + "SEMI-CONFINED", + "UNCONFINED" + ], + "maxLength": 13 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferUnitPorosityType.legacy.json b/schemas/data/src/values/AquiferUnitPorosityType.legacy.json new file mode 100644 index 00000000..ef0b41dc --- /dev/null +++ b/schemas/data/src/values/AquiferUnitPorosityType.legacy.json @@ -0,0 +1,13 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.loose.json", + "title": "Aquifer Unit Porosity Type", + "description": "", + "type": "string", + "enum": [ + "Fractured", + "Granular", + "Karstic", + "Mixed" + ], + "maxLength": 9 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferUnitPorosityType.primary.json b/schemas/data/src/values/AquiferUnitPorosityType.primary.json new file mode 100644 index 00000000..fd69c791 --- /dev/null +++ b/schemas/data/src/values/AquiferUnitPorosityType.primary.json @@ -0,0 +1,13 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.strict.json", + "title": "Aquifer Unit Porosity Type", + "description": "", + "type": "string", + "enum": [ + "Fractured", + "Granular", + "Karstic", + "Mixed" + ], + "maxLength": 9 +} \ No newline at end of file diff --git a/schemas/data/src/values/BoreholeDepthUnit.legacy.json b/schemas/data/src/values/BoreholeDepthUnit.legacy.json new file mode 100644 index 00000000..d7fb0ac0 --- /dev/null +++ b/schemas/data/src/values/BoreholeDepthUnit.legacy.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/BoreholeDepthUnit.primary.json b/schemas/data/src/values/BoreholeDepthUnit.primary.json new file mode 100644 index 00000000..ae70c78f --- /dev/null +++ b/schemas/data/src/values/BoreholeDepthUnit.primary.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/LithologyType.legacy.json b/schemas/data/src/values/LithologyType.legacy.json new file mode 100644 index 00000000..19acd61c --- /dev/null +++ b/schemas/data/src/values/LithologyType.legacy.json @@ -0,0 +1,84 @@ +{ + "$id": "https://datastream.org/schema/data/values/LithologyType.loose.json", + "title": "Well Formation Type", + "description": "", + "type": "string", + "enum": [ + "Andesite", + "Anthropogenic material", + "Basalt", + "Bedrock", + "Bedrock, Carbonate", + "Bedrock, Fractured", + "Bedrock, Interbedded sandstone/carbonate", + "Bedrock, Interbedded sandstone/shale", + "Bedrock, Interbedded sandstone/shale/carbonate", + "Bedrock, Interbedded sediments", + "Bedrock, Interbedded siltstone/carbonate/gypsum", + "Bedrock, Massive sandstone", + "Bedrock, Soluble Carbonate - Karst", + "Bedrock, Soluble gypsum/dolomite with shale interb", + "Carbonate sedimentary rock", + "Clay", + "Clayey Sand", + "Clayey Silt", + "Coal", + "Conglomerate", + "Diamicton", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Geologic", + "Gneiss", + "Granite", + "Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand", + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Hydrogeologic", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", + "Mixed", + "Mud", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", + "Organic material", + "Peat", + "Plutonic rock", + "Quartzite", + "Rhyolite", + "Sand", + "Sand, Silt, Clay", + "Sandstone", + "Sandy Clay", + "Sandy Gravel", + "Sandy Mud", + "Sandy Silt", + "Schist", + "Sediment, Alluvium/Terrace", + "Sediment, Isolated Terrace", + "Sediment, Terrace", + "Sediment, Unconsolidated", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Soil Horizon", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock" + ], + "maxLength": 50 +} \ No newline at end of file diff --git a/schemas/data/src/values/LithologyType.primary.json b/schemas/data/src/values/LithologyType.primary.json new file mode 100644 index 00000000..bafbecde --- /dev/null +++ b/schemas/data/src/values/LithologyType.primary.json @@ -0,0 +1,74 @@ +{ + "$id": "https://datastream.org/schema/data/values/LithologyType.strict.json", + "title": "Well Formation Type", + "description": "", + "type": "string", + "enum": [ + "Andesite", + "Anthropogenic material", + "Basalt", + "Bedrock", + "Bedrock, Fractured", + "Bedrock, Interbedded sandstone/carbonate", + "Bedrock, Interbedded sandstone/shale", + "Bedrock, Interbedded sandstone/shale/carbonate", + "Bedrock, Interbedded sediments", + "Bedrock, Interbedded siltstone/carbonate/gypsum", + "Bedrock, Soluble Carbonate - Karst", + "Bedrock, Soluble gypsum/dolomite with shale interb", + "Carbonate sedimentary rock", + "Clay", + "Clayey Sand", + "Clayey Silt", + "Coal", + "Conglomerate", + "Diamicton", + "Diorite", + "Dolomite", + "Evaporite", + "Gabbro", + "Gneiss", + "Granite", + "Gravel", + "Gravelly Mud", + "Gravelly Muddy Sand", + "Gravelly Sand", + "Gravely Sediment", + "Humus", + "Igneous rock", + "Limestone", + "Marble", + "Metamorphic rock", + "Mud", + "Muddy Gravel", + "Muddy Sand", + "Muddy Sandy Gravel", + "Organic material", + "Peat", + "Plutonic rock", + "Quartzite", + "Rhyolite", + "Sand", + "Sand, Silt, Clay", + "Sandstone", + "Sandy Clay", + "Sandy Gravel", + "Sandy Mud", + "Sandy Silt", + "Schist", + "Sedimentary rock", + "Shale", + "Silt", + "Siltite", + "Silty Clay", + "Silty Sand", + "Slate", + "Soil", + "Till", + "Unconsolidated material", + "Undifferentiated sediment", + "Unknown material", + "Volcanic rock" + ], + "maxLength": 50 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json new file mode 100644 index 00000000..4770ff0c --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json new file mode 100644 index 00000000..0c1ef410 --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json new file mode 100644 index 00000000..7e789ea0 --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json @@ -0,0 +1,26 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.loose.json", + "title": "Vertical Collection Method", + "description": "", + "type": "string", + "enum": [ + "Altimetry", + "Classical Surveying Techniques", + "Digital Elevation Model", + "GPS Carrier Phase Kinematic Relative Position", + "GPS Carrier Phase Static Relative Position", + "GPS Code (Pseudo Range) Differential", + "GPS Code (Pseudo Range) Precise Position", + "GPS Code (Pseudo Range) Standard Position (SA Off)", + "GPS Code (Pseudo Range) Standard Position (SA On)", + "Leveling-Non Bench Mark Control Points", + "Light Detection And Ranging (LiDAR)", + "Other", + "Photogrammetric", + "Precise Leveling-Bench Mark", + "Topographic Map Interpolation", + "Trigonometric Leveling", + "Unknown" + ], + "maxLength": 50 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json new file mode 100644 index 00000000..51cfb845 --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json @@ -0,0 +1,26 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.strict.json", + "title": "Vertical Collection Method", + "description": "", + "type": "string", + "enum": [ + "Altimetry", + "Classical Surveying Techniques", + "Digital Elevation Model", + "GPS Carrier Phase Kinematic Relative Position", + "GPS Carrier Phase Static Relative Position", + "GPS Code (Pseudo Range) Differential", + "GPS Code (Pseudo Range) Precise Position", + "GPS Code (Pseudo Range) Standard Position (SA Off)", + "GPS Code (Pseudo Range) Standard Position (SA On)", + "Leveling-Non Bench Mark Control Points", + "Light Detection And Ranging (LiDAR)", + "Other", + "Photogrammetric", + "Precise Leveling-Bench Mark", + "Topographic Map Interpolation", + "Trigonometric Leveling", + "Unknown" + ], + "maxLength": 50 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json new file mode 100644 index 00000000..64cdd5f1 --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json @@ -0,0 +1,15 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.loose.json", + "title": "Vertical Reference Datum", + "description": "", + "type": "string", + "enum": [ + "LTD", + "NAVD88", + "NGVD29", + "OTHER", + "SEALV", + "UNKWN" + ], + "maxLength": 6 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json new file mode 100644 index 00000000..0bad4e2b --- /dev/null +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json @@ -0,0 +1,15 @@ +{ + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.strict.json", + "title": "Vertical Reference Datum", + "description": "", + "type": "string", + "enum": [ + "LTD", + "NAVD88", + "NGVD29", + "OTHER", + "SEALV", + "UNKWN" + ], + "maxLength": 6 +} \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json index 8bc672fd..c3efe811 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json @@ -4,6 +4,8 @@ "description": "", "type": "string", "enum": [ + "ft", + "m", "MASL" ], "maxLength": 4 diff --git a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json index 6f77dce7..b2d232f5 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json @@ -5,7 +5,8 @@ "type": "string", "enum": [ "ft", - "m" + "m", + "MASL" ], "maxLength": 4 } \ No newline at end of file diff --git a/schemas/data/src/values/SampleCollectionMethodContext.legacy.json b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json new file mode 100644 index 00000000..943994f4 --- /dev/null +++ b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json @@ -0,0 +1,44 @@ +{ + "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.loose.json", + "title": "Sample Collection Method Context", + "description": "", + "type": "string", + "enum": [ + "11NPSWRD", + "ADEM", + "AFS", + "ANS-PCER", + "ANSP", + "Applegate WC", + "ASTM", + "BIORECON", + "CA_Waterboards", + "CDPHE", + "CRWA Laboratory", + "CWW", + "EnvCanada-AWQMSD", + "GA DNR", + "GA EPD", + "GA-DNR", + "GeoEngineers", + "IDEXX", + "Kansas DHE", + "KNA__", + "MASSWATER", + "MDEQ-WQ", + "NJDEP", + "PFBMP", + "PIBO-EMP", + "PNAMP", + "TCEQ", + "TN DEC", + "TRC Omni", + "USACE", + "USDOI/USGS", + "USEPA", + "UTAHDWQ", + "WSDOE", + "WYDEQ" + ], + "maxLength": 16 +} \ No newline at end of file diff --git a/schemas/data/src/values/SampleCollectionMethodContext.primary.json b/schemas/data/src/values/SampleCollectionMethodContext.primary.json new file mode 100644 index 00000000..7a6002c6 --- /dev/null +++ b/schemas/data/src/values/SampleCollectionMethodContext.primary.json @@ -0,0 +1,44 @@ +{ + "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.strict.json", + "title": "Sample Collection Method Context", + "description": "", + "type": "string", + "enum": [ + "11NPSWRD", + "ADEM", + "AFS", + "ANS-PCER", + "ANSP", + "Applegate WC", + "ASTM", + "BIORECON", + "CA_Waterboards", + "CDPHE", + "CRWA Laboratory", + "CWW", + "EnvCanada-AWQMSD", + "GA DNR", + "GA EPD", + "GA-DNR", + "GeoEngineers", + "IDEXX", + "Kansas DHE", + "KNA__", + "MASSWATER", + "MDEQ-WQ", + "NJDEP", + "PFBMP", + "PIBO-EMP", + "PNAMP", + "TCEQ", + "TN DEC", + "TRC Omni", + "USACE", + "USDOI/USGS", + "USEPA", + "UTAHDWQ", + "WSDOE", + "WYDEQ" + ], + "maxLength": 16 +} \ No newline at end of file diff --git a/schemas/data/src/values/SampleCondition.legacy.json b/schemas/data/src/values/SampleCondition.legacy.json new file mode 100644 index 00000000..c2dd9a76 --- /dev/null +++ b/schemas/data/src/values/SampleCondition.legacy.json @@ -0,0 +1,15 @@ +{ + "$id": "https://datastream.org/schema/data/values/SampleCondition.loose.json", + "title": "Sample Condition", + "description": "", + "type": "string", + "enum": [ + "Flowing", + "Nearby site is being pumped or pumped recently", + "Static", + "The site has been pumped recently", + "The site is being pumped", + "Unspecified" + ], + "maxLength": 46 +} \ No newline at end of file diff --git a/schemas/data/src/values/SampleCondition.primary.json b/schemas/data/src/values/SampleCondition.primary.json new file mode 100644 index 00000000..90bc6d0f --- /dev/null +++ b/schemas/data/src/values/SampleCondition.primary.json @@ -0,0 +1,15 @@ +{ + "$id": "https://datastream.org/schema/data/values/SampleCondition.strict.json", + "title": "Sample Condition", + "description": "", + "type": "string", + "enum": [ + "Flowing", + "Nearby site is being pumped or pumped recently", + "Static", + "The site has been pumped recently", + "The site is being pumped", + "Unspecified" + ], + "maxLength": 46 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellDepthUnit.legacy.json b/schemas/data/src/values/WellDepthUnit.legacy.json new file mode 100644 index 00000000..0854b315 --- /dev/null +++ b/schemas/data/src/values/WellDepthUnit.legacy.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellDepthUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellDepthUnit.primary.json b/schemas/data/src/values/WellDepthUnit.primary.json new file mode 100644 index 00000000..5a87371c --- /dev/null +++ b/schemas/data/src/values/WellDepthUnit.primary.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellDepthUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellIDContext.legacy.json b/schemas/data/src/values/WellIDContext.legacy.json new file mode 100644 index 00000000..c78b8329 --- /dev/null +++ b/schemas/data/src/values/WellIDContext.legacy.json @@ -0,0 +1,22 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellIDContext.loose.json", + "title": "Well ID Context", + "description": "", + "type": "string", + "enum": [ + "AB", + "BC", + "MB", + "NB", + "NL", + "NS", + "NT", + "ON", + "OTHER", + "PE", + "QC", + "SK", + "YK" + ], + "maxLength": 5 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellIDContext.primary.json b/schemas/data/src/values/WellIDContext.primary.json new file mode 100644 index 00000000..c342ee3a --- /dev/null +++ b/schemas/data/src/values/WellIDContext.primary.json @@ -0,0 +1,22 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellIDContext.strict.json", + "title": "Well ID Context", + "description": "", + "type": "string", + "enum": [ + "AB", + "BC", + "MB", + "NB", + "NL", + "NS", + "NT", + "ON", + "OTHER", + "PE", + "QC", + "SK", + "YK" + ], + "maxLength": 5 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json b/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json new file mode 100644 index 00000000..50a59221 --- /dev/null +++ b/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json b/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json new file mode 100644 index 00000000..319debe1 --- /dev/null +++ b/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json b/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json new file mode 100644 index 00000000..9d3133a3 --- /dev/null +++ b/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.loose.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json b/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json new file mode 100644 index 00000000..f204d3e1 --- /dev/null +++ b/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json @@ -0,0 +1,11 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.strict.json", + "title": "Measurement Unit", + "description": "", + "type": "string", + "enum": [ + "ft", + "m" + ], + "maxLength": 2 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellUseType.legacy.json b/schemas/data/src/values/WellUseType.legacy.json new file mode 100644 index 00000000..7befed4c --- /dev/null +++ b/schemas/data/src/values/WellUseType.legacy.json @@ -0,0 +1,37 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellUseType.loose.json", + "title": "Well Type", + "description": "", + "type": "string", + "enum": [ + "Anode", + "Capture", + "Commercial", + "Dewater", + "Domestic", + "Drainage", + "Geothermal", + "Heat Reservoir", + "Industrial", + "Injection", + "Irrigation", + "Monitoring", + "Observation", + "Oil/Gas Production", + "Other", + "Piezometer", + "Recharge", + "Remediation", + "Repressurization", + "Seismic", + "Soil Vapor Extraction", + "Soil Vapor Monitoring", + "Test Hole", + "Waste Disposal", + "Water Quality Assessment", + "Water Supply/Production", + "Well-Temporary", + "Withdrawal of Water" + ], + "maxLength": 24 +} \ No newline at end of file diff --git a/schemas/data/src/values/WellUseType.primary.json b/schemas/data/src/values/WellUseType.primary.json new file mode 100644 index 00000000..57a22a82 --- /dev/null +++ b/schemas/data/src/values/WellUseType.primary.json @@ -0,0 +1,37 @@ +{ + "$id": "https://datastream.org/schema/data/values/WellUseType.strict.json", + "title": "Well Type", + "description": "", + "type": "string", + "enum": [ + "Anode", + "Capture", + "Commercial", + "Dewater", + "Domestic", + "Drainage", + "Geothermal", + "Heat Reservoir", + "Industrial", + "Injection", + "Irrigation", + "Monitoring", + "Observation", + "Oil/Gas Production", + "Other", + "Piezometer", + "Recharge", + "Remediation", + "Repressurization", + "Seismic", + "Soil Vapor Extraction", + "Soil Vapor Monitoring", + "Test Hole", + "Waste Disposal", + "Water Quality Assessment", + "Water Supply/Production", + "Well-Temporary", + "Withdrawal of Water" + ], + "maxLength": 24 +} \ No newline at end of file diff --git a/schemas/data/test/build.js b/schemas/data/test/build.js new file mode 100644 index 00000000..a8b3800d --- /dev/null +++ b/schemas/data/test/build.js @@ -0,0 +1,31 @@ +import test from 'ava' + +import { toFriendlyName } from '../bin/build-lib.js' + +test('toFriendlyName › Should convert PascalCase to friendly name', (t) => { + t.is(toFriendlyName('AquiferCode'), 'Aquifer Code') +}) + +test('toFriendlyName › Should convert camelCase to friendly name', (t) => { + t.is(toFriendlyName('aquiferCode'), 'aquifer Code') +}) + +test('toFriendlyName › Should handle acronyms followed by words', (t) => { + t.is(toFriendlyName('WellIDContext'), 'Well ID Context') +}) + +test('toFriendlyName › Should handle multiple word boundaries', (t) => { + t.is(toFriendlyName('AquiferUnitPorosityType'), 'Aquifer Unit Porosity Type') +}) + +test('toFriendlyName › Should handle long field names', (t) => { + t.is(toFriendlyName('ActivityDepthAltitudeReferencePoint'), 'Activity Depth Altitude Reference Point') +}) + +test('toFriendlyName › Should handle single word', (t) => { + t.is(toFriendlyName('Sample'), 'Sample') +}) + +test('toFriendlyName › Should handle consecutive acronyms', (t) => { + t.is(toFriendlyName('XMLHTTPRequest'), 'XMLHTTP Request') +}) \ No newline at end of file From 3e585e35f7c5ffccbc1b329ab30ffd1de03b595b Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 21 Jan 2026 15:10:29 -0500 Subject: [PATCH 06/51] feat: add/update allowed values for groundwater --- schemas/data/bin/build-lib.js | 1 + .../data/src/addition/AquiferUnitName.json | 576 +++++++++++++++++ .../data/src/addition/CharacteristicName.json | 3 +- .../src/addition/MonitoringLocationType.json | 2 +- ...oringLocationVerticalCollectionMethod.json | 1 + ...tionVerticalCoordinateReferenceSystem.json | 1 + .../SampleCollectionEquipmentName.json | 8 + .../SampleCollectionMethodContext.json | 11 + schemas/data/src/addition/WellUseType.json | 9 + schemas/data/src/backend.json | 4 +- schemas/data/src/definitions.json | 10 +- schemas/data/src/extract.json | 2 +- schemas/data/src/frontend.json | 3 +- .../data/src/locales/ActivityMediaName.json | 10 + .../data/src/locales/CharacteristicName.json | 20 + .../src/locales/MonitoringLocationType.json | 90 +++ .../SampleCollectionEquipmentName.json | 70 +++ schemas/data/src/primary.json | 2 +- .../data/src/subset/ActivityMediaName.json | 1 + schemas/data/src/subset/AquiferType.json | 1 + .../data/src/subset/CharacteristicName.json | 2 + .../src/subset/MonitoringLocationType.json | 9 + ...oringLocationVerticalCollectionMethod.json | 20 + ...tionVerticalCoordinateReferenceSystem.json | 1 + .../subset/SampleCollectionEquipmentName.json | 9 +- .../subset/SampleCollectionMethodContext.json | 14 + schemas/data/src/subset/WellUseType.json | 14 + .../src/values/ActivityMediaName.primary.json | 1 + .../src/values/AquiferUnitName.legacy.json | 583 ++++++++++++++++++ .../src/values/AquiferUnitName.primary.json | 583 ++++++++++++++++++ .../src/values/CharacteristicName.legacy.json | 1 + .../values/CharacteristicName.primary.json | 2 + .../values/MonitoringLocationType.legacy.json | 4 + .../MonitoringLocationType.primary.json | 9 + ...cationVerticalCollectionMethod.legacy.json | 1 + ...ationVerticalCollectionMethod.primary.json | 1 + ...ticalCoordinateReferenceSystem.legacy.json | 4 +- ...icalCoordinateReferenceSystem.primary.json | 6 +- .../SampleCollectionEquipmentName.legacy.json | 6 + ...SampleCollectionEquipmentName.primary.json | 7 + .../SampleCollectionMethodContext.legacy.json | 9 + ...SampleCollectionMethodContext.primary.json | 43 +- .../data/src/values/WellUseType.legacy.json | 9 +- .../data/src/values/WellUseType.primary.json | 34 +- 44 files changed, 2121 insertions(+), 76 deletions(-) create mode 100644 schemas/data/src/addition/AquiferUnitName.json create mode 100644 schemas/data/src/addition/MonitoringLocationVerticalCollectionMethod.json create mode 100644 schemas/data/src/addition/MonitoringLocationVerticalCoordinateReferenceSystem.json create mode 100644 schemas/data/src/addition/SampleCollectionEquipmentName.json create mode 100644 schemas/data/src/addition/SampleCollectionMethodContext.json create mode 100644 schemas/data/src/addition/WellUseType.json create mode 100644 schemas/data/src/subset/AquiferType.json create mode 100644 schemas/data/src/subset/MonitoringLocationVerticalCollectionMethod.json create mode 100644 schemas/data/src/subset/MonitoringLocationVerticalCoordinateReferenceSystem.json create mode 100644 schemas/data/src/subset/SampleCollectionMethodContext.json create mode 100644 schemas/data/src/subset/WellUseType.json create mode 100644 schemas/data/src/values/AquiferUnitName.legacy.json create mode 100644 schemas/data/src/values/AquiferUnitName.primary.json diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index e813e60b..19558d7c 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -25,6 +25,7 @@ export const subsetOnly = [ // Custom fields (non-WQX) that need value files generated export const custom = [ + "AquiferUnitName", "WellIDContext", "AquiferCode", "AquiferUnitPorosityType", diff --git a/schemas/data/src/addition/AquiferUnitName.json b/schemas/data/src/addition/AquiferUnitName.json new file mode 100644 index 00000000..e45abded --- /dev/null +++ b/schemas/data/src/addition/AquiferUnitName.json @@ -0,0 +1,576 @@ +[ + "Abitibi Dykes", + "Alberta Group", + "Algonquin Aquifer Complex", + "Algonquin Basin", + "Algonquin Shoreline", + "Alliston Aquifer Complex", + "Alviston-Rutherford Aquifer", + "Amabel-Lockport-Guelph Hydrogeologic Unit", + "Amherstburge Aquifer", + "Amos Group", + "Ancaster-West Flamborough Aquifer", + "Annapolis-Cornwallis valleys Aquifer", + "Ardkenneth Member", + "Arthur-Mount Forest Aquifer", + "Assiniboine delta Aquifer", + "Atha Aquifer", + "Ausable Aquifer", + "Baby Group", + "Balfron Formation", + "Banff Formation", + "Basal Aquifer", + "basal clastic unit (Winnipeg) Aquifer", + "Bass Island Hydrogeologic Unit", + "Batholith of Guyenne", + "Batholith of La Corne", + "Battle Formation", + "Battleford Formation Stratified Deposits", + "Bearpaw Formation", + "Bearpaw Sand Members Aquifer", + "Beaverville Lake Group", + "Bellefeuille River Pluton", + "Belly River Formation", + "Belly River Group", + "Bernetz Intrusion", + "Berry Pluto", + "Beverly-Onoway channel Complex", + "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blood Reserve Formation", + "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Bois Blanc Hydrogeologic Unit", + "Boissevain Formation", + "Bonnyville U1 Sand", + "Bonnyville U1 Till", + "Bonnyville U2 Till", + "Boss Point Formation", + "Bothwell Aquifer", + "Bounded Channel Aquifers", + "Bourget Aquifer", + "Bourlamaque Batholith", + "Bow Island Formation", + "Bredenbury Aquifer", + "Bronson Lake", + "Brownsville Local Aquifer", + "Buried valley/blanket Aquifers", + "Calamité River Pluton", + "Caledon-Grand River Outwash Aquifer", + "Calgary Lethbridge Corridor HSU C Aquitard", + "Calgary Lethbridge Corridor HSU S1 Aquifer", + "Calgary Lethbridge Corridor HSU S2 Aquifer", + "Camac Formation", + "Canning Aquitard", + "Canning Till Aquitard", + "Carbonate rock Aquifer", + "Carboniferous basin Aquifer", + "Cardium Formation", + "Caste Formation", + "Cataract Group Hydrogeologic Unit", + "Catfish Creek Aquifer", + "Cedar Grove Aquifer", + "Central Catfish Creek Aquifer", + "Central South Nation Aquifer Complex", + "Champlain Aquifer", + "Channel Aquifer 1", + "Channel Aquifer 2", + "Channel Aquifer 3", + "Channel Aquitard 1", + "Channel Aquitard 2", + "Chateauguay Aquifer", + "Chauidiere Aquifer", + "Chesley Aquifer", + "Chicobi Group", + "Chu Íntthi Aquifer", + "Clarence Creek Aquifer", + "Clearwater Formation", + "Clermont-Disson Formation", + "Clinton Group Hydrogeologic Unit", + "Cobble Hill Aquifer", + "Coldstream Aquifer", + "Colombourg Batholith", + "Colorado Group", + "Contact Aquifer", + "Cooking Lake sediments", + "Credit River Aquifer", + "Crowsnest River Alluvial Aquifer", + "Cruikshank Member", + "Cruikshank-Thelma Member", + "Cumberland Group", + "Cypress Hills Formation", + "Dalmeny Aquifer", + "Decelles Reservoir Batholith", + "Deguisier Formation", + "Del Bonita Gravels", + "Demaine Member", + "Detroit River Group Hydrogeologic Unit", + "Don Formation", + "Drumheller channel Complex", + "Dubuisson Formation", + "Dundalk Aquifer", + "Dundee Hydrogeologic Unit", + "Dunvegan Formation", + "Duparquet Formation", + "Durham Aquifer", + "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", + "East and Middle Sixteen Mile Aquifer", + "Eastend Formation", + "Eastend-Cypress Hills Aquifer", + "Eastend-Ravenscrag Aquifer", + "Eastend-Wood Member Aquifer", + "Edson burried-valley Aquifer", + "Egmond Bay Formation", + "Elgin-Southampton Aquifer", + "Elk Point Group", + "Empress Formation", + "Empress Group Aquifers", + "Erie Interstadial Deposits", + "Ethel Lake Formation", + "Etobicoke Aquifer", + "Fielding Aquifer", + "Figuery Group", + "Flavrian Pluto", + "Flesherton Aquifer", + "Floral Sands and Gravels", + "Fontfill Aquifer Complex", + "Foremost Formation", + "Forestry Farm Aquifer", + "Fort St. John Group", + "Fourchu Group", + "Fractured Aquifers - Gulf Islands", + "Fraser Canyon", + "Fraser Lowlands Aquifer", + "Fraser Plateau Lava", + "Frenchman Formation", + "Frenchman Whitemud Eastend Formation", + "Fulford Aquifer", + "Fundy Group", + "Ganges Harbour", + "Georgeville Group", + "Gibsons/SCRD Granthams Landing/Elphinstone", + "Glaciolacustrine Aquifer Complex", + "Glemmore Basal Aquifer", + "Gleneden", + "Granada Formation", + "Grand Centre Formation", + "Grand Forks", + "Grand Rapids Formation", + "Grand River Aquifer", + "Grand River Basin Aquifer", + "Grand River Outwash Deposits", + "Grand River Valley Basinal Deposits", + "Grant Hill", + "Greater Kelowna Aquifer", + "Greatlakean Stade Deposits", + "Green River Aquifer", + "Greendale Deep", + "Greenwood Aquifer", + "Grimshaw Gravels Aquifer", + "Guichon Creek", + "Haans Creek to Blain Creek - Haida Gwaii", + "Hagan Aquifer", + "Haida/Lawnhill", + "Haig", + "Halton Till", + "Hamilton Group Hydrogeologic Unit", + "Hand Hills Formation", + "Hanover Aquifer", + "Harrow Aquifer", + "Hatzic Prairie", + "Hay River Formation", + "Haynes Aquifer", + "Heather Bank", + "Hebecourt Formation", + "Heva Formation", + "Hillsborough Formation", + "Hockley Valley Aquifer", + "Holstein Aquifer", + "Holt Aquifer Complex", + "Hopington AB", + "Hopington C", + "Horseshoe Canyon Formation", + "Horton Group", + "Houston Bedrock", + "Hullcar Aquifer", + "Interglacial Aquifers", + "Joeyaska Deep", + "Joeyaska Shallow", + "Judith River Aquifer", + "Kame Outwash Aquifer Complex", + "Karmutsen", + "Kawkawa Lake", + "Keating", + "Kettle Point Hydrogeologic Unit", + "Kildare Formation", + "Kingsvale", + "Kipawa Formation", + "Kleinburg Aquifer", + "Koksilah River Valley", + "Kwinshatin Intertill", + "La Morandiere Group", + "La Motte Batholith", + "La Motte-Vassan Formation", + "Lacombe Aquitard", + "Lake Abitibi-Okikodesik Batholith", + "Lake Algonquin Sand Aquifer", + "Lake Arthur Group", + "Lake Peel Deltaic Aquifer", + "Lake Schomberg and Algonquin Aquifer", + "Lake Schomberg and Algonquin Aquitard", + "Lancaster-Cornwall Aquifer", + "Landrienne Formation", + "Langdale/Hopkins", + "Langdale/Hopkins Landing", + "Langley Upland", + "LD Basal Till", + "LD Local Aquifers", + "LD Lower Aquifer", + "LD Middle Till", + "LD Upper Till", + "Lea Park Formation", + "Leamington Aquifer", + "Lincoln Aquifer", + "Little Qualicum River", + "Local Aquifer 2", + "Local Aquitard 1", + "Lookout Ridge", + "Lorrain Formation", + "Lower Bousquet Formation", + "Lower Brougham Aquifer", + "Lower Cassidy", + "Lower Catfish Creek Till Aquitard", + "Lower Cherryville", + "Lower Chinguacousy Aquifer", + "Lower Coquihalla Canyon", + "Lower Cowichan River A", + "Lower Cowichan River C", + "Lower Dundurn Formation Stratified Deposits", + "Lower Erie Phase Aquifer", + "Lower Erie Phase Aquitard", + "Lower Floral Formation Stratified Deposits", + "Lower Gates River", + "Lower Markham Aquifer", + "Lower Maryhill Till", + "Lower Merritt", + "Lower Nechako River", + "Lower Nicola", + "Lower Nicola Outwash", + "Lower Shuswap Deep Aquifer", + "Lower Shuswap River Aquifer", + "Lower Thorncliffe Aquifer", + "Lower Thorncliffe Aquitard", + "Lower Unionville Aquifer", + "Lower Victoria Aquifer", + "Lowland Aquifer Complex", + "Lumby - Lower Aquifer", + "Lumby - Upper Aquifer", + "Łots'an Aquifer", + "Mabou Group", + "Mackinaw Interstadial Deposits", + "Malahat Ridge", + "Malcolm Island", + "Mannvile Group", + "Maple Aquifer", + "Mara Aquifer", + "Marble Hill Unconsolidated", + "Marie Creek Formation", + "Markdale Aquifer", + "Masset", + "Matachewan Dyke Swarm", + "Matador Member", + "Mauricie Aquifer", + "McDougall Creek Deltaic", + "McMillan Island", + "McMurray Formation", + "Meaford Aquifer", + "Meguma SuperGroup", + "Meltwater Channel Hydrogeologic Unit", + "Mennon Formation Stratified Deposits", + "Mennon Sand", + "Middle Erie Phase Aquifer", + "Middle Maryhill Till", + "Middle Merritt", + "Middle Thorncliffe Aquifer", + "Middle Thorncliffe Aquitard", + "Middle Waterloo Moraine Aquifer & Equivalents", + "Milk River Aquifer", + "Mill Bay", + "Mine Hunter Group", + "Minesing Basin Transgressive Deposits", + "Mirabel Aquifer", + "Mission Creek Aquifer", + "Mont-Brun Formation", + "Montney Hydrostratigraphic Unit", + "Morien Group", + "Mount Albert Aquifer Complex", + "Mount Ozzard Aquifer", + "Mount Tom Aquifer", + "Muriel Lake", + "Nanaimo Group, Campbell River to Courtney", + "Nanaimo Lowlands Aquifer", + "Nechako Buried Valley", + "Newmarket Till", + "Niagra-on-the-Lake Aquifer", + "Nicomekl-Serpentine", + "Nicomen Slough", + "Nissouri Stadial Deposits", + "Nivek", + "Norfolk Sand Plain Aquifer", + "North Campbell River Aquifer", + "North Central Saanich", + "North Hope", + "North Houston Aquifer", + "North Mountain Formation", + "North Nechako Terrace", + "North Salt Spring Island", + "North-Central Salt Spring Island", + "Notre Dame Aquifer", + "O Avenue Aquifer", + "Oak Ridges Moraine Aquifer", + "Odanah Member", + "Odanah Shale Aquifer", + "Okanagan Landing Deep Aquifer", + "Okanagan Valley Aquifer", + "O'Keefe Aquifer", + "O'Keefe Basal Aquifer", + "Oldcastle Aquifer", + "Opasatica Gneiss", + "Orangeville Aquifer Complex", + "Orby Head Formation", + "Oro Moraine Aquifer Complex", + "Oro-Medonte Aquifer", + "Osoyoos West", + "Ottawa Group Hydrogeologic Unit", + "Outlook Member", + "Owl Creek", + "Owl Ridge Aquifer", + "Oxarart-Cruikshank Members", + "Oyster River", + "Pacheedaht", + "Pakowki Formation", + "Palmarolle Pluton", + "Paris Aquifer", + "Paris moraine Aquitard", + "Paskapoo Formation", + "Paul's Basin", + "Peace River Formation", + "Pickering Aquifer", + "Pictou Group", + "Pineview", + "Plantagenet Aquifer", + "Pluto of Amos", + "Pluto of Lake Dufault", + "Pluto of Lake Fréchette", + "Pluto of the Lake of Sixteen", + "Pluto of The Queen", + "Pluto of Trécesson", + "Pluto of Val-St-Gilles", + "Pluto of Villemontel", + "Pontiac Group", + "Porcupine Hills Formation Aquifers", + "Port Bruce Phase Aquitard", + "Port Bruce Stadial Deposits", + "Port Clements", + "Port Colborne Aquifer", + "Port Huron Stadial Deposits", + "Port McNeill East Aquifer", + "Port McNeill East Bedrock", + "Port McNeill West Aquifer", + "Portneuf Aquifer", + "Pottery Road Formation", + "Poularies Batholith", + "Powell Pluton", + "Powers Ck Deltaic", + "Precambrian Hydrogeologic Unit", + "Pre-Canning Aquifers", + "Pre-Canning Aquitard", + "Pre-Catfish Aquifers", + "Preissac Batholith", + "Priceville Aquifer", + "Puntledge/ Cumberland", + "Puslinch Aquifer", + "Quadra Central", + "Quadra South", + "Queenston Hydrogeologic Unit", + "Quinsam to Stories Beach", + "Ravenscrag Formation", + "Rawlings Lake", + "Red Deer River channel Complex", + "Regional Aquifer 3", + "Regional Aquitard 3", + "Remigny Batholith", + "Reneault-Dufresnoy Formation", + "Ribstone Creek Member", + "Richelieu Aquifer", + "Richibucto Formation", + "Rideau Front Aquifer", + "Roberts Creek", + "Rockcliffe Hydrogeologic Unit", + "Rockland Aquifer", + "Rosebery", + "Rouyn-Pelletier Formation", + "Ryder Upland A", + "Ryder Upland B", + "Ryder Upland C", + "Salina Hydrogeologic Unit", + "Salmon River", + "Salmon River - Lower Aquifer", + "Salmon River - Upper Aquifer", + "Sand Dunes Aquifer", + "Sand River Formation", + "Sandilands Aquifer", + "Sandspit - Haida Gwaii", + "Sardis-Vedder", + "Sarsfield Aquifer", + "Saskatoon Group Aquifers", + "Scarborough Formation", + "Schomberg Aquifer Complex", + "Scollard Formation", + "Sechelt/Wakefield Creek", + "Seton Portage", + "Shannon Lake", + "Shawnigan Lake", + "Shuswap Highlands Aquifer", + "Simcoe Group Hydrogeologic Unit", + "Similkameen River Aquifer", + "Sinkut Mountain North Surficial", + "Skidgate/Queen Charlotte", + "Smoky Group", + "Sooke-Metchosin", + "South Central Elgin Aquifer", + "South Fraser Lake", + "South Lake Simard Batholith", + "South London Aquifer", + "South Nechako Terrace", + "South of Aldergrove", + "South of Hopington", + "South of Murrayville AC", + "South of Murrayville B", + "South Salt Spring Island", + "South Saskatchewan Alluvium", + "South Valemont", + "South Vanderhoof", + "South Vernon Aquifer", + "South-Central Salt Spring Island", + "Spallumcheen Aquifer", + "Spallumcheen Basal Aquifer", + "Spences Bridge", + "Sperling", + "Spius Creek West of Canford", + "St. Catharines Aquifer", + "St. George Aquifers", + "St. Mary River Formation", + "St. Thomas Moraine Local Aquifers", + "Stavely Aquifer", + "Stellako", + "Stirling Group", + "Stoughton-Roquemaure Group", + "Stumbles Creek", + "Stumbles Creek Aquifer", + "Stump Lake Aquifer", + "Sugar Lake", + "Sumas Prairie", + "Sumas Prairie North", + "Sunchild Aquifer", + "Sunnybrae", + "Sunnybrook Drift", + "Surficial stratified drift Aquifers", + "Sutherland Group Aquifers", + "Swan Lake Aquifer", + "Swan River Formation", + "Tachick Lake", + "Tappen", + "Taschereau Batholith", + "Tathlina Formation", + "Tessier Aquifer", + "Thornbury Aquifer", + "Thorncliffe Formation", + "Thornill Aquifer", + "Thornton Sand Aquifer", + "Tillsonburg Aquifer", + "Timiskaming Group", + "Tlell", + "Topley", + "Trinity Valley", + "Tsolum River, North of Courtney", + "Tuhok Aquifer", + "Turtle Mountain Formation", + "Twin Falls Formation", + "Two Creeks Interstadial Deposits", + "Tyconnell Formation", + "Tyner Valley Aquifer", + "Ucluelet Peninsula", + "Ucluelet, Lost Show", + "Undivided Cumberland Group", + "Undivided Pictou Group", + "Unicola", + "Upland Aquifer Complex", + "Upland Gravel", + "Upper and Lower Gloucester Aquifers", + "Upper and Lower Nepean-Kemptville Aquifers", + "Upper and Lower West Nepean Aquifers", + "Upper Aquifer 1", + "Upper Bousquet Formation", + "Upper Brougham Aquifer", + "Upper Bulkley Alluvial", + "Upper Catfish Creek Till Aquitard", + "Upper Cherryville", + "Upper Chinguacousy Aquifer", + "Upper Cretaceous sands Aquifer", + "Upper Dundurn Formation Stratified Deposits", + "Upper Erie Phase Aquifer", + "Upper Erie Phase Aquitard", + "Upper Floral Formation Stratified Deposits", + "Upper Gates River", + "Upper Lea Park Formation", + "Upper Markham Aquifer", + "Upper Maryhill Till", + "Upper Merritt", + "Upper Thames Aquifer", + "Upper Thorncliffe Aquifer", + "Upper Thorncliffe Aquitard", + "Upper Unionville Aquifer", + "Upper Victoria Aquifer", + "Upper Waterloo Moraine Aquifer", + "Val d'Or Formation", + "Valens Outwash Aquifer", + "Vanderhoof Alluvial", + "Vedder Crossing", + "Vedder Mountain NW", + "Vedder Mountain SE", + "Vellore Aquifer", + "Vernon Aquifer", + "Viking Formation", + "Wabamun Formation", + "Wainfleet Aquifer", + "Walker Hook", + "Walkerton Aquifer", + "Wallaceburg Aquifer", + "Wallacetown Formation", + "Wapiti Formation", + "Wark-Colquitz", + "Warman Formation Stratified Deposits", + "Waterloo Moraine Aquifer", + "Wentworth Aquifer", + "Wentworth Till/Aquitard", + "West Carlton Aquifer", + "West Cluculz Lake", + "West Langley", + "West of Aldergrove", + "West of Merritt", + "West Saanich Road", + "West Sechelt", + "Westwold", + "Whitemud Formation", + "Whittlesey Aquifer", + "Whittlesey Clay/Aquitard", + "Whittlesey Sand", + "Willow Creek alluvial Aquifer", + "Willow Creek Formation Aquifer", + "Windsor Group", + "Winnipeg Formation", + "Wood Mountain and Mount Washington", + "Woodbend Group", + "Woodbridge Aquifer", + "Yonge Street Aquifer", + "York Till" +] diff --git a/schemas/data/src/addition/CharacteristicName.json b/schemas/data/src/addition/CharacteristicName.json index fed39a39..89d83c48 100644 --- a/schemas/data/src/addition/CharacteristicName.json +++ b/schemas/data/src/addition/CharacteristicName.json @@ -16,5 +16,6 @@ "m- & p-Chlorophenol", "Phosphorus, elemental", "p-Chlorophenol", - "Thorium" + "Thorium", + "Water level elevation" ] diff --git a/schemas/data/src/addition/MonitoringLocationType.json b/schemas/data/src/addition/MonitoringLocationType.json index 2001c752..623da7da 100644 --- a/schemas/data/src/addition/MonitoringLocationType.json +++ b/schemas/data/src/addition/MonitoringLocationType.json @@ -1 +1 @@ -["Lake/Pond", "Unspecified", "Wetland"] +["Dug Well", "Lake/Pond", "Multilevel Well", "Nested Well", "Piezometer", "Unspecified", "Wetland"] diff --git a/schemas/data/src/addition/MonitoringLocationVerticalCollectionMethod.json b/schemas/data/src/addition/MonitoringLocationVerticalCollectionMethod.json new file mode 100644 index 00000000..31ffb12d --- /dev/null +++ b/schemas/data/src/addition/MonitoringLocationVerticalCollectionMethod.json @@ -0,0 +1 @@ +["Handheld GPS - Positioning Method Unspecified"] diff --git a/schemas/data/src/addition/MonitoringLocationVerticalCoordinateReferenceSystem.json b/schemas/data/src/addition/MonitoringLocationVerticalCoordinateReferenceSystem.json new file mode 100644 index 00000000..5443de86 --- /dev/null +++ b/schemas/data/src/addition/MonitoringLocationVerticalCoordinateReferenceSystem.json @@ -0,0 +1 @@ +["CGVD2013", "CGVD28"] diff --git a/schemas/data/src/addition/SampleCollectionEquipmentName.json b/schemas/data/src/addition/SampleCollectionEquipmentName.json new file mode 100644 index 00000000..c29d09bb --- /dev/null +++ b/schemas/data/src/addition/SampleCollectionEquipmentName.json @@ -0,0 +1,8 @@ +[ + "Air line", + "Bailer", + "Hydrasleeve", + "Snap sampler", + "Water level meter", + "Wetted tape" +] diff --git a/schemas/data/src/addition/SampleCollectionMethodContext.json b/schemas/data/src/addition/SampleCollectionMethodContext.json new file mode 100644 index 00000000..46acb7fd --- /dev/null +++ b/schemas/data/src/addition/SampleCollectionMethodContext.json @@ -0,0 +1,11 @@ +[ + "AB_AEP", + "AB_AGS", + "BC_MOE", + "ISO", + "NL_ECCC", + "NS_DNR", + "NS_ECC", + "PROPRIETARY", + "QC_MOE" +] diff --git a/schemas/data/src/addition/WellUseType.json b/schemas/data/src/addition/WellUseType.json new file mode 100644 index 00000000..6376d91a --- /dev/null +++ b/schemas/data/src/addition/WellUseType.json @@ -0,0 +1,9 @@ +[ + "Aquaculture", + "Bottling", + "Livestock", + "Monitoring - Ambient", + "Monitoring - Other", + "Public Supply - Municipal", + "Public Supply - Other" +] diff --git a/schemas/data/src/backend.json b/schemas/data/src/backend.json index 76e784f4..07fbeff0 100644 --- a/schemas/data/src/backend.json +++ b/schemas/data/src/backend.json @@ -85,8 +85,8 @@ "transform": ["trim", "toEnumCase"] }, "AquiferUnitName": { - "$ref": "./definitions.json#/definitions/AquiferUnitName", - "transform": ["trim"] + "$ref": "./definitions.json#/definitions/AquiferUnitNameLoose", + "transform": ["trim", "toEnumCase"] }, "AquiferType": { "$ref": "./definitions.json#/definitions/AquiferTypeLoose", diff --git a/schemas/data/src/definitions.json b/schemas/data/src/definitions.json index b7ba6e76..56f6c8b7 100644 --- a/schemas/data/src/definitions.json +++ b/schemas/data/src/definitions.json @@ -105,11 +105,11 @@ "AquiferCodeLoose": { "$ref": "./values/AquiferCode.legacy.json" }, - "AquiferUnitName": { - "title": "Aquifer Unit Name", - "description": "A name that designates the aquifer or geological unit from which the groundwater sample was collected or the well was screened within.", - "$ref": "#/definitions/string", - "maxLength": 120 + "AquiferUnitNameStrict": { + "$ref": "./values/AquiferUnitName.primary.json" + }, + "AquiferUnitNameLoose": { + "$ref": "./values/AquiferUnitName.legacy.json" }, "AquiferTypeStrict": { "$ref": "./values/AquiferType.primary.json" diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index 74286042..5ccd6d52 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -71,7 +71,7 @@ "$ref": "./definitions.json#/definitions/AquiferCodeStrict" }, "AquiferUnitName": { - "$ref": "./definitions.json#/definitions/AquiferUnitName" + "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict" }, "AquiferType": { "$ref": "./definitions.json#/definitions/AquiferTypeStrict" diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 1d252cbf..3a2d9d53 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -82,7 +82,8 @@ "transform": ["trim", "toEnumCase"] }, "AquiferUnitName": { - "$ref": "./definitions.json#/definitions/AquiferUnitName" + "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict", + "transform": ["trim", "toEnumCase"] }, "AquiferType": { "$ref": "./definitions.json#/definitions/AquiferTypeStrict", diff --git a/schemas/data/src/locales/ActivityMediaName.json b/schemas/data/src/locales/ActivityMediaName.json index 82cefc1b..911d29a1 100644 --- a/schemas/data/src/locales/ActivityMediaName.json +++ b/schemas/data/src/locales/ActivityMediaName.json @@ -87,6 +87,16 @@ "en": "Referring to suspended sediment in surface water and the top layer of settled sediment. Often this media is collected using dredges, short cores, sediment traps, and suspended sediment samplers.", "fr": "Désigne les sédiments en suspension dans les eaux de surface et la couche supérieure des sédiments déposés. Ce milieu est souvent recueilli à l’aide de dragues, de carottes courtes, de pièges à sédiments et d’échantillonneurs de sédiments en suspension." } + }, + "Groundwater": { + "name": { + "en": "Groundwater", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/CharacteristicName.json b/schemas/data/src/locales/CharacteristicName.json index c78a791b..f262f561 100644 --- a/schemas/data/src/locales/CharacteristicName.json +++ b/schemas/data/src/locales/CharacteristicName.json @@ -13697,6 +13697,26 @@ "en": null, "fr": null } + }, + "Water level elevation": { + "name": { + "en": "Water level elevation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Water level in well, depth from a reference point": { + "name": { + "en": "Water level in well, depth from a reference point", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/MonitoringLocationType.json b/schemas/data/src/locales/MonitoringLocationType.json index 4a2e8179..094f95ba 100644 --- a/schemas/data/src/locales/MonitoringLocationType.json +++ b/schemas/data/src/locales/MonitoringLocationType.json @@ -157,6 +157,96 @@ "en": null, "fr": null } + }, + "Borehole": { + "name": { + "en": "Borehole", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dug Well": { + "name": { + "en": "Dug Well", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Multilevel Well": { + "name": { + "en": "Multilevel Well", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nested Well": { + "name": { + "en": "Nested Well", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Other-Ground Water": { + "name": { + "en": "Other-Ground Water", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Piezometer": { + "name": { + "en": "Piezometer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Seep": { + "name": { + "en": "Seep", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sump": { + "name": { + "en": "Sump", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Well": { + "name": { + "en": "Well", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/SampleCollectionEquipmentName.json b/schemas/data/src/locales/SampleCollectionEquipmentName.json index 45605fef..a483e060 100644 --- a/schemas/data/src/locales/SampleCollectionEquipmentName.json +++ b/schemas/data/src/locales/SampleCollectionEquipmentName.json @@ -397,6 +397,76 @@ "en": null, "fr": null } + }, + "Air line": { + "name": { + "en": "Air line", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bailer": { + "name": { + "en": "Bailer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hydrasleeve": { + "name": { + "en": "Hydrasleeve", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Snap sampler": { + "name": { + "en": "Snap sampler", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tubing": { + "name": { + "en": "Tubing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Water level meter": { + "name": { + "en": "Water level meter", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wetted tape": { + "name": { + "en": "Wetted tape", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index ed721977..6e0ec816 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -66,7 +66,7 @@ "$ref": "./definitions.json#/definitions/AquiferCodeStrict" }, "AquiferUnitName": { - "$ref": "./definitions.json#/definitions/AquiferUnitName" + "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict" }, "AquiferType": { "$ref": "./definitions.json#/definitions/AquiferTypeStrict" diff --git a/schemas/data/src/subset/ActivityMediaName.json b/schemas/data/src/subset/ActivityMediaName.json index f9794cc5..c4e86676 100644 --- a/schemas/data/src/subset/ActivityMediaName.json +++ b/schemas/data/src/subset/ActivityMediaName.json @@ -1,5 +1,6 @@ [ "Ambient Air", + "Groundwater", "Ocean Water", "Porewater", "Rainwater", diff --git a/schemas/data/src/subset/AquiferType.json b/schemas/data/src/subset/AquiferType.json new file mode 100644 index 00000000..307cab95 --- /dev/null +++ b/schemas/data/src/subset/AquiferType.json @@ -0,0 +1 @@ +["CONFINED", "SEMI-CONFINED", "UNCONFINED"] diff --git a/schemas/data/src/subset/CharacteristicName.json b/schemas/data/src/subset/CharacteristicName.json index 860c4215..0c1bf06d 100644 --- a/schemas/data/src/subset/CharacteristicName.json +++ b/schemas/data/src/subset/CharacteristicName.json @@ -1365,6 +1365,8 @@ "Volatile suspended solids", "Water level", "Water level (probe)", + "Water level elevation", + "Water level in well, depth from a reference point", "Weak, dissociable cyanide", "Wetted Width", "White ice thickness", diff --git a/schemas/data/src/subset/MonitoringLocationType.json b/schemas/data/src/subset/MonitoringLocationType.json index 705f5d3d..aa21c2df 100644 --- a/schemas/data/src/subset/MonitoringLocationType.json +++ b/schemas/data/src/subset/MonitoringLocationType.json @@ -1,17 +1,26 @@ [ "Atmosphere", + "Borehole", "Canal Drainage", "Canal Irrigation", "Canal Transport", + "Dug Well", "Estuary", "Great Lake", "Lake/Pond", + "Multilevel Well", + "Nested Well", "Ocean", + "Other-Ground Water", + "Piezometer", "Pond-Stormwater", "Reservoir", "River/Stream", + "Seep", "Spring", "Storm Sewer", + "Sump", "Unspecified", + "Well", "Wetland" ] diff --git a/schemas/data/src/subset/MonitoringLocationVerticalCollectionMethod.json b/schemas/data/src/subset/MonitoringLocationVerticalCollectionMethod.json new file mode 100644 index 00000000..34e06590 --- /dev/null +++ b/schemas/data/src/subset/MonitoringLocationVerticalCollectionMethod.json @@ -0,0 +1,20 @@ +[ + "Altimetry", + "Classical Surveying Techniques", + "Digital Elevation Model", + "GPS Carrier Phase Kinematic Relative Position", + "GPS Carrier Phase Static Relative Position", + "GPS Code (Pseudo Range) Differential", + "GPS Code (Pseudo Range) Precise Position", + "GPS Code (Pseudo Range) Standard Position (SA Off)", + "GPS Code (Pseudo Range) Standard Position (SA On)", + "Handheld GPS - Positioning Method Unspecified", + "Leveling-Non Bench Mark Control Points", + "Light Detection And Ranging (LiDAR)", + "Other", + "Photogrammetric", + "Precise Leveling-Bench Mark", + "Topographic Map Interpolation", + "Trigonometric Leveling", + "Unknown" +] diff --git a/schemas/data/src/subset/MonitoringLocationVerticalCoordinateReferenceSystem.json b/schemas/data/src/subset/MonitoringLocationVerticalCoordinateReferenceSystem.json new file mode 100644 index 00000000..6981d7b6 --- /dev/null +++ b/schemas/data/src/subset/MonitoringLocationVerticalCoordinateReferenceSystem.json @@ -0,0 +1 @@ +["CGVD2013", "CGVD28", "NAVD88", "NGVD29", "OTHER", "UNKWN"] diff --git a/schemas/data/src/subset/SampleCollectionEquipmentName.json b/schemas/data/src/subset/SampleCollectionEquipmentName.json index 68a33aef..6c499c2f 100644 --- a/schemas/data/src/subset/SampleCollectionEquipmentName.json +++ b/schemas/data/src/subset/SampleCollectionEquipmentName.json @@ -1,11 +1,14 @@ [ + "Air line", + "Bailer", "Beta sampler", "Bucket", "DH-81", "DH-95", "Diffusion Gradient in Thin Film", - "Kemmerer Bottle", "Gravity Corer (Generic)", + "Hydrasleeve", + "Kemmerer Bottle", "Nansen Bottle", "Niskin Bottle", "Osterberg Piston Sampler", @@ -26,16 +29,20 @@ "Sediment sub-core", "Sediment Trap", "Semipermeable Membrane Device", + "Snap sampler", "Syringe", "Test strip", + "Tubing", "Turbidimeter", "Turbidity Tube", "Van Dorn Bottle", "Variable voltage pulsator unit", "Vinyl Tube", "Water Bottle", + "Water level meter", "Water Sampler (Other)", "WBH-96", + "Wetted tape", "Whirl-pak bag", "Wide mouth glass jar" ] diff --git a/schemas/data/src/subset/SampleCollectionMethodContext.json b/schemas/data/src/subset/SampleCollectionMethodContext.json new file mode 100644 index 00000000..793a7f63 --- /dev/null +++ b/schemas/data/src/subset/SampleCollectionMethodContext.json @@ -0,0 +1,14 @@ +[ + "AB_AEP", + "AB_AGS", + "ASTM", + "BC_MOE", + "ISO", + "NL_ECCC", + "NS_DNR", + "NS_ECC", + "PROPRIETARY", + "QC_MOE", + "USDOI/USGS", + "USEPA" +] diff --git a/schemas/data/src/subset/WellUseType.json b/schemas/data/src/subset/WellUseType.json new file mode 100644 index 00000000..de8d5f9b --- /dev/null +++ b/schemas/data/src/subset/WellUseType.json @@ -0,0 +1,14 @@ +[ + "Aquaculture", + "Bottling", + "Irrigation", + "Livestock", + "Monitoring - Ambient", + "Monitoring - Other", + "Oil/Gas Production", + "Other", + "Public Supply - Municipal", + "Public Supply - Other", + "Recharge", + "Test Hole" +] diff --git a/schemas/data/src/values/ActivityMediaName.primary.json b/schemas/data/src/values/ActivityMediaName.primary.json index 4c05ce90..0f6dadad 100644 --- a/schemas/data/src/values/ActivityMediaName.primary.json +++ b/schemas/data/src/values/ActivityMediaName.primary.json @@ -5,6 +5,7 @@ "type": "string", "enum": [ "Ambient Air", + "Groundwater", "Ocean Water", "Porewater", "Rainwater", diff --git a/schemas/data/src/values/AquiferUnitName.legacy.json b/schemas/data/src/values/AquiferUnitName.legacy.json new file mode 100644 index 00000000..306f88eb --- /dev/null +++ b/schemas/data/src/values/AquiferUnitName.legacy.json @@ -0,0 +1,583 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferUnitName.loose.json", + "title": "Aquifer Unit Name", + "description": "", + "type": "string", + "enum": [ + "Abitibi Dykes", + "Alberta Group", + "Algonquin Aquifer Complex", + "Algonquin Basin", + "Algonquin Shoreline", + "Alliston Aquifer Complex", + "Alviston-Rutherford Aquifer", + "Amabel-Lockport-Guelph Hydrogeologic Unit", + "Amherstburge Aquifer", + "Amos Group", + "Ancaster-West Flamborough Aquifer", + "Annapolis-Cornwallis valleys Aquifer", + "Ardkenneth Member", + "Arthur-Mount Forest Aquifer", + "Assiniboine delta Aquifer", + "Atha Aquifer", + "Ausable Aquifer", + "Baby Group", + "Balfron Formation", + "Banff Formation", + "Basal Aquifer", + "basal clastic unit (Winnipeg) Aquifer", + "Bass Island Hydrogeologic Unit", + "Batholith of Guyenne", + "Batholith of La Corne", + "Battle Formation", + "Battleford Formation Stratified Deposits", + "Bearpaw Formation", + "Bearpaw Sand Members Aquifer", + "Beaverville Lake Group", + "Bellefeuille River Pluton", + "Belly River Formation", + "Belly River Group", + "Bernetz Intrusion", + "Berry Pluto", + "Beverly-Onoway channel Complex", + "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blood Reserve Formation", + "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Bois Blanc Hydrogeologic Unit", + "Boissevain Formation", + "Bonnyville U1 Sand", + "Bonnyville U1 Till", + "Bonnyville U2 Till", + "Boss Point Formation", + "Bothwell Aquifer", + "Bounded Channel Aquifers", + "Bourget Aquifer", + "Bourlamaque Batholith", + "Bow Island Formation", + "Bredenbury Aquifer", + "Bronson Lake", + "Brownsville Local Aquifer", + "Buried valley/blanket Aquifers", + "Calamité River Pluton", + "Caledon-Grand River Outwash Aquifer", + "Calgary Lethbridge Corridor HSU C Aquitard", + "Calgary Lethbridge Corridor HSU S1 Aquifer", + "Calgary Lethbridge Corridor HSU S2 Aquifer", + "Camac Formation", + "Canning Aquitard", + "Canning Till Aquitard", + "Carbonate rock Aquifer", + "Carboniferous basin Aquifer", + "Cardium Formation", + "Caste Formation", + "Cataract Group Hydrogeologic Unit", + "Catfish Creek Aquifer", + "Cedar Grove Aquifer", + "Central Catfish Creek Aquifer", + "Central South Nation Aquifer Complex", + "Champlain Aquifer", + "Channel Aquifer 1", + "Channel Aquifer 2", + "Channel Aquifer 3", + "Channel Aquitard 1", + "Channel Aquitard 2", + "Chateauguay Aquifer", + "Chauidiere Aquifer", + "Chesley Aquifer", + "Chicobi Group", + "Chu Íntthi Aquifer", + "Clarence Creek Aquifer", + "Clearwater Formation", + "Clermont-Disson Formation", + "Clinton Group Hydrogeologic Unit", + "Cobble Hill Aquifer", + "Coldstream Aquifer", + "Colombourg Batholith", + "Colorado Group", + "Contact Aquifer", + "Cooking Lake sediments", + "Credit River Aquifer", + "Crowsnest River Alluvial Aquifer", + "Cruikshank Member", + "Cruikshank-Thelma Member", + "Cumberland Group", + "Cypress Hills Formation", + "Dalmeny Aquifer", + "Decelles Reservoir Batholith", + "Deguisier Formation", + "Del Bonita Gravels", + "Demaine Member", + "Detroit River Group Hydrogeologic Unit", + "Don Formation", + "Drumheller channel Complex", + "Dubuisson Formation", + "Dundalk Aquifer", + "Dundee Hydrogeologic Unit", + "Dunvegan Formation", + "Duparquet Formation", + "Durham Aquifer", + "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", + "East and Middle Sixteen Mile Aquifer", + "Eastend Formation", + "Eastend-Cypress Hills Aquifer", + "Eastend-Ravenscrag Aquifer", + "Eastend-Wood Member Aquifer", + "Edson burried-valley Aquifer", + "Egmond Bay Formation", + "Elgin-Southampton Aquifer", + "Elk Point Group", + "Empress Formation", + "Empress Group Aquifers", + "Erie Interstadial Deposits", + "Ethel Lake Formation", + "Etobicoke Aquifer", + "Fielding Aquifer", + "Figuery Group", + "Flavrian Pluto", + "Flesherton Aquifer", + "Floral Sands and Gravels", + "Fontfill Aquifer Complex", + "Foremost Formation", + "Forestry Farm Aquifer", + "Fort St. John Group", + "Fourchu Group", + "Fractured Aquifers - Gulf Islands", + "Fraser Canyon", + "Fraser Lowlands Aquifer", + "Fraser Plateau Lava", + "Frenchman Formation", + "Frenchman Whitemud Eastend Formation", + "Fulford Aquifer", + "Fundy Group", + "Ganges Harbour", + "Georgeville Group", + "Gibsons/SCRD Granthams Landing/Elphinstone", + "Glaciolacustrine Aquifer Complex", + "Glemmore Basal Aquifer", + "Gleneden", + "Granada Formation", + "Grand Centre Formation", + "Grand Forks", + "Grand Rapids Formation", + "Grand River Aquifer", + "Grand River Basin Aquifer", + "Grand River Outwash Deposits", + "Grand River Valley Basinal Deposits", + "Grant Hill", + "Greater Kelowna Aquifer", + "Greatlakean Stade Deposits", + "Green River Aquifer", + "Greendale Deep", + "Greenwood Aquifer", + "Grimshaw Gravels Aquifer", + "Guichon Creek", + "Haans Creek to Blain Creek - Haida Gwaii", + "Hagan Aquifer", + "Haida/Lawnhill", + "Haig", + "Halton Till", + "Hamilton Group Hydrogeologic Unit", + "Hand Hills Formation", + "Hanover Aquifer", + "Harrow Aquifer", + "Hatzic Prairie", + "Hay River Formation", + "Haynes Aquifer", + "Heather Bank", + "Hebecourt Formation", + "Heva Formation", + "Hillsborough Formation", + "Hockley Valley Aquifer", + "Holstein Aquifer", + "Holt Aquifer Complex", + "Hopington AB", + "Hopington C", + "Horseshoe Canyon Formation", + "Horton Group", + "Houston Bedrock", + "Hullcar Aquifer", + "Interglacial Aquifers", + "Joeyaska Deep", + "Joeyaska Shallow", + "Judith River Aquifer", + "Kame Outwash Aquifer Complex", + "Karmutsen", + "Kawkawa Lake", + "Keating", + "Kettle Point Hydrogeologic Unit", + "Kildare Formation", + "Kingsvale", + "Kipawa Formation", + "Kleinburg Aquifer", + "Koksilah River Valley", + "Kwinshatin Intertill", + "La Morandiere Group", + "La Motte Batholith", + "La Motte-Vassan Formation", + "Lacombe Aquitard", + "Lake Abitibi-Okikodesik Batholith", + "Lake Algonquin Sand Aquifer", + "Lake Arthur Group", + "Lake Peel Deltaic Aquifer", + "Lake Schomberg and Algonquin Aquifer", + "Lake Schomberg and Algonquin Aquitard", + "Lancaster-Cornwall Aquifer", + "Landrienne Formation", + "Langdale/Hopkins", + "Langdale/Hopkins Landing", + "Langley Upland", + "LD Basal Till", + "LD Local Aquifers", + "LD Lower Aquifer", + "LD Middle Till", + "LD Upper Till", + "Lea Park Formation", + "Leamington Aquifer", + "Lincoln Aquifer", + "Little Qualicum River", + "Local Aquifer 2", + "Local Aquitard 1", + "Lookout Ridge", + "Lorrain Formation", + "Łots'an Aquifer", + "Lower Bousquet Formation", + "Lower Brougham Aquifer", + "Lower Cassidy", + "Lower Catfish Creek Till Aquitard", + "Lower Cherryville", + "Lower Chinguacousy Aquifer", + "Lower Coquihalla Canyon", + "Lower Cowichan River A", + "Lower Cowichan River C", + "Lower Dundurn Formation Stratified Deposits", + "Lower Erie Phase Aquifer", + "Lower Erie Phase Aquitard", + "Lower Floral Formation Stratified Deposits", + "Lower Gates River", + "Lower Markham Aquifer", + "Lower Maryhill Till", + "Lower Merritt", + "Lower Nechako River", + "Lower Nicola", + "Lower Nicola Outwash", + "Lower Shuswap Deep Aquifer", + "Lower Shuswap River Aquifer", + "Lower Thorncliffe Aquifer", + "Lower Thorncliffe Aquitard", + "Lower Unionville Aquifer", + "Lower Victoria Aquifer", + "Lowland Aquifer Complex", + "Lumby - Lower Aquifer", + "Lumby - Upper Aquifer", + "Mabou Group", + "Mackinaw Interstadial Deposits", + "Malahat Ridge", + "Malcolm Island", + "Mannvile Group", + "Maple Aquifer", + "Mara Aquifer", + "Marble Hill Unconsolidated", + "Marie Creek Formation", + "Markdale Aquifer", + "Masset", + "Matachewan Dyke Swarm", + "Matador Member", + "Mauricie Aquifer", + "McDougall Creek Deltaic", + "McMillan Island", + "McMurray Formation", + "Meaford Aquifer", + "Meguma SuperGroup", + "Meltwater Channel Hydrogeologic Unit", + "Mennon Formation Stratified Deposits", + "Mennon Sand", + "Middle Erie Phase Aquifer", + "Middle Maryhill Till", + "Middle Merritt", + "Middle Thorncliffe Aquifer", + "Middle Thorncliffe Aquitard", + "Middle Waterloo Moraine Aquifer & Equivalents", + "Milk River Aquifer", + "Mill Bay", + "Mine Hunter Group", + "Minesing Basin Transgressive Deposits", + "Mirabel Aquifer", + "Mission Creek Aquifer", + "Mont-Brun Formation", + "Montney Hydrostratigraphic Unit", + "Morien Group", + "Mount Albert Aquifer Complex", + "Mount Ozzard Aquifer", + "Mount Tom Aquifer", + "Muriel Lake", + "Nanaimo Group, Campbell River to Courtney", + "Nanaimo Lowlands Aquifer", + "Nechako Buried Valley", + "Newmarket Till", + "Niagra-on-the-Lake Aquifer", + "Nicomekl-Serpentine", + "Nicomen Slough", + "Nissouri Stadial Deposits", + "Nivek", + "Norfolk Sand Plain Aquifer", + "North Campbell River Aquifer", + "North Central Saanich", + "North Hope", + "North Houston Aquifer", + "North Mountain Formation", + "North Nechako Terrace", + "North Salt Spring Island", + "North-Central Salt Spring Island", + "Notre Dame Aquifer", + "O Avenue Aquifer", + "O'Keefe Aquifer", + "O'Keefe Basal Aquifer", + "Oak Ridges Moraine Aquifer", + "Odanah Member", + "Odanah Shale Aquifer", + "Okanagan Landing Deep Aquifer", + "Okanagan Valley Aquifer", + "Oldcastle Aquifer", + "Opasatica Gneiss", + "Orangeville Aquifer Complex", + "Orby Head Formation", + "Oro Moraine Aquifer Complex", + "Oro-Medonte Aquifer", + "Osoyoos West", + "Ottawa Group Hydrogeologic Unit", + "Outlook Member", + "Owl Creek", + "Owl Ridge Aquifer", + "Oxarart-Cruikshank Members", + "Oyster River", + "Pacheedaht", + "Pakowki Formation", + "Palmarolle Pluton", + "Paris Aquifer", + "Paris moraine Aquitard", + "Paskapoo Formation", + "Paul's Basin", + "Peace River Formation", + "Pickering Aquifer", + "Pictou Group", + "Pineview", + "Plantagenet Aquifer", + "Pluto of Amos", + "Pluto of Lake Dufault", + "Pluto of Lake Fréchette", + "Pluto of the Lake of Sixteen", + "Pluto of The Queen", + "Pluto of Trécesson", + "Pluto of Val-St-Gilles", + "Pluto of Villemontel", + "Pontiac Group", + "Porcupine Hills Formation Aquifers", + "Port Bruce Phase Aquitard", + "Port Bruce Stadial Deposits", + "Port Clements", + "Port Colborne Aquifer", + "Port Huron Stadial Deposits", + "Port McNeill East Aquifer", + "Port McNeill East Bedrock", + "Port McNeill West Aquifer", + "Portneuf Aquifer", + "Pottery Road Formation", + "Poularies Batholith", + "Powell Pluton", + "Powers Ck Deltaic", + "Pre-Canning Aquifers", + "Pre-Canning Aquitard", + "Pre-Catfish Aquifers", + "Precambrian Hydrogeologic Unit", + "Preissac Batholith", + "Priceville Aquifer", + "Puntledge/ Cumberland", + "Puslinch Aquifer", + "Quadra Central", + "Quadra South", + "Queenston Hydrogeologic Unit", + "Quinsam to Stories Beach", + "Ravenscrag Formation", + "Rawlings Lake", + "Red Deer River channel Complex", + "Regional Aquifer 3", + "Regional Aquitard 3", + "Remigny Batholith", + "Reneault-Dufresnoy Formation", + "Ribstone Creek Member", + "Richelieu Aquifer", + "Richibucto Formation", + "Rideau Front Aquifer", + "Roberts Creek", + "Rockcliffe Hydrogeologic Unit", + "Rockland Aquifer", + "Rosebery", + "Rouyn-Pelletier Formation", + "Ryder Upland A", + "Ryder Upland B", + "Ryder Upland C", + "Salina Hydrogeologic Unit", + "Salmon River", + "Salmon River - Lower Aquifer", + "Salmon River - Upper Aquifer", + "Sand Dunes Aquifer", + "Sand River Formation", + "Sandilands Aquifer", + "Sandspit - Haida Gwaii", + "Sardis-Vedder", + "Sarsfield Aquifer", + "Saskatoon Group Aquifers", + "Scarborough Formation", + "Schomberg Aquifer Complex", + "Scollard Formation", + "Sechelt/Wakefield Creek", + "Seton Portage", + "Shannon Lake", + "Shawnigan Lake", + "Shuswap Highlands Aquifer", + "Simcoe Group Hydrogeologic Unit", + "Similkameen River Aquifer", + "Sinkut Mountain North Surficial", + "Skidgate/Queen Charlotte", + "Smoky Group", + "Sooke-Metchosin", + "South Central Elgin Aquifer", + "South Fraser Lake", + "South Lake Simard Batholith", + "South London Aquifer", + "South Nechako Terrace", + "South of Aldergrove", + "South of Hopington", + "South of Murrayville AC", + "South of Murrayville B", + "South Salt Spring Island", + "South Saskatchewan Alluvium", + "South Valemont", + "South Vanderhoof", + "South Vernon Aquifer", + "South-Central Salt Spring Island", + "Spallumcheen Aquifer", + "Spallumcheen Basal Aquifer", + "Spences Bridge", + "Sperling", + "Spius Creek West of Canford", + "St. Catharines Aquifer", + "St. George Aquifers", + "St. Mary River Formation", + "St. Thomas Moraine Local Aquifers", + "Stavely Aquifer", + "Stellako", + "Stirling Group", + "Stoughton-Roquemaure Group", + "Stumbles Creek", + "Stumbles Creek Aquifer", + "Stump Lake Aquifer", + "Sugar Lake", + "Sumas Prairie", + "Sumas Prairie North", + "Sunchild Aquifer", + "Sunnybrae", + "Sunnybrook Drift", + "Surficial stratified drift Aquifers", + "Sutherland Group Aquifers", + "Swan Lake Aquifer", + "Swan River Formation", + "Tachick Lake", + "Tappen", + "Taschereau Batholith", + "Tathlina Formation", + "Tessier Aquifer", + "Thornbury Aquifer", + "Thorncliffe Formation", + "Thornill Aquifer", + "Thornton Sand Aquifer", + "Tillsonburg Aquifer", + "Timiskaming Group", + "Tlell", + "Topley", + "Trinity Valley", + "Tsolum River, North of Courtney", + "Tuhok Aquifer", + "Turtle Mountain Formation", + "Twin Falls Formation", + "Two Creeks Interstadial Deposits", + "Tyconnell Formation", + "Tyner Valley Aquifer", + "Ucluelet Peninsula", + "Ucluelet, Lost Show", + "Undivided Cumberland Group", + "Undivided Pictou Group", + "Unicola", + "Upland Aquifer Complex", + "Upland Gravel", + "Upper and Lower Gloucester Aquifers", + "Upper and Lower Nepean-Kemptville Aquifers", + "Upper and Lower West Nepean Aquifers", + "Upper Aquifer 1", + "Upper Bousquet Formation", + "Upper Brougham Aquifer", + "Upper Bulkley Alluvial", + "Upper Catfish Creek Till Aquitard", + "Upper Cherryville", + "Upper Chinguacousy Aquifer", + "Upper Cretaceous sands Aquifer", + "Upper Dundurn Formation Stratified Deposits", + "Upper Erie Phase Aquifer", + "Upper Erie Phase Aquitard", + "Upper Floral Formation Stratified Deposits", + "Upper Gates River", + "Upper Lea Park Formation", + "Upper Markham Aquifer", + "Upper Maryhill Till", + "Upper Merritt", + "Upper Thames Aquifer", + "Upper Thorncliffe Aquifer", + "Upper Thorncliffe Aquitard", + "Upper Unionville Aquifer", + "Upper Victoria Aquifer", + "Upper Waterloo Moraine Aquifer", + "Val d'Or Formation", + "Valens Outwash Aquifer", + "Vanderhoof Alluvial", + "Vedder Crossing", + "Vedder Mountain NW", + "Vedder Mountain SE", + "Vellore Aquifer", + "Vernon Aquifer", + "Viking Formation", + "Wabamun Formation", + "Wainfleet Aquifer", + "Walker Hook", + "Walkerton Aquifer", + "Wallaceburg Aquifer", + "Wallacetown Formation", + "Wapiti Formation", + "Wark-Colquitz", + "Warman Formation Stratified Deposits", + "Waterloo Moraine Aquifer", + "Wentworth Aquifer", + "Wentworth Till/Aquitard", + "West Carlton Aquifer", + "West Cluculz Lake", + "West Langley", + "West of Aldergrove", + "West of Merritt", + "West Saanich Road", + "West Sechelt", + "Westwold", + "Whitemud Formation", + "Whittlesey Aquifer", + "Whittlesey Clay/Aquitard", + "Whittlesey Sand", + "Willow Creek alluvial Aquifer", + "Willow Creek Formation Aquifer", + "Windsor Group", + "Winnipeg Formation", + "Wood Mountain and Mount Washington", + "Woodbend Group", + "Woodbridge Aquifer", + "Yonge Street Aquifer", + "York Till" + ], + "maxLength": 46 +} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferUnitName.primary.json b/schemas/data/src/values/AquiferUnitName.primary.json new file mode 100644 index 00000000..d629d45a --- /dev/null +++ b/schemas/data/src/values/AquiferUnitName.primary.json @@ -0,0 +1,583 @@ +{ + "$id": "https://datastream.org/schema/data/values/AquiferUnitName.strict.json", + "title": "Aquifer Unit Name", + "description": "", + "type": "string", + "enum": [ + "Abitibi Dykes", + "Alberta Group", + "Algonquin Aquifer Complex", + "Algonquin Basin", + "Algonquin Shoreline", + "Alliston Aquifer Complex", + "Alviston-Rutherford Aquifer", + "Amabel-Lockport-Guelph Hydrogeologic Unit", + "Amherstburge Aquifer", + "Amos Group", + "Ancaster-West Flamborough Aquifer", + "Annapolis-Cornwallis valleys Aquifer", + "Ardkenneth Member", + "Arthur-Mount Forest Aquifer", + "Assiniboine delta Aquifer", + "Atha Aquifer", + "Ausable Aquifer", + "Baby Group", + "Balfron Formation", + "Banff Formation", + "Basal Aquifer", + "basal clastic unit (Winnipeg) Aquifer", + "Bass Island Hydrogeologic Unit", + "Batholith of Guyenne", + "Batholith of La Corne", + "Battle Formation", + "Battleford Formation Stratified Deposits", + "Bearpaw Formation", + "Bearpaw Sand Members Aquifer", + "Beaverville Lake Group", + "Bellefeuille River Pluton", + "Belly River Formation", + "Belly River Group", + "Bernetz Intrusion", + "Berry Pluto", + "Beverly-Onoway channel Complex", + "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blood Reserve Formation", + "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Bois Blanc Hydrogeologic Unit", + "Boissevain Formation", + "Bonnyville U1 Sand", + "Bonnyville U1 Till", + "Bonnyville U2 Till", + "Boss Point Formation", + "Bothwell Aquifer", + "Bounded Channel Aquifers", + "Bourget Aquifer", + "Bourlamaque Batholith", + "Bow Island Formation", + "Bredenbury Aquifer", + "Bronson Lake", + "Brownsville Local Aquifer", + "Buried valley/blanket Aquifers", + "Calamité River Pluton", + "Caledon-Grand River Outwash Aquifer", + "Calgary Lethbridge Corridor HSU C Aquitard", + "Calgary Lethbridge Corridor HSU S1 Aquifer", + "Calgary Lethbridge Corridor HSU S2 Aquifer", + "Camac Formation", + "Canning Aquitard", + "Canning Till Aquitard", + "Carbonate rock Aquifer", + "Carboniferous basin Aquifer", + "Cardium Formation", + "Caste Formation", + "Cataract Group Hydrogeologic Unit", + "Catfish Creek Aquifer", + "Cedar Grove Aquifer", + "Central Catfish Creek Aquifer", + "Central South Nation Aquifer Complex", + "Champlain Aquifer", + "Channel Aquifer 1", + "Channel Aquifer 2", + "Channel Aquifer 3", + "Channel Aquitard 1", + "Channel Aquitard 2", + "Chateauguay Aquifer", + "Chauidiere Aquifer", + "Chesley Aquifer", + "Chicobi Group", + "Chu Íntthi Aquifer", + "Clarence Creek Aquifer", + "Clearwater Formation", + "Clermont-Disson Formation", + "Clinton Group Hydrogeologic Unit", + "Cobble Hill Aquifer", + "Coldstream Aquifer", + "Colombourg Batholith", + "Colorado Group", + "Contact Aquifer", + "Cooking Lake sediments", + "Credit River Aquifer", + "Crowsnest River Alluvial Aquifer", + "Cruikshank Member", + "Cruikshank-Thelma Member", + "Cumberland Group", + "Cypress Hills Formation", + "Dalmeny Aquifer", + "Decelles Reservoir Batholith", + "Deguisier Formation", + "Del Bonita Gravels", + "Demaine Member", + "Detroit River Group Hydrogeologic Unit", + "Don Formation", + "Drumheller channel Complex", + "Dubuisson Formation", + "Dundalk Aquifer", + "Dundee Hydrogeologic Unit", + "Dunvegan Formation", + "Duparquet Formation", + "Durham Aquifer", + "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", + "East and Middle Sixteen Mile Aquifer", + "Eastend Formation", + "Eastend-Cypress Hills Aquifer", + "Eastend-Ravenscrag Aquifer", + "Eastend-Wood Member Aquifer", + "Edson burried-valley Aquifer", + "Egmond Bay Formation", + "Elgin-Southampton Aquifer", + "Elk Point Group", + "Empress Formation", + "Empress Group Aquifers", + "Erie Interstadial Deposits", + "Ethel Lake Formation", + "Etobicoke Aquifer", + "Fielding Aquifer", + "Figuery Group", + "Flavrian Pluto", + "Flesherton Aquifer", + "Floral Sands and Gravels", + "Fontfill Aquifer Complex", + "Foremost Formation", + "Forestry Farm Aquifer", + "Fort St. John Group", + "Fourchu Group", + "Fractured Aquifers - Gulf Islands", + "Fraser Canyon", + "Fraser Lowlands Aquifer", + "Fraser Plateau Lava", + "Frenchman Formation", + "Frenchman Whitemud Eastend Formation", + "Fulford Aquifer", + "Fundy Group", + "Ganges Harbour", + "Georgeville Group", + "Gibsons/SCRD Granthams Landing/Elphinstone", + "Glaciolacustrine Aquifer Complex", + "Glemmore Basal Aquifer", + "Gleneden", + "Granada Formation", + "Grand Centre Formation", + "Grand Forks", + "Grand Rapids Formation", + "Grand River Aquifer", + "Grand River Basin Aquifer", + "Grand River Outwash Deposits", + "Grand River Valley Basinal Deposits", + "Grant Hill", + "Greater Kelowna Aquifer", + "Greatlakean Stade Deposits", + "Green River Aquifer", + "Greendale Deep", + "Greenwood Aquifer", + "Grimshaw Gravels Aquifer", + "Guichon Creek", + "Haans Creek to Blain Creek - Haida Gwaii", + "Hagan Aquifer", + "Haida/Lawnhill", + "Haig", + "Halton Till", + "Hamilton Group Hydrogeologic Unit", + "Hand Hills Formation", + "Hanover Aquifer", + "Harrow Aquifer", + "Hatzic Prairie", + "Hay River Formation", + "Haynes Aquifer", + "Heather Bank", + "Hebecourt Formation", + "Heva Formation", + "Hillsborough Formation", + "Hockley Valley Aquifer", + "Holstein Aquifer", + "Holt Aquifer Complex", + "Hopington AB", + "Hopington C", + "Horseshoe Canyon Formation", + "Horton Group", + "Houston Bedrock", + "Hullcar Aquifer", + "Interglacial Aquifers", + "Joeyaska Deep", + "Joeyaska Shallow", + "Judith River Aquifer", + "Kame Outwash Aquifer Complex", + "Karmutsen", + "Kawkawa Lake", + "Keating", + "Kettle Point Hydrogeologic Unit", + "Kildare Formation", + "Kingsvale", + "Kipawa Formation", + "Kleinburg Aquifer", + "Koksilah River Valley", + "Kwinshatin Intertill", + "La Morandiere Group", + "La Motte Batholith", + "La Motte-Vassan Formation", + "Lacombe Aquitard", + "Lake Abitibi-Okikodesik Batholith", + "Lake Algonquin Sand Aquifer", + "Lake Arthur Group", + "Lake Peel Deltaic Aquifer", + "Lake Schomberg and Algonquin Aquifer", + "Lake Schomberg and Algonquin Aquitard", + "Lancaster-Cornwall Aquifer", + "Landrienne Formation", + "Langdale/Hopkins", + "Langdale/Hopkins Landing", + "Langley Upland", + "LD Basal Till", + "LD Local Aquifers", + "LD Lower Aquifer", + "LD Middle Till", + "LD Upper Till", + "Lea Park Formation", + "Leamington Aquifer", + "Lincoln Aquifer", + "Little Qualicum River", + "Local Aquifer 2", + "Local Aquitard 1", + "Lookout Ridge", + "Lorrain Formation", + "Łots'an Aquifer", + "Lower Bousquet Formation", + "Lower Brougham Aquifer", + "Lower Cassidy", + "Lower Catfish Creek Till Aquitard", + "Lower Cherryville", + "Lower Chinguacousy Aquifer", + "Lower Coquihalla Canyon", + "Lower Cowichan River A", + "Lower Cowichan River C", + "Lower Dundurn Formation Stratified Deposits", + "Lower Erie Phase Aquifer", + "Lower Erie Phase Aquitard", + "Lower Floral Formation Stratified Deposits", + "Lower Gates River", + "Lower Markham Aquifer", + "Lower Maryhill Till", + "Lower Merritt", + "Lower Nechako River", + "Lower Nicola", + "Lower Nicola Outwash", + "Lower Shuswap Deep Aquifer", + "Lower Shuswap River Aquifer", + "Lower Thorncliffe Aquifer", + "Lower Thorncliffe Aquitard", + "Lower Unionville Aquifer", + "Lower Victoria Aquifer", + "Lowland Aquifer Complex", + "Lumby - Lower Aquifer", + "Lumby - Upper Aquifer", + "Mabou Group", + "Mackinaw Interstadial Deposits", + "Malahat Ridge", + "Malcolm Island", + "Mannvile Group", + "Maple Aquifer", + "Mara Aquifer", + "Marble Hill Unconsolidated", + "Marie Creek Formation", + "Markdale Aquifer", + "Masset", + "Matachewan Dyke Swarm", + "Matador Member", + "Mauricie Aquifer", + "McDougall Creek Deltaic", + "McMillan Island", + "McMurray Formation", + "Meaford Aquifer", + "Meguma SuperGroup", + "Meltwater Channel Hydrogeologic Unit", + "Mennon Formation Stratified Deposits", + "Mennon Sand", + "Middle Erie Phase Aquifer", + "Middle Maryhill Till", + "Middle Merritt", + "Middle Thorncliffe Aquifer", + "Middle Thorncliffe Aquitard", + "Middle Waterloo Moraine Aquifer & Equivalents", + "Milk River Aquifer", + "Mill Bay", + "Mine Hunter Group", + "Minesing Basin Transgressive Deposits", + "Mirabel Aquifer", + "Mission Creek Aquifer", + "Mont-Brun Formation", + "Montney Hydrostratigraphic Unit", + "Morien Group", + "Mount Albert Aquifer Complex", + "Mount Ozzard Aquifer", + "Mount Tom Aquifer", + "Muriel Lake", + "Nanaimo Group, Campbell River to Courtney", + "Nanaimo Lowlands Aquifer", + "Nechako Buried Valley", + "Newmarket Till", + "Niagra-on-the-Lake Aquifer", + "Nicomekl-Serpentine", + "Nicomen Slough", + "Nissouri Stadial Deposits", + "Nivek", + "Norfolk Sand Plain Aquifer", + "North Campbell River Aquifer", + "North Central Saanich", + "North Hope", + "North Houston Aquifer", + "North Mountain Formation", + "North Nechako Terrace", + "North Salt Spring Island", + "North-Central Salt Spring Island", + "Notre Dame Aquifer", + "O Avenue Aquifer", + "O'Keefe Aquifer", + "O'Keefe Basal Aquifer", + "Oak Ridges Moraine Aquifer", + "Odanah Member", + "Odanah Shale Aquifer", + "Okanagan Landing Deep Aquifer", + "Okanagan Valley Aquifer", + "Oldcastle Aquifer", + "Opasatica Gneiss", + "Orangeville Aquifer Complex", + "Orby Head Formation", + "Oro Moraine Aquifer Complex", + "Oro-Medonte Aquifer", + "Osoyoos West", + "Ottawa Group Hydrogeologic Unit", + "Outlook Member", + "Owl Creek", + "Owl Ridge Aquifer", + "Oxarart-Cruikshank Members", + "Oyster River", + "Pacheedaht", + "Pakowki Formation", + "Palmarolle Pluton", + "Paris Aquifer", + "Paris moraine Aquitard", + "Paskapoo Formation", + "Paul's Basin", + "Peace River Formation", + "Pickering Aquifer", + "Pictou Group", + "Pineview", + "Plantagenet Aquifer", + "Pluto of Amos", + "Pluto of Lake Dufault", + "Pluto of Lake Fréchette", + "Pluto of the Lake of Sixteen", + "Pluto of The Queen", + "Pluto of Trécesson", + "Pluto of Val-St-Gilles", + "Pluto of Villemontel", + "Pontiac Group", + "Porcupine Hills Formation Aquifers", + "Port Bruce Phase Aquitard", + "Port Bruce Stadial Deposits", + "Port Clements", + "Port Colborne Aquifer", + "Port Huron Stadial Deposits", + "Port McNeill East Aquifer", + "Port McNeill East Bedrock", + "Port McNeill West Aquifer", + "Portneuf Aquifer", + "Pottery Road Formation", + "Poularies Batholith", + "Powell Pluton", + "Powers Ck Deltaic", + "Pre-Canning Aquifers", + "Pre-Canning Aquitard", + "Pre-Catfish Aquifers", + "Precambrian Hydrogeologic Unit", + "Preissac Batholith", + "Priceville Aquifer", + "Puntledge/ Cumberland", + "Puslinch Aquifer", + "Quadra Central", + "Quadra South", + "Queenston Hydrogeologic Unit", + "Quinsam to Stories Beach", + "Ravenscrag Formation", + "Rawlings Lake", + "Red Deer River channel Complex", + "Regional Aquifer 3", + "Regional Aquitard 3", + "Remigny Batholith", + "Reneault-Dufresnoy Formation", + "Ribstone Creek Member", + "Richelieu Aquifer", + "Richibucto Formation", + "Rideau Front Aquifer", + "Roberts Creek", + "Rockcliffe Hydrogeologic Unit", + "Rockland Aquifer", + "Rosebery", + "Rouyn-Pelletier Formation", + "Ryder Upland A", + "Ryder Upland B", + "Ryder Upland C", + "Salina Hydrogeologic Unit", + "Salmon River", + "Salmon River - Lower Aquifer", + "Salmon River - Upper Aquifer", + "Sand Dunes Aquifer", + "Sand River Formation", + "Sandilands Aquifer", + "Sandspit - Haida Gwaii", + "Sardis-Vedder", + "Sarsfield Aquifer", + "Saskatoon Group Aquifers", + "Scarborough Formation", + "Schomberg Aquifer Complex", + "Scollard Formation", + "Sechelt/Wakefield Creek", + "Seton Portage", + "Shannon Lake", + "Shawnigan Lake", + "Shuswap Highlands Aquifer", + "Simcoe Group Hydrogeologic Unit", + "Similkameen River Aquifer", + "Sinkut Mountain North Surficial", + "Skidgate/Queen Charlotte", + "Smoky Group", + "Sooke-Metchosin", + "South Central Elgin Aquifer", + "South Fraser Lake", + "South Lake Simard Batholith", + "South London Aquifer", + "South Nechako Terrace", + "South of Aldergrove", + "South of Hopington", + "South of Murrayville AC", + "South of Murrayville B", + "South Salt Spring Island", + "South Saskatchewan Alluvium", + "South Valemont", + "South Vanderhoof", + "South Vernon Aquifer", + "South-Central Salt Spring Island", + "Spallumcheen Aquifer", + "Spallumcheen Basal Aquifer", + "Spences Bridge", + "Sperling", + "Spius Creek West of Canford", + "St. Catharines Aquifer", + "St. George Aquifers", + "St. Mary River Formation", + "St. Thomas Moraine Local Aquifers", + "Stavely Aquifer", + "Stellako", + "Stirling Group", + "Stoughton-Roquemaure Group", + "Stumbles Creek", + "Stumbles Creek Aquifer", + "Stump Lake Aquifer", + "Sugar Lake", + "Sumas Prairie", + "Sumas Prairie North", + "Sunchild Aquifer", + "Sunnybrae", + "Sunnybrook Drift", + "Surficial stratified drift Aquifers", + "Sutherland Group Aquifers", + "Swan Lake Aquifer", + "Swan River Formation", + "Tachick Lake", + "Tappen", + "Taschereau Batholith", + "Tathlina Formation", + "Tessier Aquifer", + "Thornbury Aquifer", + "Thorncliffe Formation", + "Thornill Aquifer", + "Thornton Sand Aquifer", + "Tillsonburg Aquifer", + "Timiskaming Group", + "Tlell", + "Topley", + "Trinity Valley", + "Tsolum River, North of Courtney", + "Tuhok Aquifer", + "Turtle Mountain Formation", + "Twin Falls Formation", + "Two Creeks Interstadial Deposits", + "Tyconnell Formation", + "Tyner Valley Aquifer", + "Ucluelet Peninsula", + "Ucluelet, Lost Show", + "Undivided Cumberland Group", + "Undivided Pictou Group", + "Unicola", + "Upland Aquifer Complex", + "Upland Gravel", + "Upper and Lower Gloucester Aquifers", + "Upper and Lower Nepean-Kemptville Aquifers", + "Upper and Lower West Nepean Aquifers", + "Upper Aquifer 1", + "Upper Bousquet Formation", + "Upper Brougham Aquifer", + "Upper Bulkley Alluvial", + "Upper Catfish Creek Till Aquitard", + "Upper Cherryville", + "Upper Chinguacousy Aquifer", + "Upper Cretaceous sands Aquifer", + "Upper Dundurn Formation Stratified Deposits", + "Upper Erie Phase Aquifer", + "Upper Erie Phase Aquitard", + "Upper Floral Formation Stratified Deposits", + "Upper Gates River", + "Upper Lea Park Formation", + "Upper Markham Aquifer", + "Upper Maryhill Till", + "Upper Merritt", + "Upper Thames Aquifer", + "Upper Thorncliffe Aquifer", + "Upper Thorncliffe Aquitard", + "Upper Unionville Aquifer", + "Upper Victoria Aquifer", + "Upper Waterloo Moraine Aquifer", + "Val d'Or Formation", + "Valens Outwash Aquifer", + "Vanderhoof Alluvial", + "Vedder Crossing", + "Vedder Mountain NW", + "Vedder Mountain SE", + "Vellore Aquifer", + "Vernon Aquifer", + "Viking Formation", + "Wabamun Formation", + "Wainfleet Aquifer", + "Walker Hook", + "Walkerton Aquifer", + "Wallaceburg Aquifer", + "Wallacetown Formation", + "Wapiti Formation", + "Wark-Colquitz", + "Warman Formation Stratified Deposits", + "Waterloo Moraine Aquifer", + "Wentworth Aquifer", + "Wentworth Till/Aquitard", + "West Carlton Aquifer", + "West Cluculz Lake", + "West Langley", + "West of Aldergrove", + "West of Merritt", + "West Saanich Road", + "West Sechelt", + "Westwold", + "Whitemud Formation", + "Whittlesey Aquifer", + "Whittlesey Clay/Aquitard", + "Whittlesey Sand", + "Willow Creek alluvial Aquifer", + "Willow Creek Formation Aquifer", + "Windsor Group", + "Winnipeg Formation", + "Wood Mountain and Mount Washington", + "Woodbend Group", + "Woodbridge Aquifer", + "Yonge Street Aquifer", + "York Till" + ], + "maxLength": 46 +} \ No newline at end of file diff --git a/schemas/data/src/values/CharacteristicName.legacy.json b/schemas/data/src/values/CharacteristicName.legacy.json index f142b990..f4ae8c22 100644 --- a/schemas/data/src/values/CharacteristicName.legacy.json +++ b/schemas/data/src/values/CharacteristicName.legacy.json @@ -22981,6 +22981,7 @@ "Water flow compared to normal conditions (choice list)", "Water level", "Water level (probe)", + "Water level elevation", "Water level in relation to reference point", "Water level in well during pumping, MSL", "Water level in well, depth from a reference point", diff --git a/schemas/data/src/values/CharacteristicName.primary.json b/schemas/data/src/values/CharacteristicName.primary.json index 2e7b6cb8..1e530fae 100644 --- a/schemas/data/src/values/CharacteristicName.primary.json +++ b/schemas/data/src/values/CharacteristicName.primary.json @@ -1360,6 +1360,8 @@ "Volatile suspended solids", "Water level", "Water level (probe)", + "Water level elevation", + "Water level in well, depth from a reference point", "Weak, dissociable cyanide", "Wetted Width", "White ice thickness", diff --git a/schemas/data/src/values/MonitoringLocationType.legacy.json b/schemas/data/src/values/MonitoringLocationType.legacy.json index 60360ad0..5764f3fd 100644 --- a/schemas/data/src/values/MonitoringLocationType.legacy.json +++ b/schemas/data/src/values/MonitoringLocationType.legacy.json @@ -27,6 +27,7 @@ "Constructed Tunnel", "Constructed Water Transport Structure", "Constructed Wetland", + "Dug Well", "Estuary", "Estuary-Freshwater", "Facility Industrial", @@ -63,11 +64,14 @@ "Mine/Mine Discharge Adit (Mine Entrance)", "Mine/Mine Discharge Tailings Pile", "Mine/Mine Discharge Waste Rock Pile", + "Multilevel Well", "National Air Monitoring Station", + "Nested Well", "Ocean", "Oil and Gas Well", "Other-Ground Water", "Other-Surface Water", + "Piezometer", "Pipe, Unspecified Source", "Playa", "Pond", diff --git a/schemas/data/src/values/MonitoringLocationType.primary.json b/schemas/data/src/values/MonitoringLocationType.primary.json index 8ce3dee7..9b292715 100644 --- a/schemas/data/src/values/MonitoringLocationType.primary.json +++ b/schemas/data/src/values/MonitoringLocationType.primary.json @@ -5,19 +5,28 @@ "type": "string", "enum": [ "Atmosphere", + "Borehole", "Canal Drainage", "Canal Irrigation", "Canal Transport", + "Dug Well", "Estuary", "Great Lake", "Lake/Pond", + "Multilevel Well", + "Nested Well", "Ocean", + "Other-Ground Water", + "Piezometer", "Pond-Stormwater", "Reservoir", "River/Stream", + "Seep", "Spring", "Storm Sewer", + "Sump", "Unspecified", + "Well", "Wetland" ], "maxLength": 40 diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json index 7e789ea0..c5701caf 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json @@ -13,6 +13,7 @@ "GPS Code (Pseudo Range) Precise Position", "GPS Code (Pseudo Range) Standard Position (SA Off)", "GPS Code (Pseudo Range) Standard Position (SA On)", + "Handheld GPS - Positioning Method Unspecified", "Leveling-Non Bench Mark Control Points", "Light Detection And Ranging (LiDAR)", "Other", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json index 51cfb845..bab7ff41 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json @@ -13,6 +13,7 @@ "GPS Code (Pseudo Range) Precise Position", "GPS Code (Pseudo Range) Standard Position (SA Off)", "GPS Code (Pseudo Range) Standard Position (SA On)", + "Handheld GPS - Positioning Method Unspecified", "Leveling-Non Bench Mark Control Points", "Light Detection And Ranging (LiDAR)", "Other", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json index 64cdd5f1..0a3a87f2 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json @@ -4,6 +4,8 @@ "description": "", "type": "string", "enum": [ + "CGVD2013", + "CGVD28", "LTD", "NAVD88", "NGVD29", @@ -11,5 +13,5 @@ "SEALV", "UNKWN" ], - "maxLength": 6 + "maxLength": 8 } \ No newline at end of file diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json index 0bad4e2b..eeded5d2 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json @@ -4,12 +4,12 @@ "description": "", "type": "string", "enum": [ - "LTD", + "CGVD2013", + "CGVD28", "NAVD88", "NGVD29", "OTHER", - "SEALV", "UNKWN" ], - "maxLength": 6 + "maxLength": 8 } \ No newline at end of file diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json index 85302851..ffae09d7 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json @@ -7,12 +7,14 @@ "6 Inch Core", "A-Frame Net", "Activity Trap", + "Air line", "Anchor Box Dredge", "Artificial Substrate", "Autonomous Underwater Vehicle", "Autosampler (other)", "Backhoe", "Backpack Electroshock", + "Bailer", "Beach Seine Net", "Beam Trawl", "Benthic Corer (Other)", @@ -90,6 +92,7 @@ "Hivol Modified, XAD Resin", "Hook And Line", "Horizontal Secchi Disk", + "Hydrasleeve", "Hydraulic Grab", "Hydraulic Push Core/Geoprobe", "Hydroacoustics", @@ -199,6 +202,7 @@ "Single-stage suspended sampler", "Single-Vessel Operated Tow Net", "Smith-McIntire Grab", + "Snap sampler", "Sodium Cyanide", "SPATT Bags", "Spear/Gun", @@ -248,8 +252,10 @@ "Visual Sighting", "Water Bottle", "Water Level Gage", + "Water level meter", "Water Sampler (Other)", "WBH-96", + "Wetted tape", "Whirl-pak bag", "Wide mouth glass jar", "Wisconsin-Style Net", diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json index adf030b7..d3764785 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json @@ -4,12 +4,15 @@ "description": "", "type": "string", "enum": [ + "Air line", + "Bailer", "Beta sampler", "Bucket", "DH-81", "DH-95", "Diffusion Gradient in Thin Film", "Gravity Corer (Generic)", + "Hydrasleeve", "Kemmerer Bottle", "Nansen Bottle", "Niskin Bottle", @@ -31,16 +34,20 @@ "Sediment sub-core", "Sediment Trap", "Semipermeable Membrane Device", + "Snap sampler", "Syringe", "Test strip", + "Tubing", "Turbidimeter", "Turbidity Tube", "Van Dorn Bottle", "Variable voltage pulsator unit", "Vinyl Tube", "Water Bottle", + "Water level meter", "Water Sampler (Other)", "WBH-96", + "Wetted tape", "Whirl-pak bag", "Wide mouth glass jar" ], diff --git a/schemas/data/src/values/SampleCollectionMethodContext.legacy.json b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json index 943994f4..c46cc500 100644 --- a/schemas/data/src/values/SampleCollectionMethodContext.legacy.json +++ b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json @@ -5,12 +5,15 @@ "type": "string", "enum": [ "11NPSWRD", + "AB_AEP", + "AB_AGS", "ADEM", "AFS", "ANS-PCER", "ANSP", "Applegate WC", "ASTM", + "BC_MOE", "BIORECON", "CA_Waterboards", "CDPHE", @@ -22,14 +25,20 @@ "GA-DNR", "GeoEngineers", "IDEXX", + "ISO", "Kansas DHE", "KNA__", "MASSWATER", "MDEQ-WQ", "NJDEP", + "NL_ECCC", + "NS_DNR", + "NS_ECC", "PFBMP", "PIBO-EMP", "PNAMP", + "PROPRIETARY", + "QC_MOE", "TCEQ", "TN DEC", "TRC Omni", diff --git a/schemas/data/src/values/SampleCollectionMethodContext.primary.json b/schemas/data/src/values/SampleCollectionMethodContext.primary.json index 7a6002c6..d7cb5ec2 100644 --- a/schemas/data/src/values/SampleCollectionMethodContext.primary.json +++ b/schemas/data/src/values/SampleCollectionMethodContext.primary.json @@ -4,41 +4,18 @@ "description": "", "type": "string", "enum": [ - "11NPSWRD", - "ADEM", - "AFS", - "ANS-PCER", - "ANSP", - "Applegate WC", + "AB_AEP", + "AB_AGS", "ASTM", - "BIORECON", - "CA_Waterboards", - "CDPHE", - "CRWA Laboratory", - "CWW", - "EnvCanada-AWQMSD", - "GA DNR", - "GA EPD", - "GA-DNR", - "GeoEngineers", - "IDEXX", - "Kansas DHE", - "KNA__", - "MASSWATER", - "MDEQ-WQ", - "NJDEP", - "PFBMP", - "PIBO-EMP", - "PNAMP", - "TCEQ", - "TN DEC", - "TRC Omni", - "USACE", + "BC_MOE", + "ISO", + "NL_ECCC", + "NS_DNR", + "NS_ECC", + "PROPRIETARY", + "QC_MOE", "USDOI/USGS", - "USEPA", - "UTAHDWQ", - "WSDOE", - "WYDEQ" + "USEPA" ], "maxLength": 16 } \ No newline at end of file diff --git a/schemas/data/src/values/WellUseType.legacy.json b/schemas/data/src/values/WellUseType.legacy.json index 7befed4c..1888abe6 100644 --- a/schemas/data/src/values/WellUseType.legacy.json +++ b/schemas/data/src/values/WellUseType.legacy.json @@ -5,6 +5,8 @@ "type": "string", "enum": [ "Anode", + "Aquaculture", + "Bottling", "Capture", "Commercial", "Dewater", @@ -15,11 +17,16 @@ "Industrial", "Injection", "Irrigation", + "Livestock", "Monitoring", + "Monitoring - Ambient", + "Monitoring - Other", "Observation", "Oil/Gas Production", "Other", "Piezometer", + "Public Supply - Municipal", + "Public Supply - Other", "Recharge", "Remediation", "Repressurization", @@ -33,5 +40,5 @@ "Well-Temporary", "Withdrawal of Water" ], - "maxLength": 24 + "maxLength": 25 } \ No newline at end of file diff --git a/schemas/data/src/values/WellUseType.primary.json b/schemas/data/src/values/WellUseType.primary.json index 57a22a82..83e71baf 100644 --- a/schemas/data/src/values/WellUseType.primary.json +++ b/schemas/data/src/values/WellUseType.primary.json @@ -4,34 +4,18 @@ "description": "", "type": "string", "enum": [ - "Anode", - "Capture", - "Commercial", - "Dewater", - "Domestic", - "Drainage", - "Geothermal", - "Heat Reservoir", - "Industrial", - "Injection", + "Aquaculture", + "Bottling", "Irrigation", - "Monitoring", - "Observation", + "Livestock", + "Monitoring - Ambient", + "Monitoring - Other", "Oil/Gas Production", "Other", - "Piezometer", + "Public Supply - Municipal", + "Public Supply - Other", "Recharge", - "Remediation", - "Repressurization", - "Seismic", - "Soil Vapor Extraction", - "Soil Vapor Monitoring", - "Test Hole", - "Waste Disposal", - "Water Quality Assessment", - "Water Supply/Production", - "Well-Temporary", - "Withdrawal of Water" + "Test Hole" ], - "maxLength": 24 + "maxLength": 25 } \ No newline at end of file From 3aff08bb6c8620f056d24f425c644b29c5c5cad0 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 23 Jan 2026 10:49:36 -0500 Subject: [PATCH 07/51] feat: add new errors for groundwater fields --- schemas/data/src/extract.json | 12 + schemas/data/src/frontend.json | 12 + schemas/data/src/locales/en-CA.ftl | 4 + ...e-ActivityDepthAltitudeReferencePoint.json | 22 ++ ...l-ActivityDepthAltitudeReferencePoint.json | 24 ++ ...ringLocationType-Well-SampleCondition.json | 29 ++ ...nitoringLocationType-Well-WellUseType.json | 24 ++ schemas/data/src/primary.json | 12 + schemas/data/test/logic.js | 126 ++++++++ schemas/data/test/required.js | 289 ++++++++++++++++++ schemas/data/test/transform.js | 1 + 11 files changed, 555 insertions(+) create mode 100644 schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json create mode 100644 schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json create mode 100644 schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json create mode 100644 schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index 5ccd6d52..a845cdf8 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -302,6 +302,18 @@ }, { "$ref": "./logic/CSVInjection.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-WellUseType.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-SampleCondition.json" + }, + { + "$ref": "./logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" } ] } diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 3a2d9d53..994c63e7 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -343,6 +343,18 @@ }, { "$ref": "./logic/CSVInjection.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-WellUseType.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-SampleCondition.json" + }, + { + "$ref": "./logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" } ] } diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 7e641b62..abbf9e97 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -84,11 +84,15 @@ error-string-multiline-pattern = Only letters, numbers, punctuation, symbols, sp ## errors error-ActivityType-CTS-ActivityStartTime = Continuous time-series observations must include a valid ActivityStartTime error-ActivityType-ResultAnalyticalMethod = Requires LaboratoryName and ResultAnalyticalMethod columns when ActivityType starts with 'Sample' (i.e. Activity is not a Field Msr/Obs) +error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported error-CharacteristicName-MethodSpeciation = MethodSpeciation required for selected CharacteristicName error-CharacteristicName-Nutrient-ResultSampleFraction = ResultSampleFractions for nutrients should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) error-CharacteristicName-ResultSampleFraction = ResultSampleFraction required for selected CharacteristicName error-CharacteristicName-StableIsotope-MethodSpeciation = Isotope MethodSpeciation required for selected CharacteristicName. For guidance, please see Best Practices for Reporting Isotope Data (https://datastream.org/en-ca/documentation/isotope-data-guidance) +error-CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required for CharacteristicName 'Water level in well, depth from a reference point' error-CSVInjection = Invalid starting character. `=`, `+`, `-`, `@`, `[space]`, `[tab]`, `[carriage return]` are not valid characters for the beginning of text columns +error-MonitoringLocationType-Well-WellUseType = WellUseType is required when MonitoringLocationType is a well or piezometer +error-MonitoringLocationType-Well-SampleCondition = SampleCondition is required when MonitoringLocationType is a well or piezometer (except for Continuous Time Series activities) error-ResultDetectionCondition-ResultDetectionQuantitationLimit-above-below = ResultDetectionQuantitationLimit fields are required when ResultDetectionCondition is above or below Detection/Quantification limits error-ResultDetectionCondition-ResultDetectionQuantitationLimit-not-detect = When ResultDetectionCondition is set to 'Not Detected' or 'Detected Not Quantified' the ResultDetectionQuantitationLimit fields should not be populated error-ResultDetectionCondition-ResultValue = Only one of ResultValue or ResultDetectionCondition should be populated diff --git a/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json new file mode 100644 index 00000000..6a7ab480 --- /dev/null +++ b/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json @@ -0,0 +1,22 @@ +{ + "$id": "https://datastream.org/schema/data/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json", + "title": "ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint", + "description": "ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported", + "errorMessage": "error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityDepthHeightMeasure": true + }, + "required": ["ActivityDepthHeightMeasure"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityDepthAltitudeReferencePoint": true + }, + "required": ["ActivityDepthAltitudeReferencePoint"] + } +} diff --git a/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json new file mode 100644 index 00000000..645c6748 --- /dev/null +++ b/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json @@ -0,0 +1,24 @@ +{ + "$id": "https://datastream.org/schema/data/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json", + "title": "CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint", + "description": "ActivityDepthAltitudeReferencePoint is required when CharacteristicName is 'Water level in well, depth from a reference point'", + "errorMessage": "error-CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "CharacteristicName": { + "enum": ["Water level in well, depth from a reference point"] + } + }, + "required": ["CharacteristicName"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityDepthAltitudeReferencePoint": true + }, + "required": ["ActivityDepthAltitudeReferencePoint"] + } +} diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json new file mode 100644 index 00000000..7c6520bd --- /dev/null +++ b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json @@ -0,0 +1,29 @@ +{ + "$id": "https://datastream.org/schema/data/logic/MonitoringLocationType-Well-SampleCondition.json", + "title": "MonitoringLocationType-Well-SampleCondition", + "description": "SampleCondition is required when MonitoringLocationType contains 'Well' or 'Piezometer' and ActivityType is NOT 'Field Msr/Obs-Continuous Time Series'", + "errorMessage": "error-MonitoringLocationType-Well-SampleCondition", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "MonitoringLocationType": { + "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] + }, + "ActivityType": { + "not": { + "enum": ["Field Msr/Obs-Continuous Time Series"] + } + } + }, + "required": ["MonitoringLocationType", "ActivityType"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "SampleCondition": true + }, + "required": ["SampleCondition"] + } +} diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json new file mode 100644 index 00000000..b84f1103 --- /dev/null +++ b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json @@ -0,0 +1,24 @@ +{ + "$id": "https://datastream.org/schema/data/logic/MonitoringLocationType-Well-WellUseType.json", + "title": "MonitoringLocationType-Well-WellUseType", + "description": "WellUseType is required when MonitoringLocationType contains 'Well' or 'Piezometer'", + "errorMessage": "error-MonitoringLocationType-Well-WellUseType", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "MonitoringLocationType": { + "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] + } + }, + "required": ["MonitoringLocationType"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "WellUseType": true + }, + "required": ["WellUseType"] + } +} diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index 6e0ec816..0f105fb1 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -298,6 +298,18 @@ }, { "$ref": "./logic/CSVInjection.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-WellUseType.json" + }, + { + "$ref": "./logic/MonitoringLocationType-Well-SampleCondition.json" + }, + { + "$ref": "./logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" } ] } diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 263904a1..016a0258 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -834,6 +834,132 @@ test("Should reject when Salinity and ResultDetectionQuantitationLimitUnit=`ppt` ); }); +// *** MonitoringLocationType-Well-WellUseType *** // +test("Should reject Well MonitoringLocationType without WellUseType", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "WellUseType"), true); +}); + +test("Should reject Piezometer MonitoringLocationType without WellUseType", async (t) => { + const valid = validate({ + MonitoringLocationType: "Piezometer", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "WellUseType"), true); +}); + +test("Should reject Dug Well MonitoringLocationType without WellUseType", async (t) => { + const valid = validate({ + MonitoringLocationType: "Dug Well", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "WellUseType"), true); +}); + +test("Should accept Well MonitoringLocationType with WellUseType", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + WellUseType: "Monitoring - Ambient", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "WellUseType"), false); +}); + +test("Should accept non-well MonitoringLocationType without WellUseType", async (t) => { + const valid = validate({ + MonitoringLocationType: "River/Stream", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "WellUseType"), false); +}); + +// *** MonitoringLocationType-Well-SampleCondition *** // +test("Should reject Well without SampleCondition for non-CTS", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + ActivityType: "Field Msr/Obs", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "SampleCondition"), true); +}); + +test("Should accept Well without SampleCondition for CTS", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + ActivityType: "Field Msr/Obs-Continuous Time Series", + ActivityStartTime: "13:15:00", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "SampleCondition"), false); +}); + +test("Should accept Well with SampleCondition for non-CTS", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + ActivityType: "Field Msr/Obs", + SampleCondition: "Static", + }); + t.false(valid); + t.is(checkProperty(validate.errors, "required", "SampleCondition"), false); +}); + +// *** ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint *** // +test("Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint", async (t) => { + const valid = validate({ + ActivityDepthHeightMeasure: -5, + ActivityDepthHeightUnit: "m", + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), + true, + ); +}); + +test("Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferencePoint", async (t) => { + const valid = validate({ + ActivityDepthHeightMeasure: -5, + ActivityDepthHeightUnit: "m", + ActivityDepthAltitudeReferencePoint: "Ground surface", + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), + false, + ); +}); + +// *** CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint *** // +test("Should reject Water level CharacteristicName without ActivityDepthAltitudeReferencePoint", async (t) => { + const valid = validate({ + CharacteristicName: "Water level in well, depth from a reference point", + ResultValue: -10, + ResultUnit: "m", + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), + true, + ); +}); + +test("Should accept Water level CharacteristicName with ActivityDepthAltitudeReferencePoint", async (t) => { + const valid = validate({ + CharacteristicName: "Water level in well, depth from a reference point", + ResultValue: -10, + ResultUnit: "m", + ActivityDepthAltitudeReferencePoint: "Top of well casing", + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), + false, + ); +}); + // *** one off *** // /*test('one off', async (t) => { const valid = validate({ diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index 554e3a2b..eac36242 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -120,6 +120,7 @@ test("Should not require properties", async (t) => { ActivityMediaName: "Surface Water", ActivityDepthHeightMeasure: "-34", ActivityDepthHeightUnit: "m", + ActivityDepthAltitudeReferencePoint: "Ground surface", SampleCollectionEquipmentName: "Bucket", CharacteristicName: "Sulfur", MethodSpeciation: "as B", @@ -266,3 +267,291 @@ test("Should accept AnalysisStartTime AND AnalysisStartTimeZone", async (t) => { false, ); }); + +// Groundwater-related dependency tests + +test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalUnit", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalUnit", + ), + true, + ); +}); +test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalUnit", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + MonitoringLocationVerticalUnit: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalUnit", + ), + false, + ); +}); + +test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCollectionMethod", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalCollectionMethod", + ), + true, + ); +}); +test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCollectionMethod", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + MonitoringLocationVerticalCollectionMethod: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalCollectionMethod", + ), + false, + ); +}); + +test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCoordinateReferenceSystem", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalCoordinateReferenceSystem", + ), + true, + ); +}); +test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCoordinateReferenceSystem", async (t) => { + const valid = validate({ + MonitoringLocationVerticalMeasure: true, + MonitoringLocationVerticalCoordinateReferenceSystem: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalCoordinateReferenceSystem", + ), + false, + ); +}); + +test("Should reject MonitoringLocationVerticalAccuracyMeasure AND NOT MonitoringLocationVerticalAccuracyUnit", async (t) => { + const valid = validate({ + MonitoringLocationVerticalAccuracyMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalAccuracyUnit", + ), + true, + ); +}); +test("Should accept MonitoringLocationVerticalAccuracyMeasure AND MonitoringLocationVerticalAccuracyUnit", async (t) => { + const valid = validate({ + MonitoringLocationVerticalAccuracyMeasure: true, + MonitoringLocationVerticalAccuracyUnit: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "MonitoringLocationVerticalAccuracyUnit", + ), + false, + ); +}); + +test("Should reject WellID AND NOT WellIDContext", async (t) => { + const valid = validate({ + WellID: true, + }); + t.false(valid); + t.is(checkProperty(validate.errors, "dependencies", "WellIDContext"), true); +}); +test("Should accept WellID AND WellIDContext", async (t) => { + const valid = validate({ + WellID: true, + WellIDContext: true, + }); + t.false(valid); + t.is(checkProperty(validate.errors, "dependencies", "WellIDContext"), false); +}); + +test("Should reject BoreholeDepthMeasure AND NOT BoreholeDepthUnit", async (t) => { + const valid = validate({ + BoreholeDepthMeasure: true, + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), + true, + ); +}); +test("Should accept BoreholeDepthMeasure AND BoreholeDepthUnit", async (t) => { + const valid = validate({ + BoreholeDepthMeasure: true, + BoreholeDepthUnit: true, + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), + false, + ); +}); + +test("Should reject WellDepthMeasure AND NOT WellDepthUnit", async (t) => { + const valid = validate({ + WellDepthMeasure: true, + }); + t.false(valid); + t.is(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), true); +}); +test("Should accept WellDepthMeasure AND WellDepthUnit", async (t) => { + const valid = validate({ + WellDepthMeasure: true, + WellDepthUnit: true, + }); + t.false(valid); + t.is(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), false); +}); + +test("Should reject WellOpenIntervalTopMeasure AND NOT WellOpenIntervalTopUnit", async (t) => { + const valid = validate({ + WellOpenIntervalTopMeasure: true, + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), + true, + ); +}); +test("Should accept WellOpenIntervalTopMeasure AND WellOpenIntervalTopUnit", async (t) => { + const valid = validate({ + WellOpenIntervalTopMeasure: true, + WellOpenIntervalTopUnit: true, + }); + t.false(valid); + t.is( + checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), + false, + ); +}); + +test("Should reject WellOpenIntervalBottomMeasure AND NOT WellOpenIntervalBottomUnit", async (t) => { + const valid = validate({ + WellOpenIntervalBottomMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "WellOpenIntervalBottomUnit", + ), + true, + ); +}); +test("Should accept WellOpenIntervalBottomMeasure AND WellOpenIntervalBottomUnit", async (t) => { + const valid = validate({ + WellOpenIntervalBottomMeasure: true, + WellOpenIntervalBottomUnit: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "WellOpenIntervalBottomUnit", + ), + false, + ); +}); + +test("Should reject ActivityDepthAltitudeReferencePointMeasure AND NOT ActivityDepthAltitudeReferencePointUnit", async (t) => { + const valid = validate({ + ActivityDepthAltitudeReferencePointMeasure: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "ActivityDepthAltitudeReferencePointUnit", + ), + true, + ); +}); +test("Should accept ActivityDepthAltitudeReferencePointMeasure AND ActivityDepthAltitudeReferencePointUnit", async (t) => { + const valid = validate({ + ActivityDepthAltitudeReferencePointMeasure: true, + ActivityDepthAltitudeReferencePointUnit: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "ActivityDepthAltitudeReferencePointUnit", + ), + false, + ); +}); + +test("Should reject SampleCollectionMethodID AND NOT SampleCollectionMethodContext", async (t) => { + const valid = validate({ + SampleCollectionMethodID: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "SampleCollectionMethodContext", + ), + true, + ); +}); +test("Should accept SampleCollectionMethodID AND SampleCollectionMethodContext", async (t) => { + const valid = validate({ + SampleCollectionMethodID: true, + SampleCollectionMethodContext: true, + }); + t.false(valid); + t.is( + checkProperty( + validate.errors, + "dependencies", + "SampleCollectionMethodContext", + ), + false, + ); +}); diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index 3d4f2184..bbbdba8a 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -16,6 +16,7 @@ test('Should transform values (frontend)', async (t) => { ActivityMediaName: 'surface Water', ActivityDepthHeightMeasure: '-34', ActivityDepthHeightUnit: 'm', + ActivityDepthAltitudeReferencePoint: 'Ground surface', SampleCollectionEquipmentName: 'bucket', CharacteristicName: 'aluminum', MethodSpeciation: 'as B', From 0b2b00ae40f30495179eb9af8d39c959b7aad4dd Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 28 Apr 2026 13:55:25 -0400 Subject: [PATCH 08/51] feat: align schema $ids and $refs for spec-compliant URL resolution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates ajv-cmd to 0.13.0 and refactors source schema $ids and $refs so that JSON Schema URL resolution works without relying on cwd-based filesystem fallbacks (removed in @apidevtools/json-schema-ref-parser v15). Schema changes: - Top-level $ids in src/{primary,extract,frontend,backend,quality-control, definitions}.json now end in .json, mirroring filenames so relative refs resolve correctly under standard URL resolution. - bin/build-values.js generates value-file $ids matching their filenames (.legacy.json/.primary.json) instead of .loose.json/.strict.json. - Fixed leaf $id drift in logic/ResultUnit-Salinity.json and quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json. - $refs to wqx switched from filesystem path to its $id URL (https://epa.gov/wqx/definitions.json). - $refs to ./values/* in definitions.json switched to absolute URLs to sidestep a ref-parser v15 bug that misroutes relative refs in the root document to FileResolver. Build changes: - bin/build: dropped `cd src` indirection in deref step; added -r flags for wqx, definitions, logic, quality-control, and values so installFetch Cache resolves all referenced schemas locally. BREAKING CHANGE: published $ids changed (e.g. https://datastream.org/ schema/data/backend → https://datastream.org/schema/data/backend.json). Consumers must update their $refs accordingly when bumping @datastreamapp/data-schema. --- package-lock.json | 2996 +++++++++-------- package.json | 2 +- schemas/data/bin/build | 11 +- schemas/data/bin/build-values.js | 4 +- schemas/data/package-lock.json | 8 +- schemas/data/package.json | 2 +- schemas/data/src/backend.json | 2 +- schemas/data/src/definitions.json | 168 +- schemas/data/src/extract.json | 2 +- schemas/data/src/frontend.json | 2 +- .../data/src/logic/ResultUnit-Salinity.json | 2 +- schemas/data/src/primary.json | 2 +- schemas/data/src/quality-control.json | 2 +- ...ctionQuantitationLimitMeasure-Minimum.json | 2 +- ...ityDepthAltitudeReferencePoint.legacy.json | 2 +- ...tyDepthAltitudeReferencePoint.primary.json | 2 +- ...epthAltitudeReferencePointUnit.legacy.json | 2 +- ...pthAltitudeReferencePointUnit.primary.json | 2 +- .../ActivityDepthHeightUnit.legacy.json | 2 +- .../ActivityDepthHeightUnit.primary.json | 2 +- .../src/values/ActivityGroupType.legacy.json | 2 +- .../src/values/ActivityGroupType.primary.json | 2 +- .../src/values/ActivityMediaName.legacy.json | 2 +- .../src/values/ActivityMediaName.primary.json | 2 +- .../data/src/values/ActivityType.legacy.json | 2 +- .../data/src/values/ActivityType.primary.json | 2 +- .../data/src/values/AquiferCode.legacy.json | 2 +- .../data/src/values/AquiferCode.primary.json | 2 +- .../data/src/values/AquiferType.legacy.json | 2 +- .../data/src/values/AquiferType.primary.json | 2 +- .../src/values/AquiferUnitName.legacy.json | 2 +- .../src/values/AquiferUnitName.primary.json | 2 +- .../AquiferUnitPorosityType.legacy.json | 2 +- .../AquiferUnitPorosityType.primary.json | 2 +- .../src/values/BoreholeDepthUnit.legacy.json | 2 +- .../src/values/BoreholeDepthUnit.primary.json | 2 +- .../values/CharacteristicGroup.legacy.json | 2 +- .../values/CharacteristicGroup.primary.json | 2 +- .../src/values/CharacteristicName.legacy.json | 10 +- .../values/CharacteristicName.primary.json | 2 +- .../data/src/values/LithologyType.legacy.json | 2 +- .../src/values/LithologyType.primary.json | 2 +- .../src/values/MeasurementUnit.legacy.json | 2 +- .../src/values/MeasurementUnit.primary.json | 2 +- .../src/values/MethodSpeciation.legacy.json | 2 +- .../src/values/MethodSpeciation.primary.json | 2 +- ...LocationHorizontalAccuracyUnit.legacy.json | 2 +- ...ocationHorizontalAccuracyUnit.primary.json | 2 +- ...ontalCoordinateReferenceSystem.legacy.json | 2 +- ...ntalCoordinateReferenceSystem.primary.json | 2 +- .../values/MonitoringLocationType.legacy.json | 2 +- .../MonitoringLocationType.primary.json | 2 +- ...ngLocationVerticalAccuracyUnit.legacy.json | 2 +- ...gLocationVerticalAccuracyUnit.primary.json | 2 +- ...cationVerticalCollectionMethod.legacy.json | 2 +- ...ationVerticalCollectionMethod.primary.json | 2 +- ...ticalCoordinateReferenceSystem.legacy.json | 2 +- ...icalCoordinateReferenceSystem.primary.json | 2 +- ...MonitoringLocationVerticalUnit.legacy.json | 2 +- ...onitoringLocationVerticalUnit.primary.json | 2 +- .../ResultAnalyticalMethodContext.legacy.json | 2 +- ...ResultAnalyticalMethodContext.primary.json | 2 +- .../ResultDetectionCondition.legacy.json | 2 +- .../ResultDetectionCondition.primary.json | 2 +- ...DetectionQuantitationLimitType.legacy.json | 2 +- ...etectionQuantitationLimitType.primary.json | 2 +- ...DetectionQuantitationLimitUnit.legacy.json | 2 +- ...etectionQuantitationLimitUnit.primary.json | 2 +- .../values/ResultSampleFraction.legacy.json | 2 +- .../values/ResultSampleFraction.primary.json | 2 +- .../src/values/ResultStatusID.legacy.json | 2 +- .../src/values/ResultStatusID.primary.json | 2 +- .../data/src/values/ResultUnit.legacy.json | 2 +- .../data/src/values/ResultUnit.primary.json | 2 +- .../src/values/ResultValueType.legacy.json | 2 +- .../src/values/ResultValueType.primary.json | 2 +- .../SampleCollectionEquipmentName.legacy.json | 2 +- ...SampleCollectionEquipmentName.primary.json | 2 +- .../SampleCollectionMethodContext.legacy.json | 2 +- ...SampleCollectionMethodContext.primary.json | 2 +- .../src/values/SampleCondition.legacy.json | 2 +- .../src/values/SampleCondition.primary.json | 2 +- .../data/src/values/WellDepthUnit.legacy.json | 2 +- .../src/values/WellDepthUnit.primary.json | 2 +- .../data/src/values/WellIDContext.legacy.json | 2 +- .../src/values/WellIDContext.primary.json | 2 +- .../WellOpenIntervalBottomUnit.legacy.json | 2 +- .../WellOpenIntervalBottomUnit.primary.json | 2 +- .../WellOpenIntervalTopUnit.legacy.json | 2 +- .../WellOpenIntervalTopUnit.primary.json | 2 +- .../data/src/values/WellUseType.legacy.json | 2 +- .../data/src/values/WellUseType.primary.json | 2 +- 92 files changed, 1689 insertions(+), 1680 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03f3a3a9..041a511d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "devDependencies": { "@commitlint/cli": "^20.0.0", "@commitlint/config-conventional": "^20.0.0", - "ajv-cmd": "^0.7.0", + "ajv-cmd": "^0.13.0", "ava": "^5.0.0", "c8": "^11.0.0", "husky": "^9.0.0", @@ -24,31 +24,29 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.9.1", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.1.tgz", - "integrity": "sha512-OvyhwtYaWSTfo8NfibmFlgl+pIMaBOmN0OwZ3CPaGscEK3B8FCVDuQ7zgxY8seU/1kfSvNWnyB0DtKJyNLxX7g==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.3.5.tgz", + "integrity": "sha512-orNOYXw3hYXxxisXMldjzjBzqqTLBPbwOtHg7ovBPvfBHDue1qM9YJENZ3W2BQuS+7z4ThogMbEzEsov57Itkg==", "dev": true, "license": "MIT", "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" + "js-yaml": "^4.1.1" }, "engines": { - "node": ">= 16" + "node": ">=20" }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "peerDependencies": { + "@types/json-schema": "^7.0.15" } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -57,9 +55,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -77,17 +75,17 @@ } }, "node_modules/@commitlint/cli": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.4.tgz", - "integrity": "sha512-GLMNQHYGcn0ohL2HMlAnXcD1PS2vqBBGbYKlhrRPOYsWiRoLWtrewsR3uKRb9v/IdS+qOS0vqJQ64n1g8VPKFw==", + "version": "20.5.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.2.tgz", + "integrity": "sha512-IXr5xd3IX8SEG936P8gcpozRplkDeDSwJlt8UvoY1winwIy2udTbQ/cOCgbaaxcjdDqVoS29VUcz/wkwnSozbA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/format": "^20.4.4", - "@commitlint/lint": "^20.4.4", - "@commitlint/load": "^20.4.4", - "@commitlint/read": "^20.4.4", - "@commitlint/types": "^20.4.4", + "@commitlint/format": "^20.5.0", + "@commitlint/lint": "^20.5.0", + "@commitlint/load": "^20.5.2", + "@commitlint/read": "^20.5.0", + "@commitlint/types": "^20.5.0", "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, @@ -99,13 +97,13 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.4.tgz", - "integrity": "sha512-Usg+XXbPNG2GtFWTgRURNWCge1iH1y6jQIvvklOdAbyn2t8ajfVwZCnf5t5X4gUsy17BOiY+myszGsSMIvhOVA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.5.0.tgz", + "integrity": "sha512-t3Ni88rFw1XMa4nZHgOKJ8fIAT9M2j5TnKyTqJzsxea7FUetlNdYFus9dz+MhIRZmc16P0PPyEfh6X2d/qw8SA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "conventional-changelog-conventionalcommits": "^9.2.0" }, "engines": { @@ -113,13 +111,13 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.4.tgz", - "integrity": "sha512-K8hMS9PTLl7EYe5vWtSFQ/sgsV2PHUOtEnosg8k3ZQxCyfKD34I4C7FxWEfRTR54rFKeUYmM3pmRQqBNQeLdlw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.5.0.tgz", + "integrity": "sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "ajv": "^8.11.0" }, "engines": { @@ -127,13 +125,13 @@ } }, "node_modules/@commitlint/ensure": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.4.tgz", - "integrity": "sha512-QivV0M1MGL867XCaF+jJkbVXEPKBALhUUXdjae66hes95aY1p3vBJdrcl3x8jDv2pdKWvIYIz+7DFRV/v0dRkA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.5.0.tgz", + "integrity": "sha512-IpHqAUesBeW1EDDdjzJeaOxU9tnogLAyXLRBn03SHlj1SGENn2JGZqSWGkFvBJkJzfXAuCNtsoYzax+ZPS+puw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -155,13 +153,13 @@ } }, "node_modules/@commitlint/format": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.4.tgz", - "integrity": "sha512-jLi/JBA4GEQxc5135VYCnkShcm1/rarbXMn2Tlt3Si7DHiiNKHm4TaiJCLnGbZ1r8UfwDRk+qrzZ80kwh08Aow==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.5.0.tgz", + "integrity": "sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "picocolors": "^1.1.1" }, "engines": { @@ -169,13 +167,13 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.4.tgz", - "integrity": "sha512-y76rT8yq02x+pMDBI2vY4y/ByAwmJTkta/pASbgo8tldBiKLduX8/2NCRTSCjb3SumE5FBeopERKx3oMIm8RTQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", + "integrity": "sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "semver": "^7.6.0" }, "engines": { @@ -183,32 +181,32 @@ } }, "node_modules/@commitlint/lint": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.4.tgz", - "integrity": "sha512-svOEW+RptcNpXKE7UllcAsV0HDIdOck9reC2TP1QA6K5Fo0xxQV+QPjV8Zqx9g6X/hQBkF2S9ZQZ78Xrv1Eiog==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.5.0.tgz", + "integrity": "sha512-jiM3hNUdu04jFBf1VgPdjtIPvbuVfDTBAc6L98AWcoLjF5sYqkulBHBzlVWll4rMF1T5zeQFB6r//a+s+BBKlA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^20.4.4", - "@commitlint/parse": "^20.4.4", - "@commitlint/rules": "^20.4.4", - "@commitlint/types": "^20.4.4" + "@commitlint/is-ignored": "^20.5.0", + "@commitlint/parse": "^20.5.0", + "@commitlint/rules": "^20.5.0", + "@commitlint/types": "^20.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.4.tgz", - "integrity": "sha512-kvFrzvoIACa/fMjXEP0LNEJB1joaH3q3oeMJsLajXE5IXjYrNGVcW1ZFojXUruVJ7odTZbC3LdE/6+ONW4f2Dg==", + "version": "20.5.2", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.5.2.tgz", + "integrity": "sha512-zmr0RGDz7vThxW1I8ohb9yBjnGuH9mqwJpn21hInjGla+IlLOkS9ey0+dD5HlkzFlY0lX2NYdA2lDW6/0rO7Gw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^20.4.4", + "@commitlint/config-validator": "^20.5.0", "@commitlint/execute-rule": "^20.0.0", - "@commitlint/resolve-extends": "^20.4.4", - "@commitlint/types": "^20.4.4", + "@commitlint/resolve-extends": "^20.5.2", + "@commitlint/types": "^20.5.0", "cosmiconfig": "^9.0.1", "cosmiconfig-typescript-loader": "^6.1.0", "is-plain-obj": "^4.1.0", @@ -219,19 +217,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/load/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@commitlint/message": { "version": "20.4.3", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", @@ -243,13 +228,13 @@ } }, "node_modules/@commitlint/parse": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.4.tgz", - "integrity": "sha512-AjfgOgrjEozeQNzhFu1KL5N0nDx4JZmswVJKNfOTLTUGp6xODhZHCHqb//QUHKOzx36If5DQ7tci2o7szYxu1A==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.5.0.tgz", + "integrity": "sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "conventional-changelog-angular": "^8.2.0", "conventional-commits-parser": "^6.3.0" }, @@ -258,14 +243,14 @@ } }, "node_modules/@commitlint/read": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.4.tgz", - "integrity": "sha512-jvgdAQDdEY6L8kCxOo21IWoiAyNFzvrZb121wU2eBxI1DzWAUZgAq+a8LlJRbT0Qsj9INhIPVWgdaBbEzlF0dQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.5.0.tgz", + "integrity": "sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==", "dev": true, "license": "MIT", "dependencies": { "@commitlint/top-level": "^20.4.3", - "@commitlint/types": "^20.4.4", + "@commitlint/types": "^20.5.0", "git-raw-commits": "^5.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" @@ -275,15 +260,15 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.4.tgz", - "integrity": "sha512-pyOf+yX3c3m/IWAn2Jop+7s0YGKPQ8YvQaxt9IQxnLIM3yZAlBdkKiQCT14TnrmZTkVGTXiLtckcnFTXYwlY0A==", + "version": "20.5.2", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.2.tgz", + "integrity": "sha512-8EhSCU9eNos/5cI1yg64GW79UH1c64O69AfStCsj4zqy6An/qIphVEXj4/+2M6056T8coz00f+UXFn4WUUP1HQ==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^20.4.4", - "@commitlint/types": "^20.4.4", - "global-directory": "^4.0.1", + "@commitlint/config-validator": "^20.5.0", + "@commitlint/types": "^20.5.0", + "global-directory": "^5.0.0", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0" @@ -293,16 +278,16 @@ } }, "node_modules/@commitlint/rules": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.4.tgz", - "integrity": "sha512-PmUp8QPLICn9w05dAx5r1rdOYoTk7SkfusJJh5tP3TqHwo2mlQ9jsOm8F0HSXU9kuLfgTEGNrunAx/dlK/RyPQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.0.tgz", + "integrity": "sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/ensure": "^20.4.4", + "@commitlint/ensure": "^20.5.0", "@commitlint/message": "^20.4.3", "@commitlint/to-lines": "^20.0.0", - "@commitlint/types": "^20.4.4" + "@commitlint/types": "^20.5.0" }, "engines": { "node": ">=v18" @@ -332,9 +317,9 @@ } }, "node_modules/@commitlint/types": { - "version": "20.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.4.tgz", - "integrity": "sha512-dwTGzyAblFXHJNBOgrTuO5Ee48ioXpS5XPRLLatxhQu149DFAHUcB3f0Q5eea3RM4USSsP1+WVT2dBtLVod4fg==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", + "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", "dev": true, "license": "MIT", "dependencies": { @@ -345,10 +330,37 @@ "node": ">=v18" } }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", - "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", "cpu": [ "ppc64" ], @@ -363,9 +375,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", - "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "cpu": [ "arm" ], @@ -380,9 +392,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", - "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "cpu": [ "arm64" ], @@ -397,9 +409,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", - "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "cpu": [ "x64" ], @@ -414,9 +426,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", - "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ "arm64" ], @@ -431,9 +443,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", - "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "cpu": [ "x64" ], @@ -448,9 +460,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", - "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "cpu": [ "arm64" ], @@ -465,9 +477,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", - "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "cpu": [ "x64" ], @@ -482,9 +494,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", - "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "cpu": [ "arm" ], @@ -499,9 +511,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", - "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "cpu": [ "arm64" ], @@ -516,9 +528,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", - "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "cpu": [ "ia32" ], @@ -533,9 +545,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", - "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "cpu": [ "loong64" ], @@ -550,9 +562,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", - "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "cpu": [ "mips64el" ], @@ -567,9 +579,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", - "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "cpu": [ "ppc64" ], @@ -584,9 +596,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", - "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", "cpu": [ "riscv64" ], @@ -601,9 +613,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", - "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", "cpu": [ "s390x" ], @@ -618,9 +630,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", - "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", "cpu": [ "x64" ], @@ -635,9 +647,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", - "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", "cpu": [ "arm64" ], @@ -652,9 +664,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", - "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", "cpu": [ "x64" ], @@ -669,9 +681,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", - "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", "cpu": [ "arm64" ], @@ -686,9 +698,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", - "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", "cpu": [ "x64" ], @@ -703,9 +715,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", - "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", "cpu": [ "arm64" ], @@ -720,9 +732,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", - "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "cpu": [ "x64" ], @@ -737,9 +749,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", - "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "cpu": [ "arm64" ], @@ -754,9 +766,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", - "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "cpu": [ "ia32" ], @@ -771,9 +783,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", - "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "cpu": [ "x64" ], @@ -788,9 +800,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -807,9 +819,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -841,9 +853,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -865,9 +877,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -888,13 +900,13 @@ } }, "node_modules/@fluent/syntax": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.18.1.tgz", - "integrity": "sha512-h0dnIoIg1RwUZRKynTizlVCe0v5qAO9d92ugmRi8sVMM15mwwftf7dpEKdDRc/pybbrpDhmvZRykEel0Cs/RYg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz", + "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=12.0.0", + "node": ">=14.0.0", "npm": ">=7.0.0" } }, @@ -954,13 +966,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", + "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "engines": { @@ -1019,9 +1031,9 @@ "license": "ISC" }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1069,13 +1081,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, "node_modules/@lerna/child-process": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.6.2.tgz", @@ -1128,6 +1133,7 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-6.6.2.tgz", "integrity": "sha512-xQ+1Y7D+9etvUlE+unhG/TwmM6XBzGIdFBaNoW8D8kyOa9M2Jf3vdEtAxVa7mhRz66CENfhL/+I/QkVaa7pwbQ==", + "deprecated": "This package is an implementation detail of Lerna and is no longer published separately.", "dev": true, "license": "MIT", "dependencies": { @@ -1377,23 +1383,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/legacy-package-management/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1479,22 +1468,6 @@ "node": ">=8" } }, - "node_modules/@lerna/legacy-package-management/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1572,11 +1545,11 @@ } }, "node_modules/@lerna/legacy-package-management/node_modules/make-fetch-happen/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -1610,11 +1583,11 @@ } }, "node_modules/@lerna/legacy-package-management/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -1654,38 +1627,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@lerna/legacy-package-management/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -1702,16 +1643,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/legacy-package-management/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -1741,6 +1672,13 @@ "node": ">=10" } }, + "node_modules/@lerna/legacy-package-management/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@lerna/legacy-package-management/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1832,9 +1770,9 @@ } }, "node_modules/@lerna/legacy-package-management/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, "license": "ISC", "engines": { @@ -1870,19 +1808,6 @@ "node": ">=10" } }, - "node_modules/@lerna/legacy-package-management/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2008,9 +1933,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2056,9 +1981,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.3.tgz", + "integrity": "sha512-5rvZbDy5y2k40rre/0OBbYnl03en25XPU3gOVO7532beGMjAipq88VdS9OeLOZNrD+Tb0lDhBJHZ7Gcd8qKlPg==", "dev": true, "license": "ISC", "dependencies": { @@ -2104,19 +2029,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/arborist/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@npmcli/arborist/node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -2267,9 +2179,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -2277,13 +2189,13 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2323,6 +2235,58 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/move-file/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/move-file/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@npmcli/name-from-folder": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", @@ -3024,11 +2988,11 @@ } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3047,11 +3011,11 @@ } }, "node_modules/@sigstore/sign/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3070,6 +3034,28 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@silverbucket/ajv-formats-draft2019": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@silverbucket/ajv-formats-draft2019/-/ajv-formats-draft2019-1.6.5.tgz", + "integrity": "sha512-TUN/aSGMt3mZF45oy+kfCKtnKjBbSRVYFJxZKnGCPbKynPI2tsGyLgD9GEwFS0NLPbX0hUYHYeyFVoJ33HlMCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@silverbucket/iana-schemes": "^1.4.4", + "smtp-address-parser": "^1.1.0", + "uri-js-replace": "^1.0.1" + }, + "peerDependencies": { + "ajv": "*" + } + }, + "node_modules/@silverbucket/iana-schemes": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@silverbucket/iana-schemes/-/iana-schemes-1.4.4.tgz", + "integrity": "sha512-2iUk6DlqdpQQKs3qrCZDf4LQLH1GPtUXmYZFeq0NWw1WkGY2iJBP4aeYZ5v+3ITxtQA3M0t/Sua8AKu+o4O0KA==", + "dev": true, + "license": "MIT" + }, "node_modules/@simple-libs/child-process-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", @@ -3100,9 +3086,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3151,6 +3137,7 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "deprecated": "Deprecated: no longer maintained and no longer used by Sinon packages. See\n https://github.com/sinonjs/nise/issues/243 for replacement details.", "dev": true, "license": "(Unlicense OR Apache-2.0)" }, @@ -3189,9 +3176,9 @@ } }, "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -3199,13 +3186,13 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -3226,7 +3213,8 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -3250,14 +3238,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", - "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.14.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/normalize-package-data": { @@ -3313,9 +3301,9 @@ } }, "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -3350,9 +3338,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -3373,9 +3361,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -3436,9 +3424,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -3453,27 +3441,33 @@ } }, "node_modules/ajv-cmd": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/ajv-cmd/-/ajv-cmd-0.7.12.tgz", - "integrity": "sha512-pzkkF0J4CIwGdXT+f7yy2SVJed9B9eOQOM7CjlOeFkWajR5rdzQ/7Wc6lPvWoS6PqH68DyJZTutIuO5rgFtXHw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/ajv-cmd/-/ajv-cmd-0.13.0.tgz", + "integrity": "sha512-6x+LjpJOaY+wtWAoegctypfhUnbMIiiKES2q6NdXqb1nwPTW49RLhNuh/hcR6pdN+2DVbGv8TxXtOxf9CljyoA==", "dev": true, "license": "MIT", + "workspaces": [ + ".github" + ], "dependencies": { - "@apidevtools/json-schema-ref-parser": "11.9.1", - "ajv": "8.17.1", + "@apidevtools/json-schema-ref-parser": "15.3.5", + "@silverbucket/ajv-formats-draft2019": "1.6.5", + "ajv": "8.20.0", "ajv-errors": "3.0.0", "ajv-formats": "3.0.1", - "ajv-formats-draft2019": "1.6.1", - "ajv-ftl-i18n": "0.1.1", + "ajv-ftl-i18n": "0.2.1", "ajv-i18n": "4.2.0", "ajv-keywords": "5.1.0", - "commander": "13.1.0", - "esbuild": "^0.25.0", - "sast-json-schema": "^0.0.0-alpha.3" + "commander": "14.0.3", + "esbuild": "^0.28.0", + "sast-json-schema": "0.2.3" }, "bin": { "ajv": "cli.js" }, + "engines": { + "node": ">=24" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/willfarrell" @@ -3507,50 +3501,30 @@ } } }, - "node_modules/ajv-formats-draft2019": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ajv-formats-draft2019/-/ajv-formats-draft2019-1.6.1.tgz", - "integrity": "sha512-JQPvavpkWDvIsBp2Z33UkYCtXCSpW4HD3tAZ+oL4iEFOk9obQZffx0yANwECt6vzr6ET+7HN5czRyqXbnq/u0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1", - "schemes": "^1.4.0", - "smtp-address-parser": "^1.0.3", - "uri-js": "^4.4.1" - }, - "peerDependencies": { - "ajv": "*" - } - }, "node_modules/ajv-ftl-i18n": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ajv-ftl-i18n/-/ajv-ftl-i18n-0.1.1.tgz", - "integrity": "sha512-bJwD8xsGqeI3CvLv1lWdJAGaXoEG8PlDqzx1W5U87pWvEhQR+DqnTZsRQpAo736t9haWR06ECtyJA3GTO/Zphw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ajv-ftl-i18n/-/ajv-ftl-i18n-0.2.1.tgz", + "integrity": "sha512-ThWHxPmLaJYKrl1mMWAYizGqZG1MrHcMgQ4MId2YFAjRn73GrZqSMX+sifQAHXAva0RZVeGHxVqkrWGizDFo6Q==", "dev": true, "license": "MIT", + "workspaces": [ + ".github" + ], "dependencies": { - "commander": "10.0.0", - "fluent-transpiler": "0.2.1" + "commander": "14.0.3", + "fluent-transpiler": "0.4.1" }, "bin": { "ajv-ftl": "cli.js" }, - "funding": { + "engines": { + "node": ">=24" + }, + "funding": { "type": "github", "url": "https://github.com/sponsors/willfarrell" } }, - "node_modules/ajv-ftl-i18n/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/ajv-i18n": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", @@ -4006,15 +3980,15 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -4121,9 +4095,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -4230,94 +4204,6 @@ } } }, - "node_modules/c8/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cacache": { "version": "17.1.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", @@ -4406,15 +4292,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -4468,17 +4354,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4507,18 +4382,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", @@ -4546,30 +4409,16 @@ } }, "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } + "license": "MIT" }, "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, @@ -4970,13 +4819,13 @@ } }, "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/common-ancestor-path": { @@ -5071,22 +4920,10 @@ "dev": true, "license": "ISC" }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/conventional-changelog-angular": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", - "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", "dev": true, "license": "ISC", "dependencies": { @@ -5097,9 +4934,9 @@ } }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.0.tgz", - "integrity": "sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", "dev": true, "license": "ISC", "dependencies": { @@ -5156,16 +4993,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-core/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/conventional-changelog-core/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5184,6 +5011,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.", "dev": true, "license": "MIT", "dependencies": { @@ -5213,19 +5041,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-core/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/conventional-changelog-core/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5407,34 +5222,26 @@ "node": ">=8" } }, - "node_modules/conventional-changelog-core/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/conventional-changelog-core/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "license": "ISC", "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/conventional-changelog-core/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "license": "MIT", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/conventional-changelog-core/node_modules/type-fest": { @@ -5494,6 +5301,20 @@ "node": ">=10" } }, + "node_modules/conventional-changelog-writer/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/conventional-changelog-writer/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5590,9 +5411,9 @@ } }, "node_modules/conventional-changelog-writer/node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -5631,16 +5452,6 @@ "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/conventional-changelog-writer/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -5725,6 +5536,28 @@ "node": ">=8" } }, + "node_modules/conventional-changelog-writer/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/conventional-changelog-writer/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -5759,23 +5592,21 @@ } }, "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/conventional-commits-parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", - "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, "license": "MIT", "dependencies": { @@ -5812,6 +5643,20 @@ "node": ">=10" } }, + "node_modules/conventional-recommended-bump/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", @@ -5833,16 +5678,6 @@ "node": ">=10" } }, - "node_modules/conventional-recommended-bump/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/conventional-recommended-bump/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5861,6 +5696,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.", "dev": true, "license": "MIT", "dependencies": { @@ -5890,19 +5726,6 @@ "node": ">=10" } }, - "node_modules/conventional-recommended-bump/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/conventional-recommended-bump/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6000,16 +5823,6 @@ "node": ">=8" } }, - "node_modules/conventional-recommended-bump/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/conventional-recommended-bump/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -6094,24 +5907,26 @@ "node": ">=8" } }, - "node_modules/conventional-recommended-bump/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/conventional-recommended-bump/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/conventional-recommended-bump/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/conventional-recommended-bump/node_modules/type-fest": { @@ -6189,13 +6004,13 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz", - "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", "dev": true, "license": "MIT", "dependencies": { - "jiti": "^2.6.1" + "jiti": "2.6.1" }, "engines": { "node": ">=v18" @@ -6257,6 +6072,16 @@ "node": ">=0.10.0" } }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -6509,6 +6334,28 @@ "node": ">=6" } }, + "node_modules/del/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/del/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -6540,6 +6387,19 @@ "node": ">=8" } }, + "node_modules/del/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/del/node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -6556,6 +6416,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/del/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6601,9 +6478,9 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6643,17 +6520,6 @@ "node": ">=6.0.0" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -6723,9 +6589,9 @@ } }, "node_modules/emittery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.0.tgz", - "integrity": "sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.1.tgz", + "integrity": "sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw==", "dev": true, "license": "MIT", "engines": { @@ -6801,9 +6667,9 @@ } }, "node_modules/envinfo": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", - "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -6844,9 +6710,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6933,28 +6799,28 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7021,9 +6887,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", - "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7034,32 +6900,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.11", - "@esbuild/android-arm": "0.25.11", - "@esbuild/android-arm64": "0.25.11", - "@esbuild/android-x64": "0.25.11", - "@esbuild/darwin-arm64": "0.25.11", - "@esbuild/darwin-x64": "0.25.11", - "@esbuild/freebsd-arm64": "0.25.11", - "@esbuild/freebsd-x64": "0.25.11", - "@esbuild/linux-arm": "0.25.11", - "@esbuild/linux-arm64": "0.25.11", - "@esbuild/linux-ia32": "0.25.11", - "@esbuild/linux-loong64": "0.25.11", - "@esbuild/linux-mips64el": "0.25.11", - "@esbuild/linux-ppc64": "0.25.11", - "@esbuild/linux-riscv64": "0.25.11", - "@esbuild/linux-s390x": "0.25.11", - "@esbuild/linux-x64": "0.25.11", - "@esbuild/netbsd-arm64": "0.25.11", - "@esbuild/netbsd-x64": "0.25.11", - "@esbuild/openbsd-arm64": "0.25.11", - "@esbuild/openbsd-x64": "0.25.11", - "@esbuild/openharmony-arm64": "0.25.11", - "@esbuild/sunos-x64": "0.25.11", - "@esbuild/win32-arm64": "0.25.11", - "@esbuild/win32-ia32": "0.25.11", - "@esbuild/win32-x64": "0.25.11" + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" } }, "node_modules/escalade": { @@ -7198,15 +7064,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -7364,9 +7230,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7436,9 +7302,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7448,6 +7314,28 @@ "node": "*" } }, + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-promise": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", @@ -7511,9 +7399,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7523,24 +7411,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7611,9 +7481,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -7683,23 +7553,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -7720,26 +7573,10 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7749,48 +7586,6 @@ "node": "*" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7804,19 +7599,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -7850,9 +7632,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7926,6 +7708,13 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -7933,13 +7722,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -8051,9 +7833,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -8101,9 +7883,9 @@ } }, "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8111,9 +7893,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -8121,9 +7903,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -8146,6 +7928,23 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -8171,42 +7970,94 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/fluent-transpiler": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fluent-transpiler/-/fluent-transpiler-0.2.1.tgz", - "integrity": "sha512-pdF72/XOg0NHj97E3aXu9k5PI8FmpRRrk4HMDeo9KRm7eoNczBTHnQjQMuqsAJ06ejT9teAA5fL8qUIhtUe6oA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fluent-transpiler/-/fluent-transpiler-0.4.1.tgz", + "integrity": "sha512-9CNRxPbnMDTt1hdtD2YPdbyH/p5o3xRgkcsZm0dgER+Kg2k3mdvDb4BJ6lVeFx+cGKp6GWPxcZ2n8R4b45JqJw==", "dev": true, "license": "MIT", + "workspaces": [ + ".github" + ], "dependencies": { - "@fluent/syntax": "0.18.1", - "change-case": "4.1.2", - "commander": "9.4.0" + "@fluent/syntax": "0.19.0", + "change-case": "5.4.4", + "commander": "14.0.3" }, "bin": { "ftl": "cli.js" - } - }, - "node_modules/fluent-transpiler/node_modules/commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true, - "license": "MIT", + }, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=24" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/willfarrell" } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -8257,23 +8108,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -8434,6 +8272,13 @@ "node": ">=8" } }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/gauge/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -8776,53 +8621,14 @@ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@conventional-changelog/git-client": "^2.6.0", - "meow": "^13.0.0" - }, - "bin": { - "git-raw-commits": "src/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/git-raw-commits/node_modules/@conventional-changelog/git-client": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.6.0.tgz", - "integrity": "sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@simple-libs/child-process-utils": "^1.0.0", - "@simple-libs/stream-utils": "^1.2.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.3.0" - }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } - } - }, - "node_modules/git-raw-commits/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, "engines": { "node": ">=18" } @@ -8855,6 +8661,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.", "dev": true, "license": "MIT", "dependencies": { @@ -8964,9 +8771,9 @@ } }, "node_modules/git-semver-tags/node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -9005,16 +8812,6 @@ "node": ">=8" } }, - "node_modules/git-semver-tags/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/git-semver-tags/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -9099,6 +8896,28 @@ "node": ">=8" } }, + "node_modules/git-semver-tags/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/git-semver-tags/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9171,9 +8990,10 @@ "license": "ISC" }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -9205,9 +9025,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -9215,13 +9035,13 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9231,16 +9051,16 @@ } }, "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", "dev": true, "license": "MIT", "dependencies": { - "ini": "4.1.1" + "ini": "6.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9340,9 +9160,9 @@ "license": "MIT" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9460,9 +9280,9 @@ "license": "ISC" }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -9472,17 +9292,6 @@ "node": ">= 0.4" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -9576,9 +9385,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { @@ -9647,9 +9456,9 @@ } }, "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -9657,9 +9466,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -9777,13 +9586,13 @@ "license": "ISC" }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/init-package-json": { @@ -10001,9 +9810,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.1.tgz", + "integrity": "sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw==", "dev": true, "license": "MIT", "engines": { @@ -10391,13 +10200,16 @@ } }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-object": { @@ -10520,6 +10332,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -10751,9 +10576,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -10763,6 +10588,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -10839,9 +10677,9 @@ "license": "MIT" }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11066,16 +10904,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/lerna/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/lerna/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -11157,41 +10985,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lerna/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lerna/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/lerna/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11259,16 +11052,6 @@ "semver": "bin/semver.js" } }, - "node_modules/lerna/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/lerna/node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -11285,24 +11068,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lerna/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "node_modules/lerna/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, "node_modules/lerna/node_modules/slash": { "version": "3.0.0", @@ -11381,9 +11152,9 @@ } }, "node_modules/lerna/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, "license": "ISC", "engines": { @@ -11590,17 +11361,17 @@ } }, "node_modules/lint-staged": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.3.tgz", - "integrity": "sha512-RLq2koZ5fGWrx7tcqx2tSTMQj4lRkfNJaebO/li/uunhCJbtZqwTuwPHpgIimAHHi/2nZIiGrkCHDCOeR1onxA==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", "dev": true, "license": "MIT", "dependencies": { "commander": "^14.0.3", "listr2": "^9.0.5", - "micromatch": "^4.0.8", + "picomatch": "^4.0.3", "string-argv": "^0.3.2", - "tinyexec": "^1.0.2", + "tinyexec": "^1.0.4", "yaml": "^2.8.2" }, "bin": { @@ -11613,14 +11384,17 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "node_modules/lint-staged/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/listr2": { @@ -11699,9 +11473,9 @@ } }, "node_modules/listr2/node_modules/string-width": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", - "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { @@ -11778,25 +11552,25 @@ } }, "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^6.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -12027,19 +11801,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -12106,16 +11867,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -12199,9 +11950,9 @@ } }, "node_modules/make-fetch-happen/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -12265,7 +12016,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -12293,45 +12044,108 @@ } }, "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/make-fetch-happen/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "aggregate-error": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, "node_modules/make-fetch-happen/node_modules/unique-filename": { @@ -12593,6 +12407,16 @@ "node": ">=0.10.0" } }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -12661,11 +12485,11 @@ } }, "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^3.0.0" }, @@ -12828,9 +12652,9 @@ } }, "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", "dev": true, "license": "BSD-3-Clause" }, @@ -12956,17 +12780,6 @@ "@sinonjs/commons": "^3.0.1" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -12974,6 +12787,35 @@ "dev": true, "license": "MIT" }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -13044,7 +12886,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -13063,9 +12905,9 @@ } }, "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -13091,6 +12933,23 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/nofilter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", @@ -13257,9 +13116,9 @@ } }, "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -13270,7 +13129,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -13288,9 +13147,9 @@ } }, "node_modules/npm-packlist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -13434,11 +13293,11 @@ } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -13473,11 +13332,11 @@ } }, "node_modules/npm-registry-fetch/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -13687,9 +13546,9 @@ } }, "node_modules/nx/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "license": "MIT", "dependencies": { @@ -13705,7 +13564,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -13730,6 +13589,19 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -14140,32 +14012,32 @@ } }, "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14354,9 +14226,9 @@ } }, "node_modules/pacote/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -14377,13 +14249,13 @@ } }, "node_modules/pacote/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14462,11 +14334,11 @@ } }, "node_modules/pacote/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -14497,17 +14369,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14612,36 +14473,14 @@ "parse-path": "^7.0.0" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -14720,9 +14559,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -14792,6 +14631,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-conf/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -14861,16 +14771,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/plur": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", @@ -14922,9 +14822,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -15083,11 +14983,14 @@ "license": "MIT" }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -15225,9 +15128,9 @@ } }, "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -15238,7 +15141,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -15276,9 +15179,9 @@ "license": "MIT" }, "node_modules/read-package-json/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -15486,6 +15389,28 @@ "node": ">=4" } }, + "node_modules/read-pkg/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -15558,6 +15483,22 @@ "node": ">=8" } }, + "node_modules/redos-detector": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/redos-detector/-/redos-detector-6.1.4.tgz", + "integrity": "sha512-lPlka1rEH6kK42gtgokvvxMmpAvyc28DcRjQbGxeP5RJsJWgAduBOdGedVCDPdSyCr4ay/JDxq3nGYsJZyt8tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regjsparser": "0.13.0" + }, + "bin": { + "redos-detector": "bin.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -15615,6 +15556,19 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15636,13 +15590,16 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -15693,6 +15650,13 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -15732,55 +15696,78 @@ "license": "MIT" }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^9.2.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", + "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/run-async": { @@ -15828,15 +15815,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -15911,30 +15898,50 @@ "license": "MIT" }, "node_modules/sast-json-schema": { - "version": "0.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/sast-json-schema/-/sast-json-schema-0.0.0-alpha.4.tgz", - "integrity": "sha512-t+heIMb51EpOmTpnRfakPNF1SIJdRunU2NPWJeozSOltpL/D+hznoaQYlZW/lVfNf9kmB1GZsZz1frpePJGskA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/sast-json-schema/-/sast-json-schema-0.2.3.tgz", + "integrity": "sha512-84DyjPfOHYodSRPGeCXQEOSmUnByNLnqEkOlzWcsJyniVvjinVjDtSUZK3PtWz45e3dee0NZX3aJp2CA2l2XfQ==", "dev": true, "license": "MIT", + "workspaces": [ + ".github" + ], + "dependencies": { + "ajv": "8.18.0", + "redos-detector": "6.1.4" + }, + "bin": { + "sast-json-schema": "cli.js" + }, + "engines": { + "node": ">=24" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/willfarrell" } }, - "node_modules/schemes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/schemes/-/schemes-1.4.0.tgz", - "integrity": "sha512-ImFy9FbCsQlVgnE3TCWmLPCFnVzx0lHL/l+umHplDqAKd0dzFpnS6lFZIpagBlYhKwzVmlV36ec0Y1XTu8JBAQ==", + "node_modules/sast-json-schema/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { - "extend": "^3.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -15944,18 +15951,6 @@ "node": ">=10" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -16098,14 +16093,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -16154,11 +16149,17 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sigstore": { "version": "1.9.0", @@ -16236,11 +16237,11 @@ } }, "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -16259,11 +16260,11 @@ } }, "node_modules/sigstore/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -16342,25 +16343,14 @@ "node": ">=0.10" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -16396,6 +16386,16 @@ "node": ">=4" } }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16436,9 +16436,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, @@ -16455,6 +16455,16 @@ "node": "*" } }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -16927,13 +16937,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -17057,9 +17067,9 @@ } }, "node_modules/supertap/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -17100,6 +17110,7 @@ "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -17236,9 +17247,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17267,9 +17278,9 @@ } }, "node_modules/test-exclude/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -17277,13 +17288,13 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -17309,6 +17320,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17344,9 +17365,9 @@ } }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", "dev": true, "license": "MIT", "engines": { @@ -17506,11 +17527,11 @@ } }, "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -17529,11 +17550,11 @@ } }, "node_modules/tuf-js/node_modules/ssri/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -17660,9 +17681,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -17708,9 +17729,9 @@ } }, "node_modules/undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, "license": "MIT", "peer": true @@ -17782,26 +17803,6 @@ "yarn": "*" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -17812,6 +17813,13 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18014,9 +18022,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -18314,19 +18322,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/write-json-file": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", @@ -18379,6 +18374,13 @@ "semver": "bin/semver" } }, + "node_modules/write-json-file/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/write-json-file/node_modules/write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", @@ -18454,9 +18456,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", "bin": { @@ -18603,13 +18605,13 @@ } }, "node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/package.json b/package.json index f5be272b..20ec1dbf 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "devDependencies": { "@commitlint/cli": "^20.0.0", "@commitlint/config-conventional": "^20.0.0", - "ajv-cmd": "^0.7.0", + "ajv-cmd": "^0.13.0", "ava": "^5.0.0", "c8": "^11.0.0", "lerna": "^6.0.0", diff --git a/schemas/data/bin/build b/schemas/data/bin/build index 4a70a0de..27f30154 100755 --- a/schemas/data/bin/build +++ b/schemas/data/bin/build @@ -11,10 +11,13 @@ deref () { src=$1 opts=${*:2} - cd src - ajv deref ${src}.build.json ${opts} \ - -o ${src}.build.json - cd .. + ajv deref src/${src}.build.json ${opts} \ + -r node_modules/wqx/json-schema/definitions.json \ + -r src/definitions.build.json \ + -r src/logic/*.json \ + -r src/quality-control/*.json \ + -r src/values/*.json \ + -o src/${src}.build.json } clean () { diff --git a/schemas/data/bin/build-values.js b/schemas/data/bin/build-values.js index 1ed18aeb..748bf4b1 100644 --- a/schemas/data/bin/build-values.js +++ b/schemas/data/bin/build-values.js @@ -32,7 +32,7 @@ async function processValues(col, object) { // catch any additions that may be longer object.maxLength = Math.max(...object.enum.map((el) => el.length), 0); - object.$id = `https://datastream.org/schema/data/values/${col}.loose.json`; + object.$id = `https://datastream.org/schema/data/values/${col}.legacy.json`; await writeFile( join(__dirname, `/../src/values/${col}.legacy.json`), JSON.stringify(object, null, 2), @@ -48,7 +48,7 @@ async function processValues(col, object) { object.enum = await subtractions(col, object.enum, retired); //object.enum = await override(col, object.enum); - object.$id = `https://datastream.org/schema/data/values/${col}.strict.json`; + object.$id = `https://datastream.org/schema/data/values/${col}.primary.json`; await writeFile( join(__dirname, `/../src/values/${col}.primary.json`), JSON.stringify(object, null, 2), diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index a41118a5..164d91d4 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -9,7 +9,7 @@ "version": "2.29.0", "license": "MIT", "dependencies": { - "wqx": "3.0.260" + "wqx": "3.0.267" }, "devDependencies": { "change-case": "^5.0.0" @@ -23,9 +23,9 @@ "license": "MIT" }, "node_modules/wqx": { - "version": "3.0.260", - "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.260.tgz", - "integrity": "sha512-VoCt8TWRSok+MAzKdF23pkNyrZlkNRd7AnA2vmyF4/uJAyirVq4mSEvphpKcn/r9lHfWCwEIwlaAtwx4LwEbng==", + "version": "3.0.267", + "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.267.tgz", + "integrity": "sha512-6gHV7W/vP32wWKsqADz0/5IZ8eq5tDS7cuqAnzopSY7VzGnZUkFSCX0FLse8E41RzahNIcdpNakQSbe0+nLqyw==", "license": "MIT" } } diff --git a/schemas/data/package.json b/schemas/data/package.json index c07e22f5..f1a02c4c 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/datastreamapp/schema#readme", "dependencies": { - "wqx": "3.0.260" + "wqx": "3.0.267" }, "devDependencies": { "change-case": "^5.0.0" diff --git a/schemas/data/src/backend.json b/schemas/data/src/backend.json index 07fbeff0..822acbfc 100644 --- a/schemas/data/src/backend.json +++ b/schemas/data/src/backend.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/backend", + "$id": "https://datastream.org/schema/data/backend.json", "$schema": "https://json-schema.org/draft/2020-12/schema#", "$vocabulary": { "https://ajv.js.org/packages/ajv-formats.html#date": true, diff --git a/schemas/data/src/definitions.json b/schemas/data/src/definitions.json index 56f6c8b7..066ff17c 100644 --- a/schemas/data/src/definitions.json +++ b/schemas/data/src/definitions.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/definitions", + "$id": "https://datastream.org/schema/data/definitions.json", "definitions": { "DatasetName": { "$ref": "#/definitions/string", @@ -7,48 +7,48 @@ "maxLength": 512 }, "MonitoringLocationID": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/MonitoringLocationID", + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/MonitoringLocationID", "minLength": 1, "errorMessage": { "pattern": "error-string-pattern" } }, "MonitoringLocationName": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/MonitoringLocationName", + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/MonitoringLocationName", "minLength": 1, "errorMessage": { "pattern": "error-string-pattern" } }, "MonitoringLocationLatitude": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/MonitoringLocationLatitude" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/MonitoringLocationLatitude" }, "MonitoringLocationLongitude": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/MonitoringLocationLongitude" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/MonitoringLocationLongitude" }, "MonitoringLocationHorizontalCoordinateReferenceSystemStrict": { - "$ref": "./values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json" }, "MonitoringLocationHorizontalCoordinateReferenceSystemLoose": { - "$ref": "./values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json" }, "MonitoringLocationHorizontalAccuracyMeasure": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/ActivityHorizontalAccuracyMeasure" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/ActivityHorizontalAccuracyMeasure" }, "MonitoringLocationHorizontalAccuracyUnitStrict": { - "$ref": "./values/MonitoringLocationHorizontalAccuracyUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.primary.json" }, "MonitoringLocationHorizontalAccuracyUnitLoose": { - "$ref": "./values/MonitoringLocationHorizontalAccuracyUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json" }, "MonitoringLocationVerticalMeasure": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/VerticalMeasure" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/VerticalMeasure" }, "MonitoringLocationVerticalUnitStrict": { - "$ref": "./values/MonitoringLocationVerticalUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.primary.json" }, "MonitoringLocationVerticalUnitLoose": { - "$ref": "./values/MonitoringLocationVerticalUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.legacy.json" }, "MonitoringLocationVerticalAccuracyMeasure": { "title": "Monitoring Location Vertical Accuracy Measure", @@ -58,28 +58,28 @@ "maximum": 9007199254740991 }, "MonitoringLocationVerticalAccuracyUnitStrict": { - "$ref": "./values/MonitoringLocationVerticalAccuracyUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.primary.json" }, "MonitoringLocationVerticalAccuracyUnitLoose": { - "$ref": "./values/MonitoringLocationVerticalAccuracyUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.legacy.json" }, "MonitoringLocationVerticalCollectionMethodStrict": { - "$ref": "./values/MonitoringLocationVerticalCollectionMethod.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.primary.json" }, "MonitoringLocationVerticalCollectionMethodLoose": { - "$ref": "./values/MonitoringLocationVerticalCollectionMethod.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.legacy.json" }, "MonitoringLocationVerticalCoordinateReferenceSystemStrict": { - "$ref": "./values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json" }, "MonitoringLocationVerticalCoordinateReferenceSystemLoose": { - "$ref": "./values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json" }, "MonitoringLocationTypeStrict": { - "$ref": "./values/MonitoringLocationType.primary.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationType.primary.json" }, "MonitoringLocationTypeLoose": { - "$ref": "./values/MonitoringLocationType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MonitoringLocationType.legacy.json" }, "WellID": { "title": "Well ID", @@ -88,46 +88,46 @@ "maxLength": 55 }, "WellIDContextStrict": { - "$ref": "./values/WellIDContext.primary.json" + "$ref": "https://datastream.org/schema/data/values/WellIDContext.primary.json" }, "WellIDContextLoose": { - "$ref": "./values/WellIDContext.legacy.json" + "$ref": "https://datastream.org/schema/data/values/WellIDContext.legacy.json" }, "WellUseTypeStrict": { - "$ref": "./values/WellUseType.primary.json" + "$ref": "https://datastream.org/schema/data/values/WellUseType.primary.json" }, "WellUseTypeLoose": { - "$ref": "./values/WellUseType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/WellUseType.legacy.json" }, "AquiferCodeStrict": { - "$ref": "./values/AquiferCode.primary.json" + "$ref": "https://datastream.org/schema/data/values/AquiferCode.primary.json" }, "AquiferCodeLoose": { - "$ref": "./values/AquiferCode.legacy.json" + "$ref": "https://datastream.org/schema/data/values/AquiferCode.legacy.json" }, "AquiferUnitNameStrict": { - "$ref": "./values/AquiferUnitName.primary.json" + "$ref": "https://datastream.org/schema/data/values/AquiferUnitName.primary.json" }, "AquiferUnitNameLoose": { - "$ref": "./values/AquiferUnitName.legacy.json" + "$ref": "https://datastream.org/schema/data/values/AquiferUnitName.legacy.json" }, "AquiferTypeStrict": { - "$ref": "./values/AquiferType.primary.json" + "$ref": "https://datastream.org/schema/data/values/AquiferType.primary.json" }, "AquiferTypeLoose": { - "$ref": "./values/AquiferType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/AquiferType.legacy.json" }, "AquiferUnitPorosityTypeStrict": { - "$ref": "./values/AquiferUnitPorosityType.primary.json" + "$ref": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.primary.json" }, "AquiferUnitPorosityTypeLoose": { - "$ref": "./values/AquiferUnitPorosityType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.legacy.json" }, "LithologyTypeStrict": { - "$ref": "./values/LithologyType.primary.json" + "$ref": "https://datastream.org/schema/data/values/LithologyType.primary.json" }, "LithologyTypeLoose": { - "$ref": "./values/LithologyType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/LithologyType.legacy.json" }, "BoreholeDepthMeasure": { "title": "Borehole Depth Measure", @@ -137,10 +137,10 @@ "maximum": 0 }, "BoreholeDepthUnitStrict": { - "$ref": "./values/BoreholeDepthUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/BoreholeDepthUnit.primary.json" }, "BoreholeDepthUnitLoose": { - "$ref": "./values/BoreholeDepthUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/BoreholeDepthUnit.legacy.json" }, "WellDepthMeasure": { "title": "Well Depth Measure", @@ -150,10 +150,10 @@ "maximum": 0 }, "WellDepthUnitStrict": { - "$ref": "./values/WellDepthUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/WellDepthUnit.primary.json" }, "WellDepthUnitLoose": { - "$ref": "./values/WellDepthUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/WellDepthUnit.legacy.json" }, "WellOpenIntervalTopMeasure": { "title": "Well Open Interval Top Measure", @@ -163,10 +163,10 @@ "maximum": 0 }, "WellOpenIntervalTopUnitStrict": { - "$ref": "./values/WellOpenIntervalTopUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.primary.json" }, "WellOpenIntervalTopUnitLoose": { - "$ref": "./values/WellOpenIntervalTopUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.legacy.json" }, "WellOpenIntervalBottomMeasure": { "title": "Well Open Interval Bottom Measure", @@ -176,22 +176,22 @@ "maximum": 0 }, "WellOpenIntervalBottomUnitStrict": { - "$ref": "./values/WellOpenIntervalBottomUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.primary.json" }, "WellOpenIntervalBottomUnitLoose": { - "$ref": "./values/WellOpenIntervalBottomUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.legacy.json" }, "ActivityTypeStrict": { - "$ref": "./values/ActivityType.primary.json" + "$ref": "https://datastream.org/schema/data/values/ActivityType.primary.json" }, "ActivityTypeLoose": { - "$ref": "./values/ActivityType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ActivityType.legacy.json" }, "ActivityMediaNameStrict": { - "$ref": "./values/ActivityMediaName.primary.json" + "$ref": "https://datastream.org/schema/data/values/ActivityMediaName.primary.json" }, "ActivityMediaNameLoose": { - "$ref": "./values/ActivityMediaName.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ActivityMediaName.legacy.json" }, "ActivityStartDate": { "$ref": "#/definitions/date" @@ -224,19 +224,19 @@ "$ref": "#/definitions/timezone-loose" }, "ActivityDepthHeightMeasure": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/ActivityDepthHeightMeasure" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/ActivityDepthHeightMeasure" }, "ActivityDepthHeightUnitStrict": { - "$ref": "./values/ActivityDepthHeightUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.primary.json" }, "ActivityDepthHeightUnitLoose": { - "$ref": "./values/ActivityDepthHeightUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.legacy.json" }, "ActivityDepthAltitudeReferencePointStrict": { - "$ref": "./values/ActivityDepthAltitudeReferencePoint.primary.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.primary.json" }, "ActivityDepthAltitudeReferencePointLoose": { - "$ref": "./values/ActivityDepthAltitudeReferencePoint.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.legacy.json" }, "ActivityDepthAltitudeReferencePointMeasure": { "title": "Activity Depth Altitude Reference Point Measure", @@ -246,22 +246,22 @@ "maximum": 9007199254740991 }, "ActivityDepthAltitudeReferencePointUnitStrict": { - "$ref": "./values/ActivityDepthAltitudeReferencePointUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.primary.json" }, "ActivityDepthAltitudeReferencePointUnitLoose": { - "$ref": "./values/ActivityDepthAltitudeReferencePointUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.legacy.json" }, "SampleConditionStrict": { - "$ref": "./values/SampleCondition.primary.json" + "$ref": "https://datastream.org/schema/data/values/SampleCondition.primary.json" }, "SampleConditionLoose": { - "$ref": "./values/SampleCondition.legacy.json" + "$ref": "https://datastream.org/schema/data/values/SampleCondition.legacy.json" }, "SampleCollectionEquipmentNameStrict": { - "$ref": "./values/SampleCollectionEquipmentName.primary.json" + "$ref": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.primary.json" }, "SampleCollectionEquipmentNameLoose": { - "$ref": "./values/SampleCollectionEquipmentName.legacy.json" + "$ref": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.legacy.json" }, "SampleCollectionMethodName": { "title": "Sample Collection Method Name", @@ -276,73 +276,73 @@ "maxLength": 50 }, "SampleCollectionMethodContextStrict": { - "$ref": "./values/SampleCollectionMethodContext.primary.json" + "$ref": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.primary.json" }, "SampleCollectionMethodContextLoose": { - "$ref": "./values/SampleCollectionMethodContext.legacy.json" + "$ref": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.legacy.json" }, "CharacteristicNameStrict": { - "$ref": "./values/CharacteristicName.primary.json" + "$ref": "https://datastream.org/schema/data/values/CharacteristicName.primary.json" }, "CharacteristicNameLoose": { - "$ref": "./values/CharacteristicName.legacy.json" + "$ref": "https://datastream.org/schema/data/values/CharacteristicName.legacy.json" }, "MethodSpeciationStrict": { - "$ref": "./values/MethodSpeciation.primary.json" + "$ref": "https://datastream.org/schema/data/values/MethodSpeciation.primary.json" }, "MethodSpeciationLoose": { - "$ref": "./values/MethodSpeciation.legacy.json" + "$ref": "https://datastream.org/schema/data/values/MethodSpeciation.legacy.json" }, "ResultSampleFractionStrict": { - "$ref": "./values/ResultSampleFraction.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultSampleFraction.primary.json" }, "ResultSampleFractionLoose": { - "$ref": "./values/ResultSampleFraction.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultSampleFraction.legacy.json" }, "ResultValue": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/ResultValue" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/ResultValue" }, "ResultUnitStrict": { - "$ref": "./values/ResultUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultUnit.primary.json" }, "ResultUnitLoose": { - "$ref": "./values/ResultUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultUnit.legacy.json" }, "ResultValueTypeStrict": { - "$ref": "./values/ResultValueType.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultValueType.primary.json" }, "ResultValueTypeLoose": { - "$ref": "./values/ResultValueType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultValueType.legacy.json" }, "ResultDetectionConditionStrict": { - "$ref": "./values/ResultDetectionCondition.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionCondition.primary.json" }, "ResultDetectionConditionLoose": { - "$ref": "./values/ResultDetectionCondition.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionCondition.legacy.json" }, "ResultDetectionQuantitationLimitMeasure": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/ResultDetectionQuantitationLimitMeasure" + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/ResultDetectionQuantitationLimitMeasure" }, "ResultDetectionQuantitationLimitUnitStrict": { - "$ref": "./values/ResultDetectionQuantitationLimitUnit.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.primary.json" }, "ResultDetectionQuantitationLimitUnitLoose": { - "$ref": "./values/ResultDetectionQuantitationLimitUnit.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.legacy.json" }, "ResultDetectionQuantitationLimitTypeStrict": { - "$ref": "./values/ResultDetectionQuantitationLimitType.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.primary.json" }, "ResultDetectionQuantitationLimitTypeLoose": { - "$ref": "./values/ResultDetectionQuantitationLimitType.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.legacy.json" }, "ResultStatusIDStrict": { - "$ref": "./values/ResultStatusID.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultStatusID.primary.json" }, "ResultStatusIDLoose": { - "$ref": "./values/ResultStatusID.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultStatusID.legacy.json" }, "ResultComment": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/ResultComment", + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/ResultComment", "errorMessage": { "pattern": "error-string-multiline-pattern" } @@ -354,10 +354,10 @@ "maxLength": 50 }, "ResultAnalyticalMethodContextStrict": { - "$ref": "./values/ResultAnalyticalMethodContext.primary.json" + "$ref": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.primary.json" }, "ResultAnalyticalMethodContextLoose": { - "$ref": "./values/ResultAnalyticalMethodContext.legacy.json" + "$ref": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.legacy.json" }, "ResultAnalyticalMethodName": { "title": "Result Analytical Method Name", @@ -381,7 +381,7 @@ "$ref": "#/definitions/timezone-loose" }, "LaboratoryName": { - "$ref": "../node_modules/wqx/json-schema/definitions.json#/definitions/LaboratoryName", + "$ref": "https://epa.gov/wqx/definitions.json#/definitions/LaboratoryName", "maxLength": 100, "errorMessage": { "pattern": "error-string-pattern" diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index a845cdf8..7d81c112 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema", + "$id": "https://datastream.org/schema/data/extract.json", "$schema": "https://json-schema.org/draft/2020-12/schema#", "$vocabulary": { "https://ajv.js.org/packages/ajv-formats.html#date": true, diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 994c63e7..e19a4db6 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/frontend", + "$id": "https://datastream.org/schema/data/frontend.json", "$schema": "https://json-schema.org/draft/2020-12/schema#", "$vocabulary": { "https://ajv.js.org/packages/ajv-formats.html#date": true, diff --git a/schemas/data/src/logic/ResultUnit-Salinity.json b/schemas/data/src/logic/ResultUnit-Salinity.json index 57b06a78..6df00bf0 100644 --- a/schemas/data/src/logic/ResultUnit-Salinity.json +++ b/schemas/data/src/logic/ResultUnit-Salinity.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/quality-control/ResultUnit-Salinity.json", + "$id": "https://datastream.org/schema/data/logic/ResultUnit-Salinity.json", "title": "ResultUnit-Salinity", "description": "ResultUnit that require special unit notation.", "errorMessage": "error-ResultUnit-Salinity", diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index 0f105fb1..0b6cbd46 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data", + "$id": "https://datastream.org/schema/data/primary.json", "$schema": "https://json-schema.org/draft/2020-12/schema#", "title": "DataStream Data Schema", "description": "Water Quality Data Schema based on WQX.", diff --git a/schemas/data/src/quality-control.json b/schemas/data/src/quality-control.json index a7a7bfaf..7c2e7bb8 100644 --- a/schemas/data/src/quality-control.json +++ b/schemas/data/src/quality-control.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/quality-control", + "$id": "https://datastream.org/schema/data/quality-control.json", "$schema": "https://json-schema.org/draft/2020-12/schema#", "$vocabulary": { "https://ajv.js.org/packages/ajv-errors.html": true diff --git a/schemas/data/src/quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json b/schemas/data/src/quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json index feeed615..e3af078c 100644 --- a/schemas/data/src/quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json +++ b/schemas/data/src/quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/quality-control/ResultDetectionQuantitationLimitMinimumMeasure-Minimum.json", + "$id": "https://datastream.org/schema/data/quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json", "title": "ResultDetectionQuantitationLimitMinimumMeasure-Minimum", "description": "Some water quality measurements, for example concentrations, should not have a value lower than zero. Please review these data points and correct as necessary.", "errorMessage": "qc-ResultDetectionQuantitationLimitMinimumMeasure-Minimum", diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json index 71499ab6..ee03e428 100644 --- a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.legacy.json", "title": "Activity Depth Altitude Reference Point", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json index 05138cb1..5df88f65 100644 --- a/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePoint.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePoint.primary.json", "title": "Activity Depth Altitude Reference Point", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json index 41f36f03..25bc8a88 100644 --- a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json index 49b3f8c0..c9ed519e 100644 --- a/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json +++ b/schemas/data/src/values/ActivityDepthAltitudeReferencePointUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthAltitudeReferencePointUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityDepthHeightUnit.legacy.json b/schemas/data/src/values/ActivityDepthHeightUnit.legacy.json index 84470b2f..66317eee 100644 --- a/schemas/data/src/values/ActivityDepthHeightUnit.legacy.json +++ b/schemas/data/src/values/ActivityDepthHeightUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityDepthHeightUnit.primary.json b/schemas/data/src/values/ActivityDepthHeightUnit.primary.json index 2b4ab20a..5fd1c287 100644 --- a/schemas/data/src/values/ActivityDepthHeightUnit.primary.json +++ b/schemas/data/src/values/ActivityDepthHeightUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityDepthHeightUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityGroupType.legacy.json b/schemas/data/src/values/ActivityGroupType.legacy.json index 65b716f6..68f9f9ab 100644 --- a/schemas/data/src/values/ActivityGroupType.legacy.json +++ b/schemas/data/src/values/ActivityGroupType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityGroupType.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityGroupType.legacy.json", "title": "Activity Group Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityGroupType.primary.json b/schemas/data/src/values/ActivityGroupType.primary.json index 582247d4..2f7c1cf2 100644 --- a/schemas/data/src/values/ActivityGroupType.primary.json +++ b/schemas/data/src/values/ActivityGroupType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityGroupType.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityGroupType.primary.json", "title": "Activity Group Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityMediaName.legacy.json b/schemas/data/src/values/ActivityMediaName.legacy.json index 306bf444..2c544736 100644 --- a/schemas/data/src/values/ActivityMediaName.legacy.json +++ b/schemas/data/src/values/ActivityMediaName.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityMediaName.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityMediaName.legacy.json", "title": "Activity Media Subdivision", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityMediaName.primary.json b/schemas/data/src/values/ActivityMediaName.primary.json index 0f6dadad..b899822d 100644 --- a/schemas/data/src/values/ActivityMediaName.primary.json +++ b/schemas/data/src/values/ActivityMediaName.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityMediaName.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityMediaName.primary.json", "title": "Activity Media Subdivision", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityType.legacy.json b/schemas/data/src/values/ActivityType.legacy.json index c7a2ffe0..aa785917 100644 --- a/schemas/data/src/values/ActivityType.legacy.json +++ b/schemas/data/src/values/ActivityType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityType.loose.json", + "$id": "https://datastream.org/schema/data/values/ActivityType.legacy.json", "title": "Activity Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ActivityType.primary.json b/schemas/data/src/values/ActivityType.primary.json index a51a2686..f79dea07 100644 --- a/schemas/data/src/values/ActivityType.primary.json +++ b/schemas/data/src/values/ActivityType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ActivityType.strict.json", + "$id": "https://datastream.org/schema/data/values/ActivityType.primary.json", "title": "Activity Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferCode.legacy.json b/schemas/data/src/values/AquiferCode.legacy.json index 2a172e93..1da63fbb 100644 --- a/schemas/data/src/values/AquiferCode.legacy.json +++ b/schemas/data/src/values/AquiferCode.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferCode.loose.json", + "$id": "https://datastream.org/schema/data/values/AquiferCode.legacy.json", "title": "Aquifer Code", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferCode.primary.json b/schemas/data/src/values/AquiferCode.primary.json index cb153bfb..68c010cb 100644 --- a/schemas/data/src/values/AquiferCode.primary.json +++ b/schemas/data/src/values/AquiferCode.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferCode.strict.json", + "$id": "https://datastream.org/schema/data/values/AquiferCode.primary.json", "title": "Aquifer Code", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferType.legacy.json b/schemas/data/src/values/AquiferType.legacy.json index 7d54d207..75285bc1 100644 --- a/schemas/data/src/values/AquiferType.legacy.json +++ b/schemas/data/src/values/AquiferType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferType.loose.json", + "$id": "https://datastream.org/schema/data/values/AquiferType.legacy.json", "title": "Aquifer Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferType.primary.json b/schemas/data/src/values/AquiferType.primary.json index 5692c61a..37913825 100644 --- a/schemas/data/src/values/AquiferType.primary.json +++ b/schemas/data/src/values/AquiferType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferType.strict.json", + "$id": "https://datastream.org/schema/data/values/AquiferType.primary.json", "title": "Aquifer Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferUnitName.legacy.json b/schemas/data/src/values/AquiferUnitName.legacy.json index 306f88eb..91b73e65 100644 --- a/schemas/data/src/values/AquiferUnitName.legacy.json +++ b/schemas/data/src/values/AquiferUnitName.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferUnitName.loose.json", + "$id": "https://datastream.org/schema/data/values/AquiferUnitName.legacy.json", "title": "Aquifer Unit Name", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferUnitName.primary.json b/schemas/data/src/values/AquiferUnitName.primary.json index d629d45a..41bca1f8 100644 --- a/schemas/data/src/values/AquiferUnitName.primary.json +++ b/schemas/data/src/values/AquiferUnitName.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferUnitName.strict.json", + "$id": "https://datastream.org/schema/data/values/AquiferUnitName.primary.json", "title": "Aquifer Unit Name", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferUnitPorosityType.legacy.json b/schemas/data/src/values/AquiferUnitPorosityType.legacy.json index ef0b41dc..3b4b61d9 100644 --- a/schemas/data/src/values/AquiferUnitPorosityType.legacy.json +++ b/schemas/data/src/values/AquiferUnitPorosityType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.loose.json", + "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.legacy.json", "title": "Aquifer Unit Porosity Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/AquiferUnitPorosityType.primary.json b/schemas/data/src/values/AquiferUnitPorosityType.primary.json index fd69c791..974bddda 100644 --- a/schemas/data/src/values/AquiferUnitPorosityType.primary.json +++ b/schemas/data/src/values/AquiferUnitPorosityType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.strict.json", + "$id": "https://datastream.org/schema/data/values/AquiferUnitPorosityType.primary.json", "title": "Aquifer Unit Porosity Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/BoreholeDepthUnit.legacy.json b/schemas/data/src/values/BoreholeDepthUnit.legacy.json index d7fb0ac0..0073afde 100644 --- a/schemas/data/src/values/BoreholeDepthUnit.legacy.json +++ b/schemas/data/src/values/BoreholeDepthUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/BoreholeDepthUnit.primary.json b/schemas/data/src/values/BoreholeDepthUnit.primary.json index ae70c78f..9dae5f0c 100644 --- a/schemas/data/src/values/BoreholeDepthUnit.primary.json +++ b/schemas/data/src/values/BoreholeDepthUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/BoreholeDepthUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/CharacteristicGroup.legacy.json b/schemas/data/src/values/CharacteristicGroup.legacy.json index e1bcc075..1c1e7c4f 100644 --- a/schemas/data/src/values/CharacteristicGroup.legacy.json +++ b/schemas/data/src/values/CharacteristicGroup.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/CharacteristicGroup.loose.json", + "$id": "https://datastream.org/schema/data/values/CharacteristicGroup.legacy.json", "title": "Characteristic Group", "description": "", "type": "string", diff --git a/schemas/data/src/values/CharacteristicGroup.primary.json b/schemas/data/src/values/CharacteristicGroup.primary.json index 0ff539a5..3953a7fc 100644 --- a/schemas/data/src/values/CharacteristicGroup.primary.json +++ b/schemas/data/src/values/CharacteristicGroup.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/CharacteristicGroup.strict.json", + "$id": "https://datastream.org/schema/data/values/CharacteristicGroup.primary.json", "title": "Characteristic Group", "description": "", "type": "string", diff --git a/schemas/data/src/values/CharacteristicName.legacy.json b/schemas/data/src/values/CharacteristicName.legacy.json index 8ce5d333..ccf832f6 100644 --- a/schemas/data/src/values/CharacteristicName.legacy.json +++ b/schemas/data/src/values/CharacteristicName.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/CharacteristicName.loose.json", + "$id": "https://datastream.org/schema/data/values/CharacteristicName.legacy.json", "title": "Characteristic", "description": "", "type": "string", @@ -561,6 +561,7 @@ "(Z)-(Perfluorodecyl)ethyl 9-octadecenoate", "(Z)-(Perfluorohexyl)ethyl 9-octadecenoate", "(Z)-(Perfluorooctyl)ethyl 9-octadecenoate", + "(Z)-3-Methyl-2-hexene", "(Z)-Chloro-1-propene", "(Z)-Dimethomorph", "(Z)-Octadec-9-enyl (5-(((2-(((perfluorooctyl)sulphonyl)methylamino)ethoxy)carbonyl)amino)-o-tolyl)carbamate", @@ -3384,6 +3385,7 @@ "1,3-Isobenzofurandione, 5,5'-[2,2,2-trifluoro-1-(trifluoromethyl)ethylidene]bis-, polymer with 4,4'-oxybis[benzenamine] and 4,4'-sulfonylbis[benzenamine]", "1,3-Isobenzofurandione, 5,5'-carbonylbis-, polymer with 4,4'-[[2,2,2-trifluoro-1-(trifluoromethyl)ethylidene]bis(4,1-phenyleneoxy)]bis[benzenamine]", "1,3-Isobenzofurandione, polymer with .alpha.-fluoro-.omega.-(oxiranylmethyl)poly(difluoromethylene) and (phenoxymethyl)oxirane", + "1,3-Octadiene", "1,3-Oxathiolane-4-acetic acid, 5-oxo-2,2-bis(trifluoromethyl)-", "1,3-Pentadiene", "1,3-Pentadiene, (3E)-", @@ -11900,6 +11902,7 @@ "Channel-full width", "Channel-full width-to-depth ratio", "Channelization Type", + "Chara cover", "characteristicname", "Chemical oxygen demand", "Chemical oxygen demand, (high level)", @@ -14839,7 +14842,6 @@ "Hexafluoropropene, oxidized, oligomers, reduced and hydrolyzed", "Hexafluoropropylene oxide dimer acid", "Hexafluoropropylene oxide dimer acid ammonium salt", - "Hexafluoropropylene oxide-dimer acid", "Hexafluoropropylene polymer", "Hexahydrohexamethyl cyclopentabenzopyran lactone", "Hexakis (1H,1H,6H-Decafluorohexyloxy) phosphazine", @@ -16428,6 +16430,7 @@ "Morpholine, 3-methyl-2-phenyl-", "Morpholine, 4-(2,2,3,3-tetrafluoropropyl)-", "Mortality", + "Moss cover", "Moss Stream Reach Coverage Average (choice list)", "Motor Boat Density (choice list)", "Motor Boat Restrictions (choice list)", @@ -21995,7 +21998,6 @@ "Taxonomic Redundancy", "Taxonomic Richness", "Taxonomic Richness, Ephemeroptera, Plecoptera, Tricoptera", - "Taxonomic richness, EPT", "Taxonomic richness, weighted", "Taxonomic unit, assigned", "Taxonomic, pollution tolerance value (PTV) 2-4", @@ -22193,6 +22195,7 @@ "Tetramethylammonium perfluorobutane sulfonate", "Tetramethylammonium perfluorohexane sulfonate", "Tetramethylammonium perfluorooctane sulfonate", + "Tetramethylfulvene", "Tetramethyllead", "Tetramethylpyrazine", "Tetramethyltin", @@ -22527,6 +22530,7 @@ "Tramadol", "trans-(4-Methylcyclohexyl)methanol", "trans-1-Butyl-2-methylcyclopropane", + "trans-1-Ethyl-4-methylcyclohexane", "trans-1,2-Bis(perfluorohexyl)ethylene", "trans-1,2-Cyclohexanediol", "trans-1,2-Dichlorocyclohexane", diff --git a/schemas/data/src/values/CharacteristicName.primary.json b/schemas/data/src/values/CharacteristicName.primary.json index 5d717adb..6b643589 100644 --- a/schemas/data/src/values/CharacteristicName.primary.json +++ b/schemas/data/src/values/CharacteristicName.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/CharacteristicName.strict.json", + "$id": "https://datastream.org/schema/data/values/CharacteristicName.primary.json", "title": "Characteristic", "description": "", "type": "string", diff --git a/schemas/data/src/values/LithologyType.legacy.json b/schemas/data/src/values/LithologyType.legacy.json index 19acd61c..1171e0b8 100644 --- a/schemas/data/src/values/LithologyType.legacy.json +++ b/schemas/data/src/values/LithologyType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/LithologyType.loose.json", + "$id": "https://datastream.org/schema/data/values/LithologyType.legacy.json", "title": "Well Formation Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/LithologyType.primary.json b/schemas/data/src/values/LithologyType.primary.json index bafbecde..fdedec60 100644 --- a/schemas/data/src/values/LithologyType.primary.json +++ b/schemas/data/src/values/LithologyType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/LithologyType.strict.json", + "$id": "https://datastream.org/schema/data/values/LithologyType.primary.json", "title": "Well Formation Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/MeasurementUnit.legacy.json b/schemas/data/src/values/MeasurementUnit.legacy.json index 22f6fd01..ff31f994 100644 --- a/schemas/data/src/values/MeasurementUnit.legacy.json +++ b/schemas/data/src/values/MeasurementUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MeasurementUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/MeasurementUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MeasurementUnit.primary.json b/schemas/data/src/values/MeasurementUnit.primary.json index bb7bf9e2..c1cc7360 100644 --- a/schemas/data/src/values/MeasurementUnit.primary.json +++ b/schemas/data/src/values/MeasurementUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MeasurementUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/MeasurementUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MethodSpeciation.legacy.json b/schemas/data/src/values/MethodSpeciation.legacy.json index c185369e..1062a56d 100644 --- a/schemas/data/src/values/MethodSpeciation.legacy.json +++ b/schemas/data/src/values/MethodSpeciation.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MethodSpeciation.loose.json", + "$id": "https://datastream.org/schema/data/values/MethodSpeciation.legacy.json", "title": "Method Speciation", "description": "", "type": "string", diff --git a/schemas/data/src/values/MethodSpeciation.primary.json b/schemas/data/src/values/MethodSpeciation.primary.json index 4c65374a..5797fb95 100644 --- a/schemas/data/src/values/MethodSpeciation.primary.json +++ b/schemas/data/src/values/MethodSpeciation.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MethodSpeciation.strict.json", + "$id": "https://datastream.org/schema/data/values/MethodSpeciation.primary.json", "title": "Method Speciation", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json b/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json index 990d2792..c0efdb84 100644 --- a/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json +++ b/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.primary.json b/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.primary.json index b4529bdb..73a547a0 100644 --- a/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.primary.json +++ b/schemas/data/src/values/MonitoringLocationHorizontalAccuracyUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalAccuracyUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json index 7e05d371..580ce397 100644 --- a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json +++ b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.legacy.json", "title": "Horizontal Reference Datum", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json index 63352bb7..ae1cf3d4 100644 --- a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json +++ b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json", "title": "Horizontal Reference Datum", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationType.legacy.json b/schemas/data/src/values/MonitoringLocationType.legacy.json index 5764f3fd..22c91202 100644 --- a/schemas/data/src/values/MonitoringLocationType.legacy.json +++ b/schemas/data/src/values/MonitoringLocationType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationType.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationType.legacy.json", "title": "Monitoring Location Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationType.primary.json b/schemas/data/src/values/MonitoringLocationType.primary.json index 9b292715..88df0cb1 100644 --- a/schemas/data/src/values/MonitoringLocationType.primary.json +++ b/schemas/data/src/values/MonitoringLocationType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationType.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationType.primary.json", "title": "Monitoring Location Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json index 4770ff0c..2ef35712 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json index 0c1ef410..f25ceb20 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalAccuracyUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalAccuracyUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json index c5701caf..a8ccd004 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.legacy.json", "title": "Vertical Collection Method", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json index bab7ff41..02bf6c40 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCollectionMethod.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCollectionMethod.primary.json", "title": "Vertical Collection Method", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json index 0a3a87f2..eabcd73e 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.legacy.json", "title": "Vertical Reference Datum", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json index eeded5d2..8380f15b 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalCoordinateReferenceSystem.primary.json", "title": "Vertical Reference Datum", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json b/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json index c3efe811..efe068de 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json +++ b/schemas/data/src/values/MonitoringLocationVerticalUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json index b2d232f5..cf64454b 100644 --- a/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json +++ b/schemas/data/src/values/MonitoringLocationVerticalUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/MonitoringLocationVerticalUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json b/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json index 7e3adbbf..f588ee14 100644 --- a/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json +++ b/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.legacy.json", "title": "Analytical Method Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json b/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json index 76643ee2..a995c995 100644 --- a/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json +++ b/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultAnalyticalMethodContext.primary.json", "title": "Analytical Method Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionCondition.legacy.json b/schemas/data/src/values/ResultDetectionCondition.legacy.json index 6d78522e..6bd194a0 100644 --- a/schemas/data/src/values/ResultDetectionCondition.legacy.json +++ b/schemas/data/src/values/ResultDetectionCondition.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionCondition.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionCondition.legacy.json", "title": "Result Detection Condition", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionCondition.primary.json b/schemas/data/src/values/ResultDetectionCondition.primary.json index cb943d80..e79242bb 100644 --- a/schemas/data/src/values/ResultDetectionCondition.primary.json +++ b/schemas/data/src/values/ResultDetectionCondition.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionCondition.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionCondition.primary.json", "title": "Result Detection Condition", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitType.legacy.json b/schemas/data/src/values/ResultDetectionQuantitationLimitType.legacy.json index 4b960ea4..d1901080 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitType.legacy.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.legacy.json", "title": "Detection Quantitation Limit Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitType.primary.json b/schemas/data/src/values/ResultDetectionQuantitationLimitType.primary.json index e8e53bd0..f0c6a015 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitType.primary.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitType.primary.json", "title": "Detection Quantitation Limit Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json index 20826ddf..29ed0850 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.primary.json b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.primary.json index 7a79185f..17748c16 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.primary.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultDetectionQuantitationLimitUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultSampleFraction.legacy.json b/schemas/data/src/values/ResultSampleFraction.legacy.json index 3602125c..69624adc 100644 --- a/schemas/data/src/values/ResultSampleFraction.legacy.json +++ b/schemas/data/src/values/ResultSampleFraction.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultSampleFraction.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultSampleFraction.legacy.json", "title": "Sample Fraction", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultSampleFraction.primary.json b/schemas/data/src/values/ResultSampleFraction.primary.json index 0a8e1cd7..40b14359 100644 --- a/schemas/data/src/values/ResultSampleFraction.primary.json +++ b/schemas/data/src/values/ResultSampleFraction.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultSampleFraction.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultSampleFraction.primary.json", "title": "Sample Fraction", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultStatusID.legacy.json b/schemas/data/src/values/ResultStatusID.legacy.json index bdf74fcc..0bf82549 100644 --- a/schemas/data/src/values/ResultStatusID.legacy.json +++ b/schemas/data/src/values/ResultStatusID.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultStatusID.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultStatusID.legacy.json", "title": "Result Status", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultStatusID.primary.json b/schemas/data/src/values/ResultStatusID.primary.json index 8dc2314b..01158aa5 100644 --- a/schemas/data/src/values/ResultStatusID.primary.json +++ b/schemas/data/src/values/ResultStatusID.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultStatusID.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultStatusID.primary.json", "title": "Result Status", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultUnit.legacy.json b/schemas/data/src/values/ResultUnit.legacy.json index 16d21699..92de3229 100644 --- a/schemas/data/src/values/ResultUnit.legacy.json +++ b/schemas/data/src/values/ResultUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultUnit.primary.json b/schemas/data/src/values/ResultUnit.primary.json index 11ee1e46..35f3f731 100644 --- a/schemas/data/src/values/ResultUnit.primary.json +++ b/schemas/data/src/values/ResultUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultValueType.legacy.json b/schemas/data/src/values/ResultValueType.legacy.json index f8753999..eb246640 100644 --- a/schemas/data/src/values/ResultValueType.legacy.json +++ b/schemas/data/src/values/ResultValueType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultValueType.loose.json", + "$id": "https://datastream.org/schema/data/values/ResultValueType.legacy.json", "title": "Result Value Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/ResultValueType.primary.json b/schemas/data/src/values/ResultValueType.primary.json index 28d59fad..695bbb20 100644 --- a/schemas/data/src/values/ResultValueType.primary.json +++ b/schemas/data/src/values/ResultValueType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/ResultValueType.strict.json", + "$id": "https://datastream.org/schema/data/values/ResultValueType.primary.json", "title": "Result Value Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json index 49bb0674..2b11e037 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.loose.json", + "$id": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.legacy.json", "title": "Sample Collection Equipment", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json index 4a9242a2..dfdb8afe 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.strict.json", + "$id": "https://datastream.org/schema/data/values/SampleCollectionEquipmentName.primary.json", "title": "Sample Collection Equipment", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCollectionMethodContext.legacy.json b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json index c46cc500..42fe7cbb 100644 --- a/schemas/data/src/values/SampleCollectionMethodContext.legacy.json +++ b/schemas/data/src/values/SampleCollectionMethodContext.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.loose.json", + "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.legacy.json", "title": "Sample Collection Method Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCollectionMethodContext.primary.json b/schemas/data/src/values/SampleCollectionMethodContext.primary.json index d7cb5ec2..fe8b3750 100644 --- a/schemas/data/src/values/SampleCollectionMethodContext.primary.json +++ b/schemas/data/src/values/SampleCollectionMethodContext.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.strict.json", + "$id": "https://datastream.org/schema/data/values/SampleCollectionMethodContext.primary.json", "title": "Sample Collection Method Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCondition.legacy.json b/schemas/data/src/values/SampleCondition.legacy.json index c2dd9a76..b85e97dc 100644 --- a/schemas/data/src/values/SampleCondition.legacy.json +++ b/schemas/data/src/values/SampleCondition.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCondition.loose.json", + "$id": "https://datastream.org/schema/data/values/SampleCondition.legacy.json", "title": "Sample Condition", "description": "", "type": "string", diff --git a/schemas/data/src/values/SampleCondition.primary.json b/schemas/data/src/values/SampleCondition.primary.json index 90bc6d0f..fe14e394 100644 --- a/schemas/data/src/values/SampleCondition.primary.json +++ b/schemas/data/src/values/SampleCondition.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/SampleCondition.strict.json", + "$id": "https://datastream.org/schema/data/values/SampleCondition.primary.json", "title": "Sample Condition", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellDepthUnit.legacy.json b/schemas/data/src/values/WellDepthUnit.legacy.json index 0854b315..d9e645ae 100644 --- a/schemas/data/src/values/WellDepthUnit.legacy.json +++ b/schemas/data/src/values/WellDepthUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellDepthUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/WellDepthUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellDepthUnit.primary.json b/schemas/data/src/values/WellDepthUnit.primary.json index 5a87371c..90d5e110 100644 --- a/schemas/data/src/values/WellDepthUnit.primary.json +++ b/schemas/data/src/values/WellDepthUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellDepthUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/WellDepthUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellIDContext.legacy.json b/schemas/data/src/values/WellIDContext.legacy.json index c78b8329..06b215b8 100644 --- a/schemas/data/src/values/WellIDContext.legacy.json +++ b/schemas/data/src/values/WellIDContext.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellIDContext.loose.json", + "$id": "https://datastream.org/schema/data/values/WellIDContext.legacy.json", "title": "Well ID Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellIDContext.primary.json b/schemas/data/src/values/WellIDContext.primary.json index c342ee3a..c7478a40 100644 --- a/schemas/data/src/values/WellIDContext.primary.json +++ b/schemas/data/src/values/WellIDContext.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellIDContext.strict.json", + "$id": "https://datastream.org/schema/data/values/WellIDContext.primary.json", "title": "Well ID Context", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json b/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json index 50a59221..ffe73824 100644 --- a/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json +++ b/schemas/data/src/values/WellOpenIntervalBottomUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json b/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json index 319debe1..bcad6296 100644 --- a/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json +++ b/schemas/data/src/values/WellOpenIntervalBottomUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json b/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json index 9d3133a3..ab3d1d4f 100644 --- a/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json +++ b/schemas/data/src/values/WellOpenIntervalTopUnit.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.loose.json", + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.legacy.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json b/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json index f204d3e1..42b2a45c 100644 --- a/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json +++ b/schemas/data/src/values/WellOpenIntervalTopUnit.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.strict.json", + "$id": "https://datastream.org/schema/data/values/WellOpenIntervalTopUnit.primary.json", "title": "Measurement Unit", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellUseType.legacy.json b/schemas/data/src/values/WellUseType.legacy.json index 1888abe6..f6c4fe6e 100644 --- a/schemas/data/src/values/WellUseType.legacy.json +++ b/schemas/data/src/values/WellUseType.legacy.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellUseType.loose.json", + "$id": "https://datastream.org/schema/data/values/WellUseType.legacy.json", "title": "Well Type", "description": "", "type": "string", diff --git a/schemas/data/src/values/WellUseType.primary.json b/schemas/data/src/values/WellUseType.primary.json index 83e71baf..8d472ed7 100644 --- a/schemas/data/src/values/WellUseType.primary.json +++ b/schemas/data/src/values/WellUseType.primary.json @@ -1,5 +1,5 @@ { - "$id": "https://datastream.org/schema/data/values/WellUseType.strict.json", + "$id": "https://datastream.org/schema/data/values/WellUseType.primary.json", "title": "Well Type", "description": "", "type": "string", From edc8897f7aa3d7c2d6b1c572acbda0191e6dd5b7 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 28 Apr 2026 14:46:19 -0400 Subject: [PATCH 09/51] test: migrate from AVA to Node.js built-in test runner Replace AVA with `node --test` and `node:assert/strict`. Tests use only a small subset of AVA's API (t.is, t.true, t.false, t.deepEqual, t.pass) which maps cleanly onto node:assert. Coverage now uses Node's built-in --experimental-test-coverage instead of c8. --- package-lock.json | 1434 +------------------------- package.json | 5 +- schemas/data/package.json | 7 +- schemas/data/test/build.js | 18 +- schemas/data/test/format.js | 184 ++-- schemas/data/test/logic.js | 366 +++---- schemas/data/test/messages.js | 21 +- schemas/data/test/quality-control.js | 390 +++---- schemas/data/test/required.js | 164 +-- schemas/data/test/transform.js | 8 +- 10 files changed, 585 insertions(+), 2012 deletions(-) diff --git a/package-lock.json b/package-lock.json index 041a511d..2e5089dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,13 +13,10 @@ "@commitlint/cli": "^20.0.0", "@commitlint/config-conventional": "^20.0.0", "ajv-cmd": "^0.13.0", - "ava": "^5.0.0", - "c8": "^11.0.0", "husky": "^9.0.0", "lerna": "^6.0.0", "lint-staged": "^16.0.0", "prettier": "^3.0.0", - "sinon": "^15.0.0", "standard": "^17.0.0" } }, @@ -64,16 +61,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@commitlint/cli": { "version": "20.5.2", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.2.tgz", @@ -1030,16 +1017,6 @@ "dev": true, "license": "ISC" }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -1053,34 +1030,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@lerna/child-process": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.6.2.tgz", @@ -3092,55 +3041,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", - "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "type-detect": "^4.1.0" - } - }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "deprecated": "Deprecated: no longer maintained and no longer used by Sinon packages. See\n https://github.com/sinonjs/nise/issues/243 for replacement details.", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -3201,13 +3101,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3360,19 +3253,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -3406,23 +3286,6 @@ "node": ">= 8.0.0" } }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -3600,20 +3463,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/aproba": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", @@ -3670,16 +3519,6 @@ "node": ">=8" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -3840,29 +3679,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrgv": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", - "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -3897,72 +3713,6 @@ "node": ">= 4.0.0" } }, - "node_modules/ava": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", - "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0", - "ansi-styles": "^6.2.1", - "arrgv": "^1.0.2", - "arrify": "^3.0.0", - "callsites": "^4.0.0", - "cbor": "^8.1.0", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "chunkd": "^2.0.1", - "ci-info": "^3.8.0", - "ci-parallel-vars": "^1.0.1", - "clean-yaml-object": "^0.1.0", - "cli-truncate": "^3.1.0", - "code-excerpt": "^4.0.0", - "common-path-prefix": "^3.0.0", - "concordance": "^5.0.4", - "currently-unhandled": "^0.4.1", - "debug": "^4.3.4", - "emittery": "^1.0.1", - "figures": "^5.0.0", - "globby": "^13.1.4", - "ignore-by-default": "^2.1.0", - "indent-string": "^5.0.0", - "is-error": "^2.2.2", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "matcher": "^5.0.0", - "mem": "^9.0.2", - "ms": "^2.1.3", - "p-event": "^5.0.1", - "p-map": "^5.5.0", - "picomatch": "^2.3.1", - "pkg-conf": "^4.0.0", - "plur": "^5.1.0", - "pretty-ms": "^8.0.0", - "resolve-cwd": "^3.0.0", - "stack-utils": "^2.0.6", - "strip-ansi": "^7.0.1", - "supertap": "^3.0.1", - "temp-dir": "^3.0.0", - "write-file-atomic": "^5.0.1", - "yargs": "^17.7.2" - }, - "bin": { - "ava": "entrypoints/cli.mjs" - }, - "engines": { - "node": ">=14.19 <15 || >=16.15 <17 || >=18" - }, - "peerDependencies": { - "@ava/typescript": "*" - }, - "peerDependenciesMeta": { - "@ava/typescript": { - "optional": true - } - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4062,19 +3812,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4087,13 +3824,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true, - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -4170,40 +3900,6 @@ "node": ">=10" } }, - "node_modules/c8": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", - "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.1", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^3.1.1", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "test-exclude": "^8.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "monocart-coverage-reports": "^2" - }, - "peerDependenciesMeta": { - "monocart-coverage-reports": { - "optional": true - } - } - }, "node_modules/cacache": { "version": "17.1.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", @@ -4341,19 +4037,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4382,32 +4065,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/change-case": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", @@ -4422,31 +4079,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -4457,13 +4089,6 @@ "node": ">=10" } }, - "node_modules/chunkd": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", - "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", - "dev": true, - "license": "MIT" - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -4480,39 +4105,6 @@ "node": ">=8" } }, - "node_modules/ci-parallel-vars": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", - "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -4539,23 +4131,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -4718,19 +4293,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-to-spaces": "^2.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4835,13 +4397,6 @@ "dev": true, "license": "ISC" }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -4876,30 +4431,10 @@ "typedarray": "^0.0.6" } }, - "node_modules/concordance": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, - "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "node_modules/config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "dependencies": { "ini": "^1.3.4", @@ -5952,23 +5487,6 @@ "node": ">=10" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -6059,19 +5577,6 @@ "node": ">=4" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -6136,19 +5641,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -6477,16 +5969,6 @@ "node": ">=4" } }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6588,19 +6070,6 @@ "node": ">=0.10.0" } }, - "node_modules/emittery": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.1.tgz", - "integrity": "sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -6938,19 +6407,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", @@ -7777,13 +7233,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -7842,23 +7291,6 @@ "reusify": "^1.0.4" } }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8168,21 +7600,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9112,26 +8529,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9305,13 +8702,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -9432,16 +8822,6 @@ "node": ">= 4" } }, - "node_modules/ignore-by-default": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", - "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10 <11 || >=12 <13 || >=14" - } - }, "node_modules/ignore-walk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", @@ -9546,19 +8926,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -9819,16 +9186,6 @@ "node": ">= 12" } }, - "node_modules/irregular-plurals": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -9890,19 +9247,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -10020,13 +9364,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-error": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", - "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", - "dev": true, - "license": "MIT" - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -10053,19 +9390,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -10222,13 +9546,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -10361,19 +9678,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -10457,45 +9761,6 @@ "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -10558,16 +9823,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10746,13 +10001,6 @@ "dev": true, "license": "MIT" }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true, - "license": "MIT" - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11877,22 +11125,6 @@ "node": ">=12" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -12174,19 +11406,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -12200,22 +11419,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/matcher": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", - "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -12226,36 +11429,6 @@ "node": ">= 0.4" } }, - "node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mem": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", - "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", @@ -12323,23 +11496,10 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -12756,30 +11916,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", - "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -12950,16 +12086,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.19" - } - }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -12992,16 +12118,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-bundled": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", @@ -13975,32 +13091,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-event": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", - "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^5.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -14043,22 +13133,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-map-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", @@ -14129,19 +13203,6 @@ "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -14440,19 +13501,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-path": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", @@ -14534,13 +13582,6 @@ "dev": true, "license": "ISC" }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14584,124 +13625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-conf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", - "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/load-json-file": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", - "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-conf/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -14771,22 +13694,6 @@ "node": ">=8" } }, - "node_modules/plur": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", - "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "irregular-plurals": "^3.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -14865,22 +13772,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -15446,19 +14337,6 @@ "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -15951,35 +14829,6 @@ "node": ">=10" } }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -16269,56 +15118,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", - "deprecated": "16.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.4", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -16498,29 +15297,6 @@ "node": ">=8" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/standard": { "version": "17.1.2", "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", @@ -17040,46 +15816,6 @@ "node": ">=4" } }, - "node_modules/supertap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", - "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "js-yaml": "^3.14.1", - "serialize-error": "^7.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/supertap/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/supertap/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17168,16 +15904,6 @@ "node": ">=8" } }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, "node_modules/tempy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz", @@ -17221,105 +15947,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/test-exclude": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", - "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^13.0.6", - "minimatch": "^10.2.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -17354,16 +15981,6 @@ "readable-stream": "3" } }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tinyexec": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", @@ -17572,16 +16189,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -17844,21 +16451,6 @@ "dev": true, "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -17917,16 +16509,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", diff --git a/package.json b/package.json index 20ec1dbf..a13043a7 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint:js": "prettier --write **/*.{js,json} && standard --fix **/*.js", "lint:tf": "terraform fmt -recursive -write", "install": "lerna bootstrap", - "test": "lerna exec --bail --concurrency 5 c8 npm run test", + "test": "lerna exec --bail --concurrency 5 npm run test", "lerna:rm": "npm run lerna:rm:node_modules && npm run lerna:rm:lock", "lerna:rm:lock": "lerna exec -- rm -rf package-lock.json", "lerna:rm:node_modules": "lerna exec -- rm -rf node_modules", @@ -45,13 +45,10 @@ "@commitlint/cli": "^20.0.0", "@commitlint/config-conventional": "^20.0.0", "ajv-cmd": "^0.13.0", - "ava": "^5.0.0", - "c8": "^11.0.0", "lerna": "^6.0.0", "husky": "^9.0.0", "lint-staged": "^16.0.0", "prettier": "^3.0.0", - "sinon": "^15.0.0", "standard": "^17.0.0" } } diff --git a/schemas/data/package.json b/schemas/data/package.json index f1a02c4c..c1f2d217 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -22,7 +22,7 @@ "scripts": { "prebuild": "./bin/build-init.sh && node ./bin/build-values.js && node ./bin/build-logic.js && node ./bin/build-lookup.js && node ./bin/build-locales.js", "build": "./bin/build", - "test": "npm run build && c8 ava", + "test": "npm run build && node --test --experimental-test-coverage --test-coverage-exclude='locales/**' --test-coverage-exclude='test/**' test/*.js", "prepublishOnly": "npm test" }, "author": "willfarrell", @@ -41,10 +41,5 @@ "type": "git", "url": "github:datastreamapp/schema", "directory": "schemas/data" - }, - "c8": { - "exclude": [ - "locales/**" - ] } } diff --git a/schemas/data/test/build.js b/schemas/data/test/build.js index a8b3800d..6d9b53e9 100644 --- a/schemas/data/test/build.js +++ b/schemas/data/test/build.js @@ -1,31 +1,31 @@ -import test from 'ava' - +import { test } from "node:test"; +import assert from "node:assert/strict"; import { toFriendlyName } from '../bin/build-lib.js' test('toFriendlyName › Should convert PascalCase to friendly name', (t) => { - t.is(toFriendlyName('AquiferCode'), 'Aquifer Code') + assert.equal(toFriendlyName('AquiferCode'), 'Aquifer Code') }) test('toFriendlyName › Should convert camelCase to friendly name', (t) => { - t.is(toFriendlyName('aquiferCode'), 'aquifer Code') + assert.equal(toFriendlyName('aquiferCode'), 'aquifer Code') }) test('toFriendlyName › Should handle acronyms followed by words', (t) => { - t.is(toFriendlyName('WellIDContext'), 'Well ID Context') + assert.equal(toFriendlyName('WellIDContext'), 'Well ID Context') }) test('toFriendlyName › Should handle multiple word boundaries', (t) => { - t.is(toFriendlyName('AquiferUnitPorosityType'), 'Aquifer Unit Porosity Type') + assert.equal(toFriendlyName('AquiferUnitPorosityType'), 'Aquifer Unit Porosity Type') }) test('toFriendlyName › Should handle long field names', (t) => { - t.is(toFriendlyName('ActivityDepthAltitudeReferencePoint'), 'Activity Depth Altitude Reference Point') + assert.equal(toFriendlyName('ActivityDepthAltitudeReferencePoint'), 'Activity Depth Altitude Reference Point') }) test('toFriendlyName › Should handle single word', (t) => { - t.is(toFriendlyName('Sample'), 'Sample') + assert.equal(toFriendlyName('Sample'), 'Sample') }) test('toFriendlyName › Should handle consecutive acronyms', (t) => { - t.is(toFriendlyName('XMLHTTPRequest'), 'XMLHTTP Request') + assert.equal(toFriendlyName('XMLHTTPRequest'), 'XMLHTTP Request') }) \ No newline at end of file diff --git a/schemas/data/test/format.js b/schemas/data/test/format.js index 16e40719..9b2da3e8 100644 --- a/schemas/data/test/format.js +++ b/schemas/data/test/format.js @@ -1,5 +1,5 @@ -import test from "ava"; - +import { test } from "node:test"; +import assert from "node:assert/strict"; import validate from "../frontend/index.js"; import validateStrict from "../extract/index.js"; import validateBackend from "../backend/index.js"; @@ -56,12 +56,12 @@ test("Should accept strings", async (t) => { MonitoringLocationID: "1234567890 W̱E¸NÁ¸NEĆ", MonitoringLocationName: "ÀàäÄÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü", }); - t.is(checkProperty(validate.errors, "pattern", "DatasetName"), false); - t.is( + assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), false); + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationID"), false, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationName"), false, ); @@ -85,28 +85,28 @@ test("Should reject strings with multiline", async (t) => { 1234`, }); - t.is(checkProperty(validate.errors, "pattern", "DatasetName"), true); - t.is( + assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), true); + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationID"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationName"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "LaboratoryName"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "LaboratorySampleID"), true, ); @@ -121,7 +121,7 @@ test("Should accept strings-multiline", async (t) => { Other: W̱E¸NÁ¸NEĆ `, }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), false); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); }); // TODO update to included strict and loose time format @@ -131,9 +131,9 @@ test("Should accept time formats", async (t) => { ActivityEndTime: "13:15:00.000", AnalysisStartTime: "0:15", }); - t.is(checkProperty(validate.errors, "pattern", "ActivityStartTime"), false); - t.is(checkProperty(validate.errors, "pattern", "ActivityEndTime"), false); - t.is(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), false); + assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), false); + assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), false); + assert.equal(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), false); }); test("Should reject time formats", async (t) => { @@ -142,18 +142,18 @@ test("Should reject time formats", async (t) => { ActivityEndTime: "13:15.00.000", AnalysisStartTime: "2.15", }); - t.is(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); - t.is(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); - t.is(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); + assert.equal(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), true); validate({ ActivityStartTime: "0:15", ActivityEndTime: "!0:15", // 'AnalysisStartTime': '2.15' }); - t.is(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); - t.is(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); - // t.is(checkProperty(validate.errors, 'pattern', 'AnalysisStartTime'), true) + assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); + // assert.equal(checkProperty(validate.errors, 'pattern', 'AnalysisStartTime'), true) }); test("Should accept timezone formats (strict)", async (t) => { @@ -162,20 +162,20 @@ test("Should accept timezone formats (strict)", async (t) => { ActivityEndTimeZone: "Z", AnalysisStartTimeZone: "Z", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -187,20 +187,20 @@ test("Should accept timezone formats (strict)", async (t) => { ActivityEndTimeZone: "+02:15", AnalysisStartTimeZone: "+02:15", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -212,20 +212,20 @@ test("Should accept timezone formats (strict)", async (t) => { ActivityEndTimeZone: "-02:15", AnalysisStartTimeZone: "-02:15", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 0, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -239,20 +239,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "z", AnalysisStartTimeZone: "z", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -264,20 +264,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "9:45", AnalysisStartTimeZone: "9:45", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -289,20 +289,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "-00:00:00", AnalysisStartTimeZone: "-00:00:00", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 2, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 2, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -314,20 +314,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "-0215", AnalysisStartTimeZone: "-0215", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -339,20 +339,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "-215", AnalysisStartTimeZone: "-215", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -364,20 +364,20 @@ test("Should reject timezone formats (strict)", async (t) => { ActivityEndTimeZone: "-2:15", AnalysisStartTimeZone: "-2:15", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateStrict.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -391,48 +391,48 @@ test("Should accept timezone formats (loose)", async (t) => { ActivityEndTimeZone: "Z", AnalysisStartTimeZone: "Z", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); valid = validateBackend({ ActivityStartTimeZone: "+02:15", ActivityEndTimeZone: "+02:15", AnalysisStartTimeZone: "+02:15", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); valid = validateBackend({ ActivityStartTimeZone: "-02:15", ActivityEndTimeZone: "-02:15", AnalysisStartTimeZone: "-02:15", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); valid = validateBackend({ ActivityStartTimeZone: "-0215", ActivityEndTimeZone: "-0215", AnalysisStartTimeZone: "-0215", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); valid = validateBackend({ ActivityStartTimeZone: "-215", ActivityEndTimeZone: "-215", AnalysisStartTimeZone: "-215", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); valid = validateBackend({ ActivityStartTimeZone: "-2:15", ActivityEndTimeZone: "-2:15", AnalysisStartTimeZone: "-2:15", }); - t.true(valid); - t.is(validateBackend.errors, null); + assert.equal(valid, true); + assert.equal(validateBackend.errors, null); }); test("Should reject timezone formats (loose)", async (t) => { @@ -441,20 +441,20 @@ test("Should reject timezone formats (loose)", async (t) => { ActivityEndTimeZone: "z", AnalysisStartTimeZone: "z", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -466,20 +466,20 @@ test("Should reject timezone formats (loose)", async (t) => { ActivityEndTimeZone: "9:45", AnalysisStartTimeZone: "9:45", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 1, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 1, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -491,20 +491,20 @@ test("Should reject timezone formats (loose)", async (t) => { ActivityEndTimeZone: "-00:00:00", AnalysisStartTimeZone: "-00:00:00", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityStartTimeZone", ).length, 2, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/ActivityEndTimeZone", ).length, 2, ); - t.is( + assert.equal( validateBackend.errors.filter( (i) => i.instancePath === "/AnalysisStartTimeZone", ).length, @@ -516,68 +516,68 @@ test("Should pass CSV Injection check", async (t) => { validate({ ResultComment: "Bar River", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), false); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); }); test("Should reject CSV Injection check when leading space", async (t) => { validate({ ResultComment: " test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading caragereturn", async (t) => { validate({ ResultComment: "\rtest", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading newline", async (t) => { validate({ ResultComment: "\ntest", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading tab", async (t) => { validate({ ResultComment: "\ttest", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading =", async (t) => { validate({ ResultComment: "=test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading +", async (t) => { validate({ ResultComment: "+test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading -", async (t) => { validate({ ResultComment: "-test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading @", async (t) => { validate({ ResultComment: "@test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); test("Should reject CSV Injection check when leading null char", async (t) => { validate({ ResultComment: "\x00test", }); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index b272fb7d..3d6d8dfa 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -1,5 +1,5 @@ -import test from "ava"; - +import { test } from "node:test"; +import assert from "node:assert/strict"; import validate from "../frontend/index.js"; const checkProperty = (errors, keyword, property) => { @@ -61,9 +61,9 @@ test("Should accept ActivityType without ActivityStartTime for non-CTS", async ( const valid = validate({ ActivityType: "Field Msr/Obs", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTime"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); }); test("Should accept ActivityType with ActivityStartTime for non-CTS", async (t) => { @@ -71,17 +71,17 @@ test("Should accept ActivityType with ActivityStartTime for non-CTS", async (t) ActivityType: "Field Msr/Obs", ActivityStartTime: '13:15:00', }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTime"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); }); test("Should reject ActivityType Field Msr/Obs-Continuous Time Series without ActivityStartTime for CTS", async (t) => { const valid = validate({ ActivityType: "Field Msr/Obs-Continuous Time Series", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ActivityStartTime"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), true); }); test("Should accept ActivityType Field Msr/Obs-Continuous Time Series with ActivityStartTime for CTS", async (t) => { @@ -89,9 +89,9 @@ test("Should accept ActivityType Field Msr/Obs-Continuous Time Series with Activ ActivityType: "Field Msr/Obs-Continuous Time Series", ActivityStartTime: '13:15:00', }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTime"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); }); // *** ActivityType-ResultAnalyticalMethod *** // @@ -99,13 +99,13 @@ test("Should reject ActivityType = Sample-*", async (t) => { const valid = validate({ ActivityType: "Sample-Other", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -113,7 +113,7 @@ test("Should reject ActivityType = Sample-*", async (t) => { ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -126,13 +126,13 @@ test("Should reject ActivityType = Quality Control Sample-*", async (t) => { const valid = validate({ ActivityType: "Quality Control Sample-Other", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -140,7 +140,7 @@ test("Should reject ActivityType = Quality Control Sample-*", async (t) => { ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -156,13 +156,13 @@ test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodID & Result ResultAnalyticalMethodID: "0", ResultAnalyticalMethodContext: "ENV", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -170,7 +170,7 @@ test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodID & Result ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -186,13 +186,13 @@ test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalM ResultAnalyticalMethodID: "0", ResultAnalyticalMethodContext: "ENV", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -200,7 +200,7 @@ test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalM ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -216,13 +216,13 @@ test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodName", asyn LaboratoryName: "A", ResultAnalyticalMethodName: "Unspecified", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -230,7 +230,7 @@ test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodName", asyn ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -245,13 +245,13 @@ test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalM LaboratoryName: "A", ResultAnalyticalMethodName: "Unspecified", }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); + assert.equal( checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -259,7 +259,7 @@ test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalM ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -274,35 +274,35 @@ test("Should accept CharacteristicName AND NOT MethodSpeciation", async (t) => { const valid = validate({ CharacteristicName: "Calcium", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); }); test("Should reject CharacteristicName Ammonia, un-ionized AND NOT MethodSpeciation", async (t) => { const valid = validate({ CharacteristicName: "Ammonia, un-ionized", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), true); - t.is(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); + assert.equal(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); }); test("Should reject CharacteristicName Nitrogen-15 AND NOT MethodSpeciation", async (t) => { const valid = validate({ CharacteristicName: "Nitrogen-15", LaboratoryName: "A", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), true); - t.is(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); + assert.equal(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); }); test("Should accept CharacteristicName AND MethodSpeciation", async (t) => { const valid = validate({ CharacteristicName: "Nitrate", MethodSpeciation: "as N", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); }); // *** CharacteristicName-Nutrient-ResultSampleFraction *** // @@ -313,13 +313,13 @@ test("Should reject Nutrient CharacteristicName AND ResultSampleFraction", async ActivityType: "", ResultSampleFraction: "Total", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), false, ); - t.is(checkProperty(validate.errors, "enum", "ResultSampleFraction"), true); + assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), true); }); test("Should accept Nutrient CharacteristicName AND filter ResultSampleFraction", async (t) => { const valid = validate({ @@ -328,13 +328,13 @@ test("Should accept Nutrient CharacteristicName AND filter ResultSampleFraction" ActivityType: "", ResultSampleFraction: "Filtered", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), false, ); - t.is(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); + assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); }); test("Should accept Nutrient Sediment", async (t) => { const valid = validate({ @@ -343,13 +343,13 @@ test("Should accept Nutrient Sediment", async (t) => { ActivityType: "", ResultSampleFraction: "Total", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), false, ); - t.is(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); + assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); }); // test('Should accept Nutrient Sediment with no sample fraction', async (t) => { // let valid = validate({ @@ -359,9 +359,9 @@ test("Should accept Nutrient Sediment", async (t) => { // 'ResultSampleFraction': '' // }) // console.log(validate.errors) -// t.is(checkProperty(validate.errors, 'required', 'CharacteristicName'), false) -// t.is(checkProperty(validate.errors, 'required', 'ResultSampleFraction'), false) -// t.is(checkProperty(validate.errors, 'enum', 'ResultSampleFraction'), false) +// assert.equal(checkProperty(validate.errors, 'required', 'CharacteristicName'), false) +// assert.equal(checkProperty(validate.errors, 'required', 'ResultSampleFraction'), false) +// assert.equal(checkProperty(validate.errors, 'enum', 'ResultSampleFraction'), false) // // }) @@ -370,9 +370,9 @@ test("Should accept CharacteristicName AND NOT ResultSampleFraction", async (t) const valid = validate({ CharacteristicName: "Dissolved oxygen (DO)", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), false, ); @@ -381,8 +381,8 @@ test("Should rejects CharacteristicName AND NOT ResultSampleFraction", async (t) const valid = validate({ CharacteristicName: "Silver", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), true, ); @@ -392,9 +392,9 @@ test("Should accept CharacteristicName AND ResultSampleFraction", async (t) => { CharacteristicName: "Silver", ResultSampleFraction: "Dissolved", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultSampleFraction"), false, ); @@ -405,35 +405,35 @@ test("Should reject StableIsotope CharacteristicName, MethodSpeciation required" const valid = validate({ CharacteristicName: "Nitrogen-15", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); }); test("Should reject StableIsotope CharacteristicName", async (t) => { const valid = validate({ CharacteristicName: "Nitrogen-15", MethodSpeciation: "as NH4", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "enum", "MethodSpeciation"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "enum", "MethodSpeciation"), true); }); test("Should accept StableIsotope CharacteristicName", async (t) => { const valid = validate({ CharacteristicName: "Nitrogen-15", MethodSpeciation: "of NH4", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "required", "MethodSpeciation"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); }); // *** ResultDetectionCondition-ResultValue *** // test("Should reject NOT ResultValue AND NOT ResultDetectionCondition", async (t) => { const valid = validate({}); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ResultValue"), true); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ResultValue"), true); + assert.equal( checkProperty(validate.errors, "required", "ResultDetectionCondition"), true, ); @@ -443,9 +443,9 @@ test("Should reject ResultValue AND ResultDetectionCondition", async (t) => { ResultValue: 1, ResultDetectionCondition: "Not Reported", }); - t.false(valid); - t.is(checkProperty(validate.errors, "false schema", "ResultValue"), true); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "false schema", "ResultValue"), true); + assert.equal( checkProperty(validate.errors, "false schema", "ResultDetectionCondition"), true, ); @@ -455,14 +455,14 @@ test("Should accept ResultValue OR ResultDetectionCondition", async (t) => { let valid = validate({ ResultValue: 1, }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ResultValue"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ResultValue"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultDetectionCondition"), false, ); - t.is(checkProperty(validate.errors, "enum", "ResultValue"), false); - t.is( + assert.equal(checkProperty(validate.errors, "enum", "ResultValue"), false); + assert.equal( checkProperty(validate.errors, "enum", "ResultDetectionCondition"), false, ); @@ -470,14 +470,14 @@ test("Should accept ResultValue OR ResultDetectionCondition", async (t) => { valid = validate({ ResultDetectionCondition: "Not Reported", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ResultValue"), false); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ResultValue"), false); + assert.equal( checkProperty(validate.errors, "required", "ResultDetectionCondition"), false, ); - t.is(checkProperty(validate.errors, "enum", "ResultValue"), false); - t.is( + assert.equal(checkProperty(validate.errors, "enum", "ResultValue"), false); + assert.equal( checkProperty(validate.errors, "enum", "ResultDetectionCondition"), false, ); @@ -488,8 +488,8 @@ test("Should reject ResultDetectionCondition = Present Above Quantification Limi const valid = validate({ ResultDetectionCondition: "Present Above Quantification Limit", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -497,7 +497,7 @@ test("Should reject ResultDetectionCondition = Present Above Quantification Limi ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -505,7 +505,7 @@ test("Should reject ResultDetectionCondition = Present Above Quantification Limi ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -520,8 +520,8 @@ test("Should reject ResultDetectionCondition = Present Below Quantification Limi ResultValue: 1, ResultDetectionCondition: "Present Below Quantification Limit", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -529,7 +529,7 @@ test("Should reject ResultDetectionCondition = Present Below Quantification Limi ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -537,7 +537,7 @@ test("Should reject ResultDetectionCondition = Present Below Quantification Limi ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -555,8 +555,8 @@ test("Should accept ResultDetectionCondition", async (t) => { ResultDetectionQuantitationLimitMeasure: 1, ResultDetectionQuantitationLimitUnit: "mg/L", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -564,7 +564,7 @@ test("Should accept ResultDetectionCondition", async (t) => { ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -572,7 +572,7 @@ test("Should accept ResultDetectionCondition", async (t) => { ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -590,8 +590,8 @@ test("Should reject ResultDetectionCondition = Not Detected", async (t) => { ResultDetectionQuantitationLimitMeasure: 0, ResultDetectionQuantitationLimitUnit: "None", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "false schema", @@ -599,7 +599,7 @@ test("Should reject ResultDetectionCondition = Not Detected", async (t) => { ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "false schema", @@ -607,7 +607,7 @@ test("Should reject ResultDetectionCondition = Not Detected", async (t) => { ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "false schema", @@ -621,8 +621,8 @@ test("Should accept ResultDetectionCondition = Not Detected", async (t) => { const valid = validate({ ResultDetectionCondition: "Not Detected", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "enum", @@ -630,7 +630,7 @@ test("Should accept ResultDetectionCondition = Not Detected", async (t) => { ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "enum", @@ -638,7 +638,7 @@ test("Should accept ResultDetectionCondition = Not Detected", async (t) => { ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "enum", @@ -655,8 +655,8 @@ test("Should reject ResultDetectionCondition = Detected Not Quantified", async ( ResultDetectionQuantitationLimitMeasure: 0, ResultDetectionQuantitationLimitUnit: "None", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "false schema", @@ -664,7 +664,7 @@ test("Should reject ResultDetectionCondition = Detected Not Quantified", async ( ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "false schema", @@ -672,7 +672,7 @@ test("Should reject ResultDetectionCondition = Detected Not Quantified", async ( ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "false schema", @@ -686,8 +686,8 @@ test("Should accept ResultDetectionCondition = Detected Not Quantified", async ( const valid = validate({ ResultDetectionCondition: "Detected Not Quantified", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "enum", @@ -695,7 +695,7 @@ test("Should accept ResultDetectionCondition = Detected Not Quantified", async ( ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "enum", @@ -703,7 +703,7 @@ test("Should accept ResultDetectionCondition = Detected Not Quantified", async ( ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "enum", @@ -726,24 +726,24 @@ carriage return`, LaboratoryName: "\rcarriage return", LaboratorySampleID: "\ttab", }); - t.false(valid); - t.is(checkProperty(validate.errors, "pattern", "DatasetName"), true); - t.is(checkProperty(validate.errors, "pattern", "MonitoringLocationID"), true); - t.is( + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), true); + assert.equal(checkProperty(validate.errors, "pattern", "MonitoringLocationID"), true); + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationName"), true, ); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), true); - t.is( + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), true, ); - t.is(checkProperty(validate.errors, "pattern", "LaboratoryName"), true); - t.is(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), true); + assert.equal(checkProperty(validate.errors, "pattern", "LaboratoryName"), true); + assert.equal(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), true); }); test("Should accept columns without potential csv injection", async (t) => { @@ -757,28 +757,28 @@ test("Should accept columns without potential csv injection", async (t) => { LaboratoryName: "_", LaboratorySampleID: "*", }); - t.false(valid); + assert.equal(valid, false); // console.log(valid, JSON.stringify(validate.errors, null, 2)) - t.is(checkProperty(validate.errors, "pattern", "DatasetName"), false); - t.is( + assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), false); + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationID"), false, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "MonitoringLocationName"), false, ); - t.is(checkProperty(validate.errors, "pattern", "ResultComment"), false); - t.is( + assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), false, ); - t.is( + assert.equal( checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), false, ); - t.is(checkProperty(validate.errors, "pattern", "LaboratoryName"), false); - t.is(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), false); + assert.equal(checkProperty(validate.errors, "pattern", "LaboratoryName"), false); + assert.equal(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), false); }); // *** ResultUnit-Salinity *** // @@ -788,16 +788,16 @@ test("Should accept when Salinity and expected unit", async (t) => { ResultValue: 0, ResultUnit: "PSU", }); - t.is(valid, false); - t.is(checkProperty(validate.errors, "enum", "ResultUnit"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "enum", "ResultUnit"), false); }); test("Should reject when Salinity and `ppt`", async (t) => { const valid = validate({ CharacteristicName: "Salinity", ResultUnit: "ppt", }); - t.is(valid, false); - t.is(checkProperty(validate.errors, "enum", "ResultUnit"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "enum", "ResultUnit"), true); }); // *** ResultDetectionQuantitationLimitUnit-Salinity *** // @@ -807,8 +807,8 @@ test("Should accept when Salinity and expected ResultDetectionQuantitationLimitU ResultDetectionQuantitationLimitMeasure: 0, ResultDetectionQuantitationLimitUnit: "PSU", }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "enum", @@ -823,8 +823,8 @@ test("Should reject when Salinity and ResultDetectionQuantitationLimitUnit=`ppt` ResultDetectionQuantitationLimitMeasure: 0, ResultDetectionQuantitationLimitUnit: "ppt", }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "enum", @@ -839,24 +839,24 @@ test("Should reject Well MonitoringLocationType without WellUseType", async (t) const valid = validate({ MonitoringLocationType: "Well", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "WellUseType"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); }); test("Should reject Piezometer MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ MonitoringLocationType: "Piezometer", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "WellUseType"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); }); test("Should reject Dug Well MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ MonitoringLocationType: "Dug Well", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "WellUseType"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); }); test("Should accept Well MonitoringLocationType with WellUseType", async (t) => { @@ -864,16 +864,16 @@ test("Should accept Well MonitoringLocationType with WellUseType", async (t) => MonitoringLocationType: "Well", WellUseType: "Monitoring - Ambient", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "WellUseType"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellUseType"), false); }); test("Should accept non-well MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ MonitoringLocationType: "River/Stream", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "WellUseType"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellUseType"), false); }); // *** MonitoringLocationType-Well-SampleCondition *** // @@ -882,8 +882,8 @@ test("Should reject Well without SampleCondition for non-CTS", async (t) => { MonitoringLocationType: "Well", ActivityType: "Field Msr/Obs", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "SampleCondition"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), true); }); test("Should accept Well without SampleCondition for CTS", async (t) => { @@ -892,8 +892,8 @@ test("Should accept Well without SampleCondition for CTS", async (t) => { ActivityType: "Field Msr/Obs-Continuous Time Series", ActivityStartTime: "13:15:00", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "SampleCondition"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), false); }); test("Should accept Well with SampleCondition for non-CTS", async (t) => { @@ -902,8 +902,8 @@ test("Should accept Well with SampleCondition for non-CTS", async (t) => { ActivityType: "Field Msr/Obs", SampleCondition: "Static", }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "SampleCondition"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), false); }); // *** ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint *** // @@ -912,8 +912,8 @@ test("Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeRefe ActivityDepthHeightMeasure: -5, ActivityDepthHeightUnit: "m", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), true, ); @@ -925,8 +925,8 @@ test("Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferen ActivityDepthHeightUnit: "m", ActivityDepthAltitudeReferencePoint: "Ground surface", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), false, ); @@ -939,8 +939,8 @@ test("Should reject Water level CharacteristicName without ActivityDepthAltitude ResultValue: -10, ResultUnit: "m", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), true, ); @@ -953,8 +953,8 @@ test("Should accept Water level CharacteristicName with ActivityDepthAltitudeRef ResultUnit: "m", ActivityDepthAltitudeReferencePoint: "Top of well casing", }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), false, ); @@ -983,8 +983,8 @@ test("Should accept Water level CharacteristicName with ActivityDepthAltitudeRef }) console.log(validate.errors) console.log(validate.errors[0].params) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'enum', diff --git a/schemas/data/test/messages.js b/schemas/data/test/messages.js index 80610070..4e165562 100644 --- a/schemas/data/test/messages.js +++ b/schemas/data/test/messages.js @@ -1,5 +1,5 @@ -import test from 'ava' - +import { test } from "node:test"; +import assert from "node:assert/strict"; import en from '../locales/en-CA.js' import validate from '../quality-control/index.js' @@ -10,7 +10,7 @@ test('Should transform error message', async (t) => { ResultSampleFraction: 'Filtered' }) en(validate.errors) - t.is(valid, false) + assert.equal(valid, false) }) test('Should transform enum error message', async (t) => { @@ -19,9 +19,9 @@ test('Should transform enum error message', async (t) => { ResultValue: 7, ResultUnit: 'mg/L' }) - t.is(valid, false) + assert.equal(valid, false) en(validate.errors) - t.true(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0)) + assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) }) test('Should transform minimum error message', async (t) => { @@ -29,9 +29,9 @@ test('Should transform minimum error message', async (t) => { ResultValue: -1, ResultUnit: 'mg/l' }) - t.is(valid, false) + assert.equal(valid, false) en(validate.errors) - t.true(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0)) + assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) }) test('Should transform pattern error message', async (t) => { @@ -39,14 +39,13 @@ test('Should transform pattern error message', async (t) => { ActivityStartDate: '2020-01-01', ActivityStartTime: '9:30:00' }) - t.is(valid, false) + assert.equal(valid, false) en(validate.errors) - t.true(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0)) + assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) }) test('Should handle null errors gracefully', async (t) => { const valid = validate({}) - t.is(valid, true) + assert.equal(valid, true) en(validate.errors) - t.pass() }) diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index b41a0878..9f2ba81b 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -1,5 +1,5 @@ -import test from 'ava' - +import { test } from "node:test"; +import assert from "node:assert/strict"; import validate from '../quality-control/index.js' const defaultObject = { @@ -93,7 +93,7 @@ const checkProperty = (errors, keyword, property) => { test('Should accept with empty object', async (t) => { const obj = {} const valid = validate(obj) - t.true(valid) + assert.equal(valid, true) }) test('Should accept with undefined values', async (t) => { @@ -102,7 +102,7 @@ test('Should accept with undefined values', async (t) => { obj[key] = undefined } const valid = validate(obj) - t.is(valid, true) + assert.equal(valid, true) }) // test('Should accept with empty strings values', function(done) { @@ -115,7 +115,7 @@ test('Should accept with undefined values', async (t) => { // } // const valid = validate(obj) // console.log(valid, JSON.stringify(validate.errors, null, 2)) -// t.is(valid, true) +// assert.equal(valid, true) // // }) @@ -124,8 +124,8 @@ test('Should reject improperly formatted time', async (t) => { ActivityStartDate: '2020-01-01', ActivityStartTime: '9:30:00' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), true) }) // *** ActivityMediaName-ActivityDepthHeightMeasure-Maximum *** // @@ -135,8 +135,8 @@ test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is set ActivityDepthHeightMeasure: 1, ActivityDepthHeightUnit: 'm' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty(validate.errors, 'maximum', 'ActivityDepthHeightMeasure'), true ) @@ -147,7 +147,7 @@ test('Should accept ActivityDepthHeightMeasure < 0 when ActivityMediaName is set ActivityDepthHeightMeasure: -1, ActivityDepthHeightUnit: 'm' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept ActivityDepthHeightMeasure = 0 when ActivityMediaName is set', async (t) => { const valid = validate({ @@ -155,13 +155,13 @@ test('Should accept ActivityDepthHeightMeasure = 0 when ActivityMediaName is set ActivityDepthHeightMeasure: 0, ActivityDepthHeightUnit: 'm' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept when ActivityDepthHeightMeasure is not set and when ActivityMediaName is set', async (t) => { const valid = validate({ ActivityMediaName: 'Surface Water' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is other value', async (t) => { @@ -170,7 +170,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is oth ActivityDepthHeightMeasure: 1, ActivityDepthHeightUnit: 'm' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore ActivityDepthHeightMeasure > 0 when measure is not defined', async (t) => { @@ -178,8 +178,8 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when measure is not defined', ActivityMediaName: 'Surface Water', ActivityDepthHeightUnit: 'm' }) - t.is(valid, true) - t.is( + assert.equal(valid, true) + assert.equal( checkProperty(validate.errors, 'maximum', 'ActivityDepthHeightMeasure'), false ) @@ -190,8 +190,8 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when measure is a string', as ActivityDepthHeightMeasure: 'unknown', ActivityDepthHeightUnit: 'm' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty(validate.errors, 'maximum', 'ActivityDepthHeightMeasure'), false ) @@ -202,9 +202,9 @@ test("Should accept ActivityType without ActivityStartTimeZone for non-CTS", asy const valid = validate({ ActivityType: "Field Msr/Obs", }); - t.true(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); + assert.equal(valid, true); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); }); test("Should accept ActivityType with ActivityStartTimeZone for non-CTS", async (t) => { @@ -213,9 +213,9 @@ test("Should accept ActivityType with ActivityStartTimeZone for non-CTS", async ActivityStartTime: '13:15:00', ActivityStartTimeZone: '-03:00', }); - t.true(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); + assert.equal(valid, true); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); }); test("Should reject ActivityType without ActivityStartTimeZone for CTS", async (t) => { @@ -224,8 +224,8 @@ test("Should reject ActivityType without ActivityStartTimeZone for CTS", async ( ActivityStartDate: '2025-01-01', ActivityStartTime: '13:15:00' }); - t.false(valid); - t.is(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), true); }); test("Should accept ActivityType with ActivityStartTimeZone for CTS", async (t) => { @@ -234,9 +234,9 @@ test("Should accept ActivityType with ActivityStartTimeZone for CTS", async (t) ActivityStartTime: '13:15:00', ActivityStartTimeZone: '-06:00', }); - t.true(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); + assert.equal(valid, true); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); }); // ActivityType-CTS-ActivityStartTimeZone-UTC @@ -246,9 +246,9 @@ test("Should accept ActivityType with UTC ActivityStartTimeZone for non-CTS", as ActivityStartTime: '13:15:00', ActivityStartTimeZone: '+00:00', }); - t.true(valid); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); + assert.equal(valid, true); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); }); test("Should accept ActivityType-CTS-ActivityStartTimeZone-UTC without ActivityStartTimeZone", async (t) => { @@ -256,8 +256,8 @@ test("Should accept ActivityType-CTS-ActivityStartTimeZone-UTC without ActivityS ActivityType: "Field Msr/Obs-Continuous Time Series", ActivityStartDate: '2025-01-01' }); - t.false(valid) - t.is(checkProperty(validate.errors, "message", "qc-ActivityType-CTS-ActivityStartTimeZone-UTC"), false); + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, "message", "qc-ActivityType-CTS-ActivityStartTimeZone-UTC"), false); }); test("Should reject ActivityType with UTC ActivityStartTimeZone for CTS", async (t) => { @@ -266,8 +266,8 @@ test("Should reject ActivityType with UTC ActivityStartTimeZone for CTS", async ActivityStartTime: '13:15:00', ActivityStartTimeZone: '+00:00', }); - t.false(valid); - t.is(checkProperty(validate.errors, "not", "ActivityStartTimeZone"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "not", "ActivityStartTimeZone"), true); }); // *** ActivityType-ResultSampleFraction *** // @@ -277,8 +277,8 @@ test('Should reject ResultSampleFraction when ActivityType is set to field', asy CharacteristicName: 'Temperature, water', ResultSampleFraction: 'Filtered' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty(validate.errors, 'false schema', 'ResultSampleFraction'), true ) @@ -290,7 +290,7 @@ test('Should accept ResultSampleFraction when ActivityType is set to field and C CharacteristicName: 'Ammonia, un-ionized', ResultSampleFraction: 'Filtered' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept empty ResultSampleFraction when ActivityType is set to field', async (t) => { @@ -298,7 +298,7 @@ test('Should accept empty ResultSampleFraction when ActivityType is set to field ActivityType: 'Field Msr/Obs', CharacteristicName: 'Temperature, water' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** CharacteristicName-ActivityMediaName-AmbientAir *** // @@ -307,15 +307,15 @@ test('Should accept CharacteristicName-ActivityMediaName-AmbientAir', async (t) CharacteristicName: 'Temperature, air', ActivityMediaName: 'Ambient Air' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-ActivityMediaName-AmbientAir', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, air', ActivityMediaName: 'Stormwater' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) }) // *** CharacteristicName-ActivityType-Surrogate *** // @@ -326,7 +326,7 @@ test('Should accept CharacteristicName-ActivityType-Surrogate & ResultUnit', asy ResultUnit: "%", ActivityType: 'Quality Control Sample-Lab Surrogate Control Standard' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-ActivityType-Surrogate & ResultUnit', async (t) => { const valid = validate({ @@ -335,8 +335,8 @@ test('Should reject CharacteristicName-ActivityType-Surrogate & ResultUnit', asy ResultUnit: "%", ActivityType: 'Field Msr/Obs-Portable Data Logger' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityType'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) }) test('Should accept CharacteristicName-ActivityType-Surrogate & ResultDetectionQuantitationLimitUnit', async (t) => { @@ -346,7 +346,7 @@ test('Should accept CharacteristicName-ActivityType-Surrogate & ResultDetectionQ ResultDetectionQuantitationLimitUnit: "%", ActivityType: 'Quality Control Sample-Lab Surrogate Control Standard Duplicate' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-ActivityType-Surrogate & ResultDetectionQuantitationLimitUnit', async (t) => { const valid = validate({ @@ -355,8 +355,8 @@ test('Should reject CharacteristicName-ActivityType-Surrogate & ResultDetectionQ ResultDetectionQuantitationLimitUnit: "%", ActivityType: 'Quality Control Sample-Lab Surrogate Method Blank' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityType'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) }) // *** CharacteristicName-Ammonia *** // @@ -364,16 +364,16 @@ test('Should accept CharacteristicName Ammonia, un-ionized', async (t) => { const valid = validate({ CharacteristicName: 'Ammonia, un-ionized' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-Ammonia', async (t) => { const valid = validate({ CharacteristicName: 'Ammonia' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'not', 'CharacteristicName'), true) - t.is(checkProperty(validate.errors, 'message', 'qc-CharacteristicName-Ammonia'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'not', 'CharacteristicName'), true) + assert.equal(checkProperty(validate.errors, 'message', 'qc-CharacteristicName-Ammonia'), true) }) // *** CharacteristicName-Metal-ResultSampleFraction *** // @@ -382,7 +382,7 @@ test('Should accept CharacteristicName-Metal-ResultSampleFraction', async (t) => CharacteristicName: 'Iron', ResultSampleFraction: 'Total' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept CharacteristicName-Metal-ResultSampleFraction when undefined', async (t) => { @@ -390,7 +390,7 @@ test('Should accept CharacteristicName-Metal-ResultSampleFraction when undefined CharacteristicName: 'Europium', ResultSampleFraction: undefined }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-Metal-ResultSampleFraction', async (t) => { @@ -398,8 +398,8 @@ test('Should reject CharacteristicName-Metal-ResultSampleFraction', async (t) => CharacteristicName: 'Iron', ResultSampleFraction: 'Total Recoverable' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'not', 'ResultSampleFraction'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'not', 'ResultSampleFraction'), true) }) // *** CharacteristicName-MethodSpeciation *** // @@ -408,27 +408,27 @@ test('Should accept CharacteristicName-MethodSpeciation when its not expected', CharacteristicName: 'Ammonia and ammonium', MethodSpeciation: 'as N' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject MethodSpeciation when its not expected', async (t) => { const valid = validate({ CharacteristicName: 'pH', MethodSpeciation: 'as N' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'false schema', 'MethodSpeciation'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'false schema', 'MethodSpeciation'), true) }) test('Should accept MethodSpeciation when its expected', async (t) => { const valid = validate({ CharacteristicName: 'pH' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept MethodSpeciation when its not expected', async (t) => { const valid = validate({ CharacteristicName: 'Ammonia and ammonium' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** CharacteristicName-pH-ActivityType-Sample *** // @@ -439,10 +439,10 @@ test("Should accept CharacteristicName-pH,lab with ActivityType-Sample", async ( LaboratoryName: "A", ResultAnalyticalMethodName: "Unspecified" }) - t.true(valid); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), false); - t.is(checkProperty(validate.errors, "required", "ActivityType"), false); - t.is(checkProperty(validate.errors, "not", "ActivityType"), false); + assert.equal(valid, true); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); + assert.equal(checkProperty(validate.errors, "not", "ActivityType"), false); }); test("Should reject CharacteristicName-pH with ActivityType-Sample", async (t) => { @@ -452,9 +452,9 @@ test("Should reject CharacteristicName-pH with ActivityType-Sample", async (t) = LaboratoryName: "A", ResultAnalyticalMethodName: "Unspecified" }) - t.false(valid); - t.is(checkProperty(validate.errors, "not", "ActivityType"), true); - t.is(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "not", "ActivityType"), true); + assert.equal(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); }); test("Should reject CharacteristicName-pH with ActivityType-Quality Control Sample", async (t) => { @@ -464,9 +464,9 @@ test("Should reject CharacteristicName-pH with ActivityType-Quality Control Samp LaboratoryName: "A", ResultAnalyticalMethodName: "Unspecified" }) - t.false(valid); - t.is(checkProperty(validate.errors, "not", "ActivityType"), true); - t.is(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "not", "ActivityType"), true); + assert.equal(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); }); // *** CharacteristicName-Metal-ResultAnalyticalMethodName *** // @@ -475,15 +475,15 @@ test('Should accept CharacteristicName-ResultAnalyticalMethodName', async (t) => CharacteristicName: 'Ammonia and ammonium', ResultAnalyticalMethodName: 'Test Method Name' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject CharacteristicName-ResultAnalyticalMethodName when empty', async (t) => { const valid = validate({ CharacteristicName: 'Day, ice off', ResultAnalyticalMethodName: undefined }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'required', 'ResultAnalyticalMethodName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'ResultAnalyticalMethodName'), true) }) // MonitoringLocationDepthHeightMeasure - TODO future? @@ -494,7 +494,7 @@ test('Should accept MonitoringLocationLatitude/Longitude when its within bounds' MonitoringLocationLatitude: 51, MonitoringLocationLongitude: -114 }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject MonitoringLocationLatitude when its out of bounds', async (t) => { @@ -502,8 +502,8 @@ test('Should reject MonitoringLocationLatitude when its out of bounds', async (t MonitoringLocationLatitude: 35, MonitoringLocationLongitude: -114 }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty(validate.errors, 'minimum', 'MonitoringLocationLatitude'), true ) @@ -514,8 +514,8 @@ test('Should reject MonitoringLocationLongitude when its out of bounds', async ( MonitoringLocationLatitude: 51, MonitoringLocationLongitude: -45 }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty(validate.errors, 'minimum', 'MonitoringLocationLongitude'), true ) @@ -527,37 +527,37 @@ test('Should reject ActivityType when ResultAnalyticalMethodContext is YSI', asy ResultAnalyticalMethodContext: 'YSI', ActivityType: 'Sample-Routine' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityType'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) }) test('Should reject ActivityType when ResultAnalyticalMethodContext is Oakton', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'Oakton', ActivityType: 'Sample-Routine' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityType'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) }) test('Should accept ActivityType when ResultAnalyticalMethodContext is YSI', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'YSI', ActivityType: 'Field Msr/Obs-Portable Data Logger' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept ActivityType when ResultAnalyticalMethodContext is Oakton', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'Oakton', ActivityType: 'Field Msr/Obs-Portable Data Logger' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore ActivityType when ResultAnalyticalMethodContext is not YSI', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'ANY' }) - t.is(valid, true) - // t.is( + assert.equal(valid, true) + // assert.equal( // checkProperty( // validate.errors, // 'minimum', @@ -573,8 +573,8 @@ test('Should reject ResultDetectionQuantitationLimit when measure is below 0', a ResultDetectionQuantitationLimitMeasure: -1, ResultDetectionQuantitationLimitUnit: 'mg/l' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'minimum', @@ -588,14 +588,14 @@ test('Should accept ResultDetectionQuantitationLimit when measure is above 0', a ResultDetectionQuantitationLimitMeasure: 1, ResultDetectionQuantitationLimitUnit: 'mg/l' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore ResultDetectionQuantitationLimit when measure is not defined', async (t) => { const valid = validate({ ResultDetectionQuantitationLimitUnit: 'mg/l' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'minimum', @@ -612,7 +612,7 @@ test('Should accept when CharacteristicName is pH and ResultDetectionQuantitatio ResultDetectionQuantitationLimitMeasure: 7, ResultDetectionQuantitationLimitUnit: 'None' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when CharacteristicName is pH and ResultDetectionQuantitationLimitUnit is not None', async (t) => { const valid = validate({ @@ -620,8 +620,8 @@ test('Should reject when CharacteristicName is pH and ResultDetectionQuantitatio ResultDetectionQuantitationLimitMeasure: 7, ResultDetectionQuantitationLimitUnit: 'mg/L' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'enum', @@ -629,7 +629,7 @@ test('Should reject when CharacteristicName is pH and ResultDetectionQuantitatio ), true ) - // t.is(checkProperty(validate.errors, 'false schema', 'ResultDetectionQuantitationLimitUnit'), true) + // assert.equal(checkProperty(validate.errors, 'false schema', 'ResultDetectionQuantitationLimitUnit'), true) }) // *** CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None *** // @@ -639,7 +639,7 @@ test('Should accept when CharacteristicName is a ratio and ResultDetectionQuanti ResultDetectionQuantitationLimitMeasure: 7, ResultDetectionQuantitationLimitUnit: 'None' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when CharacteristicName is a ratio and ResultDetectionQuantitationLimitUnit is not None', async (t) => { const valid = validate({ @@ -647,8 +647,8 @@ test('Should reject when CharacteristicName is a ratio and ResultDetectionQuanti ResultDetectionQuantitationLimitMeasure: 7, ResultDetectionQuantitationLimitUnit: 'mg/L' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'enum', @@ -656,7 +656,7 @@ test('Should reject when CharacteristicName is a ratio and ResultDetectionQuanti ), true ) - // t.is(checkProperty(validate.errors, 'false schema', 'ResultDetectionQuantitationLimitUnit'), true) + // assert.equal(checkProperty(validate.errors, 'false schema', 'ResultDetectionQuantitationLimitUnit'), true) }) // *** ResultDetectionQuantitationLimitUnit-NoValue *** // @@ -666,15 +666,15 @@ test('Should accept when ResultDetectionQuantitationLimitMeasure & ResultDetecti ResultDetectionQuantitationLimitMeasure: 0, ResultDetectionQuantitationLimitUnit: 'deg C' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when ResultDetectionQuantitationLimitUnit exists without ResultDetectionQuantitationLimitMeasure', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultDetectionQuantitationLimitUnit: 'deg C' }) - t.is(valid, false) - t.is( + assert.equal(valid, false) + assert.equal( checkProperty( validate.errors, 'false schema', @@ -690,7 +690,7 @@ test('Should accept ResultSampleFraction-ActivityMediaName-Sediment', async (t) ActivityMediaName: 'Subsurface Soil/Sediment', ResultSampleFraction: 'Extractable, other' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject ResultSampleFraction-ActivityMediaName-Sediment', async (t) => { @@ -698,8 +698,8 @@ test('Should reject ResultSampleFraction-ActivityMediaName-Sediment', async (t) ActivityMediaName: 'Stormwater', ResultSampleFraction: 'Extractable, other' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) }) // *** ResultSampleFraction-FreeAvailable *** // @@ -708,29 +708,29 @@ test('Should accept ResultSampleFraction Free Available with Chlorine', async (t CharacteristicName: 'Chlorine', ResultSampleFraction: 'Free Available' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should accept ResultSampleFraction Free Available with Cyanide', async (t) => { const valid = validate({ CharacteristicName: 'Cyanide', ResultSampleFraction: 'Free Available' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject ResultSampleFraction Free Available with unrelated CharacteristicName', async (t) => { const valid = validate({ CharacteristicName: 'Iron', ResultSampleFraction: 'Free Available' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) }) test('Should accept when ResultSampleFraction is not Free Available', async (t) => { const valid = validate({ CharacteristicName: 'Iron', ResultSampleFraction: 'Total' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** ResultUnit-Elevation *** // @@ -740,8 +740,8 @@ test('Should accept when ResultSampleFraction is not Free Available', async (t) ResultValue: 1800, ResultUnit: 'm' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) }) test('Should accept Water level in MASL', async (t) => { const valid = validate({ @@ -749,7 +749,7 @@ test('Should accept Water level in MASL', async (t) => { ResultValue: 1800, ResultUnit: 'MASL' }) - t.is(valid, true) + assert.equal(valid, true) })*/ // *** ResultUnit-Percent *** // @@ -760,8 +760,8 @@ test('Should reject Taxonomic Richness... in None', async (t) => { ResultValue: 100, ResultUnit: 'None' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) }) test('Should acceptTaxonomic Richness... in %', async (t) => { const valid = validate({ @@ -770,7 +770,7 @@ test('Should acceptTaxonomic Richness... in %', async (t) => { ResultValue: 100, ResultUnit: '%' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** CharacteristicName-pH-ResultUnit-None *** // @@ -780,7 +780,7 @@ test('Should accept when CharacteristicName is pH and ResultUnit is None', async ResultValue: 7, ResultUnit: 'None' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when CharacteristicName is pH and ResultUnit is not None', async (t) => { const valid = validate({ @@ -788,9 +788,9 @@ test('Should reject when CharacteristicName is pH and ResultUnit is not None', a ResultValue: 7, ResultUnit: 'mg/L' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) - // t.is(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) + // assert.equal(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) }) // *** CharacteristicName-Ratio-ResultUnit-None *** // @@ -800,7 +800,7 @@ test('Should accept when CharacteristicName is a ratio and ResultUnit is None', ResultValue: 7, ResultUnit: 'None' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when CharacteristicName is a ratio and ResultUnit is not None', async (t) => { const valid = validate({ @@ -808,9 +808,9 @@ test('Should reject when CharacteristicName is a ratio and ResultUnit is not Non ResultValue: 7, ResultUnit: 'mg/L' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) - // t.is(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) + // assert.equal(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) }) // *** ResultUnit-NoValue *** // @@ -820,7 +820,7 @@ test('Should accept when ResultValue & ResultUnit exist', async (t) => { ResultValue: 0, ResultUnit: 'deg C' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject when ResultUnit exists without ResultValue', async (t) => { @@ -828,8 +828,8 @@ test('Should reject when ResultUnit exists without ResultValue', async (t) => { CharacteristicName: 'Temperature, water', ResultUnit: 'deg C' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) }) // *** ResultValue-DepthMaximum *** // @@ -839,8 +839,8 @@ test('Should reject when ResultUnit exists without ResultValue', async (t) => { ResultValue: 1, ResultUnit: 'm' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) }) test('Should accept Depth at -1 ft', async (t) => { const valid = validate({ @@ -848,7 +848,7 @@ test('Should accept Depth at -1 ft', async (t) => { ResultValue: -1, ResultUnit: 'ft' }) - t.is(valid, true) + assert.equal(valid, true) })*/ // *** ResultUnit-Turbidity *** // @@ -858,7 +858,7 @@ test('Should accept Turbidity ResultUnit with Turbidity CharacteristicName', asy ResultValue: 10, ResultUnit: 'NTU' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject Turbidity ResultUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ @@ -866,8 +866,8 @@ test('Should reject Turbidity ResultUnit with non-Turbidity CharacteristicName', ResultValue: 10, ResultUnit: 'NTU' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) }) test('Should accept non-Turbidity ResultUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ @@ -875,7 +875,7 @@ test('Should accept non-Turbidity ResultUnit with non-Turbidity CharacteristicNa ResultValue: 10, ResultUnit: 'mg/L' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** ResultDetectionQuantitationLimitUnit-Turbidity *** // @@ -885,7 +885,7 @@ test('Should accept Turbidity ResultDetectionQuantitationLimitUnit with Turbidit ResultDetectionQuantitationLimitMeasure: 10, ResultDetectionQuantitationLimitUnit: 'NTU' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should reject Turbidity ResultDetectionQuantitationLimitUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ @@ -893,8 +893,8 @@ test('Should reject Turbidity ResultDetectionQuantitationLimitUnit with non-Turb ResultDetectionQuantitationLimitMeasure: 10, ResultDetectionQuantitationLimitUnit: 'NTU' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) }) test('Should accept non-Turbidity ResultDetectionQuantitationLimitUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ @@ -902,7 +902,7 @@ test('Should accept non-Turbidity ResultDetectionQuantitationLimitUnit with non- ResultDetectionQuantitationLimitMeasure: 10, ResultDetectionQuantitationLimitUnit: 'mg/L' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** ResultValue-DissolvedOxygenUnit *** // @@ -912,8 +912,8 @@ test('Should reject Dissolved oxygen (DO) in %', async (t) => { ResultValue: 1, ResultUnit: '%' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) }) test('Should accept Dissolved oxygen (DO) in mg/L', async (t) => { const valid = validate({ @@ -921,7 +921,7 @@ test('Should accept Dissolved oxygen (DO) in mg/L', async (t) => { ResultValue: 1, ResultUnit: 'mg/L' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** ResultValue-DOSatMinimum *** // @@ -931,8 +931,8 @@ test('Should reject Dissolved oxygen saturation when measure is below 0', async ResultValue: -1, ResultUnit: 'mg/l' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) }) test('Should accept Dissolved oxygen saturation when measure is above 0', async (t) => { const valid = validate({ @@ -940,7 +940,7 @@ test('Should accept Dissolved oxygen saturation when measure is above 0', async ResultValue: 1, ResultUnit: 'mg/l' }) - t.is(valid, true) + assert.equal(valid, true) }) // *** ResultValue-Minimum *** // @@ -949,30 +949,30 @@ test('Should reject Result when measure is below 0', async (t) => { ResultValue: -1, ResultUnit: 'mg/l' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) }) test('Should accept Result when measure is above 0', async (t) => { const valid = validate({ ResultValue: 1, ResultUnit: 'mg/l' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore Result when measure is not defined', async (t) => { const valid = validate({ ResultUnit: '#/100ml' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) }) test('Should ignore Result when measure is a string', async (t) => { const valid = validate({ ResultValue: 'unknown', ResultUnit: '#/100ml' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) }) // *** ResultValue-pH-Range *** // @@ -982,8 +982,8 @@ test('Should reject pH below range', async (t) => { ResultValue: -1, ResultUnit: 'None' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) }) test('Should reject pH above range', async (t) => { const valid = validate({ @@ -991,8 +991,8 @@ test('Should reject pH above range', async (t) => { ResultValue: 15, ResultUnit: 'None' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) }) test('Should accept pH within range', async (t) => { const valid = validate({ @@ -1000,16 +1000,16 @@ test('Should accept pH within range', async (t) => { ResultValue: 7, ResultUnit: 'None' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore pH range check when measure is not defined', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultUnit: 'None' }) - t.is(valid, false) // due to another QC - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) // due to another QC + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) test('Should ignore pH range check when measure is a string', async (t) => { @@ -1018,9 +1018,9 @@ test('Should ignore pH range check when measure is a string', async (t) => { ResultValue: 'Unknown', ResultUnit: 'None' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) // *** ResultValue-Temperature-Range *** // @@ -1030,8 +1030,8 @@ test('Should reject Temperature below range', async (t) => { ResultValue: -101, ResultUnit: 'deg C' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) }) test('Should reject Temperature above range', async (t) => { const valid = validate({ @@ -1039,8 +1039,8 @@ test('Should reject Temperature above range', async (t) => { ResultValue: 101, ResultUnit: 'deg C' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) }) test('Should accept Temperature within range', async (t) => { const valid = validate({ @@ -1048,16 +1048,16 @@ test('Should accept Temperature within range', async (t) => { ResultValue: 0, ResultUnit: 'deg C' }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore Temperature range check when measure is not defined', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultUnit: 'deg C' }) - t.is(valid, false) // due to another QC - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) // due to another QC + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) test('Should ignore Temperature range check when measure is a string', async (t) => { const valid = validate({ @@ -1065,9 +1065,9 @@ test('Should ignore Temperature range check when measure is a string', async (t) ResultValue: 'Unknown', ResultUnit: 'deg C' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) // *** ResultValue-DOY-Range *** // @@ -1076,40 +1076,40 @@ test('Should reject DOY below range (1-366)', async (t) => { ResultUnit: 'DOY', ResultValue: 0 }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) }) test('Should reject DOY above range (1-366)', async (t) => { const valid = validate({ ResultUnit: 'DOY', ResultValue: 367 }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) }) test('Should accept DOY within range (1-366)', async (t) => { const valid = validate({ ResultUnit: 'DOY', ResultValue: 300 }) - t.is(valid, true) + assert.equal(valid, true) }) test('Should ignore DOY range check when measure is not defined', async (t) => { const valid = validate({ ResultUnit: 'DOY' }) - t.is(valid, false) // due to another QC - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) // due to another QC + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) test('Should ignore DOY range check when measure is a string', async (t) => { const valid = validate({ ResultValue: 'Unknown', ResultUnit: 'DOY' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) - t.is(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) + assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), false) }) // *** WhiteSpace *** // @@ -1124,24 +1124,24 @@ test('Should reject columns with extra whitespace', async (t) => { LaboratoryName: ' sum', LaboratorySampleID: ' sum ' }) - t.is(valid, false) - t.is(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) - t.is(checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), true) - t.is( + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), true) + assert.equal( checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), true ) - t.is(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) - t.is( + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) + assert.equal( checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodID'), true ) - t.is( + assert.equal( checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodName'), true ) - t.is(checkProperty(validate.errors, 'pattern', 'LaboratoryName'), true) - t.is(checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'LaboratoryName'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), true) }) test('Should accept columns without extra whitespace', async (t) => { const valid = validate({ @@ -1154,5 +1154,5 @@ test('Should accept columns without extra whitespace', async (t) => { LaboratoryName: 'sum', LaboratorySampleID: 'A' }) - t.is(valid, true) + assert.equal(valid, true) }) diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index eac36242..328fc71b 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -1,5 +1,5 @@ -import test from "ava"; - +import { test } from "node:test"; +import assert from "node:assert/strict"; import validate from "../frontend/index.js"; const checkProperty = (errors, keyword, property) => { @@ -62,37 +62,37 @@ const checkProperty = (errors, keyword, property) => { test("Should not set any defaults", async (t) => { const data = {}; const valid = validate(data); - t.false(valid); - t.deepEqual(data, {}); + assert.equal(valid, false); + assert.deepEqual(data, {}); }); test("Should require properties", async (t) => { const valid = validate({}); - t.is(valid, false); + assert.equal(valid, false); // #/allOf/0 - t.is(checkProperty(validate.errors, "required", "DatasetName"), true); - t.is( + assert.equal(checkProperty(validate.errors, "required", "DatasetName"), true); + assert.equal( checkProperty(validate.errors, "required", "MonitoringLocationID"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "required", "MonitoringLocationName"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "required", "MonitoringLocationType"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "required", "MonitoringLocationLatitude"), true, ); - t.is( + assert.equal( checkProperty(validate.errors, "required", "MonitoringLocationLongitude"), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "required", @@ -100,11 +100,11 @@ test("Should require properties", async (t) => { ), true, ); - t.is(checkProperty(validate.errors, "required", "ActivityType"), true); - t.is(checkProperty(validate.errors, "required", "ActivityMediaName"), true); - t.is(checkProperty(validate.errors, "required", "ActivityStartDate"), true); - t.is(checkProperty(validate.errors, "required", "CharacteristicName"), true); - t.is(checkProperty(validate.errors, "required", "ResultValueType"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityType"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityStartDate"), true); + assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), true); + assert.equal(checkProperty(validate.errors, "required", "ResultValueType"), true); }); test("Should not require properties", async (t) => { @@ -142,15 +142,15 @@ test("Should not require properties", async (t) => { AnalysisStartTime: "13:15:00", AnalysisStartTimeZone: "-06:00", }); - t.is(valid, true); + assert.equal(valid, true); }); test("Should reject additional headers", async (t) => { const valid = validate({ MonitoringLocationWaterBody: "Lake", }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "unevaluatedProperties", @@ -164,8 +164,8 @@ test("Should reject ActivityDepthHeightMeasure AND NOT ActivityDepthHeightUnit", const valid = validate({ ActivityDepthHeightMeasure: true, }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "ActivityDepthHeightUnit"), true, ); @@ -175,8 +175,8 @@ test("Should accept ActivityDepthHeightMeasure AND ActivityDepthHeightUnit", asy ActivityDepthHeightMeasure: true, ActivityDepthHeightUnit: true, }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "ActivityDepthHeightUnit"), false, ); @@ -186,24 +186,24 @@ test("Should reject ResultValue AND NOT ResultUnit", async (t) => { const valid = validate({ ResultValue: true, }); - t.is(valid, false); - t.is(checkProperty(validate.errors, "dependencies", "ResultUnit"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "ResultUnit"), true); }); test("Should reject ResultValue AND ResultUnit", async (t) => { const valid = validate({ ResultValue: true, ResultUnit: true, }); - t.is(valid, false); - t.is(checkProperty(validate.errors, "dependencies", "ResultUnit"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "ResultUnit"), false); }); test("Should reject ResultDetectionQuantitationLimitMeasure AND NOT ResultDetectionQuantitationLimit{Unit,Type}", async (t) => { const valid = validate({ ResultDetectionQuantitationLimitMeasure: true, }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -211,7 +211,7 @@ test("Should reject ResultDetectionQuantitationLimitMeasure AND NOT ResultDetect ), true, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -226,8 +226,8 @@ test("Should accept ResultDetectionQuantitationLimitMeasure AND ResultDetectionQ ResultDetectionQuantitationLimitUnit: true, ResultDetectionQuantitationLimitType: true, }); - t.is(valid, false); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -235,7 +235,7 @@ test("Should accept ResultDetectionQuantitationLimitMeasure AND ResultDetectionQ ), false, ); - t.is( + assert.equal( checkProperty( validate.errors, "dependencies", @@ -249,8 +249,8 @@ test("Should reject AnalysisStartTime AND NOT AnalysisStartTimeZone", async (t) const valid = validate({ AnalysisStartTime: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "AnalysisStartTimeZone"), true, ); @@ -261,8 +261,8 @@ test("Should accept AnalysisStartTime AND AnalysisStartTimeZone", async (t) => { AnalysisStartTime: true, AnalysisStartTimeZone: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "AnalysisStartTimeZone"), false, ); @@ -274,8 +274,8 @@ test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocation const valid = validate({ MonitoringLocationVerticalMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -289,8 +289,8 @@ test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVert MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -304,8 +304,8 @@ test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocation const valid = validate({ MonitoringLocationVerticalMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -319,8 +319,8 @@ test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVert MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalCollectionMethod: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -334,8 +334,8 @@ test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocation const valid = validate({ MonitoringLocationVerticalMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -349,8 +349,8 @@ test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVert MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalCoordinateReferenceSystem: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -364,8 +364,8 @@ test("Should reject MonitoringLocationVerticalAccuracyMeasure AND NOT Monitoring const valid = validate({ MonitoringLocationVerticalAccuracyMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -379,8 +379,8 @@ test("Should accept MonitoringLocationVerticalAccuracyMeasure AND MonitoringLoca MonitoringLocationVerticalAccuracyMeasure: true, MonitoringLocationVerticalAccuracyUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -394,24 +394,24 @@ test("Should reject WellID AND NOT WellIDContext", async (t) => { const valid = validate({ WellID: true, }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "WellIDContext"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "WellIDContext"), true); }); test("Should accept WellID AND WellIDContext", async (t) => { const valid = validate({ WellID: true, WellIDContext: true, }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "WellIDContext"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "WellIDContext"), false); }); test("Should reject BoreholeDepthMeasure AND NOT BoreholeDepthUnit", async (t) => { const valid = validate({ BoreholeDepthMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), true, ); @@ -421,8 +421,8 @@ test("Should accept BoreholeDepthMeasure AND BoreholeDepthUnit", async (t) => { BoreholeDepthMeasure: true, BoreholeDepthUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), false, ); @@ -432,24 +432,24 @@ test("Should reject WellDepthMeasure AND NOT WellDepthUnit", async (t) => { const valid = validate({ WellDepthMeasure: true, }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), true); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), true); }); test("Should accept WellDepthMeasure AND WellDepthUnit", async (t) => { const valid = validate({ WellDepthMeasure: true, WellDepthUnit: true, }); - t.false(valid); - t.is(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), false); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), false); }); test("Should reject WellOpenIntervalTopMeasure AND NOT WellOpenIntervalTopUnit", async (t) => { const valid = validate({ WellOpenIntervalTopMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), true, ); @@ -459,8 +459,8 @@ test("Should accept WellOpenIntervalTopMeasure AND WellOpenIntervalTopUnit", asy WellOpenIntervalTopMeasure: true, WellOpenIntervalTopUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), false, ); @@ -470,8 +470,8 @@ test("Should reject WellOpenIntervalBottomMeasure AND NOT WellOpenIntervalBottom const valid = validate({ WellOpenIntervalBottomMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -485,8 +485,8 @@ test("Should accept WellOpenIntervalBottomMeasure AND WellOpenIntervalBottomUnit WellOpenIntervalBottomMeasure: true, WellOpenIntervalBottomUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -500,8 +500,8 @@ test("Should reject ActivityDepthAltitudeReferencePointMeasure AND NOT ActivityD const valid = validate({ ActivityDepthAltitudeReferencePointMeasure: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -515,8 +515,8 @@ test("Should accept ActivityDepthAltitudeReferencePointMeasure AND ActivityDepth ActivityDepthAltitudeReferencePointMeasure: true, ActivityDepthAltitudeReferencePointUnit: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -530,8 +530,8 @@ test("Should reject SampleCollectionMethodID AND NOT SampleCollectionMethodConte const valid = validate({ SampleCollectionMethodID: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", @@ -545,8 +545,8 @@ test("Should accept SampleCollectionMethodID AND SampleCollectionMethodContext", SampleCollectionMethodID: true, SampleCollectionMethodContext: true, }); - t.false(valid); - t.is( + assert.equal(valid, false); + assert.equal( checkProperty( validate.errors, "dependencies", diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index bbbdba8a..e03812bf 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -1,5 +1,5 @@ -import test from 'ava' - +import { test } from "node:test"; +import assert from "node:assert/strict"; import validate from '../frontend/index.js' import validateBackend from '../backend/index.js' @@ -40,7 +40,7 @@ test('Should transform values (frontend)', async (t) => { AnalysisStartTimeZone: '-06:00' }) //console.log(valid, JSON.stringify(validate.errors, null, 2)) - t.is(valid, true) + assert.equal(valid, true) }) test('Should transform values (backend)', async (t) => { @@ -79,5 +79,5 @@ test('Should transform values (backend)', async (t) => { AnalysisStartTimeZone: '-06:00' }) //console.log(valid, JSON.stringify(validateBackend.errors, null, 2)) - t.is(valid, true) + assert.equal(valid, true) }) From 059cf757da7df079148e1d3c5b6b799ec512cfe9 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 28 Apr 2026 15:04:09 -0400 Subject: [PATCH 10/51] ci: update build to use bash --- schemas/data/bin/build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/data/bin/build b/schemas/data/bin/build index 27f30154..c31aa409 100755 --- a/schemas/data/bin/build +++ b/schemas/data/bin/build @@ -1,4 +1,4 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash maxEnumLength=2000 From 5cc04a17b85ffa4ea742e40342b3538ec05a1c87 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 28 Apr 2026 15:17:04 -0400 Subject: [PATCH 11/51] ci: change build order to fix missing definition file --- schemas/data/bin/build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/schemas/data/bin/build b/schemas/data/bin/build index c31aa409..43ff23aa 100755 --- a/schemas/data/bin/build +++ b/schemas/data/bin/build @@ -89,6 +89,7 @@ pre definitions deref definitions sast definitions clean definitions '.errorMessage?' +cp src/definitions.build.json json-schema/definitions.json # primary - strict pre primary @@ -135,7 +136,7 @@ sast quality-control transpile quality-control '' --loop-enum ${maxEnumLength} --use-defaults empty --all-errors post quality-control -mv src/definitions.build.json json-schema/definitions.json +rm src/definitions.build.json # locales locale en-CA From 5a3dfcb0e90a7dccb90d0cf2ddfbdf14eac9bd41 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 29 Apr 2026 10:28:05 -0400 Subject: [PATCH 12/51] ci: update deps and node 24 --- .github/workflows/data-update-wqx.yml | 16 +++++----------- .github/workflows/ossf-scorecard.yml | 8 ++++---- .github/workflows/sec-sast-codeql.yml | 8 ++++---- .github/workflows/sec-sast-sonarcloud.yml | 6 +++--- .github/workflows/sec-secrets.yml | 6 ++++-- .github/workflows/tests.yml | 18 ++++++------------ package-lock.json | 12 ------------ 7 files changed, 26 insertions(+), 48 deletions(-) diff --git a/.github/workflows/data-update-wqx.yml b/.github/workflows/data-update-wqx.yml index be6d6769..d40cc479 100644 --- a/.github/workflows/data-update-wqx.yml +++ b/.github/workflows/data-update-wqx.yml @@ -11,24 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 22.x + node-version: 24.x registry-url: "https://npm.pkg.github.com" + cache: 'npm' - name: Create .npmrc run: | echo "//npm.pkg.github.com/:_authToken=${{ github.token }}" >> ~/.npmrc - echo "@gordonfn:registry=https://npm.pkg.github.com" >> ~/.npmrc + echo "@datastreamapp:registry=https://npm.pkg.github.com" >> ~/.npmrc echo ".npmrc" >> .gitignore - - name: Cache npm - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- # - # name: Install dependencies # run: | diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index 12868a06..f0c3b29b 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -32,12 +32,12 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + uses: ossf/scorecard-action@99c09fe975337306107572b4fdf4db224cf8e2f2 # v2.4.3 with: results_file: results.sarif results_format: sarif @@ -59,7 +59,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: SARIF file path: results.sarif @@ -68,6 +68,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 + uses: github/codeql-action/upload-sarif@7fc6561ed893d15cec696e062df840b21db27eb0 # v4.35.2 with: sarif_file: results.sarif diff --git a/.github/workflows/sec-sast-codeql.yml b/.github/workflows/sec-sast-codeql.yml index 07d38890..c9c39757 100644 --- a/.github/workflows/sec-sast-codeql.yml +++ b/.github/workflows/sec-sast-codeql.yml @@ -27,19 +27,19 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@babb554ede22fd5605947329c4d04d8e7a0b8155 # v2.27.7 + uses: github/codeql-action/init@7fc6561ed893d15cec696e062df840b21db27eb0 # v4.35.2 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@babb554ede22fd5605947329c4d04d8e7a0b8155 # v2.27.7 + uses: github/codeql-action/autobuild@7fc6561ed893d15cec696e062df840b21db27eb0 # v4.35.2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@babb554ede22fd5605947329c4d04d8e7a0b8155 # v2.27.7 + uses: github/codeql-action/analyze@7fc6561ed893d15cec696e062df840b21db27eb0 # v4.35.2 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/sec-sast-sonarcloud.yml b/.github/workflows/sec-sast-sonarcloud.yml index a954621a..383ef499 100644 --- a/.github/workflows/sec-sast-sonarcloud.yml +++ b/.github/workflows/sec-sast-sonarcloud.yml @@ -14,12 +14,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 5 - - name: SonarCloud Scan - uses: sonarsource/sonarcloud-github-action@02ef91109b2d589e757aefcfb2854c2783fd7b19 # 4.0.0 + - name: SonarQube Scan + uses: SonarSource/sonarqube-scan-action@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/sec-secrets.yml b/.github/workflows/sec-secrets.yml index 06efcaeb..b0b9dc0c 100644 --- a/.github/workflows/sec-secrets.yml +++ b/.github/workflows/sec-secrets.yml @@ -12,7 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 - name: TruffleHog Scan - uses: edplato/trufflehog-actions-scan@6cf4d6ab0edcfee4251c8c4d214e3655b84c6cb6 # 0.9m-beta + uses: trufflesecurity/trufflehog@17456f8c7d042d8c82c9a8ca9e937231f9f42e26 # v3.95.2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3cb2401b..909ffe3b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,27 +11,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 22.x + node-version: 24.x registry-url: "https://npm.pkg.github.com" + cache: 'npm' - name: Create .npmrc run: | - echo "@gordonfn:registry=https://npm.pkg.github.com" >> ~/.npmrc + echo "@datastreamapp:registry=https://npm.pkg.github.com" >> ~/.npmrc echo ".npmrc" >> .gitignore - - name: Cache npm - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - name: Install dependencies run: | npm install - name: Build and test run: | - npm test + npm test \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2e5089dc..3f9c277d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5126,18 +5126,6 @@ "node": ">=10" } }, - "node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - } - }, "node_modules/conventional-commits-parser": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", From 46380a9aae660bd7e255e387208d5d348d07c0a7 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 29 Apr 2026 10:42:56 -0400 Subject: [PATCH 13/51] ci: increase stack size for ajv compiled output --- .github/workflows/tests.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 909ffe3b..23ef789f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,4 +28,6 @@ jobs: - name: Build and test run: | - npm test \ No newline at end of file + npm test + env: + NODE_OPTIONS: --stack-size=2000 \ No newline at end of file From 148dd131cf2adfe15bd5a9972ce03a79577281f9 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 29 Apr 2026 10:53:17 -0400 Subject: [PATCH 14/51] ci: revert to node 22 due to stack size issues --- .github/workflows/data-update-wqx.yml | 2 +- .github/workflows/tests.yml | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/data-update-wqx.yml b/.github/workflows/data-update-wqx.yml index d40cc479..eb8e64ef 100644 --- a/.github/workflows/data-update-wqx.yml +++ b/.github/workflows/data-update-wqx.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 24.x + node-version: 22.x registry-url: "https://npm.pkg.github.com" cache: 'npm' - name: Create .npmrc diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 23ef789f..5dc822d3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 24.x + node-version: 22.x registry-url: "https://npm.pkg.github.com" cache: 'npm' - name: Create .npmrc @@ -28,6 +28,4 @@ jobs: - name: Build and test run: | - npm test - env: - NODE_OPTIONS: --stack-size=2000 \ No newline at end of file + npm test \ No newline at end of file From d8fa6020b73fa21804787cdb4cb693d42be4dad9 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 29 Apr 2026 11:24:56 -0400 Subject: [PATCH 15/51] feat: update GW specific errors to only apply to GW data --- schemas/data/bin/build | 1 + ...e-ActivityDepthAltitudeReferencePoint.json | 5 +++- ...l-ActivityDepthAltitudeReferencePoint.json | 5 +++- ...ringLocationType-Well-SampleCondition.json | 5 +++- ...nitoringLocationType-Well-WellUseType.json | 5 +++- schemas/data/test/logic.js | 25 +++++++++++++++++++ schemas/data/test/required.js | 1 - schemas/data/test/transform.js | 1 - 8 files changed, 42 insertions(+), 6 deletions(-) diff --git a/schemas/data/bin/build b/schemas/data/bin/build index 43ff23aa..8cb9d321 100755 --- a/schemas/data/bin/build +++ b/schemas/data/bin/build @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -euo pipefail maxEnumLength=2000 diff --git a/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json index 6a7ab480..b78088d2 100644 --- a/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json +++ b/schemas/data/src/logic/ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint.json @@ -7,9 +7,12 @@ "type": "object", "unevaluatedProperties": true, "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + }, "ActivityDepthHeightMeasure": true }, - "required": ["ActivityDepthHeightMeasure"] + "required": ["ActivityMediaName", "ActivityDepthHeightMeasure"] }, "then": { "type": "object", diff --git a/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json index 645c6748..e0ad3d4c 100644 --- a/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json +++ b/schemas/data/src/logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json @@ -7,11 +7,14 @@ "type": "object", "unevaluatedProperties": true, "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + }, "CharacteristicName": { "enum": ["Water level in well, depth from a reference point"] } }, - "required": ["CharacteristicName"] + "required": ["ActivityMediaName", "CharacteristicName"] }, "then": { "type": "object", diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json index 7c6520bd..c74c1307 100644 --- a/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json +++ b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json @@ -7,6 +7,9 @@ "type": "object", "unevaluatedProperties": true, "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + }, "MonitoringLocationType": { "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] }, @@ -16,7 +19,7 @@ } } }, - "required": ["MonitoringLocationType", "ActivityType"] + "required": ["ActivityMediaName", "MonitoringLocationType", "ActivityType"] }, "then": { "type": "object", diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json index b84f1103..386123a0 100644 --- a/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json +++ b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json @@ -7,11 +7,14 @@ "type": "object", "unevaluatedProperties": true, "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + }, "MonitoringLocationType": { "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] } }, - "required": ["MonitoringLocationType"] + "required": ["ActivityMediaName", "MonitoringLocationType"] }, "then": { "type": "object", diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 3d6d8dfa..74c24644 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -837,6 +837,7 @@ test("Should reject when Salinity and ResultDetectionQuantitationLimitUnit=`ppt` // *** MonitoringLocationType-Well-WellUseType *** // test("Should reject Well MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Well", }); assert.equal(valid, false); @@ -845,6 +846,7 @@ test("Should reject Well MonitoringLocationType without WellUseType", async (t) test("Should reject Piezometer MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Piezometer", }); assert.equal(valid, false); @@ -853,6 +855,7 @@ test("Should reject Piezometer MonitoringLocationType without WellUseType", asyn test("Should reject Dug Well MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Dug Well", }); assert.equal(valid, false); @@ -861,6 +864,7 @@ test("Should reject Dug Well MonitoringLocationType without WellUseType", async test("Should accept Well MonitoringLocationType with WellUseType", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Well", WellUseType: "Monitoring - Ambient", }); @@ -870,6 +874,7 @@ test("Should accept Well MonitoringLocationType with WellUseType", async (t) => test("Should accept non-well MonitoringLocationType without WellUseType", async (t) => { const valid = validate({ + ActivityMediaName: "Surface Water", MonitoringLocationType: "River/Stream", }); assert.equal(valid, false); @@ -879,6 +884,7 @@ test("Should accept non-well MonitoringLocationType without WellUseType", async // *** MonitoringLocationType-Well-SampleCondition *** // test("Should reject Well without SampleCondition for non-CTS", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Well", ActivityType: "Field Msr/Obs", }); @@ -888,6 +894,7 @@ test("Should reject Well without SampleCondition for non-CTS", async (t) => { test("Should accept Well without SampleCondition for CTS", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Well", ActivityType: "Field Msr/Obs-Continuous Time Series", ActivityStartTime: "13:15:00", @@ -898,6 +905,7 @@ test("Should accept Well without SampleCondition for CTS", async (t) => { test("Should accept Well with SampleCondition for non-CTS", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", MonitoringLocationType: "Well", ActivityType: "Field Msr/Obs", SampleCondition: "Static", @@ -909,6 +917,7 @@ test("Should accept Well with SampleCondition for non-CTS", async (t) => { // *** ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint *** // test("Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", ActivityDepthHeightMeasure: -5, ActivityDepthHeightUnit: "m", }); @@ -921,6 +930,7 @@ test("Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeRefe test("Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferencePoint", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", ActivityDepthHeightMeasure: -5, ActivityDepthHeightUnit: "m", ActivityDepthAltitudeReferencePoint: "Ground surface", @@ -932,9 +942,23 @@ test("Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferen ); }); +test("Should accept ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint for non-GW media", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + ActivityDepthHeightMeasure: -5, + ActivityDepthHeightUnit: "m", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), + false, + ); +}); + // *** CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint *** // test("Should reject Water level CharacteristicName without ActivityDepthAltitudeReferencePoint", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", CharacteristicName: "Water level in well, depth from a reference point", ResultValue: -10, ResultUnit: "m", @@ -948,6 +972,7 @@ test("Should reject Water level CharacteristicName without ActivityDepthAltitude test("Should accept Water level CharacteristicName with ActivityDepthAltitudeReferencePoint", async (t) => { const valid = validate({ + ActivityMediaName: "Groundwater", CharacteristicName: "Water level in well, depth from a reference point", ResultValue: -10, ResultUnit: "m", diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index 328fc71b..49b2fb93 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -120,7 +120,6 @@ test("Should not require properties", async (t) => { ActivityMediaName: "Surface Water", ActivityDepthHeightMeasure: "-34", ActivityDepthHeightUnit: "m", - ActivityDepthAltitudeReferencePoint: "Ground surface", SampleCollectionEquipmentName: "Bucket", CharacteristicName: "Sulfur", MethodSpeciation: "as B", diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index e03812bf..77e8e9d2 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -16,7 +16,6 @@ test('Should transform values (frontend)', async (t) => { ActivityMediaName: 'surface Water', ActivityDepthHeightMeasure: '-34', ActivityDepthHeightUnit: 'm', - ActivityDepthAltitudeReferencePoint: 'Ground surface', SampleCollectionEquipmentName: 'bucket', CharacteristicName: 'aluminum', MethodSpeciation: 'as B', From adf9a11d7e084bf2822dd42ef182bbe8baffa192 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 30 Apr 2026 10:50:20 -0400 Subject: [PATCH 16/51] feat: update GW allowed values and errors also improved unit tests --- schemas/data/bin/build-lib.js | 1 - schemas/data/src/addition/AquiferCode.json | 1 - schemas/data/src/addition/AquiferType.json | 1 + .../data/src/addition/AquiferUnitName.json | 750 +++++++++++------- schemas/data/src/addition/LithologyType.json | 8 +- .../data/src/addition/SampleCondition.json | 6 +- schemas/data/src/addition/WellUseType.json | 1 + schemas/data/src/backend.json | 4 +- schemas/data/src/definitions.json | 10 +- schemas/data/src/extract.json | 5 +- schemas/data/src/frontend.json | 6 +- schemas/data/src/locales/en-CA.ftl | 1 + ...ityMediaName-Groundwater-DepthMeasure.json | 27 + schemas/data/src/primary.json | 5 +- ...me-ActivityDepthHeightMeasure-Maximum.json | 1 + schemas/data/src/subset/AquiferType.json | 2 +- schemas/data/src/subset/LithologyType.json | 8 +- ...onHorizontalCoordinateReferenceSystem.json | 13 +- schemas/data/src/subset/WellUseType.json | 4 + .../data/src/values/AquiferCode.legacy.json | 10 - .../data/src/values/AquiferCode.primary.json | 10 - .../data/src/values/AquiferType.legacy.json | 1 + .../data/src/values/AquiferType.primary.json | 1 + .../src/values/AquiferUnitName.legacy.json | 748 ++++++++++------- .../src/values/AquiferUnitName.primary.json | 748 ++++++++++------- .../data/src/values/LithologyType.legacy.json | 6 + .../src/values/LithologyType.primary.json | 6 + ...ntalCoordinateReferenceSystem.primary.json | 1 + .../src/values/SampleCondition.legacy.json | 6 +- .../src/values/SampleCondition.primary.json | 6 +- .../data/src/values/WellUseType.legacy.json | 1 + .../data/src/values/WellUseType.primary.json | 4 + schemas/data/test/format.js | 94 +++ schemas/data/test/logic.js | 55 +- schemas/data/test/primary.js | 161 ++++ schemas/data/test/quality-control.js | 20 + schemas/data/test/transform.js | 177 +++++ 37 files changed, 2028 insertions(+), 881 deletions(-) delete mode 100644 schemas/data/src/addition/AquiferCode.json create mode 100644 schemas/data/src/addition/AquiferType.json create mode 100644 schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json delete mode 100644 schemas/data/src/values/AquiferCode.legacy.json delete mode 100644 schemas/data/src/values/AquiferCode.primary.json create mode 100644 schemas/data/test/primary.js diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index 19558d7c..dabf87df 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -27,7 +27,6 @@ export const subsetOnly = [ export const custom = [ "AquiferUnitName", "WellIDContext", - "AquiferCode", "AquiferUnitPorosityType", "ActivityDepthAltitudeReferencePoint", "SampleCondition", diff --git a/schemas/data/src/addition/AquiferCode.json b/schemas/data/src/addition/AquiferCode.json deleted file mode 100644 index 84e6760f..00000000 --- a/schemas/data/src/addition/AquiferCode.json +++ /dev/null @@ -1 +0,0 @@ -["12_NS"] diff --git a/schemas/data/src/addition/AquiferType.json b/schemas/data/src/addition/AquiferType.json new file mode 100644 index 00000000..e568890e --- /dev/null +++ b/schemas/data/src/addition/AquiferType.json @@ -0,0 +1 @@ +["ARTESIAN"] \ No newline at end of file diff --git a/schemas/data/src/addition/AquiferUnitName.json b/schemas/data/src/addition/AquiferUnitName.json index e45abded..8b21b1eb 100644 --- a/schemas/data/src/addition/AquiferUnitName.json +++ b/schemas/data/src/addition/AquiferUnitName.json @@ -1,43 +1,54 @@ [ - "Abitibi Dykes", + "111 Mile Creek Valley Aquifer System", + "1WS Member", + "2WS Member", + "Abbotsford Shallow Aquifer", + "Abbotsford Shallow West Aquifer", "Alberta Group", + "Aldergrove Shallow Aquifer", "Algonquin Aquifer Complex", "Algonquin Basin", "Algonquin Shoreline", + "Alice Siding Aquifer", "Alliston Aquifer Complex", + "Alluvial and glaciofluvial sand and gravel", "Alviston-Rutherford Aquifer", "Amabel-Lockport-Guelph Hydrogeologic Unit", "Amherstburge Aquifer", - "Amos Group", "Ancaster-West Flamborough Aquifer", "Annapolis-Cornwallis valleys Aquifer", - "Ardkenneth Member", + "Anten Coquina Member", + "Arras-Fellers Heights Bedrock Aquifer", + "Arrowwood Formation", "Arthur-Mount Forest Aquifer", "Assiniboine delta Aquifer", "Atha Aquifer", "Ausable Aquifer", - "Baby Group", + "Bad Heart Formation", "Balfron Formation", "Banff Formation", + "Barons Sand Formation", "Basal Aquifer", - "basal clastic unit (Winnipeg) Aquifer", + "Basal clastic unit (Winnipeg) Aquifer", + "Basal Cretaceous Sandstone", "Bass Island Hydrogeologic Unit", - "Batholith of Guyenne", - "Batholith of La Corne", "Battle Formation", - "Battleford Formation Stratified Deposits", + "Battleford Formation", + "Beach Ridge sand and gravel", "Bearpaw Formation", - "Bearpaw Sand Members Aquifer", - "Beaverville Lake Group", - "Bellefeuille River Pluton", + "Beaver Creek Overburden Aquifer", + "Belle Fourche Formation", "Belly River Formation", "Belly River Group", - "Bernetz Intrusion", - "Berry Pluto", "Beverly-Onoway channel Complex", "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blackstone Formation", + "Blewett Bedrock Aquifer", "Blood Reserve Formation", "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Blueberry Valley Aquifer System", + "Blueberry-Aitken Bedrock Aquifer", + "Bluesky Formation", "Bois Blanc Hydrogeologic Unit", "Boissevain Formation", "Bonnyville U1 Sand", @@ -47,28 +58,39 @@ "Bothwell Aquifer", "Bounded Channel Aquifers", "Bourget Aquifer", - "Bourlamaque Batholith", "Bow Island Formation", - "Bredenbury Aquifer", + "Bradley Creek Valley Aquifer System", + "Brazeau Formation", + "Bredenbury & Wynyard Formations", + "Bridge Lake Aquifer System", + "Brilliant Bedrock Aquifer", "Bronson Lake", "Brownsville Local Aquifer", + "Buried valley containing sand and gravel", "Buried valley/blanket Aquifers", - "Calamité River Pluton", + "Cadomin Formation", + "Cadotte Formation", "Caledon-Grand River Outwash Aquifer", "Calgary Lethbridge Corridor HSU C Aquitard", "Calgary Lethbridge Corridor HSU S1 Aquifer", "Calgary Lethbridge Corridor HSU S2 Aquifer", - "Camac Formation", + "Canadian Shield", "Canning Aquitard", "Canning Till Aquitard", + "Cantuar Formation", + "Canyon Overburden Aquifer", + "Carbon Member", "Carbonate rock Aquifer", "Carboniferous basin Aquifer", "Cardium Formation", - "Caste Formation", + "Carlile Formation", + "Casino Overburden Aquifer", + "Castlegar Overburden Aquifer", "Cataract Group Hydrogeologic Unit", "Catfish Creek Aquifer", "Cedar Grove Aquifer", "Central Catfish Creek Aquifer", + "Central Halfway-Beatton Bedrock Aquifer", "Central South Nation Aquifer Complex", "Champlain Aquifer", "Channel Aquifer 1", @@ -76,151 +98,202 @@ "Channel Aquifer 3", "Channel Aquitard 1", "Channel Aquitard 2", + "Charlie Halfway Beatton Bedrock Aquifer", "Chateauguay Aquifer", "Chauidiere Aquifer", "Chesley Aquifer", - "Chicobi Group", + "Chinchaga Formation", "Chu Íntthi Aquifer", + "Chungo Member", "Clarence Creek Aquifer", - "Clearwater Formation", - "Clermont-Disson Formation", + "Clayton Heights Aquifer", + "Clayton Uplands Aquifer", + "Clinton Creek Bedrock Aquifer", + "Clinton Creek Lower Unconsolidated Aquifer", + "Clinton Creek Upper Sand and Gravel Aquifer", "Clinton Group Hydrogeologic Unit", - "Cobble Hill Aquifer", + "Coalspur Formation", + "Cold Lake Formation", "Coldstream Aquifer", - "Colombourg Batholith", "Colorado Group", + "Connelly Creek Formation", "Contact Aquifer", - "Cooking Lake sediments", + "Contact Rapids Formation", + "Cooking Lake area sediments", + "Cooking Lake Formation", "Credit River Aquifer", + "Creston-Kootenay River Overburden Aquifer", + "Cridland Creek Bedrock Aquifer", "Crowsnest River Alluvial Aquifer", - "Cruikshank Member", - "Cruikshank-Thelma Member", "Cumberland Group", "Cypress Hills Formation", - "Dalmeny Aquifer", - "Decelles Reservoir Batholith", - "Deguisier Formation", - "Del Bonita Gravels", - "Demaine Member", + "Dalehurst Member", + "Dawson Creek Overburden Aquifer", + "Del Bonita Formation", "Detroit River Group Hydrogeologic Unit", + "Devonian Strata", + "Dinosaur Park Formation", + "Doe Creek Member", + "Doig Formation", "Don Formation", - "Drumheller channel Complex", - "Dubuisson Formation", + "Dowling Member", + "Drumheller Channel Complex", + "Drumheller Member", + "Drywood Creek Formation", "Dundalk Aquifer", "Dundee Hydrogeologic Unit", + "Dundurn Formation", "Dunvegan Formation", - "Duparquet Formation", "Durham Aquifer", + "Duvernay Formation", "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", "East and Middle Sixteen Mile Aquifer", + "East Creston Bedrock Aquifer", + "East Pine Bedrock Aquifer", + "East Pine-Groundbirch Bedrock Aquifer", "Eastend Formation", - "Eastend-Cypress Hills Aquifer", "Eastend-Ravenscrag Aquifer", - "Eastend-Wood Member Aquifer", "Edson burried-valley Aquifer", "Egmond Bay Formation", "Elgin-Southampton Aquifer", - "Elk Point Group", + "Ellerslie Member", + "Ellis Group", "Empress Formation", - "Empress Group Aquifers", + "Empress Formation-Uplands glacial", + "Empress Formation-Valley fill glacial", + "Empress Formation-Valley fill glacial Tertiary Undifferentiated", + "Empress Formation-Valley fill Tertiary", "Erie Interstadial Deposits", + "Ernestina Lake Formation", + "Esker and gravel", + "Estend Formation", "Ethel Lake Formation", "Etobicoke Aquifer", - "Fielding Aquifer", - "Figuery Group", - "Flavrian Pluto", + "Exshaw Formation", + "Eyot Formation", + "Farrel Creek Bedrock Aquifer", + "Fernie Formation", + "First White Specks Formation", + "Fish Scales Formation", + "Fish Scales Member", "Flesherton Aquifer", - "Floral Sands and Gravels", + "Floral Formation", "Fontfill Aquifer Complex", "Foremost Formation", - "Forestry Farm Aquifer", - "Fort St. John Group", + "Fort Nelson-River Alluvial Aquifer", + "Fort Simpson Formation", + "Fort St. John Overburden Aquifer System", + "Fort Vermilion Formation", "Fourchu Group", - "Fractured Aquifers - Gulf Islands", - "Fraser Canyon", + "Fractured Aquifers-Gulf Islands", + "Fraser Canyon Aquifer, Choate to Yale", + "Fraser Canyon Aquifer, from Yale to Haig", "Fraser Lowlands Aquifer", - "Fraser Plateau Lava", + "Fraser Plateau Lava Aquifer", "Frenchman Formation", - "Frenchman Whitemud Eastend Formation", + "Frenchman to Eastend Undifferentiated", "Fulford Aquifer", "Fundy Group", - "Ganges Harbour", + "Ganges Harbour Aquifer", "Georgeville Group", - "Gibsons/SCRD Granthams Landing/Elphinstone", + "Gething Formation", + "Gibsons/SCRD Granthams Landing/Elphinstone Aquifer", "Glaciolacustrine Aquifer Complex", + "Glade Overburden Aquifer", + "Glauconitic Sandstone Formation", "Glemmore Basal Aquifer", - "Gleneden", - "Granada Formation", + "Gleneden Aquifer", "Grand Centre Formation", - "Grand Forks", + "Grand Forks Aquifer", "Grand Rapids Formation", "Grand River Aquifer", "Grand River Basin Aquifer", "Grand River Outwash Deposits", "Grand River Valley Basinal Deposits", - "Grant Hill", + "Grandview Aquifer", + "Grant Hill Aquifer", "Greater Kelowna Aquifer", "Greatlakean Stade Deposits", "Green River Aquifer", - "Greendale Deep", + "Greendale Deep Aquifer", + "Greenwood", "Greenwood Aquifer", "Grimshaw Gravels Aquifer", - "Guichon Creek", - "Haans Creek to Blain Creek - Haida Gwaii", + "Grosmont Formation", + "Groundbirch Buried Valley Aquifer", + "Grumbler Group", + "Guichon Creek Aquifer", + "Haans Creek to Blain Creek-Haida Gwaii Aquifer", "Hagan Aquifer", - "Haida/Lawnhill", - "Haig", + "Haida/Lawnhill Aquifer", + "Haig Aquifer", + "Halfway Valley Aquifer System", "Halton Till", + "Halverson Ridge Formation", "Hamilton Group Hydrogeologic Unit", "Hand Hills Formation", "Hanover Aquifer", + "Hanson Member", "Harrow Aquifer", - "Hatzic Prairie", - "Hay River Formation", + "Hatzic Prairie Aquifer", + "Haultain Formation", + "Haven Member", "Haynes Aquifer", - "Heather Bank", - "Hebecourt Formation", - "Heva Formation", + "Haynes Member", + "Hazelmere Aquifer", + "Hazelmere Valley Aquifer", + "Heather Bank Aquifer", "Hillsborough Formation", + "Hillsborough River Formation", "Hockley Valley Aquifer", "Holstein Aquifer", "Holt Aquifer Complex", - "Hopington AB", - "Hopington C", + "Hopington AB Aquifer", + "Hopington C Aquifer", "Horseshoe Canyon Formation", + "Horsethief Member", "Horton Group", - "Houston Bedrock", - "Hullcar Aquifer", - "Interglacial Aquifers", - "Joeyaska Deep", - "Joeyaska Shallow", + "Houston Bedrock Aquifer", + "Hullcar Confined Aquifer", + "Hullcar Perched", + "Hullcar Unconfined Aquifer", + "Ireton Formation", + "Ishbel Group", + "Joeyaska Deep Aquifer", + "Joeyaska Shallow Aquifer", + "Joli Fou Formation", "Judith River Aquifer", + "Judith River/Belly River Formation", + "Jumping Pound SST Member", + "Jurassic Formations", "Kame Outwash Aquifer Complex", - "Karmutsen", - "Kawkawa Lake", - "Keating", + "Karmutsen Aquifer", + "Kaskapau Formation", + "Kawkawa Lake Aquifer", + "Keating Aquifer", + "Keg River Formation", "Kettle Point Hydrogeologic Unit", "Kildare Formation", - "Kingsvale", - "Kipawa Formation", + "Kingsvale Aquifer", + "Kiskatinaw Buried Channel Aquifer", + "Kiskatinaw Glaciodeltaic Overburden Aquifer", + "Kitchener Creek Overburden Aquifer", "Kleinburg Aquifer", - "Koksilah River Valley", - "Kwinshatin Intertill", - "La Morandiere Group", - "La Motte Batholith", - "La Motte-Vassan Formation", + "Koksilah River Valley Aquifer", + "Kwinshatin Intertill Aquifer", + "La Glace Sandstone Member", + "La Loche Formation AND Basal Red Beds Unit", "Lacombe Aquitard", - "Lake Abitibi-Okikodesik Batholith", + "Lacombe Member", "Lake Algonquin Sand Aquifer", - "Lake Arthur Group", "Lake Peel Deltaic Aquifer", "Lake Schomberg and Algonquin Aquifer", "Lake Schomberg and Algonquin Aquitard", "Lancaster-Cornwall Aquifer", - "Landrienne Formation", - "Langdale/Hopkins", - "Langdale/Hopkins Landing", - "Langley Upland", + "Langdale/Hopkins Aquifer", + "Langdale/Hopkins Landing Aquifer", + "Langley Upland Aquifer", + "Langley Upland Intertill Aquifer", "LD Basal Till", "LD Local Aquifers", "LD Lower Aquifer", @@ -228,349 +301,472 @@ "LD Upper Till", "Lea Park Formation", "Leamington Aquifer", + "Leduc Formation", + "Lenses of sand and gravel", "Lincoln Aquifer", - "Little Qualicum River", + "Little Qualicum River Aquifer", "Local Aquifer 2", "Local Aquitard 1", - "Lookout Ridge", - "Lorrain Formation", - "Lower Bousquet Formation", + "Lookout Ridge Aquifer", + "Łots'an Aquifer", + "Lower Bearpaw Formation", + "Lower Belly River Formation", + "Lower Brazeau Member", + "Lower Bridge Creek Valley Aquifer System", + "Lower Bridge Creek Valley Bedrock Aquifer", "Lower Brougham Aquifer", - "Lower Cassidy", + "Lower Cassidy Aquifer", "Lower Catfish Creek Till Aquitard", - "Lower Cherryville", + "Lower Cherryville Aquifer", "Lower Chinguacousy Aquifer", - "Lower Coquihalla Canyon", - "Lower Cowichan River A", - "Lower Cowichan River C", - "Lower Dundurn Formation Stratified Deposits", + "Lower Coalspur Member", + "Lower Coquihalla Canyon Aquifer", + "Lower Cowichan River A Aquifer", + "Lower Cowichan River C Aquifer", "Lower Erie Phase Aquifer", "Lower Erie Phase Aquitard", - "Lower Floral Formation Stratified Deposits", - "Lower Gates River", + "Lower Gates River Aquifer", + "Lower Lac la Hache Valley Bedrock Aquifer", + "Lower Lea Park Formation", + "Lower Loon River Formation", + "Lower Lotsberg Formation", "Lower Markham Aquifer", "Lower Maryhill Till", - "Lower Merritt", - "Lower Nechako River", - "Lower Nicola", - "Lower Nicola Outwash", - "Lower Shuswap Deep Aquifer", - "Lower Shuswap River Aquifer", + "Lower Merritt Aquifer", + "Lower Montney Formation", + "Lower Nechako River Aquifer", + "Lower Nicola Aquifer", + "Lower Nicola Outwash Aquifer", + "Lower Ordovician OR Cambrian Strata", + "Lower Scollard Member", + "Lower Shaftesbury Formation", + "Lower Shuswap Deep Confined", + "Lower Shuswap River Confined", "Lower Thorncliffe Aquifer", "Lower Thorncliffe Aquitard", "Lower Unionville Aquifer", "Lower Victoria Aquifer", + "Lower Wapiti Member", + "Lower Willow Creek Member", "Lowland Aquifer Complex", - "Lumby - Lower Aquifer", - "Lumby - Upper Aquifer", - "Łots'an Aquifer", + "Lumby-Lower Aquifer", + "Lumby-Upper Aquifer", + "Lundbreck Formation", "Mabou Group", "Mackinaw Interstadial Deposits", - "Malahat Ridge", - "Malcolm Island", - "Mannvile Group", + "Majeau Lake Formation", + "Major buried sand and gravel", + "Malahat Ridge Aquifer", + "Malcolm Island Aquifer", + "Mannville Group", "Maple Aquifer", - "Mara Aquifer", - "Marble Hill Unconsolidated", + "Mara Aquifer Aquifer", + "Marble Hill Unconsolidated Aquifer", "Marie Creek Formation", "Markdale Aquifer", - "Masset", - "Matachewan Dyke Swarm", - "Matador Member", - "Mauricie Aquifer", - "McDougall Creek Deltaic", - "McMillan Island", + "Marshybank Formation", + "Marshybank Member", + "Masset Aquifer", + "McDougall Creek Deltaic Aquifer", + "McMillan Island Aquifer", "McMurray Formation", "Meaford Aquifer", + "Medicine Hat Formation", + "Medicine Hat Member", "Meguma SuperGroup", "Meltwater Channel Hydrogeologic Unit", - "Mennon Formation Stratified Deposits", - "Mennon Sand", + "Mennon Formation", "Middle Erie Phase Aquifer", "Middle Maryhill Till", - "Middle Merritt", + "Middle Merritt Aquifer", + "Middle Montney Formation", + "Middle Red Beds Formation", "Middle Thorncliffe Aquifer", "Middle Thorncliffe Aquitard", "Middle Waterloo Moraine Aquifer & Equivalents", "Milk River Aquifer", - "Mill Bay", - "Mine Hunter Group", + "Milk River Formation", + "Mill Bay Aquifer", "Minesing Basin Transgressive Deposits", "Mirabel Aquifer", "Mission Creek Aquifer", - "Mont-Brun Formation", - "Montney Hydrostratigraphic Unit", + "Monteith Formation", + "Montney Halfway Beatton Bedrock Aquifer", + "Montney Turbidite", + "Montrose Bedrock Aquifer", "Morien Group", + "Morrin Member", "Mount Albert Aquifer Complex", - "Mount Ozzard Aquifer", - "Mount Tom Aquifer", + "Mount Ozzard Bedrock West Aquifer", + "Mount Ozzard, Bedrock Southeast", + "Mount Ozzard, Unconsolidated", + "Mount Tom Bedrock", + "Mount Tom Bedrock Aquifer", + "Mount Tom Unconsolidated", "Muriel Lake", - "Nanaimo Group, Campbell River to Courtney", + "Murrayville AC Aquifer", + "Murrayville B Aquifer", + "Muskeg Formation", + "Muskeg Lower Anhydrite Member", + "Muskiki Formation", + "Muskiki Formation OR Kaskapau Formation", + "Muskiki Member", + "Muskwa Formation", + "Muskwa River Alluvial Aquifer", + "Muskwa-Fort Nelson Buried Valley Aquifer", + "Muskwa-Fort Nelson Glaciofluvial Aquifer", + "Nanaimo Group Aquifer, Campbell River to Courtney", "Nanaimo Lowlands Aquifer", - "Nechako Buried Valley", + "NE of White Rock A Aquifer", + "NE of White Rock B Aquifer", + "Nechako Buried Valley Aquifer", + "Nelson Overburden Aquifer", "Newmarket Till", + "Newton Upland Aquifer", "Niagra-on-the-Lake Aquifer", - "Nicomekl-Serpentine", - "Nicomen Slough", + "Nicomekl-Serpentine Aquifer", + "Nicomen Slough Aquifer", + "Nikanassin Formation", + "Niobrara Formation", "Nissouri Stadial Deposits", - "Nivek", + "Nivek Aquifer", + "Nomad Member", "Norfolk Sand Plain Aquifer", - "North Campbell River Aquifer", - "North Central Saanich", - "North Hope", - "North Houston Aquifer", + "Norns Creek Overburden Aquifer", + "North Campbell River Bedrock", + "North Campbell River Unconsolidated", + "North Castlegar Bedrock Aquifer", + "North Central Saanich Aquifer", + "North Hope Aquifer", + "North Houston Bedrock", "North Mountain Formation", - "North Nechako Terrace", - "North Salt Spring Island", - "North-Central Salt Spring Island", + "North Nechako Terrace Bedrock Aquifer", + "North Salt Spring Island Aquifer", + "North-Central Salt Spring Island Aquifer", + "Northern Halfway Beatton Bedrock Aquifer", + "Northern Lac la Hache Aquifer System", + "Northwest Halfway-Beatton Bedrock Aquifer", + "Northwest of Clearbrook Aquifer", "Notre Dame Aquifer", "O Avenue Aquifer", + "O'Keefe Basal", + "O'Keefe Unconfined Aquifer", "Oak Ridges Moraine Aquifer", + "Obed Mountain Formation", "Odanah Member", "Odanah Shale Aquifer", - "Okanagan Landing Deep Aquifer", + "Okanagan Landing Deep Confined", "Okanagan Valley Aquifer", - "O'Keefe Aquifer", - "O'Keefe Basal Aquifer", "Oldcastle Aquifer", - "Opasatica Gneiss", + "Oldman Formation", + "Opabin Member", "Orangeville Aquifer Complex", "Orby Head Formation", "Oro Moraine Aquifer Complex", "Oro-Medonte Aquifer", - "Osoyoos West", + "Osoyoos West Aquifer", + "Ostracod Beds Member", "Ottawa Group Hydrogeologic Unit", - "Outlook Member", - "Owl Creek", + "Owl Creek Aquifer", "Owl Ridge Aquifer", - "Oxarart-Cruikshank Members", - "Oyster River", - "Pacheedaht", + "Oyster River Aquifer", + "Pacheedaht Aquifer", + "Paddy Formation", "Pakowki Formation", - "Palmarolle Pluton", + "Paldi-Deep Aquifer", + "Paleozoic Carbonate rock formations, Ordovician to Devonian", "Paris Aquifer", "Paris moraine Aquitard", "Paskapoo Formation", - "Paul's Basin", + "Paskapoo Formation Aquifer", + "Paterson Overburden Aquifer", + "Paul's Basin Aquifer", "Peace River Formation", + "Peace-Valley Aquifer System", + "Pelican Formation", + "Pelican Mountain Formation", + "Pense Formation", "Pickering Aquifer", "Pictou Group", - "Pineview", + "Pike Lake Formation", + "Pineview Aquifer", "Plantagenet Aquifer", - "Pluto of Amos", - "Pluto of Lake Dufault", - "Pluto of Lake Fréchette", - "Pluto of the Lake of Sixteen", - "Pluto of The Queen", - "Pluto of Trécesson", - "Pluto of Val-St-Gilles", - "Pluto of Villemontel", - "Pontiac Group", + "Porcupine Hills Formation", "Porcupine Hills Formation Aquifers", "Port Bruce Phase Aquitard", "Port Bruce Stadial Deposits", - "Port Clements", + "Port Clements Aquifer", "Port Colborne Aquifer", "Port Huron Stadial Deposits", - "Port McNeill East Aquifer", - "Port McNeill East Bedrock", - "Port McNeill West Aquifer", + "Port McNeill East Bedrock Aquifer", + "Port McNeill East Unconsolidated", + "Port McNeill West Bedrock", + "Port McNeill West Unconsolidated", "Portneuf Aquifer", "Pottery Road Formation", - "Poularies Batholith", - "Powell Pluton", - "Powers Ck Deltaic", - "Precambrian Hydrogeologic Unit", + "Pouce Coupe Member", + "Pouce Coupe Overburden Aquifer", + "Pouce Creek Bedrock Aquifer", + "Powers Ck Deltaic Aquifer", + "Prairie Evaporite Formation", "Pre-Canning Aquifers", "Pre-Canning Aquitard", "Pre-Catfish Aquifers", - "Preissac Batholith", + "Precambrian Hydrogeologic Unit", + "Precambrian rocks", + "Precambrian to Model Base", "Priceville Aquifer", - "Puntledge/ Cumberland", + "Prophet River Alluvial Aquifer", + "Puntledge/ Cumberland Aquifer", + "Puskwaskau Formation", "Puslinch Aquifer", - "Quadra Central", - "Quadra South", + "Quadra Central Bedrock Aquifer", + "Quadra South Bedrock Aquifer", "Queenston Hydrogeologic Unit", - "Quinsam to Stories Beach", + "Quinsam to Stories Beach Aquifer", "Ravenscrag Formation", - "Rawlings Lake", - "Red Deer River channel Complex", + "Ravenscrag to Eastend Undifferentiated", + "Rawlings Lake Aquifer", + "Red Deer River channel complex", "Regional Aquifer 3", "Regional Aquitard 3", - "Remigny Batholith", - "Reneault-Dufresnoy Formation", - "Ribstone Creek Member", - "Richelieu Aquifer", + "Richelieu-Yamaska Aquifer", "Richibucto Formation", "Rideau Front Aquifer", - "Roberts Creek", + "Riding Mountain/Pierre Shale Formation", + "Roberts Creek Aquifer", "Rockcliffe Hydrogeologic Unit", "Rockland Aquifer", - "Rosebery", - "Rouyn-Pelletier Formation", - "Ryder Upland A", - "Ryder Upland B", - "Ryder Upland C", + "Rosebery Aquifer", + "Rundle Group", + "Ryder Upland A Aquifer", + "Ryder Upland B Aquifer", + "Ryder Upland C Aquifer", + "Saint-Maurice Aquifer", "Salina Hydrogeologic Unit", - "Salmon River", - "Salmon River - Lower Aquifer", - "Salmon River - Upper Aquifer", + "Salmo River Bedrock Aquifer", + "Salmo River Overburden Aquifer", + "Salmon River Aquifer", + "Salmon River-Lower Aquifer", + "Salmon River-Upper Aquifer", "Sand Dunes Aquifer", - "Sand River Formation", "Sandilands Aquifer", - "Sandspit - Haida Gwaii", - "Sardis-Vedder", + "Sandspit-Haida Gwaii Aquifer", + "Sardis-Vedder Aquifer", "Sarsfield Aquifer", - "Saskatoon Group Aquifers", + "Sayward-Salmon River Aquifer", "Scarborough Formation", "Schomberg Aquifer Complex", + "Schooler Creek Group", "Scollard Formation", - "Sechelt/Wakefield Creek", - "Seton Portage", - "Shannon Lake", - "Shawnigan Lake", + "Sechelt/Wakefield Creek Aquifer", + "Second White Specks Formation", + "Second White Specks/Favel Formation", + "Sediment Above Bedrock", + "Seton Portage Aquifer", + "Shaftesbury Formation", + "Shannon Lake Aquifer", + "Shawnigan Lake Aquifer", + "Shawnigan Lake/Cobble Hill/Mill Bay Aquifer", + "Sheridan Lake Aquifer", "Shuswap Highlands Aquifer", + "Silurian", "Simcoe Group Hydrogeologic Unit", "Similkameen River Aquifer", - "Sinkut Mountain North Surficial", - "Skidgate/Queen Charlotte", + "Sinkut Mountain North Surficial Aquifer", + "Skidgate/Queen Charlotte Aquifer", + "Slave Point Formation", "Smoky Group", - "Sooke-Metchosin", + "Sooke-Metchosin Aquifer", + "South Castlegar Bedrock Aquifer", "South Central Elgin Aquifer", - "South Fraser Lake", - "South Lake Simard Batholith", + "South Fraser Lake Bedrock Aquifer", + "South Fraser River Delta Aquifer", "South London Aquifer", - "South Nechako Terrace", - "South of Aldergrove", - "South of Hopington", - "South of Murrayville AC", - "South of Murrayville B", - "South Salt Spring Island", - "South Saskatchewan Alluvium", - "South Valemont", - "South Vanderhoof", - "South Vernon Aquifer", - "South-Central Salt Spring Island", - "Spallumcheen Aquifer", - "Spallumcheen Basal Aquifer", - "Spences Bridge", - "Sperling", - "Spius Creek West of Canford", + "South Nation Aquifer", + "South Nechako Terrace Bedrock Aquifer", + "South of Aldergrove Aquifer", + "South of Hopington Aquifer", + "South of Murrayville AC Aquifer", + "South of Murrayville B Aquifer", + "South Quadra Unconsolidated Aquifer", + "South Salt Spring Island Aquifer", + "South Valemont Aquifer", + "South Vanderhoof Unconsolidated Aquifer", + "South Vernon Confined Aquifer", + "South Vernon Unconfined Aquifer", + "South-Central Salt Spring Island Aquifer", + "Southern Horse Lake Aquifer System Aquifer", + "Spallumcheen Basal Confined Aquifer", + "Spallumcheen Confined", + "Spallumcheen Unconfined Aquifer", + "Spences Bridge Aquifer", + "Sperling Aquifer", + "Spirit River Formation", + "Spius Creek West of Canford Aquifer", "St. Catharines Aquifer", "St. George Aquifers", + "St. Martin Aquifer", "St. Mary River Formation", + "St. Mathieu Aquifer", "St. Thomas Moraine Local Aquifers", "Stavely Aquifer", - "Stellako", + "Stellako Unconsolidated Aquifer", "Stirling Group", - "Stoughton-Roquemaure Group", - "Stumbles Creek", + "Stoddart Group", + "Strathmore Member", "Stumbles Creek Aquifer", - "Stump Lake Aquifer", - "Sugar Lake", - "Sumas Prairie", - "Sumas Prairie North", + "Stumbles Creek Confined", + "Stump Lake", + "Stump Lake Bedrock", + "Sugar Lake Aquifer", + "Sulphur Point Formation", + "Sumas Prairie Aquifer", + "Sumas Prairie North Aquifer", "Sunchild Aquifer", - "Sunnybrae", + "Sunkay Formation", + "Sunningdale/Glenmerry Bedrock Aquifer", + "Sunnybrae Aquifer", "Sunnybrook Drift", - "Surficial stratified drift Aquifers", - "Sutherland Group Aquifers", - "Swan Lake Aquifer", + "Sunset Creek Overburden Aquifer", + "Sunset Prairie Bedrock Aquifer", + "Swan Hills Formation", + "Swan Lake Confined Aquifer", + "Swan Lake Unconfined", "Swan River Formation", - "Tachick Lake", - "Tappen", - "Taschereau Batholith", - "Tathlina Formation", - "Tessier Aquifer", + "Sweetwater Bedrock Aquifer", + "Tachick Lake Unconsolidated Aquifer", + "Talik regions", + "Tappen Aquifer", + "Thick and extensive unconfined sand and gravel", + "Thin unconfined sand", + "Thistle Member", "Thornbury Aquifer", "Thorncliffe Formation", "Thornill Aquifer", "Thornton Sand Aquifer", "Tillsonburg Aquifer", - "Timiskaming Group", - "Tlell", - "Topley", - "Trinity Valley", - "Tsolum River, North of Courtney", - "Tuhok Aquifer", + "Tlell Aquifer", + "Tolman Member", + "Topley Bedrock Aquifer", + "Trail Townsite Overburden Aquifer", + "Trail/Warfield Bedrock Aquifer", + "Trinity Valley Aquifer", + "Tsawwassen Aquifer", + "Tsolum River, North of Courtney Aquifer", + "Tuhok Confined Aquifer", + "Tuhok Unconfined Aquifer", "Turtle Mountain Formation", - "Twin Falls Formation", "Two Creeks Interstadial Deposits", "Tyconnell Formation", - "Tyner Valley Aquifer", - "Ucluelet Peninsula", - "Ucluelet, Lost Show", - "Undivided Cumberland Group", - "Undivided Pictou Group", - "Unicola", + "Ucluelet Peninsula Aquifer", + "Ucluelet, Lost Shoe Aquifer", + "Ucluelet, Lost Show Aquifer", + "Unicola Aquifer", + "Unit A Exposed Bedrock and Drift-Poor Areas", + "Unit B Till and Ribbed Moraine Deposits", + "Unit C Ablation Drift Deposits", + "Unit D Glaciomarine and Marine Deposits and Glaciolacustrine Deposits", + "Unit E Glaciofluvial Deposits", "Upland Aquifer Complex", - "Upland Gravel", "Upper and Lower Gloucester Aquifers", "Upper and Lower Nepean-Kemptville Aquifers", "Upper and Lower West Nepean Aquifers", "Upper Aquifer 1", - "Upper Bousquet Formation", + "Upper Bearpaw Formation", + "Upper Brazeau Member", + "Upper Bridge Creek Bedrock Aquifer", + "Upper Bridge Creek Valley Aquifer System", "Upper Brougham Aquifer", - "Upper Bulkley Alluvial", + "Upper Bulkley Alluvial Aquifer", "Upper Catfish Creek Till Aquitard", - "Upper Cherryville", + "Upper Cherryville Aquifer", "Upper Chinguacousy Aquifer", + "Upper Coalspur Member", "Upper Cretaceous sands Aquifer", - "Upper Dundurn Formation Stratified Deposits", "Upper Erie Phase Aquifer", "Upper Erie Phase Aquitard", - "Upper Floral Formation Stratified Deposits", - "Upper Gates River", + "Upper Gates River Aquifer", + "Upper Halfway Bedrock Aquifer", + "Upper Lac la Hache Valley Bedrock Aquifer", "Upper Lea Park Formation", + "Upper Loon Formation", + "Upper Lotsberg Formation", "Upper Markham Aquifer", "Upper Maryhill Till", - "Upper Merritt", + "Upper Merritt Aquifer", + "Upper Montney Formation", + "Upper Ordovician strata", + "Upper Scollard Member", + "Upper Shaftesbury Formation", "Upper Thames Aquifer", "Upper Thorncliffe Aquifer", "Upper Thorncliffe Aquitard", "Upper Unionville Aquifer", "Upper Victoria Aquifer", + "Upper Wapiti Member", "Upper Waterloo Moraine Aquifer", - "Val d'Or Formation", + "Upper Willow Creek Member", "Valens Outwash Aquifer", - "Vanderhoof Alluvial", - "Vedder Crossing", - "Vedder Mountain NW", - "Vedder Mountain SE", + "Valley View-Dawson Creek Bedrock Aquifer", + "Vanderhoof Alluvial Aquifer", + "Vedder Crossing Aquifer", + "Vedder Mountain NW Bedrock Aquifer", + "Vedder Mountain SE Bedrock Aquifer", "Vellore Aquifer", - "Vernon Aquifer", + "Verger Member", + "Vermillion River Formation", + "Vernon Confined", + "Vernon Unconfined", "Viking Formation", - "Wabamun Formation", + "Viking/Newcastle Formation", + "Vimy Member", + "Wabamun Group", + "Wabiskaw Member", "Wainfleet Aquifer", - "Walker Hook", + "Walker Hook Aquifer", "Walkerton Aquifer", "Wallaceburg Aquifer", "Wallacetown Formation", + "Wapiabi Formation", "Wapiti Formation", - "Wark-Colquitz", - "Warman Formation Stratified Deposits", + "Wark-Colquitz Aquifer", + "Warman Formation", "Waterloo Moraine Aquifer", + "Waterways Formation", + "Watson Creek Valley Aquifer System", + "Watt Mountain Formation", "Wentworth Aquifer", "Wentworth Till/Aquitard", + "West Arrow Creek Overburden Aquifer", "West Carlton Aquifer", - "West Cluculz Lake", - "West Langley", - "West of Aldergrove", - "West of Merritt", - "West Saanich Road", - "West Sechelt", - "Westwold", + "West Cluculz Lake Bedrock Aquifer", + "West Creston Aquifer", + "West Langley Aquifer", + "West of Aldergrove Aquifer", + "West of Merritt Aquifer", + "West Saanich Road Aquifer", + "West Sechelt Aquifer", + "Westgate Formation", + "Westwold Aquifer", + "White Rock Aquifer", + "Whitecourt Mountain Formation", "Whitemud Formation", + "Whitemud Member", "Whittlesey Aquifer", "Whittlesey Clay/Aquitard", "Whittlesey Sand", - "Willow Creek alluvial Aquifer", + "Willow Creek Alluvial Aquifer", + "Willow Creek Formation", "Willow Creek Formation Aquifer", "Windsor Group", "Winnipeg Formation", - "Wood Mountain and Mount Washington", - "Woodbend Group", + "Winnipegosis Formation", + "Winterburn Group", + "Wood Mountain and Mount Washington Aquifer", + "Wood Mountain Formation", "Woodbridge Aquifer", "Yonge Street Aquifer", - "York Till" + "York Till", + "Zama Member" ] diff --git a/schemas/data/src/addition/LithologyType.json b/schemas/data/src/addition/LithologyType.json index 50ea354e..4f66f0bf 100644 --- a/schemas/data/src/addition/LithologyType.json +++ b/schemas/data/src/addition/LithologyType.json @@ -23,6 +23,12 @@ "Gravely Sediment", "Humus", "Igneous rock", + "Interbedded gravel and clay", + "Interbedded gravel and sand", + "Interbedded gravel and silt", + "Interbedded sand and clay", + "Interbedded sand and silt", + "Interbedded silt and clay", "Limestone", "Marble", "Metamorphic rock", @@ -56,4 +62,4 @@ "Undifferentiated sediment", "Unknown material", "Volcanic rock" -] \ No newline at end of file +] diff --git a/schemas/data/src/addition/SampleCondition.json b/schemas/data/src/addition/SampleCondition.json index 47cc0e9f..91823525 100644 --- a/schemas/data/src/addition/SampleCondition.json +++ b/schemas/data/src/addition/SampleCondition.json @@ -1,8 +1,8 @@ [ "Flowing", "Nearby site is being pumped or pumped recently", - "Static", - "The site has been pumped recently", - "The site is being pumped", + "Static, before pumping or purging", + "The site has been recently pumped or purged", + "The site is being pumped for water use", "Unspecified" ] \ No newline at end of file diff --git a/schemas/data/src/addition/WellUseType.json b/schemas/data/src/addition/WellUseType.json index 6376d91a..11174c50 100644 --- a/schemas/data/src/addition/WellUseType.json +++ b/schemas/data/src/addition/WellUseType.json @@ -1,6 +1,7 @@ [ "Aquaculture", "Bottling", + "Dewatering", "Livestock", "Monitoring - Ambient", "Monitoring - Other", diff --git a/schemas/data/src/backend.json b/schemas/data/src/backend.json index 822acbfc..814ca153 100644 --- a/schemas/data/src/backend.json +++ b/schemas/data/src/backend.json @@ -81,8 +81,8 @@ "transform": ["trim", "toEnumCase"] }, "AquiferCode": { - "$ref": "./definitions.json#/definitions/AquiferCodeLoose", - "transform": ["trim", "toEnumCase"] + "$ref": "./definitions.json#/definitions/AquiferCode", + "transform": ["trim"] }, "AquiferUnitName": { "$ref": "./definitions.json#/definitions/AquiferUnitNameLoose", diff --git a/schemas/data/src/definitions.json b/schemas/data/src/definitions.json index 066ff17c..c720a2e7 100644 --- a/schemas/data/src/definitions.json +++ b/schemas/data/src/definitions.json @@ -99,11 +99,11 @@ "WellUseTypeLoose": { "$ref": "https://datastream.org/schema/data/values/WellUseType.legacy.json" }, - "AquiferCodeStrict": { - "$ref": "https://datastream.org/schema/data/values/AquiferCode.primary.json" - }, - "AquiferCodeLoose": { - "$ref": "https://datastream.org/schema/data/values/AquiferCode.legacy.json" + "AquiferCode": { + "title": "Aquifer Code", + "description": "A code that designates the aquifer or geologic formation from which the groundwater sample was collected. In the absence of mapped/named aquifers, geologic formation names are included.", + "$ref": "#/definitions/string", + "maxLength": 10 }, "AquiferUnitNameStrict": { "$ref": "https://datastream.org/schema/data/values/AquiferUnitName.primary.json" diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index 7d81c112..c3cd9cdd 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -68,7 +68,7 @@ "$ref": "./definitions.json#/definitions/WellUseTypeStrict" }, "AquiferCode": { - "$ref": "./definitions.json#/definitions/AquiferCodeStrict" + "$ref": "./definitions.json#/definitions/AquiferCode" }, "AquiferUnitName": { "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict" @@ -314,6 +314,9 @@ }, { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" } ] } diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index e19a4db6..0bfd8edf 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -78,8 +78,7 @@ "transform": ["trim", "toEnumCase"] }, "AquiferCode": { - "$ref": "./definitions.json#/definitions/AquiferCodeStrict", - "transform": ["trim", "toEnumCase"] + "$ref": "./definitions.json#/definitions/AquiferCode" }, "AquiferUnitName": { "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict", @@ -355,6 +354,9 @@ }, { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" } ] } diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 0224e019..eb0b73fe 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -85,6 +85,7 @@ error-string-multiline-pattern = Only letters, numbers, punctuation, symbols, sp error-ActivityType-CTS-ActivityStartTime = Continuous time-series observations must include a valid ActivityStartTime error-ActivityType-ResultAnalyticalMethod = Requires LaboratoryName and ResultAnalyticalMethod columns when ActivityType starts with 'Sample' (i.e. Activity is not a Field Msr/Obs) error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported +error-ActivityMediaName-Groundwater-DepthMeasure = At least one of ActivityDepthHeightMeasure, BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, or WellOpenIntervalBottomMeasure must be reported when ActivityMediaName is Groundwater or Porewater error-CharacteristicName-MethodSpeciation = MethodSpeciation required for selected CharacteristicName error-CharacteristicName-Nutrient-ResultSampleFraction = ResultSampleFractions for nutrients should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) error-CharacteristicName-ResultSampleFraction = ResultSampleFraction required for selected CharacteristicName diff --git a/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json b/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json new file mode 100644 index 00000000..7f67ef67 --- /dev/null +++ b/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json @@ -0,0 +1,27 @@ +{ + "$id": "https://datastream.org/schema/data/logic/ActivityMediaName-Groundwater-DepthMeasure.json", + "title": "ActivityMediaName-Groundwater-DepthMeasure", + "description": "At least one depth measure (BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, WellOpenIntervalBottomMeasure, or ActivityDepthHeightMeasure) must be populated when ActivityMediaName is Groundwater or Porewater", + "errorMessage": "error-ActivityMediaName-Groundwater-DepthMeasure", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + } + }, + "required": ["ActivityMediaName"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "anyOf": [ + { "required": ["ActivityDepthHeightMeasure"] }, + { "required": ["BoreholeDepthMeasure"] }, + { "required": ["WellDepthMeasure"] }, + { "required": ["WellOpenIntervalTopMeasure"] }, + { "required": ["WellOpenIntervalBottomMeasure"] } + ] + } +} \ No newline at end of file diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index 0b6cbd46..2db360e9 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -63,7 +63,7 @@ "$ref": "./definitions.json#/definitions/WellUseTypeStrict" }, "AquiferCode": { - "$ref": "./definitions.json#/definitions/AquiferCodeStrict" + "$ref": "./definitions.json#/definitions/AquiferCode" }, "AquiferUnitName": { "$ref": "./definitions.json#/definitions/AquiferUnitNameStrict" @@ -310,6 +310,9 @@ }, { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" + }, + { + "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" } ] } diff --git a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json index 933d4603..1fcc3535 100644 --- a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json +++ b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json @@ -9,6 +9,7 @@ "properties": { "ActivityMediaName": { "enum": [ + "Groundwater", "Ocean Water", "Porewater", "Rainwater", diff --git a/schemas/data/src/subset/AquiferType.json b/schemas/data/src/subset/AquiferType.json index 307cab95..b88654a0 100644 --- a/schemas/data/src/subset/AquiferType.json +++ b/schemas/data/src/subset/AquiferType.json @@ -1 +1 @@ -["CONFINED", "SEMI-CONFINED", "UNCONFINED"] +["ARTESIAN", "CONFINED", "SEMI-CONFINED", "UNCONFINED"] \ No newline at end of file diff --git a/schemas/data/src/subset/LithologyType.json b/schemas/data/src/subset/LithologyType.json index bb59b413..1d1a7a4d 100644 --- a/schemas/data/src/subset/LithologyType.json +++ b/schemas/data/src/subset/LithologyType.json @@ -31,6 +31,12 @@ "Gravely Sediment", "Humus", "Igneous rock", + "Interbedded gravel and clay", + "Interbedded gravel and sand", + "Interbedded gravel and silt", + "Interbedded sand and clay", + "Interbedded sand and silt", + "Interbedded silt and clay", "Limestone", "Marble", "Metamorphic rock", @@ -64,4 +70,4 @@ "Undifferentiated sediment", "Unknown material", "Volcanic rock" -] \ No newline at end of file +] diff --git a/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json b/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json index 941b721b..7e66d2dc 100644 --- a/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json +++ b/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json @@ -1,7 +1,8 @@ [ - "NAD27", - "NAD83", - "UNKWN", - "WGS72", - "WGS84" -] \ No newline at end of file + "NAD27", + "NAD83", + "OTHER", + "UNKWN", + "WGS72", + "WGS84" +] diff --git a/schemas/data/src/subset/WellUseType.json b/schemas/data/src/subset/WellUseType.json index de8d5f9b..0bb5a952 100644 --- a/schemas/data/src/subset/WellUseType.json +++ b/schemas/data/src/subset/WellUseType.json @@ -1,6 +1,10 @@ [ "Aquaculture", "Bottling", + "Dewatering", + "Domestic", + "Geothermal", + "Industrial", "Irrigation", "Livestock", "Monitoring - Ambient", diff --git a/schemas/data/src/values/AquiferCode.legacy.json b/schemas/data/src/values/AquiferCode.legacy.json deleted file mode 100644 index 1da63fbb..00000000 --- a/schemas/data/src/values/AquiferCode.legacy.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://datastream.org/schema/data/values/AquiferCode.legacy.json", - "title": "Aquifer Code", - "description": "", - "type": "string", - "enum": [ - "12_NS" - ], - "maxLength": 5 -} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferCode.primary.json b/schemas/data/src/values/AquiferCode.primary.json deleted file mode 100644 index 68c010cb..00000000 --- a/schemas/data/src/values/AquiferCode.primary.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://datastream.org/schema/data/values/AquiferCode.primary.json", - "title": "Aquifer Code", - "description": "", - "type": "string", - "enum": [ - "12_NS" - ], - "maxLength": 5 -} \ No newline at end of file diff --git a/schemas/data/src/values/AquiferType.legacy.json b/schemas/data/src/values/AquiferType.legacy.json index 75285bc1..14befdf4 100644 --- a/schemas/data/src/values/AquiferType.legacy.json +++ b/schemas/data/src/values/AquiferType.legacy.json @@ -4,6 +4,7 @@ "description": "", "type": "string", "enum": [ + "ARTESIAN", "CONFINED", "SEMI-CONFINED", "UNCONFINED" diff --git a/schemas/data/src/values/AquiferType.primary.json b/schemas/data/src/values/AquiferType.primary.json index 37913825..a7885062 100644 --- a/schemas/data/src/values/AquiferType.primary.json +++ b/schemas/data/src/values/AquiferType.primary.json @@ -4,6 +4,7 @@ "description": "", "type": "string", "enum": [ + "ARTESIAN", "CONFINED", "SEMI-CONFINED", "UNCONFINED" diff --git a/schemas/data/src/values/AquiferUnitName.legacy.json b/schemas/data/src/values/AquiferUnitName.legacy.json index 91b73e65..a82ecd2a 100644 --- a/schemas/data/src/values/AquiferUnitName.legacy.json +++ b/schemas/data/src/values/AquiferUnitName.legacy.json @@ -4,45 +4,56 @@ "description": "", "type": "string", "enum": [ - "Abitibi Dykes", + "111 Mile Creek Valley Aquifer System", + "1WS Member", + "2WS Member", + "Abbotsford Shallow Aquifer", + "Abbotsford Shallow West Aquifer", "Alberta Group", + "Aldergrove Shallow Aquifer", "Algonquin Aquifer Complex", "Algonquin Basin", "Algonquin Shoreline", + "Alice Siding Aquifer", "Alliston Aquifer Complex", + "Alluvial and glaciofluvial sand and gravel", "Alviston-Rutherford Aquifer", "Amabel-Lockport-Guelph Hydrogeologic Unit", "Amherstburge Aquifer", - "Amos Group", "Ancaster-West Flamborough Aquifer", "Annapolis-Cornwallis valleys Aquifer", - "Ardkenneth Member", + "Anten Coquina Member", + "Arras-Fellers Heights Bedrock Aquifer", + "Arrowwood Formation", "Arthur-Mount Forest Aquifer", "Assiniboine delta Aquifer", "Atha Aquifer", "Ausable Aquifer", - "Baby Group", + "Bad Heart Formation", "Balfron Formation", "Banff Formation", + "Barons Sand Formation", "Basal Aquifer", - "basal clastic unit (Winnipeg) Aquifer", + "Basal clastic unit (Winnipeg) Aquifer", + "Basal Cretaceous Sandstone", "Bass Island Hydrogeologic Unit", - "Batholith of Guyenne", - "Batholith of La Corne", "Battle Formation", - "Battleford Formation Stratified Deposits", + "Battleford Formation", + "Beach Ridge sand and gravel", "Bearpaw Formation", - "Bearpaw Sand Members Aquifer", - "Beaverville Lake Group", - "Bellefeuille River Pluton", + "Beaver Creek Overburden Aquifer", + "Belle Fourche Formation", "Belly River Formation", "Belly River Group", - "Bernetz Intrusion", - "Berry Pluto", "Beverly-Onoway channel Complex", "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blackstone Formation", + "Blewett Bedrock Aquifer", "Blood Reserve Formation", "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Blueberry Valley Aquifer System", + "Blueberry-Aitken Bedrock Aquifer", + "Bluesky Formation", "Bois Blanc Hydrogeologic Unit", "Boissevain Formation", "Bonnyville U1 Sand", @@ -52,28 +63,39 @@ "Bothwell Aquifer", "Bounded Channel Aquifers", "Bourget Aquifer", - "Bourlamaque Batholith", "Bow Island Formation", - "Bredenbury Aquifer", + "Bradley Creek Valley Aquifer System", + "Brazeau Formation", + "Bredenbury & Wynyard Formations", + "Bridge Lake Aquifer System", + "Brilliant Bedrock Aquifer", "Bronson Lake", "Brownsville Local Aquifer", + "Buried valley containing sand and gravel", "Buried valley/blanket Aquifers", - "Calamité River Pluton", + "Cadomin Formation", + "Cadotte Formation", "Caledon-Grand River Outwash Aquifer", "Calgary Lethbridge Corridor HSU C Aquitard", "Calgary Lethbridge Corridor HSU S1 Aquifer", "Calgary Lethbridge Corridor HSU S2 Aquifer", - "Camac Formation", + "Canadian Shield", "Canning Aquitard", "Canning Till Aquitard", + "Cantuar Formation", + "Canyon Overburden Aquifer", + "Carbon Member", "Carbonate rock Aquifer", "Carboniferous basin Aquifer", "Cardium Formation", - "Caste Formation", + "Carlile Formation", + "Casino Overburden Aquifer", + "Castlegar Overburden Aquifer", "Cataract Group Hydrogeologic Unit", "Catfish Creek Aquifer", "Cedar Grove Aquifer", "Central Catfish Creek Aquifer", + "Central Halfway-Beatton Bedrock Aquifer", "Central South Nation Aquifer Complex", "Champlain Aquifer", "Channel Aquifer 1", @@ -81,151 +103,202 @@ "Channel Aquifer 3", "Channel Aquitard 1", "Channel Aquitard 2", + "Charlie Halfway Beatton Bedrock Aquifer", "Chateauguay Aquifer", "Chauidiere Aquifer", "Chesley Aquifer", - "Chicobi Group", + "Chinchaga Formation", "Chu Íntthi Aquifer", + "Chungo Member", "Clarence Creek Aquifer", - "Clearwater Formation", - "Clermont-Disson Formation", + "Clayton Heights Aquifer", + "Clayton Uplands Aquifer", + "Clinton Creek Bedrock Aquifer", + "Clinton Creek Lower Unconsolidated Aquifer", + "Clinton Creek Upper Sand and Gravel Aquifer", "Clinton Group Hydrogeologic Unit", - "Cobble Hill Aquifer", + "Coalspur Formation", + "Cold Lake Formation", "Coldstream Aquifer", - "Colombourg Batholith", "Colorado Group", + "Connelly Creek Formation", "Contact Aquifer", - "Cooking Lake sediments", + "Contact Rapids Formation", + "Cooking Lake area sediments", + "Cooking Lake Formation", "Credit River Aquifer", + "Creston-Kootenay River Overburden Aquifer", + "Cridland Creek Bedrock Aquifer", "Crowsnest River Alluvial Aquifer", - "Cruikshank Member", - "Cruikshank-Thelma Member", "Cumberland Group", "Cypress Hills Formation", - "Dalmeny Aquifer", - "Decelles Reservoir Batholith", - "Deguisier Formation", - "Del Bonita Gravels", - "Demaine Member", + "Dalehurst Member", + "Dawson Creek Overburden Aquifer", + "Del Bonita Formation", "Detroit River Group Hydrogeologic Unit", + "Devonian Strata", + "Dinosaur Park Formation", + "Doe Creek Member", + "Doig Formation", "Don Formation", - "Drumheller channel Complex", - "Dubuisson Formation", + "Dowling Member", + "Drumheller Channel Complex", + "Drumheller Member", + "Drywood Creek Formation", "Dundalk Aquifer", "Dundee Hydrogeologic Unit", + "Dundurn Formation", "Dunvegan Formation", - "Duparquet Formation", "Durham Aquifer", + "Duvernay Formation", "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", "East and Middle Sixteen Mile Aquifer", + "East Creston Bedrock Aquifer", + "East Pine Bedrock Aquifer", + "East Pine-Groundbirch Bedrock Aquifer", "Eastend Formation", - "Eastend-Cypress Hills Aquifer", "Eastend-Ravenscrag Aquifer", - "Eastend-Wood Member Aquifer", "Edson burried-valley Aquifer", "Egmond Bay Formation", "Elgin-Southampton Aquifer", - "Elk Point Group", + "Ellerslie Member", + "Ellis Group", "Empress Formation", - "Empress Group Aquifers", + "Empress Formation-Uplands glacial", + "Empress Formation-Valley fill glacial", + "Empress Formation-Valley fill glacial Tertiary Undifferentiated", + "Empress Formation-Valley fill Tertiary", "Erie Interstadial Deposits", + "Ernestina Lake Formation", + "Esker and gravel", + "Estend Formation", "Ethel Lake Formation", "Etobicoke Aquifer", - "Fielding Aquifer", - "Figuery Group", - "Flavrian Pluto", + "Exshaw Formation", + "Eyot Formation", + "Farrel Creek Bedrock Aquifer", + "Fernie Formation", + "First White Specks Formation", + "Fish Scales Formation", + "Fish Scales Member", "Flesherton Aquifer", - "Floral Sands and Gravels", + "Floral Formation", "Fontfill Aquifer Complex", "Foremost Formation", - "Forestry Farm Aquifer", - "Fort St. John Group", + "Fort Nelson-River Alluvial Aquifer", + "Fort Simpson Formation", + "Fort St. John Overburden Aquifer System", + "Fort Vermilion Formation", "Fourchu Group", - "Fractured Aquifers - Gulf Islands", - "Fraser Canyon", + "Fractured Aquifers-Gulf Islands", + "Fraser Canyon Aquifer, Choate to Yale", + "Fraser Canyon Aquifer, from Yale to Haig", "Fraser Lowlands Aquifer", - "Fraser Plateau Lava", + "Fraser Plateau Lava Aquifer", "Frenchman Formation", - "Frenchman Whitemud Eastend Formation", + "Frenchman to Eastend Undifferentiated", "Fulford Aquifer", "Fundy Group", - "Ganges Harbour", + "Ganges Harbour Aquifer", "Georgeville Group", - "Gibsons/SCRD Granthams Landing/Elphinstone", + "Gething Formation", + "Gibsons/SCRD Granthams Landing/Elphinstone Aquifer", "Glaciolacustrine Aquifer Complex", + "Glade Overburden Aquifer", + "Glauconitic Sandstone Formation", "Glemmore Basal Aquifer", - "Gleneden", - "Granada Formation", + "Gleneden Aquifer", "Grand Centre Formation", - "Grand Forks", + "Grand Forks Aquifer", "Grand Rapids Formation", "Grand River Aquifer", "Grand River Basin Aquifer", "Grand River Outwash Deposits", "Grand River Valley Basinal Deposits", - "Grant Hill", + "Grandview Aquifer", + "Grant Hill Aquifer", "Greater Kelowna Aquifer", "Greatlakean Stade Deposits", "Green River Aquifer", - "Greendale Deep", + "Greendale Deep Aquifer", + "Greenwood", "Greenwood Aquifer", "Grimshaw Gravels Aquifer", - "Guichon Creek", - "Haans Creek to Blain Creek - Haida Gwaii", + "Grosmont Formation", + "Groundbirch Buried Valley Aquifer", + "Grumbler Group", + "Guichon Creek Aquifer", + "Haans Creek to Blain Creek-Haida Gwaii Aquifer", "Hagan Aquifer", - "Haida/Lawnhill", - "Haig", + "Haida/Lawnhill Aquifer", + "Haig Aquifer", + "Halfway Valley Aquifer System", "Halton Till", + "Halverson Ridge Formation", "Hamilton Group Hydrogeologic Unit", "Hand Hills Formation", "Hanover Aquifer", + "Hanson Member", "Harrow Aquifer", - "Hatzic Prairie", - "Hay River Formation", + "Hatzic Prairie Aquifer", + "Haultain Formation", + "Haven Member", "Haynes Aquifer", - "Heather Bank", - "Hebecourt Formation", - "Heva Formation", + "Haynes Member", + "Hazelmere Aquifer", + "Hazelmere Valley Aquifer", + "Heather Bank Aquifer", "Hillsborough Formation", + "Hillsborough River Formation", "Hockley Valley Aquifer", "Holstein Aquifer", "Holt Aquifer Complex", - "Hopington AB", - "Hopington C", + "Hopington AB Aquifer", + "Hopington C Aquifer", "Horseshoe Canyon Formation", + "Horsethief Member", "Horton Group", - "Houston Bedrock", - "Hullcar Aquifer", - "Interglacial Aquifers", - "Joeyaska Deep", - "Joeyaska Shallow", + "Houston Bedrock Aquifer", + "Hullcar Confined Aquifer", + "Hullcar Perched", + "Hullcar Unconfined Aquifer", + "Ireton Formation", + "Ishbel Group", + "Joeyaska Deep Aquifer", + "Joeyaska Shallow Aquifer", + "Joli Fou Formation", "Judith River Aquifer", + "Judith River/Belly River Formation", + "Jumping Pound SST Member", + "Jurassic Formations", "Kame Outwash Aquifer Complex", - "Karmutsen", - "Kawkawa Lake", - "Keating", + "Karmutsen Aquifer", + "Kaskapau Formation", + "Kawkawa Lake Aquifer", + "Keating Aquifer", + "Keg River Formation", "Kettle Point Hydrogeologic Unit", "Kildare Formation", - "Kingsvale", - "Kipawa Formation", + "Kingsvale Aquifer", + "Kiskatinaw Buried Channel Aquifer", + "Kiskatinaw Glaciodeltaic Overburden Aquifer", + "Kitchener Creek Overburden Aquifer", "Kleinburg Aquifer", - "Koksilah River Valley", - "Kwinshatin Intertill", - "La Morandiere Group", - "La Motte Batholith", - "La Motte-Vassan Formation", + "Koksilah River Valley Aquifer", + "Kwinshatin Intertill Aquifer", + "La Glace Sandstone Member", + "La Loche Formation AND Basal Red Beds Unit", "Lacombe Aquitard", - "Lake Abitibi-Okikodesik Batholith", + "Lacombe Member", "Lake Algonquin Sand Aquifer", - "Lake Arthur Group", "Lake Peel Deltaic Aquifer", "Lake Schomberg and Algonquin Aquifer", "Lake Schomberg and Algonquin Aquitard", "Lancaster-Cornwall Aquifer", - "Landrienne Formation", - "Langdale/Hopkins", - "Langdale/Hopkins Landing", - "Langley Upland", + "Langdale/Hopkins Aquifer", + "Langdale/Hopkins Landing Aquifer", + "Langley Upland Aquifer", + "Langley Upland Intertill Aquifer", "LD Basal Till", "LD Local Aquifers", "LD Lower Aquifer", @@ -233,351 +306,474 @@ "LD Upper Till", "Lea Park Formation", "Leamington Aquifer", + "Leduc Formation", + "Lenses of sand and gravel", "Lincoln Aquifer", - "Little Qualicum River", + "Little Qualicum River Aquifer", "Local Aquifer 2", "Local Aquitard 1", - "Lookout Ridge", - "Lorrain Formation", + "Lookout Ridge Aquifer", "Łots'an Aquifer", - "Lower Bousquet Formation", + "Lower Bearpaw Formation", + "Lower Belly River Formation", + "Lower Brazeau Member", + "Lower Bridge Creek Valley Aquifer System", + "Lower Bridge Creek Valley Bedrock Aquifer", "Lower Brougham Aquifer", - "Lower Cassidy", + "Lower Cassidy Aquifer", "Lower Catfish Creek Till Aquitard", - "Lower Cherryville", + "Lower Cherryville Aquifer", "Lower Chinguacousy Aquifer", - "Lower Coquihalla Canyon", - "Lower Cowichan River A", - "Lower Cowichan River C", - "Lower Dundurn Formation Stratified Deposits", + "Lower Coalspur Member", + "Lower Coquihalla Canyon Aquifer", + "Lower Cowichan River A Aquifer", + "Lower Cowichan River C Aquifer", "Lower Erie Phase Aquifer", "Lower Erie Phase Aquitard", - "Lower Floral Formation Stratified Deposits", - "Lower Gates River", + "Lower Gates River Aquifer", + "Lower Lac la Hache Valley Bedrock Aquifer", + "Lower Lea Park Formation", + "Lower Loon River Formation", + "Lower Lotsberg Formation", "Lower Markham Aquifer", "Lower Maryhill Till", - "Lower Merritt", - "Lower Nechako River", - "Lower Nicola", - "Lower Nicola Outwash", - "Lower Shuswap Deep Aquifer", - "Lower Shuswap River Aquifer", + "Lower Merritt Aquifer", + "Lower Montney Formation", + "Lower Nechako River Aquifer", + "Lower Nicola Aquifer", + "Lower Nicola Outwash Aquifer", + "Lower Ordovician OR Cambrian Strata", + "Lower Scollard Member", + "Lower Shaftesbury Formation", + "Lower Shuswap Deep Confined", + "Lower Shuswap River Confined", "Lower Thorncliffe Aquifer", "Lower Thorncliffe Aquitard", "Lower Unionville Aquifer", "Lower Victoria Aquifer", + "Lower Wapiti Member", + "Lower Willow Creek Member", "Lowland Aquifer Complex", - "Lumby - Lower Aquifer", - "Lumby - Upper Aquifer", + "Lumby-Lower Aquifer", + "Lumby-Upper Aquifer", + "Lundbreck Formation", "Mabou Group", "Mackinaw Interstadial Deposits", - "Malahat Ridge", - "Malcolm Island", - "Mannvile Group", + "Majeau Lake Formation", + "Major buried sand and gravel", + "Malahat Ridge Aquifer", + "Malcolm Island Aquifer", + "Mannville Group", "Maple Aquifer", - "Mara Aquifer", - "Marble Hill Unconsolidated", + "Mara Aquifer Aquifer", + "Marble Hill Unconsolidated Aquifer", "Marie Creek Formation", "Markdale Aquifer", - "Masset", - "Matachewan Dyke Swarm", - "Matador Member", - "Mauricie Aquifer", - "McDougall Creek Deltaic", - "McMillan Island", + "Marshybank Formation", + "Marshybank Member", + "Masset Aquifer", + "McDougall Creek Deltaic Aquifer", + "McMillan Island Aquifer", "McMurray Formation", "Meaford Aquifer", + "Medicine Hat Formation", + "Medicine Hat Member", "Meguma SuperGroup", "Meltwater Channel Hydrogeologic Unit", - "Mennon Formation Stratified Deposits", - "Mennon Sand", + "Mennon Formation", "Middle Erie Phase Aquifer", "Middle Maryhill Till", - "Middle Merritt", + "Middle Merritt Aquifer", + "Middle Montney Formation", + "Middle Red Beds Formation", "Middle Thorncliffe Aquifer", "Middle Thorncliffe Aquitard", "Middle Waterloo Moraine Aquifer & Equivalents", "Milk River Aquifer", - "Mill Bay", - "Mine Hunter Group", + "Milk River Formation", + "Mill Bay Aquifer", "Minesing Basin Transgressive Deposits", "Mirabel Aquifer", "Mission Creek Aquifer", - "Mont-Brun Formation", - "Montney Hydrostratigraphic Unit", + "Monteith Formation", + "Montney Halfway Beatton Bedrock Aquifer", + "Montney Turbidite", + "Montrose Bedrock Aquifer", "Morien Group", + "Morrin Member", "Mount Albert Aquifer Complex", - "Mount Ozzard Aquifer", - "Mount Tom Aquifer", + "Mount Ozzard Bedrock West Aquifer", + "Mount Ozzard, Bedrock Southeast", + "Mount Ozzard, Unconsolidated", + "Mount Tom Bedrock", + "Mount Tom Bedrock Aquifer", + "Mount Tom Unconsolidated", "Muriel Lake", - "Nanaimo Group, Campbell River to Courtney", + "Murrayville AC Aquifer", + "Murrayville B Aquifer", + "Muskeg Formation", + "Muskeg Lower Anhydrite Member", + "Muskiki Formation", + "Muskiki Formation OR Kaskapau Formation", + "Muskiki Member", + "Muskwa Formation", + "Muskwa River Alluvial Aquifer", + "Muskwa-Fort Nelson Buried Valley Aquifer", + "Muskwa-Fort Nelson Glaciofluvial Aquifer", + "Nanaimo Group Aquifer, Campbell River to Courtney", "Nanaimo Lowlands Aquifer", - "Nechako Buried Valley", + "NE of White Rock A Aquifer", + "NE of White Rock B Aquifer", + "Nechako Buried Valley Aquifer", + "Nelson Overburden Aquifer", "Newmarket Till", + "Newton Upland Aquifer", "Niagra-on-the-Lake Aquifer", - "Nicomekl-Serpentine", - "Nicomen Slough", + "Nicomekl-Serpentine Aquifer", + "Nicomen Slough Aquifer", + "Nikanassin Formation", + "Niobrara Formation", "Nissouri Stadial Deposits", - "Nivek", + "Nivek Aquifer", + "Nomad Member", "Norfolk Sand Plain Aquifer", - "North Campbell River Aquifer", - "North Central Saanich", - "North Hope", - "North Houston Aquifer", + "Norns Creek Overburden Aquifer", + "North Campbell River Bedrock", + "North Campbell River Unconsolidated", + "North Castlegar Bedrock Aquifer", + "North Central Saanich Aquifer", + "North Hope Aquifer", + "North Houston Bedrock", "North Mountain Formation", - "North Nechako Terrace", - "North Salt Spring Island", - "North-Central Salt Spring Island", + "North Nechako Terrace Bedrock Aquifer", + "North Salt Spring Island Aquifer", + "North-Central Salt Spring Island Aquifer", + "Northern Halfway Beatton Bedrock Aquifer", + "Northern Lac la Hache Aquifer System", + "Northwest Halfway-Beatton Bedrock Aquifer", + "Northwest of Clearbrook Aquifer", "Notre Dame Aquifer", "O Avenue Aquifer", - "O'Keefe Aquifer", - "O'Keefe Basal Aquifer", + "O'Keefe Basal", + "O'Keefe Unconfined Aquifer", "Oak Ridges Moraine Aquifer", + "Obed Mountain Formation", "Odanah Member", "Odanah Shale Aquifer", - "Okanagan Landing Deep Aquifer", + "Okanagan Landing Deep Confined", "Okanagan Valley Aquifer", "Oldcastle Aquifer", - "Opasatica Gneiss", + "Oldman Formation", + "Opabin Member", "Orangeville Aquifer Complex", "Orby Head Formation", "Oro Moraine Aquifer Complex", "Oro-Medonte Aquifer", - "Osoyoos West", + "Osoyoos West Aquifer", + "Ostracod Beds Member", "Ottawa Group Hydrogeologic Unit", - "Outlook Member", - "Owl Creek", + "Owl Creek Aquifer", "Owl Ridge Aquifer", - "Oxarart-Cruikshank Members", - "Oyster River", - "Pacheedaht", + "Oyster River Aquifer", + "Pacheedaht Aquifer", + "Paddy Formation", "Pakowki Formation", - "Palmarolle Pluton", + "Paldi-Deep Aquifer", + "Paleozoic Carbonate rock formations, Ordovician to Devonian", "Paris Aquifer", "Paris moraine Aquitard", "Paskapoo Formation", - "Paul's Basin", + "Paskapoo Formation Aquifer", + "Paterson Overburden Aquifer", + "Paul's Basin Aquifer", "Peace River Formation", + "Peace-Valley Aquifer System", + "Pelican Formation", + "Pelican Mountain Formation", + "Pense Formation", "Pickering Aquifer", "Pictou Group", - "Pineview", + "Pike Lake Formation", + "Pineview Aquifer", "Plantagenet Aquifer", - "Pluto of Amos", - "Pluto of Lake Dufault", - "Pluto of Lake Fréchette", - "Pluto of the Lake of Sixteen", - "Pluto of The Queen", - "Pluto of Trécesson", - "Pluto of Val-St-Gilles", - "Pluto of Villemontel", - "Pontiac Group", + "Porcupine Hills Formation", "Porcupine Hills Formation Aquifers", "Port Bruce Phase Aquitard", "Port Bruce Stadial Deposits", - "Port Clements", + "Port Clements Aquifer", "Port Colborne Aquifer", "Port Huron Stadial Deposits", - "Port McNeill East Aquifer", - "Port McNeill East Bedrock", - "Port McNeill West Aquifer", + "Port McNeill East Bedrock Aquifer", + "Port McNeill East Unconsolidated", + "Port McNeill West Bedrock", + "Port McNeill West Unconsolidated", "Portneuf Aquifer", "Pottery Road Formation", - "Poularies Batholith", - "Powell Pluton", - "Powers Ck Deltaic", + "Pouce Coupe Member", + "Pouce Coupe Overburden Aquifer", + "Pouce Creek Bedrock Aquifer", + "Powers Ck Deltaic Aquifer", + "Prairie Evaporite Formation", "Pre-Canning Aquifers", "Pre-Canning Aquitard", "Pre-Catfish Aquifers", "Precambrian Hydrogeologic Unit", - "Preissac Batholith", + "Precambrian rocks", + "Precambrian to Model Base", "Priceville Aquifer", - "Puntledge/ Cumberland", + "Prophet River Alluvial Aquifer", + "Puntledge/ Cumberland Aquifer", + "Puskwaskau Formation", "Puslinch Aquifer", - "Quadra Central", - "Quadra South", + "Quadra Central Bedrock Aquifer", + "Quadra South Bedrock Aquifer", "Queenston Hydrogeologic Unit", - "Quinsam to Stories Beach", + "Quinsam to Stories Beach Aquifer", "Ravenscrag Formation", - "Rawlings Lake", - "Red Deer River channel Complex", + "Ravenscrag to Eastend Undifferentiated", + "Rawlings Lake Aquifer", + "Red Deer River channel complex", "Regional Aquifer 3", "Regional Aquitard 3", - "Remigny Batholith", - "Reneault-Dufresnoy Formation", - "Ribstone Creek Member", - "Richelieu Aquifer", + "Richelieu-Yamaska Aquifer", "Richibucto Formation", "Rideau Front Aquifer", - "Roberts Creek", + "Riding Mountain/Pierre Shale Formation", + "Roberts Creek Aquifer", "Rockcliffe Hydrogeologic Unit", "Rockland Aquifer", - "Rosebery", - "Rouyn-Pelletier Formation", - "Ryder Upland A", - "Ryder Upland B", - "Ryder Upland C", + "Rosebery Aquifer", + "Rundle Group", + "Ryder Upland A Aquifer", + "Ryder Upland B Aquifer", + "Ryder Upland C Aquifer", + "Saint-Maurice Aquifer", "Salina Hydrogeologic Unit", - "Salmon River", - "Salmon River - Lower Aquifer", - "Salmon River - Upper Aquifer", + "Salmo River Bedrock Aquifer", + "Salmo River Overburden Aquifer", + "Salmon River Aquifer", + "Salmon River-Lower Aquifer", + "Salmon River-Upper Aquifer", "Sand Dunes Aquifer", - "Sand River Formation", "Sandilands Aquifer", - "Sandspit - Haida Gwaii", - "Sardis-Vedder", + "Sandspit-Haida Gwaii Aquifer", + "Sardis-Vedder Aquifer", "Sarsfield Aquifer", - "Saskatoon Group Aquifers", + "Sayward-Salmon River Aquifer", "Scarborough Formation", "Schomberg Aquifer Complex", + "Schooler Creek Group", "Scollard Formation", - "Sechelt/Wakefield Creek", - "Seton Portage", - "Shannon Lake", - "Shawnigan Lake", + "Sechelt/Wakefield Creek Aquifer", + "Second White Specks Formation", + "Second White Specks/Favel Formation", + "Sediment Above Bedrock", + "Seton Portage Aquifer", + "Shaftesbury Formation", + "Shannon Lake Aquifer", + "Shawnigan Lake Aquifer", + "Shawnigan Lake/Cobble Hill/Mill Bay Aquifer", + "Sheridan Lake Aquifer", "Shuswap Highlands Aquifer", + "Silurian", "Simcoe Group Hydrogeologic Unit", "Similkameen River Aquifer", - "Sinkut Mountain North Surficial", - "Skidgate/Queen Charlotte", + "Sinkut Mountain North Surficial Aquifer", + "Skidgate/Queen Charlotte Aquifer", + "Slave Point Formation", "Smoky Group", - "Sooke-Metchosin", + "Sooke-Metchosin Aquifer", + "South Castlegar Bedrock Aquifer", "South Central Elgin Aquifer", - "South Fraser Lake", - "South Lake Simard Batholith", + "South Fraser Lake Bedrock Aquifer", + "South Fraser River Delta Aquifer", "South London Aquifer", - "South Nechako Terrace", - "South of Aldergrove", - "South of Hopington", - "South of Murrayville AC", - "South of Murrayville B", - "South Salt Spring Island", - "South Saskatchewan Alluvium", - "South Valemont", - "South Vanderhoof", - "South Vernon Aquifer", - "South-Central Salt Spring Island", - "Spallumcheen Aquifer", - "Spallumcheen Basal Aquifer", - "Spences Bridge", - "Sperling", - "Spius Creek West of Canford", + "South Nation Aquifer", + "South Nechako Terrace Bedrock Aquifer", + "South of Aldergrove Aquifer", + "South of Hopington Aquifer", + "South of Murrayville AC Aquifer", + "South of Murrayville B Aquifer", + "South Quadra Unconsolidated Aquifer", + "South Salt Spring Island Aquifer", + "South Valemont Aquifer", + "South Vanderhoof Unconsolidated Aquifer", + "South Vernon Confined Aquifer", + "South Vernon Unconfined Aquifer", + "South-Central Salt Spring Island Aquifer", + "Southern Horse Lake Aquifer System Aquifer", + "Spallumcheen Basal Confined Aquifer", + "Spallumcheen Confined", + "Spallumcheen Unconfined Aquifer", + "Spences Bridge Aquifer", + "Sperling Aquifer", + "Spirit River Formation", + "Spius Creek West of Canford Aquifer", "St. Catharines Aquifer", "St. George Aquifers", + "St. Martin Aquifer", "St. Mary River Formation", + "St. Mathieu Aquifer", "St. Thomas Moraine Local Aquifers", "Stavely Aquifer", - "Stellako", + "Stellako Unconsolidated Aquifer", "Stirling Group", - "Stoughton-Roquemaure Group", - "Stumbles Creek", + "Stoddart Group", + "Strathmore Member", "Stumbles Creek Aquifer", - "Stump Lake Aquifer", - "Sugar Lake", - "Sumas Prairie", - "Sumas Prairie North", + "Stumbles Creek Confined", + "Stump Lake", + "Stump Lake Bedrock", + "Sugar Lake Aquifer", + "Sulphur Point Formation", + "Sumas Prairie Aquifer", + "Sumas Prairie North Aquifer", "Sunchild Aquifer", - "Sunnybrae", + "Sunkay Formation", + "Sunningdale/Glenmerry Bedrock Aquifer", + "Sunnybrae Aquifer", "Sunnybrook Drift", - "Surficial stratified drift Aquifers", - "Sutherland Group Aquifers", - "Swan Lake Aquifer", + "Sunset Creek Overburden Aquifer", + "Sunset Prairie Bedrock Aquifer", + "Swan Hills Formation", + "Swan Lake Confined Aquifer", + "Swan Lake Unconfined", "Swan River Formation", - "Tachick Lake", - "Tappen", - "Taschereau Batholith", - "Tathlina Formation", - "Tessier Aquifer", + "Sweetwater Bedrock Aquifer", + "Tachick Lake Unconsolidated Aquifer", + "Talik regions", + "Tappen Aquifer", + "Thick and extensive unconfined sand and gravel", + "Thin unconfined sand", + "Thistle Member", "Thornbury Aquifer", "Thorncliffe Formation", "Thornill Aquifer", "Thornton Sand Aquifer", "Tillsonburg Aquifer", - "Timiskaming Group", - "Tlell", - "Topley", - "Trinity Valley", - "Tsolum River, North of Courtney", - "Tuhok Aquifer", + "Tlell Aquifer", + "Tolman Member", + "Topley Bedrock Aquifer", + "Trail Townsite Overburden Aquifer", + "Trail/Warfield Bedrock Aquifer", + "Trinity Valley Aquifer", + "Tsawwassen Aquifer", + "Tsolum River, North of Courtney Aquifer", + "Tuhok Confined Aquifer", + "Tuhok Unconfined Aquifer", "Turtle Mountain Formation", - "Twin Falls Formation", "Two Creeks Interstadial Deposits", "Tyconnell Formation", - "Tyner Valley Aquifer", - "Ucluelet Peninsula", - "Ucluelet, Lost Show", - "Undivided Cumberland Group", - "Undivided Pictou Group", - "Unicola", + "Ucluelet Peninsula Aquifer", + "Ucluelet, Lost Shoe Aquifer", + "Ucluelet, Lost Show Aquifer", + "Unicola Aquifer", + "Unit A Exposed Bedrock and Drift-Poor Areas", + "Unit B Till and Ribbed Moraine Deposits", + "Unit C Ablation Drift Deposits", + "Unit D Glaciomarine and Marine Deposits and Glaciolacustrine Deposits", + "Unit E Glaciofluvial Deposits", "Upland Aquifer Complex", - "Upland Gravel", "Upper and Lower Gloucester Aquifers", "Upper and Lower Nepean-Kemptville Aquifers", "Upper and Lower West Nepean Aquifers", "Upper Aquifer 1", - "Upper Bousquet Formation", + "Upper Bearpaw Formation", + "Upper Brazeau Member", + "Upper Bridge Creek Bedrock Aquifer", + "Upper Bridge Creek Valley Aquifer System", "Upper Brougham Aquifer", - "Upper Bulkley Alluvial", + "Upper Bulkley Alluvial Aquifer", "Upper Catfish Creek Till Aquitard", - "Upper Cherryville", + "Upper Cherryville Aquifer", "Upper Chinguacousy Aquifer", + "Upper Coalspur Member", "Upper Cretaceous sands Aquifer", - "Upper Dundurn Formation Stratified Deposits", "Upper Erie Phase Aquifer", "Upper Erie Phase Aquitard", - "Upper Floral Formation Stratified Deposits", - "Upper Gates River", + "Upper Gates River Aquifer", + "Upper Halfway Bedrock Aquifer", + "Upper Lac la Hache Valley Bedrock Aquifer", "Upper Lea Park Formation", + "Upper Loon Formation", + "Upper Lotsberg Formation", "Upper Markham Aquifer", "Upper Maryhill Till", - "Upper Merritt", + "Upper Merritt Aquifer", + "Upper Montney Formation", + "Upper Ordovician strata", + "Upper Scollard Member", + "Upper Shaftesbury Formation", "Upper Thames Aquifer", "Upper Thorncliffe Aquifer", "Upper Thorncliffe Aquitard", "Upper Unionville Aquifer", "Upper Victoria Aquifer", + "Upper Wapiti Member", "Upper Waterloo Moraine Aquifer", - "Val d'Or Formation", + "Upper Willow Creek Member", "Valens Outwash Aquifer", - "Vanderhoof Alluvial", - "Vedder Crossing", - "Vedder Mountain NW", - "Vedder Mountain SE", + "Valley View-Dawson Creek Bedrock Aquifer", + "Vanderhoof Alluvial Aquifer", + "Vedder Crossing Aquifer", + "Vedder Mountain NW Bedrock Aquifer", + "Vedder Mountain SE Bedrock Aquifer", "Vellore Aquifer", - "Vernon Aquifer", + "Verger Member", + "Vermillion River Formation", + "Vernon Confined", + "Vernon Unconfined", "Viking Formation", - "Wabamun Formation", + "Viking/Newcastle Formation", + "Vimy Member", + "Wabamun Group", + "Wabiskaw Member", "Wainfleet Aquifer", - "Walker Hook", + "Walker Hook Aquifer", "Walkerton Aquifer", "Wallaceburg Aquifer", "Wallacetown Formation", + "Wapiabi Formation", "Wapiti Formation", - "Wark-Colquitz", - "Warman Formation Stratified Deposits", + "Wark-Colquitz Aquifer", + "Warman Formation", "Waterloo Moraine Aquifer", + "Waterways Formation", + "Watson Creek Valley Aquifer System", + "Watt Mountain Formation", "Wentworth Aquifer", "Wentworth Till/Aquitard", + "West Arrow Creek Overburden Aquifer", "West Carlton Aquifer", - "West Cluculz Lake", - "West Langley", - "West of Aldergrove", - "West of Merritt", - "West Saanich Road", - "West Sechelt", - "Westwold", + "West Cluculz Lake Bedrock Aquifer", + "West Creston Aquifer", + "West Langley Aquifer", + "West of Aldergrove Aquifer", + "West of Merritt Aquifer", + "West Saanich Road Aquifer", + "West Sechelt Aquifer", + "Westgate Formation", + "Westwold Aquifer", + "White Rock Aquifer", + "Whitecourt Mountain Formation", "Whitemud Formation", + "Whitemud Member", "Whittlesey Aquifer", "Whittlesey Clay/Aquitard", "Whittlesey Sand", - "Willow Creek alluvial Aquifer", + "Willow Creek Alluvial Aquifer", + "Willow Creek Formation", "Willow Creek Formation Aquifer", "Windsor Group", "Winnipeg Formation", - "Wood Mountain and Mount Washington", - "Woodbend Group", + "Winnipegosis Formation", + "Winterburn Group", + "Wood Mountain and Mount Washington Aquifer", + "Wood Mountain Formation", "Woodbridge Aquifer", "Yonge Street Aquifer", - "York Till" + "York Till", + "Zama Member" ], - "maxLength": 46 + "maxLength": 69 } \ No newline at end of file diff --git a/schemas/data/src/values/AquiferUnitName.primary.json b/schemas/data/src/values/AquiferUnitName.primary.json index 41bca1f8..2f892422 100644 --- a/schemas/data/src/values/AquiferUnitName.primary.json +++ b/schemas/data/src/values/AquiferUnitName.primary.json @@ -4,45 +4,56 @@ "description": "", "type": "string", "enum": [ - "Abitibi Dykes", + "111 Mile Creek Valley Aquifer System", + "1WS Member", + "2WS Member", + "Abbotsford Shallow Aquifer", + "Abbotsford Shallow West Aquifer", "Alberta Group", + "Aldergrove Shallow Aquifer", "Algonquin Aquifer Complex", "Algonquin Basin", "Algonquin Shoreline", + "Alice Siding Aquifer", "Alliston Aquifer Complex", + "Alluvial and glaciofluvial sand and gravel", "Alviston-Rutherford Aquifer", "Amabel-Lockport-Guelph Hydrogeologic Unit", "Amherstburge Aquifer", - "Amos Group", "Ancaster-West Flamborough Aquifer", "Annapolis-Cornwallis valleys Aquifer", - "Ardkenneth Member", + "Anten Coquina Member", + "Arras-Fellers Heights Bedrock Aquifer", + "Arrowwood Formation", "Arthur-Mount Forest Aquifer", "Assiniboine delta Aquifer", "Atha Aquifer", "Ausable Aquifer", - "Baby Group", + "Bad Heart Formation", "Balfron Formation", "Banff Formation", + "Barons Sand Formation", "Basal Aquifer", - "basal clastic unit (Winnipeg) Aquifer", + "Basal clastic unit (Winnipeg) Aquifer", + "Basal Cretaceous Sandstone", "Bass Island Hydrogeologic Unit", - "Batholith of Guyenne", - "Batholith of La Corne", "Battle Formation", - "Battleford Formation Stratified Deposits", + "Battleford Formation", + "Beach Ridge sand and gravel", "Bearpaw Formation", - "Bearpaw Sand Members Aquifer", - "Beaverville Lake Group", - "Bellefeuille River Pluton", + "Beaver Creek Overburden Aquifer", + "Belle Fourche Formation", "Belly River Formation", "Belly River Group", - "Bernetz Intrusion", - "Berry Pluto", "Beverly-Onoway channel Complex", "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "Blackstone Formation", + "Blewett Bedrock Aquifer", "Blood Reserve Formation", "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "Blueberry Valley Aquifer System", + "Blueberry-Aitken Bedrock Aquifer", + "Bluesky Formation", "Bois Blanc Hydrogeologic Unit", "Boissevain Formation", "Bonnyville U1 Sand", @@ -52,28 +63,39 @@ "Bothwell Aquifer", "Bounded Channel Aquifers", "Bourget Aquifer", - "Bourlamaque Batholith", "Bow Island Formation", - "Bredenbury Aquifer", + "Bradley Creek Valley Aquifer System", + "Brazeau Formation", + "Bredenbury & Wynyard Formations", + "Bridge Lake Aquifer System", + "Brilliant Bedrock Aquifer", "Bronson Lake", "Brownsville Local Aquifer", + "Buried valley containing sand and gravel", "Buried valley/blanket Aquifers", - "Calamité River Pluton", + "Cadomin Formation", + "Cadotte Formation", "Caledon-Grand River Outwash Aquifer", "Calgary Lethbridge Corridor HSU C Aquitard", "Calgary Lethbridge Corridor HSU S1 Aquifer", "Calgary Lethbridge Corridor HSU S2 Aquifer", - "Camac Formation", + "Canadian Shield", "Canning Aquitard", "Canning Till Aquitard", + "Cantuar Formation", + "Canyon Overburden Aquifer", + "Carbon Member", "Carbonate rock Aquifer", "Carboniferous basin Aquifer", "Cardium Formation", - "Caste Formation", + "Carlile Formation", + "Casino Overburden Aquifer", + "Castlegar Overburden Aquifer", "Cataract Group Hydrogeologic Unit", "Catfish Creek Aquifer", "Cedar Grove Aquifer", "Central Catfish Creek Aquifer", + "Central Halfway-Beatton Bedrock Aquifer", "Central South Nation Aquifer Complex", "Champlain Aquifer", "Channel Aquifer 1", @@ -81,151 +103,202 @@ "Channel Aquifer 3", "Channel Aquitard 1", "Channel Aquitard 2", + "Charlie Halfway Beatton Bedrock Aquifer", "Chateauguay Aquifer", "Chauidiere Aquifer", "Chesley Aquifer", - "Chicobi Group", + "Chinchaga Formation", "Chu Íntthi Aquifer", + "Chungo Member", "Clarence Creek Aquifer", - "Clearwater Formation", - "Clermont-Disson Formation", + "Clayton Heights Aquifer", + "Clayton Uplands Aquifer", + "Clinton Creek Bedrock Aquifer", + "Clinton Creek Lower Unconsolidated Aquifer", + "Clinton Creek Upper Sand and Gravel Aquifer", "Clinton Group Hydrogeologic Unit", - "Cobble Hill Aquifer", + "Coalspur Formation", + "Cold Lake Formation", "Coldstream Aquifer", - "Colombourg Batholith", "Colorado Group", + "Connelly Creek Formation", "Contact Aquifer", - "Cooking Lake sediments", + "Contact Rapids Formation", + "Cooking Lake area sediments", + "Cooking Lake Formation", "Credit River Aquifer", + "Creston-Kootenay River Overburden Aquifer", + "Cridland Creek Bedrock Aquifer", "Crowsnest River Alluvial Aquifer", - "Cruikshank Member", - "Cruikshank-Thelma Member", "Cumberland Group", "Cypress Hills Formation", - "Dalmeny Aquifer", - "Decelles Reservoir Batholith", - "Deguisier Formation", - "Del Bonita Gravels", - "Demaine Member", + "Dalehurst Member", + "Dawson Creek Overburden Aquifer", + "Del Bonita Formation", "Detroit River Group Hydrogeologic Unit", + "Devonian Strata", + "Dinosaur Park Formation", + "Doe Creek Member", + "Doig Formation", "Don Formation", - "Drumheller channel Complex", - "Dubuisson Formation", + "Dowling Member", + "Drumheller Channel Complex", + "Drumheller Member", + "Drywood Creek Formation", "Dundalk Aquifer", "Dundee Hydrogeologic Unit", + "Dundurn Formation", "Dunvegan Formation", - "Duparquet Formation", "Durham Aquifer", + "Duvernay Formation", "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", "East and Middle Sixteen Mile Aquifer", + "East Creston Bedrock Aquifer", + "East Pine Bedrock Aquifer", + "East Pine-Groundbirch Bedrock Aquifer", "Eastend Formation", - "Eastend-Cypress Hills Aquifer", "Eastend-Ravenscrag Aquifer", - "Eastend-Wood Member Aquifer", "Edson burried-valley Aquifer", "Egmond Bay Formation", "Elgin-Southampton Aquifer", - "Elk Point Group", + "Ellerslie Member", + "Ellis Group", "Empress Formation", - "Empress Group Aquifers", + "Empress Formation-Uplands glacial", + "Empress Formation-Valley fill glacial", + "Empress Formation-Valley fill glacial Tertiary Undifferentiated", + "Empress Formation-Valley fill Tertiary", "Erie Interstadial Deposits", + "Ernestina Lake Formation", + "Esker and gravel", + "Estend Formation", "Ethel Lake Formation", "Etobicoke Aquifer", - "Fielding Aquifer", - "Figuery Group", - "Flavrian Pluto", + "Exshaw Formation", + "Eyot Formation", + "Farrel Creek Bedrock Aquifer", + "Fernie Formation", + "First White Specks Formation", + "Fish Scales Formation", + "Fish Scales Member", "Flesherton Aquifer", - "Floral Sands and Gravels", + "Floral Formation", "Fontfill Aquifer Complex", "Foremost Formation", - "Forestry Farm Aquifer", - "Fort St. John Group", + "Fort Nelson-River Alluvial Aquifer", + "Fort Simpson Formation", + "Fort St. John Overburden Aquifer System", + "Fort Vermilion Formation", "Fourchu Group", - "Fractured Aquifers - Gulf Islands", - "Fraser Canyon", + "Fractured Aquifers-Gulf Islands", + "Fraser Canyon Aquifer, Choate to Yale", + "Fraser Canyon Aquifer, from Yale to Haig", "Fraser Lowlands Aquifer", - "Fraser Plateau Lava", + "Fraser Plateau Lava Aquifer", "Frenchman Formation", - "Frenchman Whitemud Eastend Formation", + "Frenchman to Eastend Undifferentiated", "Fulford Aquifer", "Fundy Group", - "Ganges Harbour", + "Ganges Harbour Aquifer", "Georgeville Group", - "Gibsons/SCRD Granthams Landing/Elphinstone", + "Gething Formation", + "Gibsons/SCRD Granthams Landing/Elphinstone Aquifer", "Glaciolacustrine Aquifer Complex", + "Glade Overburden Aquifer", + "Glauconitic Sandstone Formation", "Glemmore Basal Aquifer", - "Gleneden", - "Granada Formation", + "Gleneden Aquifer", "Grand Centre Formation", - "Grand Forks", + "Grand Forks Aquifer", "Grand Rapids Formation", "Grand River Aquifer", "Grand River Basin Aquifer", "Grand River Outwash Deposits", "Grand River Valley Basinal Deposits", - "Grant Hill", + "Grandview Aquifer", + "Grant Hill Aquifer", "Greater Kelowna Aquifer", "Greatlakean Stade Deposits", "Green River Aquifer", - "Greendale Deep", + "Greendale Deep Aquifer", + "Greenwood", "Greenwood Aquifer", "Grimshaw Gravels Aquifer", - "Guichon Creek", - "Haans Creek to Blain Creek - Haida Gwaii", + "Grosmont Formation", + "Groundbirch Buried Valley Aquifer", + "Grumbler Group", + "Guichon Creek Aquifer", + "Haans Creek to Blain Creek-Haida Gwaii Aquifer", "Hagan Aquifer", - "Haida/Lawnhill", - "Haig", + "Haida/Lawnhill Aquifer", + "Haig Aquifer", + "Halfway Valley Aquifer System", "Halton Till", + "Halverson Ridge Formation", "Hamilton Group Hydrogeologic Unit", "Hand Hills Formation", "Hanover Aquifer", + "Hanson Member", "Harrow Aquifer", - "Hatzic Prairie", - "Hay River Formation", + "Hatzic Prairie Aquifer", + "Haultain Formation", + "Haven Member", "Haynes Aquifer", - "Heather Bank", - "Hebecourt Formation", - "Heva Formation", + "Haynes Member", + "Hazelmere Aquifer", + "Hazelmere Valley Aquifer", + "Heather Bank Aquifer", "Hillsborough Formation", + "Hillsborough River Formation", "Hockley Valley Aquifer", "Holstein Aquifer", "Holt Aquifer Complex", - "Hopington AB", - "Hopington C", + "Hopington AB Aquifer", + "Hopington C Aquifer", "Horseshoe Canyon Formation", + "Horsethief Member", "Horton Group", - "Houston Bedrock", - "Hullcar Aquifer", - "Interglacial Aquifers", - "Joeyaska Deep", - "Joeyaska Shallow", + "Houston Bedrock Aquifer", + "Hullcar Confined Aquifer", + "Hullcar Perched", + "Hullcar Unconfined Aquifer", + "Ireton Formation", + "Ishbel Group", + "Joeyaska Deep Aquifer", + "Joeyaska Shallow Aquifer", + "Joli Fou Formation", "Judith River Aquifer", + "Judith River/Belly River Formation", + "Jumping Pound SST Member", + "Jurassic Formations", "Kame Outwash Aquifer Complex", - "Karmutsen", - "Kawkawa Lake", - "Keating", + "Karmutsen Aquifer", + "Kaskapau Formation", + "Kawkawa Lake Aquifer", + "Keating Aquifer", + "Keg River Formation", "Kettle Point Hydrogeologic Unit", "Kildare Formation", - "Kingsvale", - "Kipawa Formation", + "Kingsvale Aquifer", + "Kiskatinaw Buried Channel Aquifer", + "Kiskatinaw Glaciodeltaic Overburden Aquifer", + "Kitchener Creek Overburden Aquifer", "Kleinburg Aquifer", - "Koksilah River Valley", - "Kwinshatin Intertill", - "La Morandiere Group", - "La Motte Batholith", - "La Motte-Vassan Formation", + "Koksilah River Valley Aquifer", + "Kwinshatin Intertill Aquifer", + "La Glace Sandstone Member", + "La Loche Formation AND Basal Red Beds Unit", "Lacombe Aquitard", - "Lake Abitibi-Okikodesik Batholith", + "Lacombe Member", "Lake Algonquin Sand Aquifer", - "Lake Arthur Group", "Lake Peel Deltaic Aquifer", "Lake Schomberg and Algonquin Aquifer", "Lake Schomberg and Algonquin Aquitard", "Lancaster-Cornwall Aquifer", - "Landrienne Formation", - "Langdale/Hopkins", - "Langdale/Hopkins Landing", - "Langley Upland", + "Langdale/Hopkins Aquifer", + "Langdale/Hopkins Landing Aquifer", + "Langley Upland Aquifer", + "Langley Upland Intertill Aquifer", "LD Basal Till", "LD Local Aquifers", "LD Lower Aquifer", @@ -233,351 +306,474 @@ "LD Upper Till", "Lea Park Formation", "Leamington Aquifer", + "Leduc Formation", + "Lenses of sand and gravel", "Lincoln Aquifer", - "Little Qualicum River", + "Little Qualicum River Aquifer", "Local Aquifer 2", "Local Aquitard 1", - "Lookout Ridge", - "Lorrain Formation", + "Lookout Ridge Aquifer", "Łots'an Aquifer", - "Lower Bousquet Formation", + "Lower Bearpaw Formation", + "Lower Belly River Formation", + "Lower Brazeau Member", + "Lower Bridge Creek Valley Aquifer System", + "Lower Bridge Creek Valley Bedrock Aquifer", "Lower Brougham Aquifer", - "Lower Cassidy", + "Lower Cassidy Aquifer", "Lower Catfish Creek Till Aquitard", - "Lower Cherryville", + "Lower Cherryville Aquifer", "Lower Chinguacousy Aquifer", - "Lower Coquihalla Canyon", - "Lower Cowichan River A", - "Lower Cowichan River C", - "Lower Dundurn Formation Stratified Deposits", + "Lower Coalspur Member", + "Lower Coquihalla Canyon Aquifer", + "Lower Cowichan River A Aquifer", + "Lower Cowichan River C Aquifer", "Lower Erie Phase Aquifer", "Lower Erie Phase Aquitard", - "Lower Floral Formation Stratified Deposits", - "Lower Gates River", + "Lower Gates River Aquifer", + "Lower Lac la Hache Valley Bedrock Aquifer", + "Lower Lea Park Formation", + "Lower Loon River Formation", + "Lower Lotsberg Formation", "Lower Markham Aquifer", "Lower Maryhill Till", - "Lower Merritt", - "Lower Nechako River", - "Lower Nicola", - "Lower Nicola Outwash", - "Lower Shuswap Deep Aquifer", - "Lower Shuswap River Aquifer", + "Lower Merritt Aquifer", + "Lower Montney Formation", + "Lower Nechako River Aquifer", + "Lower Nicola Aquifer", + "Lower Nicola Outwash Aquifer", + "Lower Ordovician OR Cambrian Strata", + "Lower Scollard Member", + "Lower Shaftesbury Formation", + "Lower Shuswap Deep Confined", + "Lower Shuswap River Confined", "Lower Thorncliffe Aquifer", "Lower Thorncliffe Aquitard", "Lower Unionville Aquifer", "Lower Victoria Aquifer", + "Lower Wapiti Member", + "Lower Willow Creek Member", "Lowland Aquifer Complex", - "Lumby - Lower Aquifer", - "Lumby - Upper Aquifer", + "Lumby-Lower Aquifer", + "Lumby-Upper Aquifer", + "Lundbreck Formation", "Mabou Group", "Mackinaw Interstadial Deposits", - "Malahat Ridge", - "Malcolm Island", - "Mannvile Group", + "Majeau Lake Formation", + "Major buried sand and gravel", + "Malahat Ridge Aquifer", + "Malcolm Island Aquifer", + "Mannville Group", "Maple Aquifer", - "Mara Aquifer", - "Marble Hill Unconsolidated", + "Mara Aquifer Aquifer", + "Marble Hill Unconsolidated Aquifer", "Marie Creek Formation", "Markdale Aquifer", - "Masset", - "Matachewan Dyke Swarm", - "Matador Member", - "Mauricie Aquifer", - "McDougall Creek Deltaic", - "McMillan Island", + "Marshybank Formation", + "Marshybank Member", + "Masset Aquifer", + "McDougall Creek Deltaic Aquifer", + "McMillan Island Aquifer", "McMurray Formation", "Meaford Aquifer", + "Medicine Hat Formation", + "Medicine Hat Member", "Meguma SuperGroup", "Meltwater Channel Hydrogeologic Unit", - "Mennon Formation Stratified Deposits", - "Mennon Sand", + "Mennon Formation", "Middle Erie Phase Aquifer", "Middle Maryhill Till", - "Middle Merritt", + "Middle Merritt Aquifer", + "Middle Montney Formation", + "Middle Red Beds Formation", "Middle Thorncliffe Aquifer", "Middle Thorncliffe Aquitard", "Middle Waterloo Moraine Aquifer & Equivalents", "Milk River Aquifer", - "Mill Bay", - "Mine Hunter Group", + "Milk River Formation", + "Mill Bay Aquifer", "Minesing Basin Transgressive Deposits", "Mirabel Aquifer", "Mission Creek Aquifer", - "Mont-Brun Formation", - "Montney Hydrostratigraphic Unit", + "Monteith Formation", + "Montney Halfway Beatton Bedrock Aquifer", + "Montney Turbidite", + "Montrose Bedrock Aquifer", "Morien Group", + "Morrin Member", "Mount Albert Aquifer Complex", - "Mount Ozzard Aquifer", - "Mount Tom Aquifer", + "Mount Ozzard Bedrock West Aquifer", + "Mount Ozzard, Bedrock Southeast", + "Mount Ozzard, Unconsolidated", + "Mount Tom Bedrock", + "Mount Tom Bedrock Aquifer", + "Mount Tom Unconsolidated", "Muriel Lake", - "Nanaimo Group, Campbell River to Courtney", + "Murrayville AC Aquifer", + "Murrayville B Aquifer", + "Muskeg Formation", + "Muskeg Lower Anhydrite Member", + "Muskiki Formation", + "Muskiki Formation OR Kaskapau Formation", + "Muskiki Member", + "Muskwa Formation", + "Muskwa River Alluvial Aquifer", + "Muskwa-Fort Nelson Buried Valley Aquifer", + "Muskwa-Fort Nelson Glaciofluvial Aquifer", + "Nanaimo Group Aquifer, Campbell River to Courtney", "Nanaimo Lowlands Aquifer", - "Nechako Buried Valley", + "NE of White Rock A Aquifer", + "NE of White Rock B Aquifer", + "Nechako Buried Valley Aquifer", + "Nelson Overburden Aquifer", "Newmarket Till", + "Newton Upland Aquifer", "Niagra-on-the-Lake Aquifer", - "Nicomekl-Serpentine", - "Nicomen Slough", + "Nicomekl-Serpentine Aquifer", + "Nicomen Slough Aquifer", + "Nikanassin Formation", + "Niobrara Formation", "Nissouri Stadial Deposits", - "Nivek", + "Nivek Aquifer", + "Nomad Member", "Norfolk Sand Plain Aquifer", - "North Campbell River Aquifer", - "North Central Saanich", - "North Hope", - "North Houston Aquifer", + "Norns Creek Overburden Aquifer", + "North Campbell River Bedrock", + "North Campbell River Unconsolidated", + "North Castlegar Bedrock Aquifer", + "North Central Saanich Aquifer", + "North Hope Aquifer", + "North Houston Bedrock", "North Mountain Formation", - "North Nechako Terrace", - "North Salt Spring Island", - "North-Central Salt Spring Island", + "North Nechako Terrace Bedrock Aquifer", + "North Salt Spring Island Aquifer", + "North-Central Salt Spring Island Aquifer", + "Northern Halfway Beatton Bedrock Aquifer", + "Northern Lac la Hache Aquifer System", + "Northwest Halfway-Beatton Bedrock Aquifer", + "Northwest of Clearbrook Aquifer", "Notre Dame Aquifer", "O Avenue Aquifer", - "O'Keefe Aquifer", - "O'Keefe Basal Aquifer", + "O'Keefe Basal", + "O'Keefe Unconfined Aquifer", "Oak Ridges Moraine Aquifer", + "Obed Mountain Formation", "Odanah Member", "Odanah Shale Aquifer", - "Okanagan Landing Deep Aquifer", + "Okanagan Landing Deep Confined", "Okanagan Valley Aquifer", "Oldcastle Aquifer", - "Opasatica Gneiss", + "Oldman Formation", + "Opabin Member", "Orangeville Aquifer Complex", "Orby Head Formation", "Oro Moraine Aquifer Complex", "Oro-Medonte Aquifer", - "Osoyoos West", + "Osoyoos West Aquifer", + "Ostracod Beds Member", "Ottawa Group Hydrogeologic Unit", - "Outlook Member", - "Owl Creek", + "Owl Creek Aquifer", "Owl Ridge Aquifer", - "Oxarart-Cruikshank Members", - "Oyster River", - "Pacheedaht", + "Oyster River Aquifer", + "Pacheedaht Aquifer", + "Paddy Formation", "Pakowki Formation", - "Palmarolle Pluton", + "Paldi-Deep Aquifer", + "Paleozoic Carbonate rock formations, Ordovician to Devonian", "Paris Aquifer", "Paris moraine Aquitard", "Paskapoo Formation", - "Paul's Basin", + "Paskapoo Formation Aquifer", + "Paterson Overburden Aquifer", + "Paul's Basin Aquifer", "Peace River Formation", + "Peace-Valley Aquifer System", + "Pelican Formation", + "Pelican Mountain Formation", + "Pense Formation", "Pickering Aquifer", "Pictou Group", - "Pineview", + "Pike Lake Formation", + "Pineview Aquifer", "Plantagenet Aquifer", - "Pluto of Amos", - "Pluto of Lake Dufault", - "Pluto of Lake Fréchette", - "Pluto of the Lake of Sixteen", - "Pluto of The Queen", - "Pluto of Trécesson", - "Pluto of Val-St-Gilles", - "Pluto of Villemontel", - "Pontiac Group", + "Porcupine Hills Formation", "Porcupine Hills Formation Aquifers", "Port Bruce Phase Aquitard", "Port Bruce Stadial Deposits", - "Port Clements", + "Port Clements Aquifer", "Port Colborne Aquifer", "Port Huron Stadial Deposits", - "Port McNeill East Aquifer", - "Port McNeill East Bedrock", - "Port McNeill West Aquifer", + "Port McNeill East Bedrock Aquifer", + "Port McNeill East Unconsolidated", + "Port McNeill West Bedrock", + "Port McNeill West Unconsolidated", "Portneuf Aquifer", "Pottery Road Formation", - "Poularies Batholith", - "Powell Pluton", - "Powers Ck Deltaic", + "Pouce Coupe Member", + "Pouce Coupe Overburden Aquifer", + "Pouce Creek Bedrock Aquifer", + "Powers Ck Deltaic Aquifer", + "Prairie Evaporite Formation", "Pre-Canning Aquifers", "Pre-Canning Aquitard", "Pre-Catfish Aquifers", "Precambrian Hydrogeologic Unit", - "Preissac Batholith", + "Precambrian rocks", + "Precambrian to Model Base", "Priceville Aquifer", - "Puntledge/ Cumberland", + "Prophet River Alluvial Aquifer", + "Puntledge/ Cumberland Aquifer", + "Puskwaskau Formation", "Puslinch Aquifer", - "Quadra Central", - "Quadra South", + "Quadra Central Bedrock Aquifer", + "Quadra South Bedrock Aquifer", "Queenston Hydrogeologic Unit", - "Quinsam to Stories Beach", + "Quinsam to Stories Beach Aquifer", "Ravenscrag Formation", - "Rawlings Lake", - "Red Deer River channel Complex", + "Ravenscrag to Eastend Undifferentiated", + "Rawlings Lake Aquifer", + "Red Deer River channel complex", "Regional Aquifer 3", "Regional Aquitard 3", - "Remigny Batholith", - "Reneault-Dufresnoy Formation", - "Ribstone Creek Member", - "Richelieu Aquifer", + "Richelieu-Yamaska Aquifer", "Richibucto Formation", "Rideau Front Aquifer", - "Roberts Creek", + "Riding Mountain/Pierre Shale Formation", + "Roberts Creek Aquifer", "Rockcliffe Hydrogeologic Unit", "Rockland Aquifer", - "Rosebery", - "Rouyn-Pelletier Formation", - "Ryder Upland A", - "Ryder Upland B", - "Ryder Upland C", + "Rosebery Aquifer", + "Rundle Group", + "Ryder Upland A Aquifer", + "Ryder Upland B Aquifer", + "Ryder Upland C Aquifer", + "Saint-Maurice Aquifer", "Salina Hydrogeologic Unit", - "Salmon River", - "Salmon River - Lower Aquifer", - "Salmon River - Upper Aquifer", + "Salmo River Bedrock Aquifer", + "Salmo River Overburden Aquifer", + "Salmon River Aquifer", + "Salmon River-Lower Aquifer", + "Salmon River-Upper Aquifer", "Sand Dunes Aquifer", - "Sand River Formation", "Sandilands Aquifer", - "Sandspit - Haida Gwaii", - "Sardis-Vedder", + "Sandspit-Haida Gwaii Aquifer", + "Sardis-Vedder Aquifer", "Sarsfield Aquifer", - "Saskatoon Group Aquifers", + "Sayward-Salmon River Aquifer", "Scarborough Formation", "Schomberg Aquifer Complex", + "Schooler Creek Group", "Scollard Formation", - "Sechelt/Wakefield Creek", - "Seton Portage", - "Shannon Lake", - "Shawnigan Lake", + "Sechelt/Wakefield Creek Aquifer", + "Second White Specks Formation", + "Second White Specks/Favel Formation", + "Sediment Above Bedrock", + "Seton Portage Aquifer", + "Shaftesbury Formation", + "Shannon Lake Aquifer", + "Shawnigan Lake Aquifer", + "Shawnigan Lake/Cobble Hill/Mill Bay Aquifer", + "Sheridan Lake Aquifer", "Shuswap Highlands Aquifer", + "Silurian", "Simcoe Group Hydrogeologic Unit", "Similkameen River Aquifer", - "Sinkut Mountain North Surficial", - "Skidgate/Queen Charlotte", + "Sinkut Mountain North Surficial Aquifer", + "Skidgate/Queen Charlotte Aquifer", + "Slave Point Formation", "Smoky Group", - "Sooke-Metchosin", + "Sooke-Metchosin Aquifer", + "South Castlegar Bedrock Aquifer", "South Central Elgin Aquifer", - "South Fraser Lake", - "South Lake Simard Batholith", + "South Fraser Lake Bedrock Aquifer", + "South Fraser River Delta Aquifer", "South London Aquifer", - "South Nechako Terrace", - "South of Aldergrove", - "South of Hopington", - "South of Murrayville AC", - "South of Murrayville B", - "South Salt Spring Island", - "South Saskatchewan Alluvium", - "South Valemont", - "South Vanderhoof", - "South Vernon Aquifer", - "South-Central Salt Spring Island", - "Spallumcheen Aquifer", - "Spallumcheen Basal Aquifer", - "Spences Bridge", - "Sperling", - "Spius Creek West of Canford", + "South Nation Aquifer", + "South Nechako Terrace Bedrock Aquifer", + "South of Aldergrove Aquifer", + "South of Hopington Aquifer", + "South of Murrayville AC Aquifer", + "South of Murrayville B Aquifer", + "South Quadra Unconsolidated Aquifer", + "South Salt Spring Island Aquifer", + "South Valemont Aquifer", + "South Vanderhoof Unconsolidated Aquifer", + "South Vernon Confined Aquifer", + "South Vernon Unconfined Aquifer", + "South-Central Salt Spring Island Aquifer", + "Southern Horse Lake Aquifer System Aquifer", + "Spallumcheen Basal Confined Aquifer", + "Spallumcheen Confined", + "Spallumcheen Unconfined Aquifer", + "Spences Bridge Aquifer", + "Sperling Aquifer", + "Spirit River Formation", + "Spius Creek West of Canford Aquifer", "St. Catharines Aquifer", "St. George Aquifers", + "St. Martin Aquifer", "St. Mary River Formation", + "St. Mathieu Aquifer", "St. Thomas Moraine Local Aquifers", "Stavely Aquifer", - "Stellako", + "Stellako Unconsolidated Aquifer", "Stirling Group", - "Stoughton-Roquemaure Group", - "Stumbles Creek", + "Stoddart Group", + "Strathmore Member", "Stumbles Creek Aquifer", - "Stump Lake Aquifer", - "Sugar Lake", - "Sumas Prairie", - "Sumas Prairie North", + "Stumbles Creek Confined", + "Stump Lake", + "Stump Lake Bedrock", + "Sugar Lake Aquifer", + "Sulphur Point Formation", + "Sumas Prairie Aquifer", + "Sumas Prairie North Aquifer", "Sunchild Aquifer", - "Sunnybrae", + "Sunkay Formation", + "Sunningdale/Glenmerry Bedrock Aquifer", + "Sunnybrae Aquifer", "Sunnybrook Drift", - "Surficial stratified drift Aquifers", - "Sutherland Group Aquifers", - "Swan Lake Aquifer", + "Sunset Creek Overburden Aquifer", + "Sunset Prairie Bedrock Aquifer", + "Swan Hills Formation", + "Swan Lake Confined Aquifer", + "Swan Lake Unconfined", "Swan River Formation", - "Tachick Lake", - "Tappen", - "Taschereau Batholith", - "Tathlina Formation", - "Tessier Aquifer", + "Sweetwater Bedrock Aquifer", + "Tachick Lake Unconsolidated Aquifer", + "Talik regions", + "Tappen Aquifer", + "Thick and extensive unconfined sand and gravel", + "Thin unconfined sand", + "Thistle Member", "Thornbury Aquifer", "Thorncliffe Formation", "Thornill Aquifer", "Thornton Sand Aquifer", "Tillsonburg Aquifer", - "Timiskaming Group", - "Tlell", - "Topley", - "Trinity Valley", - "Tsolum River, North of Courtney", - "Tuhok Aquifer", + "Tlell Aquifer", + "Tolman Member", + "Topley Bedrock Aquifer", + "Trail Townsite Overburden Aquifer", + "Trail/Warfield Bedrock Aquifer", + "Trinity Valley Aquifer", + "Tsawwassen Aquifer", + "Tsolum River, North of Courtney Aquifer", + "Tuhok Confined Aquifer", + "Tuhok Unconfined Aquifer", "Turtle Mountain Formation", - "Twin Falls Formation", "Two Creeks Interstadial Deposits", "Tyconnell Formation", - "Tyner Valley Aquifer", - "Ucluelet Peninsula", - "Ucluelet, Lost Show", - "Undivided Cumberland Group", - "Undivided Pictou Group", - "Unicola", + "Ucluelet Peninsula Aquifer", + "Ucluelet, Lost Shoe Aquifer", + "Ucluelet, Lost Show Aquifer", + "Unicola Aquifer", + "Unit A Exposed Bedrock and Drift-Poor Areas", + "Unit B Till and Ribbed Moraine Deposits", + "Unit C Ablation Drift Deposits", + "Unit D Glaciomarine and Marine Deposits and Glaciolacustrine Deposits", + "Unit E Glaciofluvial Deposits", "Upland Aquifer Complex", - "Upland Gravel", "Upper and Lower Gloucester Aquifers", "Upper and Lower Nepean-Kemptville Aquifers", "Upper and Lower West Nepean Aquifers", "Upper Aquifer 1", - "Upper Bousquet Formation", + "Upper Bearpaw Formation", + "Upper Brazeau Member", + "Upper Bridge Creek Bedrock Aquifer", + "Upper Bridge Creek Valley Aquifer System", "Upper Brougham Aquifer", - "Upper Bulkley Alluvial", + "Upper Bulkley Alluvial Aquifer", "Upper Catfish Creek Till Aquitard", - "Upper Cherryville", + "Upper Cherryville Aquifer", "Upper Chinguacousy Aquifer", + "Upper Coalspur Member", "Upper Cretaceous sands Aquifer", - "Upper Dundurn Formation Stratified Deposits", "Upper Erie Phase Aquifer", "Upper Erie Phase Aquitard", - "Upper Floral Formation Stratified Deposits", - "Upper Gates River", + "Upper Gates River Aquifer", + "Upper Halfway Bedrock Aquifer", + "Upper Lac la Hache Valley Bedrock Aquifer", "Upper Lea Park Formation", + "Upper Loon Formation", + "Upper Lotsberg Formation", "Upper Markham Aquifer", "Upper Maryhill Till", - "Upper Merritt", + "Upper Merritt Aquifer", + "Upper Montney Formation", + "Upper Ordovician strata", + "Upper Scollard Member", + "Upper Shaftesbury Formation", "Upper Thames Aquifer", "Upper Thorncliffe Aquifer", "Upper Thorncliffe Aquitard", "Upper Unionville Aquifer", "Upper Victoria Aquifer", + "Upper Wapiti Member", "Upper Waterloo Moraine Aquifer", - "Val d'Or Formation", + "Upper Willow Creek Member", "Valens Outwash Aquifer", - "Vanderhoof Alluvial", - "Vedder Crossing", - "Vedder Mountain NW", - "Vedder Mountain SE", + "Valley View-Dawson Creek Bedrock Aquifer", + "Vanderhoof Alluvial Aquifer", + "Vedder Crossing Aquifer", + "Vedder Mountain NW Bedrock Aquifer", + "Vedder Mountain SE Bedrock Aquifer", "Vellore Aquifer", - "Vernon Aquifer", + "Verger Member", + "Vermillion River Formation", + "Vernon Confined", + "Vernon Unconfined", "Viking Formation", - "Wabamun Formation", + "Viking/Newcastle Formation", + "Vimy Member", + "Wabamun Group", + "Wabiskaw Member", "Wainfleet Aquifer", - "Walker Hook", + "Walker Hook Aquifer", "Walkerton Aquifer", "Wallaceburg Aquifer", "Wallacetown Formation", + "Wapiabi Formation", "Wapiti Formation", - "Wark-Colquitz", - "Warman Formation Stratified Deposits", + "Wark-Colquitz Aquifer", + "Warman Formation", "Waterloo Moraine Aquifer", + "Waterways Formation", + "Watson Creek Valley Aquifer System", + "Watt Mountain Formation", "Wentworth Aquifer", "Wentworth Till/Aquitard", + "West Arrow Creek Overburden Aquifer", "West Carlton Aquifer", - "West Cluculz Lake", - "West Langley", - "West of Aldergrove", - "West of Merritt", - "West Saanich Road", - "West Sechelt", - "Westwold", + "West Cluculz Lake Bedrock Aquifer", + "West Creston Aquifer", + "West Langley Aquifer", + "West of Aldergrove Aquifer", + "West of Merritt Aquifer", + "West Saanich Road Aquifer", + "West Sechelt Aquifer", + "Westgate Formation", + "Westwold Aquifer", + "White Rock Aquifer", + "Whitecourt Mountain Formation", "Whitemud Formation", + "Whitemud Member", "Whittlesey Aquifer", "Whittlesey Clay/Aquitard", "Whittlesey Sand", - "Willow Creek alluvial Aquifer", + "Willow Creek Alluvial Aquifer", + "Willow Creek Formation", "Willow Creek Formation Aquifer", "Windsor Group", "Winnipeg Formation", - "Wood Mountain and Mount Washington", - "Woodbend Group", + "Winnipegosis Formation", + "Winterburn Group", + "Wood Mountain and Mount Washington Aquifer", + "Wood Mountain Formation", "Woodbridge Aquifer", "Yonge Street Aquifer", - "York Till" + "York Till", + "Zama Member" ], - "maxLength": 46 + "maxLength": 69 } \ No newline at end of file diff --git a/schemas/data/src/values/LithologyType.legacy.json b/schemas/data/src/values/LithologyType.legacy.json index 1171e0b8..9aa686ba 100644 --- a/schemas/data/src/values/LithologyType.legacy.json +++ b/schemas/data/src/values/LithologyType.legacy.json @@ -40,6 +40,12 @@ "Humus", "Hydrogeologic", "Igneous rock", + "Interbedded gravel and clay", + "Interbedded gravel and sand", + "Interbedded gravel and silt", + "Interbedded sand and clay", + "Interbedded sand and silt", + "Interbedded silt and clay", "Limestone", "Marble", "Metamorphic rock", diff --git a/schemas/data/src/values/LithologyType.primary.json b/schemas/data/src/values/LithologyType.primary.json index fdedec60..30cc6bcb 100644 --- a/schemas/data/src/values/LithologyType.primary.json +++ b/schemas/data/src/values/LithologyType.primary.json @@ -36,6 +36,12 @@ "Gravely Sediment", "Humus", "Igneous rock", + "Interbedded gravel and clay", + "Interbedded gravel and sand", + "Interbedded gravel and silt", + "Interbedded sand and clay", + "Interbedded sand and silt", + "Interbedded silt and clay", "Limestone", "Marble", "Metamorphic rock", diff --git a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json index ae1cf3d4..33842dcd 100644 --- a/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json +++ b/schemas/data/src/values/MonitoringLocationHorizontalCoordinateReferenceSystem.primary.json @@ -6,6 +6,7 @@ "enum": [ "NAD27", "NAD83", + "OTHER", "UNKWN", "WGS72", "WGS84" diff --git a/schemas/data/src/values/SampleCondition.legacy.json b/schemas/data/src/values/SampleCondition.legacy.json index b85e97dc..690c2f08 100644 --- a/schemas/data/src/values/SampleCondition.legacy.json +++ b/schemas/data/src/values/SampleCondition.legacy.json @@ -6,9 +6,9 @@ "enum": [ "Flowing", "Nearby site is being pumped or pumped recently", - "Static", - "The site has been pumped recently", - "The site is being pumped", + "Static, before pumping or purging", + "The site has been recently pumped or purged", + "The site is being pumped for water use", "Unspecified" ], "maxLength": 46 diff --git a/schemas/data/src/values/SampleCondition.primary.json b/schemas/data/src/values/SampleCondition.primary.json index fe14e394..2b1ffe3c 100644 --- a/schemas/data/src/values/SampleCondition.primary.json +++ b/schemas/data/src/values/SampleCondition.primary.json @@ -6,9 +6,9 @@ "enum": [ "Flowing", "Nearby site is being pumped or pumped recently", - "Static", - "The site has been pumped recently", - "The site is being pumped", + "Static, before pumping or purging", + "The site has been recently pumped or purged", + "The site is being pumped for water use", "Unspecified" ], "maxLength": 46 diff --git a/schemas/data/src/values/WellUseType.legacy.json b/schemas/data/src/values/WellUseType.legacy.json index f6c4fe6e..a72376ab 100644 --- a/schemas/data/src/values/WellUseType.legacy.json +++ b/schemas/data/src/values/WellUseType.legacy.json @@ -10,6 +10,7 @@ "Capture", "Commercial", "Dewater", + "Dewatering", "Domestic", "Drainage", "Geothermal", diff --git a/schemas/data/src/values/WellUseType.primary.json b/schemas/data/src/values/WellUseType.primary.json index 8d472ed7..cef97386 100644 --- a/schemas/data/src/values/WellUseType.primary.json +++ b/schemas/data/src/values/WellUseType.primary.json @@ -6,6 +6,10 @@ "enum": [ "Aquaculture", "Bottling", + "Dewatering", + "Domestic", + "Geothermal", + "Industrial", "Irrigation", "Livestock", "Monitoring - Ambient", diff --git a/schemas/data/test/format.js b/schemas/data/test/format.js index 9b2da3e8..2e4b31c7 100644 --- a/schemas/data/test/format.js +++ b/schemas/data/test/format.js @@ -45,6 +45,8 @@ const checkProperty = (errors, keyword, property) => { error.instancePath.includes(property) ) { return true; + } else if (keyword === "maxLength" && error.instancePath.includes(property)) { + return true; } else if (keyword === "pattern") return true; } return false; @@ -581,3 +583,95 @@ test("Should reject CSV Injection check when leading null char", async (t) => { }); assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); }); + +// *** Range constraints — GW measure fields *** // +test("Should reject BoreholeDepthMeasure > 0", async (t) => { + validate({ BoreholeDepthMeasure: 1, BoreholeDepthUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "BoreholeDepthMeasure"), true); +}); +test("Should accept BoreholeDepthMeasure <= 0", async (t) => { + validate({ BoreholeDepthMeasure: -10, BoreholeDepthUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "BoreholeDepthMeasure"), false); +}); + +test("Should reject WellDepthMeasure > 0", async (t) => { + validate({ WellDepthMeasure: 1, WellDepthUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellDepthMeasure"), true); +}); +test("Should accept WellDepthMeasure <= 0", async (t) => { + validate({ WellDepthMeasure: -10, WellDepthUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellDepthMeasure"), false); +}); + +test("Should reject WellOpenIntervalTopMeasure > 0", async (t) => { + validate({ WellOpenIntervalTopMeasure: 1, WellOpenIntervalTopUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalTopMeasure"), true); +}); +test("Should accept WellOpenIntervalTopMeasure <= 0", async (t) => { + validate({ WellOpenIntervalTopMeasure: -5, WellOpenIntervalTopUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalTopMeasure"), false); +}); + +test("Should reject WellOpenIntervalBottomMeasure > 0", async (t) => { + validate({ WellOpenIntervalBottomMeasure: 1, WellOpenIntervalBottomUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalBottomMeasure"), true); +}); +test("Should accept WellOpenIntervalBottomMeasure <= 0", async (t) => { + validate({ WellOpenIntervalBottomMeasure: -10, WellOpenIntervalBottomUnit: "m" }); + assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalBottomMeasure"), false); +}); + +test("Should reject MonitoringLocationVerticalAccuracyMeasure < 0", async (t) => { + validate({ MonitoringLocationVerticalAccuracyMeasure: -1, MonitoringLocationVerticalAccuracyUnit: "m" }); + assert.equal(checkProperty(validate.errors, "minimum", "MonitoringLocationVerticalAccuracyMeasure"), true); +}); +test("Should accept MonitoringLocationVerticalAccuracyMeasure >= 0", async (t) => { + validate({ MonitoringLocationVerticalAccuracyMeasure: 5, MonitoringLocationVerticalAccuracyUnit: "m" }); + assert.equal(checkProperty(validate.errors, "minimum", "MonitoringLocationVerticalAccuracyMeasure"), false); +}); + +test("Should reject ActivityDepthAltitudeReferencePointMeasure < 0", async (t) => { + validate({ ActivityDepthAltitudeReferencePointMeasure: -1, ActivityDepthAltitudeReferencePointUnit: "m" }); + assert.equal(checkProperty(validate.errors, "minimum", "ActivityDepthAltitudeReferencePointMeasure"), true); +}); +test("Should accept ActivityDepthAltitudeReferencePointMeasure >= 0", async (t) => { + validate({ ActivityDepthAltitudeReferencePointMeasure: 5, ActivityDepthAltitudeReferencePointUnit: "m" }); + assert.equal(checkProperty(validate.errors, "minimum", "ActivityDepthAltitudeReferencePointMeasure"), false); +}); + +// *** Length constraints — GW text fields *** // +test("Should reject AquiferCode > 10 chars", async (t) => { + validate({ AquiferCode: "12345678901" }); + assert.equal(checkProperty(validate.errors, "maxLength", "AquiferCode"), true); +}); +test("Should accept AquiferCode <= 10 chars", async (t) => { + validate({ AquiferCode: "1234567890" }); + assert.equal(checkProperty(validate.errors, "maxLength", "AquiferCode"), false); +}); + +test("Should reject WellID > 55 chars", async (t) => { + validate({ WellID: "x".repeat(56) }); + assert.equal(checkProperty(validate.errors, "maxLength", "WellID"), true); +}); +test("Should accept WellID <= 55 chars", async (t) => { + validate({ WellID: "x".repeat(55) }); + assert.equal(checkProperty(validate.errors, "maxLength", "WellID"), false); +}); + +test("Should reject SampleCollectionMethodName > 300 chars", async (t) => { + validate({ SampleCollectionMethodName: "x".repeat(301) }); + assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodName"), true); +}); +test("Should accept SampleCollectionMethodName <= 300 chars", async (t) => { + validate({ SampleCollectionMethodName: "x".repeat(300) }); + assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodName"), false); +}); + +test("Should reject SampleCollectionMethodID > 50 chars", async (t) => { + validate({ SampleCollectionMethodID: "x".repeat(51) }); + assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodID"), true); +}); +test("Should accept SampleCollectionMethodID <= 50 chars", async (t) => { + validate({ SampleCollectionMethodID: "x".repeat(50) }); + assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodID"), false); +}); diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 74c24644..d6d68ac4 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -27,7 +27,7 @@ const checkProperty = (errors, keyword, property) => { error.params.passingSchemas.includes(property) ) { return true; - } else if (keyword === "anyOf") return true; + } else if (keyword === "anyOf") return true; // anyOf branches surface as nested `required` errors inside errorMessage; query those directly via keyword="required" for property-specific assertions. else if (keyword === "not" && error.instancePath.includes(property)) { return true; } else if (keyword === "enum" && error.instancePath.includes(property)) { @@ -985,6 +985,59 @@ test("Should accept Water level CharacteristicName with ActivityDepthAltitudeRef ); }); +// *** ActivityMediaName-Groundwater-DepthMeasure *** // +test("Should reject Groundwater ActivityMediaName without any depth measure", async (t) => { + const valid = validate({ + ActivityMediaName: "Groundwater", + MonitoringLocationType: "Well", + WellUseType: "Domestic", + }); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), true); + assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), true); + assert.equal(checkProperty(validate.errors, "required", "WellOpenIntervalTopMeasure"), true); + assert.equal(checkProperty(validate.errors, "required", "WellOpenIntervalBottomMeasure"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), true); +}); + +test("Should accept Groundwater ActivityMediaName with WellDepthMeasure", async (t) => { + const valid = validate({ + ActivityMediaName: "Groundwater", + MonitoringLocationType: "Well", + WellUseType: "Domestic", + WellDepthMeasure: -10, + WellDepthUnit: "m", + }); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), false); + assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); +}); + +test("Should accept Groundwater ActivityMediaName with ActivityDepthHeightMeasure", async (t) => { + const valid = validate({ + ActivityMediaName: "Groundwater", + MonitoringLocationType: "Well", + WellUseType: "Domestic", + ActivityDepthHeightMeasure: -5, + ActivityDepthHeightUnit: "m", + ActivityDepthAltitudeReferencePoint: "Ground surface", + }); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), false); + assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); +}); + +test("Should accept non-GW ActivityMediaName without any depth measure", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + }); + assert.equal(valid, false); + assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); + assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), false); +}); + // *** one off *** // /*test('one off', async (t) => { const valid = validate({ diff --git a/schemas/data/test/primary.js b/schemas/data/test/primary.js new file mode 100644 index 00000000..2c33bb9a --- /dev/null +++ b/schemas/data/test/primary.js @@ -0,0 +1,161 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import primary from "../primary/index.json" with { type: "json" }; +import frontend from "../frontend/index.json" with { type: "json" }; +import extract from "../extract/index.json" with { type: "json" }; +import backend from "../backend/index.json" with { type: "json" }; +import qualityControl from "../quality-control/index.json" with { type: "json" }; + +const flavours = { primary, frontend, extract, backend, "quality-control": qualityControl }; +const main = primary.allOf[0]; + +// *** $id contract *** // +test("primary $id matches the published URL", () => { + assert.equal(primary.$id, "https://datastream.org/schema/data/primary.json"); +}); + +test("all flavour $ids match their filesystem paths", () => { + for (const [flavour, schema] of Object.entries(flavours)) { + assert.equal( + schema.$id, + `https://datastream.org/schema/data/${flavour}.json`, + `${flavour}/index.json` + ); + } +}); + +// *** structural integrity *** // +test("primary has no unresolved $refs (fully dereferenced bundle)", () => { + assert.equal(JSON.stringify(primary).includes('"$ref":'), false); +}); + +test("primary has no transform keyword (strict, no coercion)", () => { + assert.equal(JSON.stringify(primary).includes('"transform":'), false); +}); + +// *** required fields contract *** // +test("primary required fields match the documented contract", () => { + assert.deepEqual(main.required.sort(), [ + "ActivityMediaName", + "ActivityStartDate", + "ActivityType", + "CharacteristicName", + "DatasetName", + "MonitoringLocationHorizontalCoordinateReferenceSystem", + "MonitoringLocationID", + "MonitoringLocationLatitude", + "MonitoringLocationLongitude", + "MonitoringLocationName", + "MonitoringLocationType", + "ResultValueType", + ]); +}); + +// *** GW field constraints (pinned) *** // +test("AquiferCode is text with maxLength 10", () => { + const f = main.properties.AquiferCode; + assert.equal(f.type, "string"); + assert.equal(f.maxLength, 10); +}); + +test("WellID is text with maxLength 55", () => { + const f = main.properties.WellID; + assert.equal(f.type, "string"); + assert.equal(f.maxLength, 55); +}); + +test("SampleCollectionMethodID has maxLength 50", () => { + assert.equal(main.properties.SampleCollectionMethodID.maxLength, 50); +}); + +test("SampleCollectionMethodName has maxLength 300", () => { + assert.equal(main.properties.SampleCollectionMethodName.maxLength, 300); +}); + +test("BoreholeDepthMeasure has maximum 0", () => { + assert.equal(main.properties.BoreholeDepthMeasure.maximum, 0); +}); + +test("WellDepthMeasure has maximum 0", () => { + assert.equal(main.properties.WellDepthMeasure.maximum, 0); +}); + +test("WellOpenIntervalTopMeasure has maximum 0", () => { + assert.equal(main.properties.WellOpenIntervalTopMeasure.maximum, 0); +}); + +test("WellOpenIntervalBottomMeasure has maximum 0", () => { + assert.equal(main.properties.WellOpenIntervalBottomMeasure.maximum, 0); +}); + +test("MonitoringLocationVerticalAccuracyMeasure has minimum 0", () => { + assert.equal(main.properties.MonitoringLocationVerticalAccuracyMeasure.minimum, 0); +}); + +test("ActivityDepthAltitudeReferencePointMeasure has minimum 0", () => { + assert.equal(main.properties.ActivityDepthAltitudeReferencePointMeasure.minimum, 0); +}); + +// *** non-GW field constraints (pinned) *** // +test("MonitoringLocationLatitude bounded to 0..90 (northern hemisphere)", () => { + const f = main.properties.MonitoringLocationLatitude; + assert.equal(f.minimum, 0); + assert.equal(f.maximum, 90); +}); + +test("MonitoringLocationLongitude bounded to -180..180", () => { + const f = main.properties.MonitoringLocationLongitude; + assert.equal(f.minimum, -180); + assert.equal(f.maximum, 180); +}); + +test("MonitoringLocationHorizontalAccuracyMeasure has minimum 0", () => { + assert.equal(main.properties.MonitoringLocationHorizontalAccuracyMeasure.minimum, 0); +}); + +test("DatasetName has length 1..512", () => { + const f = main.properties.DatasetName; + assert.equal(f.minLength, 1); + assert.equal(f.maxLength, 512); +}); + +test("MonitoringLocationID has length 1..55", () => { + const f = main.properties.MonitoringLocationID; + assert.equal(f.minLength, 1); + assert.equal(f.maxLength, 55); +}); + +test("MonitoringLocationName has length 1..255", () => { + const f = main.properties.MonitoringLocationName; + assert.equal(f.minLength, 1); + assert.equal(f.maxLength, 255); +}); + +test("LaboratoryName has maxLength 100", () => { + assert.equal(main.properties.LaboratoryName.maxLength, 100); +}); + +test("LaboratorySampleID has maxLength 60", () => { + assert.equal(main.properties.LaboratorySampleID.maxLength, 60); +}); + +test("ResultComment has maxLength 4000", () => { + assert.equal(main.properties.ResultComment.maxLength, 4000); +}); + +test("ResultAnalyticalMethodID has maxLength 50", () => { + assert.equal(main.properties.ResultAnalyticalMethodID.maxLength, 50); +}); + +test("ResultAnalyticalMethodName has maxLength 300", () => { + assert.equal(main.properties.ResultAnalyticalMethodName.maxLength, 300); +}); + +// *** cross-flavour consistency *** // +test("primary, frontend, extract, and backend define the same property names", () => { + const pProps = Object.keys(main.properties).sort(); + for (const flavour of ["frontend", "extract", "backend"]) { + const props = Object.keys(flavours[flavour].allOf[0].properties).sort(); + assert.deepEqual(props, pProps, `${flavour} differs from primary`); + } +}); \ No newline at end of file diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index 9f2ba81b..1661acea 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -163,6 +163,26 @@ test('Should accept when ActivityDepthHeightMeasure is not set and when Activity }) assert.equal(valid, true) }) +test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is Groundwater', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + ActivityDepthHeightMeasure: 1, + ActivityDepthHeightUnit: 'm' + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'maximum', 'ActivityDepthHeightMeasure'), + true + ) +}) +test('Should accept ActivityDepthHeightMeasure < 0 when ActivityMediaName is Groundwater', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + ActivityDepthHeightMeasure: -1, + ActivityDepthHeightUnit: 'm' + }) + assert.equal(valid, true) +}) test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is other value', async (t) => { const valid = validate({ diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index 77e8e9d2..2d051f7f 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -2,6 +2,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import validate from '../frontend/index.js' import validateBackend from '../backend/index.js' +import validateExtract from '../extract/index.js' test('Should transform values (frontend)', async (t) => { const valid = validate({ @@ -80,3 +81,179 @@ test('Should transform values (backend)', async (t) => { //console.log(valid, JSON.stringify(validateBackend.errors, null, 2)) assert.equal(valid, true) }) + +// *** cross-flavour fixtures *** // +// Each fixture is run through frontend, extract, and backend validators to +// exercise validation paths that the flavour-specific tests above don't reach. + +const crossFlavourFixtures = [ + { + name: 'Groundwater well field measurement', + data: { + DatasetName: 'GW Test', + MonitoringLocationID: 'GW-01', + MonitoringLocationName: 'Test Well', + MonitoringLocationLatitude: 51.0486, + MonitoringLocationLongitude: -114.0708, + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', + WellDepthMeasure: -10, + WellDepthUnit: 'm', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Groundwater', + ActivityStartDate: '2026-01-15', + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: '-06:00', + SampleCondition: 'Static, before pumping or purging', + CharacteristicName: 'Temperature, water', + ResultValue: 8.2, + ResultUnit: 'deg C', + ResultValueType: 'Actual', + ResultStatusID: 'Validated', + }, + }, + { + name: 'Surface water field measurement', + data: { + DatasetName: 'SW Test', + MonitoringLocationID: 'SW-01', + MonitoringLocationName: 'Test River', + MonitoringLocationLatitude: 51.0486, + MonitoringLocationLongitude: -114.0708, + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationType: 'River/Stream', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Surface Water', + ActivityStartDate: '2026-01-15', + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: '-06:00', + CharacteristicName: 'Temperature, water', + ResultValue: 18.5, + ResultUnit: 'deg C', + ResultValueType: 'Actual', + ResultStatusID: 'Validated', + }, + }, + { + name: 'Groundwater with sample collection method context/ID', + data: { + DatasetName: 'GW Method', + MonitoringLocationID: 'GW-02', + MonitoringLocationName: 'Test Well 2', + MonitoringLocationLatitude: 51.0486, + MonitoringLocationLongitude: -114.0708, + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', + WellDepthMeasure: -15, + WellDepthUnit: 'm', + SampleCollectionMethodID: 'D4448-01', + SampleCollectionMethodContext: 'ASTM', + SampleCollectionMethodName: 'Standard guide for sampling ground-water monitoring wells', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Groundwater', + ActivityStartDate: '2026-01-15', + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: '-06:00', + SampleCondition: 'Static, before pumping or purging', + CharacteristicName: 'Temperature, water', + ResultValue: 8.2, + ResultUnit: 'deg C', + ResultValueType: 'Actual', + ResultStatusID: 'Validated', + }, + }, + { + name: 'Groundwater with vertical measure cascade', + data: { + DatasetName: 'GW Vertical', + MonitoringLocationID: 'GW-03', + MonitoringLocationName: 'Test Well 3', + MonitoringLocationLatitude: 51.0486, + MonitoringLocationLongitude: -114.0708, + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationVerticalMeasure: 1500, + MonitoringLocationVerticalUnit: 'm', + MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', + WellDepthMeasure: -20, + WellDepthUnit: 'm', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Groundwater', + ActivityStartDate: '2026-01-15', + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: '-06:00', + SampleCondition: 'Static, before pumping or purging', + CharacteristicName: 'Temperature, water', + ResultValue: 8.2, + ResultUnit: 'deg C', + ResultValueType: 'Actual', + ResultStatusID: 'Validated', + }, + }, +] + +for (const { name, data } of crossFlavourFixtures) { + test(`frontend accepts ${name}`, async () => { + assert.equal(validate(structuredClone(data)), true) + }) + test(`extract accepts ${name}`, async () => { + assert.equal(validateExtract(structuredClone(data)), true) + }) + test(`backend accepts ${name}`, async () => { + assert.equal(validateBackend(structuredClone(data)), true) + }) +} + +// *** cross-flavour negative fixtures *** // +// Each fixture mutates the GW well baseline with a single violation. Run +// through all three validators to exercise error-reporting paths. + +const baseline = crossFlavourFixtures[0].data +const negativeFixtures = [ + { + name: 'invalid MonitoringLocationType enum', + mutate: (d) => { + d.MonitoringLocationType = 'NotAType' + }, + }, + { + name: 'WellDepthMeasure > 0 (range violation)', + mutate: (d) => { + d.WellDepthMeasure = 5 + }, + }, + { + name: 'WellID exceeding maxLength', + mutate: (d) => { + d.WellID = 'x'.repeat(56); + d.WellIDContext = 'AB' + }, + }, + { + name: 'AquiferCode exceeding maxLength', + mutate: (d) => { + d.AquiferCode = '12345678901' + }, + }, +] + +for (const { name, mutate } of negativeFixtures) { + const build = () => { + const d = structuredClone(baseline); + mutate(d); + return d + } + test(`frontend rejects ${name}`, async () => { + assert.equal(validate(build()), false) + }) + test(`extract rejects ${name}`, async () => { + assert.equal(validateExtract(build()), false) + }) + test(`backend rejects ${name}`, async () => { + assert.equal(validateBackend(build()), false) + }) +} From 885b242c22ffa8cce20754cb6b98a2aa4d3801b7 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 30 Apr 2026 11:46:05 -0400 Subject: [PATCH 17/51] feat: logic to prevent GW fields with non GW media --- schemas/data/src/extract.json | 3 + schemas/data/src/frontend.json | 3 + schemas/data/src/locales/en-CA.ftl | 1 + ...rFields-ActivityMediaName-Groundwater.json | 42 +++++++ schemas/data/src/primary.json | 3 + schemas/data/test/logic.js | 106 ++++++++++++++++++ 6 files changed, 158 insertions(+) create mode 100644 schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index c3cd9cdd..cd613eab 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -317,6 +317,9 @@ }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" + }, + { + "$ref": "./logic/GroundwaterFields-ActivityMediaName-Groundwater.json" } ] } diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 0bfd8edf..ef71ea13 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -357,6 +357,9 @@ }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" + }, + { + "$ref": "./logic/GroundwaterFields-ActivityMediaName-Groundwater.json" } ] } diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index eb0b73fe..15f2f954 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -92,6 +92,7 @@ error-CharacteristicName-ResultSampleFraction = ResultSampleFraction required fo error-CharacteristicName-StableIsotope-MethodSpeciation = Isotope MethodSpeciation required for selected CharacteristicName. For guidance, please see Best Practices for Reporting Isotope Data (https://datastream.org/en-ca/documentation/isotope-data-guidance) error-CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required for CharacteristicName 'Water level in well, depth from a reference point' error-CSVInjection = Invalid starting character. `=`, `+`, `-`, `@`, `[space]`, `[tab]`, `[carriage return]` are not valid characters for the beginning of text columns +error-GroundwaterFields-ActivityMediaName-Groundwater = ActivityMediaName must be Groundwater or Porewater when a Groundwater-specific field is reported error-MonitoringLocationType-Well-WellUseType = WellUseType is required when MonitoringLocationType is a well or piezometer error-MonitoringLocationType-Well-SampleCondition = SampleCondition is required when MonitoringLocationType is a well or piezometer (except for Continuous Time Series activities) error-ResultDetectionCondition-ResultDetectionQuantitationLimit-above-below = ResultDetectionQuantitationLimit fields are required when ResultDetectionCondition is above or below Detection/Quantification limits diff --git a/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json new file mode 100644 index 00000000..c573bbbe --- /dev/null +++ b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json @@ -0,0 +1,42 @@ +{ + "$id": "https://datastream.org/schema/data/logic/GroundwaterFields-ActivityMediaName-Groundwater.json", + "title": "GroundwaterFields-ActivityMediaName-Groundwater", + "description": "ActivityMediaName must be Groundwater or Porewater when any Groundwater-specific field is reported", + "errorMessage": "error-GroundwaterFields-ActivityMediaName-Groundwater", + "if": { + "type": "object", + "unevaluatedProperties": true, + "anyOf": [ + { "required": ["WellID"] }, + { "required": ["WellIDContext"] }, + { "required": ["WellUseType"] }, + { "required": ["AquiferCode"] }, + { "required": ["AquiferUnitName"] }, + { "required": ["AquiferType"] }, + { "required": ["AquiferUnitPorosityType"] }, + { "required": ["LithologyType"] }, + { "required": ["BoreholeDepthMeasure"] }, + { "required": ["BoreholeDepthUnit"] }, + { "required": ["WellDepthMeasure"] }, + { "required": ["WellDepthUnit"] }, + { "required": ["WellOpenIntervalTopMeasure"] }, + { "required": ["WellOpenIntervalTopUnit"] }, + { "required": ["WellOpenIntervalBottomMeasure"] }, + { "required": ["WellOpenIntervalBottomUnit"] }, + { "required": ["ActivityDepthAltitudeReferencePoint"] }, + { "required": ["ActivityDepthAltitudeReferencePointMeasure"] }, + { "required": ["ActivityDepthAltitudeReferencePointUnit"] }, + { "required": ["SampleCondition"] } + ] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityMediaName": { + "enum": ["Groundwater", "Porewater"] + } + }, + "required": ["ActivityMediaName"] + } +} \ No newline at end of file diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index 2db360e9..bba274b7 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -313,6 +313,9 @@ }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" + }, + { + "$ref": "./logic/GroundwaterFields-ActivityMediaName-Groundwater.json" } ] } diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index d6d68ac4..de3382a6 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -1038,6 +1038,112 @@ test("Should accept non-GW ActivityMediaName without any depth measure", async ( assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), false); }); +// *** GroundwaterFields-ActivityMediaName-Groundwater *** // +test("Should reject Surface Water with WellID (GW-only field)", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + WellID: "well-123", + WellIDContext: "AB", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + true, + ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); +}); + +test("Should reject Surface Water with AquiferCode (GW-only field)", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + AquiferCode: "AQ-01", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + true, + ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); +}); + +test("Should reject Surface Water with WellDepthMeasure (GW-only field)", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + WellDepthMeasure: -10, + WellDepthUnit: "m", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + true, + ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); +}); + +test("Should reject GW field without ActivityMediaName at all", async (t) => { + const valid = validate({ + MonitoringLocationType: "Well", + WellID: "well-123", + WellIDContext: "AB", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + true, + ); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), true); +}); + +test("Should accept Groundwater with WellID and WellUseType (GW fields allowed)", async (t) => { + const valid = validate({ + ActivityMediaName: "Groundwater", + MonitoringLocationType: "Well", + WellID: "well-123", + WellIDContext: "AB", + WellUseType: "Domestic", + WellDepthMeasure: -10, + WellDepthUnit: "m", + SampleCondition: "Static, before pumping or purging", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + false, + ); +}); + +test("Should accept Surface Water with vertical accuracy fields (not GW-restricted)", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + MonitoringLocationVerticalAccuracyMeasure: 0.5, + MonitoringLocationVerticalAccuracyUnit: "m", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + false, + ); +}); + +test("Should accept Surface Water with SampleCollectionMethod fields (not GW-restricted)", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + MonitoringLocationType: "River/Stream", + SampleCollectionMethodID: "method-1", + SampleCollectionMethodContext: "USEPA", + SampleCollectionMethodName: "Test method", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + false, + ); +}); + // *** one off *** // /*test('one off', async (t) => { const valid = validate({ From e8fd59a125332277992371751cbf99f64d596778 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 1 May 2026 12:58:51 -0400 Subject: [PATCH 18/51] chore: add more fields to GW only logic --- ...rFields-ActivityMediaName-Groundwater.json | 11 +++++- schemas/data/test/logic.js | 38 +++++++++++++++++-- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json index c573bbbe..04910f36 100644 --- a/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json +++ b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json @@ -7,6 +7,10 @@ "type": "object", "unevaluatedProperties": true, "anyOf": [ + { "required": ["MonitoringLocationVerticalCoordinateReferenceSystem"] }, + { "required": ["MonitoringLocationVerticalCollectionMethod"] }, + { "required": ["MonitoringLocationVerticalAccuracyMeasure"] }, + { "required": ["MonitoringLocationVerticalAccuracyUnit"] }, { "required": ["WellID"] }, { "required": ["WellIDContext"] }, { "required": ["WellUseType"] }, @@ -15,10 +19,10 @@ { "required": ["AquiferType"] }, { "required": ["AquiferUnitPorosityType"] }, { "required": ["LithologyType"] }, - { "required": ["BoreholeDepthMeasure"] }, - { "required": ["BoreholeDepthUnit"] }, { "required": ["WellDepthMeasure"] }, { "required": ["WellDepthUnit"] }, + { "required": ["BoreholeDepthMeasure"] }, + { "required": ["BoreholeDepthUnit"] }, { "required": ["WellOpenIntervalTopMeasure"] }, { "required": ["WellOpenIntervalTopUnit"] }, { "required": ["WellOpenIntervalBottomMeasure"] }, @@ -26,6 +30,9 @@ { "required": ["ActivityDepthAltitudeReferencePoint"] }, { "required": ["ActivityDepthAltitudeReferencePointMeasure"] }, { "required": ["ActivityDepthAltitudeReferencePointUnit"] }, + { "required": ["SampleCollectionMethodID"] }, + { "required": ["SampleCollectionMethodContext"] }, + { "required": ["SampleCollectionMethodName"] }, { "required": ["SampleCondition"] } ] }, diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index de3382a6..782f4e49 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -1052,6 +1052,7 @@ test("Should reject Surface Water with WellID (GW-only field)", async (t) => { true, ); assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); test("Should reject Surface Water with AquiferCode (GW-only field)", async (t) => { @@ -1066,6 +1067,7 @@ test("Should reject Surface Water with AquiferCode (GW-only field)", async (t) = true, ); assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); test("Should reject Surface Water with WellDepthMeasure (GW-only field)", async (t) => { @@ -1081,6 +1083,7 @@ test("Should reject Surface Water with WellDepthMeasure (GW-only field)", async true, ); assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); test("Should reject GW field without ActivityMediaName at all", async (t) => { @@ -1095,6 +1098,7 @@ test("Should reject GW field without ActivityMediaName at all", async (t) => { true, ); assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); }); test("Should accept Groundwater with WellID and WellUseType (GW fields allowed)", async (t) => { @@ -1113,9 +1117,31 @@ test("Should accept Groundwater with WellID and WellUseType (GW fields allowed)" checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), false, ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); -test("Should accept Surface Water with vertical accuracy fields (not GW-restricted)", async (t) => { +test("Should accept Porewater with WellID and WellUseType (GW fields allowed)", async (t) => { + const valid = validate({ + ActivityMediaName: "Porewater", + MonitoringLocationType: "Well", + WellID: "well-123", + WellIDContext: "AB", + WellUseType: "Domestic", + WellDepthMeasure: -10, + WellDepthUnit: "m", + SampleCondition: "Static, before pumping or purging", + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), + false, + ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); +}); + +test("Should reject Surface Water with MonitoringLocationVerticalAccuracyMeasure (GW-only field)", async (t) => { const valid = validate({ ActivityMediaName: "Surface Water", MonitoringLocationType: "River/Stream", @@ -1125,11 +1151,13 @@ test("Should accept Surface Water with vertical accuracy fields (not GW-restrict assert.equal(valid, false); assert.equal( checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - false, + true, ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); -test("Should accept Surface Water with SampleCollectionMethod fields (not GW-restricted)", async (t) => { +test("Should reject Surface Water with SampleCollectionMethodID (GW-only field)", async (t) => { const valid = validate({ ActivityMediaName: "Surface Water", MonitoringLocationType: "River/Stream", @@ -1140,8 +1168,10 @@ test("Should accept Surface Water with SampleCollectionMethod fields (not GW-res assert.equal(valid, false); assert.equal( checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - false, + true, ); + assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); + assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); }); // *** one off *** // From d9c140c65b4497dbf16201648d301775473d6e8f Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 14 May 2026 10:33:00 -0400 Subject: [PATCH 19/51] feat: switch AquiferType to a custom field to keep title casing --- schemas/data/bin/build-lib.js | 2 +- schemas/data/src/addition/AquiferType.json | 2 +- schemas/data/src/locales/en-CA.ftl | 5 +- .../ResultDetectionCondition-ResultValue.json | 2 - schemas/data/src/subset/AquiferType.json | 1 - .../data/src/values/AquiferType.legacy.json | 8 +- .../data/src/values/AquiferType.primary.json | 8 +- schemas/data/test/transform.js | 79 ++++++++++++++++++- 8 files changed, 91 insertions(+), 16 deletions(-) delete mode 100644 schemas/data/src/subset/AquiferType.json diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index dabf87df..a1b9fadb 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -25,6 +25,7 @@ export const subsetOnly = [ // Custom fields (non-WQX) that need value files generated export const custom = [ + "AquiferType", "AquiferUnitName", "WellIDContext", "AquiferUnitPorosityType", @@ -43,7 +44,6 @@ export const wqx = { MonitoringLocationVerticalCoordinateReferenceSystem: "VerticalReferenceDatum", MonitoringLocationType: "MonitoringLocationType", WellUseType: "WellType", - AquiferType: "AquiferType", LithologyType: "WellFormationType", BoreholeDepthUnit: "MeasurementUnit", WellDepthUnit: "MeasurementUnit", diff --git a/schemas/data/src/addition/AquiferType.json b/schemas/data/src/addition/AquiferType.json index e568890e..03fc7bda 100644 --- a/schemas/data/src/addition/AquiferType.json +++ b/schemas/data/src/addition/AquiferType.json @@ -1 +1 @@ -["ARTESIAN"] \ No newline at end of file +["Artesian", "Confined", "Semi-Confined", "Unconfined"] \ No newline at end of file diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 15f2f954..8ba437f7 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -85,14 +85,14 @@ error-string-multiline-pattern = Only letters, numbers, punctuation, symbols, sp error-ActivityType-CTS-ActivityStartTime = Continuous time-series observations must include a valid ActivityStartTime error-ActivityType-ResultAnalyticalMethod = Requires LaboratoryName and ResultAnalyticalMethod columns when ActivityType starts with 'Sample' (i.e. Activity is not a Field Msr/Obs) error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported -error-ActivityMediaName-Groundwater-DepthMeasure = At least one of ActivityDepthHeightMeasure, BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, or WellOpenIntervalBottomMeasure must be reported when ActivityMediaName is Groundwater or Porewater +error-ActivityMediaName-Groundwater-DepthMeasure = At least one of ActivityDepthHeightMeasure, BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, or WellOpenIntervalBottomMeasure must be reported when ActivityMediaName is 'Groundwater' or 'Porewater' error-CharacteristicName-MethodSpeciation = MethodSpeciation required for selected CharacteristicName error-CharacteristicName-Nutrient-ResultSampleFraction = ResultSampleFractions for nutrients should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) error-CharacteristicName-ResultSampleFraction = ResultSampleFraction required for selected CharacteristicName error-CharacteristicName-StableIsotope-MethodSpeciation = Isotope MethodSpeciation required for selected CharacteristicName. For guidance, please see Best Practices for Reporting Isotope Data (https://datastream.org/en-ca/documentation/isotope-data-guidance) error-CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required for CharacteristicName 'Water level in well, depth from a reference point' error-CSVInjection = Invalid starting character. `=`, `+`, `-`, `@`, `[space]`, `[tab]`, `[carriage return]` are not valid characters for the beginning of text columns -error-GroundwaterFields-ActivityMediaName-Groundwater = ActivityMediaName must be Groundwater or Porewater when a Groundwater-specific field is reported +error-GroundwaterFields-ActivityMediaName-Groundwater = ActivityMediaName must be 'Groundwater' or 'Porewater' when any groundwater- or porewater-specific field is reported error-MonitoringLocationType-Well-WellUseType = WellUseType is required when MonitoringLocationType is a well or piezometer error-MonitoringLocationType-Well-SampleCondition = SampleCondition is required when MonitoringLocationType is a well or piezometer (except for Continuous Time Series activities) error-ResultDetectionCondition-ResultDetectionQuantitationLimit-above-below = ResultDetectionQuantitationLimit fields are required when ResultDetectionCondition is above or below Detection/Quantification limits @@ -153,3 +153,4 @@ qc-MonitoringLocationName-Duplicate = Multiple MonitoringLocationNames are used qc-MonitoringLocationType-Duplicate = Multiple MonitoringLocationTypes are used with the same MonitoringLocationID qc-MonitoringLocationHorizontalCoordinateReferenceSystem-Duplicate = Multiple MonitoringLocationHorizontalCoordinateReferenceSystems are used with the same MonitoringLocationID qc-ActivityTypeContinuous = When there are >= 24 observations of the same type on the same day, ActivityType is expected to equal 'Field Msr/Obs-Continuous Time Series' +error-ActivityMediaName-Groundwater-Mixed = ActivityMediaName must be 'Groundwater' or 'Porewater' on every row when either is reported. Submit other media as a separate dataset. diff --git a/schemas/data/src/logic/ResultDetectionCondition-ResultValue.json b/schemas/data/src/logic/ResultDetectionCondition-ResultValue.json index a4f07a41..8f8fcdcb 100644 --- a/schemas/data/src/logic/ResultDetectionCondition-ResultValue.json +++ b/schemas/data/src/logic/ResultDetectionCondition-ResultValue.json @@ -11,7 +11,6 @@ "ResultValue": true, "ResultDetectionCondition": false }, - "maxProperties": 42, "required": ["ResultValue"] }, { @@ -21,7 +20,6 @@ "ResultValue": false, "ResultDetectionCondition": true }, - "maxProperties": 42, "required": ["ResultDetectionCondition"] } ] diff --git a/schemas/data/src/subset/AquiferType.json b/schemas/data/src/subset/AquiferType.json deleted file mode 100644 index b88654a0..00000000 --- a/schemas/data/src/subset/AquiferType.json +++ /dev/null @@ -1 +0,0 @@ -["ARTESIAN", "CONFINED", "SEMI-CONFINED", "UNCONFINED"] \ No newline at end of file diff --git a/schemas/data/src/values/AquiferType.legacy.json b/schemas/data/src/values/AquiferType.legacy.json index 14befdf4..04e6d5c7 100644 --- a/schemas/data/src/values/AquiferType.legacy.json +++ b/schemas/data/src/values/AquiferType.legacy.json @@ -4,10 +4,10 @@ "description": "", "type": "string", "enum": [ - "ARTESIAN", - "CONFINED", - "SEMI-CONFINED", - "UNCONFINED" + "Artesian", + "Confined", + "Semi-Confined", + "Unconfined" ], "maxLength": 13 } \ No newline at end of file diff --git a/schemas/data/src/values/AquiferType.primary.json b/schemas/data/src/values/AquiferType.primary.json index a7885062..e403eb49 100644 --- a/schemas/data/src/values/AquiferType.primary.json +++ b/schemas/data/src/values/AquiferType.primary.json @@ -4,10 +4,10 @@ "description": "", "type": "string", "enum": [ - "ARTESIAN", - "CONFINED", - "SEMI-CONFINED", - "UNCONFINED" + "Artesian", + "Confined", + "Semi-Confined", + "Unconfined" ], "maxLength": 13 } \ No newline at end of file diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index 2d051f7f..12d6ad80 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -96,15 +96,37 @@ const crossFlavourFixtures = [ MonitoringLocationLatitude: 51.0486, MonitoringLocationLongitude: -114.0708, MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationVerticalMeasure: 1050, + MonitoringLocationVerticalUnit: 'm', + MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', + MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalAccuracyMeasure: 0.1, + MonitoringLocationVerticalAccuracyUnit: 'm', MonitoringLocationType: 'Well', + WellID: 'well-123', + WellIDContext: 'AB', WellUseType: 'Domestic', - WellDepthMeasure: -10, + AquiferCode: 'AQ-01', + AquiferUnitName: 'Abbotsford Shallow Aquifer', + AquiferType: 'Confined', + AquiferUnitPorosityType: 'Granular', + LithologyType: 'Sand', + WellDepthMeasure: -30, WellDepthUnit: 'm', + BoreholeDepthMeasure: -32, + BoreholeDepthUnit: 'm', + WellOpenIntervalTopMeasure: -25, + WellOpenIntervalTopUnit: 'm', + WellOpenIntervalBottomMeasure: -28, + WellOpenIntervalBottomUnit: 'm', ActivityType: 'Field Msr/Obs', ActivityMediaName: 'Groundwater', ActivityStartDate: '2026-01-15', ActivityStartTime: '12:00:00', ActivityStartTimeZone: '-06:00', + ActivityDepthAltitudeReferencePoint: 'Top of well casing', + ActivityDepthAltitudeReferencePointMeasure: 27, + ActivityDepthAltitudeReferencePointUnit: 'm', SampleCondition: 'Static, before pumping or purging', CharacteristicName: 'Temperature, water', ResultValue: 8.2, @@ -113,6 +135,61 @@ const crossFlavourFixtures = [ ResultStatusID: 'Validated', }, }, + { + name: 'Groundwater well routine sample collection', + data: { + DatasetName: 'GW Sample', + MonitoringLocationID: 'GW-04', + MonitoringLocationName: 'Test Well 4', + MonitoringLocationLatitude: 51.0486, + MonitoringLocationLongitude: -114.0708, + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationVerticalMeasure: 1050, + MonitoringLocationVerticalUnit: 'm', + MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', + MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalAccuracyMeasure: 0.1, + MonitoringLocationVerticalAccuracyUnit: 'm', + MonitoringLocationType: 'Well', + WellID: 'well-456', + WellIDContext: 'AB', + WellUseType: 'Domestic', + AquiferCode: 'AQ-02', + AquiferUnitName: 'Abbotsford Shallow Aquifer', + AquiferType: 'Confined', + AquiferUnitPorosityType: 'Granular', + LithologyType: 'Sand', + WellDepthMeasure: -30, + WellDepthUnit: 'm', + BoreholeDepthMeasure: -32, + BoreholeDepthUnit: 'm', + WellOpenIntervalTopMeasure: -25, + WellOpenIntervalTopUnit: 'm', + WellOpenIntervalBottomMeasure: -28, + WellOpenIntervalBottomUnit: 'm', + ActivityType: 'Sample-Routine', + ActivityMediaName: 'Groundwater', + ActivityStartDate: '2026-01-15', + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: '-06:00', + ActivityDepthAltitudeReferencePoint: 'Top of well casing', + ActivityDepthAltitudeReferencePointMeasure: 27, + ActivityDepthAltitudeReferencePointUnit: 'm', + SampleCollectionMethodID: 'D4448-01', + SampleCollectionMethodContext: 'ASTM', + SampleCollectionMethodName: 'Standard guide for sampling ground-water monitoring wells', + SampleCondition: 'Static, before pumping or purging', + CharacteristicName: 'Chloride', + ResultSampleFraction: 'Dissolved', + ResultValue: 12.4, + ResultUnit: 'mg/L', + ResultValueType: 'Actual', + ResultStatusID: 'Validated', + ResultAnalyticalMethodID: 'EPA-300.0', + ResultAnalyticalMethodContext: 'USEPA', + LaboratoryName: 'Test Lab Inc.', + }, + }, { name: 'Surface water field measurement', data: { From 9c8385892d2fdd6684efbd60e7aa4f707d631d85 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 14 May 2026 10:34:21 -0400 Subject: [PATCH 20/51] feat: add GW enum fields to build-locales --- schemas/data/bin/build-locales.js | 11 + .../ActivityDepthAltitudeReferencePoint.json | 62 + schemas/data/src/locales/AquiferType.json | 52 + schemas/data/src/locales/AquiferUnitName.json | 7712 +++++++++++++++++ .../src/locales/AquiferUnitPorosityType.json | 52 + .../data/src/locales/CharacteristicName.json | 20 + schemas/data/src/locales/LithologyType.json | 722 ++ ...onHorizontalCoordinateReferenceSystem.json | 10 + ...oringLocationVerticalCollectionMethod.json | 192 + ...tionVerticalCoordinateReferenceSystem.json | 72 + .../SampleCollectionEquipmentName.json | 70 + .../SampleCollectionMethodContext.json | 132 + schemas/data/src/locales/SampleCondition.json | 72 + schemas/data/src/locales/WellIDContext.json | 142 + schemas/data/src/locales/WellUseType.json | 172 + 15 files changed, 9493 insertions(+) create mode 100644 schemas/data/src/locales/ActivityDepthAltitudeReferencePoint.json create mode 100644 schemas/data/src/locales/AquiferType.json create mode 100644 schemas/data/src/locales/AquiferUnitName.json create mode 100644 schemas/data/src/locales/AquiferUnitPorosityType.json create mode 100644 schemas/data/src/locales/LithologyType.json create mode 100644 schemas/data/src/locales/MonitoringLocationVerticalCollectionMethod.json create mode 100644 schemas/data/src/locales/MonitoringLocationVerticalCoordinateReferenceSystem.json create mode 100644 schemas/data/src/locales/SampleCollectionMethodContext.json create mode 100644 schemas/data/src/locales/SampleCondition.json create mode 100644 schemas/data/src/locales/WellIDContext.json create mode 100644 schemas/data/src/locales/WellUseType.json diff --git a/schemas/data/bin/build-locales.js b/schemas/data/bin/build-locales.js index f9cabc5c..40fc6e25 100644 --- a/schemas/data/bin/build-locales.js +++ b/schemas/data/bin/build-locales.js @@ -6,14 +6,21 @@ import { subset, sort } from "./build-lib.js"; const __dirname = dirname(fileURLToPath(import.meta.url)); const columns = [ + "ActivityDepthAltitudeReferencePoint", "ActivityMediaName", // filter "ActivityType", "ActivityGroupType", // filter + "AquiferType", + "AquiferUnitName", + "AquiferUnitPorosityType", "CharacteristicName", // filter "CharacteristicGroup", // filter + "LithologyType", "MethodSpeciation", // app display "MonitoringLocationHorizontalCoordinateReferenceSystem", "MonitoringLocationType", // app filter + "MonitoringLocationVerticalCollectionMethod", + "MonitoringLocationVerticalCoordinateReferenceSystem", "ResultAnalyticalMethodContext", "ResultDetectionCondition", "ResultDetectionQuantitationLimitType", @@ -21,6 +28,10 @@ const columns = [ "ResultStatusID", "ResultValueType", "SampleCollectionEquipmentName", + "SampleCollectionMethodContext", + "SampleCondition", + "WellIDContext", + "WellUseType", //"MeasurementUnit", ]; diff --git a/schemas/data/src/locales/ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/locales/ActivityDepthAltitudeReferencePoint.json new file mode 100644 index 00000000..dc05a1b1 --- /dev/null +++ b/schemas/data/src/locales/ActivityDepthAltitudeReferencePoint.json @@ -0,0 +1,62 @@ +{ + "name": { + "en": "ActivityDepthAltitudeReferencePoint", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Ground surface": { + "name": { + "en": "Ground surface", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Top of instrument shelf": { + "name": { + "en": "Top of instrument shelf", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Top of outer casing": { + "name": { + "en": "Top of outer casing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Top of well casing": { + "name": { + "en": "Top of well casing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unspecified": { + "name": { + "en": "Unspecified", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/AquiferType.json b/schemas/data/src/locales/AquiferType.json new file mode 100644 index 00000000..f36c46fa --- /dev/null +++ b/schemas/data/src/locales/AquiferType.json @@ -0,0 +1,52 @@ +{ + "name": { + "en": "AquiferType", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Artesian": { + "name": { + "en": "Artesian", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Confined": { + "name": { + "en": "Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Semi-Confined": { + "name": { + "en": "Semi-Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unconfined": { + "name": { + "en": "Unconfined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/AquiferUnitName.json b/schemas/data/src/locales/AquiferUnitName.json new file mode 100644 index 00000000..72bf702c --- /dev/null +++ b/schemas/data/src/locales/AquiferUnitName.json @@ -0,0 +1,7712 @@ +{ + "name": { + "en": "AquiferUnitName", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "111 Mile Creek Valley Aquifer System": { + "name": { + "en": "111 Mile Creek Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "1WS Member": { + "name": { + "en": "1WS Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "2WS Member": { + "name": { + "en": "2WS Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Abbotsford Shallow Aquifer": { + "name": { + "en": "Abbotsford Shallow Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Abbotsford Shallow West Aquifer": { + "name": { + "en": "Abbotsford Shallow West Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Alberta Group": { + "name": { + "en": "Alberta Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Aldergrove Shallow Aquifer": { + "name": { + "en": "Aldergrove Shallow Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Algonquin Aquifer Complex": { + "name": { + "en": "Algonquin Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Algonquin Basin": { + "name": { + "en": "Algonquin Basin", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Algonquin Shoreline": { + "name": { + "en": "Algonquin Shoreline", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Alice Siding Aquifer": { + "name": { + "en": "Alice Siding Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Alliston Aquifer Complex": { + "name": { + "en": "Alliston Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Alluvial and glaciofluvial sand and gravel": { + "name": { + "en": "Alluvial and glaciofluvial sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Alviston-Rutherford Aquifer": { + "name": { + "en": "Alviston-Rutherford Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Amabel-Lockport-Guelph Hydrogeologic Unit": { + "name": { + "en": "Amabel-Lockport-Guelph Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Amherstburge Aquifer": { + "name": { + "en": "Amherstburge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ancaster-West Flamborough Aquifer": { + "name": { + "en": "Ancaster-West Flamborough Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Annapolis-Cornwallis valleys Aquifer": { + "name": { + "en": "Annapolis-Cornwallis valleys Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Anten Coquina Member": { + "name": { + "en": "Anten Coquina Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Arras-Fellers Heights Bedrock Aquifer": { + "name": { + "en": "Arras-Fellers Heights Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Arrowwood Formation": { + "name": { + "en": "Arrowwood Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Arthur-Mount Forest Aquifer": { + "name": { + "en": "Arthur-Mount Forest Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Assiniboine delta Aquifer": { + "name": { + "en": "Assiniboine delta Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Atha Aquifer": { + "name": { + "en": "Atha Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ausable Aquifer": { + "name": { + "en": "Ausable Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bad Heart Formation": { + "name": { + "en": "Bad Heart Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Balfron Formation": { + "name": { + "en": "Balfron Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Banff Formation": { + "name": { + "en": "Banff Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Barons Sand Formation": { + "name": { + "en": "Barons Sand Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Basal Aquifer": { + "name": { + "en": "Basal Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Basal clastic unit (Winnipeg) Aquifer": { + "name": { + "en": "Basal clastic unit (Winnipeg) Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Basal Cretaceous Sandstone": { + "name": { + "en": "Basal Cretaceous Sandstone", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bass Island Hydrogeologic Unit": { + "name": { + "en": "Bass Island Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Battle Formation": { + "name": { + "en": "Battle Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Battleford Formation": { + "name": { + "en": "Battleford Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Beach Ridge sand and gravel": { + "name": { + "en": "Beach Ridge sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bearpaw Formation": { + "name": { + "en": "Bearpaw Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Beaver Creek Overburden Aquifer": { + "name": { + "en": "Beaver Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Belle Fourche Formation": { + "name": { + "en": "Belle Fourche Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Belly River Formation": { + "name": { + "en": "Belly River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Belly River Group": { + "name": { + "en": "Belly River Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Beverly-Onoway channel Complex": { + "name": { + "en": "Beverly-Onoway channel Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Billings-Carlsbad-Queenston Hydrogeologic Unit": { + "name": { + "en": "Billings-Carlsbad-Queenston Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blackstone Formation": { + "name": { + "en": "Blackstone Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blewett Bedrock Aquifer": { + "name": { + "en": "Blewett Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blood Reserve Formation": { + "name": { + "en": "Blood Reserve Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blue Mountain-Georgian Bay Hydrogeologic Unit": { + "name": { + "en": "Blue Mountain-Georgian Bay Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blueberry Valley Aquifer System": { + "name": { + "en": "Blueberry Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Blueberry-Aitken Bedrock Aquifer": { + "name": { + "en": "Blueberry-Aitken Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bluesky Formation": { + "name": { + "en": "Bluesky Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bois Blanc Hydrogeologic Unit": { + "name": { + "en": "Bois Blanc Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Boissevain Formation": { + "name": { + "en": "Boissevain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bonnyville U1 Sand": { + "name": { + "en": "Bonnyville U1 Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bonnyville U1 Till": { + "name": { + "en": "Bonnyville U1 Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bonnyville U2 Till": { + "name": { + "en": "Bonnyville U2 Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Boss Point Formation": { + "name": { + "en": "Boss Point Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bothwell Aquifer": { + "name": { + "en": "Bothwell Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bounded Channel Aquifers": { + "name": { + "en": "Bounded Channel Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bourget Aquifer": { + "name": { + "en": "Bourget Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bow Island Formation": { + "name": { + "en": "Bow Island Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bradley Creek Valley Aquifer System": { + "name": { + "en": "Bradley Creek Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Brazeau Formation": { + "name": { + "en": "Brazeau Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bredenbury & Wynyard Formations": { + "name": { + "en": "Bredenbury & Wynyard Formations", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bridge Lake Aquifer System": { + "name": { + "en": "Bridge Lake Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Brilliant Bedrock Aquifer": { + "name": { + "en": "Brilliant Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bronson Lake": { + "name": { + "en": "Bronson Lake", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Brownsville Local Aquifer": { + "name": { + "en": "Brownsville Local Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Buried valley containing sand and gravel": { + "name": { + "en": "Buried valley containing sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Buried valley/blanket Aquifers": { + "name": { + "en": "Buried valley/blanket Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cadomin Formation": { + "name": { + "en": "Cadomin Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cadotte Formation": { + "name": { + "en": "Cadotte Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Caledon-Grand River Outwash Aquifer": { + "name": { + "en": "Caledon-Grand River Outwash Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Calgary Lethbridge Corridor HSU C Aquitard": { + "name": { + "en": "Calgary Lethbridge Corridor HSU C Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Calgary Lethbridge Corridor HSU S1 Aquifer": { + "name": { + "en": "Calgary Lethbridge Corridor HSU S1 Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Calgary Lethbridge Corridor HSU S2 Aquifer": { + "name": { + "en": "Calgary Lethbridge Corridor HSU S2 Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Canadian Shield": { + "name": { + "en": "Canadian Shield", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Canning Aquitard": { + "name": { + "en": "Canning Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Canning Till Aquitard": { + "name": { + "en": "Canning Till Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cantuar Formation": { + "name": { + "en": "Cantuar Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Canyon Overburden Aquifer": { + "name": { + "en": "Canyon Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Carbon Member": { + "name": { + "en": "Carbon Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Carbonate rock Aquifer": { + "name": { + "en": "Carbonate rock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Carboniferous basin Aquifer": { + "name": { + "en": "Carboniferous basin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cardium Formation": { + "name": { + "en": "Cardium Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Carlile Formation": { + "name": { + "en": "Carlile Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Casino Overburden Aquifer": { + "name": { + "en": "Casino Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Castlegar Overburden Aquifer": { + "name": { + "en": "Castlegar Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cataract Group Hydrogeologic Unit": { + "name": { + "en": "Cataract Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Catfish Creek Aquifer": { + "name": { + "en": "Catfish Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cedar Grove Aquifer": { + "name": { + "en": "Cedar Grove Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Central Catfish Creek Aquifer": { + "name": { + "en": "Central Catfish Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Central Halfway-Beatton Bedrock Aquifer": { + "name": { + "en": "Central Halfway-Beatton Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Central South Nation Aquifer Complex": { + "name": { + "en": "Central South Nation Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Champlain Aquifer": { + "name": { + "en": "Champlain Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Channel Aquifer 1": { + "name": { + "en": "Channel Aquifer 1", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Channel Aquifer 2": { + "name": { + "en": "Channel Aquifer 2", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Channel Aquifer 3": { + "name": { + "en": "Channel Aquifer 3", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Channel Aquitard 1": { + "name": { + "en": "Channel Aquitard 1", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Channel Aquitard 2": { + "name": { + "en": "Channel Aquitard 2", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Charlie Halfway Beatton Bedrock Aquifer": { + "name": { + "en": "Charlie Halfway Beatton Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chateauguay Aquifer": { + "name": { + "en": "Chateauguay Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chauidiere Aquifer": { + "name": { + "en": "Chauidiere Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chesley Aquifer": { + "name": { + "en": "Chesley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chinchaga Formation": { + "name": { + "en": "Chinchaga Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chu Íntthi Aquifer": { + "name": { + "en": "Chu Íntthi Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Chungo Member": { + "name": { + "en": "Chungo Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clarence Creek Aquifer": { + "name": { + "en": "Clarence Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clayton Heights Aquifer": { + "name": { + "en": "Clayton Heights Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clayton Uplands Aquifer": { + "name": { + "en": "Clayton Uplands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clinton Creek Bedrock Aquifer": { + "name": { + "en": "Clinton Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clinton Creek Lower Unconsolidated Aquifer": { + "name": { + "en": "Clinton Creek Lower Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clinton Creek Upper Sand and Gravel Aquifer": { + "name": { + "en": "Clinton Creek Upper Sand and Gravel Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clinton Group Hydrogeologic Unit": { + "name": { + "en": "Clinton Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Coalspur Formation": { + "name": { + "en": "Coalspur Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cold Lake Formation": { + "name": { + "en": "Cold Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Coldstream Aquifer": { + "name": { + "en": "Coldstream Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Colorado Group": { + "name": { + "en": "Colorado Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Connelly Creek Formation": { + "name": { + "en": "Connelly Creek Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Contact Aquifer": { + "name": { + "en": "Contact Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Contact Rapids Formation": { + "name": { + "en": "Contact Rapids Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cooking Lake area sediments": { + "name": { + "en": "Cooking Lake area sediments", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cooking Lake Formation": { + "name": { + "en": "Cooking Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Credit River Aquifer": { + "name": { + "en": "Credit River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Creston-Kootenay River Overburden Aquifer": { + "name": { + "en": "Creston-Kootenay River Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cridland Creek Bedrock Aquifer": { + "name": { + "en": "Cridland Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Crowsnest River Alluvial Aquifer": { + "name": { + "en": "Crowsnest River Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cumberland Group": { + "name": { + "en": "Cumberland Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Cypress Hills Formation": { + "name": { + "en": "Cypress Hills Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dalehurst Member": { + "name": { + "en": "Dalehurst Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dawson Creek Overburden Aquifer": { + "name": { + "en": "Dawson Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Del Bonita Formation": { + "name": { + "en": "Del Bonita Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Detroit River Group Hydrogeologic Unit": { + "name": { + "en": "Detroit River Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Devonian Strata": { + "name": { + "en": "Devonian Strata", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dinosaur Park Formation": { + "name": { + "en": "Dinosaur Park Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Doe Creek Member": { + "name": { + "en": "Doe Creek Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Doig Formation": { + "name": { + "en": "Doig Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Don Formation": { + "name": { + "en": "Don Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dowling Member": { + "name": { + "en": "Dowling Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Drumheller Channel Complex": { + "name": { + "en": "Drumheller Channel Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Drumheller Member": { + "name": { + "en": "Drumheller Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Drywood Creek Formation": { + "name": { + "en": "Drywood Creek Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dundalk Aquifer": { + "name": { + "en": "Dundalk Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dundee Hydrogeologic Unit": { + "name": { + "en": "Dundee Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dundurn Formation": { + "name": { + "en": "Dundurn Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dunvegan Formation": { + "name": { + "en": "Dunvegan Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Durham Aquifer": { + "name": { + "en": "Durham Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Duvernay Formation": { + "name": { + "en": "Duvernay Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dyer-Wingfield-St. Edmund Hydrogeologic Unit": { + "name": { + "en": "Dyer-Wingfield-St. Edmund Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "East and Middle Sixteen Mile Aquifer": { + "name": { + "en": "East and Middle Sixteen Mile Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "East Creston Bedrock Aquifer": { + "name": { + "en": "East Creston Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "East Pine Bedrock Aquifer": { + "name": { + "en": "East Pine Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "East Pine-Groundbirch Bedrock Aquifer": { + "name": { + "en": "East Pine-Groundbirch Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Eastend Formation": { + "name": { + "en": "Eastend Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Eastend-Ravenscrag Aquifer": { + "name": { + "en": "Eastend-Ravenscrag Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Edson burried-valley Aquifer": { + "name": { + "en": "Edson burried-valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Egmond Bay Formation": { + "name": { + "en": "Egmond Bay Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Elgin-Southampton Aquifer": { + "name": { + "en": "Elgin-Southampton Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ellerslie Member": { + "name": { + "en": "Ellerslie Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ellis Group": { + "name": { + "en": "Ellis Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Empress Formation": { + "name": { + "en": "Empress Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Empress Formation-Uplands glacial": { + "name": { + "en": "Empress Formation-Uplands glacial", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Empress Formation-Valley fill glacial": { + "name": { + "en": "Empress Formation-Valley fill glacial", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Empress Formation-Valley fill glacial Tertiary Undifferentiated": { + "name": { + "en": "Empress Formation-Valley fill glacial Tertiary Undifferentiated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Empress Formation-Valley fill Tertiary": { + "name": { + "en": "Empress Formation-Valley fill Tertiary", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Erie Interstadial Deposits": { + "name": { + "en": "Erie Interstadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ernestina Lake Formation": { + "name": { + "en": "Ernestina Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Esker and gravel": { + "name": { + "en": "Esker and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Estend Formation": { + "name": { + "en": "Estend Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ethel Lake Formation": { + "name": { + "en": "Ethel Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Etobicoke Aquifer": { + "name": { + "en": "Etobicoke Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Exshaw Formation": { + "name": { + "en": "Exshaw Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Eyot Formation": { + "name": { + "en": "Eyot Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Farrel Creek Bedrock Aquifer": { + "name": { + "en": "Farrel Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fernie Formation": { + "name": { + "en": "Fernie Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "First White Specks Formation": { + "name": { + "en": "First White Specks Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fish Scales Formation": { + "name": { + "en": "Fish Scales Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fish Scales Member": { + "name": { + "en": "Fish Scales Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Flesherton Aquifer": { + "name": { + "en": "Flesherton Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Floral Formation": { + "name": { + "en": "Floral Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fontfill Aquifer Complex": { + "name": { + "en": "Fontfill Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Foremost Formation": { + "name": { + "en": "Foremost Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fort Nelson-River Alluvial Aquifer": { + "name": { + "en": "Fort Nelson-River Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fort Simpson Formation": { + "name": { + "en": "Fort Simpson Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fort St. John Overburden Aquifer System": { + "name": { + "en": "Fort St. John Overburden Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fort Vermilion Formation": { + "name": { + "en": "Fort Vermilion Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fourchu Group": { + "name": { + "en": "Fourchu Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fractured Aquifers-Gulf Islands": { + "name": { + "en": "Fractured Aquifers-Gulf Islands", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fraser Canyon Aquifer, Choate to Yale": { + "name": { + "en": "Fraser Canyon Aquifer, Choate to Yale", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fraser Canyon Aquifer, from Yale to Haig": { + "name": { + "en": "Fraser Canyon Aquifer, from Yale to Haig", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fraser Lowlands Aquifer": { + "name": { + "en": "Fraser Lowlands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fraser Plateau Lava Aquifer": { + "name": { + "en": "Fraser Plateau Lava Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Frenchman Formation": { + "name": { + "en": "Frenchman Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Frenchman to Eastend Undifferentiated": { + "name": { + "en": "Frenchman to Eastend Undifferentiated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fulford Aquifer": { + "name": { + "en": "Fulford Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Fundy Group": { + "name": { + "en": "Fundy Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ganges Harbour Aquifer": { + "name": { + "en": "Ganges Harbour Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Georgeville Group": { + "name": { + "en": "Georgeville Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gething Formation": { + "name": { + "en": "Gething Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gibsons/SCRD Granthams Landing/Elphinstone Aquifer": { + "name": { + "en": "Gibsons/SCRD Granthams Landing/Elphinstone Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Glaciolacustrine Aquifer Complex": { + "name": { + "en": "Glaciolacustrine Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Glade Overburden Aquifer": { + "name": { + "en": "Glade Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Glauconitic Sandstone Formation": { + "name": { + "en": "Glauconitic Sandstone Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Glemmore Basal Aquifer": { + "name": { + "en": "Glemmore Basal Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gleneden Aquifer": { + "name": { + "en": "Gleneden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand Centre Formation": { + "name": { + "en": "Grand Centre Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand Forks Aquifer": { + "name": { + "en": "Grand Forks Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand Rapids Formation": { + "name": { + "en": "Grand Rapids Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand River Aquifer": { + "name": { + "en": "Grand River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand River Basin Aquifer": { + "name": { + "en": "Grand River Basin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand River Outwash Deposits": { + "name": { + "en": "Grand River Outwash Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grand River Valley Basinal Deposits": { + "name": { + "en": "Grand River Valley Basinal Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grandview Aquifer": { + "name": { + "en": "Grandview Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grant Hill Aquifer": { + "name": { + "en": "Grant Hill Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Greater Kelowna Aquifer": { + "name": { + "en": "Greater Kelowna Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Greatlakean Stade Deposits": { + "name": { + "en": "Greatlakean Stade Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Green River Aquifer": { + "name": { + "en": "Green River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Greendale Deep Aquifer": { + "name": { + "en": "Greendale Deep Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Greenwood": { + "name": { + "en": "Greenwood", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Greenwood Aquifer": { + "name": { + "en": "Greenwood Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grimshaw Gravels Aquifer": { + "name": { + "en": "Grimshaw Gravels Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grosmont Formation": { + "name": { + "en": "Grosmont Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Groundbirch Buried Valley Aquifer": { + "name": { + "en": "Groundbirch Buried Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Grumbler Group": { + "name": { + "en": "Grumbler Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Guichon Creek Aquifer": { + "name": { + "en": "Guichon Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haans Creek to Blain Creek-Haida Gwaii Aquifer": { + "name": { + "en": "Haans Creek to Blain Creek-Haida Gwaii Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hagan Aquifer": { + "name": { + "en": "Hagan Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haida/Lawnhill Aquifer": { + "name": { + "en": "Haida/Lawnhill Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haig Aquifer": { + "name": { + "en": "Haig Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Halfway Valley Aquifer System": { + "name": { + "en": "Halfway Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Halton Till": { + "name": { + "en": "Halton Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Halverson Ridge Formation": { + "name": { + "en": "Halverson Ridge Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hamilton Group Hydrogeologic Unit": { + "name": { + "en": "Hamilton Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hand Hills Formation": { + "name": { + "en": "Hand Hills Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hanover Aquifer": { + "name": { + "en": "Hanover Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hanson Member": { + "name": { + "en": "Hanson Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Harrow Aquifer": { + "name": { + "en": "Harrow Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hatzic Prairie Aquifer": { + "name": { + "en": "Hatzic Prairie Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haultain Formation": { + "name": { + "en": "Haultain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haven Member": { + "name": { + "en": "Haven Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haynes Aquifer": { + "name": { + "en": "Haynes Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Haynes Member": { + "name": { + "en": "Haynes Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hazelmere Aquifer": { + "name": { + "en": "Hazelmere Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hazelmere Valley Aquifer": { + "name": { + "en": "Hazelmere Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Heather Bank Aquifer": { + "name": { + "en": "Heather Bank Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hillsborough Formation": { + "name": { + "en": "Hillsborough Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hillsborough River Formation": { + "name": { + "en": "Hillsborough River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hockley Valley Aquifer": { + "name": { + "en": "Hockley Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Holstein Aquifer": { + "name": { + "en": "Holstein Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Holt Aquifer Complex": { + "name": { + "en": "Holt Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hopington AB Aquifer": { + "name": { + "en": "Hopington AB Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hopington C Aquifer": { + "name": { + "en": "Hopington C Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Horseshoe Canyon Formation": { + "name": { + "en": "Horseshoe Canyon Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Horsethief Member": { + "name": { + "en": "Horsethief Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Horton Group": { + "name": { + "en": "Horton Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Houston Bedrock Aquifer": { + "name": { + "en": "Houston Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hullcar Confined Aquifer": { + "name": { + "en": "Hullcar Confined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hullcar Perched": { + "name": { + "en": "Hullcar Perched", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hullcar Unconfined Aquifer": { + "name": { + "en": "Hullcar Unconfined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ireton Formation": { + "name": { + "en": "Ireton Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ishbel Group": { + "name": { + "en": "Ishbel Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Joeyaska Deep Aquifer": { + "name": { + "en": "Joeyaska Deep Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Joeyaska Shallow Aquifer": { + "name": { + "en": "Joeyaska Shallow Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Joli Fou Formation": { + "name": { + "en": "Joli Fou Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Judith River Aquifer": { + "name": { + "en": "Judith River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Judith River/Belly River Formation": { + "name": { + "en": "Judith River/Belly River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Jumping Pound SST Member": { + "name": { + "en": "Jumping Pound SST Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Jurassic Formations": { + "name": { + "en": "Jurassic Formations", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kame Outwash Aquifer Complex": { + "name": { + "en": "Kame Outwash Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Karmutsen Aquifer": { + "name": { + "en": "Karmutsen Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kaskapau Formation": { + "name": { + "en": "Kaskapau Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kawkawa Lake Aquifer": { + "name": { + "en": "Kawkawa Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Keating Aquifer": { + "name": { + "en": "Keating Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Keg River Formation": { + "name": { + "en": "Keg River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kettle Point Hydrogeologic Unit": { + "name": { + "en": "Kettle Point Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kildare Formation": { + "name": { + "en": "Kildare Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kingsvale Aquifer": { + "name": { + "en": "Kingsvale Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kiskatinaw Buried Channel Aquifer": { + "name": { + "en": "Kiskatinaw Buried Channel Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kiskatinaw Glaciodeltaic Overburden Aquifer": { + "name": { + "en": "Kiskatinaw Glaciodeltaic Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kitchener Creek Overburden Aquifer": { + "name": { + "en": "Kitchener Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kleinburg Aquifer": { + "name": { + "en": "Kleinburg Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Koksilah River Valley Aquifer": { + "name": { + "en": "Koksilah River Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Kwinshatin Intertill Aquifer": { + "name": { + "en": "Kwinshatin Intertill Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "La Glace Sandstone Member": { + "name": { + "en": "La Glace Sandstone Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "La Loche Formation AND Basal Red Beds Unit": { + "name": { + "en": "La Loche Formation AND Basal Red Beds Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lacombe Aquitard": { + "name": { + "en": "Lacombe Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lacombe Member": { + "name": { + "en": "Lacombe Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lake Algonquin Sand Aquifer": { + "name": { + "en": "Lake Algonquin Sand Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lake Peel Deltaic Aquifer": { + "name": { + "en": "Lake Peel Deltaic Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lake Schomberg and Algonquin Aquifer": { + "name": { + "en": "Lake Schomberg and Algonquin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lake Schomberg and Algonquin Aquitard": { + "name": { + "en": "Lake Schomberg and Algonquin Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lancaster-Cornwall Aquifer": { + "name": { + "en": "Lancaster-Cornwall Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Langdale/Hopkins Aquifer": { + "name": { + "en": "Langdale/Hopkins Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Langdale/Hopkins Landing Aquifer": { + "name": { + "en": "Langdale/Hopkins Landing Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Langley Upland Aquifer": { + "name": { + "en": "Langley Upland Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Langley Upland Intertill Aquifer": { + "name": { + "en": "Langley Upland Intertill Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LD Basal Till": { + "name": { + "en": "LD Basal Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LD Local Aquifers": { + "name": { + "en": "LD Local Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LD Lower Aquifer": { + "name": { + "en": "LD Lower Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LD Middle Till": { + "name": { + "en": "LD Middle Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LD Upper Till": { + "name": { + "en": "LD Upper Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lea Park Formation": { + "name": { + "en": "Lea Park Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Leamington Aquifer": { + "name": { + "en": "Leamington Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Leduc Formation": { + "name": { + "en": "Leduc Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lenses of sand and gravel": { + "name": { + "en": "Lenses of sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lincoln Aquifer": { + "name": { + "en": "Lincoln Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Little Qualicum River Aquifer": { + "name": { + "en": "Little Qualicum River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Local Aquifer 2": { + "name": { + "en": "Local Aquifer 2", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Local Aquitard 1": { + "name": { + "en": "Local Aquitard 1", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lookout Ridge Aquifer": { + "name": { + "en": "Lookout Ridge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Łots'an Aquifer": { + "name": { + "en": "Łots'an Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Bearpaw Formation": { + "name": { + "en": "Lower Bearpaw Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Belly River Formation": { + "name": { + "en": "Lower Belly River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Brazeau Member": { + "name": { + "en": "Lower Brazeau Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Bridge Creek Valley Aquifer System": { + "name": { + "en": "Lower Bridge Creek Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Bridge Creek Valley Bedrock Aquifer": { + "name": { + "en": "Lower Bridge Creek Valley Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Brougham Aquifer": { + "name": { + "en": "Lower Brougham Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Cassidy Aquifer": { + "name": { + "en": "Lower Cassidy Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Catfish Creek Till Aquitard": { + "name": { + "en": "Lower Catfish Creek Till Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Cherryville Aquifer": { + "name": { + "en": "Lower Cherryville Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Chinguacousy Aquifer": { + "name": { + "en": "Lower Chinguacousy Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Coalspur Member": { + "name": { + "en": "Lower Coalspur Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Coquihalla Canyon Aquifer": { + "name": { + "en": "Lower Coquihalla Canyon Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Cowichan River A Aquifer": { + "name": { + "en": "Lower Cowichan River A Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Cowichan River C Aquifer": { + "name": { + "en": "Lower Cowichan River C Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Erie Phase Aquifer": { + "name": { + "en": "Lower Erie Phase Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Erie Phase Aquitard": { + "name": { + "en": "Lower Erie Phase Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Gates River Aquifer": { + "name": { + "en": "Lower Gates River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Lac la Hache Valley Bedrock Aquifer": { + "name": { + "en": "Lower Lac la Hache Valley Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Lea Park Formation": { + "name": { + "en": "Lower Lea Park Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Loon River Formation": { + "name": { + "en": "Lower Loon River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Lotsberg Formation": { + "name": { + "en": "Lower Lotsberg Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Markham Aquifer": { + "name": { + "en": "Lower Markham Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Maryhill Till": { + "name": { + "en": "Lower Maryhill Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Merritt Aquifer": { + "name": { + "en": "Lower Merritt Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Montney Formation": { + "name": { + "en": "Lower Montney Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Nechako River Aquifer": { + "name": { + "en": "Lower Nechako River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Nicola Aquifer": { + "name": { + "en": "Lower Nicola Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Nicola Outwash Aquifer": { + "name": { + "en": "Lower Nicola Outwash Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Ordovician OR Cambrian Strata": { + "name": { + "en": "Lower Ordovician OR Cambrian Strata", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Scollard Member": { + "name": { + "en": "Lower Scollard Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Shaftesbury Formation": { + "name": { + "en": "Lower Shaftesbury Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Shuswap Deep Confined": { + "name": { + "en": "Lower Shuswap Deep Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Shuswap River Confined": { + "name": { + "en": "Lower Shuswap River Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Thorncliffe Aquifer": { + "name": { + "en": "Lower Thorncliffe Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Thorncliffe Aquitard": { + "name": { + "en": "Lower Thorncliffe Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Unionville Aquifer": { + "name": { + "en": "Lower Unionville Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Victoria Aquifer": { + "name": { + "en": "Lower Victoria Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Wapiti Member": { + "name": { + "en": "Lower Wapiti Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lower Willow Creek Member": { + "name": { + "en": "Lower Willow Creek Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lowland Aquifer Complex": { + "name": { + "en": "Lowland Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lumby-Lower Aquifer": { + "name": { + "en": "Lumby-Lower Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lumby-Upper Aquifer": { + "name": { + "en": "Lumby-Upper Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lundbreck Formation": { + "name": { + "en": "Lundbreck Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mabou Group": { + "name": { + "en": "Mabou Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mackinaw Interstadial Deposits": { + "name": { + "en": "Mackinaw Interstadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Majeau Lake Formation": { + "name": { + "en": "Majeau Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Major buried sand and gravel": { + "name": { + "en": "Major buried sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Malahat Ridge Aquifer": { + "name": { + "en": "Malahat Ridge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Malcolm Island Aquifer": { + "name": { + "en": "Malcolm Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mannville Group": { + "name": { + "en": "Mannville Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Maple Aquifer": { + "name": { + "en": "Maple Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mara Aquifer Aquifer": { + "name": { + "en": "Mara Aquifer Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Marble Hill Unconsolidated Aquifer": { + "name": { + "en": "Marble Hill Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Marie Creek Formation": { + "name": { + "en": "Marie Creek Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Markdale Aquifer": { + "name": { + "en": "Markdale Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Marshybank Formation": { + "name": { + "en": "Marshybank Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Marshybank Member": { + "name": { + "en": "Marshybank Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Masset Aquifer": { + "name": { + "en": "Masset Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "McDougall Creek Deltaic Aquifer": { + "name": { + "en": "McDougall Creek Deltaic Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "McMillan Island Aquifer": { + "name": { + "en": "McMillan Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "McMurray Formation": { + "name": { + "en": "McMurray Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Meaford Aquifer": { + "name": { + "en": "Meaford Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Medicine Hat Formation": { + "name": { + "en": "Medicine Hat Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Medicine Hat Member": { + "name": { + "en": "Medicine Hat Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Meguma SuperGroup": { + "name": { + "en": "Meguma SuperGroup", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Meltwater Channel Hydrogeologic Unit": { + "name": { + "en": "Meltwater Channel Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mennon Formation": { + "name": { + "en": "Mennon Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Erie Phase Aquifer": { + "name": { + "en": "Middle Erie Phase Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Maryhill Till": { + "name": { + "en": "Middle Maryhill Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Merritt Aquifer": { + "name": { + "en": "Middle Merritt Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Montney Formation": { + "name": { + "en": "Middle Montney Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Red Beds Formation": { + "name": { + "en": "Middle Red Beds Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Thorncliffe Aquifer": { + "name": { + "en": "Middle Thorncliffe Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Thorncliffe Aquitard": { + "name": { + "en": "Middle Thorncliffe Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Middle Waterloo Moraine Aquifer & Equivalents": { + "name": { + "en": "Middle Waterloo Moraine Aquifer & Equivalents", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Milk River Aquifer": { + "name": { + "en": "Milk River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Milk River Formation": { + "name": { + "en": "Milk River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mill Bay Aquifer": { + "name": { + "en": "Mill Bay Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Minesing Basin Transgressive Deposits": { + "name": { + "en": "Minesing Basin Transgressive Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mirabel Aquifer": { + "name": { + "en": "Mirabel Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mission Creek Aquifer": { + "name": { + "en": "Mission Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Monteith Formation": { + "name": { + "en": "Monteith Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Montney Halfway Beatton Bedrock Aquifer": { + "name": { + "en": "Montney Halfway Beatton Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Montney Turbidite": { + "name": { + "en": "Montney Turbidite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Montrose Bedrock Aquifer": { + "name": { + "en": "Montrose Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Morien Group": { + "name": { + "en": "Morien Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Morrin Member": { + "name": { + "en": "Morrin Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Albert Aquifer Complex": { + "name": { + "en": "Mount Albert Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Ozzard Bedrock West Aquifer": { + "name": { + "en": "Mount Ozzard Bedrock West Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Ozzard, Bedrock Southeast": { + "name": { + "en": "Mount Ozzard, Bedrock Southeast", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Ozzard, Unconsolidated": { + "name": { + "en": "Mount Ozzard, Unconsolidated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Tom Bedrock": { + "name": { + "en": "Mount Tom Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Tom Bedrock Aquifer": { + "name": { + "en": "Mount Tom Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mount Tom Unconsolidated": { + "name": { + "en": "Mount Tom Unconsolidated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muriel Lake": { + "name": { + "en": "Muriel Lake", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Murrayville AC Aquifer": { + "name": { + "en": "Murrayville AC Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Murrayville B Aquifer": { + "name": { + "en": "Murrayville B Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskeg Formation": { + "name": { + "en": "Muskeg Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskeg Lower Anhydrite Member": { + "name": { + "en": "Muskeg Lower Anhydrite Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskiki Formation": { + "name": { + "en": "Muskiki Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskiki Formation OR Kaskapau Formation": { + "name": { + "en": "Muskiki Formation OR Kaskapau Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskiki Member": { + "name": { + "en": "Muskiki Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskwa Formation": { + "name": { + "en": "Muskwa Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskwa River Alluvial Aquifer": { + "name": { + "en": "Muskwa River Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskwa-Fort Nelson Buried Valley Aquifer": { + "name": { + "en": "Muskwa-Fort Nelson Buried Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muskwa-Fort Nelson Glaciofluvial Aquifer": { + "name": { + "en": "Muskwa-Fort Nelson Glaciofluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nanaimo Group Aquifer, Campbell River to Courtney": { + "name": { + "en": "Nanaimo Group Aquifer, Campbell River to Courtney", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nanaimo Lowlands Aquifer": { + "name": { + "en": "Nanaimo Lowlands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NE of White Rock A Aquifer": { + "name": { + "en": "NE of White Rock A Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NE of White Rock B Aquifer": { + "name": { + "en": "NE of White Rock B Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nechako Buried Valley Aquifer": { + "name": { + "en": "Nechako Buried Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nelson Overburden Aquifer": { + "name": { + "en": "Nelson Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Newmarket Till": { + "name": { + "en": "Newmarket Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Newton Upland Aquifer": { + "name": { + "en": "Newton Upland Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Niagra-on-the-Lake Aquifer": { + "name": { + "en": "Niagra-on-the-Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nicomekl-Serpentine Aquifer": { + "name": { + "en": "Nicomekl-Serpentine Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nicomen Slough Aquifer": { + "name": { + "en": "Nicomen Slough Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nikanassin Formation": { + "name": { + "en": "Nikanassin Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Niobrara Formation": { + "name": { + "en": "Niobrara Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nissouri Stadial Deposits": { + "name": { + "en": "Nissouri Stadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nivek Aquifer": { + "name": { + "en": "Nivek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nomad Member": { + "name": { + "en": "Nomad Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Norfolk Sand Plain Aquifer": { + "name": { + "en": "Norfolk Sand Plain Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Norns Creek Overburden Aquifer": { + "name": { + "en": "Norns Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Campbell River Bedrock": { + "name": { + "en": "North Campbell River Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Campbell River Unconsolidated": { + "name": { + "en": "North Campbell River Unconsolidated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Castlegar Bedrock Aquifer": { + "name": { + "en": "North Castlegar Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Central Saanich Aquifer": { + "name": { + "en": "North Central Saanich Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Hope Aquifer": { + "name": { + "en": "North Hope Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Houston Bedrock": { + "name": { + "en": "North Houston Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Mountain Formation": { + "name": { + "en": "North Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Nechako Terrace Bedrock Aquifer": { + "name": { + "en": "North Nechako Terrace Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North Salt Spring Island Aquifer": { + "name": { + "en": "North Salt Spring Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "North-Central Salt Spring Island Aquifer": { + "name": { + "en": "North-Central Salt Spring Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Northern Halfway Beatton Bedrock Aquifer": { + "name": { + "en": "Northern Halfway Beatton Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Northern Lac la Hache Aquifer System": { + "name": { + "en": "Northern Lac la Hache Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Northwest Halfway-Beatton Bedrock Aquifer": { + "name": { + "en": "Northwest Halfway-Beatton Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Northwest of Clearbrook Aquifer": { + "name": { + "en": "Northwest of Clearbrook Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Notre Dame Aquifer": { + "name": { + "en": "Notre Dame Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "O Avenue Aquifer": { + "name": { + "en": "O Avenue Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "O'Keefe Basal": { + "name": { + "en": "O'Keefe Basal", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "O'Keefe Unconfined Aquifer": { + "name": { + "en": "O'Keefe Unconfined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oak Ridges Moraine Aquifer": { + "name": { + "en": "Oak Ridges Moraine Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Obed Mountain Formation": { + "name": { + "en": "Obed Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Odanah Member": { + "name": { + "en": "Odanah Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Odanah Shale Aquifer": { + "name": { + "en": "Odanah Shale Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Okanagan Landing Deep Confined": { + "name": { + "en": "Okanagan Landing Deep Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Okanagan Valley Aquifer": { + "name": { + "en": "Okanagan Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oldcastle Aquifer": { + "name": { + "en": "Oldcastle Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oldman Formation": { + "name": { + "en": "Oldman Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Opabin Member": { + "name": { + "en": "Opabin Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Orangeville Aquifer Complex": { + "name": { + "en": "Orangeville Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Orby Head Formation": { + "name": { + "en": "Orby Head Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oro Moraine Aquifer Complex": { + "name": { + "en": "Oro Moraine Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oro-Medonte Aquifer": { + "name": { + "en": "Oro-Medonte Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Osoyoos West Aquifer": { + "name": { + "en": "Osoyoos West Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ostracod Beds Member": { + "name": { + "en": "Ostracod Beds Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ottawa Group Hydrogeologic Unit": { + "name": { + "en": "Ottawa Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Owl Creek Aquifer": { + "name": { + "en": "Owl Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Owl Ridge Aquifer": { + "name": { + "en": "Owl Ridge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oyster River Aquifer": { + "name": { + "en": "Oyster River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pacheedaht Aquifer": { + "name": { + "en": "Pacheedaht Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paddy Formation": { + "name": { + "en": "Paddy Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pakowki Formation": { + "name": { + "en": "Pakowki Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paldi-Deep Aquifer": { + "name": { + "en": "Paldi-Deep Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paleozoic Carbonate rock formations, Ordovician to Devonian": { + "name": { + "en": "Paleozoic Carbonate rock formations, Ordovician to Devonian", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paris Aquifer": { + "name": { + "en": "Paris Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paris moraine Aquitard": { + "name": { + "en": "Paris moraine Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paskapoo Formation": { + "name": { + "en": "Paskapoo Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paskapoo Formation Aquifer": { + "name": { + "en": "Paskapoo Formation Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paterson Overburden Aquifer": { + "name": { + "en": "Paterson Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Paul's Basin Aquifer": { + "name": { + "en": "Paul's Basin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Peace River Formation": { + "name": { + "en": "Peace River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Peace-Valley Aquifer System": { + "name": { + "en": "Peace-Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pelican Formation": { + "name": { + "en": "Pelican Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pelican Mountain Formation": { + "name": { + "en": "Pelican Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pense Formation": { + "name": { + "en": "Pense Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pickering Aquifer": { + "name": { + "en": "Pickering Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pictou Group": { + "name": { + "en": "Pictou Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pike Lake Formation": { + "name": { + "en": "Pike Lake Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pineview Aquifer": { + "name": { + "en": "Pineview Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Plantagenet Aquifer": { + "name": { + "en": "Plantagenet Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Porcupine Hills Formation": { + "name": { + "en": "Porcupine Hills Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Porcupine Hills Formation Aquifers": { + "name": { + "en": "Porcupine Hills Formation Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port Bruce Phase Aquitard": { + "name": { + "en": "Port Bruce Phase Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port Bruce Stadial Deposits": { + "name": { + "en": "Port Bruce Stadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port Clements Aquifer": { + "name": { + "en": "Port Clements Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port Colborne Aquifer": { + "name": { + "en": "Port Colborne Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port Huron Stadial Deposits": { + "name": { + "en": "Port Huron Stadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port McNeill East Bedrock Aquifer": { + "name": { + "en": "Port McNeill East Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port McNeill East Unconsolidated": { + "name": { + "en": "Port McNeill East Unconsolidated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port McNeill West Bedrock": { + "name": { + "en": "Port McNeill West Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Port McNeill West Unconsolidated": { + "name": { + "en": "Port McNeill West Unconsolidated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Portneuf Aquifer": { + "name": { + "en": "Portneuf Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pottery Road Formation": { + "name": { + "en": "Pottery Road Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pouce Coupe Member": { + "name": { + "en": "Pouce Coupe Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pouce Coupe Overburden Aquifer": { + "name": { + "en": "Pouce Coupe Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pouce Creek Bedrock Aquifer": { + "name": { + "en": "Pouce Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Powers Ck Deltaic Aquifer": { + "name": { + "en": "Powers Ck Deltaic Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Prairie Evaporite Formation": { + "name": { + "en": "Prairie Evaporite Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pre-Canning Aquifers": { + "name": { + "en": "Pre-Canning Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pre-Canning Aquitard": { + "name": { + "en": "Pre-Canning Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Pre-Catfish Aquifers": { + "name": { + "en": "Pre-Catfish Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Precambrian Hydrogeologic Unit": { + "name": { + "en": "Precambrian Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Precambrian rocks": { + "name": { + "en": "Precambrian rocks", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Precambrian to Model Base": { + "name": { + "en": "Precambrian to Model Base", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Priceville Aquifer": { + "name": { + "en": "Priceville Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Prophet River Alluvial Aquifer": { + "name": { + "en": "Prophet River Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Puntledge/ Cumberland Aquifer": { + "name": { + "en": "Puntledge/ Cumberland Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Puskwaskau Formation": { + "name": { + "en": "Puskwaskau Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Puslinch Aquifer": { + "name": { + "en": "Puslinch Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quadra Central Bedrock Aquifer": { + "name": { + "en": "Quadra Central Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quadra South Bedrock Aquifer": { + "name": { + "en": "Quadra South Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Queenston Hydrogeologic Unit": { + "name": { + "en": "Queenston Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quinsam to Stories Beach Aquifer": { + "name": { + "en": "Quinsam to Stories Beach Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ravenscrag Formation": { + "name": { + "en": "Ravenscrag Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ravenscrag to Eastend Undifferentiated": { + "name": { + "en": "Ravenscrag to Eastend Undifferentiated", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rawlings Lake Aquifer": { + "name": { + "en": "Rawlings Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Red Deer River channel complex": { + "name": { + "en": "Red Deer River channel complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Regional Aquifer 3": { + "name": { + "en": "Regional Aquifer 3", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Regional Aquitard 3": { + "name": { + "en": "Regional Aquitard 3", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Richelieu-Yamaska Aquifer": { + "name": { + "en": "Richelieu-Yamaska Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Richibucto Formation": { + "name": { + "en": "Richibucto Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rideau Front Aquifer": { + "name": { + "en": "Rideau Front Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Riding Mountain/Pierre Shale Formation": { + "name": { + "en": "Riding Mountain/Pierre Shale Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Roberts Creek Aquifer": { + "name": { + "en": "Roberts Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rockcliffe Hydrogeologic Unit": { + "name": { + "en": "Rockcliffe Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rockland Aquifer": { + "name": { + "en": "Rockland Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rosebery Aquifer": { + "name": { + "en": "Rosebery Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rundle Group": { + "name": { + "en": "Rundle Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ryder Upland A Aquifer": { + "name": { + "en": "Ryder Upland A Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ryder Upland B Aquifer": { + "name": { + "en": "Ryder Upland B Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ryder Upland C Aquifer": { + "name": { + "en": "Ryder Upland C Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Saint-Maurice Aquifer": { + "name": { + "en": "Saint-Maurice Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salina Hydrogeologic Unit": { + "name": { + "en": "Salina Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salmo River Bedrock Aquifer": { + "name": { + "en": "Salmo River Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salmo River Overburden Aquifer": { + "name": { + "en": "Salmo River Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salmon River Aquifer": { + "name": { + "en": "Salmon River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salmon River-Lower Aquifer": { + "name": { + "en": "Salmon River-Lower Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Salmon River-Upper Aquifer": { + "name": { + "en": "Salmon River-Upper Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sand Dunes Aquifer": { + "name": { + "en": "Sand Dunes Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandilands Aquifer": { + "name": { + "en": "Sandilands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandspit-Haida Gwaii Aquifer": { + "name": { + "en": "Sandspit-Haida Gwaii Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sardis-Vedder Aquifer": { + "name": { + "en": "Sardis-Vedder Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sarsfield Aquifer": { + "name": { + "en": "Sarsfield Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sayward-Salmon River Aquifer": { + "name": { + "en": "Sayward-Salmon River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Scarborough Formation": { + "name": { + "en": "Scarborough Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Schomberg Aquifer Complex": { + "name": { + "en": "Schomberg Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Schooler Creek Group": { + "name": { + "en": "Schooler Creek Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Scollard Formation": { + "name": { + "en": "Scollard Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sechelt/Wakefield Creek Aquifer": { + "name": { + "en": "Sechelt/Wakefield Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Second White Specks Formation": { + "name": { + "en": "Second White Specks Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Second White Specks/Favel Formation": { + "name": { + "en": "Second White Specks/Favel Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sediment Above Bedrock": { + "name": { + "en": "Sediment Above Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Seton Portage Aquifer": { + "name": { + "en": "Seton Portage Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shaftesbury Formation": { + "name": { + "en": "Shaftesbury Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shannon Lake Aquifer": { + "name": { + "en": "Shannon Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shawnigan Lake Aquifer": { + "name": { + "en": "Shawnigan Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shawnigan Lake/Cobble Hill/Mill Bay Aquifer": { + "name": { + "en": "Shawnigan Lake/Cobble Hill/Mill Bay Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sheridan Lake Aquifer": { + "name": { + "en": "Sheridan Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shuswap Highlands Aquifer": { + "name": { + "en": "Shuswap Highlands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Silurian": { + "name": { + "en": "Silurian", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Simcoe Group Hydrogeologic Unit": { + "name": { + "en": "Simcoe Group Hydrogeologic Unit", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Similkameen River Aquifer": { + "name": { + "en": "Similkameen River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sinkut Mountain North Surficial Aquifer": { + "name": { + "en": "Sinkut Mountain North Surficial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Skidgate/Queen Charlotte Aquifer": { + "name": { + "en": "Skidgate/Queen Charlotte Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Slave Point Formation": { + "name": { + "en": "Slave Point Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Smoky Group": { + "name": { + "en": "Smoky Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sooke-Metchosin Aquifer": { + "name": { + "en": "Sooke-Metchosin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Castlegar Bedrock Aquifer": { + "name": { + "en": "South Castlegar Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Central Elgin Aquifer": { + "name": { + "en": "South Central Elgin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Fraser Lake Bedrock Aquifer": { + "name": { + "en": "South Fraser Lake Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Fraser River Delta Aquifer": { + "name": { + "en": "South Fraser River Delta Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South London Aquifer": { + "name": { + "en": "South London Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Nation Aquifer": { + "name": { + "en": "South Nation Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Nechako Terrace Bedrock Aquifer": { + "name": { + "en": "South Nechako Terrace Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South of Aldergrove Aquifer": { + "name": { + "en": "South of Aldergrove Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South of Hopington Aquifer": { + "name": { + "en": "South of Hopington Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South of Murrayville AC Aquifer": { + "name": { + "en": "South of Murrayville AC Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South of Murrayville B Aquifer": { + "name": { + "en": "South of Murrayville B Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Quadra Unconsolidated Aquifer": { + "name": { + "en": "South Quadra Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Salt Spring Island Aquifer": { + "name": { + "en": "South Salt Spring Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Valemont Aquifer": { + "name": { + "en": "South Valemont Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Vanderhoof Unconsolidated Aquifer": { + "name": { + "en": "South Vanderhoof Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Vernon Confined Aquifer": { + "name": { + "en": "South Vernon Confined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South Vernon Unconfined Aquifer": { + "name": { + "en": "South Vernon Unconfined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "South-Central Salt Spring Island Aquifer": { + "name": { + "en": "South-Central Salt Spring Island Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Southern Horse Lake Aquifer System Aquifer": { + "name": { + "en": "Southern Horse Lake Aquifer System Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spallumcheen Basal Confined Aquifer": { + "name": { + "en": "Spallumcheen Basal Confined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spallumcheen Confined": { + "name": { + "en": "Spallumcheen Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spallumcheen Unconfined Aquifer": { + "name": { + "en": "Spallumcheen Unconfined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spences Bridge Aquifer": { + "name": { + "en": "Spences Bridge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sperling Aquifer": { + "name": { + "en": "Sperling Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spirit River Formation": { + "name": { + "en": "Spirit River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Spius Creek West of Canford Aquifer": { + "name": { + "en": "Spius Creek West of Canford Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. Catharines Aquifer": { + "name": { + "en": "St. Catharines Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. George Aquifers": { + "name": { + "en": "St. George Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. Martin Aquifer": { + "name": { + "en": "St. Martin Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. Mary River Formation": { + "name": { + "en": "St. Mary River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. Mathieu Aquifer": { + "name": { + "en": "St. Mathieu Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "St. Thomas Moraine Local Aquifers": { + "name": { + "en": "St. Thomas Moraine Local Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stavely Aquifer": { + "name": { + "en": "Stavely Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stellako Unconsolidated Aquifer": { + "name": { + "en": "Stellako Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stirling Group": { + "name": { + "en": "Stirling Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stoddart Group": { + "name": { + "en": "Stoddart Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Strathmore Member": { + "name": { + "en": "Strathmore Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stumbles Creek Aquifer": { + "name": { + "en": "Stumbles Creek Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stumbles Creek Confined": { + "name": { + "en": "Stumbles Creek Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stump Lake": { + "name": { + "en": "Stump Lake", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Stump Lake Bedrock": { + "name": { + "en": "Stump Lake Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sugar Lake Aquifer": { + "name": { + "en": "Sugar Lake Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sulphur Point Formation": { + "name": { + "en": "Sulphur Point Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sumas Prairie Aquifer": { + "name": { + "en": "Sumas Prairie Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sumas Prairie North Aquifer": { + "name": { + "en": "Sumas Prairie North Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunchild Aquifer": { + "name": { + "en": "Sunchild Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunkay Formation": { + "name": { + "en": "Sunkay Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunningdale/Glenmerry Bedrock Aquifer": { + "name": { + "en": "Sunningdale/Glenmerry Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunnybrae Aquifer": { + "name": { + "en": "Sunnybrae Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunnybrook Drift": { + "name": { + "en": "Sunnybrook Drift", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunset Creek Overburden Aquifer": { + "name": { + "en": "Sunset Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sunset Prairie Bedrock Aquifer": { + "name": { + "en": "Sunset Prairie Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Swan Hills Formation": { + "name": { + "en": "Swan Hills Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Swan Lake Confined Aquifer": { + "name": { + "en": "Swan Lake Confined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Swan Lake Unconfined": { + "name": { + "en": "Swan Lake Unconfined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Swan River Formation": { + "name": { + "en": "Swan River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sweetwater Bedrock Aquifer": { + "name": { + "en": "Sweetwater Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tachick Lake Unconsolidated Aquifer": { + "name": { + "en": "Tachick Lake Unconsolidated Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Talik regions": { + "name": { + "en": "Talik regions", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tappen Aquifer": { + "name": { + "en": "Tappen Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thick and extensive unconfined sand and gravel": { + "name": { + "en": "Thick and extensive unconfined sand and gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thin unconfined sand": { + "name": { + "en": "Thin unconfined sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thistle Member": { + "name": { + "en": "Thistle Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thornbury Aquifer": { + "name": { + "en": "Thornbury Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thorncliffe Formation": { + "name": { + "en": "Thorncliffe Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thornill Aquifer": { + "name": { + "en": "Thornill Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Thornton Sand Aquifer": { + "name": { + "en": "Thornton Sand Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tillsonburg Aquifer": { + "name": { + "en": "Tillsonburg Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tlell Aquifer": { + "name": { + "en": "Tlell Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tolman Member": { + "name": { + "en": "Tolman Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Topley Bedrock Aquifer": { + "name": { + "en": "Topley Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Trail Townsite Overburden Aquifer": { + "name": { + "en": "Trail Townsite Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Trail/Warfield Bedrock Aquifer": { + "name": { + "en": "Trail/Warfield Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Trinity Valley Aquifer": { + "name": { + "en": "Trinity Valley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tsawwassen Aquifer": { + "name": { + "en": "Tsawwassen Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tsolum River, North of Courtney Aquifer": { + "name": { + "en": "Tsolum River, North of Courtney Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tuhok Confined Aquifer": { + "name": { + "en": "Tuhok Confined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tuhok Unconfined Aquifer": { + "name": { + "en": "Tuhok Unconfined Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Turtle Mountain Formation": { + "name": { + "en": "Turtle Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Two Creeks Interstadial Deposits": { + "name": { + "en": "Two Creeks Interstadial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tyconnell Formation": { + "name": { + "en": "Tyconnell Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ucluelet Peninsula Aquifer": { + "name": { + "en": "Ucluelet Peninsula Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ucluelet, Lost Shoe Aquifer": { + "name": { + "en": "Ucluelet, Lost Shoe Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Ucluelet, Lost Show Aquifer": { + "name": { + "en": "Ucluelet, Lost Show Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unicola Aquifer": { + "name": { + "en": "Unicola Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unit A Exposed Bedrock and Drift-Poor Areas": { + "name": { + "en": "Unit A Exposed Bedrock and Drift-Poor Areas", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unit B Till and Ribbed Moraine Deposits": { + "name": { + "en": "Unit B Till and Ribbed Moraine Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unit C Ablation Drift Deposits": { + "name": { + "en": "Unit C Ablation Drift Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unit D Glaciomarine and Marine Deposits and Glaciolacustrine Deposits": { + "name": { + "en": "Unit D Glaciomarine and Marine Deposits and Glaciolacustrine Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unit E Glaciofluvial Deposits": { + "name": { + "en": "Unit E Glaciofluvial Deposits", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upland Aquifer Complex": { + "name": { + "en": "Upland Aquifer Complex", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper and Lower Gloucester Aquifers": { + "name": { + "en": "Upper and Lower Gloucester Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper and Lower Nepean-Kemptville Aquifers": { + "name": { + "en": "Upper and Lower Nepean-Kemptville Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper and Lower West Nepean Aquifers": { + "name": { + "en": "Upper and Lower West Nepean Aquifers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Aquifer 1": { + "name": { + "en": "Upper Aquifer 1", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Bearpaw Formation": { + "name": { + "en": "Upper Bearpaw Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Brazeau Member": { + "name": { + "en": "Upper Brazeau Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Bridge Creek Bedrock Aquifer": { + "name": { + "en": "Upper Bridge Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Bridge Creek Valley Aquifer System": { + "name": { + "en": "Upper Bridge Creek Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Brougham Aquifer": { + "name": { + "en": "Upper Brougham Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Bulkley Alluvial Aquifer": { + "name": { + "en": "Upper Bulkley Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Catfish Creek Till Aquitard": { + "name": { + "en": "Upper Catfish Creek Till Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Cherryville Aquifer": { + "name": { + "en": "Upper Cherryville Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Chinguacousy Aquifer": { + "name": { + "en": "Upper Chinguacousy Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Coalspur Member": { + "name": { + "en": "Upper Coalspur Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Cretaceous sands Aquifer": { + "name": { + "en": "Upper Cretaceous sands Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Erie Phase Aquifer": { + "name": { + "en": "Upper Erie Phase Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Erie Phase Aquitard": { + "name": { + "en": "Upper Erie Phase Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Gates River Aquifer": { + "name": { + "en": "Upper Gates River Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Halfway Bedrock Aquifer": { + "name": { + "en": "Upper Halfway Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Lac la Hache Valley Bedrock Aquifer": { + "name": { + "en": "Upper Lac la Hache Valley Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Lea Park Formation": { + "name": { + "en": "Upper Lea Park Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Loon Formation": { + "name": { + "en": "Upper Loon Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Lotsberg Formation": { + "name": { + "en": "Upper Lotsberg Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Markham Aquifer": { + "name": { + "en": "Upper Markham Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Maryhill Till": { + "name": { + "en": "Upper Maryhill Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Merritt Aquifer": { + "name": { + "en": "Upper Merritt Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Montney Formation": { + "name": { + "en": "Upper Montney Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Ordovician strata": { + "name": { + "en": "Upper Ordovician strata", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Scollard Member": { + "name": { + "en": "Upper Scollard Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Shaftesbury Formation": { + "name": { + "en": "Upper Shaftesbury Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Thames Aquifer": { + "name": { + "en": "Upper Thames Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Thorncliffe Aquifer": { + "name": { + "en": "Upper Thorncliffe Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Thorncliffe Aquitard": { + "name": { + "en": "Upper Thorncliffe Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Unionville Aquifer": { + "name": { + "en": "Upper Unionville Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Victoria Aquifer": { + "name": { + "en": "Upper Victoria Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Wapiti Member": { + "name": { + "en": "Upper Wapiti Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Waterloo Moraine Aquifer": { + "name": { + "en": "Upper Waterloo Moraine Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Upper Willow Creek Member": { + "name": { + "en": "Upper Willow Creek Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Valens Outwash Aquifer": { + "name": { + "en": "Valens Outwash Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Valley View-Dawson Creek Bedrock Aquifer": { + "name": { + "en": "Valley View-Dawson Creek Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vanderhoof Alluvial Aquifer": { + "name": { + "en": "Vanderhoof Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vedder Crossing Aquifer": { + "name": { + "en": "Vedder Crossing Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vedder Mountain NW Bedrock Aquifer": { + "name": { + "en": "Vedder Mountain NW Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vedder Mountain SE Bedrock Aquifer": { + "name": { + "en": "Vedder Mountain SE Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vellore Aquifer": { + "name": { + "en": "Vellore Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Verger Member": { + "name": { + "en": "Verger Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vermillion River Formation": { + "name": { + "en": "Vermillion River Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vernon Confined": { + "name": { + "en": "Vernon Confined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vernon Unconfined": { + "name": { + "en": "Vernon Unconfined", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Viking Formation": { + "name": { + "en": "Viking Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Viking/Newcastle Formation": { + "name": { + "en": "Viking/Newcastle Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Vimy Member": { + "name": { + "en": "Vimy Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wabamun Group": { + "name": { + "en": "Wabamun Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wabiskaw Member": { + "name": { + "en": "Wabiskaw Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wainfleet Aquifer": { + "name": { + "en": "Wainfleet Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Walker Hook Aquifer": { + "name": { + "en": "Walker Hook Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Walkerton Aquifer": { + "name": { + "en": "Walkerton Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wallaceburg Aquifer": { + "name": { + "en": "Wallaceburg Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wallacetown Formation": { + "name": { + "en": "Wallacetown Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wapiabi Formation": { + "name": { + "en": "Wapiabi Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wapiti Formation": { + "name": { + "en": "Wapiti Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wark-Colquitz Aquifer": { + "name": { + "en": "Wark-Colquitz Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Warman Formation": { + "name": { + "en": "Warman Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Waterloo Moraine Aquifer": { + "name": { + "en": "Waterloo Moraine Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Waterways Formation": { + "name": { + "en": "Waterways Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Watson Creek Valley Aquifer System": { + "name": { + "en": "Watson Creek Valley Aquifer System", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Watt Mountain Formation": { + "name": { + "en": "Watt Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wentworth Aquifer": { + "name": { + "en": "Wentworth Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wentworth Till/Aquitard": { + "name": { + "en": "Wentworth Till/Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Arrow Creek Overburden Aquifer": { + "name": { + "en": "West Arrow Creek Overburden Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Carlton Aquifer": { + "name": { + "en": "West Carlton Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Cluculz Lake Bedrock Aquifer": { + "name": { + "en": "West Cluculz Lake Bedrock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Creston Aquifer": { + "name": { + "en": "West Creston Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Langley Aquifer": { + "name": { + "en": "West Langley Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West of Aldergrove Aquifer": { + "name": { + "en": "West of Aldergrove Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West of Merritt Aquifer": { + "name": { + "en": "West of Merritt Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Saanich Road Aquifer": { + "name": { + "en": "West Saanich Road Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "West Sechelt Aquifer": { + "name": { + "en": "West Sechelt Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Westgate Formation": { + "name": { + "en": "Westgate Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Westwold Aquifer": { + "name": { + "en": "Westwold Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "White Rock Aquifer": { + "name": { + "en": "White Rock Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whitecourt Mountain Formation": { + "name": { + "en": "Whitecourt Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whitemud Formation": { + "name": { + "en": "Whitemud Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whitemud Member": { + "name": { + "en": "Whitemud Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whittlesey Aquifer": { + "name": { + "en": "Whittlesey Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whittlesey Clay/Aquitard": { + "name": { + "en": "Whittlesey Clay/Aquitard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Whittlesey Sand": { + "name": { + "en": "Whittlesey Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Willow Creek Alluvial Aquifer": { + "name": { + "en": "Willow Creek Alluvial Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Willow Creek Formation": { + "name": { + "en": "Willow Creek Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Willow Creek Formation Aquifer": { + "name": { + "en": "Willow Creek Formation Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Windsor Group": { + "name": { + "en": "Windsor Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Winnipeg Formation": { + "name": { + "en": "Winnipeg Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Winnipegosis Formation": { + "name": { + "en": "Winnipegosis Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Winterburn Group": { + "name": { + "en": "Winterburn Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wood Mountain and Mount Washington Aquifer": { + "name": { + "en": "Wood Mountain and Mount Washington Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wood Mountain Formation": { + "name": { + "en": "Wood Mountain Formation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Woodbridge Aquifer": { + "name": { + "en": "Woodbridge Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Yonge Street Aquifer": { + "name": { + "en": "Yonge Street Aquifer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "York Till": { + "name": { + "en": "York Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Zama Member": { + "name": { + "en": "Zama Member", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/AquiferUnitPorosityType.json b/schemas/data/src/locales/AquiferUnitPorosityType.json new file mode 100644 index 00000000..cd7a7f56 --- /dev/null +++ b/schemas/data/src/locales/AquiferUnitPorosityType.json @@ -0,0 +1,52 @@ +{ + "name": { + "en": "AquiferUnitPorosityType", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Fractured": { + "name": { + "en": "Fractured", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Granular": { + "name": { + "en": "Granular", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Karstic": { + "name": { + "en": "Karstic", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mixed": { + "name": { + "en": "Mixed", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/CharacteristicName.json b/schemas/data/src/locales/CharacteristicName.json index f64e2146..5b95ff59 100644 --- a/schemas/data/src/locales/CharacteristicName.json +++ b/schemas/data/src/locales/CharacteristicName.json @@ -15777,6 +15777,26 @@ "en": null, "fr": null } + }, + "Water level elevation": { + "name": { + "en": "Water level elevation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Water level in well, depth from a reference point": { + "name": { + "en": "Water level in well, depth from a reference point", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/LithologyType.json b/schemas/data/src/locales/LithologyType.json new file mode 100644 index 00000000..ecef62ed --- /dev/null +++ b/schemas/data/src/locales/LithologyType.json @@ -0,0 +1,722 @@ +{ + "name": { + "en": "LithologyType", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Andesite": { + "name": { + "en": "Andesite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Anthropogenic material": { + "name": { + "en": "Anthropogenic material", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Basalt": { + "name": { + "en": "Basalt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock": { + "name": { + "en": "Bedrock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Fractured": { + "name": { + "en": "Bedrock, Fractured", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Interbedded sandstone/carbonate": { + "name": { + "en": "Bedrock, Interbedded sandstone/carbonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Interbedded sandstone/shale": { + "name": { + "en": "Bedrock, Interbedded sandstone/shale", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Interbedded sandstone/shale/carbonate": { + "name": { + "en": "Bedrock, Interbedded sandstone/shale/carbonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Interbedded sediments": { + "name": { + "en": "Bedrock, Interbedded sediments", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Interbedded siltstone/carbonate/gypsum": { + "name": { + "en": "Bedrock, Interbedded siltstone/carbonate/gypsum", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Soluble Carbonate - Karst": { + "name": { + "en": "Bedrock, Soluble Carbonate - Karst", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bedrock, Soluble gypsum/dolomite with shale interb": { + "name": { + "en": "Bedrock, Soluble gypsum/dolomite with shale interb", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Carbonate sedimentary rock": { + "name": { + "en": "Carbonate sedimentary rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clay": { + "name": { + "en": "Clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clayey Sand": { + "name": { + "en": "Clayey Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Clayey Silt": { + "name": { + "en": "Clayey Silt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Coal": { + "name": { + "en": "Coal", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Conglomerate": { + "name": { + "en": "Conglomerate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Diamicton": { + "name": { + "en": "Diamicton", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Diorite": { + "name": { + "en": "Diorite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dolomite": { + "name": { + "en": "Dolomite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Evaporite": { + "name": { + "en": "Evaporite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gabbro": { + "name": { + "en": "Gabbro", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gneiss": { + "name": { + "en": "Gneiss", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Granite": { + "name": { + "en": "Granite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gravel": { + "name": { + "en": "Gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gravelly Mud": { + "name": { + "en": "Gravelly Mud", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gravelly Muddy Sand": { + "name": { + "en": "Gravelly Muddy Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gravelly Sand": { + "name": { + "en": "Gravelly Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Gravely Sediment": { + "name": { + "en": "Gravely Sediment", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Humus": { + "name": { + "en": "Humus", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Igneous rock": { + "name": { + "en": "Igneous rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded gravel and clay": { + "name": { + "en": "Interbedded gravel and clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded gravel and sand": { + "name": { + "en": "Interbedded gravel and sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded gravel and silt": { + "name": { + "en": "Interbedded gravel and silt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded sand and clay": { + "name": { + "en": "Interbedded sand and clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded sand and silt": { + "name": { + "en": "Interbedded sand and silt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Interbedded silt and clay": { + "name": { + "en": "Interbedded silt and clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Limestone": { + "name": { + "en": "Limestone", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Marble": { + "name": { + "en": "Marble", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Metamorphic rock": { + "name": { + "en": "Metamorphic rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Mud": { + "name": { + "en": "Mud", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muddy Gravel": { + "name": { + "en": "Muddy Gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muddy Sand": { + "name": { + "en": "Muddy Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Muddy Sandy Gravel": { + "name": { + "en": "Muddy Sandy Gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Organic material": { + "name": { + "en": "Organic material", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Peat": { + "name": { + "en": "Peat", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Plutonic rock": { + "name": { + "en": "Plutonic rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quartzite": { + "name": { + "en": "Quartzite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Rhyolite": { + "name": { + "en": "Rhyolite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sand": { + "name": { + "en": "Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sand, Silt, Clay": { + "name": { + "en": "Sand, Silt, Clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandstone": { + "name": { + "en": "Sandstone", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandy Clay": { + "name": { + "en": "Sandy Clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandy Gravel": { + "name": { + "en": "Sandy Gravel", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandy Mud": { + "name": { + "en": "Sandy Mud", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sandy Silt": { + "name": { + "en": "Sandy Silt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Schist": { + "name": { + "en": "Schist", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Sedimentary rock": { + "name": { + "en": "Sedimentary rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Shale": { + "name": { + "en": "Shale", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Silt": { + "name": { + "en": "Silt", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Siltite": { + "name": { + "en": "Siltite", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Silty Clay": { + "name": { + "en": "Silty Clay", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Silty Sand": { + "name": { + "en": "Silty Sand", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Slate": { + "name": { + "en": "Slate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Soil": { + "name": { + "en": "Soil", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Till": { + "name": { + "en": "Till", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unconsolidated material": { + "name": { + "en": "Unconsolidated material", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Undifferentiated sediment": { + "name": { + "en": "Undifferentiated sediment", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unknown material": { + "name": { + "en": "Unknown material", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Volcanic rock": { + "name": { + "en": "Volcanic rock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json b/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json index 17c8bbe5..653d655d 100644 --- a/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json +++ b/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json @@ -239,6 +239,16 @@ "en": null, "fr": null } + }, + "OTHER": { + "name": { + "en": "OTHER", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/MonitoringLocationVerticalCollectionMethod.json b/schemas/data/src/locales/MonitoringLocationVerticalCollectionMethod.json new file mode 100644 index 00000000..f07c0ac4 --- /dev/null +++ b/schemas/data/src/locales/MonitoringLocationVerticalCollectionMethod.json @@ -0,0 +1,192 @@ +{ + "name": { + "en": "MonitoringLocationVerticalCollectionMethod", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Altimetry": { + "name": { + "en": "Altimetry", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Classical Surveying Techniques": { + "name": { + "en": "Classical Surveying Techniques", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Digital Elevation Model": { + "name": { + "en": "Digital Elevation Model", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Carrier Phase Kinematic Relative Position": { + "name": { + "en": "GPS Carrier Phase Kinematic Relative Position", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Carrier Phase Static Relative Position": { + "name": { + "en": "GPS Carrier Phase Static Relative Position", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Code (Pseudo Range) Differential": { + "name": { + "en": "GPS Code (Pseudo Range) Differential", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Code (Pseudo Range) Precise Position": { + "name": { + "en": "GPS Code (Pseudo Range) Precise Position", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Code (Pseudo Range) Standard Position (SA Off)": { + "name": { + "en": "GPS Code (Pseudo Range) Standard Position (SA Off)", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "GPS Code (Pseudo Range) Standard Position (SA On)": { + "name": { + "en": "GPS Code (Pseudo Range) Standard Position (SA On)", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Handheld GPS - Positioning Method Unspecified": { + "name": { + "en": "Handheld GPS - Positioning Method Unspecified", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Leveling-Non Bench Mark Control Points": { + "name": { + "en": "Leveling-Non Bench Mark Control Points", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Light Detection And Ranging (LiDAR)": { + "name": { + "en": "Light Detection And Ranging (LiDAR)", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Other": { + "name": { + "en": "Other", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Photogrammetric": { + "name": { + "en": "Photogrammetric", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Precise Leveling-Bench Mark": { + "name": { + "en": "Precise Leveling-Bench Mark", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Topographic Map Interpolation": { + "name": { + "en": "Topographic Map Interpolation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Trigonometric Leveling": { + "name": { + "en": "Trigonometric Leveling", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unknown": { + "name": { + "en": "Unknown", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/MonitoringLocationVerticalCoordinateReferenceSystem.json b/schemas/data/src/locales/MonitoringLocationVerticalCoordinateReferenceSystem.json new file mode 100644 index 00000000..4ec0e482 --- /dev/null +++ b/schemas/data/src/locales/MonitoringLocationVerticalCoordinateReferenceSystem.json @@ -0,0 +1,72 @@ +{ + "name": { + "en": "MonitoringLocationVerticalCoordinateReferenceSystem", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "CGVD2013": { + "name": { + "en": "CGVD2013", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "CGVD28": { + "name": { + "en": "CGVD28", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NAVD88": { + "name": { + "en": "NAVD88", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NGVD29": { + "name": { + "en": "NGVD29", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "OTHER": { + "name": { + "en": "OTHER", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "UNKWN": { + "name": { + "en": "UNKWN", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/SampleCollectionEquipmentName.json b/schemas/data/src/locales/SampleCollectionEquipmentName.json index 00e48e3f..3eec8633 100644 --- a/schemas/data/src/locales/SampleCollectionEquipmentName.json +++ b/schemas/data/src/locales/SampleCollectionEquipmentName.json @@ -417,6 +417,76 @@ "en": null, "fr": null } + }, + "Air line": { + "name": { + "en": "Air line", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bailer": { + "name": { + "en": "Bailer", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hydrasleeve": { + "name": { + "en": "Hydrasleeve", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Snap sampler": { + "name": { + "en": "Snap sampler", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Tubing": { + "name": { + "en": "Tubing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Water level meter": { + "name": { + "en": "Water level meter", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Wetted tape": { + "name": { + "en": "Wetted tape", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } } \ No newline at end of file diff --git a/schemas/data/src/locales/SampleCollectionMethodContext.json b/schemas/data/src/locales/SampleCollectionMethodContext.json new file mode 100644 index 00000000..ca77288e --- /dev/null +++ b/schemas/data/src/locales/SampleCollectionMethodContext.json @@ -0,0 +1,132 @@ +{ + "name": { + "en": "SampleCollectionMethodContext", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "AB_AEP": { + "name": { + "en": "AB_AEP", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "AB_AGS": { + "name": { + "en": "AB_AGS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ASTM": { + "name": { + "en": "ASTM", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "BC_MOE": { + "name": { + "en": "BC_MOE", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ISO": { + "name": { + "en": "ISO", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NL_ECCC": { + "name": { + "en": "NL_ECCC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NS_DNR": { + "name": { + "en": "NS_DNR", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NS_ECC": { + "name": { + "en": "NS_ECC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "PROPRIETARY": { + "name": { + "en": "PROPRIETARY", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "QC_MOE": { + "name": { + "en": "QC_MOE", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "USDOI/USGS": { + "name": { + "en": "USDOI/USGS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "USEPA": { + "name": { + "en": "USEPA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/SampleCondition.json b/schemas/data/src/locales/SampleCondition.json new file mode 100644 index 00000000..0d05bd88 --- /dev/null +++ b/schemas/data/src/locales/SampleCondition.json @@ -0,0 +1,72 @@ +{ + "name": { + "en": "SampleCondition", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Flowing": { + "name": { + "en": "Flowing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Nearby site is being pumped or pumped recently": { + "name": { + "en": "Nearby site is being pumped or pumped recently", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Static, before pumping or purging": { + "name": { + "en": "Static, before pumping or purging", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "The site has been recently pumped or purged": { + "name": { + "en": "The site has been recently pumped or purged", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "The site is being pumped for water use": { + "name": { + "en": "The site is being pumped for water use", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unspecified": { + "name": { + "en": "Unspecified", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/WellIDContext.json b/schemas/data/src/locales/WellIDContext.json new file mode 100644 index 00000000..d272ffde --- /dev/null +++ b/schemas/data/src/locales/WellIDContext.json @@ -0,0 +1,142 @@ +{ + "name": { + "en": "WellIDContext", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "AB": { + "name": { + "en": "AB", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "BC": { + "name": { + "en": "BC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "MB": { + "name": { + "en": "MB", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NB": { + "name": { + "en": "NB", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NL": { + "name": { + "en": "NL", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NS": { + "name": { + "en": "NS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "NT": { + "name": { + "en": "NT", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ON": { + "name": { + "en": "ON", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "OTHER": { + "name": { + "en": "OTHER", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "PE": { + "name": { + "en": "PE", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "QC": { + "name": { + "en": "QC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "SK": { + "name": { + "en": "SK", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "YK": { + "name": { + "en": "YK", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file diff --git a/schemas/data/src/locales/WellUseType.json b/schemas/data/src/locales/WellUseType.json new file mode 100644 index 00000000..1f56379d --- /dev/null +++ b/schemas/data/src/locales/WellUseType.json @@ -0,0 +1,172 @@ +{ + "name": { + "en": "WellUseType", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "Aquaculture": { + "name": { + "en": "Aquaculture", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Bottling": { + "name": { + "en": "Bottling", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Dewatering": { + "name": { + "en": "Dewatering", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Domestic": { + "name": { + "en": "Domestic", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Geothermal": { + "name": { + "en": "Geothermal", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Industrial": { + "name": { + "en": "Industrial", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Irrigation": { + "name": { + "en": "Irrigation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Livestock": { + "name": { + "en": "Livestock", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Monitoring - Ambient": { + "name": { + "en": "Monitoring - Ambient", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Monitoring - Other": { + "name": { + "en": "Monitoring - Other", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oil/Gas Production": { + "name": { + "en": "Oil/Gas Production", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Other": { + "name": { + "en": "Other", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Public Supply - Municipal": { + "name": { + "en": "Public Supply - Municipal", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Public Supply - Other": { + "name": { + "en": "Public Supply - Other", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Recharge": { + "name": { + "en": "Recharge", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Test Hole": { + "name": { + "en": "Test Hole", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } + } +} \ No newline at end of file From 1e0c50cbc3b8732ba73f60f67f842b6f73873b29 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 14 May 2026 11:25:44 -0400 Subject: [PATCH 21/51] chore: major version bump (rc) --- CHANGELOG.md | 77 ++++++++++++++++++++++++++++++++++ package-lock.json | 4 +- package.json | 2 +- schemas/data/package-lock.json | 4 +- schemas/data/package.json | 2 +- 5 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e2a10d69 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,77 @@ +# Changelog + +All notable changes to `@datastreamapp/data-schema` are documented in this file. + +The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. + +### Added + +- **Groundwater media** — `Groundwater` added to `ActivityMediaName`, plus 24 new Groundwater-related fields covering well identification, aquifer attributes, well construction depths, sample-collection method, and depth-altitude reference: + - `MonitoringLocationVerticalAccuracyMeasure`, `MonitoringLocationVerticalAccuracyUnit`, `MonitoringLocationVerticalCollectionMethod`, `MonitoringLocationVerticalCoordinateReferenceSystem` + - `WellID`, `WellIDContext`, `WellUseType` + - `AquiferCode`, `AquiferUnitName`, `AquiferType`, `AquiferUnitPorosityType`, `LithologyType` + - `BoreholeDepthMeasure` / `Unit`, `WellDepthMeasure` / `Unit`, `WellOpenIntervalTopMeasure` / `Unit`, `WellOpenIntervalBottomMeasure` / `Unit` + - `ActivityDepthAltitudeReferencePoint`, `ActivityDepthAltitudeReferencePointMeasure`, `ActivityDepthAltitudeReferencePointUnit` + - `SampleCondition`, `SampleCollectionMethodID`, `SampleCollectionMethodContext`, `SampleCollectionMethodName` +- **Groundwater conditional logic rules** (errors block submission): + - `GroundwaterFields-ActivityMediaName-Groundwater` — Groundwater-only fields require `ActivityMediaName` of `Groundwater` or `Porewater`. + - `ActivityMediaName-Groundwater-DepthMeasure` — at least one depth measure required. + - `ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint` — reference point required when depth is reported. + - `CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint` — reference point required for water-level observations. + - `MonitoringLocationType-Well-WellUseType` — well/piezometer locations require `WellUseType`. + - `MonitoringLocationType-Well-SampleCondition` — well/piezometer locations require `SampleCondition` (except continuous time series). +- **Groundwater-related enum additions** (forward-compatible): + - `MonitoringLocationType`: `Borehole`, `Dug Well`, `Multilevel Well`, `Nested Well`, `Other-Ground Water`, `Piezometer`, `Seep`, `Sump`, `Well` + - `MonitoringLocationHorizontalCoordinateReferenceSystem`: `OTHER` + - `MonitoringLocationVerticalUnit`: `ft`, `m` + - `SampleCollectionEquipmentName`: `Air line`, `Bailer`, `Hydrasleeve`, `Snap sampler`, `Tubing`, `Water level meter`, `Wetted tape` + - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` + +### Breaking + +- **Top-level `$id`s now end in `.json`**, mirroring filesystem paths so JSON Schema URL resolution works without filesystem fallbacks. Consumers must update `$ref`s when upgrading: + - `https://datastream.org/schema/data/backend` → `…/backend.json` + - `…/frontend` → `…/frontend.json` + - `…/primary` → `…/primary.json` + - `…/extract` → `…/extract.json` + - `…/quality-control` → `…/quality-control.json` + - `…/definitions` → `…/definitions.json` +- **All value-file `$id`s renamed** from `.loose.json` / `.strict.json` to `.legacy.json` / `.primary.json` (≈50 files each). Any `$ref` to a `values/*.loose.json` or `values/*.strict.json` URL must be updated. +- **Misplaced `$id`s corrected** (drifted from their filesystem paths): + - `logic/ResultUnit-Salinity.json` (was `quality-control/ResultUnit-Salinity.json`) + - `quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json` (was `…MinimumMeasure-Minimum.json`) + +## [2.29.0] - 2026-03-12 + +### Added + +- Q1 2026 WQX update: new values across `CharacteristicName`, `CharacteristicGroup`, `ActivityType`, `MeasurementUnit`, `ResultDetectionQuantitationLimitUnit`, `ResultUnit`, `SampleCollectionEquipmentName`. + +## [2.0.0] - 2020-07-26 + +- Rewrite build process to: + - Pull the latest version of WQX values and simplify future updates + - Improve maintainability and audit control +- `MonitoringLocationID` is now required +- `MonitoringLocationWaterbody` is now deprecated +- `MethodSpeciation` has new conditional requirements +- `ActivityMediaName` has new allowed values: `Ambient Air`, `Surface Water Sediment`, `Pore Water`, `Ocean Water` +- Additional checks to prevent the common issues people run into surrounding Dissolved Oxygen, Hardness, and others. See `src/logic/ResultValue-*.json`. + +## [1.0.0] - 2019-10-12 + +Starting from US EPA WQX: + +- `ProjectName` → `DatasetName` to be more generic. +- `ActivityDepthHeightMeasure` — added maximum restriction due to only recording water samples. +- `ResultAnalyticalMethodName` — added for readability. +- `ResultAnalyticalMethodID` — removed allowed values. +- `LaboratorySampleID` — added to improve metadata. +- `AnalysisStartTimeZone` — changed format to follow ISO 8601 (e.g. `-0600`). +- `ActivityStartTimeZone` / `ActivityEndTimeZone` — removed because they can be inferred from the location. +- `State` and `County` → `MonitoringLocationRegion` to allow for a broader meaning that can be applied internationally. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3f9c277d..abc811f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastream/schema-monorepo", - "version": "2.29.0", + "version": "3.0.0-rc.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastream/schema-monorepo", - "version": "2.29.0", + "version": "3.0.0-rc.0", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index a13043a7..196a881f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastream/schema-monorepo", - "version": "2.29.0", + "version": "3.0.0-rc.0", "description": "DataStream Water Quality Exchange (WQX): JSON Schema and JSON Table Schema for DataStream", "private": true, "type": "module", diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index 164d91d4..b6bee734 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastreamapp/data-schema", - "version": "2.29.0", + "version": "3.0.0-rc.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastreamapp/data-schema", - "version": "2.29.0", + "version": "3.0.0-rc.0", "license": "MIT", "dependencies": { "wqx": "3.0.267" diff --git a/schemas/data/package.json b/schemas/data/package.json index c1f2d217..ba48f10e 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -1,6 +1,6 @@ { "name": "@datastreamapp/data-schema", - "version": "2.29.0", + "version": "3.0.0-rc.0", "description": "DataStream Water Quality Data Schema", "publishConfig": { "cache": "~/.npm", From 72b19fb22c6ca6c77b2038b70d350c6a9ccef15a Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 10 Jun 2026 11:49:06 -0400 Subject: [PATCH 22/51] feat: add new error message for continuous activity type check --- schemas/data/src/locales/en-CA.ftl | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 8ba437f7..ee46c7ed 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -154,3 +154,4 @@ qc-MonitoringLocationType-Duplicate = Multiple MonitoringLocationTypes are used qc-MonitoringLocationHorizontalCoordinateReferenceSystem-Duplicate = Multiple MonitoringLocationHorizontalCoordinateReferenceSystems are used with the same MonitoringLocationID qc-ActivityTypeContinuous = When there are >= 24 observations of the same type on the same day, ActivityType is expected to equal 'Field Msr/Obs-Continuous Time Series' error-ActivityMediaName-Groundwater-Mixed = ActivityMediaName must be 'Groundwater' or 'Porewater' on every row when either is reported. Submit other media as a separate dataset. +error-ActivityType-Continuous-Mixed = Continuous time-series data should be uploaded in a separate dataset from discrete (single point-in-time) data From 982ecca05992d9988deaa707a34bfd894a5af005 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Thu, 18 Jun 2026 14:42:21 -0700 Subject: [PATCH 23/51] Create ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json Use same logic as existing warning and apply only to surface water media --- ...me-ActivityDepthHeightMeasure-Maximum.json | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 schemas/data/src/logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json diff --git a/schemas/data/src/logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json b/schemas/data/src/logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json new file mode 100644 index 00000000..b63e96bf --- /dev/null +++ b/schemas/data/src/logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json @@ -0,0 +1,35 @@ +{ + "$id": "https://datastream.org/schema/data/logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json", + "title": "ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + "description": "", + "errorMessage": "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityMediaName": { + "enum": [ + "Ocean Water", + "Rainwater", + "Stormwater", + "Subsurface Soil/Sediment", + "Surface Water", + "Surface Water Sediment" + ] + }, + "ActivityDepthHeightMeasure": true + }, + "required": ["ActivityMediaName", "ActivityDepthHeightMeasure"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityDepthHeightMeasure": { + "type": "number", + "maximum": 0 + } + }, + "required": ["ActivityDepthHeightMeasure"] + } +} From 3574caf9aab916d0e3d0352e9bed38da1306f18b Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Fri, 19 Jun 2026 14:07:09 -0700 Subject: [PATCH 24/51] Create ActivityType subset, deprecate unused, add new --- schemas/data/src/addition/ActivityType.json | 1 - schemas/data/src/subset/ActivityType.json | 38 ++++++++++++++ .../data/src/subtraction/ActivityType.json | 52 ------------------- 3 files changed, 38 insertions(+), 53 deletions(-) create mode 100644 schemas/data/src/subset/ActivityType.json delete mode 100644 schemas/data/src/subtraction/ActivityType.json diff --git a/schemas/data/src/addition/ActivityType.json b/schemas/data/src/addition/ActivityType.json index 28c5eeb4..f68ce210 100644 --- a/schemas/data/src/addition/ActivityType.json +++ b/schemas/data/src/addition/ActivityType.json @@ -1,4 +1,3 @@ [ - "Quality Control", "Unspecified" ] diff --git a/schemas/data/src/subset/ActivityType.json b/schemas/data/src/subset/ActivityType.json new file mode 100644 index 00000000..014c8e0b --- /dev/null +++ b/schemas/data/src/subset/ActivityType.json @@ -0,0 +1,38 @@ +[ + "Field Msr/Obs", + "Field Msr/Obs-Continuous Time Series", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", + "Field Msr/Obs-Portable Data Logger", + "Quality Control Field Replicate Msr/Obs", + "Quality Control Field Replicate Portable Data Logger", + "Quality Control Field Sample Equipment Rinsate Blank", + "Quality Control Sample-Blind Duplicate", + "Quality Control Sample-Field Blank", + "Quality Control Sample-Field Replicate", + "Quality Control Sample-Lab Blank", + "Quality Control Sample-Lab Duplicate", + "Quality Control Sample-Lab Matrix Spike", + "Quality Control Sample-Lab Re-Analysis", + "Quality Control Sample-Lab Spike", + "Quality Control Sample-Lab Split", + "Quality Control Sample-Lab Surrogate Control Standard", + "Quality Control Sample-Lab Surrogate Control Standard Duplicate", + "Quality Control Sample-Reference Sample", + "Quality Control Sample-Trip Blank", + "Quality Control-Calibration Check", + "Sample-Composite With Parents", + "Sample-Composite Without Parents", + "Sample-Depletion Replicate", + "Sample-Field Split", + "Sample-Integrated Flow Proportioned", + "Sample-Integrated Horizontal and Vertical Composite Profile", + "Sample-Integrated Horizontal Profile", + "Sample-Integrated Time Series", + "Sample-Integrated Vertical Profile", + "Sample-Other", + "Sample-Positive Control", + "Sample-Routine", + "Unspecified" +] \ No newline at end of file diff --git a/schemas/data/src/subtraction/ActivityType.json b/schemas/data/src/subtraction/ActivityType.json deleted file mode 100644 index 86b2eb86..00000000 --- a/schemas/data/src/subtraction/ActivityType.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - "Field Msr/Obs-Habitat Assessment", - "Field Msr/Obs-Incidental", - "Quality Control", - "Quality Control Field Calibration Check", - "Quality Control Field Replicate Habitat Assessment", - "Quality Control Field Replicate Sample-Composite", - "Quality Control Field Replicate Sample-Field Subsample", - "Quality Control Lab Sample Equipment Rinsate Blank", - "Quality Control Sample-Archive Blank", - "Quality Control Sample-Blind", - "Quality Control Sample-Concurrent Replicate", - "Quality Control Sample-Equipment Blank", - "Quality Control Sample-Field Ambient Conditions Blank", - "Quality Control Sample-Integrated Time Series-Ambient Blank", - "Quality Control Sample-Integrated Time Series-Concurrent Replicate", - "Quality Control Sample-Integrated Time Series-Sequential Replicate", - "Quality Control Sample-Integrated Time Series-Split Replicate", - "Quality Control Sample-Integrated Time Series-SplitConcurrentReplicate", - "Quality Control Sample-Integrated Time Series-SplitSequentialReplicate", - "Quality Control Sample-Integrated Time Series-Unspecified", - "Quality Control Sample-Integrated Time Series-Unspecified Replicate", - "Quality Control Sample-Lab Continuing Calibration Verification", - "Quality Control Sample-Lab Control Sample/Blank Spike", - "Quality Control Sample-Lab Control Sample/Blank Spike Duplicate", - "Quality Control Sample-Lab Control Standard", - "Quality Control Sample-Lab Control Standard Duplicate", - "Quality Control Sample-Lab Initial Calib Certified Reference Material", - "Quality Control Sample-Lab Initial Calibration Verification", - "Quality Control Sample-Lab Matrix Spike Duplicate", - "Quality Control Sample-Lab Spike Duplicate", - "Quality Control Sample-Lab Spike of a Lab Blank", - "Quality Control Sample-Lab Surrogate Method Blank", - "Quality Control Sample-Reference Material", - "Quality Control Sample-Sequential Replicate", - "Quality Control Sample-Source Solution Blank", - "Quality Control Sample-Spike Replicate", - "Quality Control Sample-Spike Solution", - "Quality Control Sample-Spike, Unspecified Type", - "Quality Control Sample-Split Concurrent Replicate", - "Quality Control Sample-Split Replicate", - "Quality Control Sample-Split Sequential Replicate", - "Quality Control Sample-Topical Blank", - "Quality Control Sample-Topical Replicate", - "Quality Control Sample-Topical Spike", - "Quality Control Sample-Unspecified", - "Quality Control Sample-Unspecified Blank", - "Quality Control Sample-Unspecified Replicate", - "Quality Control Sample-Unspecified Topical", - "Sample-Integrated Unspecified Profile", - "Sample-Routine Resample" -] From 02a1e1fd3e351e2dfb6a13903e1e120a59c46f80 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Fri, 19 Jun 2026 14:12:38 -0700 Subject: [PATCH 25/51] Create ResultValueType subset, rm subtraction --- schemas/data/src/subset/ResultValueType.json | 7 +++++++ schemas/data/src/subtraction/ResultValueType.json | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 schemas/data/src/subset/ResultValueType.json delete mode 100644 schemas/data/src/subtraction/ResultValueType.json diff --git a/schemas/data/src/subset/ResultValueType.json b/schemas/data/src/subset/ResultValueType.json new file mode 100644 index 00000000..a789f3d6 --- /dev/null +++ b/schemas/data/src/subset/ResultValueType.json @@ -0,0 +1,7 @@ +[ +"Actual", +"Blank Corrected", +"Calculated", +"Control Adjusted", +"Estimated" +] \ No newline at end of file diff --git a/schemas/data/src/subtraction/ResultValueType.json b/schemas/data/src/subtraction/ResultValueType.json deleted file mode 100644 index ac18ddf8..00000000 --- a/schemas/data/src/subtraction/ResultValueType.json +++ /dev/null @@ -1 +0,0 @@ -["Blank Corrected Calc"] From bb255d3963b9e30b344e07e09a7e75ddac6f1437 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Fri, 19 Jun 2026 14:14:37 -0700 Subject: [PATCH 26/51] Create ResultSampleFraction subset, rm subtraction --- .../data/src/subset/ResultSampleFraction.json | 34 +++++++++++++++++++ .../src/subtraction/ResultSampleFraction.json | 20 ----------- 2 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 schemas/data/src/subset/ResultSampleFraction.json delete mode 100644 schemas/data/src/subtraction/ResultSampleFraction.json diff --git a/schemas/data/src/subset/ResultSampleFraction.json b/schemas/data/src/subset/ResultSampleFraction.json new file mode 100644 index 00000000..ae2e31c4 --- /dev/null +++ b/schemas/data/src/subset/ResultSampleFraction.json @@ -0,0 +1,34 @@ +[ + "Acid Soluble", + "Bioavailable", + "Comb Available", + "Dissolved", + "Extractable", + "Extractable, CaCO3-bound", + "Extractable, exchangeable", + "Extractable, organic-bnd", + "Extractable, other", + "Extractable, oxide-bound", + "Extractable, residual", + "Filterable", + "Filtered", + "Filtered, field", + "Filtered, lab", + "Free Available", + "Inorganic", + "Non-Filterable (Particle)", + "Non-settleable", + "Non-volatile", + "Organic", + "Pot. Dissolved", + "Settleable", + "Supernate", + "Suspended", + "Total", + "Total Recoverable", + "Total Residual", + "Unfiltered", + "Unspecified", + "Vapor", + "Volatile" + ] \ No newline at end of file diff --git a/schemas/data/src/subtraction/ResultSampleFraction.json b/schemas/data/src/subtraction/ResultSampleFraction.json deleted file mode 100644 index ea6425a2..00000000 --- a/schemas/data/src/subtraction/ResultSampleFraction.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - "Bed Sediment", - "Bedload", - "Field", - "Filter/sieve residue", - "Filtered field and/or lab", - "Fixed", - "Leachable", - "Net (Hot)", - "None", - "non-linear function", - "Semivolatile", - "Sieved", - "Strong Acid Diss", - "Total Soluble", - "Unfiltered, field", - "Unfiltered, lab", - "Weak Acid Diss", - "Yield" -] From fc5a950d5b867838ad34bfa487c9642e27f5d9de Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 24 Jun 2026 13:51:38 -0400 Subject: [PATCH 27/51] feat: new EventID field --- CHANGELOG.md | 1 + schemas/data/src/backend.json | 4 ++++ schemas/data/src/definitions.json | 6 ++++++ schemas/data/src/extract.json | 3 +++ schemas/data/src/frontend.json | 3 +++ schemas/data/src/primary.json | 3 +++ schemas/data/src/quality-control.json | 1 + schemas/data/test/format.js | 12 ++++++++++++ schemas/data/test/primary.js | 6 ++++++ schemas/data/test/required.js | 12 ++++++++++++ schemas/data/test/transform.js | 2 ++ 11 files changed, 53 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a10d69..a3be8b42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - `MonitoringLocationVerticalUnit`: `ft`, `m` - `SampleCollectionEquipmentName`: `Air line`, `Bailer`, `Hydrasleeve`, `Snap sampler`, `Tubing`, `Water level meter`, `Wetted tape` - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` +- **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. No conditional logic or validation checks beyond the standard single-line string pattern. ### Breaking diff --git a/schemas/data/src/backend.json b/schemas/data/src/backend.json index 814ca153..6cee8db1 100644 --- a/schemas/data/src/backend.json +++ b/schemas/data/src/backend.json @@ -128,6 +128,10 @@ "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitLoose", "transform": ["trim", "toEnumCase"] }, + "EventID": { + "$ref": "./definitions.json#/definitions/EventID", + "transform": ["trim"] + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeLoose", "transform": ["trim", "toEnumCase"] diff --git a/schemas/data/src/definitions.json b/schemas/data/src/definitions.json index c720a2e7..a720ac23 100644 --- a/schemas/data/src/definitions.json +++ b/schemas/data/src/definitions.json @@ -181,6 +181,12 @@ "WellOpenIntervalBottomUnitLoose": { "$ref": "https://datastream.org/schema/data/values/WellOpenIntervalBottomUnit.legacy.json" }, + "EventID": { + "title": "Event ID", + "description": "A unique identifier supplied by the data contributor, usually corresponding to field sampling events", + "$ref": "#/definitions/string", + "maxLength": 255 + }, "ActivityTypeStrict": { "$ref": "https://datastream.org/schema/data/values/ActivityType.primary.json" }, diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index cd613eab..90e40419 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -106,6 +106,9 @@ "WellOpenIntervalBottomUnit": { "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict" }, + "EventID": { + "$ref": "./definitions.json#/definitions/EventID" + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict" }, diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index ef71ea13..88dd0285 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -124,6 +124,9 @@ "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict", "transform": ["trim", "toEnumCase"] }, + "EventID": { + "$ref": "./definitions.json#/definitions/EventID" + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict", "transform": ["trim", "toEnumCase"] diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index bba274b7..d54da840 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -101,6 +101,9 @@ "WellOpenIntervalBottomUnit": { "$ref": "./definitions.json#/definitions/WellOpenIntervalBottomUnitStrict" }, + "EventID": { + "$ref": "./definitions.json#/definitions/EventID" + }, "ActivityType": { "$ref": "./definitions.json#/definitions/ActivityTypeStrict" }, diff --git a/schemas/data/src/quality-control.json b/schemas/data/src/quality-control.json index 7c2e7bb8..dc506326 100644 --- a/schemas/data/src/quality-control.json +++ b/schemas/data/src/quality-control.json @@ -42,6 +42,7 @@ "WellOpenIntervalTopUnit": true, "WellOpenIntervalBottomMeasure": true, "WellOpenIntervalBottomUnit": true, + "EventID": true, "ActivityType": true, "ActivityMediaName": true, "ActivityStartDate": true, diff --git a/schemas/data/test/format.js b/schemas/data/test/format.js index 2e4b31c7..f5b095dd 100644 --- a/schemas/data/test/format.js +++ b/schemas/data/test/format.js @@ -85,6 +85,8 @@ test("Should reject strings with multiline", async (t) => { 1234`, LaboratorySampleID: `qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-'\" 1234`, + EventID: `qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-'\" + 1234`, }); assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), true); @@ -112,6 +114,7 @@ test("Should reject strings with multiline", async (t) => { checkProperty(validate.errors, "pattern", "LaboratorySampleID"), true, ); + assert.equal(checkProperty(validate.errors, "pattern", "EventID"), true); }); test("Should accept strings-multiline", async (t) => { @@ -675,3 +678,12 @@ test("Should accept SampleCollectionMethodID <= 50 chars", async (t) => { validate({ SampleCollectionMethodID: "x".repeat(50) }); assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodID"), false); }); + +test("Should reject EventID > 255 chars", async (t) => { + validate({ EventID: "x".repeat(256) }); + assert.equal(checkProperty(validate.errors, "maxLength", "EventID"), true); +}); +test("Should accept EventID <= 255 chars", async (t) => { + validate({ EventID: "x".repeat(255) }); + assert.equal(checkProperty(validate.errors, "maxLength", "EventID"), false); +}); diff --git a/schemas/data/test/primary.js b/schemas/data/test/primary.js index 2c33bb9a..98770b31 100644 --- a/schemas/data/test/primary.js +++ b/schemas/data/test/primary.js @@ -139,6 +139,12 @@ test("LaboratorySampleID has maxLength 60", () => { assert.equal(main.properties.LaboratorySampleID.maxLength, 60); }); +test("EventID is text with maxLength 255", () => { + const f = main.properties.EventID; + assert.equal(f.type, "string"); + assert.equal(f.maxLength, 255); +}); + test("ResultComment has maxLength 4000", () => { assert.equal(main.properties.ResultComment.maxLength, 4000); }); diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index 49b2fb93..004c58b3 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -159,6 +159,18 @@ test("Should reject additional headers", async (t) => { ); }); +test("Should treat EventID as an optional, unconditional field", async (t) => { + validate({ EventID: "Spring 2018 survey" }); + // Recognized column — not rejected as an unknown/additional header. + assert.equal( + checkProperty(validate.errors, "unevaluatedProperties", "EventID"), + false, + ); + // Imposes no requirement of its own — never reported as required or as a dependency. + assert.equal(checkProperty(validate.errors, "required", "EventID"), false); + assert.equal(checkProperty(validate.errors, "dependencies", "EventID"), false); +}); + test("Should reject ActivityDepthHeightMeasure AND NOT ActivityDepthHeightUnit", async (t) => { const valid = validate({ ActivityDepthHeightMeasure: true, diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index 12d6ad80..5f04b093 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -65,6 +65,7 @@ test('Should transform values (backend)', async (t) => { ResultValueType: 'actual', ResultStatusID: 'accepted', ResultComment: ' None at this time', + EventID: ' Spring 2018 survey ', ResultAnalyticalMethodID: ' 1', ResultAnalyticalMethodContext: 'APHA', ResultAnalyticalMethodName: ' Alpha', @@ -200,6 +201,7 @@ const crossFlavourFixtures = [ MonitoringLocationLongitude: -114.0708, MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', MonitoringLocationType: 'River/Stream', + EventID: 'Spring 2018 survey', ActivityType: 'Field Msr/Obs', ActivityMediaName: 'Surface Water', ActivityStartDate: '2026-01-15', From c3be5d0ec6b37c151a5fe485ff4a22adf9ddbce7 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:37:56 -0700 Subject: [PATCH 28/51] New characteristics --- .../CharacteristicName-MethodSpeciation.json | 1 + ...icName-StableIsotope-MethodSpeciation.json | 1 + ...acteristicName-ActivityType-Surrogate.json | 6 ++ .../CharacteristicName-MethodSpeciation.json | 1 + .../data/src/subset/CharacteristicName.json | 88 ++++++++++++++++++- 5 files changed, 94 insertions(+), 3 deletions(-) diff --git a/schemas/data/src/logic/CharacteristicName-MethodSpeciation.json b/schemas/data/src/logic/CharacteristicName-MethodSpeciation.json index 7d546a9c..c9a42a29 100644 --- a/schemas/data/src/logic/CharacteristicName-MethodSpeciation.json +++ b/schemas/data/src/logic/CharacteristicName-MethodSpeciation.json @@ -34,6 +34,7 @@ "Organic Nitrogen", "Organic phosphorus", "Orthophosphate", + "Oxygen-17", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", "Phosphorus, hydrolyzable", diff --git a/schemas/data/src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json b/schemas/data/src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json index 2d604162..bb84c95b 100644 --- a/schemas/data/src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json +++ b/schemas/data/src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json @@ -11,6 +11,7 @@ "enum": [ "Nitrogen-15", "Nitrogen-15/Nitrogen-14 ratio", + "Oxygen-17", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", "delta carbon-13/carbon-12", diff --git a/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json b/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json index 77d986d3..bd95caa9 100644 --- a/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json +++ b/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json @@ -32,6 +32,7 @@ "Acenaphthene-d10", "Acenaphthylene-d8", "Acridine-d9", + "Adamantane Carboxylic Acid-D15", "Anilazine", "Atrazine-d5 (ethyl-d5)", "Benzene, 1-bromo-2-(trifluoromethyl)-", @@ -46,6 +47,7 @@ "Chrysene-d12", "Clothianidin-d3", "Cyanazine-d5", + "Decanoic Acid-D19", "Dibenzo(a,h)anthracene-D14", "Dibenzothiophene-D8", "Dimethoate-d6", @@ -53,8 +55,10 @@ "Fenitrothion-d6", "Flonicamid-d3", "Fluoranthene-d10", + "Hexadecanoic Acid-D31", "Indeno[1,2,3-cd]pyrene-d12", "Linuron-d6", + "Lithocholic Acid-D4", "Malathion-d6", "Metolachlor-d6", "Naphthalene-d8", @@ -189,12 +193,14 @@ "Naphthenic Acid, C9H14O2", "Naphthenic Acid, C9H16O2", "Naphthenic Acid, C9H18O2", + "Nitrobenzene-D5", "p-Bromofluorobenzene", "p-Terphenyl-d14", "Parathion-d10", "Perylene-d12", "Phenanthrene-d10", "Phorate-d10", + "Pyrene-d10", "Terbufos-d10", "Terphenyl-d14", "Toluene-d8" diff --git a/schemas/data/src/quality-control/CharacteristicName-MethodSpeciation.json b/schemas/data/src/quality-control/CharacteristicName-MethodSpeciation.json index e6455645..d5f0b11b 100644 --- a/schemas/data/src/quality-control/CharacteristicName-MethodSpeciation.json +++ b/schemas/data/src/quality-control/CharacteristicName-MethodSpeciation.json @@ -50,6 +50,7 @@ "Organic Nitrogen", "Organic phosphorus", "Orthophosphate", + "Oxygen-17", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", "Phosphorus, hydrolyzable", diff --git a/schemas/data/src/subset/CharacteristicName.json b/schemas/data/src/subset/CharacteristicName.json index a633dfcf..ae77033e 100644 --- a/schemas/data/src/subset/CharacteristicName.json +++ b/schemas/data/src/subset/CharacteristicName.json @@ -1,4 +1,4 @@ -[ + [ ".alpha.-Amino-2,3-dihydro-5-methyl-3-oxo-4-isoxazolepropanoic acid", ".alpha.-Endosulfan", ".alpha.-Hexachlorocyclohexane", @@ -6,6 +6,7 @@ ".beta.-Endosulfan", ".beta.-Heptachlor epoxide", ".beta.-Hexachlorocyclohexane", + ".beta.-Sitosterol", ".delta.-Hexachlorocyclohexane", ".gamma.-Hexachlorocyclohexane", ".lambda.-Cyhalothrin", @@ -14,6 +15,7 @@ "1-(3,4-dichlorophenyl)-3-methyl urea", "1-Butanesulfonamide, 1,1,2,2,3,3,4,4,4-nonafluoro-N-methyl-", "1-Butanol", + "1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro-", "1-Heptanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,7-pentadecafluoro-", "1-Methylchrysene", "1-Methylnaphthalene", @@ -82,15 +84,19 @@ "1,3,4,6,7,8-Hexahydro-4,6,6,7,8,8-hexamethylcyclopenta[g]-2-benzopyran", "1,3,5-Trichlorobenzene", "1,3,5-Trimethylbenzene", + "1,4-Dichloro-cis-2-butene", "1,4-Dichlorobenzene-d4", "1,4-Difluorobenzene", + "1,4-Dioxane", "1,4,6,7-Tetramethylnaphthalene", "1,6,7-Trimethylnaphthalene", "1,7-Dimethylfluorene", "1,7-Dimethylphenanthrene", "1,8-Dimethylphenanthrene", "10:2 Fluorotelomer sulfonic acid", + "11-chloroeicosafluoro-3-oxaundecane-1-sulfonic acid", "12-Chlorodehydroabietic acid", + "12,14-Dichlorodehydroabietic acid", "14-Chlorodehydroabietic acid", "17.alpha.-Estradiol", "1H,1H, 2H, 2H-Perfluorodecane sulfonic acid", @@ -159,6 +165,7 @@ "2,4,5-Trichlorophenol", "2,4,5-Trichlorotoluene", "2,4,6-Tribromophenol", + "2,4,6-Trichloroanisole", "2,4,6-Trichlorophenol", "2,4,6-Trinitro-5-tert-butyl-m-xylene", "2,5-Dibromobenzoic Acid", @@ -177,15 +184,24 @@ "3-Methylfluoranthene/Benzo[a]fluorene", "3-Methylphenanthrene", "3-Pyridinecarboxamide, N-(2,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-", + "3-Pyridinecarboxamide, N-(2+A2:A19,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-", "3,3'-Dichlorobenzidine", "3,3',5,5'-Tetrachlorobiphenyl", + "3,4-Dichlorocatechol", "3,4-Dichlorophenol", + "3,4,5-Trichlorocatechol", + "3,4,5-Trichloroguaiacol", "3,4,5-Trichlorophenol", + "3,4,6-Trichlorocatechol", + "3,4,6-Trichloroguaiacol", "3,5-Dichlorobenzoic acid", + "3,5-Dichlorocatechol", "3,5-Dichlorophenol", "3,6-Dimethylphenanthrene", "3:3 Fluorotelomer carboxylate, ion(1-)", "4-Chloro-2-methylphenol", + "4-Chloro-3-nitrobenzotrifluoride", + "4-Chlorocatechol", "4-Hydroxy-chlorothalonil", "4-Methyl-2-pentanol", "4-methyl-6-(2-methyl-5-propan-2-ylphenyl)-2-(5-propan-2-yl-1H-indazol-4-yl)-7,8-dihydro-5H-1,6-naphthyridine", @@ -195,6 +211,10 @@ "4-Nonylphenol triethoxylate", "4,4'-Dibromobiphenyl", "4,4'-Isopropylidenediphenol", + "4,5-Dichlorocatechol", + "4,5-Dichloroveratrole", + "4,5,6-Trichloroguaiacol", + "4,6-Dichloroguaiacol", "4,6-Dimethyldibenzothiophene", "4,6-Dinitro-o-cresol", "5-Methylchrysene/6-Methylchrysene", @@ -205,6 +225,7 @@ "7-Methylbenzo[a]pyrene", "7,12-Dimethylbenz[a]anthracene", "8(14)-Abietenic acid", + "9-Chlorohexadecafluoro-3-oxanonane-1-sulfonate", "9-Methylphenanthrene/4-Methylphenanthrene", "9,10-Dichlorostearic Acid", "Abietic acid", @@ -223,6 +244,7 @@ "Acephate", "Acesulfame", "Acetaldehyde", + "Acetamide, 2-(diethylamino)-N-(2,6-dimethylphenyl)-", "Acetaminophen", "Acetamiprid", "Acetic acid", @@ -232,6 +254,9 @@ "Acifluorfen, sodium salt", "Acridine-d9", "Acridine", + "Acrolein", + "Acrylonitrile", + "Adamantane Carboxylic Acid-D15", "Adenosine triphosphate", "Adsorbable organic halides", "Alachlor", @@ -245,6 +270,7 @@ "Alkalinity, Hydroxide", "Alkalinity, Phenolphthalein (total hydroxide+1/2 carbonate)", "Alkalinity, total", + "Allidochlor", "Allyl chloride", "Aluminum-27", "Aluminum", @@ -258,6 +284,7 @@ "Ammonium 4,8-dioxa-3H-perfluorononanoate", "Ammonium", "Amoxicillin", + "Anatoxin-A", "Anilazine", "Anion/cation ratio", "Anthracene", @@ -265,6 +292,7 @@ "Antimony-125", "Antimony", "Apparent color", + "ar,ar'-Dimethylbiphenyl", "Aroclor 1016", "Aroclor 1221", "Aroclor 1232", @@ -283,12 +311,14 @@ "Aspartame", "Aspirin", "Asulam", + "Atrazine + all metabolites", "Atrazine + N-Dealkylated Metabolites", "Atrazine-d5 (ethyl-d5)", "Atrazine", "Azinphos-ethyl", "Azinphos-methyl", "Azoxystrobin", + "Bacteria, Sulfate reducing", "Bankfull Height", "Bankfull width", "Barium-137", @@ -322,6 +352,7 @@ "BDE-197", "BDE-206", "BDE-207", + "Benalaxyl", "Bendiocarb", "Benfluralin", "Benomyl", @@ -330,6 +361,7 @@ "Benzaldehyde", "Benzene, 1-bromo-2-(trifluoromethyl)-", "Benzene, 1,2-dichloro-4-methyl-", + "Benzene, 1,2,3-trichloro-4,5-dimethoxy-", "Benzene", "Benzeneacetic acid, .alpha.-methyl-4-(2-methylpropyl)-", "Benzidine", @@ -354,6 +386,7 @@ "Benzofluoranthene", "Benzoic acid", "Benzoylecgonine", + "Benzoylprop-ethyl", "Beryllium-9", "Beryllium", "Beta Cypermethrin", @@ -389,7 +422,9 @@ "Bromophos", "Bromopropylate", "Bromoxynil", + "BTEX plus styrene, Total", "BTEX, Total", + "Bupirimate", "Butachlor", "Butanoic acid, 4-(4-chloro-2-methylphenoxy)-, ethyl ester", "Butralin", @@ -406,8 +441,10 @@ "C1-Fluoranthenes/pyrenes", "C1-Phenanthrenes/anthracenes", "C10-C16 Hydrocarbons", + "C10-C50 Hydrocarbons", "C16-C21 Hydrocarbons", "C16-C34 Hydrocarbons", + "C16-C50 Hydrocarbons", "C2-Benzo[a]anthracenes/chrysenes", "C2-Benzofluoranthenes/benzopyrenes", "C2-Biphenyls", @@ -446,9 +483,11 @@ "Carbamazepine", "Carbaryl-d7", "Carbaryl", + "Carbazole", "Carbofuran", "Carbon Dioxide, free CO2", "Carbon dioxide", + "Carbon disulfide", "Carbon monoxide", "Carbon tetrachloride", "Carbon-13", @@ -511,6 +550,7 @@ "Chlorpyrifos", "Chlorsulfuron", "Chlorthal-dimethyl", + "Chlorthiamid", "Chlorthiophos", "Cholesterol", "Chromium-52", @@ -551,8 +591,10 @@ "Copper-63", "Copper-65", "Copper", + "Coprostanol", "Corrosion & scaling control, Ryznar Stability Index", "Cotinine", + "Cresol", "Crufomate", "Cryptosporidium", "Cumene", @@ -568,6 +610,7 @@ "Cyclohexanesulfonic acid, 1,2,2,3,3,4,5,5,6,6-decafluoro-4-(1,1,2,2,2-pentafluoroethyl)-, potassium salt (1:1)", "Cyfluthrin", "Cyhalothrin", + "Cyprazine", "Cyprodinil", "Day, ice off", "Day, ice on", @@ -577,9 +620,12 @@ "DDT/DDD/DDE, sum of p,p' isomers", "Decabromodiphenyl ether", "Decachlorobiphenyl", + "Decanoic Acid-D19", "Decanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-", "Decanoic acid, 4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-pentadecafluoro-", + "Decanoic acid", "Dehydroabietic acid", + "Dehydronifedipine", "Delta boron-11/boron-10", "delta carbon-13/carbon-12", "Delta nitrogen-15/nitrogen-14", @@ -632,6 +678,7 @@ "Diclofenac, 4-hydroxy", "Diclofenac", "Diclofop methyl", + "Diclofop", "Dicofol", "Dicrotophos", "Didecyl dimethyl ammonium chloride", @@ -651,6 +698,7 @@ "Dimethyl phthalate", "Dimethyl selenoxide", "Dimethyl sulfone", + "Dimethylnaphthalene", "Dinitramine", "Dinoseb", "Dinotefuran", @@ -666,6 +714,7 @@ "Diuron", "Docosanoic acid", "Dodecanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,12-heneicosafluoro-", + "Dysprosium", "Eicosanoic acid", "Endosulfan sulfate", "Endosulfan", @@ -676,18 +725,21 @@ "Enterococcus", "epi-Coprostanol", "EPTC-d14", + "Erbium", "Erythromycin", "Escherichia coli", "Estradiol", "Estriol", "Estrone", "Ethalfluralin", + "Ethanamine, 2-(diphenylmethoxy)-N,N-dimethyl-", "Ethanol", "Ethinyl estradiol", "Ethion", "Ethofumesate", "Ethoprop", "Ethyl acetate", + "Ethyl methacrylate", "Ethylbenzene", "Ethylene dibromide", "Ethylene glycol", @@ -707,6 +759,7 @@ "Fenoprofen", "Fenoxaprop-ethyl", "Fenoxaprop-P-ethyl", + "Fenoxaprop", "Fensulfothion", "Fenthion", "Fenvalerate", @@ -715,6 +768,8 @@ "Filamentous Algae Cover", "Fixed dissolved solids", "Fixed suspended solids", + "Flamprop-isopropyl", + "Flamprop-methyl", "Flonicamid-d3", "Flonicamid", "Flow", @@ -755,6 +810,7 @@ "Gold", "Grain size, coarse sand (>=630 to 2000 um)", "Gran acid neutralizing capacity", + "Gross alpha radioactivity (ref std unspecified)", "Gross alpha radioactivity, (Americium-241 ref std)", "Gross beta radioactivity, (Cesium-137 ref std)", "Hafnium", @@ -769,8 +825,10 @@ "Heptachlor", "Heptachlorodibenzo-p-dioxin", "Heptachlorodibenzofuran", + "Heptadecanoic acid", "Heptafluorobutyric acid", "Heptanal", + "Heptenophos", "Heterotrophic bacteria", "Hexachlorobenzene", "Hexachlorobutadiene", @@ -780,6 +838,7 @@ "Hexachlorodibenzofuran", "Hexachloroethane", "Hexaconazole", + "Hexadecanoic Acid-D31", "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-", "Hexafluoropropylene oxide dimer acid ammonium salt", "Hexafluoropropylene oxide dimer acid", @@ -831,6 +890,7 @@ "Iprodione", "Iridium", "Iron-57", + "Iron-related bacteria", "Iron", "Isobutanol", "Isobutyraldehyde", @@ -851,15 +911,18 @@ "Lead", "Light attenuation, depth at 99%", "Light, photosynthetic active radiation (PAR)", + "Light, Photosynthetic Photon Flux Density (PPFD)", "Light, underwater extinction coefficient (K)", "Light, underwater incident", "Lignoceric Acid", "Lincomycin", "Linoleic acid", + "Linolenic acid", "Linuron-d6", "Linuron", "Lithium-7", "Lithium", + "Lithocholic Acid-D4", "Lutetium", "m and p-Cresol", "m- & p-Chlorophenol", @@ -887,6 +950,7 @@ "Metalaxyl-M", "Metalaxyl", "Metconazole", + "Methacrylonitrile", "Methamidophos", "Methamphetamine", "Methane", @@ -901,15 +965,21 @@ "Methoxychlor", "Methoxycitronellal", "Methyl bromide", + "Methyl ethyl ketone", + "Methyl iodide", "Methyl isobutyl ketone", "Methyl mercaptan", + "Methyl methacrylate", "Methyl parathion", "Methyl parathion", "Methyl Selenium", "Methyl tert-butyl ether", "Methylacenaphthene", + "Methylanthracene", "Methylarsonic acid", + "Methylbiphenyl", "Methylchrysene", + "Methylcyclohexane", "Methyldibenzothiophene", "Methylene chloride", "Methylfluorene", @@ -1114,6 +1184,7 @@ "Nitrate", "Nitrilotriacetic acid", "Nitrite", + "Nitrobenzene-D5", "Nitrobenzene", "Nitrofen", "Nitrogen dioxide", @@ -1132,6 +1203,7 @@ "o-Cresol", "o-Dichlorobenzene", "O-Ethyl O-(p-nitrophenyl) phenylphosphonothioate", + "O-Methylpodocarpic Acid", "o-Nitrophenol", "o-Xylene, mixt. with m-xylene and p-xylene", "o-Xylene", @@ -1165,6 +1237,7 @@ "Oxycarboxin", "Oxychlordane", "Oxyfluorfen", + "Oxygen-17", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", "p-Bromofluorobenzene", @@ -1214,14 +1287,17 @@ "Pentoxifylline", "Perfluoro-1-decanesulfonamide", "Perfluoro-1-dodecanesulfonate", + "Perfluoro-2-propoxypropanoate", "Perfluoro-3-methoxypropanoic acid", "Perfluoro-3,6-dioxaheptanoic acid", "Perfluoro(4-methoxybutanoic) acid", "Perfluorobutanesulfonic acid", "Perfluorobutylsulfonamide", + "Perfluorodecanesulfonate", "Perfluorodecanoic acid", "Perfluorododecanoic acid", "Perfluoroheptane sulfonamide", + "Perfluoroheptanesulfonate", "Perfluoroheptanoic acid", "perfluorohexane sulfonamido propyl amine", "Perfluorohexane sulfonamidopropyl ammonium", @@ -1236,6 +1312,7 @@ "Perfluorooctanesulfonamide", "Perfluorooctanesulfonamido amine oxide", "Perfluorooctanesulfonamido betaine", + "Perfluorooctanesulfonate", "Perfluorooctanoic acid", "Perfluoropentanesulfonic acid", "Perfluorotetradecanoic acid", @@ -1255,6 +1332,8 @@ "Phenanthrene-d10", "Phenanthrene", "Phenol, 2,3-dichloro-6-methoxy-", + "Phenol, 4-chloro-2-methoxy-", + "Phenol, 4,5-dichloro-2-methoxy-", "Phenol, dibromo-", "Phenol", "Phenolics", @@ -1319,6 +1398,7 @@ "Pseudomonas fluorescens", "Purgeable hydrocarbons", "Pyraclostrobin", + "Pyrene-d10", "Pyrene", "Pyrethrin I", "Pyrethrin II", @@ -1473,6 +1553,7 @@ "Tetraethylene glycol", "Tetramethrin", "Tetrapropyl dithiopyrophosphate", + "Tetrasul", "Thallium-205", "Thallium", "Thiabendazole", @@ -1500,6 +1581,7 @@ "Total dissolved solids", "Total fixed solids", "Total hardness", + "Total Hexachlorocyclohexane, sum of isomers", "Total Nitrogen, mixed forms", "Total PAHs, high wt", "Total PAHs, low wt", @@ -1517,6 +1599,7 @@ "Tralkoxydim", "trans-1,2-Dichloroethylene", "trans-1,3-Dichloropropene", + "trans-1,4-Dichloro-2-butene", "trans-Chlordane", "trans-Nonachlor", "Transmittance at 254 nm", @@ -1571,10 +1654,9 @@ "Volatile Dissolved Solids", "Volatile suspended solids", "Water level (probe)", - "Water level", - "Water level (probe)", "Water level elevation", "Water level in well, depth from a reference point", + "Water level", "Weak, dissociable cyanide", "Wetted Width", "White ice thickness", From a0f72a3791eca70c82d093db40da4b8aab03aa07 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:38:42 -0700 Subject: [PATCH 29/51] New ActivityTypes, remove deprecated from logic --- .../ActivityType-ResultSampleFraction.json | 3 +++ .../ResultAnalyticalMethodContext-ActivityType.json | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json b/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json index 7f1d1e1c..8408612a 100644 --- a/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json +++ b/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json @@ -11,6 +11,9 @@ "ActivityType": { "enum": [ "Field Msr/Obs", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", "Field Msr/Obs-Portable Data Logger", "Quality Control Field Replicate Msr/Obs", "Quality Control Field Replicate Portable Data Logger" diff --git a/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json b/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json index 98ae3688..a355de12 100644 --- a/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json +++ b/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json @@ -33,13 +33,13 @@ "ActivityType": { "enum": [ "Field Msr/Obs", - "Field Msr/Obs-Portable Data Logger", "Field Msr/Obs-Continuous Time Series", - "Quality Control Field Msr/Obs Post-Calibration", - "Quality Control Field Msr/Obs Pre-Calibration", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", + "Field Msr/Obs-Portable Data Logger", "Quality Control Field Replicate Msr/Obs", - "Quality Control Field Replicate Portable Data Logger", - "Quality Control Field Sample Equipment Rinsate Blank" + "Quality Control Field Replicate Portable Data Logger" ] } }, From 6e1cbd21f170cab0e09d7612e345705cd946c16e Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:41:08 -0700 Subject: [PATCH 30/51] Deprecate ResultStatusID Rejected --- schemas/data/src/subset/ResultStatusID.json | 1 - 1 file changed, 1 deletion(-) diff --git a/schemas/data/src/subset/ResultStatusID.json b/schemas/data/src/subset/ResultStatusID.json index da5c47a0..858f0f53 100644 --- a/schemas/data/src/subset/ResultStatusID.json +++ b/schemas/data/src/subset/ResultStatusID.json @@ -4,6 +4,5 @@ "Historical", "Preliminary", "Provisional", -"Rejected", "Validated" ] From fdf7dfee3a94f54c460e8acf513086005b705661 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:42:06 -0700 Subject: [PATCH 31/51] New SampleCollectionEquipmentName --- schemas/data/src/subset/SampleCollectionEquipmentName.json | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/data/src/subset/SampleCollectionEquipmentName.json b/schemas/data/src/subset/SampleCollectionEquipmentName.json index 847b8967..2073a3d0 100644 --- a/schemas/data/src/subset/SampleCollectionEquipmentName.json +++ b/schemas/data/src/subset/SampleCollectionEquipmentName.json @@ -6,6 +6,7 @@ "DH-81", "DH-95", "Diffusion Gradient in Thin Film", + "Ekman Grab", "Gravity Corer (Generic)", "Hydrasleeve", "Kemmerer Bottle", From 0cd61959a08cc31d7b02abb2c50a9efe7c79b49a Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:44:18 -0700 Subject: [PATCH 32/51] New ResultAnalyticalMethodContext --- schemas/data/src/addition/ResultAnalyticalMethodContext.json | 1 + schemas/data/src/subset/ResultAnalyticalMethodContext.json | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/schemas/data/src/addition/ResultAnalyticalMethodContext.json b/schemas/data/src/addition/ResultAnalyticalMethodContext.json index ebcb31bb..58f53800 100644 --- a/schemas/data/src/addition/ResultAnalyticalMethodContext.json +++ b/schemas/data/src/addition/ResultAnalyticalMethodContext.json @@ -9,5 +9,6 @@ "RBR", "Seal", "Solinst", + "USDA/SSIR", "VMV" ] diff --git a/schemas/data/src/subset/ResultAnalyticalMethodContext.json b/schemas/data/src/subset/ResultAnalyticalMethodContext.json index a99a8602..c4fb5222 100644 --- a/schemas/data/src/subset/ResultAnalyticalMethodContext.json +++ b/schemas/data/src/subset/ResultAnalyticalMethodContext.json @@ -8,6 +8,7 @@ "APHA_SM24ED", "ASTM", "BC_MOE", + "CSSS", "DIN", "DOI", "EN", @@ -25,14 +26,17 @@ "MICROLOGY LABS", "Oakton", "ON MECP", + "Oxyguard", "PALINTEST LTD", "PROPRIETARY", "REED", "RBR", "Seal", "Solinst", + "SSSA", "THERMO-SCIENTIFIC", "Turner Designs", + "USDA/SSIR", "USDOI/USGS", "USEPA", "VMV", From 2c19478bcdd0e9db902d1095a70ca4dc7bea349c Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 15:25:41 -0700 Subject: [PATCH 33/51] New ActivityGroupTypes and mapping --- .../data/src/addition/ActivityGroupType.json | 5 + .../ActivityType-ActivityGroupType.json | 100 ++++++------------ 2 files changed, 40 insertions(+), 65 deletions(-) diff --git a/schemas/data/src/addition/ActivityGroupType.json b/schemas/data/src/addition/ActivityGroupType.json index aec242d7..2bd22dae 100644 --- a/schemas/data/src/addition/ActivityGroupType.json +++ b/schemas/data/src/addition/ActivityGroupType.json @@ -1,3 +1,8 @@ [ + "Continuous Data", + "Field Measure", + "Lab Sample", + "Quality Control - Field Measure", + "Quality Control - Lab Sample", "Unspecified" ] \ No newline at end of file diff --git a/schemas/data/src/lookup/ActivityType-ActivityGroupType.json b/schemas/data/src/lookup/ActivityType-ActivityGroupType.json index b370015e..a4686a11 100644 --- a/schemas/data/src/lookup/ActivityType-ActivityGroupType.json +++ b/schemas/data/src/lookup/ActivityType-ActivityGroupType.json @@ -1,67 +1,37 @@ { - "Field Msr/Obs": "Field Set", - "Field Msr/Obs-Habitat Assessment": "Field Set", - "Field Msr/Obs-Incidental": "Field Set", - "Field Msr/Obs-Portable Data Logger": "Field Set", - "Quality Control Alternative Measurement Sensitivity": "QC Sample", - "Quality Control Alternative Measurement Sensitivity Plus": "QC Sample", - "Quality Control Field Calibration Check": "QC Sample", - "Quality Control Field Replicate Habitat Assessment": "QC Sample", - "Quality Control Field Replicate Msr/Obs": "QC Sample", - "Quality Control Field Replicate Portable Data Logger": "QC Sample", - "Quality Control Field Replicate Sample-Composite": "QC Sample", - "Quality Control Field Sample Equipment Rinsate Blank": "QC Sample", - "Quality Control Lab Sample Equipment Rinsate Blank": "QC Sample", - "Quality Control Sample-Blind Duplicate": "QC Sample", - "Quality Control Sample-Equipment Blank": "QC Sample", - "Quality Control Sample-Field Ambient Conditions Blank": "QC Sample", - "Quality Control Sample-Field Blank": "QC Sample", - "Quality Control Sample-Field Replicate": "QC Sample", - "Quality Control Sample-Field Spike": "QC Sample", - "Quality Control Sample-Field Surrogate Spike": "QC Sample", - "Quality Control Sample-Inter-lab Split": "QC Sample", - "Quality Control Sample-Lab Blank": "QC Sample", - "Quality Control Sample-Lab Continuing Calibration Verification": "QC Sample", - "Quality Control Sample-Lab Control Sample/Blank Spike": "QC Sample", - "Quality Control Sample-Lab Control Sample/Blank Spike Duplicate": "QC Sample", - "Quality Control Sample-Lab Control Standard": "QC Sample", - "Quality Control Sample-Lab Control Standard Duplicate": "QC Sample", - "Quality Control Sample-Lab Duplicate": "QC Sample", - "Quality Control Sample-Lab Initial Calib Certified Reference Material": "QC Sample", - "Quality Control Sample-Lab Initial Calibration Verification": "QC Sample", - "Quality Control Sample-Lab Matrix Spike": "QC Sample", - "Quality Control Sample-Lab Matrix Spike Duplicate": "QC Sample", - "Quality Control Sample-Lab Re-Analysis": "QC Sample", - "Quality Control Sample-Lab Spike": "QC Sample", - "Quality Control Sample-Lab Spike Duplicate": "QC Sample", - "Quality Control Sample-Lab Spike of a Lab Blank": "QC Sample", - "Quality Control Sample-Lab Split": "QC Sample", - "Quality Control Sample-Lab Surrogate Control Standard": "QC Sample", - "Quality Control Sample-Lab Surrogate Control Standard Duplicate": "QC Sample", - "Quality Control Sample-Lab Surrogate Method Blank": "QC Sample", - "Quality Control Sample-Measurement Precision Sample": "QC Sample", - "Quality Control Sample-Other": "QC Sample", - "Quality Control Sample-Post-preservative Blank": "QC Sample", - "Quality Control Sample-Pre-preservative Blank": "QC Sample", - "Quality Control Sample-Reagent Blank": "QC Sample", - "Quality Control Sample-Reference Sample": "QC Sample", - "Quality Control Sample-Trip Blank": "QC Sample", - "Quality Control-Negative Control": "QC Sample", - "Sample-Composite With Parents": "Subsample", - "Sample-Composite Without Parents": "Subsample", - "Sample-Depletion Replicate": "Subsample", - "Sample-Field Split": "Subsample", - "Sample-Field Subsample": "Subsample", - "Sample-Integrated Cross-Sectional Profile": "Subsample", - "Sample-Integrated Flow Proportioned": "Subsample", - "Sample-Integrated Horizontal and Vertical Composite Profile": "Subsample", - "Sample-Integrated Horizontal Profile": "Subsample", - "Sample-Integrated Time Series": "Subsample", - "Sample-Integrated Vertical Profile": "Subsample", - "Sample-Negative Control": "Subsample", - "Sample-Other": "Subsample", - "Sample-Positive Control": "Subsample", - "Sample-Routine": "Subsample", - "Sample-Routine Resample": "Subsample", - "Unspecified": "Unspecified" +"Field Msr/Obs-Continuous Time Series": "Continuous Data", +"Field Msr/Obs": "Field Measure", +"Field Msr/Obs-Portable Data Logger": "Field Measure", +"Field Msr/Obs-Integrated Flow Proportioned": "Field Measure", +"Field Msr/Obs-Integrated Time Series": "Field Measure", +"Field Msr/Obs-Integrated Vertical Profile": "Field Measure", +"Sample-Composite With Parents": "Lab Sample", +"Sample-Composite Without Parents": "Lab Sample", +"Sample-Field Split": "Lab Sample", +"Sample-Integrated Flow Proportioned": "Lab Sample", +"Sample-Integrated Horizontal and Vertical Composite Profile": "Lab Sample", +"Sample-Integrated Horizontal Profile": "Lab Sample", +"Sample-Integrated Time Series": "Lab Sample", +"Sample-Integrated Vertical Profile": "Lab Sample", +"Sample-Other": "Lab Sample", +"Sample-Routine": "Lab Sample", +"Quality Control Field Replicate Msr/Obs": "Quality Control - Field Measure", +"Quality Control Field Replicate Portable Data Logger": "Quality Control - Field Measure", +"Quality Control-Calibration Check": "Quality Control - Field Measure", +"Quality Control Field Sample Equipment Rinsate Blank": "Quality Control - Lab Sample", +"Quality Control Sample-Blind Duplicate": "Quality Control - Lab Sample", +"Quality Control Sample-Field Blank": "Quality Control - Lab Sample", +"Quality Control Sample-Field Replicate": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Blank": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Duplicate": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Matrix Spike": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Re-Analysis": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Spike": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Split": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Surrogate Control Standard": "Quality Control - Lab Sample", +"Quality Control Sample-Lab Surrogate Control Standard Duplicate": "Quality Control - Lab Sample", +"Quality Control Sample-Reference Sample": "Quality Control - Lab Sample", +"Quality Control Sample-Trip Blank": "Quality Control - Lab Sample", +"Sample-Positive Control": "Quality Control - Lab Sample", +"Unspecified": "Unspecified" } From 91188b8112a3a15404c9a533cbb9146634b00d81 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Wed, 24 Jun 2026 15:26:21 -0700 Subject: [PATCH 34/51] Update ActivityTypes in field qc checks --- .../src/quality-control/ActivityType-ResultSampleFraction.json | 2 ++ .../ResultAnalyticalMethodContext-ActivityType.json | 1 + 2 files changed, 3 insertions(+) diff --git a/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json b/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json index 8408612a..70b701fd 100644 --- a/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json +++ b/schemas/data/src/quality-control/ActivityType-ResultSampleFraction.json @@ -11,10 +11,12 @@ "ActivityType": { "enum": [ "Field Msr/Obs", + "Field Msr/Obs-Continuous Time Series", "Field Msr/Obs-Integrated Flow Proportioned", "Field Msr/Obs-Integrated Time Series", "Field Msr/Obs-Integrated Vertical Profile", "Field Msr/Obs-Portable Data Logger", + "Quality Control-Calibration Check", "Quality Control Field Replicate Msr/Obs", "Quality Control Field Replicate Portable Data Logger" ] diff --git a/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json b/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json index a355de12..5bd7485f 100644 --- a/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json +++ b/schemas/data/src/quality-control/ResultAnalyticalMethodContext-ActivityType.json @@ -38,6 +38,7 @@ "Field Msr/Obs-Integrated Time Series", "Field Msr/Obs-Integrated Vertical Profile", "Field Msr/Obs-Portable Data Logger", + "Quality Control-Calibration Check", "Quality Control Field Replicate Msr/Obs", "Quality Control Field Replicate Portable Data Logger" ] From 09ca041cd8f157354de4471898e36869ac590dbb Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Thu, 25 Jun 2026 09:11:38 -0700 Subject: [PATCH 35/51] Update chr groups and unit normalizations --- ...acteristicName-CharacteristicWQXGroup.json | 29 +++++++++++++++++++ .../CharacteristicName-MeasurementUnit.json | 2 ++ 2 files changed, 31 insertions(+) diff --git a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json index 39b31c07..be671d84 100644 --- a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json +++ b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json @@ -37,15 +37,23 @@ "2,4-Dimethyldibenzothiophene": "Organics, Other", "2,4-Dimethylphenol": "Organics, Other", "2,4,5-T": "Organics, Pesticide", + "2,4,6-Trichloroanisole": "Organics, Other", "2,6-Dimethylnaphthalene-D12": "Organics, Other", "2,6-Dimethylphenanthrene": "Organics, Other", "3-Methylfluoranthene/Benzo[a]fluorene": "Organics, Other", "3-Pyridinecarboxamide, N-(2,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-": "Organics, Other", + "3-Pyridinecarboxamide, N-(2+A2:A19,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-": "Organics, Pesticide", + "3,4,5-Trichlorocatechol": "Organics, Other", + "3,4,5-Trichloroguaiacol": "Organics, Other", + "3,4,6-Trichloroguaiacol": "Organics, Other", "3,6-Dimethylphenanthrene": "Organics, Other", + "4-Chloro-3-nitrobenzotrifluoride": "Organics, Other", "4-Hydroxy-chlorothalonil": "Organics, Pesticide", "4-Nonylphenol monoethoxylates":"Organics, Other", "4-Nonylphenol pentaethoxylates":"Organics, Other", "4-Nonylphenol tetraethoxylates":"Organics, Other", + "4,5-Dichlorocatechol": "Organics, Other", + "4,6-Dichloroguaiacol": "Organics, Other", "4,6-Dimethyldibenzothiophene": "Organics, Other", "5-Methylchrysene/6-Methylchrysene": "Organics, Other", "5,9-Dimethylchrysene": "Organics, Other", @@ -56,6 +64,9 @@ "Adenosine triphosphate": "Organics, Other", "Allyl chloride":"Organics, Other", "Ammonia, un-ionized": "Nutrient", + "Antimony-121": "Stable Isotopes", + "ar,ar'-Dimethylbiphenyl": "Organics, Other", + "Arsenic-75": "Stable Isotopes", "Asbestos":"Inorganics, Major, Non-metals", "BDE-049": "Organics, BDEs", "BDE-071": "Organics, BDEs", @@ -72,6 +83,7 @@ "Bromochloromethane":"Organics, Other", "Bromophos-ethyl": "Organics, Pesticide", "Bromopropylate":"Organics, Pesticide", + "Bupirimate": "Organics, Pesticide", "Butyraldehyde": "Organics, Other", "C4-Fluorenes": "Organics, Other", "Carbaryl-d7": "Organics, Pesticide", @@ -95,8 +107,10 @@ "Clindamycin": "Organics, Other", "Clodinafop": "Organics, Pesticide", "Clothianidin-d3": "Organics, Pesticide", + "Cobalt-59": "Stable Isotopes", "Cocaine": "Organics, Other", "Coliphage": "Microbiological", + "Copper-63": "Stable Isotopes", "Cyanate": "Organics, Other", "Cyanazine-d5": "Organics, Pesticide", "Cyanide + Thiocyanate": "Inorganics, Minor, Non-metals", @@ -114,6 +128,7 @@ "Dibenzothiophene-D8": "Organics, Other", "Dichlofenthion": "Organics, Pesticide", "Dichlofluanid": "Organics, Pesticide", + "Diclofop": "Organics, Pesticide", "Dihydrocholesterol":"Organics, Other", "Dimethoate-d6": "Organics, Pesticide", "Dimethyl diselenide": "Organics, Other", @@ -133,6 +148,7 @@ "Glufosinate": "Organics, Pesticide", "Glyoxal": "Organics, Other", "Heptachlor and Heptachlor epoxide": "Organics, Pesticide", + "Heptadecanoic acid": "Organics, Other", "Heptafluorobutyric acid":"PFAS,Perfluorinated Alkyl Substance", "Heptanal": "Organics, Other", "Hexachlorodibenzo-p-dioxin":"Organics, Other", @@ -148,6 +164,8 @@ "Inorganic nitrogen (ammonia, nitrate and nitrite)":"Nutrient", "Inorganic nitrogen (nitrate and nitrite)": "Nutrient", "Ipconazole": "Organics, Pesticide", + "Iron-57": "Stable Isotopes", + "Iron-related bacteria": "Microbiological", "Isofenphos": "Organics, Pesticide", "Isovaleraldehyde": "Organics, Other", "Lauric acid": "Organics, Other", @@ -157,14 +175,17 @@ "Manganese-55": "Stable Isotopes", "Methamphetamine": "Organics, Other", "Methyl mercaptan":"Organics, Other", + "Methylbiphenyl": "Organics, Other", "Methylglyoxal": "Organics, Other", "Methylmercury(1+)": "Inorganics, Minor, Metals", "Metobromuron": "Organics, Pesticide", "Metolachlor-d6": "Organics, Pesticide", "Moisture content": "Physical", + "Molybdenum-98": "Stable Isotopes", "Monochlorodehydroabietic acid": "Organics, Other", "Monolinuron": "Organics, Pesticide", "N-Ethylperfluorooctanesulfonamide":"PFAS,Perfluorinated Alkyl Substance", + "Nickel-60": "Stable Isotopes", "Nitenpyram": "Organics, Pesticide", "Nitrapyrin": "Organics, Pesticide", "Nitrogen-15/Nitrogen-14 ratio": "Stable Isotopes", @@ -185,11 +206,15 @@ "Particle size, 50 mesh, (0.297 mm)": "Physical", "Penflufen": "Organics, Pesticide", "Pentachloroanisole": "Organics, Other", + "perfluorohexane sulfonamido propyl amine": "PFAS,Perfluorinated Alkyl Substance", + "Perfluorohexane sulfonamidopropyl ammonium": "PFAS,Perfluorinated Alkyl Substance", "Petroleum hydrocarbons, total volatile": "Organics, Other", "pH, lab":"Physical", "pH, saturated":"Physical", "Phaeophytin - Periphyton (attached)": "Biological, Photosynthetic Pigments", "Phenol, 2,3-dichloro-6-methoxy-": "Organics, Other", + "Phenol, 4-chloro-2-methoxy-": "Organics, Other", + "Phenol, 4,5-dichloro-2-methoxy-": "Organics, Other", "Phenol, dibromo-": "Organics, Other", "Pheophytin a": "Biological, Photosynthetic Pigments", "Pheophytin": "Biological, Photosynthetic Pigments", @@ -213,7 +238,9 @@ "Sandaracopimaric acid": "Organics, Other", "Selenate": "Inorganics, Minor, Non-metals", "Selenite": "Inorganics, Minor, Non-metals", + "Sodium perfluoroethanesulfonate": "PFAS,Perfluorinated Alkyl Substance", "Spirotetramat": "Organics, Pesticide", + "Strontium-88": "Stable Isotopes", "Substrate - sand": "Physical", "Substrate - sediment thickness": "Physical", "Substrate - silt": "Physical", @@ -234,6 +261,8 @@ "Total xylenes": "Organics, Other", "Triadimenol":"Organics, Pesticide", "Trichloroacetic acid": "Organics, Other", + "Trichloroveretrols": "Organics, Other", + "Tricosafluoroundecane-1-sulfonic acid sodium salt": "PFAS,Perfluorinated Alkyl Substance", "Trinexapac-Ethyl": "Organics, Pesticide", "Uranium-234/Uranium-238 ratio": "Radiochemical", "Valeric acid":"Organics, Other", diff --git a/schemas/data/src/lookup/CharacteristicName-MeasurementUnit.json b/schemas/data/src/lookup/CharacteristicName-MeasurementUnit.json index bd589abd..8b23822e 100644 --- a/schemas/data/src/lookup/CharacteristicName-MeasurementUnit.json +++ b/schemas/data/src/lookup/CharacteristicName-MeasurementUnit.json @@ -253,6 +253,8 @@ "Isophorone": ["ng/L"], "Isopropanol": ["mg/L"], "Lead": ["ug/L"], + "Light, photosynthetic active radiation (PAR)": ["umol/m2/s"], + "Light, Photosynthetic Photon Flux Density (PPFD)": ["umol/m2/s"], "Limonene": ["mg/L"], "Linuron": ["ug/L"], "Lithium": ["ug/L"], From b1acf311032c167f13c638c855ae98f2cd5a0b25 Mon Sep 17 00:00:00 2001 From: nlibera2 <110491166+nlibera2@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:45:48 -0700 Subject: [PATCH 36/51] Update locales --- .../data/src/locales/ActivityGroupType.json | 82 +- schemas/data/src/locales/ActivityType.json | 54 +- .../data/src/locales/CharacteristicName.json | 876 +++++++++++++++++- .../ResultAnalyticalMethodContext.json | 490 ++-------- .../SampleCollectionEquipmentName.json | 10 + 5 files changed, 1041 insertions(+), 471 deletions(-) diff --git a/schemas/data/src/locales/ActivityGroupType.json b/schemas/data/src/locales/ActivityGroupType.json index 0246c0de..9052fb67 100644 --- a/schemas/data/src/locales/ActivityGroupType.json +++ b/schemas/data/src/locales/ActivityGroupType.json @@ -8,13 +8,73 @@ "fr": null }, "values": { + "Continuous Data": { + "name": { + "en": "Continuous Data", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Field Measure": { + "name": { + "en": "Field Measure", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Lab Sample": { + "name": { + "en": "Lab Sample", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quality Control - Field Measure": { + "name": { + "en": "Quality Control - Field Measure", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Quality Control - Lab Sample": { + "name": { + "en": "Quality Control - Lab Sample", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Unspecified": { + "name": { + "en": "Unspecified", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Field Set": { "name": { "en": "Field", "fr": "Terrain" }, "description": { - "en": null, + "en": "DEPRECATED", "fr": null } }, @@ -24,7 +84,7 @@ "fr": null }, "description": { - "en": null, + "en": "DEPRECATED", "fr": null } }, @@ -34,7 +94,7 @@ "fr": "Contrôle qualité" }, "description": { - "en": null, + "en": "DEPRECATED", "fr": null } }, @@ -44,7 +104,7 @@ "fr": null }, "description": { - "en": null, + "en": "DEPRECATED", "fr": null } }, @@ -54,7 +114,7 @@ "fr": "Laboratoire" }, "description": { - "en": null, + "en": "DEPRECATED", "fr": null } }, @@ -64,17 +124,7 @@ "fr": null }, "description": { - "en": null, - "fr": null - } - }, - "Unspecified": { - "name": { - "en": "Unspecified", - "fr": null - }, - "description": { - "en": null, + "en": "DEPRECATED", "fr": null } } diff --git a/schemas/data/src/locales/ActivityType.json b/schemas/data/src/locales/ActivityType.json index ddda147a..fe4e951a 100644 --- a/schemas/data/src/locales/ActivityType.json +++ b/schemas/data/src/locales/ActivityType.json @@ -28,6 +28,36 @@ "fr": "Données continues collectées sur le terrain à l’aide d’un dispositif d’enregistrement de données automatisé qui enregistre en continu une séquence de valeurs de données à des intervalles répétitifs." } }, + "Field Msr/Obs-Integrated Flow Proportioned": { + "name": { + "en": "Field Msr/Obs-Integrated Flow Proportioned", + "fr": null + }, + "description": { + "en": "A discrete measurement collected in the field integrated over an interval or space within which changes in flow are used to alter the proportion of the sampled medium contributing to the integrated sample.", + "fr": null + } + }, + "Field Msr/Obs-Integrated Time Series": { + "name": { + "en": "Field Msr/Obs-Integrated Time Series", + "fr": null + }, + "description": { + "en": "A discrete measurement collected in the field that represents an integrated portion or segment of elapsed time.", + "fr": null + } + }, + "Field Msr/Obs-Integrated Vertical Profile": { + "name": { + "en": "Field Msr/Obs-Integrated Vertical Profile", + "fr": null + }, + "description": { + "en": "A discrete measurement collected in the field that represents an integrated portion or segment of a vertical track within the study area.", + "fr": null + } + }, "Field Msr/Obs-Portable Data Logger": { "name": { "en": "Field Msr/Obs-Portable Data Logger", @@ -84,7 +114,7 @@ "fr": null }, "description": { - "en": "A field measurement or observation taken to assess the reproducity of the sampling technique or analytical method.", + "en": "A field measurement or observation taken to assess the reproducibility of the sampling technique or analytical method.", "fr": "Une mesure ou une observation sur le terrain effectuée pour évaluer la reproductibilité de la technique d'échantillonnage ou de la méthode d'analyse." } }, @@ -94,8 +124,8 @@ "fr": null }, "description": { - "en": "A measurement taken to verify the quality of data taken by a data logger. For discrete measurements collected by portable loggers (e.g. YSI) in the field. \r\n\r\nNot for use with high-frequency continuous time-series data. For more information, see Continuous data on DataStream on DataStream's Learning Centre", - "fr": "Une mesure prise pour vérifier la qualité des données prélevées à l’aide d’un enregistreur de données. Pour des mesures discrètes prélevées par des enregistreurs portables (par exemple, YSI) sur le terrain. \r\n\r\nNe pas utiliser avec des données de séries temporelles continues à haute fréquence. Pour plus d’information, voir Guide sur les données de séries temporelles continues dans le Centre d'apprentissage de DataStream." + "en": "A measurement taken to verify the quality of data taken by a data logger. For discrete measurements collected by portable loggers (e.g. YSI) in the field.", + "fr": "Une mesure prise pour vérifier la qualité des données prélevées à l’aide d’un enregistreur de données. Pour des mesures discrètes prélevées par des enregistreurs portables (par exemple, YSI) sur le terrain." } }, "Quality Control Field Sample Equipment Rinsate Blank": { @@ -384,7 +414,7 @@ "fr": null }, "description": { - "en": null, + "en": "The measured value of a calibration standard taken during or after field work to verify that an instrument has maintained its calibration. The expected calibration standard value should be included in the ResultComment.", "fr": null } }, @@ -514,8 +544,8 @@ "fr": null }, "description": { - "en": "A discrete/integrated sample, usually derived from a continuous record, representing some portion or segment of a horizontal and vertical track within the study area.", - "fr": "Un échantillon discret/intégré, généralement dérivé d'un enregistrement continu, représentant une partie ou un segment d'une trajectoire horizontale et verticale dans la zone d'étude." + "en": "A discrete sample that represents an integrated portion or segment of a horizontal and vertical track within the study area.", + "fr": null } }, "Sample-Integrated Horizontal Profile": { @@ -524,8 +554,8 @@ "fr": null }, "description": { - "en": "A discrete/integrated sample, usually derived from a continuous record, representing some portion or segment of a horizontal track within the study area.", - "fr": "Un échantillon discret/intégré, généralement dérivé d'un enregistrement continu, représentant une partie ou un segment d'une trajectoire horizontale dans la zone d'étude." + "en": "A discrete sample that represents an integrated portion or segment of a horizontal track within the study area.", + "fr": null } }, "Sample-Integrated Time Series": { @@ -534,8 +564,8 @@ "fr": null }, "description": { - "en": "A discrete/integrated sample, representing some portion or segment of elapsed time within the overall activity duration or sample period.", - "fr": "Un échantillon discret/intégré, représentant une partie ou un segment du temps écoulé pendant la durée globale de l'activité ou la période d'échantillonnage." + "en": "A discrete sample that represents an integrated portion or segment of elapsed time.", + "fr": null } }, "Sample-Integrated Vertical Profile": { @@ -544,8 +574,8 @@ "fr": null }, "description": { - "en": "A discrete/integrated sample, usually derived from a continuous record, representing some portion or segment of a vertical track within the study area.", - "fr": "Un échantillon discret/intégré, généralement dérivé d'un enregistrement continu, représentant une partie ou un segment d'un profil vertical dans la zone d'étude." + "en": "A discrete sample that represents an integrated portion or segment of a vertical track within the study area.", + "fr": null } }, "Sample-Negative Control": { diff --git a/schemas/data/src/locales/CharacteristicName.json b/schemas/data/src/locales/CharacteristicName.json index 5b95ff59..c13671e4 100644 --- a/schemas/data/src/locales/CharacteristicName.json +++ b/schemas/data/src/locales/CharacteristicName.json @@ -4,8 +4,8 @@ "fr": null }, "description": { - "en": "Identifies what is being measured (Ex. Temperature, pH) in a field or lab result. The name used must have a match in the Allowed Values list.", - "fr": "Identifie ce qui est mesuré (p. Ex. température, pH) sur le terrain ou en laboratoire. Le nom utilisé doit avoir une correspondance dans la liste des valeurs autorisées -- voir onglet \"Allowed Values\"." + "en": "Identifies what is being measured (e.g. temperature, pH). The name used must have an exact match in the Allowed Values list.", + "fr": "Identifie ce qui est mesuré (par exemple température, pH). Le nom utilisé doit correspondre exactement à un nom dans la liste des Valeurs autorisées." }, "values": { "(Heptadecafluorooctyl)phosphonic acid": { @@ -98,6 +98,16 @@ "fr": null } }, + ".beta.-Sitosterol": { + "name": { + "en": ".beta.-Sitosterol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, ".delta.-Hexachlorocyclohexane": { "name": { "en": ".delta.-Hexachlorocyclohexane", @@ -158,6 +168,16 @@ "fr": null } }, + "1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro-": { + "name": { + "en": "1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "1-Heptanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,7-pentadecafluoro-": { "name": { "en": "1-Heptanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,7-pentadecafluoro-", @@ -838,6 +858,16 @@ "fr": null } }, + "1,4-Dichloro-cis-2-butene": { + "name": { + "en": "1,4-Dichloro-cis-2-butene", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "1,4-Dichlorobenzene-d4": { "name": { "en": "1,4-Dichlorobenzene-d4", @@ -858,6 +888,16 @@ "fr": null } }, + "1,4-Dioxane": { + "name": { + "en": "1,4-Dioxane", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "1,4,6,7-Tetramethylnaphthalene": { "name": { "en": "1,4,6,7-Tetramethylnaphthalene", @@ -918,6 +958,16 @@ "fr": null } }, + "11-chloroeicosafluoro-3-oxaundecane-1-sulfonic acid": { + "name": { + "en": "11-chloroeicosafluoro-3-oxaundecane-1-sulfonic acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "12-Chlorodehydroabietic acid": { "name": { "en": "12-Chlorodehydroabietic acid", @@ -928,6 +978,16 @@ "fr": null } }, + "12,14-Dichlorodehydroabietic acid": { + "name": { + "en": "12,14-Dichlorodehydroabietic acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "14-Chlorodehydroabietic acid": { "name": { "en": "14-Chlorodehydroabietic acid", @@ -1608,6 +1668,16 @@ "fr": null } }, + "2,4,6-Trichloroanisole": { + "name": { + "en": "2,4,6-Trichloroanisole", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "2,4,6-Trichlorophenol": { "name": { "en": "2,4,6-Trichlorophenol", @@ -1788,6 +1858,16 @@ "fr": null } }, + "3-Pyridinecarboxamide, N-(2+A2:A19,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-": { + "name": { + "en": "3-Pyridinecarboxamide, N-(2+A2:A19,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "3,3'-Dichlorobenzidine": { "name": { "en": "3,3'-Dichlorobenzidine", @@ -1808,6 +1888,16 @@ "fr": null } }, + "3,4-Dichlorocatechol": { + "name": { + "en": "3,4-Dichlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "3,4-Dichlorophenol": { "name": { "en": "3,4-Dichlorophenol", @@ -1818,6 +1908,26 @@ "fr": null } }, + "3,4,5-Trichlorocatechol": { + "name": { + "en": "3,4,5-Trichlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "3,4,5-Trichloroguaiacol": { + "name": { + "en": "3,4,5-Trichloroguaiacol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "3,4,5-Trichlorophenol": { "name": { "en": "3,4,5-Trichlorophenol", @@ -1828,6 +1938,26 @@ "fr": null } }, + "3,4,6-Trichlorocatechol": { + "name": { + "en": "3,4,6-Trichlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "3,4,6-Trichloroguaiacol": { + "name": { + "en": "3,4,6-Trichloroguaiacol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "3,5-Dichlorobenzoic acid": { "name": { "en": "3,5-Dichlorobenzoic acid", @@ -1838,6 +1968,16 @@ "fr": null } }, + "3,5-Dichlorocatechol": { + "name": { + "en": "3,5-Dichlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "3,5-Dichlorophenol": { "name": { "en": "3,5-Dichlorophenol", @@ -1878,6 +2018,26 @@ "fr": null } }, + "4-Chloro-3-nitrobenzotrifluoride": { + "name": { + "en": "4-Chloro-3-nitrobenzotrifluoride", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "4-Chlorocatechol": { + "name": { + "en": "4-Chlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "4-Hydroxy-chlorothalonil": { "name": { "en": "4-Hydroxy-chlorothalonil", @@ -1968,6 +2128,46 @@ "fr": null } }, + "4,5-Dichlorocatechol": { + "name": { + "en": "4,5-Dichlorocatechol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "4,5-Dichloroveratrole": { + "name": { + "en": "4,5-Dichloroveratrole", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "4,5,6-Trichloroguaiacol": { + "name": { + "en": "4,5,6-Trichloroguaiacol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "4,6-Dichloroguaiacol": { + "name": { + "en": "4,6-Dichloroguaiacol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "4,6-Dimethyldibenzothiophene": { "name": { "en": "4,6-Dimethyldibenzothiophene", @@ -2068,6 +2268,16 @@ "fr": null } }, + "9-Chlorohexadecafluoro-3-oxanonane-1-sulfonate": { + "name": { + "en": "9-Chlorohexadecafluoro-3-oxanonane-1-sulfonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "9-Methylphenanthrene/4-Methylphenanthrene": { "name": { "en": "9-Methylphenanthrene/4-Methylphenanthrene", @@ -2248,6 +2458,16 @@ "fr": null } }, + "Acetamide, 2-(diethylamino)-N-(2,6-dimethylphenyl)-": { + "name": { + "en": "Acetamide, 2-(diethylamino)-N-(2,6-dimethylphenyl)-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Acetaminophen": { "name": { "en": "Acetaminophen", @@ -2338,6 +2558,36 @@ "fr": null } }, + "Acrolein": { + "name": { + "en": "Acrolein", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Acrylonitrile": { + "name": { + "en": "Acrylonitrile", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Adamantane Carboxylic Acid-D15": { + "name": { + "en": "Adamantane Carboxylic Acid-D15", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Adenosine triphosphate": { "name": { "en": "Adenosine triphosphate", @@ -2468,6 +2718,16 @@ "fr": null } }, + "Allidochlor": { + "name": { + "en": "Allidochlor", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Allyl chloride": { "name": { "en": "Allyl chloride", @@ -2598,6 +2858,16 @@ "fr": null } }, + "Anatoxin-A": { + "name": { + "en": "Anatoxin-A", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Anilazine": { "name": { "en": "Anilazine", @@ -2668,6 +2938,16 @@ "fr": null } }, + "ar,ar'-Dimethylbiphenyl": { + "name": { + "en": "ar,ar'-Dimethylbiphenyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Aroclor 1016": { "name": { "en": "Aroclor 1016", @@ -2868,6 +3148,16 @@ "fr": null } }, + "Atrazine + all metabolites": { + "name": { + "en": "Atrazine + all metabolites", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Atrazine + N-Dealkylated Metabolites": { "name": { "en": "Atrazine + N-Dealkylated Metabolites", @@ -2908,6 +3198,16 @@ "fr": null } }, + "Bacteria, Sulfate reducing": { + "name": { + "en": "Bacteria, Sulfate reducing", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Bankfull Height": { "name": { "en": "Bankfull Height", @@ -3228,6 +3528,16 @@ "fr": null } }, + "Benalaxyl": { + "name": { + "en": "Benalaxyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Bendiocarb": { "name": { "en": "Bendiocarb", @@ -3318,6 +3628,16 @@ "fr": null } }, + "Benzene, 1,2,3-trichloro-4,5-dimethoxy-": { + "name": { + "en": "Benzene, 1,2,3-trichloro-4,5-dimethoxy-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Benzeneacetic acid, .alpha.-methyl-4-(2-methylpropyl)-": { "name": { "en": "Benzeneacetic acid, .alpha.-methyl-4-(2-methylpropyl)-", @@ -3548,6 +3868,16 @@ "fr": null } }, + "Benzoylprop-ethyl": { + "name": { + "en": "Benzoylprop-ethyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Beryllium": { "name": { "en": "Beryllium", @@ -3898,6 +4228,16 @@ "fr": null } }, + "BTEX plus styrene, Total": { + "name": { + "en": "BTEX plus styrene, Total", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "BTEX, Total": { "name": { "en": "BTEX, Total", @@ -3908,6 +4248,16 @@ "fr": null } }, + "Bupirimate": { + "name": { + "en": "Bupirimate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Butachlor": { "name": { "en": "Butachlor", @@ -4068,6 +4418,16 @@ "fr": null } }, + "C10-C50 Hydrocarbons": { + "name": { + "en": "C10-C50 Hydrocarbons", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "C16-C21 Hydrocarbons": { "name": { "en": "C16-C21 Hydrocarbons", @@ -4088,6 +4448,16 @@ "fr": null } }, + "C16-C50 Hydrocarbons": { + "name": { + "en": "C16-C50 Hydrocarbons", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "C2-Benzo[a]anthracenes/chrysenes": { "name": { "en": "C2-Benzo[a]anthracenes/chrysenes", @@ -4468,6 +4838,16 @@ "fr": null } }, + "Carbazole": { + "name": { + "en": "Carbazole", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Carbofuran": { "name": { "en": "Carbofuran", @@ -4518,6 +4898,16 @@ "fr": null } }, + "Carbon disulfide": { + "name": { + "en": "Carbon disulfide", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Carbon monoxide": { "name": { "en": "Carbon monoxide", @@ -5098,6 +5488,16 @@ "fr": null } }, + "Chlorthiamid": { + "name": { + "en": "Chlorthiamid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Chlorthiophos": { "name": { "en": "Chlorthiophos", @@ -5498,6 +5898,16 @@ "fr": null } }, + "Coprostanol": { + "name": { + "en": "Coprostanol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Corrosion & scaling control, Ryznar Stability Index": { "name": { "en": "Corrosion & scaling control, Ryznar Stability Index", @@ -5518,6 +5928,16 @@ "fr": null } }, + "Cresol": { + "name": { + "en": "Cresol", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Crufomate": { "name": { "en": "Crufomate", @@ -5668,6 +6088,16 @@ "fr": null } }, + "Cyprazine": { + "name": { + "en": "Cyprazine", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Cyprodinil": { "name": { "en": "Cyprodinil", @@ -5758,6 +6188,26 @@ "fr": null } }, + "Decanoic acid": { + "name": { + "en": "Decanoic acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Decanoic Acid-D19": { + "name": { + "en": "Decanoic Acid-D19", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Decanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-": { "name": { "en": "Decanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-", @@ -5788,6 +6238,16 @@ "fr": null } }, + "Dehydronifedipine": { + "name": { + "en": "Dehydronifedipine", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Delta boron-11/boron-10": { "name": { "en": "Delta boron-11/boron-10", @@ -6298,6 +6758,16 @@ "fr": null } }, + "Diclofop": { + "name": { + "en": "Diclofop", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Diclofop methyl": { "name": { "en": "Diclofop methyl", @@ -6498,6 +6968,16 @@ "fr": null } }, + "Dimethylnaphthalene": { + "name": { + "en": "Dimethylnaphthalene", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Dinitramine": { "name": { "en": "Dinitramine", @@ -6648,6 +7128,16 @@ "fr": null } }, + "Dysprosium": { + "name": { + "en": "Dysprosium", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Eicosanoic acid": { "name": { "en": "Eicosanoic acid", @@ -6748,6 +7238,16 @@ "fr": null } }, + "Erbium": { + "name": { + "en": "Erbium", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Erythromycin": { "name": { "en": "Erythromycin", @@ -6808,6 +7308,16 @@ "fr": null } }, + "Ethanamine, 2-(diphenylmethoxy)-N,N-dimethyl-": { + "name": { + "en": "Ethanamine, 2-(diphenylmethoxy)-N,N-dimethyl-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Ethanol": { "name": { "en": "Ethanol", @@ -6868,6 +7378,16 @@ "fr": null } }, + "Ethyl methacrylate": { + "name": { + "en": "Ethyl methacrylate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Ethylbenzene": { "name": { "en": "Ethylbenzene", @@ -7038,6 +7558,16 @@ "fr": null } }, + "Fenoxaprop": { + "name": { + "en": "Fenoxaprop", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Fenoxaprop-ethyl": { "name": { "en": "Fenoxaprop-ethyl", @@ -7138,6 +7668,26 @@ "fr": null } }, + "Flamprop-isopropyl": { + "name": { + "en": "Flamprop-isopropyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Flamprop-methyl": { + "name": { + "en": "Flamprop-methyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Flonicamid": { "name": { "en": "Flonicamid", @@ -7538,6 +8088,16 @@ "fr": null } }, + "Gross alpha radioactivity (ref std unspecified)": { + "name": { + "en": "Gross alpha radioactivity (ref std unspecified)", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Gross alpha radioactivity, (Americium-241 ref std)": { "name": { "en": "Gross alpha radioactivity, (Americium-241 ref std)", @@ -7678,6 +8238,16 @@ "fr": null } }, + "Heptadecanoic acid": { + "name": { + "en": "Heptadecanoic acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Heptafluorobutyric acid": { "name": { "en": "Heptafluorobutyric acid", @@ -7698,6 +8268,16 @@ "fr": null } }, + "Heptenophos": { + "name": { + "en": "Heptenophos", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Heterotrophic bacteria": { "name": { "en": "Heterotrophic bacteria", @@ -7788,6 +8368,16 @@ "fr": null } }, + "Hexadecanoic Acid-D31": { + "name": { + "en": "Hexadecanoic Acid-D31", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-": { "name": { "en": "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-", @@ -8308,6 +8898,16 @@ "fr": null } }, + "Iron-related bacteria": { + "name": { + "en": "Iron-related bacteria", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Isobutanol": { "name": { "en": "Isobutanol", @@ -8498,6 +9098,16 @@ "fr": null } }, + "Light, Photosynthetic Photon Flux Density (PPFD)": { + "name": { + "en": "Light, Photosynthetic Photon Flux Density (PPFD)", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Light, underwater extinction coefficient (K)": { "name": { "en": "Light, underwater extinction coefficient (K)", @@ -8548,6 +9158,16 @@ "fr": null } }, + "Linolenic acid": { + "name": { + "en": "Linolenic acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Linuron": { "name": { "en": "Linuron", @@ -8588,6 +9208,16 @@ "fr": null } }, + "Lithocholic Acid-D4": { + "name": { + "en": "Lithocholic Acid-D4", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Lutetium": { "name": { "en": "Lutetium", @@ -8858,6 +9488,16 @@ "fr": null } }, + "Methacrylonitrile": { + "name": { + "en": "Methacrylonitrile", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methamidophos": { "name": { "en": "Methamidophos", @@ -8998,6 +9638,26 @@ "fr": null } }, + "Methyl ethyl ketone": { + "name": { + "en": "Methyl ethyl ketone", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Methyl iodide": { + "name": { + "en": "Methyl iodide", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methyl isobutyl ketone": { "name": { "en": "Methyl isobutyl ketone", @@ -9018,6 +9678,16 @@ "fr": null } }, + "Methyl methacrylate": { + "name": { + "en": "Methyl methacrylate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methyl parathion": { "name": { "en": "Methyl parathion", @@ -9058,6 +9728,16 @@ "fr": null } }, + "Methylanthracene": { + "name": { + "en": "Methylanthracene", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methylarsonic acid": { "name": { "en": "Methylarsonic acid", @@ -9068,6 +9748,16 @@ "fr": null } }, + "Methylbiphenyl": { + "name": { + "en": "Methylbiphenyl", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methylchrysene": { "name": { "en": "Methylchrysene", @@ -9078,6 +9768,16 @@ "fr": null } }, + "Methylcyclohexane": { + "name": { + "en": "Methylcyclohexane", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Methyldibenzothiophene": { "name": { "en": "Methyldibenzothiophene", @@ -11128,6 +11828,16 @@ "fr": null } }, + "Nitrobenzene-D5": { + "name": { + "en": "Nitrobenzene-D5", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Nitrofen": { "name": { "en": "Nitrofen", @@ -11298,6 +12008,16 @@ "fr": null } }, + "O-Methylpodocarpic Acid": { + "name": { + "en": "O-Methylpodocarpic Acid", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "o-Nitrophenol": { "name": { "en": "o-Nitrophenol", @@ -11628,6 +12348,16 @@ "fr": null } }, + "Oxygen-17": { + "name": { + "en": "Oxygen-17", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Oxygen-18": { "name": { "en": "Oxygen-18", @@ -12118,6 +12848,16 @@ "fr": null } }, + "Perfluoro-2-propoxypropanoate": { + "name": { + "en": "Perfluoro-2-propoxypropanoate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Perfluoro-3-methoxypropanoic acid": { "name": { "en": "Perfluoro-3-methoxypropanoic acid", @@ -12168,6 +12908,16 @@ "fr": null } }, + "Perfluorodecanesulfonate": { + "name": { + "en": "Perfluorodecanesulfonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Perfluorodecanoic acid": { "name": { "en": "Perfluorodecanoic acid", @@ -12198,6 +12948,16 @@ "fr": null } }, + "Perfluoroheptanesulfonate": { + "name": { + "en": "Perfluoroheptanesulfonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Perfluoroheptanoic acid": { "name": { "en": "Perfluoroheptanoic acid", @@ -12338,6 +13098,16 @@ "fr": null } }, + "Perfluorooctanesulfonate": { + "name": { + "en": "Perfluorooctanesulfonate", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Perfluorooctanoic acid": { "name": { "en": "Perfluorooctanoic acid", @@ -12538,6 +13308,26 @@ "fr": null } }, + "Phenol, 4-chloro-2-methoxy-": { + "name": { + "en": "Phenol, 4-chloro-2-methoxy-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Phenol, 4,5-dichloro-2-methoxy-": { + "name": { + "en": "Phenol, 4,5-dichloro-2-methoxy-", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Phenol, dibromo-": { "name": { "en": "Phenol, dibromo-", @@ -13158,6 +13948,16 @@ "fr": null } }, + "Pyrene-d10 ": { + "name": { + "en": "Pyrene-d10 ", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Pyrethrin I": { "name": { "en": "Pyrethrin I", @@ -14668,6 +15468,16 @@ "fr": null } }, + "Tetrasul": { + "name": { + "en": "Tetrasul", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Thallium": { "name": { "en": "Thallium", @@ -14938,6 +15748,16 @@ "fr": null } }, + "Total Hexachlorocyclohexane, sum of isomers": { + "name": { + "en": "Total Hexachlorocyclohexane, sum of isomers", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Total Nitrogen, mixed forms": { "name": { "en": "Total Nitrogen, mixed forms", @@ -15108,6 +15928,16 @@ "fr": null } }, + "trans-1,4-Dichloro-2-butene": { + "name": { + "en": "trans-1,4-Dichloro-2-butene", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "trans-Chlordane": { "name": { "en": "trans-Chlordane", @@ -15658,6 +16488,26 @@ "fr": null } }, + "Water level elevation": { + "name": { + "en": "Water level elevation", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Water level in well, depth from a reference point": { + "name": { + "en": "Water level in well, depth from a reference point", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Weak, dissociable cyanide": { "name": { "en": "Weak, dissociable cyanide", @@ -15777,26 +16627,6 @@ "en": null, "fr": null } - }, - "Water level elevation": { - "name": { - "en": "Water level elevation", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Water level in well, depth from a reference point": { - "name": { - "en": "Water level in well, depth from a reference point", - "fr": null - }, - "description": { - "en": null, - "fr": null - } } } -} \ No newline at end of file +} diff --git a/schemas/data/src/locales/ResultAnalyticalMethodContext.json b/schemas/data/src/locales/ResultAnalyticalMethodContext.json index df441f18..e5a693d4 100644 --- a/schemas/data/src/locales/ResultAnalyticalMethodContext.json +++ b/schemas/data/src/locales/ResultAnalyticalMethodContext.json @@ -9,6 +9,16 @@ "fr": "Diffuseur de ResultAnalyticalMethodID.\r\n\r\nPour les données sur le terrain : Fabricant, marque ou diffuseur du test de terrain ou de l’équipement utilisé pour prélever les mesures. \r\n\r\nPour les données analysées en laboratoire : Diffuseur du code d’identification de la méthode. Pour plus d’information, voir Entrer les méthodes d’analyse dans le Centre d’apprentissage de DataStream. \r\n\r\nObligatoire si le champ ResultAnalyticalMethodID est rempli. \r\n" }, "values": { + "AOAC": { + "name": { + "en": "AOAC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "APHA": { "name": { "en": "APHA", @@ -89,6 +99,16 @@ "fr": null } }, + "CSSS": { + "name": { + "en": "CSSS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "DIN": { "name": { "en": "DIN", @@ -149,6 +169,26 @@ "fr": null } }, + "HANNA": { + "name": { + "en": "HANNA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "HOBO": { + "name": { + "en": "HOBO", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "Hydrolab": { "name": { "en": "Hydrolab", @@ -239,9 +279,9 @@ "fr": null } }, - "PALINTEST LTD": { + "Oxyguard": { "name": { - "en": "PALINTEST LTD", + "en": "Oxyguard", "fr": null }, "description": { @@ -249,9 +289,9 @@ "fr": null } }, - "PROPRIETARY": { + "PALINTEST LTD": { "name": { - "en": "PROPRIETARY", + "en": "PALINTEST LTD", "fr": null }, "description": { @@ -259,9 +299,9 @@ "fr": null } }, - "RBR": { + "PROPRIETARY": { "name": { - "en": "RBR", + "en": "PROPRIETARY", "fr": null }, "description": { @@ -269,9 +309,9 @@ "fr": null } }, - "Seal": { + "REED": { "name": { - "en": "Seal", + "en": "REED", "fr": null }, "description": { @@ -279,9 +319,9 @@ "fr": null } }, - "Solinst": { + "RBR": { "name": { - "en": "Solinst", + "en": "RBR", "fr": null }, "description": { @@ -289,9 +329,9 @@ "fr": null } }, - "THERMO-SCIENTIFIC": { + "Seal": { "name": { - "en": "THERMO-SCIENTIFIC", + "en": "Seal", "fr": null }, "description": { @@ -299,9 +339,9 @@ "fr": null } }, - "Turner Designs": { + "Solinst": { "name": { - "en": "Turner Designs", + "en": "Solinst", "fr": null }, "description": { @@ -309,9 +349,9 @@ "fr": null } }, - "USEPA": { + "SSSA": { "name": { - "en": "USEPA", + "en": "SSSA", "fr": null }, "description": { @@ -319,9 +359,9 @@ "fr": null } }, - "USDOI/USGS": { + "THERMO-SCIENTIFIC": { "name": { - "en": "USDOI/USGS", + "en": "THERMO-SCIENTIFIC", "fr": null }, "description": { @@ -329,9 +369,9 @@ "fr": null } }, - "VMV": { + "Turner Designs": { "name": { - "en": "VMV", + "en": "Turner Designs", "fr": null }, "description": { @@ -339,9 +379,9 @@ "fr": null } }, - "YSI": { + "USDA/SSIR": { "name": { - "en": "YSI", + "en": "USDA/SSIR", "fr": null }, "description": { @@ -349,9 +389,9 @@ "fr": null } }, - "AOAC": { + "USDOI/USGS": { "name": { - "en": "AOAC", + "en": "USDOI/USGS", "fr": null }, "description": { @@ -359,9 +399,9 @@ "fr": null } }, - "HANNA": { + "USEPA": { "name": { - "en": "HANNA", + "en": "USEPA", "fr": null }, "description": { @@ -369,9 +409,9 @@ "fr": null } }, - "HOBO": { + "VMV": { "name": { - "en": "HOBO", + "en": "VMV", "fr": null }, "description": { @@ -379,9 +419,9 @@ "fr": null } }, - "REED": { + "YSI": { "name": { - "en": "REED", + "en": "YSI", "fr": null }, "description": { @@ -390,395 +430,5 @@ } } } - }, - "name": { - "en": "ResultAnalyticalMethodContext", - "fr": null - }, - "description": { - "en": null, - "fr": null - }, - "values": { - "AOAC": { - "name": { - "en": "AOAC", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA": { - "name": { - "en": "APHA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM20ED": { - "name": { - "en": "APHA_SM20ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM21ED": { - "name": { - "en": "APHA_SM21ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM22ED": { - "name": { - "en": "APHA_SM22ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM23ED": { - "name": { - "en": "APHA_SM23ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM24ED": { - "name": { - "en": "APHA_SM24ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ASTM": { - "name": { - "en": "ASTM", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "BC_MOE": { - "name": { - "en": "BC_MOE", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "DIN": { - "name": { - "en": "DIN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "DOI": { - "name": { - "en": "DOI", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "EN": { - "name": { - "en": "EN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ENV/CANADA": { - "name": { - "en": "ENV/CANADA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ENVIROLOGIX": { - "name": { - "en": "ENVIROLOGIX", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HACH": { - "name": { - "en": "HACH", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HANNA": { - "name": { - "en": "HANNA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HOBO": { - "name": { - "en": "HOBO", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Hydrolab": { - "name": { - "en": "Hydrolab", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "IDEXX": { - "name": { - "en": "IDEXX", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ISO": { - "name": { - "en": "ISO", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "LACHAT": { - "name": { - "en": "LACHAT", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "LaMOTTE": { - "name": { - "en": "LaMOTTE", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "METER Group": { - "name": { - "en": "METER Group", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "MICROLOGY LABS": { - "name": { - "en": "MICROLOGY LABS", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Oakton": { - "name": { - "en": "Oakton", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ON MECP": { - "name": { - "en": "ON MECP", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "PALINTEST LTD": { - "name": { - "en": "PALINTEST LTD", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "PROPRIETARY": { - "name": { - "en": "PROPRIETARY", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "RBR": { - "name": { - "en": "RBR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "REED": { - "name": { - "en": "REED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Seal": { - "name": { - "en": "Seal", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Solinst": { - "name": { - "en": "Solinst", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "THERMO-SCIENTIFIC": { - "name": { - "en": "THERMO-SCIENTIFIC", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Turner Designs": { - "name": { - "en": "Turner Designs", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "USDOI/USGS": { - "name": { - "en": "USDOI/USGS", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "USEPA": { - "name": { - "en": "USEPA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "VMV": { - "name": { - "en": "VMV", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "YSI": { - "name": { - "en": "YSI", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - } } } \ No newline at end of file diff --git a/schemas/data/src/locales/SampleCollectionEquipmentName.json b/schemas/data/src/locales/SampleCollectionEquipmentName.json index 3eec8633..a2cb6e38 100644 --- a/schemas/data/src/locales/SampleCollectionEquipmentName.json +++ b/schemas/data/src/locales/SampleCollectionEquipmentName.json @@ -28,6 +28,16 @@ "fr": null } }, + "Ekman Grab": { + "name": { + "en": "Ekman Grab", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, "DH-81": { "name": { "en": "DH-81", From 11cc8c6d4bf7266b921cc48df1b050ee31a0a1e1 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 25 Jun 2026 13:42:20 -0400 Subject: [PATCH 37/51] feat: add new error and two QC warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New error rule CharacteristicName-Depth-ActivityDepthHeightMeasure forbids ActivityDepthHeightMeasure/Unit when CharacteristicName measures depth (e.g. "Depth of water column"). - New QC warning ResultStatusID-Deprecated for the retired values "Final" and "Accepted" (use Preliminary, Provisional, or Validated). - Split the AnalysisStartTime/AnalysisStartTimeZone co-dependency — time without timezone is now a QC warning; timezone without time stays an error. --- CHANGELOG.md | 6 ++ schemas/data/src/extract.json | 4 +- schemas/data/src/frontend.json | 4 +- schemas/data/src/locales/en-CA.ftl | 3 + ...Name-Depth-ActivityDepthHeightMeasure.json | 39 ++++++++++ schemas/data/src/primary.json | 4 +- schemas/data/src/quality-control.json | 6 ++ ...alysisStartTime-AnalysisStartTimeZone.json | 18 +++++ .../ResultStatusID-Deprecated.json | 13 ++++ schemas/data/test/logic.js | 76 +++++++++++++++++++ schemas/data/test/quality-control.js | 43 ++++++++++- schemas/data/test/required.js | 14 +++- 12 files changed, 224 insertions(+), 6 deletions(-) create mode 100644 schemas/data/src/logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json create mode 100644 schemas/data/src/quality-control/AnalysisStartTime-AnalysisStartTimeZone.json create mode 100644 schemas/data/src/quality-control/ResultStatusID-Deprecated.json diff --git a/CHANGELOG.md b/CHANGELOG.md index a3be8b42..b69cb64b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,9 +32,15 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - `SampleCollectionEquipmentName`: `Air line`, `Bailer`, `Hydrasleeve`, `Snap sampler`, `Tubing`, `Water level meter`, `Wetted tape` - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` - **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. No conditional logic or validation checks beyond the standard single-line string pattern. +- **`ResultStatusID` deprecation warning** — new quality-control warning `ResultStatusID-Deprecated`: `Final` and `Accepted` are flagged as no longer recommended (use `Preliminary`, `Provisional`, or `Validated`). The values remain valid in the enum; the warning does not block submission. + +### Changed + +- **`AnalysisStartTime` / `AnalysisStartTimeZone` co-dependency relaxed** — `AnalysisStartTime` without `AnalysisStartTimeZone` is no longer an error; it is now a quality-control warning (`AnalysisStartTime-AnalysisStartTimeZone`). The reverse — `AnalysisStartTimeZone` without `AnalysisStartTime` — remains an error. ### Breaking +- **New error — `ActivityDepthHeightMeasure` not allowed for depth characteristics** — new conditional logic rule `CharacteristicName-Depth-ActivityDepthHeightMeasure` (blocks submission): when `CharacteristicName` measures depth/height (e.g. `Depth of water column`, `Water level`, `Depth, Secchi disk depth`), `ActivityDepthHeightMeasure` and `ActivityDepthHeightUnit` must not be populated. Records that previously validated with a depth characteristic paired with an activity depth/height will now be rejected. - **Top-level `$id`s now end in `.json`**, mirroring filesystem paths so JSON Schema URL resolution works without filesystem fallbacks. Consumers must update `$ref`s when upgrading: - `https://datastream.org/schema/data/backend` → `…/backend.json` - `…/frontend` → `…/frontend.json` diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index 90e40419..455e4e3b 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -266,7 +266,6 @@ ], "ActivityStartTimeZone": ["ActivityStartTime"], "ActivityEndTimeZone": ["ActivityEndTime"], - "AnalysisStartTime": ["AnalysisStartTimeZone"], "AnalysisStartTimeZone": ["AnalysisStartTime"] } }, @@ -318,6 +317,9 @@ { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" }, + { + "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index 88dd0285..e71552a9 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -303,7 +303,6 @@ ], "ActivityStartTimeZone": ["ActivityStartTime"], "ActivityEndTimeZone": ["ActivityEndTime"], - "AnalysisStartTime": ["AnalysisStartTimeZone"], "AnalysisStartTimeZone": ["AnalysisStartTime"] }, "errorMessage": { @@ -358,6 +357,9 @@ { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" }, + { + "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index ee46c7ed..96f0aac0 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -86,6 +86,7 @@ error-ActivityType-CTS-ActivityStartTime = Continuous time-series observations m error-ActivityType-ResultAnalyticalMethod = Requires LaboratoryName and ResultAnalyticalMethod columns when ActivityType starts with 'Sample' (i.e. Activity is not a Field Msr/Obs) error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported error-ActivityMediaName-Groundwater-DepthMeasure = At least one of ActivityDepthHeightMeasure, BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, or WellOpenIntervalBottomMeasure must be reported when ActivityMediaName is 'Groundwater' or 'Porewater' +error-CharacteristicName-Depth-ActivityDepthHeightMeasure = ActivityDepthHeightMeasure should not be populated when the CharacteristicName measures depth (e.g. "Depth of water column"). error-CharacteristicName-MethodSpeciation = MethodSpeciation required for selected CharacteristicName error-CharacteristicName-Nutrient-ResultSampleFraction = ResultSampleFractions for nutrients should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) error-CharacteristicName-ResultSampleFraction = ResultSampleFraction required for selected CharacteristicName @@ -106,6 +107,7 @@ qc-ActivityMediaName-ActivityDepthHeightMeasure-Maximum = ActivityDepthHeightMea qc-ActivityType-CTS-ActivityStartTimeZone = ActivityStartTimeZone should be included when ActivityType is 'Field Msr/Obs-Continuous Time Series' qc-ActivityType-CTS-ActivityStartTimeZone-UTC = When ActivityStartTimeZone is '+00:00', consider adding a note in your dataset metadata to let others know your data are reported in UTC/GMT qc-ActivityType-ResultSampleFraction = ResultSampleFraction may not be relevant for selected ActivityType, except for nutrient parameters, which should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) +qc-AnalysisStartTime-AnalysisStartTimeZone = AnalysisStartTimeZone should be included when AnalysisStartTime is provided # qc-CharacteristicName-Deprecated = CharacteristicName has been deprecated. Review most up to date template for alternate or contact us. qc-CharacteristicName-ActivityMediaName-AmbientAir = The ActivityMediaName for this CharacteristicName should be "Ambient Air" qc-CharacteristicName-ActivityType-Surrogate = When reported as a percentage, this characteristic may be a surrogate standard. If this is the case, please use the ActivityType 'Quality Control Sample-Lab Surrogate Control Standard' or 'Quality Control Sample-Lab Surrogate Control Standard Duplicate' @@ -125,6 +127,7 @@ qc-ResultDetectionQuantitationLimitUnit-NoValue = ResultDetectionQuantitationLim qc-ResultDetectionQuantitationLimitUnit-Turbidity = ResultUnit should be used with CharacteristicName 'Turbidity' qc-ResultSampleFraction-ActivityMediaName-Sediment = If a sequential extraction was performed on a water sample, or particulates in a water sample, information regarding the reagents used should be indicated in the ResultComment, not the ResultSampleFraction. For guidance on how to select ResultSampleFraction in this case, please refer to our Best practices for submitting metal-series data to DataStream (https://datastream.org/en-ca/documentation/metal-series-data-guidance) qc-ResultSampleFraction-FreeAvailable = The ResultSampleFraction 'Free Available' may not be relevant for the selected CharacteristicName +qc-ResultStatusID-Deprecated = ResultStatusID "Final" and "Accepted" are no longer allowed values. Please use the allowed values "Preliminary", "Provisional", or "Validated". # qc-ResultUnit-Elevation = The unit for the CharacteristicName should be an elevation. ** TODO: MASL not a unit, needs to be added to QC rule lists qc-CharacteristicName-pH-ResultUnit-None = The unit for the CharacteristicName should be None qc-CharacteristicName-Ratio-ResultUnit-None = The unit for the CharacteristicName should be None diff --git a/schemas/data/src/logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json b/schemas/data/src/logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json new file mode 100644 index 00000000..410b827d --- /dev/null +++ b/schemas/data/src/logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json @@ -0,0 +1,39 @@ +{ + "$id": "https://datastream.org/schema/data/logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json", + "title": "CharacteristicName-Depth-ActivityDepthHeightMeasure", + "description": "When CharacteristicName measures depth/height, the depth is the result itself, so ActivityDepthHeightMeasure/Unit should not be populated.", + "errorMessage": "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "CharacteristicName": { + "enum": [ + "Bankfull Height", + "Depth of water column", + "Depth, Secchi disk depth", + "Depth, snow cover", + "Ice thickness", + "Light attenuation, depth at 99%", + "Transparency, Secchi tube with disk", + "Transparency, tube with disk", + "Water level", + "Water level (probe)", + "Water level elevation", + "Water level in well, depth from a reference point", + "White ice thickness" + ] + } + }, + "required": ["CharacteristicName"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ActivityDepthHeightMeasure": false, + "ActivityDepthHeightUnit": false + }, + "required": [] + } +} diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index d54da840..8f274ccb 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -262,7 +262,6 @@ ], "ActivityStartTimeZone": ["ActivityStartTime"], "ActivityEndTimeZone": ["ActivityEndTime"], - "AnalysisStartTime": ["AnalysisStartTimeZone"], "AnalysisStartTimeZone": ["AnalysisStartTime"] } }, @@ -314,6 +313,9 @@ { "$ref": "./logic/CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint.json" }, + { + "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/quality-control.json b/schemas/data/src/quality-control.json index dc506326..7589d813 100644 --- a/schemas/data/src/quality-control.json +++ b/schemas/data/src/quality-control.json @@ -150,6 +150,9 @@ { "$ref": "./quality-control/ActivityType-ResultSampleFraction.json" }, + { + "$ref": "./quality-control/AnalysisStartTime-AnalysisStartTimeZone.json" + }, { "$ref": "./quality-control/CharacteristicName-ActivityMediaName-AmbientAir.json" }, @@ -204,6 +207,9 @@ { "$ref": "./quality-control/ResultSampleFraction-FreeAvailable.json" }, + { + "$ref": "./quality-control/ResultStatusID-Deprecated.json" + }, { "$ref": "./quality-control/ResultUnit-Percent.json" }, diff --git a/schemas/data/src/quality-control/AnalysisStartTime-AnalysisStartTimeZone.json b/schemas/data/src/quality-control/AnalysisStartTime-AnalysisStartTimeZone.json new file mode 100644 index 00000000..b622dce9 --- /dev/null +++ b/schemas/data/src/quality-control/AnalysisStartTime-AnalysisStartTimeZone.json @@ -0,0 +1,18 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/AnalysisStartTime-AnalysisStartTimeZone.json", + "title": "AnalysisStartTime-AnalysisStartTimeZone", + "description": "AnalysisStartTimeZone should be included when AnalysisStartTime is provided.", + "errorMessage": "qc-AnalysisStartTime-AnalysisStartTimeZone", + "if": { + "type": "object", + "unevaluatedProperties": true, + "properties": { "AnalysisStartTime": true }, + "required": ["AnalysisStartTime"] + }, + "then": { + "type": "object", + "unevaluatedProperties": true, + "properties": { "AnalysisStartTimeZone": true }, + "required": ["AnalysisStartTimeZone"] + } +} diff --git a/schemas/data/src/quality-control/ResultStatusID-Deprecated.json b/schemas/data/src/quality-control/ResultStatusID-Deprecated.json new file mode 100644 index 00000000..892c88f7 --- /dev/null +++ b/schemas/data/src/quality-control/ResultStatusID-Deprecated.json @@ -0,0 +1,13 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/ResultStatusID-Deprecated.json", + "title": "ResultStatusID-Deprecated", + "description": "ResultStatusID 'Final' and 'Accepted' are no longer allowed; use Preliminary, Provisional, or Validated.", + "errorMessage": "qc-ResultStatusID-Deprecated", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "ResultStatusID": { + "not": { "enum": ["Accepted", "Final"] } + } + } +} diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 782f4e49..05b1f86e 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -985,6 +985,82 @@ test("Should accept Water level CharacteristicName with ActivityDepthAltitudeRef ); }); +// *** CharacteristicName-Depth-ActivityDepthHeightMeasure *** // +test("Should reject ActivityDepthHeightMeasure when CharacteristicName measures depth", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Depth of water column", + ActivityDepthHeightMeasure: 5, + ActivityDepthHeightUnit: "m", + ResultValue: 5, + ResultUnit: "m", + }); + assert.equal(valid, false); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + ), + true, + ); +}); + +test("Should reject ActivityDepthHeightUnit when CharacteristicName measures depth", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Water level", + ActivityDepthHeightUnit: "m", + ResultValue: 1.2, + ResultUnit: "m", + }); + assert.equal(valid, false); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + ), + true, + ); +}); + +test("Should accept depth CharacteristicName without ActivityDepthHeight fields", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Depth of water column", + ResultValue: 5, + ResultUnit: "m", + }); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + ), + false, + ); +}); + +test("Should accept ActivityDepthHeightMeasure for a non-depth CharacteristicName", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Temperature, water", + ActivityDepthHeightMeasure: 5, + ActivityDepthHeightUnit: "m", + ResultValue: 12.3, + ResultUnit: "deg C", + }); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + ), + false, + ); +}); + // *** ActivityMediaName-Groundwater-DepthMeasure *** // test("Should reject Groundwater ActivityMediaName without any depth measure", async (t) => { const valid = validate({ diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index 1661acea..ba6b5fb5 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -21,7 +21,7 @@ const defaultObject = { ResultValue: 99.99, ResultUnit: '#/100ml', ResultValueType: 'Actual', - ResultStatusID: 'Accepted', + ResultStatusID: 'Validated', ResultComment: 'None at this time', ResultAnalyticalMethodID: '1', ResultAnalyticalMethodContext: 'APHA', @@ -1176,3 +1176,44 @@ test('Should accept columns without extra whitespace', async (t) => { }) assert.equal(valid, true) }) + +// *** ResultStatusID-Deprecated *** // +test('Should reject deprecated ResultStatusID Final', async (t) => { + const valid = validate({ + ResultStatusID: 'Final' + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), true) +}) + +test('Should reject deprecated ResultStatusID Accepted', async (t) => { + const valid = validate({ + ResultStatusID: 'Accepted' + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), true) +}) + +test('Should accept ResultStatusID Validated', async (t) => { + const valid = validate({ + ResultStatusID: 'Validated' + }) + assert.equal(valid, true) +}) + +// *** AnalysisStartTime-AnalysisStartTimeZone *** // +test('Should warn when AnalysisStartTime is present without AnalysisStartTimeZone', async (t) => { + const valid = validate({ + AnalysisStartTime: '13:15:00' + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'message', 'qc-AnalysisStartTime-AnalysisStartTimeZone'), true) +}) + +test('Should accept AnalysisStartTime with AnalysisStartTimeZone', async (t) => { + const valid = validate({ + AnalysisStartTime: '13:15:00', + AnalysisStartTimeZone: '-06:00' + }) + assert.equal(valid, true) +}) diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index 004c58b3..145e44d2 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -256,13 +256,23 @@ test("Should accept ResultDetectionQuantitationLimitMeasure AND ResultDetectionQ ); }); -test("Should reject AnalysisStartTime AND NOT AnalysisStartTimeZone", async (t) => { +test("Should accept AnalysisStartTime AND NOT AnalysisStartTimeZone (no longer an error; warning only)", async (t) => { const valid = validate({ AnalysisStartTime: true, }); - assert.equal(valid, false); assert.equal( checkProperty(validate.errors, "dependencies", "AnalysisStartTimeZone"), + false, + ); +}); + +test("Should reject AnalysisStartTimeZone AND NOT AnalysisStartTime", async (t) => { + const valid = validate({ + AnalysisStartTimeZone: true, + }); + assert.equal(valid, false); + assert.equal( + checkProperty(validate.errors, "dependencies", "AnalysisStartTime"), true, ); }); From 6a3108b2e9045a8cbda5fa9aa7bfd674343b4b1a Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 26 Jun 2026 13:13:44 -0400 Subject: [PATCH 38/51] feat: convert ActivityGroupType to a custom enum and finalize Q2-2026 updates - ActivityGroupType: drop the WQX base and generate from additions (keep Other); 7 values - Promote ActivityMediaName-ActivityDepthHeightMeasure-Maximum to a blocking error - Trim the matching QC warning to Groundwater/Porewater only - Remove Sample-Depletion Replicate from the ActivityType allowed subset - Map Water level elevation and Nitrobenzene-D5 to CharacteristicWQXGroups - Add a build-time check for subset ActivityTypes missing a group mapping - Regenerate values for the wqx 3.0.276 bump; update tests and CHANGELOG --- CHANGELOG.md | 5 + schemas/data/bin/build-lib.js | 2 +- schemas/data/bin/build-lookup.js | 19 + schemas/data/package-lock.json | 8 +- schemas/data/package.json | 2 +- .../data/src/addition/ActivityGroupType.json | 1 + schemas/data/src/extract.json | 3 + schemas/data/src/frontend.json | 3 + .../data/src/locales/ActivityGroupType.json | 2 +- .../data/src/locales/CharacteristicName.json | 12 +- .../ResultAnalyticalMethodContext.json | 430 ++++++++++++++++++ schemas/data/src/locales/en-CA.ftl | 1 + ...acteristicName-CharacteristicWQXGroup.json | 2 + schemas/data/src/primary.json | 3 + ...me-ActivityDepthHeightMeasure-Maximum.json | 8 +- schemas/data/src/subset/ActivityType.json | 1 - .../src/values/ActivityGroupType.legacy.json | 12 +- .../src/values/ActivityGroupType.primary.json | 12 +- .../data/src/values/ActivityType.legacy.json | 4 +- .../data/src/values/ActivityType.primary.json | 31 +- .../src/values/CharacteristicName.legacy.json | 84 +++- .../values/CharacteristicName.primary.json | 83 ++++ .../src/values/MeasurementUnit.legacy.json | 4 + .../ResultAnalyticalMethodContext.legacy.json | 4 + ...ResultAnalyticalMethodContext.primary.json | 4 + ...DetectionQuantitationLimitUnit.legacy.json | 4 + .../src/values/ResultStatusID.primary.json | 1 - .../data/src/values/ResultUnit.legacy.json | 4 + .../SampleCollectionEquipmentName.legacy.json | 1 + ...SampleCollectionEquipmentName.primary.json | 1 + schemas/data/test/logic.js | 76 ++++ schemas/data/test/quality-control.js | 32 +- 32 files changed, 777 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b69cb64b..b80e11b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,10 +33,12 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` - **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. No conditional logic or validation checks beyond the standard single-line string pattern. - **`ResultStatusID` deprecation warning** — new quality-control warning `ResultStatusID-Deprecated`: `Final` and `Accepted` are flagged as no longer recommended (use `Preliminary`, `Provisional`, or `Validated`). The values remain valid in the enum; the warning does not block submission. +- **Q2 2026 WQX update** (`wqx` `3.0.267` → `3.0.276`): new values across `CharacteristicName`, `ActivityType`, `ResultAnalyticalMethodContext`, and `SampleCollectionEquipmentName`. ### Changed - **`AnalysisStartTime` / `AnalysisStartTimeZone` co-dependency relaxed** — `AnalysisStartTime` without `AnalysisStartTimeZone` is no longer an error; it is now a quality-control warning (`AnalysisStartTime-AnalysisStartTimeZone`). The reverse — `AnalysisStartTimeZone` without `AnalysisStartTime` — remains an error. +- **`ActivityType`, `ResultSampleFraction`, and `ResultValueType` restricted to a curated subset** in the strict flavors (`primary`/`frontend`/`extract`); these now use an allowed-value list (`subset/`) rather than a removal list (`subtraction/`). Values outside the subset stay accepted by the loose `backend` import flavor. ### Breaking @@ -52,6 +54,9 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - **Misplaced `$id`s corrected** (drifted from their filesystem paths): - `logic/ResultUnit-Salinity.json` (was `quality-control/ResultUnit-Salinity.json`) - `quality-control/ResultDetectionQuantitationLimitMeasure-Minimum.json` (was `…MinimumMeasure-Minimum.json`) +- **`ActivityGroupType` values replaced** — `ActivityGroupType` is now a DataStream-defined enum (`Continuous Data`, `Field Measure`, `Lab Sample`, `Other`, `Quality Control - Field Measure`, `Quality Control - Lab Sample`, `Unspecified`) instead of the inherited WQX set (`Field Set`, `QC Sample`, `Replicate`, `Subsample`, `Trip` dropped; `Other`/`Unspecified` kept). The published `database/ActivityGroupType.json` value list and the `ActivityType` → `ActivityGroupType` mapping (`lookup/ActivityType-ActivityGroupType.json`) change accordingly. Downstream consumers that store ActivityGroupType values or UUIDs must migrate. +- **`ResultStatusID` value `Rejected` removed** from the allowed (strict) value set — records with `ResultStatusID` of `Rejected` are now rejected by `primary`/`frontend`/`extract` (the value remains in the loose `backend` enum for historical import). +- **New error — `ActivityDepthHeightMeasure` must be negative for certain media** — new conditional logic rule `ActivityMediaName-ActivityDepthHeightMeasure-Maximum` (blocks submission): when `ActivityMediaName` is `Ocean Water`, `Rainwater`, `Stormwater`, `Subsurface Soil/Sediment`, `Surface Water`, or `Surface Water Sediment`, `ActivityDepthHeightMeasure` must be reported as a negative value. For `Groundwater`/`Porewater`, a positive depth instead raises the existing quality-control warning. ## [2.29.0] - 2026-03-12 diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index a1b9fadb..aa1e74ad 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -25,6 +25,7 @@ export const subsetOnly = [ // Custom fields (non-WQX) that need value files generated export const custom = [ + "ActivityGroupType", "AquiferType", "AquiferUnitName", "WellIDContext", @@ -50,7 +51,6 @@ export const wqx = { WellOpenIntervalTopUnit: "MeasurementUnit", WellOpenIntervalBottomUnit: "MeasurementUnit", ActivityType: "ActivityType", - ActivityGroupType: "ActivityGroupType", ActivityMediaName: "ActivityMediaSubdivision", ActivityDepthHeightUnit: "MeasurementUnit", ActivityDepthAltitudeReferencePointUnit: "MeasurementUnit", diff --git a/schemas/data/bin/build-lookup.js b/schemas/data/bin/build-lookup.js index 772f1bcf..0a37a60e 100644 --- a/schemas/data/bin/build-lookup.js +++ b/schemas/data/bin/build-lookup.js @@ -71,6 +71,25 @@ for (const characteristicName of characteristicNames) { } } +// Testing - flag approved (strict/subset) ActivityType values with no +// ActivityGroupType mapping; these silently default to "Other" in the seeder +let activityTypeActivityGroupType = await readFile( + join(__dirname, `../lookup/ActivityType-ActivityGroupType.json`) +).then((res) => JSON.parse(res)) +let activityTypes = await readFile( + join(__dirname, `../src/values/ActivityType.primary.json`) +).then((res) => JSON.parse(res)) +activityTypes = activityTypes.enum + +for (const activityType of activityTypes) { + if (!activityTypeActivityGroupType[activityType]) { + console.log( + `ActivityType-ActivityGroupType: Missing group mapping (defaults to "Other")`, + activityType + ) + } +} + // Export - Deprecate when using nodejs18 for (const path of [ join(__dirname, `/../lookup/CharacteristicName-CharacteristicWQXGroup.json`), diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index b6bee734..ecbcc09b 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -9,7 +9,7 @@ "version": "3.0.0-rc.0", "license": "MIT", "dependencies": { - "wqx": "3.0.267" + "wqx": "3.0.276" }, "devDependencies": { "change-case": "^5.0.0" @@ -23,9 +23,9 @@ "license": "MIT" }, "node_modules/wqx": { - "version": "3.0.267", - "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.267.tgz", - "integrity": "sha512-6gHV7W/vP32wWKsqADz0/5IZ8eq5tDS7cuqAnzopSY7VzGnZUkFSCX0FLse8E41RzahNIcdpNakQSbe0+nLqyw==", + "version": "3.0.276", + "resolved": "https://registry.npmjs.org/wqx/-/wqx-3.0.276.tgz", + "integrity": "sha512-Q99FftDQs8/akXxszSR53CR4zpskTKqC2CXAhge0Szu/y91mbJLThCxP7RYGwG85iEAzZXRHx8cWVNohRkIePQ==", "license": "MIT" } } diff --git a/schemas/data/package.json b/schemas/data/package.json index ba48f10e..82e4565b 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/datastreamapp/schema#readme", "dependencies": { - "wqx": "3.0.267" + "wqx": "3.0.276" }, "devDependencies": { "change-case": "^5.0.0" diff --git a/schemas/data/src/addition/ActivityGroupType.json b/schemas/data/src/addition/ActivityGroupType.json index 2bd22dae..97436dcc 100644 --- a/schemas/data/src/addition/ActivityGroupType.json +++ b/schemas/data/src/addition/ActivityGroupType.json @@ -2,6 +2,7 @@ "Continuous Data", "Field Measure", "Lab Sample", + "Other", "Quality Control - Field Measure", "Quality Control - Lab Sample", "Unspecified" diff --git a/schemas/data/src/extract.json b/schemas/data/src/extract.json index 455e4e3b..d1e5aa50 100644 --- a/schemas/data/src/extract.json +++ b/schemas/data/src/extract.json @@ -320,6 +320,9 @@ { "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" }, + { + "$ref": "./logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/frontend.json b/schemas/data/src/frontend.json index e71552a9..37ee41ce 100644 --- a/schemas/data/src/frontend.json +++ b/schemas/data/src/frontend.json @@ -360,6 +360,9 @@ { "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" }, + { + "$ref": "./logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/locales/ActivityGroupType.json b/schemas/data/src/locales/ActivityGroupType.json index 9052fb67..acf231cc 100644 --- a/schemas/data/src/locales/ActivityGroupType.json +++ b/schemas/data/src/locales/ActivityGroupType.json @@ -84,7 +84,7 @@ "fr": null }, "description": { - "en": "DEPRECATED", + "en": null, "fr": null } }, diff --git a/schemas/data/src/locales/CharacteristicName.json b/schemas/data/src/locales/CharacteristicName.json index c13671e4..f7632f04 100644 --- a/schemas/data/src/locales/CharacteristicName.json +++ b/schemas/data/src/locales/CharacteristicName.json @@ -16627,6 +16627,16 @@ "en": null, "fr": null } + }, + "Pyrene-d10": { + "name": { + "en": "Pyrene-d10", + "fr": null + }, + "description": { + "en": null, + "fr": null + } } } -} +} \ No newline at end of file diff --git a/schemas/data/src/locales/ResultAnalyticalMethodContext.json b/schemas/data/src/locales/ResultAnalyticalMethodContext.json index e5a693d4..9b5fab04 100644 --- a/schemas/data/src/locales/ResultAnalyticalMethodContext.json +++ b/schemas/data/src/locales/ResultAnalyticalMethodContext.json @@ -430,5 +430,435 @@ } } } + }, + "name": { + "en": "ResultAnalyticalMethodContext", + "fr": null + }, + "description": { + "en": null, + "fr": null + }, + "values": { + "AOAC": { + "name": { + "en": "AOAC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA": { + "name": { + "en": "APHA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA_SM20ED": { + "name": { + "en": "APHA_SM20ED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA_SM21ED": { + "name": { + "en": "APHA_SM21ED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA_SM22ED": { + "name": { + "en": "APHA_SM22ED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA_SM23ED": { + "name": { + "en": "APHA_SM23ED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "APHA_SM24ED": { + "name": { + "en": "APHA_SM24ED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ASTM": { + "name": { + "en": "ASTM", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "BC_MOE": { + "name": { + "en": "BC_MOE", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "CSSS": { + "name": { + "en": "CSSS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "DIN": { + "name": { + "en": "DIN", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "DOI": { + "name": { + "en": "DOI", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "EN": { + "name": { + "en": "EN", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ENV/CANADA": { + "name": { + "en": "ENV/CANADA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ENVIROLOGIX": { + "name": { + "en": "ENVIROLOGIX", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "HACH": { + "name": { + "en": "HACH", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "HANNA": { + "name": { + "en": "HANNA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "HOBO": { + "name": { + "en": "HOBO", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Hydrolab": { + "name": { + "en": "Hydrolab", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "IDEXX": { + "name": { + "en": "IDEXX", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ISO": { + "name": { + "en": "ISO", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LACHAT": { + "name": { + "en": "LACHAT", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "LaMOTTE": { + "name": { + "en": "LaMOTTE", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "METER Group": { + "name": { + "en": "METER Group", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "MICROLOGY LABS": { + "name": { + "en": "MICROLOGY LABS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oakton": { + "name": { + "en": "Oakton", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "ON MECP": { + "name": { + "en": "ON MECP", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Oxyguard": { + "name": { + "en": "Oxyguard", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "PALINTEST LTD": { + "name": { + "en": "PALINTEST LTD", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "PROPRIETARY": { + "name": { + "en": "PROPRIETARY", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "RBR": { + "name": { + "en": "RBR", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "REED": { + "name": { + "en": "REED", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Seal": { + "name": { + "en": "Seal", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Solinst": { + "name": { + "en": "Solinst", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "SSSA": { + "name": { + "en": "SSSA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "THERMO-SCIENTIFIC": { + "name": { + "en": "THERMO-SCIENTIFIC", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "Turner Designs": { + "name": { + "en": "Turner Designs", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "USDA/SSIR": { + "name": { + "en": "USDA/SSIR", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "USDOI/USGS": { + "name": { + "en": "USDOI/USGS", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "USEPA": { + "name": { + "en": "USEPA", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "VMV": { + "name": { + "en": "VMV", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + }, + "YSI": { + "name": { + "en": "YSI", + "fr": null + }, + "description": { + "en": null, + "fr": null + } + } } } \ No newline at end of file diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 96f0aac0..9b3b8aac 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -85,6 +85,7 @@ error-string-multiline-pattern = Only letters, numbers, punctuation, symbols, sp error-ActivityType-CTS-ActivityStartTime = Continuous time-series observations must include a valid ActivityStartTime error-ActivityType-ResultAnalyticalMethod = Requires LaboratoryName and ResultAnalyticalMethod columns when ActivityType starts with 'Sample' (i.e. Activity is not a Field Msr/Obs) error-ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint = ActivityDepthAltitudeReferencePoint is required when ActivityDepthHeightMeasure is reported +error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum = ActivityDepthHeightMeasure must be reported as a negative value. error-ActivityMediaName-Groundwater-DepthMeasure = At least one of ActivityDepthHeightMeasure, BoreholeDepthMeasure, WellDepthMeasure, WellOpenIntervalTopMeasure, or WellOpenIntervalBottomMeasure must be reported when ActivityMediaName is 'Groundwater' or 'Porewater' error-CharacteristicName-Depth-ActivityDepthHeightMeasure = ActivityDepthHeightMeasure should not be populated when the CharacteristicName measures depth (e.g. "Depth of water column"). error-CharacteristicName-MethodSpeciation = MethodSpeciation required for selected CharacteristicName diff --git a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json index be671d84..18781bdc 100644 --- a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json +++ b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json @@ -188,6 +188,7 @@ "Nickel-60": "Stable Isotopes", "Nitenpyram": "Organics, Pesticide", "Nitrapyrin": "Organics, Pesticide", + "Nitrobenzene-D5": "Organics, Other", "Nitrogen-15/Nitrogen-14 ratio": "Stable Isotopes", "Nitrophenol": "Organics, Other", "Nonanal": "Organics, Other", @@ -267,6 +268,7 @@ "Uranium-234/Uranium-238 ratio": "Radiochemical", "Valeric acid":"Organics, Other", "Venlafaxine": "Organics, Other", + "Water level elevation": "Physical", "Weak, dissociable cyanide": "Inorganics, Minor, Non-metals", "Zinc-66": "Stable Isotopes", "Zoxamide": "Organics, Pesticide" diff --git a/schemas/data/src/primary.json b/schemas/data/src/primary.json index 8f274ccb..de2a717d 100644 --- a/schemas/data/src/primary.json +++ b/schemas/data/src/primary.json @@ -316,6 +316,9 @@ { "$ref": "./logic/CharacteristicName-Depth-ActivityDepthHeightMeasure.json" }, + { + "$ref": "./logic/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json" + }, { "$ref": "./logic/ActivityMediaName-Groundwater-DepthMeasure.json" }, diff --git a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json index 1fcc3535..8a32d60b 100644 --- a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json +++ b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json @@ -10,13 +10,7 @@ "ActivityMediaName": { "enum": [ "Groundwater", - "Ocean Water", - "Porewater", - "Rainwater", - "Stormwater", - "Subsurface Soil/Sediment", - "Surface Water", - "Surface Water Sediment" + "Porewater" ] }, "ActivityDepthHeightMeasure": true diff --git a/schemas/data/src/subset/ActivityType.json b/schemas/data/src/subset/ActivityType.json index 014c8e0b..1cbbaddd 100644 --- a/schemas/data/src/subset/ActivityType.json +++ b/schemas/data/src/subset/ActivityType.json @@ -24,7 +24,6 @@ "Quality Control-Calibration Check", "Sample-Composite With Parents", "Sample-Composite Without Parents", - "Sample-Depletion Replicate", "Sample-Field Split", "Sample-Integrated Flow Proportioned", "Sample-Integrated Horizontal and Vertical Composite Profile", diff --git a/schemas/data/src/values/ActivityGroupType.legacy.json b/schemas/data/src/values/ActivityGroupType.legacy.json index 68f9f9ab..16a372a3 100644 --- a/schemas/data/src/values/ActivityGroupType.legacy.json +++ b/schemas/data/src/values/ActivityGroupType.legacy.json @@ -4,13 +4,13 @@ "description": "", "type": "string", "enum": [ - "Field Set", + "Continuous Data", + "Field Measure", + "Lab Sample", "Other", - "QC Sample", - "Replicate", - "Subsample", - "Trip", + "Quality Control - Field Measure", + "Quality Control - Lab Sample", "Unspecified" ], - "maxLength": 11 + "maxLength": 31 } \ No newline at end of file diff --git a/schemas/data/src/values/ActivityGroupType.primary.json b/schemas/data/src/values/ActivityGroupType.primary.json index 2f7c1cf2..d48e72c7 100644 --- a/schemas/data/src/values/ActivityGroupType.primary.json +++ b/schemas/data/src/values/ActivityGroupType.primary.json @@ -4,13 +4,13 @@ "description": "", "type": "string", "enum": [ - "Field Set", + "Continuous Data", + "Field Measure", + "Lab Sample", "Other", - "QC Sample", - "Replicate", - "Subsample", - "Trip", + "Quality Control - Field Measure", + "Quality Control - Lab Sample", "Unspecified" ], - "maxLength": 11 + "maxLength": 31 } \ No newline at end of file diff --git a/schemas/data/src/values/ActivityType.legacy.json b/schemas/data/src/values/ActivityType.legacy.json index aa785917..5e1e4f32 100644 --- a/schemas/data/src/values/ActivityType.legacy.json +++ b/schemas/data/src/values/ActivityType.legacy.json @@ -8,8 +8,10 @@ "Field Msr/Obs-Continuous Time Series", "Field Msr/Obs-Habitat Assessment", "Field Msr/Obs-Incidental", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", "Field Msr/Obs-Portable Data Logger", - "Quality Control", "Quality Control Alternative Measurement Sensitivity", "Quality Control Alternative Measurement Sensitivity Plus", "Quality Control Field Calibration Check", diff --git a/schemas/data/src/values/ActivityType.primary.json b/schemas/data/src/values/ActivityType.primary.json index f79dea07..7057cba7 100644 --- a/schemas/data/src/values/ActivityType.primary.json +++ b/schemas/data/src/values/ActivityType.primary.json @@ -6,60 +6,35 @@ "enum": [ "Field Msr/Obs", "Field Msr/Obs-Continuous Time Series", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", "Field Msr/Obs-Portable Data Logger", - "Quality Control Alternative Measurement Sensitivity", - "Quality Control Alternative Measurement Sensitivity Plus", - "Quality Control Field Msr/Obs Post-Calibration", - "Quality Control Field Msr/Obs Pre-Calibration", "Quality Control Field Replicate Msr/Obs", "Quality Control Field Replicate Portable Data Logger", "Quality Control Field Sample Equipment Rinsate Blank", "Quality Control Sample-Blind Duplicate", "Quality Control Sample-Field Blank", "Quality Control Sample-Field Replicate", - "Quality Control Sample-Field Spike", - "Quality Control Sample-Field Surrogate Spike", - "Quality Control Sample-Integrated Time Series-Equipment Blank", - "Quality Control Sample-Integrated Time Series-Field Blank", - "Quality Control Sample-Integrated Time Series-Lab Blank", - "Quality Control Sample-Integrated Time Series-Trip Blank", - "Quality Control Sample-Integrated Time Series-Unspecified Blank", - "Quality Control Sample-Inter-lab Split", "Quality Control Sample-Lab Blank", "Quality Control Sample-Lab Duplicate", - "Quality Control Sample-Lab Duplicate 2", "Quality Control Sample-Lab Matrix Spike", "Quality Control Sample-Lab Re-Analysis", "Quality Control Sample-Lab Spike", - "Quality Control Sample-Lab Spike Target", "Quality Control Sample-Lab Split", "Quality Control Sample-Lab Surrogate Control Standard", "Quality Control Sample-Lab Surrogate Control Standard Duplicate", - "Quality Control Sample-Measurement Precision Sample", - "Quality Control Sample-Other", - "Quality Control Sample-Post-preservative Blank", - "Quality Control Sample-Pre-preservative Blank", - "Quality Control Sample-Reagent Blank", "Quality Control Sample-Reference Sample", "Quality Control Sample-Trip Blank", "Quality Control-Calibration Check", - "Quality Control-Calibration Check Buffer", - "Quality Control-Meter Lab Blank", - "Quality Control-Meter Lab Duplicate", - "Quality Control-Meter Lab Duplicate 2", - "Quality Control-Negative Control", "Sample-Composite With Parents", "Sample-Composite Without Parents", - "Sample-Depletion Replicate", "Sample-Field Split", - "Sample-Field Subsample", - "Sample-Integrated Cross-Sectional Profile", "Sample-Integrated Flow Proportioned", "Sample-Integrated Horizontal and Vertical Composite Profile", "Sample-Integrated Horizontal Profile", "Sample-Integrated Time Series", "Sample-Integrated Vertical Profile", - "Sample-Negative Control", "Sample-Other", "Sample-Positive Control", "Sample-Routine", diff --git a/schemas/data/src/values/CharacteristicName.legacy.json b/schemas/data/src/values/CharacteristicName.legacy.json index ccf832f6..cd55a047 100644 --- a/schemas/data/src/values/CharacteristicName.legacy.json +++ b/schemas/data/src/values/CharacteristicName.legacy.json @@ -1477,6 +1477,7 @@ "1-Hexanol, 3,3,4,4,5,5,6,6,6-nonafluoro-", "1-Hexanol, 3,3,4,4,5,5,6,6,6-nonafluoro-, 1,1'-(hydrogen phosphate)", "1-Hexanol, 6-chloro-3,3,4,4,5,5,6,6-octafluoro-", + "1-Hexen-3-one", "1-Hexen-3-yne, 5-methyl-5-(2,2,3,3-tetrafluoropropoxy)-", "1-Hexene", "1-Hexene & 2-Methyl-1-pentene", @@ -3572,6 +3573,8 @@ "1,5,6-Triazabicyclo[3.1.0]hexane, 2-methyl-2-phenyl-4,4,6-tris(trifluoromethyl)", "1,5,6-Triazabicyclo[3.1.0]hexane, 2,2-dimethyl-4,4,6-tris(trifluoromethyl)-", "1,5,8-Trioxa-3-aza-4.lambda.^5-phosphaspiro[3.4]octane, 2,2,6,6,7,7-hexakis(trifluoromethyl)-4-[2,2,2-trifluoro-1-(trifluoromethyl)ethoxy]-", + "1,6-Anhydro-beta-D-glucopyranose-13C6", + "1,6-anhydro-beta-D-mannopyranose", "1,6-B+D873is(trimethoxysilanylethyl)perfluorohexane", "1,6-Bis(perfluoroethyl)hexane", "1,6-dibromo-2-chloro-1,1,2-trifluorohexane", @@ -3690,6 +3693,7 @@ "12,12,13,13,14,14,15,15,16,16,17,17,17-Tridecafluoroheptadecan-1-ol", "12,12,13,13,14,14,15,15,16,16,17,17,17-Tridecafluoroheptadecanoyl chloride", "12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,19-Heptadecafluorononadecan-1-ol", + "12,14-Dichlorodehydroabietic acid", "12:1 Fluorotelomer amino ethyl trimethyl ammonium", "12:2 Fluorotelomer aldehyde", "12:2 Fluorotelomer carboxylic acid", @@ -5486,6 +5490,7 @@ "2-Vinylperfluoropropane", "2, 4-DB DMA", "2,1-Benzoxaphospholium, 1,3-dihydro-1,1-diphenyl-3,3-bis(trifluoromethyl)-", + "2,10-Dimethylundecane", "2,2-Bis(chloromethyl)-1,3-propanediyl bis[bis(2-chloroethyl)phosphate]", "2,2-bis(Trifluoromethyl)-2-hydroxyacetic acid", "2,2-bis(Trifluoromethyl)perfluoropropane", @@ -7765,6 +7770,7 @@ "3,4-Dichloroaniline-2,6-d2", "3,4-Dichlorobenzotrifluoride", "3,4-Dichlorobiphenyl", + "3,4-Dichlorocatechol", "3,4-Dichloroguaiacol", "3,4-Dichloronitrobenzene", "3,4-Dichlorophenol", @@ -7836,6 +7842,7 @@ "3,4,5,6,7-Pentafluoro-3-(1,1,1,2,3,3,3-heptafluoropropan-2-yl)-2-benzofuran-1(3H)-one", "3,4,6-Trichloro-2-(2-chloro-4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,11-heptadecafluoroundecyl)phenyl acetate", "3,4,6-Trichloro-5-cyano-2-hydroxybenzamide", + "3,4,6-Trichlorocatechol", "3,4,6-Trichloroguaiacol", "3,4'-Bis(heptadecafluorooctyl)-2,2'-bithiophene", "3,4'-DIBDE", @@ -7849,6 +7856,7 @@ "3,5-Dichloroaniline", "3,5-Dichlorobenzoic acid", "3,5-Dichlorobiphenyl", + "3,5-Dichlorocatechol", "3,5-Dichloromethoxy triclosan", "3,5-Dichlorophenol", "3,5-Diethyltoluene", @@ -8246,6 +8254,7 @@ "4-Chlorobenzylmethylsulfone", "4-Chlorobiphenyl", "4-Chlorobiphenyl-C13", + "4-Chlorocatechol", "4-Chlorophenyl (2,2,3,3,4,4,4-heptafluorobutanoyl)sulfamate", "4-Chlorophenyl ether", "4-Chlorophenylurea", @@ -8342,6 +8351,7 @@ "4-Methylchrysene", "4-Methyldecane", "4-Methyldibenzofuran", + "4-Methyldodecane", "4-Methylheptane", "4-Methylhexan-2-one", "4-Methylindan", @@ -8378,22 +8388,14 @@ "4-Nitroquinoline 1-oxide", "4-Nonylphenol decaethoxylate", "4-Nonylphenol dodecaethoxylate", - "4-Nonylphenol dodecaethoxylates", "4-Nonylphenol heptadecaethoxylate", - "4-Nonylphenol heptadecaethoxylates", "4-Nonylphenol heptaethoxylate", - "4-Nonylphenol heptaethoxylates", "4-Nonylphenol hexadecaethoxylate", - "4-Nonylphenol hexadecaethoxylates", "4-Nonylphenol hexaethoxylate", - "4-Nonylphenol hexaethoxylates", "4-Nonylphenol monoethoxylates", "4-Nonylphenol nonaethoxylate", - "4-Nonylphenol nonaethoxylates", "4-Nonylphenol octadecaethoxylate", - "4-Nonylphenol octadecaethoxylates", "4-Nonylphenol octaethoxylate", - "4-Nonylphenol octaethoxylates", "4-Nonylphenol pentadecaethoxylate", "4-Nonylphenol pentadecaethoxylates", "4-Nonylphenol pentaethoxylate", @@ -8627,6 +8629,7 @@ "4,5-Dichloro-4,5,5-trifluoropent-1-ene", "4,5-Dichlorocatechol", "4,5-Dichloroperfluoro-3-oxapentanesulfonyl fluoride", + "4,5-Dichloroveratrole", "4,5-Dihydro-2-phenyl-.alpha.-((perfluorohexyl)ethyloxy)methyl-1H-Imidazole-1-ethanol", "4,5-Dimethyl-1,2-dithiol-3-one", "4,5-dimethyl-Phenanthrene", @@ -8871,6 +8874,7 @@ "5-Methyl-2-(1,2,2,2-tetrafluoroethyl)pyridine", "5-Methyl-2-hexene", "5-Methyl-5-[(2,2,3,3,4,4,5,5-octafluoropentyl)oxy]hex-1-en-3-yne", + "5-Methyl-5-propylnonane", "5-Methyl-6-[(3,3,4,4,5,5,6,6,7,7,8,8,8-tridecafluorooctyl)sulfanyl]hexahydro-4,7-methano-2-benzofuran-1,3-dione", "5-methylbenzotriazole", "5-Methylchrysene", @@ -9602,6 +9606,7 @@ "Actual Number of Individuals Weighed", "Acyclovir", "AD-67 antidote", + "Adamantane Carboxylic Acid-D15", "Adenosine triphosphate", "Adipic acid", "Adiponitrile, perfluoro", @@ -9704,6 +9709,7 @@ "Alkyl iodides, C8-14, gamma-mu-perfluoro", "Alkylbenzene sulfonate", "Allethrin", + "Allidochlor", "Allobarbital", "Allyl 1H,1H-heptafluorobutyl ether", "Allyl 1H,1H-perfluorooctyl ether", @@ -10027,6 +10033,7 @@ "Atorvastatin-d5", "Atraton", "Atrazine", + "Atrazine + all metabolites", "Atrazine + N-Dealkylated Metabolites", "Atrazine-13C3", "Atrazine-d5", @@ -10094,6 +10101,8 @@ "Bacteria, nitrifiers", "Bacteria, slime-forming", "Bacteria, Sulfate reducing", + "Bacteroides - avian", + "Bacteroides - canine", "Balsalazide", "Balsalazide-d3", "Bank Angle", @@ -10106,6 +10115,7 @@ "Bank class, Right (choice list)", "Bank conditions - A (choice list)", "Bank conditions - B (choice list)", + "Bank Erosion", "Bank erosion hazard index", "Bank Erosion Length of 10m Segment-Left Bank", "Bank Erosion Length of 10m Segment-Right Bank", @@ -10117,6 +10127,7 @@ "Bank Height, Right", "Bank Instability Erosion Class (choice list)", "Bank Side Measured", + "Bank Slope", "Bank Slope, Left", "Bank Slope, Right", "Bank Stability Index", @@ -10129,8 +10140,10 @@ "Bank Stability RDB", "Bank Stability, Left (choice list)", "Bank Stability, Right (choice list)", + "Bank Substrate", "Bank Undercut", "Bank vegetative stability (choice list)", + "Banke Vegetative Cover", "Bankful Angle (choice list)", "Bankfull cross-sectional area", "Bankfull depth", @@ -10397,6 +10410,7 @@ "Beaver Flow Modification (choice list)", "Beck Biotic Index", "Bedrock", + "Benalaxyl", "Bendiocarb", "Bendiocarb phenol", "Bendroflumethiazide", @@ -10926,6 +10940,7 @@ "Benzoylecgonine hydrate", "Benzoylecgonine-D3", "Benzoylecgonine-d8", + "Benzoylprop-ethyl", "Benzphetamine", "Benzphetamine hydrochloride", "Benzthiazide", @@ -10994,6 +11009,7 @@ "Bicyclo[2.2.1]heptane-2,2-dicarbonitrile, 5,6-dichloro-3,3-bis(trifluoromethyl)-, (1S,4R,5S,6R)-", "Bicyclo[2.2.1]heptane-2,3-dicarboxylic acid, 5-[(.gamma.-.omega.-perfluoro-C8-20-alkyl)thio] derivs.", "Bicyclo[2.2.1]heptane, 2,2,3-trimethyl-, endo-", + "Bicyclo[2.2.1]heptane, 2,2,3-trimethyl-, exo-", "Bicyclo[3.2.0]hepta-2,6-diene, 4,4-bis(trifluoromethyl)-", "Bicyclo[3.3.1]nonane", "Bicyclo[4.2.0]octa-1,3,5-triene", @@ -11317,6 +11333,7 @@ "Brown spot fungal disease severity (choice list)", "Brush Cover (%)", "Brush Jabs", + "BTEX plus styrene, Total", "BTEX, Total", "BTU", "Bufencarb", @@ -11326,6 +11343,7 @@ "Bulk Density", "Bumetanide", "Bumetanide-d5", + "Bupirimate", "Buprenorphine", "Buprenorphine hydrochloride", "Buprofezin", @@ -11535,6 +11553,7 @@ "C10-C12 Aliphatics", "C10-C12 Aromatics", "C10-C16 Hydrocarbons", + "C10-C50 Hydrocarbons", "C11-C22 Aromatics", "C11-C22 Aromatics, Adjusted", "C11-C22 Aromatics, Unadjusted", @@ -11549,6 +11568,7 @@ "C16-C21 Aromatics", "C16-C21 Hydrocarbons", "C16-C34 Hydrocarbons", + "C16-C50 Hydrocarbons", "C18 Hydrocarbons", "C19-C36 Aliphatics", "C19-C36 Aliphatics, Unadjusted", @@ -12068,6 +12088,7 @@ "Chlorthal-dimethyl", "Chlorthal-Monomethyl", "Chlorthalidone", + "Chlorthiamid", "Chlorthion", "Chlorthiophos", "Cholest-5-en-3-one", @@ -12141,6 +12162,7 @@ "Cis-2-Pentene", "cis-2-Pentene & 2-methylpentane", "cis-2-Phenyl-2-butene", + "cis-3-Dodecene", "cis-3-Hexene", "cis-4-Methyl-2-pentene", "cis-Androsterone-16,16-d2", @@ -12154,6 +12176,7 @@ "cis-Cypermethrin", "cis-Decalin", "cis-Deltamethric acid", + "cis-Hydrindane", "cis-Mevinphos", "cis-Nonachlor", "cis-Perfluoro-1-methyl-2-ethylcyclohexane", @@ -12330,6 +12353,7 @@ "Copper(2+) bis(6,6,7,7,8,8,8-heptafluoro-2,2-dimethyl-5-oxooct-3-en-3-olate)", "Copper(I) cyanide", "Coprostan-3-one", + "Coprostanol", "Coprosterol", "Coral Bleached Cover", "Coral Diseased Cover", @@ -12500,6 +12524,7 @@ "Cyclohexanecarboxamide, N,N'-[4-(phenylazo)-1,3-phenylene]bis[1,2,2,3,3,4,4,5,5,6,6-undecafluoro- (9CI)", "Cyclohexanecarboxylic acid", "Cyclohexanecarboxylic acid, 1-(1,1,2,2-tetrafluoroethyl)-", + "Cyclohexaneethanol", "Cyclohexanemethanol, 1,2,2,3,3,4,4,5,5,6,6-undecafluoro-", "Cyclohexanemethanol, 4-[(ethenyloxy)methyl]-, polymer with chlorotrifluoroethene, (ethenyloxy)cyclohexane, .alpha.-[[4-[(ethenyloxy)methyl]cyclohexyl]methyl]-.omega.-hydroxypoly(oxy-1,2-ethanediyl) and ethoxyethene", "Cyclohexanesulfonic acid, 1,2,2,3,3,4,4,5,5,6,6-undecafluoro-, potassium salt (1:1)", @@ -12597,6 +12622,7 @@ "Cyclopropane, pentafluoro-1-propen-1-yl-", "Cyclopropane, pentafluoro(1,1,2,2,3,3,3-heptafluoropropoxy)-", "Cyclopropanecarbonyl chloride, 3-formyl-2,2-bis(trifluoromethyl)-, trans)-", + "Cyclopropanecarboxaldehyde", "Cyclopropanecarboxylic acid, 1,2,2,3,3-pentafluoro-", "Cyclopropanecarboxylic acid, 2,2-bis(trifluoromethyl)-, methyl ester", "Cyclopropanecarboxylic acid, 2,2-bis(trifluoromethyl)-3-(3,3,3-trifluoro-2- (trifluoromethyl)-1-propenyl)-, ethyl ester,", @@ -12774,6 +12800,7 @@ "Decane, 3,3,4,4,5,5,6,6,7,7,8,8-dodecafluoro-1,10-diiodo-", "Decane, 6-bromo-1,1,1,2,2,3,3-heptafluoro-4,4-bis(trifluoromethyl)-", "Decanoic acid", + "Decanoic Acid-D19", "Decanoic acid, 2,2,3,3,4,4,5,5-octafluoropentyl ester", "Decanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,10,10-octadecafluoro-9-(trifluoromethyl)-", "Decanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,10,10-octadecafluoro-9-(trifluoromethyl)-, ammonium salt (1:1)", @@ -12818,7 +12845,6 @@ "Dehydrogenase", "Dehydrogenase (corrected for carbon content)", "Dehydronifedipine", - "Deiodo flubendiamide", "Deisopropyl prometryn", "Deisopropylhydroxyatrazine", "Deisopropyliprodione", @@ -12862,6 +12888,7 @@ "Deoxygenation constant-carbon", "Deoxygenation constant-nitrogen", "Deoxynivalenol", + "Deposition and scouring (Y/N) (choice list)", "Deposits in Water", "Depth", "Depth by Pole", @@ -13165,7 +13192,6 @@ "Diethylmethoxy(3,3,4,4,5,5,6,6,6-nonafluorohexyl)silane", "Diethylmethoxy(3,3,4,4,5,5,6,6,7,7,7-undecafluoroheptyl)silane", "Diethylmethoxy(3,3,4,4,5,5,6,6,7,7,8,8,8-tridecafluorooctyl)silane", - "Diethylstilbesterol glucuronide", "Diethylstilbestrol", "Diethylstilbestrol glucuronide", "Diethylstilbestrol glucuronide (DES-GlcA)", @@ -13455,6 +13481,7 @@ "DogBact DNA marker", "Dominance", "Dominance, Top 3 species", + "Dominant Bank Vegetation (choice list)", "Dominant Habitat Type", "Dominant Land Use (choice list)", "Dominant particle size", @@ -13588,6 +13615,7 @@ "Erbium", "Erbium, tris[3-[2,2,3,3,4,4,4-heptafluoro-1-(oxo-.kappa.O)butyl]-1,7,7-trimethylbicyclo[2.2.1]heptan-2-onato-.kappa.O]-", "Ergosterol", + "Eroded Bank Height", "Eroded Fins Present (Y/N) (choice list)", "Erosion Causes", "Erosion within 1 Meter of Transect-Left Bank (choice list)", @@ -14132,6 +14160,7 @@ "Fenofibrate", "Fenofibrate-d6", "Fenoprofen", + "Fenoxaprop", "Fenoxaprop-ethyl", "Fenoxaprop-P-ethyl", "Fenoxycarb", @@ -14221,6 +14250,8 @@ "Fish Tissue Collected (Y/N) (choice list)", "Fixed dissolved solids", "Fixed suspended solids", + "Flamprop-isopropyl", + "Flamprop-methyl", "Flash point", "Flavobacterium", "Flazasulfuron", @@ -14242,6 +14273,7 @@ "Flonicamid", "Flonicamid-d3", "Flood Evidence (choice list)", + "Flood Evidence (text)", "Flood Frequency", "Flood prone area width", "Floodplain Presence (choice list)", @@ -14578,6 +14610,7 @@ "Grid count", "Griseofulvin", "Gross Alpha radioactivity", + "Gross alpha radioactivity (ref std unspecified)", "Gross alpha radioactivity, (Americium-241 ref std)", "Gross alpha radioactivity, (nat-Uranium ref std)", "Gross alpha radioactivity, (Plutonium-239 ref std)", @@ -14625,9 +14658,13 @@ "Habitat type, Dams Present Downstream", "Habitat type, Dams Present Upstream", "Habitat type, Distance between Riffles", + "Habitat Type, Dry (choice list)", + "Habitat Type, Pool (choice list)", "Habitat Type, Rapids (%)", + "Habitat Type, Riffle (choice list)", "Habitat type, Riffle Length", "Habitat type, Riffle Width", + "Habitat Type, Run (choice list)", "Habitat Type, Steps (%)", "Habitat type, Stream Shade Coverage", "Habitat type, Substrate - Inorganic", @@ -14783,6 +14820,7 @@ "Heptatriacontafluorononadecanoic acid", "Heptatriacontane", "Heptene", + "Heptenophos", "Heptyl sulfate", "Herbicide mix, unspecified", "Herbicides", @@ -14821,6 +14859,7 @@ "Hexadecane, 1,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14-nonacosafluoro-16-iodo-", "Hexadecane, 1,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16-tritriacontafluoro-16-iodo-", "Hexadecane, 2,6,11,15-tetramethyl-", + "Hexadecanoic Acid-D31", "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-", "Hexadecyl sulfate", "Hexaethylene glycol monotetradecyl ether", @@ -15218,6 +15257,15 @@ "Insect Infestation Disturbance (choice list)", "Insectivores", "Instream Cover (%)", + "Instream Cover, Bedrock ledges", + "Instream Cover, Cobble, boulder, & growth", + "Instream Cover, Emergent aquatic vegetation", + "Instream Cover, Large woody debris", + "Instream Cover, Roots", + "Instream Cover, Small woody debris", + "Instream Cover, Submerged aquatic vegetation", + "Instream Cover, Terrestrial vegetation", + "Instream Cover, Undercut banks", "Instream feature, stream substrate (choice list)", "Instream Snags", "Inter-Transect Bearing", @@ -15505,7 +15553,6 @@ "Lake surface condition (choice list)", "Lake Type (choice list)", "Lake water level (choice list)", - "Lambda-Cyhalothrin", "Lamivudine", "Lamotrigine", "Lamotrigine N2-glucuronide", @@ -15642,6 +15689,7 @@ "Light, path", "Light, photosynthetic active radiation (PAR)", "Light, photosynthetic active radiation at depth (PAR)", + "Light, Photosynthetic Photon Flux Density (PPFD)", "Light, reflected", "Light, transmissivity", "Light, underwater extinction coefficient (K)", @@ -15663,6 +15711,7 @@ "Linear alkylbenzene sulfonate", "Linear perfluoroalkyl(C1-24)iodide", "Linoleic acid", + "Linolenic acid", "Linuron", "Linuron-d6", "Lipid (dry) content", @@ -15710,6 +15759,7 @@ "Lithium(1+) perfluoro-5-{[(perfluoropentanesulfonyl)azanidyl]sulfonyl}pentane", "Lithium(1+) perfluoro-8-{[(perfluorooctanesulfonyl)azanidyl]sulfonyl}octane", "Lithium/calcium ratio", + "Lithocholic Acid-D4", "Lithology code", "Litter Coverage", "Littoral Cover Complexity Index", @@ -17640,6 +17690,7 @@ "o-Fluorophenatole", "o-Fluorophenol", "o-Hydroxyhippuric acid", + "O-Methylpodocarpic Acid", "o-Nitroaniline", "o-Nitroanisole", "o-Nitrophenol", @@ -17933,6 +17984,7 @@ "Oxygen plus argon", "Oxygen uptake, day", "Oxygen uptake, night", + "Oxygen-17", "Oxygen-17/oxygen-16 ratio", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", @@ -19233,6 +19285,7 @@ "Perfluorovaleric acid", "Perflutren - Human albumin", "Pericoma", + "Peridinin", "Perindopril", "Periphyton", "Periphyton biovolume", @@ -19625,6 +19678,7 @@ "Plutonium-239/plutonium-240", "Plutonium-240", "Plutonium-241", + "Point bar (Y/N) (choice list)", "Point Source Pollution - Outfall Pipe Discharging (Y/N) (choice list)", "Point Source Pollution - Outfall Pipe Present (Y/N) (choice list)", "Polar organic chemicals", @@ -20010,6 +20064,7 @@ "Precipitation amount last event", "Precipitation during activity (choice list)", "Precipitation event duration", + "Precipitation Intensity (choice list)", "Precipitation Last 24hrs (CA SWAMP) (choice list)", "Precipitation volume", "Precipitation, how heavy (choice list)", @@ -20929,6 +20984,7 @@ "Riparian Channel % Canopy Cover", "Riparian Channel Canopy Cover Left Bank-Left (choice list)", "Riparian Channel Canopy Cover Right Bank-Right (choice list)", + "Riparian Condition (choice list)", "Riparian Cover Complexity Index", "Riparian Disturbance Intensity-Extent Index", "Riparian Erosion", @@ -20936,6 +20992,7 @@ "Riparian vegetation composition (choice list)", "Riparian vegetation density (choice list)", "Riparian vegetation, dominant species present", + "Riparian Width", "Riparian Width LDB", "Riparian Width RDB", "Riparian Width, Both Banks", @@ -21723,6 +21780,7 @@ "Styrene", "Styrene and o-xylene", "Styrene oxide", + "Subdominant Substrate Description (text)", "Submerged Cover (%)", "Submerged Vegetation Habitat Type (%)", "Submergent Macrophyte Coverage (choice list)", @@ -21790,6 +21848,7 @@ "Substrate Odor (choice list)", "Substrate Origin", "Substrate Quality", + "Substrate Size Class", "Substrate Size Class, Midpoint", "Substrate Size Class, Transect", "Substrate Subdominant, Transect (choice list)", @@ -22209,6 +22268,7 @@ "Tetrasiphonidae", "Tetrastemma", "Tetrastemmatidae", + "Tetrasul", "Tetratetracontane", "Tetrathionate", "Tetratriacontafluoro-10,13,16,19-tetraoxaoctacosadiene", @@ -22403,6 +22463,7 @@ "Total hardness", "Total Heptachloro Biphenyls", "Total Hexachloro Biphenyls", + "Total Hexachlorocyclohexane, sum of isomers", "Total Hexachloronaphthalene", "Total Kjeldahl nitrogen", "Total Kjeldahl nitrogen (Organic N & NH3)", @@ -22953,6 +23014,7 @@ "Undecanoic acid, 4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,11-heptadecafluoro-", "Undecyl heptafluorobutanoate", "Undecyl sulfate", + "Undecylcyclohexane", "Undercut Banks (%)", "Undercut Horizontal-Left Bank", "Undercut Horizontal-Right Bank", diff --git a/schemas/data/src/values/CharacteristicName.primary.json b/schemas/data/src/values/CharacteristicName.primary.json index 6b643589..4374a1a5 100644 --- a/schemas/data/src/values/CharacteristicName.primary.json +++ b/schemas/data/src/values/CharacteristicName.primary.json @@ -11,6 +11,7 @@ ".beta.-Endosulfan", ".beta.-Heptachlor epoxide", ".beta.-Hexachlorocyclohexane", + ".beta.-Sitosterol", ".delta.-Hexachlorocyclohexane", ".gamma.-Hexachlorocyclohexane", ".lambda.-Cyhalothrin", @@ -19,6 +20,7 @@ "1-(3,4-dichlorophenyl)-3-methyl urea", "1-Butanesulfonamide, 1,1,2,2,3,3,4,4,4-nonafluoro-N-methyl-", "1-Butanol", + "1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro-", "1-Heptanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,7-pentadecafluoro-", "1-Methylchrysene", "1-Methylnaphthalene", @@ -87,15 +89,19 @@ "1,3,4,6,7,8-Hexahydro-4,6,6,7,8,8-hexamethylcyclopenta[g]-2-benzopyran", "1,3,5-Trichlorobenzene", "1,3,5-Trimethylbenzene", + "1,4-Dichloro-cis-2-butene", "1,4-Dichlorobenzene-d4", "1,4-Difluorobenzene", + "1,4-Dioxane", "1,4,6,7-Tetramethylnaphthalene", "1,6,7-Trimethylnaphthalene", "1,7-Dimethylfluorene", "1,7-Dimethylphenanthrene", "1,8-Dimethylphenanthrene", "10:2 Fluorotelomer sulfonic acid", + "11-chloroeicosafluoro-3-oxaundecane-1-sulfonic acid", "12-Chlorodehydroabietic acid", + "12,14-Dichlorodehydroabietic acid", "14-Chlorodehydroabietic acid", "17.alpha.-Estradiol", "1H,1H, 2H, 2H-Perfluorodecane sulfonic acid", @@ -164,6 +170,7 @@ "2,4,5-Trichlorophenol", "2,4,5-Trichlorotoluene", "2,4,6-Tribromophenol", + "2,4,6-Trichloroanisole", "2,4,6-Trichlorophenol", "2,4,6-Trinitro-5-tert-butyl-m-xylene", "2,5-Dibromobenzoic Acid", @@ -182,15 +189,24 @@ "3-Methylfluoranthene/Benzo[a]fluorene", "3-Methylphenanthrene", "3-Pyridinecarboxamide, N-(2,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-", + "3-Pyridinecarboxamide, N-(2+A2:A19,4-difluorophenyl)-2-[3-(trifluoromethyl)phenoxy]-", "3,3'-Dichlorobenzidine", "3,3',5,5'-Tetrachlorobiphenyl", + "3,4-Dichlorocatechol", "3,4-Dichlorophenol", + "3,4,5-Trichlorocatechol", + "3,4,5-Trichloroguaiacol", "3,4,5-Trichlorophenol", + "3,4,6-Trichlorocatechol", + "3,4,6-Trichloroguaiacol", "3,5-Dichlorobenzoic acid", + "3,5-Dichlorocatechol", "3,5-Dichlorophenol", "3,6-Dimethylphenanthrene", "3:3 Fluorotelomer carboxylate, ion(1-)", "4-Chloro-2-methylphenol", + "4-Chloro-3-nitrobenzotrifluoride", + "4-Chlorocatechol", "4-Hydroxy-chlorothalonil", "4-Methyl-2-pentanol", "4-methyl-6-(2-methyl-5-propan-2-ylphenyl)-2-(5-propan-2-yl-1H-indazol-4-yl)-7,8-dihydro-5H-1,6-naphthyridine", @@ -200,6 +216,10 @@ "4-Nonylphenol triethoxylate", "4,4'-Dibromobiphenyl", "4,4'-Isopropylidenediphenol", + "4,5-Dichlorocatechol", + "4,5-Dichloroveratrole", + "4,5,6-Trichloroguaiacol", + "4,6-Dichloroguaiacol", "4,6-Dimethyldibenzothiophene", "4,6-Dinitro-o-cresol", "5-Methylchrysene/6-Methylchrysene", @@ -210,6 +230,7 @@ "7-Methylbenzo[a]pyrene", "7,12-Dimethylbenz[a]anthracene", "8(14)-Abietenic acid", + "9-Chlorohexadecafluoro-3-oxanonane-1-sulfonate", "9-Methylphenanthrene/4-Methylphenanthrene", "9,10-Dichlorostearic Acid", "Abietic acid", @@ -228,6 +249,7 @@ "Acephate", "Acesulfame", "Acetaldehyde", + "Acetamide, 2-(diethylamino)-N-(2,6-dimethylphenyl)-", "Acetaminophen", "Acetamiprid", "Acetic acid", @@ -237,6 +259,9 @@ "Acifluorfen, sodium salt", "Acridine", "Acridine-d9", + "Acrolein", + "Acrylonitrile", + "Adamantane Carboxylic Acid-D15", "Adenosine triphosphate", "Adsorbable organic halides", "Alachlor", @@ -250,6 +275,7 @@ "Alkalinity, Hydroxide", "Alkalinity, Phenolphthalein (total hydroxide+1/2 carbonate)", "Alkalinity, total", + "Allidochlor", "Allyl chloride", "Aluminum", "Aluminum-27", @@ -263,6 +289,7 @@ "Ammonium", "Ammonium 4,8-dioxa-3H-perfluorononanoate", "Amoxicillin", + "Anatoxin-A", "Anilazine", "Anion/cation ratio", "Anthracene", @@ -270,6 +297,7 @@ "Antimony-121", "Antimony-125", "Apparent color", + "ar,ar'-Dimethylbiphenyl", "Aroclor 1016", "Aroclor 1221", "Aroclor 1232", @@ -289,11 +317,13 @@ "Aspirin", "Asulam", "Atrazine", + "Atrazine + all metabolites", "Atrazine + N-Dealkylated Metabolites", "Atrazine-d5 (ethyl-d5)", "Azinphos-ethyl", "Azinphos-methyl", "Azoxystrobin", + "Bacteria, Sulfate reducing", "Bankfull Height", "Bankfull width", "Barium", @@ -326,6 +356,7 @@ "BDE-197", "BDE-206", "BDE-207", + "Benalaxyl", "Bendiocarb", "Benfluralin", "Benomyl", @@ -335,6 +366,7 @@ "Benzene", "Benzene, 1-bromo-2-(trifluoromethyl)-", "Benzene, 1,2-dichloro-4-methyl-", + "Benzene, 1,2,3-trichloro-4,5-dimethoxy-", "Benzeneacetic acid, .alpha.-methyl-4-(2-methylpropyl)-", "Benzidine", "Benzo(a)anthracene-D12", @@ -358,6 +390,7 @@ "Benzofluoranthene", "Benzoic acid", "Benzoylecgonine", + "Benzoylprop-ethyl", "Beryllium", "Beryllium-9", "Beta Cypermethrin", @@ -393,7 +426,9 @@ "Bromophos-ethyl", "Bromopropylate", "Bromoxynil", + "BTEX plus styrene, Total", "BTEX, Total", + "Bupirimate", "Butachlor", "Butanoic acid, 4-(4-chloro-2-methylphenoxy)-, ethyl ester", "Butralin", @@ -410,8 +445,10 @@ "C1-Fluoranthenes/pyrenes", "C1-Phenanthrenes/anthracenes", "C10-C16 Hydrocarbons", + "C10-C50 Hydrocarbons", "C16-C21 Hydrocarbons", "C16-C34 Hydrocarbons", + "C16-C50 Hydrocarbons", "C2-Benzo[a]anthracenes/chrysenes", "C2-Benzofluoranthenes/benzopyrenes", "C2-Biphenyls", @@ -450,9 +487,11 @@ "Carbamazepine", "Carbaryl", "Carbaryl-d7", + "Carbazole", "Carbofuran", "Carbon dioxide", "Carbon Dioxide, free CO2", + "Carbon disulfide", "Carbon monoxide", "Carbon tetrachloride", "Carbon-13", @@ -513,6 +552,7 @@ "Chlorpyrifos-methyl", "Chlorsulfuron", "Chlorthal-dimethyl", + "Chlorthiamid", "Chlorthiophos", "Cholesterol", "Chromium", @@ -553,8 +593,10 @@ "Copper 8-quinolinolate", "Copper-63", "Copper-65", + "Coprostanol", "Corrosion & scaling control, Ryznar Stability Index", "Cotinine", + "Cresol", "Crufomate", "Cryptosporidium", "Cumene", @@ -570,6 +612,7 @@ "Cyclohexanesulfonic acid, 1,2,2,3,3,4,5,5,6,6-decafluoro-4-(1,1,2,2,2-pentafluoroethyl)-, potassium salt (1:1)", "Cyfluthrin", "Cyhalothrin", + "Cyprazine", "Cyprodinil", "Day, ice off", "Day, ice on", @@ -579,9 +622,12 @@ "DDT/DDD/DDE, sum of p,p' isomers", "Decabromodiphenyl ether", "Decachlorobiphenyl", + "Decanoic acid", + "Decanoic Acid-D19", "Decanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-", "Decanoic acid, 4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-pentadecafluoro-", "Dehydroabietic acid", + "Dehydronifedipine", "Delta boron-11/boron-10", "delta carbon-13/carbon-12", "Delta nitrogen-15/nitrogen-14", @@ -633,6 +679,7 @@ "Dichlorvos", "Diclofenac", "Diclofenac, 4-hydroxy", + "Diclofop", "Diclofop methyl", "Dicofol", "Dicrotophos", @@ -653,6 +700,7 @@ "Dimethyl phthalate", "Dimethyl selenoxide", "Dimethyl sulfone", + "Dimethylnaphthalene", "Dinitramine", "Dinoseb", "Dinotefuran", @@ -668,6 +716,7 @@ "Diuron", "Docosanoic acid", "Dodecanoic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,12-heneicosafluoro-", + "Dysprosium", "Eicosanoic acid", "Endosulfan", "Endosulfan sulfate", @@ -678,18 +727,21 @@ "Enterococcus", "epi-Coprostanol", "EPTC-d14", + "Erbium", "Erythromycin", "Escherichia coli", "Estradiol", "Estriol", "Estrone", "Ethalfluralin", + "Ethanamine, 2-(diphenylmethoxy)-N,N-dimethyl-", "Ethanol", "Ethinyl estradiol", "Ethion", "Ethofumesate", "Ethoprop", "Ethyl acetate", + "Ethyl methacrylate", "Ethylbenzene", "Ethylene dibromide", "Ethylene glycol", @@ -707,6 +759,7 @@ "Fenitrothion-d6", "Fenobucarb", "Fenoprofen", + "Fenoxaprop", "Fenoxaprop-ethyl", "Fenoxaprop-P-ethyl", "Fensulfothion", @@ -717,6 +770,8 @@ "Filamentous Algae Cover", "Fixed dissolved solids", "Fixed suspended solids", + "Flamprop-isopropyl", + "Flamprop-methyl", "Flonicamid", "Flonicamid-d3", "Flow", @@ -757,6 +812,7 @@ "Gold", "Grain size, coarse sand (>=630 to 2000 um)", "Gran acid neutralizing capacity", + "Gross alpha radioactivity (ref std unspecified)", "Gross alpha radioactivity, (Americium-241 ref std)", "Gross beta radioactivity, (Cesium-137 ref std)", "Hafnium", @@ -771,8 +827,10 @@ "Heptachlor epoxide", "Heptachlorodibenzo-p-dioxin", "Heptachlorodibenzofuran", + "Heptadecanoic acid", "Heptafluorobutyric acid", "Heptanal", + "Heptenophos", "Heterotrophic bacteria", "Hexachlorobenzene", "Hexachlorobutadiene", @@ -782,6 +840,7 @@ "Hexachlorodibenzofuran", "Hexachloroethane", "Hexaconazole", + "Hexadecanoic Acid-D31", "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-", "Hexafluoropropylene oxide dimer acid", "Hexafluoropropylene oxide dimer acid ammonium salt", @@ -834,6 +893,7 @@ "Iridium", "Iron", "Iron-57", + "Iron-related bacteria", "Isobutanol", "Isobutyraldehyde", "Isofenphos", @@ -853,15 +913,18 @@ "Lead-210", "Light attenuation, depth at 99%", "Light, photosynthetic active radiation (PAR)", + "Light, Photosynthetic Photon Flux Density (PPFD)", "Light, underwater extinction coefficient (K)", "Light, underwater incident", "Lignoceric Acid", "Lincomycin", "Linoleic acid", + "Linolenic acid", "Linuron", "Linuron-d6", "Lithium", "Lithium-7", + "Lithocholic Acid-D4", "Lutetium", "m and p-Cresol", "m- & p-Chlorophenol", @@ -889,6 +952,7 @@ "Metalaxyl", "Metalaxyl-M", "Metconazole", + "Methacrylonitrile", "Methamidophos", "Methamphetamine", "Methane", @@ -903,14 +967,20 @@ "Methoxychlor", "Methoxycitronellal", "Methyl bromide", + "Methyl ethyl ketone", + "Methyl iodide", "Methyl isobutyl ketone", "Methyl mercaptan", + "Methyl methacrylate", "Methyl parathion", "Methyl Selenium", "Methyl tert-butyl ether", "Methylacenaphthene", + "Methylanthracene", "Methylarsonic acid", + "Methylbiphenyl", "Methylchrysene", + "Methylcyclohexane", "Methyldibenzothiophene", "Methylene chloride", "Methylfluorene", @@ -1116,6 +1186,7 @@ "Nitrilotriacetic acid", "Nitrite", "Nitrobenzene", + "Nitrobenzene-D5", "Nitrofen", "Nitrogen dioxide", "Nitrogen-15", @@ -1133,6 +1204,7 @@ "o-Cresol", "o-Dichlorobenzene", "O-Ethyl O-(p-nitrophenyl) phenylphosphonothioate", + "O-Methylpodocarpic Acid", "o-Nitrophenol", "o-Xylene", "o-Xylene, mixt. with m-xylene and p-xylene", @@ -1166,6 +1238,7 @@ "Oxycarboxin", "Oxychlordane", "Oxyfluorfen", + "Oxygen-17", "Oxygen-18", "Oxygen-18/Oxygen-16 ratio", "p-Bromofluorobenzene", @@ -1214,14 +1287,17 @@ "Pentoxifylline", "Perfluoro-1-decanesulfonamide", "Perfluoro-1-dodecanesulfonate", + "Perfluoro-2-propoxypropanoate", "Perfluoro-3-methoxypropanoic acid", "Perfluoro-3,6-dioxaheptanoic acid", "Perfluoro(4-methoxybutanoic) acid", "Perfluorobutanesulfonic acid", "Perfluorobutylsulfonamide", + "Perfluorodecanesulfonate", "Perfluorodecanoic acid", "Perfluorododecanoic acid", "Perfluoroheptane sulfonamide", + "Perfluoroheptanesulfonate", "Perfluoroheptanoic acid", "perfluorohexane sulfonamido propyl amine", "Perfluorohexane sulfonamidopropyl ammonium", @@ -1236,6 +1312,7 @@ "Perfluorooctanesulfonamide", "Perfluorooctanesulfonamido amine oxide", "Perfluorooctanesulfonamido betaine", + "Perfluorooctanesulfonate", "Perfluorooctanoic acid", "Perfluoropentanesulfonic acid", "Perfluorotetradecanoic acid", @@ -1256,6 +1333,8 @@ "Phenanthrene-d10", "Phenol", "Phenol, 2,3-dichloro-6-methoxy-", + "Phenol, 4-chloro-2-methoxy-", + "Phenol, 4,5-dichloro-2-methoxy-", "Phenol, dibromo-", "Phenolics", "Phenols", @@ -1318,6 +1397,7 @@ "Purgeable hydrocarbons", "Pyraclostrobin", "Pyrene", + "Pyrene-d10", "Pyrethrin I", "Pyrethrin II", "Pyridaben", @@ -1469,6 +1549,7 @@ "Tetraethylene glycol", "Tetramethrin", "Tetrapropyl dithiopyrophosphate", + "Tetrasul", "Thallium", "Thallium-205", "Thiabendazole", @@ -1496,6 +1577,7 @@ "Total dissolved solids", "Total fixed solids", "Total hardness", + "Total Hexachlorocyclohexane, sum of isomers", "Total Nitrogen, mixed forms", "Total PAHs, high wt", "Total PAHs, low wt", @@ -1513,6 +1595,7 @@ "Tralkoxydim", "trans-1,2-Dichloroethylene", "trans-1,3-Dichloropropene", + "trans-1,4-Dichloro-2-butene", "trans-Chlordane", "trans-Nonachlor", "Transmittance at 254 nm", diff --git a/schemas/data/src/values/MeasurementUnit.legacy.json b/schemas/data/src/values/MeasurementUnit.legacy.json index ff31f994..ef4ff0c4 100644 --- a/schemas/data/src/values/MeasurementUnit.legacy.json +++ b/schemas/data/src/values/MeasurementUnit.legacy.json @@ -77,6 +77,7 @@ "cells/dL", "cfm", "cfs", + "cfs-day", "CFU", "cfu/100g", "cfu/100mL", @@ -147,9 +148,11 @@ "ft/min", "ft/sec", "ft2", + "ft2/day", "ft3", "ft3/day", "ft3/sec", + "ftH2O", "FTU", "g", "g/cm2", @@ -173,6 +176,7 @@ "g/stalk", "gal", "gal/day", + "gal/day/ft", "gal/hr", "gal/min", "gal/sec", diff --git a/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json b/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json index f588ee14..f06031e6 100644 --- a/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json +++ b/schemas/data/src/values/ResultAnalyticalMethodContext.legacy.json @@ -38,6 +38,7 @@ "CDC", "CHEVRON", "CSIRO", + "CSSS", "DIN", "DOE", "DOI", @@ -83,6 +84,7 @@ "OK ST U", "ON MECP", "ORNL", + "Oxyguard", "PACE LABS", "PALINTEST LTD", "PRACTICAL STATS", @@ -98,6 +100,7 @@ "SM", "Solinst", "Source Molecular", + "SSSA", "SWAN ANALYTISCHE", "SYAGEN", "SYNGENTA", @@ -114,6 +117,7 @@ "UCD", "USDA", "USDA/ARS", + "USDA/SSIR", "USDOC/NOAA", "USDOE/ASD", "USDOE/EML", diff --git a/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json b/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json index a995c995..6d438e80 100644 --- a/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json +++ b/schemas/data/src/values/ResultAnalyticalMethodContext.primary.json @@ -13,6 +13,7 @@ "APHA_SM24ED", "ASTM", "BC_MOE", + "CSSS", "DIN", "DOI", "EN", @@ -30,14 +31,17 @@ "MICROLOGY LABS", "Oakton", "ON MECP", + "Oxyguard", "PALINTEST LTD", "PROPRIETARY", "RBR", "REED", "Seal", "Solinst", + "SSSA", "THERMO-SCIENTIFIC", "Turner Designs", + "USDA/SSIR", "USDOI/USGS", "USEPA", "VMV", diff --git a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json index 29ed0850..06ede9e2 100644 --- a/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json +++ b/schemas/data/src/values/ResultDetectionQuantitationLimitUnit.legacy.json @@ -77,6 +77,7 @@ "cells/dL", "cfm", "cfs", + "cfs-day", "CFU", "cfu/100g", "cfu/100mL", @@ -147,9 +148,11 @@ "ft/min", "ft/sec", "ft2", + "ft2/day", "ft3", "ft3/day", "ft3/sec", + "ftH2O", "FTU", "g", "g/cm2", @@ -173,6 +176,7 @@ "g/stalk", "gal", "gal/day", + "gal/day/ft", "gal/hr", "gal/min", "gal/sec", diff --git a/schemas/data/src/values/ResultStatusID.primary.json b/schemas/data/src/values/ResultStatusID.primary.json index 01158aa5..7ae0aea1 100644 --- a/schemas/data/src/values/ResultStatusID.primary.json +++ b/schemas/data/src/values/ResultStatusID.primary.json @@ -9,7 +9,6 @@ "Historical", "Preliminary", "Provisional", - "Rejected", "Validated" ], "maxLength": 11 diff --git a/schemas/data/src/values/ResultUnit.legacy.json b/schemas/data/src/values/ResultUnit.legacy.json index 92de3229..78cc81ce 100644 --- a/schemas/data/src/values/ResultUnit.legacy.json +++ b/schemas/data/src/values/ResultUnit.legacy.json @@ -77,6 +77,7 @@ "cells/dL", "cfm", "cfs", + "cfs-day", "CFU", "cfu/100g", "cfu/100mL", @@ -147,9 +148,11 @@ "ft/min", "ft/sec", "ft2", + "ft2/day", "ft3", "ft3/day", "ft3/sec", + "ftH2O", "FTU", "g", "g/cm2", @@ -173,6 +176,7 @@ "g/stalk", "gal", "gal/day", + "gal/day/ft", "gal/hr", "gal/min", "gal/sec", diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json index 2b11e037..f0aa9f2e 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.legacy.json @@ -108,6 +108,7 @@ "Kullenberg Gravity Corer", "Large Van Veen Grab", "Larval Light Fish Trap", + "Light Meter", "Long Line", "Marmap Neuston Net", "Meteorological Data", diff --git a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json index dfdb8afe..edec7786 100644 --- a/schemas/data/src/values/SampleCollectionEquipmentName.primary.json +++ b/schemas/data/src/values/SampleCollectionEquipmentName.primary.json @@ -11,6 +11,7 @@ "DH-81", "DH-95", "Diffusion Gradient in Thin Film", + "Ekman Grab", "Gravity Corer (Generic)", "Hydrasleeve", "Kemmerer Bottle", diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 05b1f86e..ecc6fbe4 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -1061,6 +1061,82 @@ test("Should accept ActivityDepthHeightMeasure for a non-depth CharacteristicNam ); }); +// *** ActivityMediaName-ActivityDepthHeightMeasure-Maximum *** // +test("Should reject ActivityDepthHeightMeasure > 0 for ActivityMediaName 'Surface Water'", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Temperature, water", + ActivityDepthHeightMeasure: 5, + ActivityDepthHeightUnit: "m", + ResultValue: 12.3, + ResultUnit: "deg C", + }); + assert.equal(valid, false); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + ), + true, + ); +}); + +test("Should accept ActivityDepthHeightMeasure <= 0 for ActivityMediaName 'Surface Water'", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Temperature, water", + ActivityDepthHeightMeasure: -5, + ActivityDepthHeightUnit: "m", + ResultValue: 12.3, + ResultUnit: "deg C", + }); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + ), + false, + ); +}); + +test("Should accept ActivityMediaName 'Surface Water' without ActivityDepthHeightMeasure", async (t) => { + const valid = validate({ + ActivityMediaName: "Surface Water", + CharacteristicName: "Temperature, water", + ResultValue: 12.3, + ResultUnit: "deg C", + }); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + ), + false, + ); +}); + +test("Should not apply the ActivityDepthHeightMeasure maximum to Groundwater (covered by QC warning)", async (t) => { + const valid = validate({ + ActivityMediaName: "Groundwater", + CharacteristicName: "Temperature, water", + ActivityDepthHeightMeasure: 5, + ActivityDepthHeightUnit: "m", + ResultValue: 12.3, + ResultUnit: "deg C", + }); + assert.equal( + checkProperty( + validate.errors, + "message", + "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + ), + false, + ); +}); + // *** ActivityMediaName-Groundwater-DepthMeasure *** // test("Should reject Groundwater ActivityMediaName without any depth measure", async (t) => { const valid = validate({ diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index ba6b5fb5..e3b62580 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -129,9 +129,11 @@ test('Should reject improperly formatted time', async (t) => { }) // *** ActivityMediaName-ActivityDepthHeightMeasure-Maximum *** // -test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is set', async (t) => { +// The depth-maximum hard error (see test/logic.js) now covers the other media; +// the QC warning covers Groundwater/Porewater only. +test('Should warn ActivityDepthHeightMeasure > 0 when ActivityMediaName is Porewater', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water', + ActivityMediaName: 'Porewater', ActivityDepthHeightMeasure: 1, ActivityDepthHeightUnit: 'm' }) @@ -141,27 +143,31 @@ test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is set true ) }) -test('Should accept ActivityDepthHeightMeasure < 0 when ActivityMediaName is set', async (t) => { +test('Should accept ActivityDepthHeightMeasure = 0 when ActivityMediaName is Groundwater', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water', - ActivityDepthHeightMeasure: -1, + ActivityMediaName: 'Groundwater', + ActivityDepthHeightMeasure: 0, ActivityDepthHeightUnit: 'm' }) assert.equal(valid, true) }) -test('Should accept ActivityDepthHeightMeasure = 0 when ActivityMediaName is set', async (t) => { +test('Should accept when ActivityDepthHeightMeasure is not set and when ActivityMediaName is Groundwater', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water', - ActivityDepthHeightMeasure: 0, - ActivityDepthHeightUnit: 'm' + ActivityMediaName: 'Groundwater' }) assert.equal(valid, true) }) -test('Should accept when ActivityDepthHeightMeasure is not set and when ActivityMediaName is set', async (t) => { +test('Should NOT raise a QC warning for the Surface Water medium (enforced as a hard error instead)', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water' + ActivityMediaName: 'Surface Water', + ActivityDepthHeightMeasure: 1, + ActivityDepthHeightUnit: 'm' }) assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'maximum', 'ActivityDepthHeightMeasure'), + false + ) }) test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is Groundwater', async (t) => { const valid = validate({ @@ -195,7 +201,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is oth test('Should ignore ActivityDepthHeightMeasure > 0 when measure is not defined', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water', + ActivityMediaName: 'Groundwater', ActivityDepthHeightUnit: 'm' }) assert.equal(valid, true) @@ -206,7 +212,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when measure is not defined', }) test('Should ignore ActivityDepthHeightMeasure > 0 when measure is a string', async (t) => { const valid = validate({ - ActivityMediaName: 'Surface Water', + ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: 'unknown', ActivityDepthHeightUnit: 'm' }) From 7662d82035edd1a1472c8b07e07f0a09f80d0abb Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 26 Jun 2026 13:55:47 -0400 Subject: [PATCH 39/51] style: reformat source with prettier (JSON & JS) and add prettier config reformat all hand-maintained source JSON and JS. Build-generated src/values and src/locales are excluded via .prettierignore. --- .prettierignore | 4 + .prettierrc | 5 + commitlint.config.cjs | 2 +- schemas/data/bin/build-lib.js | 372 ++- schemas/data/bin/build-logic.js | 111 +- schemas/data/bin/build-lookup.js | 12 +- schemas/data/bin/build-template.js | 101 +- schemas/data/bin/build-values.js | 62 +- .../ActivityDepthAltitudeReferencePoint.json | 2 +- .../data/src/addition/ActivityGroupType.json | 2 +- schemas/data/src/addition/ActivityType.json | 4 +- schemas/data/src/addition/AquiferType.json | 2 +- .../src/addition/MonitoringLocationType.json | 10 +- .../data/src/addition/SampleCondition.json | 2 +- schemas/data/src/addition/WellIDContext.json | 2 +- ...ityMediaName-Groundwater-DepthMeasure.json | 2 +- .../ActivityType-CTS-ActivityStartTime.json | 14 +- ...rFields-ActivityMediaName-Groundwater.json | 2 +- ...ringLocationType-Well-SampleCondition.json | 8 +- ...nitoringLocationType-Well-WellUseType.json | 8 +- .../ActivityType-ActivityGroupType.json | 70 +- ...acteristicName-CharacteristicWQXGroup.json | 78 +- ...me-ActivityDepthHeightMeasure-Maximum.json | 5 +- ...ityType-CTS-ActivityStartTimeZone-UTC.json | 10 +- ...ctivityType-CTS-ActivityStartTimeZone.json | 14 +- ...acteristicName-ActivityType-Surrogate.json | 9 +- .../CharacteristicName-Ammonia.json | 12 +- ...ltDetectionQuantitationLimitUnit-None.json | 5 +- ...acteristicName-pH-ActivityType-Sample.json | 9 +- .../ResultSampleFraction-FreeAvailable.json | 2 +- ...tivityDepthAltitudeReferencePointUnit.json | 2 +- schemas/data/src/subset/ActivityType.json | 72 +- .../data/src/subset/CharacteristicName.json | 4 +- ...itoringLocationHorizontalAccuracyUnit.json | 5 +- ...onHorizontalCoordinateReferenceSystem.json | 9 +- ...onitoringLocationVerticalAccuracyUnit.json | 2 +- .../MonitoringLocationVerticalUnit.json | 6 +- .../src/subset/ResultDetectionCondition.json | 2 +- .../data/src/subset/ResultSampleFraction.json | 66 +- schemas/data/src/subset/ResultStatusID.json | 9 +- schemas/data/src/subset/ResultValueType.json | 8 +- schemas/data/test/build.js | 16 +- schemas/data/test/format.js | 1038 ++++---- schemas/data/test/logic.js | 2181 ++++++++++------- schemas/data/test/messages.js | 33 +- schemas/data/test/primary.js | 305 +-- schemas/data/test/quality-control.js | 519 ++-- schemas/data/test/required.js | 730 +++--- schemas/data/test/transform.js | 29 +- 49 files changed, 3278 insertions(+), 2699 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..b774a4bc --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Build-generated source — owned by the build (build-values / build-locales). +# Keep their JSON.stringify output so Prettier and the build don't fight. +schemas/data/src/values +schemas/data/src/locales \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..17b1d52e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5" +} \ No newline at end of file diff --git a/commitlint.config.cjs b/commitlint.config.cjs index a4f43697..98ee7dfc 100644 --- a/commitlint.config.cjs +++ b/commitlint.config.cjs @@ -1,3 +1,3 @@ module.exports = { - extends: ['@commitlint/config-conventional'] + extends: ['@commitlint/config-conventional'], } diff --git a/schemas/data/bin/build-lib.js b/schemas/data/bin/build-lib.js index aa1e74ad..ff4cf6cd 100644 --- a/schemas/data/bin/build-lib.js +++ b/schemas/data/bin/build-lib.js @@ -1,138 +1,138 @@ -import { readFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { readFile } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(fileURLToPath(import.meta.url)) // Convert PascalCase field names to human-friendly titles // e.g., "WellIDContext" → "Well ID Context" export const toFriendlyName = (fieldName) => fieldName - .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") - .replace(/([a-z])([A-Z])/g, "$1 $2"); + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') + .replace(/([a-z])([A-Z])/g, '$1 $2') export const subsetOnly = [ - "MonitoringLocationHorizontalAccuracyUnit", - "MonitoringLocationVerticalUnit", - "MonitoringLocationVerticalAccuracyUnit", - "ActivityDepthHeightUnit", - "BoreholeDepthUnit", - "WellDepthUnit", - "WellOpenIntervalTopUnit", - "WellOpenIntervalBottomUnit", - "ActivityDepthAltitudeReferencePointUnit", -]; + 'MonitoringLocationHorizontalAccuracyUnit', + 'MonitoringLocationVerticalUnit', + 'MonitoringLocationVerticalAccuracyUnit', + 'ActivityDepthHeightUnit', + 'BoreholeDepthUnit', + 'WellDepthUnit', + 'WellOpenIntervalTopUnit', + 'WellOpenIntervalBottomUnit', + 'ActivityDepthAltitudeReferencePointUnit', +] // Custom fields (non-WQX) that need value files generated export const custom = [ - "ActivityGroupType", - "AquiferType", - "AquiferUnitName", - "WellIDContext", - "AquiferUnitPorosityType", - "ActivityDepthAltitudeReferencePoint", - "SampleCondition", -]; + 'ActivityGroupType', + 'AquiferType', + 'AquiferUnitName', + 'WellIDContext', + 'AquiferUnitPorosityType', + 'ActivityDepthAltitudeReferencePoint', + 'SampleCondition', +] // DS to WQX values name mapping export const wqx = { MonitoringLocationHorizontalCoordinateReferenceSystem: - "HorizontalReferenceDatum", - MonitoringLocationHorizontalAccuracyUnit: "MeasurementUnit", - MonitoringLocationVerticalUnit: "MeasurementUnit", - MonitoringLocationVerticalAccuracyUnit: "MeasurementUnit", - MonitoringLocationVerticalCollectionMethod: "VerticalCollectionMethod", - MonitoringLocationVerticalCoordinateReferenceSystem: "VerticalReferenceDatum", - MonitoringLocationType: "MonitoringLocationType", - WellUseType: "WellType", - LithologyType: "WellFormationType", - BoreholeDepthUnit: "MeasurementUnit", - WellDepthUnit: "MeasurementUnit", - WellOpenIntervalTopUnit: "MeasurementUnit", - WellOpenIntervalBottomUnit: "MeasurementUnit", - ActivityType: "ActivityType", - ActivityMediaName: "ActivityMediaSubdivision", - ActivityDepthHeightUnit: "MeasurementUnit", - ActivityDepthAltitudeReferencePointUnit: "MeasurementUnit", - SampleCollectionEquipmentName: "SampleCollectionEquipment", - SampleCollectionMethodContext: "SampleCollectionMethodContext", - CharacteristicName: "Characteristic", - MethodSpeciation: "MethodSpeciation", - ResultSampleFraction: "SampleFraction", - ResultUnit: "MeasurementUnit", - ResultValueType: "ResultValueType", - ResultDetectionCondition: "ResultDetectionCondition", - ResultDetectionQuantitationLimitUnit: "MeasurementUnit", - ResultDetectionQuantitationLimitType: "DetectionQuantitationLimitType", - ResultStatusID: "ResultStatus", - ResultAnalyticalMethodContext: "AnalyticalMethodContext", - CharacteristicGroup: "CharacteristicGroup", - MeasurementUnit: "MeasurementUnit", -}; + 'HorizontalReferenceDatum', + MonitoringLocationHorizontalAccuracyUnit: 'MeasurementUnit', + MonitoringLocationVerticalUnit: 'MeasurementUnit', + MonitoringLocationVerticalAccuracyUnit: 'MeasurementUnit', + MonitoringLocationVerticalCollectionMethod: 'VerticalCollectionMethod', + MonitoringLocationVerticalCoordinateReferenceSystem: 'VerticalReferenceDatum', + MonitoringLocationType: 'MonitoringLocationType', + WellUseType: 'WellType', + LithologyType: 'WellFormationType', + BoreholeDepthUnit: 'MeasurementUnit', + WellDepthUnit: 'MeasurementUnit', + WellOpenIntervalTopUnit: 'MeasurementUnit', + WellOpenIntervalBottomUnit: 'MeasurementUnit', + ActivityType: 'ActivityType', + ActivityMediaName: 'ActivityMediaSubdivision', + ActivityDepthHeightUnit: 'MeasurementUnit', + ActivityDepthAltitudeReferencePointUnit: 'MeasurementUnit', + SampleCollectionEquipmentName: 'SampleCollectionEquipment', + SampleCollectionMethodContext: 'SampleCollectionMethodContext', + CharacteristicName: 'Characteristic', + MethodSpeciation: 'MethodSpeciation', + ResultSampleFraction: 'SampleFraction', + ResultUnit: 'MeasurementUnit', + ResultValueType: 'ResultValueType', + ResultDetectionCondition: 'ResultDetectionCondition', + ResultDetectionQuantitationLimitUnit: 'MeasurementUnit', + ResultDetectionQuantitationLimitType: 'DetectionQuantitationLimitType', + ResultStatusID: 'ResultStatus', + ResultAnalyticalMethodContext: 'AnalyticalMethodContext', + CharacteristicGroup: 'CharacteristicGroup', + MeasurementUnit: 'MeasurementUnit', +} export const getList = async (type, column, list = []) => { try { const list = await readFile( - join(__dirname, `../src/${type}/${column}.json`), + join(__dirname, `../src/${type}/${column}.json`) ) .then((res) => JSON.parse(res)) - .catch(() => []); - return [...new Set(sort(list))]; + .catch(() => []) + return [...new Set(sort(list))] } catch (e) { - if (e.message.includes("Cannot find module")) { - console.log(`|-> Skip ${type}`); + if (e.message.includes('Cannot find module')) { + console.log(`|-> Skip ${type}`) } else { - console.log(`|-> Error ${type}`, e.message); + console.log(`|-> Error ${type}`, e.message) } - return list; + return list } -}; +} export const sort = (list) => { return list.sort((a, b) => { - return a.toLowerCase().localeCompare(b.toLowerCase()); - }); -}; + return a.toLowerCase().localeCompare(b.toLowerCase()) + }) +} export const replaceRetired = (value) => { // replace prefix const startPattern = /^\*{3,10}retired\*{0,3}\s*/i // replace suffix const endPattern = - /(?:\*{3,10}retired\*{3}.*|\s*\*{3}duplicate\*{3}|[\^*]{2,10}|[*]+)$/; + /(?:\*{3,10}retired\*{3}.*|\s*\*{3}duplicate\*{3}|[\^*]{2,10}|[*]+)$/ if (startPattern.test(value) || endPattern.test(value)) { - value = value.replace(startPattern, "").replace(endPattern, "").trim(); + value = value.replace(startPattern, '').replace(endPattern, '').trim() } - return value; -}; + return value +} export const retire = (column, list) => { if ( ![ // ***retired*** - "CharacteristicName", - "ResultAnalyticalMethodContext", + 'CharacteristicName', + 'ResultAnalyticalMethodContext', // **$ - "MonitoringLocationHorizontalAccuracyUnit", - "MonitoringLocationVerticalUnit", - "MonitoringLocationVerticalAccuracyUnit", - "ActivityDepthHeightUnit", - "BoreholeDepthUnit", - "WellDepthUnit", - "WellOpenIntervalTopUnit", - "WellOpenIntervalBottomUnit", - "ActivityDepthAltitudeReferencePointUnit", - "ResultSampleFraction", - "ResultUnit", - "ResultDetectionQuantitationLimitUnit", - "MeasurementUnit", + 'MonitoringLocationHorizontalAccuracyUnit', + 'MonitoringLocationVerticalUnit', + 'MonitoringLocationVerticalAccuracyUnit', + 'ActivityDepthHeightUnit', + 'BoreholeDepthUnit', + 'WellDepthUnit', + 'WellOpenIntervalTopUnit', + 'WellOpenIntervalBottomUnit', + 'ActivityDepthAltitudeReferencePointUnit', + 'ResultSampleFraction', + 'ResultUnit', + 'ResultDetectionQuantitationLimitUnit', + 'MeasurementUnit', // *^$ - "MonitoringLocationHorizontalCoordinateReferenceSystem", + 'MonitoringLocationHorizontalCoordinateReferenceSystem', ].includes(column) ) - return [[], list]; - const arr = []; + return [[], list] + const arr = [] // Remove retired items from list // const pattern = // /\s*(\*{3,10}retired\*{3}.*|\s*\*{3}duplicate\*{3}|[\^*]{2,10}|[*]+)$/; @@ -141,33 +141,33 @@ export const retire = (column, list) => { (item) => ![ // retired, but not removed yet - "1-Decanesulfonic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-", - "1-Octanesulfonamide, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-", - "1,2-Benzenedicarboxamide, N2-[1,1-dimethyl-2-(methylsulfonyl)ethyl]-3-iodo-N1-[2-methyl-4-[1,2,2,2-tetrafluoro-1-(trifluoromethyl)ethyl]phenyl]-", - "Heptanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,7-tridecafluoro-", - "Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-", - "Nonanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9-heptadecafluoro-", - "Octadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18-pentatriacontafluoro-", - "Pentanoic acid, 2,2,3,3,4,4,5,5,5-nonafluoro-", + '1-Decanesulfonic acid, 3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heptadecafluoro-', + '1-Octanesulfonamide, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8-heptadecafluoro-', + '1,2-Benzenedicarboxamide, N2-[1,1-dimethyl-2-(methylsulfonyl)ethyl]-3-iodo-N1-[2-methyl-4-[1,2,2,2-tetrafluoro-1-(trifluoromethyl)ethyl]phenyl]-', + 'Heptanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,7-tridecafluoro-', + 'Hexadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,16-hentriacontafluoro-', + 'Nonanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9-heptadecafluoro-', + 'Octadecanoic acid, 2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18-pentatriacontafluoro-', + 'Pentanoic acid, 2,2,3,3,4,4,5,5,5-nonafluoro-', // retired more than once - "Perfluorodecanesulfonic acid ***retired***use 1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro", + 'Perfluorodecanesulfonic acid ***retired***use 1-Decanesulfonic acid, 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,10-heneicosafluoro', // duplicate, but not removed yet - "Benzenamine, 2,3-dimethyl-4-[(1,1,2,2-tetrafluoroethyl)thio]-", - "Benzenamine, 2,5-dimethyl-4-[(1,1,2,2-tetrafluoroethyl)thio]-", - ].includes(item), + 'Benzenamine, 2,3-dimethyl-4-[(1,1,2,2-tetrafluoroethyl)thio]-', + 'Benzenamine, 2,5-dimethyl-4-[(1,1,2,2-tetrafluoroethyl)thio]-', + ].includes(item) ) .map((item) => { - const newValue = replaceRetired(item); + const newValue = replaceRetired(item) if (item !== newValue) { // console.log(`Replaced retired ${column}: ${item} => ${newValue}`) - arr.push(newValue); + arr.push(newValue) } - return newValue; - }); + return newValue + }) //console.log('retire', '#/sec', arr.indexOf('#/sec'), arr) - return [arr, list]; -}; + return [arr, list] +} /*export const override = (column, list = []) => { let overrides = {} @@ -205,97 +205,95 @@ export const retire = (column, list) => { }*/ export const additions = async (column, list = []) => { - let arr = []; + let arr = [] // Looks for retired values and adds non-retired value - if (column === "CharacteristicName") { - let previous; - const retiredDuplicates = []; + if (column === 'CharacteristicName') { + let previous + const retiredDuplicates = [] for (let item of list) { - const index = item.indexOf("***retired***"); + const index = item.indexOf('***retired***') if (index !== -1) { - item = item.substring(0, index); - if (!previous.localeCompare(item, undefined, { sensitivity: "base" })) { + item = item.substring(0, index) + if (!previous.localeCompare(item, undefined, { sensitivity: 'base' })) { // 0 == same - retiredDuplicates.push(item); - item = null; + retiredDuplicates.push(item) + item = null } // remove edge case - if (["Perfluoroheptanesulfonic Acid", "P-Chlorophenol"].includes(item)) - item = null; + if (['Perfluoroheptanesulfonic Acid', 'P-Chlorophenol'].includes(item)) + item = null } if (item) { - arr.push(item); - previous = item; + arr.push(item) + previous = item } } if (retiredDuplicates.length) { - console.log(`|** Retired Duplicates: ${retiredDuplicates.length}`); + console.log(`|** Retired Duplicates: ${retiredDuplicates.length}`) if (retiredDuplicates.length < 25) { - console.log(`| "${retiredDuplicates.join('", "')}"`); + console.log(`| "${retiredDuplicates.join('", "')}"`) } } } else { - arr = list; + arr = list } //console.log('arr', '#/sec', arr.indexOf('#/sec')) try { const additions = await readFile( - join(__dirname, `../src/addition/${column}.json`), + join(__dirname, `../src/addition/${column}.json`) ) .then((res) => JSON.parse(res)) - .catch(() => []); - arr = arr.concat(additions); + .catch(() => []) + arr = arr.concat(additions) //console.log('additions', '#/sec', additions.indexOf('#/sec')) } catch (e) { - if (e.message.includes("Cannot find module")) { - console.log("|-> Skip additions"); + if (e.message.includes('Cannot find module')) { + console.log('|-> Skip additions') } else { - console.log("|-> Error additions", e.message); + console.log('|-> Error additions', e.message) } } // TODO only have apply to legacy try { const deprecated = await readFile( - join(__dirname, `../src/deprecated/${column}.json`), + join(__dirname, `../src/deprecated/${column}.json`) ) .then((res) => JSON.parse(res)) - .catch(() => []); - arr = arr.concat(deprecated); + .catch(() => []) + arr = arr.concat(deprecated) //console.log('deprecated', '#/sec', deprecated.indexOf('#/sec')) } catch (e) { - if (e.message.includes("Cannot find module")) { - console.log("|-> Skip deprecated"); + if (e.message.includes('Cannot find module')) { + console.log('|-> Skip deprecated') } else { - console.log("|-> Error deprecated", e.message); + console.log('|-> Error deprecated', e.message) } } // trailing Whitespace arr = arr.map((item) => { if (item !== item.trim()) { - console.log(`|** Trailing Whitespace: "${item}"`); - item = item.trim(); + console.log(`|** Trailing Whitespace: "${item}"`) + item = item.trim() } - return item; - }); + return item + }) let uniqueEnum = [ ...new Set( - arr.sort((a, b) => - a.localeCompare(b, undefined, { sensitivity: "base" }), - ), + arr.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' })) ), - ]; + ] // remove exact duplicates - const exactDuplicates = []; + const exactDuplicates = [] if (uniqueEnum.length < arr.length) { for (let i = 1, l = arr.length; i < l; i++) { if (arr[i - 1] === arr[i]) { - exactDuplicates.push(arr[i]); - console.log(`|** Exact Duplicates: "${arr[i]}"`); + exactDuplicates.push(arr[i]) + console.log(`|** Exact Duplicates: "${arr[i]}"`) } } /*if (exactDuplicates.length) { @@ -307,20 +305,20 @@ export const additions = async (column, list = []) => { } // remove mixcase duplicates - const mixedCaseDuplicates = []; + const mixedCaseDuplicates = [] for (let i = 1, l = uniqueEnum.length; i < l; i++) { if ( uniqueEnum[i - 1].localeCompare(uniqueEnum[i], undefined, { - sensitivity: "base", + sensitivity: 'base', }) !== -1 ) { - mixedCaseDuplicates.push(uniqueEnum[i - 1]); - console.log(`|** Mixed Case Duplicates: - "${uniqueEnum[i - 1]}"`); - console.log(`|** Mixed Case Duplicates: + "${uniqueEnum[i]}"`); - uniqueEnum[i - 1] = null; + mixedCaseDuplicates.push(uniqueEnum[i - 1]) + console.log(`|** Mixed Case Duplicates: - "${uniqueEnum[i - 1]}"`) + console.log(`|** Mixed Case Duplicates: + "${uniqueEnum[i]}"`) + uniqueEnum[i - 1] = null } } - uniqueEnum = uniqueEnum.filter((v) => v !== null); + uniqueEnum = uniqueEnum.filter((v) => v !== null) /*if (mixedCaseDuplicates.length) { console.log(`|** Mixed Case Duplicates: ${mixedCaseDuplicates.length}`) @@ -329,80 +327,80 @@ export const additions = async (column, list = []) => { } }*/ - return uniqueEnum; -}; + return uniqueEnum +} export const subset = async (column, list = [], log = true) => { - const allowed = await getList("subset", column); - if (!allowed.length) return list; + const allowed = await getList('subset', column) + if (!allowed.length) return list //console.log('subset', '#/sec', allowed.indexOf('#/sec')) - const subsetList = []; + const subsetList = [] for (const value of allowed) { for (let i = 0, l = list.length; i < l; i++) { if (list[i] === value) { - list.splice(i, 1); - subsetList.push(value); - break; + list.splice(i, 1) + subsetList.push(value) + break } } if (log && subsetList[subsetList.length - 1] !== value) { console.log( - `|** Subset value missing from allowed values: ${column} "${value}"`, - ); + `|** Subset value missing from allowed values: ${column} "${value}"` + ) } } - return [...new Set(sort(subsetList))]; -}; + return [...new Set(sort(subsetList))] +} export const subtractions = async (column, list = [], retired = []) => { - let arr = retired; + let arr = retired try { arr = arr.concat( await readFile(join(__dirname, `../src/subtraction/${column}.json`)) .then((res) => JSON.parse(res)) - .catch(() => []), - ); + .catch(() => []) + ) } catch (e) { - if (e.message.includes("Cannot find module")) { - console.log("|-> Skip subtractions"); + if (e.message.includes('Cannot find module')) { + console.log('|-> Skip subtractions') } else { - console.log("|-> Error subtractions", e.message); + console.log('|-> Error subtractions', e.message) } } arr - .filter((item) => item.includes(".*")) + .filter((item) => item.includes('.*')) .forEach((pattern) => { - pattern = new RegExp(pattern); - console.log(`|-> Subtracting by ${pattern}`); - arr = arr.concat(list.filter((item) => item.match(pattern) !== null)); - }); + pattern = new RegExp(pattern) + console.log(`|-> Subtracting by ${pattern}`) + arr = arr.concat(list.filter((item) => item.match(pattern) !== null)) + }) try { arr = arr.concat( await readFile(join(__dirname, `wqx/deprecated/${column}.json`)) .then((res) => JSON.parse(res)) - .catch(() => []), - ); + .catch(() => []) + ) } catch (e) { - if (e.message.includes("Cannot find module")) { - console.log("|-> Skip deprecated"); + if (e.message.includes('Cannot find module')) { + console.log('|-> Skip deprecated') } else { - console.log("|-> Error deprecated", e.message); + console.log('|-> Error deprecated', e.message) } } - if (arr.length) console.log(`|-> Subtracting ${arr.length} items`); + if (arr.length) console.log(`|-> Subtracting ${arr.length} items`) arr.forEach((item) => { - const index = list.indexOf(item); + const index = list.indexOf(item) if (index !== -1) { - list.splice(index, 1); + list.splice(index, 1) } - }); + }) - return list; -}; + return list +} diff --git a/schemas/data/bin/build-logic.js b/schemas/data/bin/build-logic.js index b8aad323..1f172bc1 100644 --- a/schemas/data/bin/build-logic.js +++ b/schemas/data/bin/build-logic.js @@ -1,114 +1,117 @@ -import { readFile, writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; -import { subset, sort } from "./build-lib.js"; +import { readFile, writeFile } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { subset, sort } from './build-lib.js' -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(fileURLToPath(import.meta.url)) const wqxRequiredIf = async (file) => { - const [columnFrom, columnTo] = file.split("-"); + const [columnFrom, columnTo] = file.split('-') const logicJSON = await readFile( - join(__dirname, `/../src/logic/${file}.json`), + join(__dirname, `/../src/logic/${file}.json`) ) .then((res) => JSON.parse(res)) - .catch(() => ({})); - const { default: required } = await import(`wqx/required/${file}.json.js`); + .catch(() => ({})) + const { default: required } = await import(`wqx/required/${file}.json.js`) const object = { $id: `https://datastream.org/schema/data/logic/${file}.json`, - $comment: "generated by ./bin/build-logic.js", + $comment: 'generated by ./bin/build-logic.js', title: logicJSON.title, description: logicJSON.description, errorMessage: logicJSON.errorMessage, ...required, - }; + } // TODO - remove once included in WQX look up - if (file === "CharacteristicName-MethodSpeciation") { - + if (file === 'CharacteristicName-MethodSpeciation') { // Include additional chars if it's not in WQX logic const include = [ - "Ammonia, un-ionized", - "Inorganic nitrogen (ammonia, nitrate and nitrite)", - "Inorganic nitrogen (nitrate and nitrite)", - ]; + 'Ammonia, un-ionized', + 'Inorganic nitrogen (ammonia, nitrate and nitrite)', + 'Inorganic nitrogen (nitrate and nitrite)', + ] // remove MethodSpeciation for CharacteristicName https://github.com/gordonfn/datastream-dms/issues/2381 const exclude = [ - "Radium", - "Radium-226", - "Radium-228", - "Radon-222", - "Strontium-87/Strontium-86, ratio", - "Uranium-234/Uranium-238 ratio", - "Uranium-238", - ]; + 'Radium', + 'Radium-226', + 'Radium-228', + 'Radon-222', + 'Strontium-87/Strontium-86, ratio', + 'Uranium-234/Uranium-238 ratio', + 'Uranium-238', + ] for (const characteristicName of exclude) { const index = - object.if.properties[columnFrom].enum.indexOf(characteristicName); + object.if.properties[columnFrom].enum.indexOf(characteristicName) if (index !== -1) { - object.if.properties[columnFrom].enum.splice(index, 1); + object.if.properties[columnFrom].enum.splice(index, 1) } } object.if.properties[columnFrom].enum = [ ...new Set([...object.if.properties[columnFrom].enum, ...include]), - ]; + ] const stableIsotopes = await readFile( join( __dirname, - `/../src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json`, - ), + `/../src/logic/CharacteristicName-StableIsotope-MethodSpeciation.json` + ) ) .then((res) => JSON.parse(res)) - .catch(() => ({})); + .catch(() => ({})) for (const characteristicName of stableIsotopes.if.properties .CharacteristicName.enum) { if (!object.if.properties[columnFrom].enum.includes(characteristicName)) { console.log( - "CharacteristicName-MethodSpeciation missing (StableIsotope rule)", - characteristicName, - ); - object.if.properties[columnFrom].enum.push(characteristicName); + 'CharacteristicName-MethodSpeciation missing (StableIsotope rule)', + characteristicName + ) + object.if.properties[columnFrom].enum.push(characteristicName) } } } // END TODO - const list = [...new Set(sort(object.if.properties[columnFrom].enum))]; + const list = [...new Set(sort(object.if.properties[columnFrom].enum))] - object.if.properties[columnFrom].enum = await subset(columnFrom, list, false); - object.if.unevaluatedProperties = true; - object.then.unevaluatedProperties = true; + object.if.properties[columnFrom].enum = await subset(columnFrom, list, false) + object.if.unevaluatedProperties = true + object.then.unevaluatedProperties = true await writeFile( join(__dirname, `/../src/logic/${file}.json`), JSON.stringify(object, null, 2), - { encoding: "utf8" }, - ); + { encoding: 'utf8' } + ) // Special Case - MethodSpeciation/ResultSampleFraction is optional for a CharacteristicName const optional = await readFile( - join(__dirname, `/../src/quality-control/partial/${file}-Optional.json`), + join(__dirname, `/../src/quality-control/partial/${file}-Optional.json`) ) .then((res) => JSON.parse(res)) - .catch(() => ({})); - object.if.properties[columnFrom].enum = [...new Set(sort(object.if.properties[columnFrom].enum.concat(optional.enum)))]; + .catch(() => ({})) + object.if.properties[columnFrom].enum = [ + ...new Set( + sort(object.if.properties[columnFrom].enum.concat(optional.enum)) + ), + ] const qcJSON = await readFile( - join(__dirname, `/../src/quality-control/${file}.json`), + join(__dirname, `/../src/quality-control/${file}.json`) ) .then((res) => JSON.parse(res)) - .catch(() => ({})); + .catch(() => ({})) const qc = { $id: `https://datastream.org/schema/data/quality-control/${file}.json`, - $comment: "generated by ./bin/build-logic.js", + $comment: 'generated by ./bin/build-logic.js', title: qcJSON.title, description: qcJSON.description, errorMessage: qcJSON.errorMessage, if: { - type: "object", + type: 'object', unevaluatedProperties: true, properties: { [columnFrom]: { @@ -121,7 +124,7 @@ const wqxRequiredIf = async (file) => { }, then: { // 'oneOf': [{ - type: "object", + type: 'object', unevaluatedProperties: true, properties: { [columnTo]: false, @@ -133,16 +136,16 @@ const wqxRequiredIf = async (file) => { // } // }] }, - }; + } await writeFile( join(__dirname, `/../src/quality-control/${file}.json`), JSON.stringify(qc, null, 2), - { encoding: "utf8" }, - ); -}; + { encoding: 'utf8' } + ) +} // wqxRequiredIf('ActivityType-AnalyticalMethod','CharacteristicName',['AnalyticalMethodtype']) // wqxRequiredIf('ActivityType-MonitoringLocation','CharacteristicName',['MonitoringLocation']) // wqxRequiredIf('Characteristic-AnalyticalMethod','CharacteristicName',['ResultAnalyticalMethodID','ResultAnalyticalMethodContext']) -wqxRequiredIf("CharacteristicName-MethodSpeciation"); +wqxRequiredIf('CharacteristicName-MethodSpeciation') // wqxRequiredIf('CharacteristicName-ResultSampleFraction') diff --git a/schemas/data/bin/build-lookup.js b/schemas/data/bin/build-lookup.js index 0a37a60e..f3dc5dbe 100644 --- a/schemas/data/bin/build-lookup.js +++ b/schemas/data/bin/build-lookup.js @@ -1,7 +1,7 @@ import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { readFile, writeFile } from 'node:fs/promises' -import { replaceRetired } from "./build-lib.js"; +import { replaceRetired } from './build-lib.js' const __dirname = dirname(fileURLToPath(import.meta.url)) @@ -23,7 +23,9 @@ for (const [key, value] of Object.entries(CharacteristicWQXGroups)) { const newKey = replaceRetired(key) CharacteristicNameWQXGroups[newKey] = value if (newKey !== key) { - console.log(`Replaced retired CharacteristicName in Group lookup: ${key} => ${newKey}`) + console.log( + `Replaced retired CharacteristicName in Group lookup: ${key} => ${newKey}` + ) } } @@ -42,7 +44,7 @@ await writeFile( join(__dirname, `/../lookup/CharacteristicName-CharacteristicWQXGroup.json`), JSON.stringify(CharacteristicNameWQXGroups), { - encoding: 'utf8' + encoding: 'utf8', } ) @@ -94,14 +96,14 @@ for (const activityType of activityTypes) { for (const path of [ join(__dirname, `/../lookup/CharacteristicName-CharacteristicWQXGroup.json`), join(__dirname, `/../lookup/CharacteristicName-MeasurementUnit.json`), - join(__dirname, `/../lookup/CharacteristicWQXGroup-MeasurementUnit.json`) + join(__dirname, `/../lookup/CharacteristicWQXGroup-MeasurementUnit.json`), ]) { const json = await readFile(path).then((res) => JSON.parse(res)) await writeFile( path + '.js', `export default ${JSON.stringify(json, null, 2)}`, { - encoding: 'utf8' + encoding: 'utf8', } ) } diff --git a/schemas/data/bin/build-template.js b/schemas/data/bin/build-template.js index 5928f95e..d91323a1 100644 --- a/schemas/data/bin/build-template.js +++ b/schemas/data/bin/build-template.js @@ -1,92 +1,103 @@ -import { readFile, writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { readFile, writeFile } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(fileURLToPath(import.meta.url)) -const schema = await readFile(join(__dirname,"../primary/index.json")) +const schema = await readFile(join(__dirname, '../primary/index.json')) .then((res) => JSON.parse(res)) - .catch(() => ({})); -const characteristics = await readFile(join(__dirname, "../src/values/CharacteristicName.primary.json")) + .catch(() => ({})) +const characteristics = await readFile( + join(__dirname, '../src/values/CharacteristicName.primary.json') +) .then((res) => JSON.parse(res).enum) - .catch(() => []); -const methodSpeciation = await readFile(join(__dirname, "../src/logic/CharacteristicName-MethodSpeciation.json")) + .catch(() => []) +const methodSpeciation = await readFile( + join(__dirname, '../src/logic/CharacteristicName-MethodSpeciation.json') +) .then((res) => JSON.parse(res).if.properties.CharacteristicName.enum) - .catch(() => []); -const methodSpeciationOptional = await readFile(join(__dirname, "../src/quality-control/partial/CharacteristicName-MethodSpeciation-Optional.json")) + .catch(() => []) +const methodSpeciationOptional = await readFile( + join( + __dirname, + '../src/quality-control/partial/CharacteristicName-MethodSpeciation-Optional.json' + ) +) .then((res) => JSON.parse(res).enum) - .catch(() => []); -const sampleFraction = await readFile(join(__dirname, "../src/logic/CharacteristicName-ResultSampleFraction.json")) + .catch(() => []) +const sampleFraction = await readFile( + join(__dirname, '../src/logic/CharacteristicName-ResultSampleFraction.json') +) .then((res) => JSON.parse(res).if.properties.CharacteristicName.enum) - .catch(() => []); + .catch(() => []) //const sampleFractionOptional = await readFile('../src/quality-control/partial/CharacteristicName-ResultSampleFraction-Optional.json').then(res => JSON.parse(res).enum).catch(() => ([])) -import characteristicGroup from "wqx/groups/CharacteristicName.json.js" -import characteristicCASNumber from "wqx/groups/CASNumber.json.js" -import unitDescriptions from "wqx/descriptions/MeasurementUnit.json.js" +import characteristicGroup from 'wqx/groups/CharacteristicName.json.js' +import characteristicCASNumber from 'wqx/groups/CASNumber.json.js' +import unitDescriptions from 'wqx/descriptions/MeasurementUnit.json.js' -const unitDescriptionsOverrides = await readFile(join(__dirname, "../src/lookup/MeasurementUnit.json")) +const unitDescriptionsOverrides = await readFile( + join(__dirname, '../src/lookup/MeasurementUnit.json') +) .then((res) => JSON.parse(res)) - .catch(() => ({})); + .catch(() => ({})) const buildUnits = async () => { - let csv = "Unit,Description\n"; + let csv = 'Unit,Description\n' for (const value of schema.properties.ResultUnit.enum) { - csv += `"${value}","${unitDescriptions[value] ?? unitDescriptionsOverrides[value] ?? ''}"\n`; + csv += `"${value}","${unitDescriptions[value] ?? unitDescriptionsOverrides[value] ?? ''}"\n` } await writeFile(join(__dirname, `/template/Units.csv`), csv, { - encoding: "utf8", - }); -}; + encoding: 'utf8', + }) +} const buildCharacteristics = async () => { let csv = - "CharacteristicName,MethodSpeciation,SampleFraction,Group,CASNumber\n"; + 'CharacteristicName,MethodSpeciation,SampleFraction,Group,CASNumber\n' for (const value of characteristics) { let methodSpeciationRequired = methodSpeciation.includes(value) ? 'Yes' - : 'No'; + : 'No' if ( methodSpeciationRequired === 'No' && methodSpeciationOptional.includes(value) ) { - methodSpeciationRequired = 'May'; + methodSpeciationRequired = 'May' } - let sampleFractionRequired = sampleFraction.includes(value) - ? 'Yes' - : 'No'; + let sampleFractionRequired = sampleFraction.includes(value) ? 'Yes' : 'No' // if (sampleFractionRequired === '"No"' && sampleFractionOptional.includes(value)) { // sampleFractionRequired = '"May"' // } csv += `"${value}","${methodSpeciationRequired}","${sampleFractionRequired}","${ - characteristicGroup[value] || "Not Assigned" - }","${characteristicCASNumber[value] || ""}"\n`; + characteristicGroup[value] || 'Not Assigned' + }","${characteristicCASNumber[value] || ''}"\n` } await writeFile(join(__dirname, `/template/Characteristics.csv`), csv, { - encoding: "utf8", - }); -}; + encoding: 'utf8', + }) +} const buildAllowed = async () => { - let csv = ""; + let csv = '' for (const key of Object.keys(schema.properties)) { - let { type, enum: allowed, maxLength } = schema.properties[key]; + let { type, enum: allowed, maxLength } = schema.properties[key] if (Array.isArray(allowed)) - allowed = allowed.map((value) => `"${value}"`).join(","); - csv += `${key},${maxLength || ""},${allowed || ""}\n`; + allowed = allowed.map((value) => `"${value}"`).join(',') + csv += `${key},${maxLength || ''},${allowed || ''}\n` } await writeFile(join(__dirname, `/template/AllowedValues.csv`), csv, { - encoding: "utf8", - }); -}; + encoding: 'utf8', + }) +} -buildUnits(); -buildCharacteristics(); -buildAllowed(); +buildUnits() +buildCharacteristics() +buildAllowed() diff --git a/schemas/data/bin/build-values.js b/schemas/data/bin/build-values.js index 748bf4b1..301d8aab 100644 --- a/schemas/data/bin/build-values.js +++ b/schemas/data/bin/build-values.js @@ -1,6 +1,6 @@ -import { writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { writeFile } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' import { additions, custom, @@ -12,55 +12,55 @@ import { subtractions, toFriendlyName, wqx, -} from "./build-lib.js"; +} from './build-lib.js' -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(fileURLToPath(import.meta.url)) // Extract processing logic into reusable function async function processValues(col, object) { - let [retired, list] = await retire(col, object.enum); - object.enum = list; + let [retired, list] = await retire(col, object.enum) + object.enum = list //object.enum = await override(col, object.enum); - object.enum = await additions(col, object.enum); + object.enum = await additions(col, object.enum) if (subsetOnly.includes(col)) { - object.enum = await getList("subset", col, object.enum); + object.enum = await getList('subset', col, object.enum) } - object.enum = [...new Set(sort(object.enum))]; + object.enum = [...new Set(sort(object.enum))] // catch any additions that may be longer - object.maxLength = Math.max(...object.enum.map((el) => el.length), 0); + object.maxLength = Math.max(...object.enum.map((el) => el.length), 0) - object.$id = `https://datastream.org/schema/data/values/${col}.legacy.json`; + object.$id = `https://datastream.org/schema/data/values/${col}.legacy.json` await writeFile( join(__dirname, `/../src/values/${col}.legacy.json`), JSON.stringify(object, null, 2), - { encoding: "utf8" }, - ); + { encoding: 'utf8' } + ) - object.enum = await subset(col, object.enum); + object.enum = await subset(col, object.enum) // remove subset values from retire list - const subsetList = await getList("subset", col); - retired = retired.filter((item) => !subsetList.includes(item)); + const subsetList = await getList('subset', col) + retired = retired.filter((item) => !subsetList.includes(item)) - object.enum = await subtractions(col, object.enum, retired); + object.enum = await subtractions(col, object.enum, retired) //object.enum = await override(col, object.enum); - object.$id = `https://datastream.org/schema/data/values/${col}.primary.json`; + object.$id = `https://datastream.org/schema/data/values/${col}.primary.json` await writeFile( join(__dirname, `/../src/values/${col}.primary.json`), JSON.stringify(object, null, 2), - { encoding: "utf8" }, - ); + { encoding: 'utf8' } + ) } // Process WQX fields for (const col of Object.keys(wqx)) { - console.log(col); - let object = await import(`wqx/values/${wqx[col]}.json.js`); - object = { ...object.default }; + console.log(col) + let object = await import(`wqx/values/${wqx[col]}.json.js`) + object = { ...object.default } // Add alias // if (col === 'CharacteristicName') { @@ -68,12 +68,18 @@ for (const col of Object.keys(wqx)) { // object.enum = object.enum.concat(alias.enum) // } - await processValues(col, object); + await processValues(col, object) } // Process custom fields (non-WQX) for (const col of custom) { - console.log(col); - const object = { $id: "", title: toFriendlyName(col), description: "", type: "string", enum: [] }; - await processValues(col, object); + console.log(col) + const object = { + $id: '', + title: toFriendlyName(col), + description: '', + type: 'string', + enum: [], + } + await processValues(col, object) } diff --git a/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json b/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json index f30ce2c1..d7f96214 100644 --- a/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json +++ b/schemas/data/src/addition/ActivityDepthAltitudeReferencePoint.json @@ -4,4 +4,4 @@ "Top of outer casing", "Top of well casing", "Unspecified" -] \ No newline at end of file +] diff --git a/schemas/data/src/addition/ActivityGroupType.json b/schemas/data/src/addition/ActivityGroupType.json index 97436dcc..3d0ef8ef 100644 --- a/schemas/data/src/addition/ActivityGroupType.json +++ b/schemas/data/src/addition/ActivityGroupType.json @@ -6,4 +6,4 @@ "Quality Control - Field Measure", "Quality Control - Lab Sample", "Unspecified" -] \ No newline at end of file +] diff --git a/schemas/data/src/addition/ActivityType.json b/schemas/data/src/addition/ActivityType.json index f68ce210..9a85fa22 100644 --- a/schemas/data/src/addition/ActivityType.json +++ b/schemas/data/src/addition/ActivityType.json @@ -1,3 +1 @@ -[ - "Unspecified" -] +["Unspecified"] diff --git a/schemas/data/src/addition/AquiferType.json b/schemas/data/src/addition/AquiferType.json index 03fc7bda..f0780c20 100644 --- a/schemas/data/src/addition/AquiferType.json +++ b/schemas/data/src/addition/AquiferType.json @@ -1 +1 @@ -["Artesian", "Confined", "Semi-Confined", "Unconfined"] \ No newline at end of file +["Artesian", "Confined", "Semi-Confined", "Unconfined"] diff --git a/schemas/data/src/addition/MonitoringLocationType.json b/schemas/data/src/addition/MonitoringLocationType.json index 623da7da..d92d12e7 100644 --- a/schemas/data/src/addition/MonitoringLocationType.json +++ b/schemas/data/src/addition/MonitoringLocationType.json @@ -1 +1,9 @@ -["Dug Well", "Lake/Pond", "Multilevel Well", "Nested Well", "Piezometer", "Unspecified", "Wetland"] +[ + "Dug Well", + "Lake/Pond", + "Multilevel Well", + "Nested Well", + "Piezometer", + "Unspecified", + "Wetland" +] diff --git a/schemas/data/src/addition/SampleCondition.json b/schemas/data/src/addition/SampleCondition.json index 91823525..a165a4f4 100644 --- a/schemas/data/src/addition/SampleCondition.json +++ b/schemas/data/src/addition/SampleCondition.json @@ -5,4 +5,4 @@ "The site has been recently pumped or purged", "The site is being pumped for water use", "Unspecified" -] \ No newline at end of file +] diff --git a/schemas/data/src/addition/WellIDContext.json b/schemas/data/src/addition/WellIDContext.json index 8d322423..08768b8e 100644 --- a/schemas/data/src/addition/WellIDContext.json +++ b/schemas/data/src/addition/WellIDContext.json @@ -12,4 +12,4 @@ "SK", "YK", "OTHER" -] \ No newline at end of file +] diff --git a/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json b/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json index 7f67ef67..663d7f19 100644 --- a/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json +++ b/schemas/data/src/logic/ActivityMediaName-Groundwater-DepthMeasure.json @@ -24,4 +24,4 @@ { "required": ["WellOpenIntervalBottomMeasure"] } ] } -} \ No newline at end of file +} diff --git a/schemas/data/src/logic/ActivityType-CTS-ActivityStartTime.json b/schemas/data/src/logic/ActivityType-CTS-ActivityStartTime.json index db1e7913..240c544f 100644 --- a/schemas/data/src/logic/ActivityType-CTS-ActivityStartTime.json +++ b/schemas/data/src/logic/ActivityType-CTS-ActivityStartTime.json @@ -8,14 +8,10 @@ "unevaluatedProperties": true, "properties": { "ActivityType": { - "enum": [ - "Field Msr/Obs-Continuous Time Series" - ] + "enum": ["Field Msr/Obs-Continuous Time Series"] } }, - "required": [ - "ActivityType" - ] + "required": ["ActivityType"] }, "then": { "type": "object", @@ -23,8 +19,6 @@ "properties": { "ActivityStartTime": true }, - "required": [ - "ActivityStartTime" - ] + "required": ["ActivityStartTime"] } -} \ No newline at end of file +} diff --git a/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json index 04910f36..198c8e21 100644 --- a/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json +++ b/schemas/data/src/logic/GroundwaterFields-ActivityMediaName-Groundwater.json @@ -46,4 +46,4 @@ }, "required": ["ActivityMediaName"] } -} \ No newline at end of file +} diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json index c74c1307..21f59cfd 100644 --- a/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json +++ b/schemas/data/src/logic/MonitoringLocationType-Well-SampleCondition.json @@ -11,7 +11,13 @@ "enum": ["Groundwater", "Porewater"] }, "MonitoringLocationType": { - "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] + "enum": [ + "Dug Well", + "Multilevel Well", + "Nested Well", + "Piezometer", + "Well" + ] }, "ActivityType": { "not": { diff --git a/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json index 386123a0..b7302d87 100644 --- a/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json +++ b/schemas/data/src/logic/MonitoringLocationType-Well-WellUseType.json @@ -11,7 +11,13 @@ "enum": ["Groundwater", "Porewater"] }, "MonitoringLocationType": { - "enum": ["Dug Well", "Multilevel Well", "Nested Well", "Piezometer", "Well"] + "enum": [ + "Dug Well", + "Multilevel Well", + "Nested Well", + "Piezometer", + "Well" + ] } }, "required": ["ActivityMediaName", "MonitoringLocationType"] diff --git a/schemas/data/src/lookup/ActivityType-ActivityGroupType.json b/schemas/data/src/lookup/ActivityType-ActivityGroupType.json index a4686a11..1b5d7366 100644 --- a/schemas/data/src/lookup/ActivityType-ActivityGroupType.json +++ b/schemas/data/src/lookup/ActivityType-ActivityGroupType.json @@ -1,37 +1,37 @@ { -"Field Msr/Obs-Continuous Time Series": "Continuous Data", -"Field Msr/Obs": "Field Measure", -"Field Msr/Obs-Portable Data Logger": "Field Measure", -"Field Msr/Obs-Integrated Flow Proportioned": "Field Measure", -"Field Msr/Obs-Integrated Time Series": "Field Measure", -"Field Msr/Obs-Integrated Vertical Profile": "Field Measure", -"Sample-Composite With Parents": "Lab Sample", -"Sample-Composite Without Parents": "Lab Sample", -"Sample-Field Split": "Lab Sample", -"Sample-Integrated Flow Proportioned": "Lab Sample", -"Sample-Integrated Horizontal and Vertical Composite Profile": "Lab Sample", -"Sample-Integrated Horizontal Profile": "Lab Sample", -"Sample-Integrated Time Series": "Lab Sample", -"Sample-Integrated Vertical Profile": "Lab Sample", -"Sample-Other": "Lab Sample", -"Sample-Routine": "Lab Sample", -"Quality Control Field Replicate Msr/Obs": "Quality Control - Field Measure", -"Quality Control Field Replicate Portable Data Logger": "Quality Control - Field Measure", -"Quality Control-Calibration Check": "Quality Control - Field Measure", -"Quality Control Field Sample Equipment Rinsate Blank": "Quality Control - Lab Sample", -"Quality Control Sample-Blind Duplicate": "Quality Control - Lab Sample", -"Quality Control Sample-Field Blank": "Quality Control - Lab Sample", -"Quality Control Sample-Field Replicate": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Blank": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Duplicate": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Matrix Spike": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Re-Analysis": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Spike": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Split": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Surrogate Control Standard": "Quality Control - Lab Sample", -"Quality Control Sample-Lab Surrogate Control Standard Duplicate": "Quality Control - Lab Sample", -"Quality Control Sample-Reference Sample": "Quality Control - Lab Sample", -"Quality Control Sample-Trip Blank": "Quality Control - Lab Sample", -"Sample-Positive Control": "Quality Control - Lab Sample", -"Unspecified": "Unspecified" + "Field Msr/Obs-Continuous Time Series": "Continuous Data", + "Field Msr/Obs": "Field Measure", + "Field Msr/Obs-Portable Data Logger": "Field Measure", + "Field Msr/Obs-Integrated Flow Proportioned": "Field Measure", + "Field Msr/Obs-Integrated Time Series": "Field Measure", + "Field Msr/Obs-Integrated Vertical Profile": "Field Measure", + "Sample-Composite With Parents": "Lab Sample", + "Sample-Composite Without Parents": "Lab Sample", + "Sample-Field Split": "Lab Sample", + "Sample-Integrated Flow Proportioned": "Lab Sample", + "Sample-Integrated Horizontal and Vertical Composite Profile": "Lab Sample", + "Sample-Integrated Horizontal Profile": "Lab Sample", + "Sample-Integrated Time Series": "Lab Sample", + "Sample-Integrated Vertical Profile": "Lab Sample", + "Sample-Other": "Lab Sample", + "Sample-Routine": "Lab Sample", + "Quality Control Field Replicate Msr/Obs": "Quality Control - Field Measure", + "Quality Control Field Replicate Portable Data Logger": "Quality Control - Field Measure", + "Quality Control-Calibration Check": "Quality Control - Field Measure", + "Quality Control Field Sample Equipment Rinsate Blank": "Quality Control - Lab Sample", + "Quality Control Sample-Blind Duplicate": "Quality Control - Lab Sample", + "Quality Control Sample-Field Blank": "Quality Control - Lab Sample", + "Quality Control Sample-Field Replicate": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Blank": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Duplicate": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Matrix Spike": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Re-Analysis": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Spike": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Split": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Surrogate Control Standard": "Quality Control - Lab Sample", + "Quality Control Sample-Lab Surrogate Control Standard Duplicate": "Quality Control - Lab Sample", + "Quality Control Sample-Reference Sample": "Quality Control - Lab Sample", + "Quality Control Sample-Trip Blank": "Quality Control - Lab Sample", + "Sample-Positive Control": "Quality Control - Lab Sample", + "Unspecified": "Unspecified" } diff --git a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json index 18781bdc..2e6498f7 100644 --- a/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json +++ b/schemas/data/src/lookup/CharacteristicName-CharacteristicWQXGroup.json @@ -7,30 +7,30 @@ "1,2-Dichloroethane": "Organics, Other", "1,2-Dichloropropane": "Organics, Other", "1,2,3,4-Tetrahydronaphthalene": "Organics, Other", - "1,2,3,4,6,7,8-Heptachlorodibenzo-p-dioxin-C13":"Organics, Other", - "1,2,3,4,6,7,8-Heptachlorodibenzofuran-C13":"Organics, Other", - "1,2,3,4,7,8,9-Heptachlorodibenzofuran-13C12":"Organics, Other", - "1,2,3,7,8-Pentachlorodibenzo-p-dioxin-C13":"Organics, Other", - "1,2,3,7,8-Pentachlorodibenzofuran-C13":"Organics, Other", + "1,2,3,4,6,7,8-Heptachlorodibenzo-p-dioxin-C13": "Organics, Other", + "1,2,3,4,6,7,8-Heptachlorodibenzofuran-C13": "Organics, Other", + "1,2,3,4,7,8,9-Heptachlorodibenzofuran-13C12": "Organics, Other", + "1,2,3,7,8-Pentachlorodibenzo-p-dioxin-C13": "Organics, Other", + "1,2,3,7,8-Pentachlorodibenzofuran-C13": "Organics, Other", "1,2,6-Trimethylphenanthrene": "Organics, Other", - "1,3-Butadiene":"Organics, Other", + "1,3-Butadiene": "Organics, Other", "1,3-Dichlorobenzene": "Organics, Other", "1,4,6,7-Tetramethylnaphthalene": "Organics, Other", "1,7-Dimethylfluorene": "Organics, Other", "1,7-Dimethylphenanthrene": "Organics, Other", "1,8-Dimethylphenanthrene": "Organics, Other", - "1H,1H, 2H, 2H-Perfluorodecane sulfonic acid":"PFAS,Perfluorinated Alkyl Substance", - "2-Choro-6-ethylamino-4-amino-s-triazine":"Organics, Other", + "1H,1H, 2H, 2H-Perfluorodecane sulfonic acid": "PFAS,Perfluorinated Alkyl Substance", + "2-Choro-6-ethylamino-4-amino-s-triazine": "Organics, Other", "2-Fluorobiphenyl": "Organics, Other", "2-Methyldibenzothiophenes/3-Methyldibenzothiophenes": "Organics, Other", "2-Methylfluorene": "Organics, Other", "2-Methylnaphthalene-D10": "Organics, Other", - "2-Pentanol":"Organics, Other", + "2-Pentanol": "Organics, Other", "2,3,3-tris(4-methoxyphenyl)-N,N-dimethylprop-2-en-1-amine": "Organics, Pesticide", "2,3,4,5- & 2,3,5,6- Tetrachlorophenol": "Organics, Other", - "2,3,4,7,8-Pentachlorodibenzofuran-C13":"Organics, Other", - "2,3,7,8-Tetrachlorodibenzo-p-dioxin-C13":"Organics, Other", - "2,3,7,8-Tetrachlorodibenzofuran-C13":"Organics, Other", + "2,3,4,7,8-Pentachlorodibenzofuran-C13": "Organics, Other", + "2,3,7,8-Tetrachlorodibenzo-p-dioxin-C13": "Organics, Other", + "2,3,7,8-Tetrachlorodibenzofuran-C13": "Organics, Other", "2,4- & 2,5-Dichlorophenol": "Organics, Other", "2,4-DB": "Organics, Pesticide", "2,4-Dichlorophenol-d3": "Organics, Pesticide", @@ -49,9 +49,9 @@ "3,6-Dimethylphenanthrene": "Organics, Other", "4-Chloro-3-nitrobenzotrifluoride": "Organics, Other", "4-Hydroxy-chlorothalonil": "Organics, Pesticide", - "4-Nonylphenol monoethoxylates":"Organics, Other", - "4-Nonylphenol pentaethoxylates":"Organics, Other", - "4-Nonylphenol tetraethoxylates":"Organics, Other", + "4-Nonylphenol monoethoxylates": "Organics, Other", + "4-Nonylphenol pentaethoxylates": "Organics, Other", + "4-Nonylphenol tetraethoxylates": "Organics, Other", "4,5-Dichlorocatechol": "Organics, Other", "4,6-Dichloroguaiacol": "Organics, Other", "4,6-Dimethyldibenzothiophene": "Organics, Other", @@ -62,12 +62,12 @@ "Acidity": "Physical", "Acridine": "Organics, Other", "Adenosine triphosphate": "Organics, Other", - "Allyl chloride":"Organics, Other", + "Allyl chloride": "Organics, Other", "Ammonia, un-ionized": "Nutrient", "Antimony-121": "Stable Isotopes", "ar,ar'-Dimethylbiphenyl": "Organics, Other", "Arsenic-75": "Stable Isotopes", - "Asbestos":"Inorganics, Major, Non-metals", + "Asbestos": "Inorganics, Major, Non-metals", "BDE-049": "Organics, BDEs", "BDE-071": "Organics, BDEs", "BDE-077": "Organics, BDEs", @@ -77,12 +77,12 @@ "Benzo(a)anthracene-D12": "Organics, Other", "Benzo(b)fluoranthene-D12": "Organics, Other", "Benzo(g,h,i)perylene-D12": "Organics, Other", - "Benzo[ghi]perylene":"Organics, Other", + "Benzo[ghi]perylene": "Organics, Other", "Biphenyl-d10": "Organics, Other", "Bis(2-ethoxyethyl) phthalate": "Organics, Other", - "Bromochloromethane":"Organics, Other", + "Bromochloromethane": "Organics, Other", "Bromophos-ethyl": "Organics, Pesticide", - "Bromopropylate":"Organics, Pesticide", + "Bromopropylate": "Organics, Pesticide", "Bupirimate": "Organics, Pesticide", "Butyraldehyde": "Organics, Other", "C4-Fluorenes": "Organics, Other", @@ -90,7 +90,7 @@ "Carbon-13": "Stable Isotopes", "Cation/anion ratio": "Physical", "CFC-12": "Organics, Other", - "Chlorine dioxide":"Inorganics, Major, Non-metals", + "Chlorine dioxide": "Inorganics, Major, Non-metals", "Chlorine, Free Residual": "Inorganics, Major, Non-metals", "Chlorine, Total Residual": "Inorganics, Major, Non-metals", "Chlorite": "Inorganics, Major, Non-metals", @@ -101,7 +101,7 @@ "Chlorophyll a, uncorrected for pheophytin": "Biological, Photosynthetic Pigments", "Chromium-52": "Stable Isotopes", "Chromium-53": "Stable Isotopes", - "cis-Cypermethrin":"Organics, Pesticide", + "cis-Cypermethrin": "Organics, Pesticide", "cis-Mevinphos": "Organics, Pesticide", "Clarithromycin": "Organics, Other", "Clindamycin": "Organics, Other", @@ -120,7 +120,7 @@ "Decabromodiphenyl ether": "Organics, BDEs", "Depth, Secchi disk depth": "Physical", "Depth, snow cover": "Physical", - "Desmosterol":"Organics, Other", + "Desmosterol": "Organics, Other", "Desthio-prothioconazole": "Organics, Pesticide", "Deuterium/Hydrogen ratio": "Stable Isotopes", "Di(2-ethylhexyl) phthalate": "Organics, Other", @@ -129,17 +129,17 @@ "Dichlofenthion": "Organics, Pesticide", "Dichlofluanid": "Organics, Pesticide", "Diclofop": "Organics, Pesticide", - "Dihydrocholesterol":"Organics, Other", + "Dihydrocholesterol": "Organics, Other", "Dimethoate-d6": "Organics, Pesticide", "Dimethyl diselenide": "Organics, Other", - "Dimethyl selenoxide":"Organics, Other", + "Dimethyl selenoxide": "Organics, Other", "Discharge, River/Stream": "Physical", "Docosanoic acid": "Organics, Other", - "epi-Coprostanol":"Organics, Other", + "epi-Coprostanol": "Organics, Other", "Etrimfos": "Organics, Pesticide", "Fenamidone": "Organics, Pesticide", "Fenitrothion-d6": "Organics, Pesticide", - "Fenobucarb":"Organics, Pesticide", + "Fenobucarb": "Organics, Pesticide", "Fenoxaprop-P-ethyl": "Organics, Pesticide", "Fluazinam": "Organics, Pesticide", "Flumetralin": "Organics, Pesticide", @@ -149,9 +149,9 @@ "Glyoxal": "Organics, Other", "Heptachlor and Heptachlor epoxide": "Organics, Pesticide", "Heptadecanoic acid": "Organics, Other", - "Heptafluorobutyric acid":"PFAS,Perfluorinated Alkyl Substance", + "Heptafluorobutyric acid": "PFAS,Perfluorinated Alkyl Substance", "Heptanal": "Organics, Other", - "Hexachlorodibenzo-p-dioxin":"Organics, Other", + "Hexachlorodibenzo-p-dioxin": "Organics, Other", "Hexaldehyde": "Organics, Other", "Hexane Extractable Material (HEM)": "Organics, Other", "Hexavalent chromium compounds": "Inorganics, Minor, Metals", @@ -160,8 +160,8 @@ "Hydroxyphenols": "Organics, Other", "Ice cover, floating or solid, as % area estimate": "Physical", "Indene": "Organics, Other", - "Indomethacin":"Organics, Other", - "Inorganic nitrogen (ammonia, nitrate and nitrite)":"Nutrient", + "Indomethacin": "Organics, Other", + "Inorganic nitrogen (ammonia, nitrate and nitrite)": "Nutrient", "Inorganic nitrogen (nitrate and nitrite)": "Nutrient", "Ipconazole": "Organics, Pesticide", "Iron-57": "Stable Isotopes", @@ -174,7 +174,7 @@ "Mandipropamid": "Organics, Pesticide", "Manganese-55": "Stable Isotopes", "Methamphetamine": "Organics, Other", - "Methyl mercaptan":"Organics, Other", + "Methyl mercaptan": "Organics, Other", "Methylbiphenyl": "Organics, Other", "Methylglyoxal": "Organics, Other", "Methylmercury(1+)": "Inorganics, Minor, Metals", @@ -184,7 +184,7 @@ "Molybdenum-98": "Stable Isotopes", "Monochlorodehydroabietic acid": "Organics, Other", "Monolinuron": "Organics, Pesticide", - "N-Ethylperfluorooctanesulfonamide":"PFAS,Perfluorinated Alkyl Substance", + "N-Ethylperfluorooctanesulfonamide": "PFAS,Perfluorinated Alkyl Substance", "Nickel-60": "Stable Isotopes", "Nitenpyram": "Organics, Pesticide", "Nitrapyrin": "Organics, Pesticide", @@ -210,8 +210,8 @@ "perfluorohexane sulfonamido propyl amine": "PFAS,Perfluorinated Alkyl Substance", "Perfluorohexane sulfonamidopropyl ammonium": "PFAS,Perfluorinated Alkyl Substance", "Petroleum hydrocarbons, total volatile": "Organics, Other", - "pH, lab":"Physical", - "pH, saturated":"Physical", + "pH, lab": "Physical", + "pH, saturated": "Physical", "Phaeophytin - Periphyton (attached)": "Biological, Photosynthetic Pigments", "Phenol, 2,3-dichloro-6-methoxy-": "Organics, Other", "Phenol, 4-chloro-2-methoxy-": "Organics, Other", @@ -248,11 +248,11 @@ "Sucralose": "Organics, Other", "Sulfoxaflor-13C15N2": "Organics, Pesticide", "Sulfoxaflor": "Organics, Pesticide", - "Sulfur dioxide":"Inorganics, Minor, Non-metals", + "Sulfur dioxide": "Inorganics, Minor, Non-metals", "Sulfur Total": "Inorganics, Major, Non-metals", "Surfactants": "Organics, Other", "Tetrachloro-m-xylene": "Organics, Other", - "Tetrachloroanisole":"Organics, Other", + "Tetrachloroanisole": "Organics, Other", "Thifensulfuron": "Organics, Pesticide", "Thiophanate Methyl": "Organics, Pesticide", "Thiram": "Organics, Pesticide", @@ -260,13 +260,13 @@ "Tolfenamic acid": "Organics, Other", "Total Volatile Hydrocarbons, C6-C10": "Organics, Other", "Total xylenes": "Organics, Other", - "Triadimenol":"Organics, Pesticide", + "Triadimenol": "Organics, Pesticide", "Trichloroacetic acid": "Organics, Other", "Trichloroveretrols": "Organics, Other", "Tricosafluoroundecane-1-sulfonic acid sodium salt": "PFAS,Perfluorinated Alkyl Substance", "Trinexapac-Ethyl": "Organics, Pesticide", "Uranium-234/Uranium-238 ratio": "Radiochemical", - "Valeric acid":"Organics, Other", + "Valeric acid": "Organics, Other", "Venlafaxine": "Organics, Other", "Water level elevation": "Physical", "Weak, dissociable cyanide": "Inorganics, Minor, Non-metals", diff --git a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json index 8a32d60b..9e0bf569 100644 --- a/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json +++ b/schemas/data/src/quality-control/ActivityMediaName-ActivityDepthHeightMeasure-Maximum.json @@ -8,10 +8,7 @@ "unevaluatedProperties": true, "properties": { "ActivityMediaName": { - "enum": [ - "Groundwater", - "Porewater" - ] + "enum": ["Groundwater", "Porewater"] }, "ActivityDepthHeightMeasure": true }, diff --git a/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone-UTC.json b/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone-UTC.json index ca037537..db5b33dd 100644 --- a/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone-UTC.json +++ b/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone-UTC.json @@ -8,14 +8,10 @@ "unevaluatedProperties": true, "properties": { "ActivityType": { - "enum": [ - "Field Msr/Obs-Continuous Time Series" - ] + "enum": ["Field Msr/Obs-Continuous Time Series"] } }, - "required": [ - "ActivityType" - ] + "required": ["ActivityType"] }, "then": { "type": "object", @@ -28,4 +24,4 @@ } } } -} \ No newline at end of file +} diff --git a/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone.json b/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone.json index 6a3bba22..0a4b157a 100644 --- a/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone.json +++ b/schemas/data/src/quality-control/ActivityType-CTS-ActivityStartTimeZone.json @@ -8,14 +8,10 @@ "unevaluatedProperties": true, "properties": { "ActivityType": { - "enum": [ - "Field Msr/Obs-Continuous Time Series" - ] + "enum": ["Field Msr/Obs-Continuous Time Series"] } }, - "required": [ - "ActivityType" - ] + "required": ["ActivityType"] }, "then": { "type": "object", @@ -23,8 +19,6 @@ "properties": { "ActivityStartTimeZone": true }, - "required": [ - "ActivityStartTimeZone" - ] + "required": ["ActivityStartTimeZone"] } -} \ No newline at end of file +} diff --git a/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json b/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json index bd95caa9..92e1a5f6 100644 --- a/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json +++ b/schemas/data/src/quality-control/CharacteristicName-ActivityType-Surrogate.json @@ -220,10 +220,7 @@ "const": "%" } }, - "required": [ - "CharacteristicName", - "ResultUnit" - ] + "required": ["CharacteristicName", "ResultUnit"] }, { "properties": { @@ -253,8 +250,6 @@ ] } }, - "required": [ - "ActivityType" - ] + "required": ["ActivityType"] } } diff --git a/schemas/data/src/quality-control/CharacteristicName-Ammonia.json b/schemas/data/src/quality-control/CharacteristicName-Ammonia.json index ee1c60ca..f36c4fa2 100644 --- a/schemas/data/src/quality-control/CharacteristicName-Ammonia.json +++ b/schemas/data/src/quality-control/CharacteristicName-Ammonia.json @@ -5,11 +5,11 @@ "errorMessage": "qc-CharacteristicName-Ammonia", "type": "object", "unevaluatedProperties": true, - "properties": { - "CharacteristicName": { - "not": { - "const": "Ammonia" - } + "properties": { + "CharacteristicName": { + "not": { + "const": "Ammonia" } } - } \ No newline at end of file + } +} diff --git a/schemas/data/src/quality-control/CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None.json b/schemas/data/src/quality-control/CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None.json index 1b2edddf..35d92984 100644 --- a/schemas/data/src/quality-control/CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None.json +++ b/schemas/data/src/quality-control/CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None.json @@ -25,7 +25,10 @@ }, "ResultDetectionQuantitationLimitMeasure": true }, - "required": ["CharacteristicName", "ResultDetectionQuantitationLimitMeasure"] + "required": [ + "CharacteristicName", + "ResultDetectionQuantitationLimitMeasure" + ] }, "then": { "type": "object", diff --git a/schemas/data/src/quality-control/CharacteristicName-pH-ActivityType-Sample.json b/schemas/data/src/quality-control/CharacteristicName-pH-ActivityType-Sample.json index cdc90f1a..0c3553eb 100644 --- a/schemas/data/src/quality-control/CharacteristicName-pH-ActivityType-Sample.json +++ b/schemas/data/src/quality-control/CharacteristicName-pH-ActivityType-Sample.json @@ -11,10 +11,7 @@ "const": "pH" } }, - "required": [ - "CharacteristicName", - "ActivityType" - ] + "required": ["CharacteristicName", "ActivityType"] }, "then": { "type": "object", @@ -27,8 +24,6 @@ } } }, - "required": [ - "ActivityType" - ] + "required": ["ActivityType"] } } diff --git a/schemas/data/src/quality-control/ResultSampleFraction-FreeAvailable.json b/schemas/data/src/quality-control/ResultSampleFraction-FreeAvailable.json index 46f53a42..387610f2 100644 --- a/schemas/data/src/quality-control/ResultSampleFraction-FreeAvailable.json +++ b/schemas/data/src/quality-control/ResultSampleFraction-FreeAvailable.json @@ -18,7 +18,7 @@ "unevaluatedProperties": true, "properties": { "CharacteristicName": { - "enum": ["Chlorine","Cyanide"] + "enum": ["Chlorine", "Cyanide"] } }, "required": ["CharacteristicName"] diff --git a/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json b/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json index 64e356e2..c614f620 100644 --- a/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json +++ b/schemas/data/src/subset/ActivityDepthAltitudeReferencePointUnit.json @@ -1 +1 @@ -["cm", "ft", "in", "m"] \ No newline at end of file +["cm", "ft", "in", "m"] diff --git a/schemas/data/src/subset/ActivityType.json b/schemas/data/src/subset/ActivityType.json index 1cbbaddd..d02e87fb 100644 --- a/schemas/data/src/subset/ActivityType.json +++ b/schemas/data/src/subset/ActivityType.json @@ -1,37 +1,37 @@ [ - "Field Msr/Obs", - "Field Msr/Obs-Continuous Time Series", - "Field Msr/Obs-Integrated Flow Proportioned", - "Field Msr/Obs-Integrated Time Series", - "Field Msr/Obs-Integrated Vertical Profile", - "Field Msr/Obs-Portable Data Logger", - "Quality Control Field Replicate Msr/Obs", - "Quality Control Field Replicate Portable Data Logger", - "Quality Control Field Sample Equipment Rinsate Blank", - "Quality Control Sample-Blind Duplicate", - "Quality Control Sample-Field Blank", - "Quality Control Sample-Field Replicate", - "Quality Control Sample-Lab Blank", - "Quality Control Sample-Lab Duplicate", - "Quality Control Sample-Lab Matrix Spike", - "Quality Control Sample-Lab Re-Analysis", - "Quality Control Sample-Lab Spike", - "Quality Control Sample-Lab Split", - "Quality Control Sample-Lab Surrogate Control Standard", - "Quality Control Sample-Lab Surrogate Control Standard Duplicate", - "Quality Control Sample-Reference Sample", - "Quality Control Sample-Trip Blank", - "Quality Control-Calibration Check", - "Sample-Composite With Parents", - "Sample-Composite Without Parents", - "Sample-Field Split", - "Sample-Integrated Flow Proportioned", - "Sample-Integrated Horizontal and Vertical Composite Profile", - "Sample-Integrated Horizontal Profile", - "Sample-Integrated Time Series", - "Sample-Integrated Vertical Profile", - "Sample-Other", - "Sample-Positive Control", - "Sample-Routine", - "Unspecified" -] \ No newline at end of file + "Field Msr/Obs", + "Field Msr/Obs-Continuous Time Series", + "Field Msr/Obs-Integrated Flow Proportioned", + "Field Msr/Obs-Integrated Time Series", + "Field Msr/Obs-Integrated Vertical Profile", + "Field Msr/Obs-Portable Data Logger", + "Quality Control Field Replicate Msr/Obs", + "Quality Control Field Replicate Portable Data Logger", + "Quality Control Field Sample Equipment Rinsate Blank", + "Quality Control Sample-Blind Duplicate", + "Quality Control Sample-Field Blank", + "Quality Control Sample-Field Replicate", + "Quality Control Sample-Lab Blank", + "Quality Control Sample-Lab Duplicate", + "Quality Control Sample-Lab Matrix Spike", + "Quality Control Sample-Lab Re-Analysis", + "Quality Control Sample-Lab Spike", + "Quality Control Sample-Lab Split", + "Quality Control Sample-Lab Surrogate Control Standard", + "Quality Control Sample-Lab Surrogate Control Standard Duplicate", + "Quality Control Sample-Reference Sample", + "Quality Control Sample-Trip Blank", + "Quality Control-Calibration Check", + "Sample-Composite With Parents", + "Sample-Composite Without Parents", + "Sample-Field Split", + "Sample-Integrated Flow Proportioned", + "Sample-Integrated Horizontal and Vertical Composite Profile", + "Sample-Integrated Horizontal Profile", + "Sample-Integrated Time Series", + "Sample-Integrated Vertical Profile", + "Sample-Other", + "Sample-Positive Control", + "Sample-Routine", + "Unspecified" +] diff --git a/schemas/data/src/subset/CharacteristicName.json b/schemas/data/src/subset/CharacteristicName.json index ae77033e..643319d3 100644 --- a/schemas/data/src/subset/CharacteristicName.json +++ b/schemas/data/src/subset/CharacteristicName.json @@ -1,4 +1,4 @@ - [ +[ ".alpha.-Amino-2,3-dihydro-5-methyl-3-oxo-4-isoxazolepropanoic acid", ".alpha.-Endosulfan", ".alpha.-Hexachlorocyclohexane", @@ -1669,4 +1669,4 @@ "Zinc", "Zirconium", "Zoxamide" -] \ No newline at end of file +] diff --git a/schemas/data/src/subset/MonitoringLocationHorizontalAccuracyUnit.json b/schemas/data/src/subset/MonitoringLocationHorizontalAccuracyUnit.json index 3bceb556..546ca3b7 100644 --- a/schemas/data/src/subset/MonitoringLocationHorizontalAccuracyUnit.json +++ b/schemas/data/src/subset/MonitoringLocationHorizontalAccuracyUnit.json @@ -1,4 +1 @@ -[ - "km", - "m" -] +["km", "m"] diff --git a/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json b/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json index 7e66d2dc..ce320444 100644 --- a/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json +++ b/schemas/data/src/subset/MonitoringLocationHorizontalCoordinateReferenceSystem.json @@ -1,8 +1 @@ -[ - "NAD27", - "NAD83", - "OTHER", - "UNKWN", - "WGS72", - "WGS84" -] +["NAD27", "NAD83", "OTHER", "UNKWN", "WGS72", "WGS84"] diff --git a/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json b/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json index 6f194b61..de7808f8 100644 --- a/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json +++ b/schemas/data/src/subset/MonitoringLocationVerticalAccuracyUnit.json @@ -1 +1 @@ -["ft", "m"] \ No newline at end of file +["ft", "m"] diff --git a/schemas/data/src/subset/MonitoringLocationVerticalUnit.json b/schemas/data/src/subset/MonitoringLocationVerticalUnit.json index 1df607cc..1e67085e 100644 --- a/schemas/data/src/subset/MonitoringLocationVerticalUnit.json +++ b/schemas/data/src/subset/MonitoringLocationVerticalUnit.json @@ -1,5 +1 @@ -[ - "ft", - "m", - "MASL" -] +["ft", "m", "MASL"] diff --git a/schemas/data/src/subset/ResultDetectionCondition.json b/schemas/data/src/subset/ResultDetectionCondition.json index 5134f645..b447e4c6 100644 --- a/schemas/data/src/subset/ResultDetectionCondition.json +++ b/schemas/data/src/subset/ResultDetectionCondition.json @@ -3,6 +3,6 @@ "Above Detection/Quantification Limit", "Detected Not Quantified", "Not Detected", - "Not Reported", + "Not Reported", "Unable to Measure" ] diff --git a/schemas/data/src/subset/ResultSampleFraction.json b/schemas/data/src/subset/ResultSampleFraction.json index ae2e31c4..c17fa567 100644 --- a/schemas/data/src/subset/ResultSampleFraction.json +++ b/schemas/data/src/subset/ResultSampleFraction.json @@ -1,34 +1,34 @@ [ - "Acid Soluble", - "Bioavailable", - "Comb Available", - "Dissolved", - "Extractable", - "Extractable, CaCO3-bound", - "Extractable, exchangeable", - "Extractable, organic-bnd", - "Extractable, other", - "Extractable, oxide-bound", - "Extractable, residual", - "Filterable", - "Filtered", - "Filtered, field", - "Filtered, lab", - "Free Available", - "Inorganic", - "Non-Filterable (Particle)", - "Non-settleable", - "Non-volatile", - "Organic", - "Pot. Dissolved", - "Settleable", - "Supernate", - "Suspended", - "Total", - "Total Recoverable", - "Total Residual", - "Unfiltered", - "Unspecified", - "Vapor", - "Volatile" - ] \ No newline at end of file + "Acid Soluble", + "Bioavailable", + "Comb Available", + "Dissolved", + "Extractable", + "Extractable, CaCO3-bound", + "Extractable, exchangeable", + "Extractable, organic-bnd", + "Extractable, other", + "Extractable, oxide-bound", + "Extractable, residual", + "Filterable", + "Filtered", + "Filtered, field", + "Filtered, lab", + "Free Available", + "Inorganic", + "Non-Filterable (Particle)", + "Non-settleable", + "Non-volatile", + "Organic", + "Pot. Dissolved", + "Settleable", + "Supernate", + "Suspended", + "Total", + "Total Recoverable", + "Total Residual", + "Unfiltered", + "Unspecified", + "Vapor", + "Volatile" +] diff --git a/schemas/data/src/subset/ResultStatusID.json b/schemas/data/src/subset/ResultStatusID.json index 858f0f53..abdaac1e 100644 --- a/schemas/data/src/subset/ResultStatusID.json +++ b/schemas/data/src/subset/ResultStatusID.json @@ -1,8 +1 @@ -[ -"Accepted", -"Final", -"Historical", -"Preliminary", -"Provisional", -"Validated" -] +["Accepted", "Final", "Historical", "Preliminary", "Provisional", "Validated"] diff --git a/schemas/data/src/subset/ResultValueType.json b/schemas/data/src/subset/ResultValueType.json index a789f3d6..e6c0970b 100644 --- a/schemas/data/src/subset/ResultValueType.json +++ b/schemas/data/src/subset/ResultValueType.json @@ -1,7 +1 @@ -[ -"Actual", -"Blank Corrected", -"Calculated", -"Control Adjusted", -"Estimated" -] \ No newline at end of file +["Actual", "Blank Corrected", "Calculated", "Control Adjusted", "Estimated"] diff --git a/schemas/data/test/build.js b/schemas/data/test/build.js index 6d9b53e9..eb6823b6 100644 --- a/schemas/data/test/build.js +++ b/schemas/data/test/build.js @@ -1,5 +1,5 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; +import { test } from 'node:test' +import assert from 'node:assert/strict' import { toFriendlyName } from '../bin/build-lib.js' test('toFriendlyName › Should convert PascalCase to friendly name', (t) => { @@ -15,11 +15,17 @@ test('toFriendlyName › Should handle acronyms followed by words', (t) => { }) test('toFriendlyName › Should handle multiple word boundaries', (t) => { - assert.equal(toFriendlyName('AquiferUnitPorosityType'), 'Aquifer Unit Porosity Type') + assert.equal( + toFriendlyName('AquiferUnitPorosityType'), + 'Aquifer Unit Porosity Type' + ) }) test('toFriendlyName › Should handle long field names', (t) => { - assert.equal(toFriendlyName('ActivityDepthAltitudeReferencePoint'), 'Activity Depth Altitude Reference Point') + assert.equal( + toFriendlyName('ActivityDepthAltitudeReferencePoint'), + 'Activity Depth Altitude Reference Point' + ) }) test('toFriendlyName › Should handle single word', (t) => { @@ -28,4 +34,4 @@ test('toFriendlyName › Should handle single word', (t) => { test('toFriendlyName › Should handle consecutive acronyms', (t) => { assert.equal(toFriendlyName('XMLHTTPRequest'), 'XMLHTTP Request') -}) \ No newline at end of file +}) diff --git a/schemas/data/test/format.js b/schemas/data/test/format.js index f5b095dd..aadaafb3 100644 --- a/schemas/data/test/format.js +++ b/schemas/data/test/format.js @@ -1,75 +1,78 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import validate from "../frontend/index.js"; -import validateStrict from "../extract/index.js"; -import validateBackend from "../backend/index.js"; +import { test } from 'node:test' +import assert from 'node:assert/strict' +import validate from '../frontend/index.js' +import validateStrict from '../extract/index.js' +import validateBackend from '../backend/index.js' const checkProperty = (errors, keyword, property) => { for (const error of errors) { - if (error.keyword === "errorMessage") { - const nested = checkProperty(error.params.errors, keyword, property); - if (nested) return nested; + if (error.keyword === 'errorMessage') { + const nested = checkProperty(error.params.errors, keyword, property) + if (nested) return nested } - if (error.keyword !== keyword) continue; + if (error.keyword !== keyword) continue if ( - ["required", "dependencies"].includes(keyword) && + ['required', 'dependencies'].includes(keyword) && error.params.missingProperty === property ) { - return true; + return true } else if ( - keyword === "additionalProperties" && + keyword === 'additionalProperties' && error.params.additionalProperty === property ) { - return true; + return true } else if ( - keyword === "oneOf" && + keyword === 'oneOf' && error.params.passingSchemas.includes(property) ) { - return true; - } else if (keyword === "anyOf") return true; - else if (keyword === "not" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "enum" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "minimum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'anyOf') return true + else if (keyword === 'not' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'enum' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'minimum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMinimum" && + keyword === 'exclusiveMinimum' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "maximum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'maximum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMaximum" && + keyword === 'exclusiveMaximum' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "maxLength" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "pattern") return true; + return true + } else if ( + keyword === 'maxLength' && + error.instancePath.includes(property) + ) { + return true + } else if (keyword === 'pattern') return true } - return false; -}; + return false +} -test("Should accept strings", async (t) => { +test('Should accept strings', async (t) => { validate({ - DatasetName: "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-'\"", - MonitoringLocationID: "1234567890 W̱E¸NÁ¸NEĆ", - MonitoringLocationName: "ÀàäÄÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü", - }); - assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), false); - assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationID"), - false, - ); - assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationName"), - false, - ); -}); - -test("Should reject strings with multiline", async (t) => { + DatasetName: 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-\'"', + MonitoringLocationID: '1234567890 W̱E¸NÁ¸NEĆ', + MonitoringLocationName: 'ÀàäÄÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), false) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), + false + ) +}) + +test('Should reject strings with multiline', async (t) => { validate({ DatasetName: `qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-'\" 1234`, @@ -87,37 +90,37 @@ test("Should reject strings with multiline", async (t) => { 1234`, EventID: `qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM:/.,-'\" 1234`, - }); + }) - assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), true); + assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationID"), - true, - ); + checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), + true + ) assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationName"), - true, - ); + checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), + true + ) assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), - true, - ); + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodID'), + true + ) assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), - true, - ); + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodName'), + true + ) assert.equal( - checkProperty(validate.errors, "pattern", "LaboratoryName"), - true, - ); + checkProperty(validate.errors, 'pattern', 'LaboratoryName'), + true + ) assert.equal( - checkProperty(validate.errors, "pattern", "LaboratorySampleID"), - true, - ); - assert.equal(checkProperty(validate.errors, "pattern", "EventID"), true); -}); + checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), + true + ) + assert.equal(checkProperty(validate.errors, 'pattern', 'EventID'), true) +}) -test("Should accept strings-multiline", async (t) => { +test('Should accept strings-multiline', async (t) => { validate({ ResultComment: `English: qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM French: ÀàäÄÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü @@ -125,565 +128,680 @@ test("Should accept strings-multiline", async (t) => { Symbols: ~!@#$%^&*()_+-={}|[]\\:";'<>?,./ Other: W̱E¸NÁ¸NEĆ `, - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); -}); + }) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultComment'), + false + ) +}) // TODO update to included strict and loose time format -test("Should accept time formats", async (t) => { +test('Should accept time formats', async (t) => { validate({ - ActivityStartTime: "9:15:00", - ActivityEndTime: "13:15:00.000", - AnalysisStartTime: "0:15", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), false); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), false); - assert.equal(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), false); -}); - -test("Should reject time formats", async (t) => { + ActivityStartTime: '9:15:00', + ActivityEndTime: '13:15:00.000', + AnalysisStartTime: '0:15', + }) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityEndTime'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'AnalysisStartTime'), + false + ) +}) + +test('Should reject time formats', async (t) => { validate({ - ActivityStartTime: "9:15.00", - ActivityEndTime: "13:15.00.000", - AnalysisStartTime: "2.15", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); - assert.equal(checkProperty(validate.errors, "pattern", "AnalysisStartTime"), true); + ActivityStartTime: '9:15.00', + ActivityEndTime: '13:15.00.000', + AnalysisStartTime: '2.15', + }) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityEndTime'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'AnalysisStartTime'), + true + ) validate({ - ActivityStartTime: "0:15", - ActivityEndTime: "!0:15", + ActivityStartTime: '0:15', + ActivityEndTime: '!0:15', // 'AnalysisStartTime': '2.15' - }); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityStartTime"), true); - assert.equal(checkProperty(validate.errors, "pattern", "ActivityEndTime"), true); + }) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityEndTime'), + true + ) // assert.equal(checkProperty(validate.errors, 'pattern', 'AnalysisStartTime'), true) -}); +}) -test("Should accept timezone formats (strict)", async (t) => { +test('Should accept timezone formats (strict)', async (t) => { let valid = validateStrict({ - ActivityStartTimeZone: "Z", - ActivityEndTimeZone: "Z", - AnalysisStartTimeZone: "Z", - }); - assert.equal(valid, false); + ActivityStartTimeZone: 'Z', + ActivityEndTimeZone: 'Z', + AnalysisStartTimeZone: 'Z', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 0, - ); + 0 + ) valid = validateStrict({ - ActivityStartTimeZone: "+02:15", - ActivityEndTimeZone: "+02:15", - AnalysisStartTimeZone: "+02:15", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '+02:15', + ActivityEndTimeZone: '+02:15', + AnalysisStartTimeZone: '+02:15', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 0, - ); + 0 + ) valid = validateStrict({ - ActivityStartTimeZone: "-02:15", - ActivityEndTimeZone: "-02:15", - AnalysisStartTimeZone: "-02:15", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-02:15', + ActivityEndTimeZone: '-02:15', + AnalysisStartTimeZone: '-02:15', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 0, - ); + 0 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 0, - ); -}); + 0 + ) +}) -test("Should reject timezone formats (strict)", async (t) => { +test('Should reject timezone formats (strict)', async (t) => { let valid = validateStrict({ - ActivityStartTimeZone: "z", - ActivityEndTimeZone: "z", - AnalysisStartTimeZone: "z", - }); - assert.equal(valid, false); + ActivityStartTimeZone: 'z', + ActivityEndTimeZone: 'z', + AnalysisStartTimeZone: 'z', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateStrict({ - ActivityStartTimeZone: "9:45", - ActivityEndTimeZone: "9:45", - AnalysisStartTimeZone: "9:45", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '9:45', + ActivityEndTimeZone: '9:45', + AnalysisStartTimeZone: '9:45', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateStrict({ - ActivityStartTimeZone: "-00:00:00", - ActivityEndTimeZone: "-00:00:00", - AnalysisStartTimeZone: "-00:00:00", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-00:00:00', + ActivityEndTimeZone: '-00:00:00', + AnalysisStartTimeZone: '-00:00:00', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 2, - ); + 2 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 2, - ); + 2 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 2, - ); + 2 + ) valid = validateStrict({ - ActivityStartTimeZone: "-0215", - ActivityEndTimeZone: "-0215", - AnalysisStartTimeZone: "-0215", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-0215', + ActivityEndTimeZone: '-0215', + AnalysisStartTimeZone: '-0215', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateStrict({ - ActivityStartTimeZone: "-215", - ActivityEndTimeZone: "-215", - AnalysisStartTimeZone: "-215", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-215', + ActivityEndTimeZone: '-215', + AnalysisStartTimeZone: '-215', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateStrict({ - ActivityStartTimeZone: "-2:15", - ActivityEndTimeZone: "-2:15", - AnalysisStartTimeZone: "-2:15", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-2:15', + ActivityEndTimeZone: '-2:15', + AnalysisStartTimeZone: '-2:15', + }) + assert.equal(valid, false) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateStrict.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); -}); + 1 + ) +}) -test("Should accept timezone formats (loose)", async (t) => { +test('Should accept timezone formats (loose)', async (t) => { let valid = validateBackend({ - ActivityStartTimeZone: "Z", - ActivityEndTimeZone: "Z", - AnalysisStartTimeZone: "Z", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); + ActivityStartTimeZone: 'Z', + ActivityEndTimeZone: 'Z', + AnalysisStartTimeZone: 'Z', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) valid = validateBackend({ - ActivityStartTimeZone: "+02:15", - ActivityEndTimeZone: "+02:15", - AnalysisStartTimeZone: "+02:15", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); + ActivityStartTimeZone: '+02:15', + ActivityEndTimeZone: '+02:15', + AnalysisStartTimeZone: '+02:15', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) valid = validateBackend({ - ActivityStartTimeZone: "-02:15", - ActivityEndTimeZone: "-02:15", - AnalysisStartTimeZone: "-02:15", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); + ActivityStartTimeZone: '-02:15', + ActivityEndTimeZone: '-02:15', + AnalysisStartTimeZone: '-02:15', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) valid = validateBackend({ - ActivityStartTimeZone: "-0215", - ActivityEndTimeZone: "-0215", - AnalysisStartTimeZone: "-0215", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); + ActivityStartTimeZone: '-0215', + ActivityEndTimeZone: '-0215', + AnalysisStartTimeZone: '-0215', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) valid = validateBackend({ - ActivityStartTimeZone: "-215", - ActivityEndTimeZone: "-215", - AnalysisStartTimeZone: "-215", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); + ActivityStartTimeZone: '-215', + ActivityEndTimeZone: '-215', + AnalysisStartTimeZone: '-215', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) valid = validateBackend({ - ActivityStartTimeZone: "-2:15", - ActivityEndTimeZone: "-2:15", - AnalysisStartTimeZone: "-2:15", - }); - assert.equal(valid, true); - assert.equal(validateBackend.errors, null); -}); - -test("Should reject timezone formats (loose)", async (t) => { + ActivityStartTimeZone: '-2:15', + ActivityEndTimeZone: '-2:15', + AnalysisStartTimeZone: '-2:15', + }) + assert.equal(valid, true) + assert.equal(validateBackend.errors, null) +}) + +test('Should reject timezone formats (loose)', async (t) => { let valid = validateBackend({ - ActivityStartTimeZone: "z", - ActivityEndTimeZone: "z", - AnalysisStartTimeZone: "z", - }); - assert.equal(valid, false); + ActivityStartTimeZone: 'z', + ActivityEndTimeZone: 'z', + AnalysisStartTimeZone: 'z', + }) + assert.equal(valid, false) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateBackend({ - ActivityStartTimeZone: "9:45", - ActivityEndTimeZone: "9:45", - AnalysisStartTimeZone: "9:45", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '9:45', + ActivityEndTimeZone: '9:45', + AnalysisStartTimeZone: '9:45', + }) + assert.equal(valid, false) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 1, - ); + 1 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 1, - ); + 1 + ) valid = validateBackend({ - ActivityStartTimeZone: "-00:00:00", - ActivityEndTimeZone: "-00:00:00", - AnalysisStartTimeZone: "-00:00:00", - }); - assert.equal(valid, false); + ActivityStartTimeZone: '-00:00:00', + ActivityEndTimeZone: '-00:00:00', + AnalysisStartTimeZone: '-00:00:00', + }) + assert.equal(valid, false) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityStartTimeZone", + (i) => i.instancePath === '/ActivityStartTimeZone' ).length, - 2, - ); + 2 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/ActivityEndTimeZone", + (i) => i.instancePath === '/ActivityEndTimeZone' ).length, - 2, - ); + 2 + ) assert.equal( validateBackend.errors.filter( - (i) => i.instancePath === "/AnalysisStartTimeZone", + (i) => i.instancePath === '/AnalysisStartTimeZone' ).length, - 2, - ); -}); + 2 + ) +}) -test("Should pass CSV Injection check", async (t) => { +test('Should pass CSV Injection check', async (t) => { validate({ - ResultComment: "Bar River", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); -}); + ResultComment: 'Bar River', + }) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultComment'), + false + ) +}) -test("Should reject CSV Injection check when leading space", async (t) => { +test('Should reject CSV Injection check when leading space', async (t) => { validate({ - ResultComment: " test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: ' test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading caragereturn", async (t) => { +test('Should reject CSV Injection check when leading caragereturn', async (t) => { validate({ - ResultComment: "\rtest", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '\rtest', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading newline", async (t) => { +test('Should reject CSV Injection check when leading newline', async (t) => { validate({ - ResultComment: "\ntest", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '\ntest', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading tab", async (t) => { +test('Should reject CSV Injection check when leading tab', async (t) => { validate({ - ResultComment: "\ttest", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '\ttest', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading =", async (t) => { +test('Should reject CSV Injection check when leading =', async (t) => { validate({ - ResultComment: "=test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '=test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading +", async (t) => { +test('Should reject CSV Injection check when leading +', async (t) => { validate({ - ResultComment: "+test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '+test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading -", async (t) => { +test('Should reject CSV Injection check when leading -', async (t) => { validate({ - ResultComment: "-test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '-test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading @", async (t) => { +test('Should reject CSV Injection check when leading @', async (t) => { validate({ - ResultComment: "@test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '@test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) -test("Should reject CSV Injection check when leading null char", async (t) => { +test('Should reject CSV Injection check when leading null char', async (t) => { validate({ - ResultComment: "\x00test", - }); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); -}); + ResultComment: '\x00test', + }) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) +}) // *** Range constraints — GW measure fields *** // -test("Should reject BoreholeDepthMeasure > 0", async (t) => { - validate({ BoreholeDepthMeasure: 1, BoreholeDepthUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "BoreholeDepthMeasure"), true); -}); -test("Should accept BoreholeDepthMeasure <= 0", async (t) => { - validate({ BoreholeDepthMeasure: -10, BoreholeDepthUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "BoreholeDepthMeasure"), false); -}); - -test("Should reject WellDepthMeasure > 0", async (t) => { - validate({ WellDepthMeasure: 1, WellDepthUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellDepthMeasure"), true); -}); -test("Should accept WellDepthMeasure <= 0", async (t) => { - validate({ WellDepthMeasure: -10, WellDepthUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellDepthMeasure"), false); -}); - -test("Should reject WellOpenIntervalTopMeasure > 0", async (t) => { - validate({ WellOpenIntervalTopMeasure: 1, WellOpenIntervalTopUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalTopMeasure"), true); -}); -test("Should accept WellOpenIntervalTopMeasure <= 0", async (t) => { - validate({ WellOpenIntervalTopMeasure: -5, WellOpenIntervalTopUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalTopMeasure"), false); -}); - -test("Should reject WellOpenIntervalBottomMeasure > 0", async (t) => { - validate({ WellOpenIntervalBottomMeasure: 1, WellOpenIntervalBottomUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalBottomMeasure"), true); -}); -test("Should accept WellOpenIntervalBottomMeasure <= 0", async (t) => { - validate({ WellOpenIntervalBottomMeasure: -10, WellOpenIntervalBottomUnit: "m" }); - assert.equal(checkProperty(validate.errors, "maximum", "WellOpenIntervalBottomMeasure"), false); -}); - -test("Should reject MonitoringLocationVerticalAccuracyMeasure < 0", async (t) => { - validate({ MonitoringLocationVerticalAccuracyMeasure: -1, MonitoringLocationVerticalAccuracyUnit: "m" }); - assert.equal(checkProperty(validate.errors, "minimum", "MonitoringLocationVerticalAccuracyMeasure"), true); -}); -test("Should accept MonitoringLocationVerticalAccuracyMeasure >= 0", async (t) => { - validate({ MonitoringLocationVerticalAccuracyMeasure: 5, MonitoringLocationVerticalAccuracyUnit: "m" }); - assert.equal(checkProperty(validate.errors, "minimum", "MonitoringLocationVerticalAccuracyMeasure"), false); -}); - -test("Should reject ActivityDepthAltitudeReferencePointMeasure < 0", async (t) => { - validate({ ActivityDepthAltitudeReferencePointMeasure: -1, ActivityDepthAltitudeReferencePointUnit: "m" }); - assert.equal(checkProperty(validate.errors, "minimum", "ActivityDepthAltitudeReferencePointMeasure"), true); -}); -test("Should accept ActivityDepthAltitudeReferencePointMeasure >= 0", async (t) => { - validate({ ActivityDepthAltitudeReferencePointMeasure: 5, ActivityDepthAltitudeReferencePointUnit: "m" }); - assert.equal(checkProperty(validate.errors, "minimum", "ActivityDepthAltitudeReferencePointMeasure"), false); -}); +test('Should reject BoreholeDepthMeasure > 0', async (t) => { + validate({ BoreholeDepthMeasure: 1, BoreholeDepthUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'BoreholeDepthMeasure'), + true + ) +}) +test('Should accept BoreholeDepthMeasure <= 0', async (t) => { + validate({ BoreholeDepthMeasure: -10, BoreholeDepthUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'BoreholeDepthMeasure'), + false + ) +}) + +test('Should reject WellDepthMeasure > 0', async (t) => { + validate({ WellDepthMeasure: 1, WellDepthUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellDepthMeasure'), + true + ) +}) +test('Should accept WellDepthMeasure <= 0', async (t) => { + validate({ WellDepthMeasure: -10, WellDepthUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellDepthMeasure'), + false + ) +}) + +test('Should reject WellOpenIntervalTopMeasure > 0', async (t) => { + validate({ WellOpenIntervalTopMeasure: 1, WellOpenIntervalTopUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellOpenIntervalTopMeasure'), + true + ) +}) +test('Should accept WellOpenIntervalTopMeasure <= 0', async (t) => { + validate({ WellOpenIntervalTopMeasure: -5, WellOpenIntervalTopUnit: 'm' }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellOpenIntervalTopMeasure'), + false + ) +}) + +test('Should reject WellOpenIntervalBottomMeasure > 0', async (t) => { + validate({ + WellOpenIntervalBottomMeasure: 1, + WellOpenIntervalBottomUnit: 'm', + }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellOpenIntervalBottomMeasure'), + true + ) +}) +test('Should accept WellOpenIntervalBottomMeasure <= 0', async (t) => { + validate({ + WellOpenIntervalBottomMeasure: -10, + WellOpenIntervalBottomUnit: 'm', + }) + assert.equal( + checkProperty(validate.errors, 'maximum', 'WellOpenIntervalBottomMeasure'), + false + ) +}) + +test('Should reject MonitoringLocationVerticalAccuracyMeasure < 0', async (t) => { + validate({ + MonitoringLocationVerticalAccuracyMeasure: -1, + MonitoringLocationVerticalAccuracyUnit: 'm', + }) + assert.equal( + checkProperty( + validate.errors, + 'minimum', + 'MonitoringLocationVerticalAccuracyMeasure' + ), + true + ) +}) +test('Should accept MonitoringLocationVerticalAccuracyMeasure >= 0', async (t) => { + validate({ + MonitoringLocationVerticalAccuracyMeasure: 5, + MonitoringLocationVerticalAccuracyUnit: 'm', + }) + assert.equal( + checkProperty( + validate.errors, + 'minimum', + 'MonitoringLocationVerticalAccuracyMeasure' + ), + false + ) +}) + +test('Should reject ActivityDepthAltitudeReferencePointMeasure < 0', async (t) => { + validate({ + ActivityDepthAltitudeReferencePointMeasure: -1, + ActivityDepthAltitudeReferencePointUnit: 'm', + }) + assert.equal( + checkProperty( + validate.errors, + 'minimum', + 'ActivityDepthAltitudeReferencePointMeasure' + ), + true + ) +}) +test('Should accept ActivityDepthAltitudeReferencePointMeasure >= 0', async (t) => { + validate({ + ActivityDepthAltitudeReferencePointMeasure: 5, + ActivityDepthAltitudeReferencePointUnit: 'm', + }) + assert.equal( + checkProperty( + validate.errors, + 'minimum', + 'ActivityDepthAltitudeReferencePointMeasure' + ), + false + ) +}) // *** Length constraints — GW text fields *** // -test("Should reject AquiferCode > 10 chars", async (t) => { - validate({ AquiferCode: "12345678901" }); - assert.equal(checkProperty(validate.errors, "maxLength", "AquiferCode"), true); -}); -test("Should accept AquiferCode <= 10 chars", async (t) => { - validate({ AquiferCode: "1234567890" }); - assert.equal(checkProperty(validate.errors, "maxLength", "AquiferCode"), false); -}); - -test("Should reject WellID > 55 chars", async (t) => { - validate({ WellID: "x".repeat(56) }); - assert.equal(checkProperty(validate.errors, "maxLength", "WellID"), true); -}); -test("Should accept WellID <= 55 chars", async (t) => { - validate({ WellID: "x".repeat(55) }); - assert.equal(checkProperty(validate.errors, "maxLength", "WellID"), false); -}); - -test("Should reject SampleCollectionMethodName > 300 chars", async (t) => { - validate({ SampleCollectionMethodName: "x".repeat(301) }); - assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodName"), true); -}); -test("Should accept SampleCollectionMethodName <= 300 chars", async (t) => { - validate({ SampleCollectionMethodName: "x".repeat(300) }); - assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodName"), false); -}); - -test("Should reject SampleCollectionMethodID > 50 chars", async (t) => { - validate({ SampleCollectionMethodID: "x".repeat(51) }); - assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodID"), true); -}); -test("Should accept SampleCollectionMethodID <= 50 chars", async (t) => { - validate({ SampleCollectionMethodID: "x".repeat(50) }); - assert.equal(checkProperty(validate.errors, "maxLength", "SampleCollectionMethodID"), false); -}); - -test("Should reject EventID > 255 chars", async (t) => { - validate({ EventID: "x".repeat(256) }); - assert.equal(checkProperty(validate.errors, "maxLength", "EventID"), true); -}); -test("Should accept EventID <= 255 chars", async (t) => { - validate({ EventID: "x".repeat(255) }); - assert.equal(checkProperty(validate.errors, "maxLength", "EventID"), false); -}); +test('Should reject AquiferCode > 10 chars', async (t) => { + validate({ AquiferCode: '12345678901' }) + assert.equal(checkProperty(validate.errors, 'maxLength', 'AquiferCode'), true) +}) +test('Should accept AquiferCode <= 10 chars', async (t) => { + validate({ AquiferCode: '1234567890' }) + assert.equal( + checkProperty(validate.errors, 'maxLength', 'AquiferCode'), + false + ) +}) + +test('Should reject WellID > 55 chars', async (t) => { + validate({ WellID: 'x'.repeat(56) }) + assert.equal(checkProperty(validate.errors, 'maxLength', 'WellID'), true) +}) +test('Should accept WellID <= 55 chars', async (t) => { + validate({ WellID: 'x'.repeat(55) }) + assert.equal(checkProperty(validate.errors, 'maxLength', 'WellID'), false) +}) + +test('Should reject SampleCollectionMethodName > 300 chars', async (t) => { + validate({ SampleCollectionMethodName: 'x'.repeat(301) }) + assert.equal( + checkProperty(validate.errors, 'maxLength', 'SampleCollectionMethodName'), + true + ) +}) +test('Should accept SampleCollectionMethodName <= 300 chars', async (t) => { + validate({ SampleCollectionMethodName: 'x'.repeat(300) }) + assert.equal( + checkProperty(validate.errors, 'maxLength', 'SampleCollectionMethodName'), + false + ) +}) + +test('Should reject SampleCollectionMethodID > 50 chars', async (t) => { + validate({ SampleCollectionMethodID: 'x'.repeat(51) }) + assert.equal( + checkProperty(validate.errors, 'maxLength', 'SampleCollectionMethodID'), + true + ) +}) +test('Should accept SampleCollectionMethodID <= 50 chars', async (t) => { + validate({ SampleCollectionMethodID: 'x'.repeat(50) }) + assert.equal( + checkProperty(validate.errors, 'maxLength', 'SampleCollectionMethodID'), + false + ) +}) + +test('Should reject EventID > 255 chars', async (t) => { + validate({ EventID: 'x'.repeat(256) }) + assert.equal(checkProperty(validate.errors, 'maxLength', 'EventID'), true) +}) +test('Should accept EventID <= 255 chars', async (t) => { + validate({ EventID: 'x'.repeat(255) }) + assert.equal(checkProperty(validate.errors, 'maxLength', 'EventID'), false) +}) diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index ecc6fbe4..11f6dcb7 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -1,9 +1,9 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import validate from "../frontend/index.js"; +import { test } from 'node:test' +import assert from 'node:assert/strict' +import validate from '../frontend/index.js' const checkProperty = (errors, keyword, property) => { - if (errors === null) return false; + if (errors === null) return false for (const error of errors) { if (keyword === 'message' && error.message === property) { return true @@ -11,346 +11,436 @@ const checkProperty = (errors, keyword, property) => { const nested = checkProperty(error.params.errors, keyword, property) if (nested) return nested } - if (error.keyword !== keyword) continue; + if (error.keyword !== keyword) continue if ( - ["required", "dependencies"].includes(keyword) && + ['required', 'dependencies'].includes(keyword) && error.params.missingProperty === property ) { - return true; + return true } else if ( - keyword === "additionalProperties" && + keyword === 'additionalProperties' && error.params.additionalProperty === property ) { - return true; + return true } else if ( - keyword === "oneOf" && + keyword === 'oneOf' && error.params.passingSchemas.includes(property) ) { - return true; - } else if (keyword === "anyOf") return true; // anyOf branches surface as nested `required` errors inside errorMessage; query those directly via keyword="required" for property-specific assertions. - else if (keyword === "not" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "enum" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "minimum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'anyOf') + return true // anyOf branches surface as nested `required` errors inside errorMessage; query those directly via keyword="required" for property-specific assertions. + else if (keyword === 'not' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'enum' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'minimum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMinimum" && + keyword === 'exclusiveMinimum' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "maximum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'maximum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMaximum" && + keyword === 'exclusiveMaximum' && error.instancePath.includes(property) ) { - return true; + return true } else if ( - keyword === "false schema" && + keyword === 'false schema' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "pattern") return true; + return true + } else if (keyword === 'pattern') return true } - return false; -}; + return false +} // *** ActivityType-CTS-ActivityStartTime *** // -test("Should accept ActivityType without ActivityStartTime for non-CTS", async (t) => { - const valid = validate({ - ActivityType: "Field Msr/Obs", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); -}); +test('Should accept ActivityType without ActivityStartTime for non-CTS', async (t) => { + const valid = validate({ + ActivityType: 'Field Msr/Obs', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTime'), + false + ) +}) -test("Should accept ActivityType with ActivityStartTime for non-CTS", async (t) => { +test('Should accept ActivityType with ActivityStartTime for non-CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs", + ActivityType: 'Field Msr/Obs', ActivityStartTime: '13:15:00', - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTime'), + false + ) +}) -test("Should reject ActivityType Field Msr/Obs-Continuous Time Series without ActivityStartTime for CTS", async (t) => { +test('Should reject ActivityType Field Msr/Obs-Continuous Time Series without ActivityStartTime for CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), true); -}); + ActivityType: 'Field Msr/Obs-Continuous Time Series', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTime'), + true + ) +}) -test("Should accept ActivityType Field Msr/Obs-Continuous Time Series with ActivityStartTime for CTS", async (t) => { +test('Should accept ActivityType Field Msr/Obs-Continuous Time Series with ActivityStartTime for CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", + ActivityType: 'Field Msr/Obs-Continuous Time Series', ActivityStartTime: '13:15:00', - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTime"), false); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTime'), + false + ) +}) // *** ActivityType-ResultAnalyticalMethod *** // -test("Should reject ActivityType = Sample-*", async (t) => { +test('Should reject ActivityType = Sample-*', async (t) => { const valid = validate({ - ActivityType: "Sample-Other", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); + ActivityType: 'Sample-Other', + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - true, - ); + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - true, - ); -}); -test("Should reject ActivityType = Quality Control Sample-*", async (t) => { + true + ) +}) +test('Should reject ActivityType = Quality Control Sample-*', async (t) => { const valid = validate({ - ActivityType: "Quality Control Sample-Other", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), true); + ActivityType: 'Quality Control Sample-Other', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + true + ) assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - true, - ); + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - true, - ); -}); -test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodID & ResultAnalyticalMethodContext", async (t) => { - const valid = validate({ - ActivityType: "Sample-Other", - LaboratoryName: "A", - ResultAnalyticalMethodID: "0", - ResultAnalyticalMethodContext: "ENV", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - false, - ); + true + ) +}) +test('Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodID & ResultAnalyticalMethodContext', async (t) => { + const valid = validate({ + ActivityType: 'Sample-Other', + LaboratoryName: 'A', + ResultAnalyticalMethodID: '0', + ResultAnalyticalMethodContext: 'ENV', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - false, - ); -}); -test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalMethodID & ResultAnalyticalMethodContext", async (t) => { - const valid = validate({ - ActivityType: "Quality Control Sample-Other", - LaboratoryName: "A", - ResultAnalyticalMethodID: "0", - ResultAnalyticalMethodContext: "ENV", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - false, - ); + false + ) +}) +test('Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalMethodID & ResultAnalyticalMethodContext', async (t) => { + const valid = validate({ + ActivityType: 'Quality Control Sample-Other', + LaboratoryName: 'A', + ResultAnalyticalMethodID: '0', + ResultAnalyticalMethodContext: 'ENV', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - false, - ); -}); + false + ) +}) -test("Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodName", async (t) => { +test('Should accept ActivityType = Sample-* w/ ResultAnalyticalMethodName', async (t) => { const valid = validate({ - ActivityType: "Sample-Other", - LaboratoryName: "A", - ResultAnalyticalMethodName: "Unspecified", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); + ActivityType: 'Sample-Other', + LaboratoryName: 'A', + ResultAnalyticalMethodName: 'Unspecified', + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - false, - ); + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - false, - ); -}); -test("Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalMethodName", async (t) => { - const valid = validate({ - ActivityType: "Sample-Other", - LaboratoryName: "A", - ResultAnalyticalMethodName: "Unspecified", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "LaboratoryName"), false); - assert.equal( - checkProperty(validate.errors, "dependencies", "ResultAnalyticalMethodID"), - false, - ); + false + ) +}) +test('Should accept ActivityType = Quality Control Sample-* w/ ResultAnalyticalMethodName', async (t) => { + const valid = validate({ + ActivityType: 'Sample-Other', + LaboratoryName: 'A', + ResultAnalyticalMethodName: 'Unspecified', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'LaboratoryName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultAnalyticalMethodID'), + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodContext", + 'dependencies', + 'ResultAnalyticalMethodContext' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultAnalyticalMethodName", + 'dependencies', + 'ResultAnalyticalMethodName' ), - false, - ); -}); + false + ) +}) // *** CharacteristicName-MethodSpeciation *** // -test("Should accept CharacteristicName AND NOT MethodSpeciation", async (t) => { - const valid = validate({ - CharacteristicName: "Calcium", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); -}); -test("Should reject CharacteristicName Ammonia, un-ionized AND NOT MethodSpeciation", async (t) => { - const valid = validate({ - CharacteristicName: "Ammonia, un-ionized", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); - assert.equal(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); -}); -test("Should reject CharacteristicName Nitrogen-15 AND NOT MethodSpeciation", async (t) => { - const valid = validate({ - CharacteristicName: "Nitrogen-15", - LaboratoryName: "A", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); - assert.equal(checkProperty(validate.errors, "message", "error-CharacteristicName-MethodSpeciation"), true); -}); -test("Should accept CharacteristicName AND MethodSpeciation", async (t) => { - const valid = validate({ - CharacteristicName: "Nitrate", - MethodSpeciation: "as N", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); -}); +test('Should accept CharacteristicName AND NOT MethodSpeciation', async (t) => { + const valid = validate({ + CharacteristicName: 'Calcium', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + false + ) +}) +test('Should reject CharacteristicName Ammonia, un-ionized AND NOT MethodSpeciation', async (t) => { + const valid = validate({ + CharacteristicName: 'Ammonia, un-ionized', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + true + ) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-CharacteristicName-MethodSpeciation' + ), + true + ) +}) +test('Should reject CharacteristicName Nitrogen-15 AND NOT MethodSpeciation', async (t) => { + const valid = validate({ + CharacteristicName: 'Nitrogen-15', + LaboratoryName: 'A', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + true + ) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-CharacteristicName-MethodSpeciation' + ), + true + ) +}) +test('Should accept CharacteristicName AND MethodSpeciation', async (t) => { + const valid = validate({ + CharacteristicName: 'Nitrate', + MethodSpeciation: 'as N', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + false + ) +}) // *** CharacteristicName-Nutrient-ResultSampleFraction *** // -test("Should reject Nutrient CharacteristicName AND ResultSampleFraction", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Ammonia", - ActivityType: "", - ResultSampleFraction: "Total", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), true); -}); -test("Should accept Nutrient CharacteristicName AND filter ResultSampleFraction", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Ammonia", - ActivityType: "", - ResultSampleFraction: "Filtered", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); -}); -test("Should accept Nutrient Sediment", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water Sediment", - CharacteristicName: "Ammonia", - ActivityType: "", - ResultSampleFraction: "Total", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ResultSampleFraction"), false); -}); +test('Should reject Nutrient CharacteristicName AND ResultSampleFraction', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Ammonia', + ActivityType: '', + ResultSampleFraction: 'Total', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + false + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ResultSampleFraction'), + true + ) +}) +test('Should accept Nutrient CharacteristicName AND filter ResultSampleFraction', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Ammonia', + ActivityType: '', + ResultSampleFraction: 'Filtered', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + false + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ResultSampleFraction'), + false + ) +}) +test('Should accept Nutrient Sediment', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water Sediment', + CharacteristicName: 'Ammonia', + ActivityType: '', + ResultSampleFraction: 'Total', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + false + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ResultSampleFraction'), + false + ) +}) // test('Should accept Nutrient Sediment with no sample fraction', async (t) => { // let valid = validate({ // 'ActivityMediaName':'Surface Water Sediment', @@ -366,965 +456,1152 @@ test("Should accept Nutrient Sediment", async (t) => { // }) // *** CharacteristicName-ResultSampleFraction *** // -test("Should accept CharacteristicName AND NOT ResultSampleFraction", async (t) => { - const valid = validate({ - CharacteristicName: "Dissolved oxygen (DO)", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - false, - ); -}); -test("Should rejects CharacteristicName AND NOT ResultSampleFraction", async (t) => { - const valid = validate({ - CharacteristicName: "Silver", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - true, - ); -}); -test("Should accept CharacteristicName AND ResultSampleFraction", async (t) => { - const valid = validate({ - CharacteristicName: "Silver", - ResultSampleFraction: "Dissolved", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultSampleFraction"), - false, - ); -}); +test('Should accept CharacteristicName AND NOT ResultSampleFraction', async (t) => { + const valid = validate({ + CharacteristicName: 'Dissolved oxygen (DO)', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + false + ) +}) +test('Should rejects CharacteristicName AND NOT ResultSampleFraction', async (t) => { + const valid = validate({ + CharacteristicName: 'Silver', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + true + ) +}) +test('Should accept CharacteristicName AND ResultSampleFraction', async (t) => { + const valid = validate({ + CharacteristicName: 'Silver', + ResultSampleFraction: 'Dissolved', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultSampleFraction'), + false + ) +}) // *** CharacteristicName-StableIsotope-MethodSpeciation *** // -test("Should reject StableIsotope CharacteristicName, MethodSpeciation required", async (t) => { - const valid = validate({ - CharacteristicName: "Nitrogen-15", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), true); -}); -test("Should reject StableIsotope CharacteristicName", async (t) => { - const valid = validate({ - CharacteristicName: "Nitrogen-15", - MethodSpeciation: "as NH4", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "enum", "MethodSpeciation"), true); -}); -test("Should accept StableIsotope CharacteristicName", async (t) => { - const valid = validate({ - CharacteristicName: "Nitrogen-15", - MethodSpeciation: "of NH4", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "required", "MethodSpeciation"), false); -}); +test('Should reject StableIsotope CharacteristicName, MethodSpeciation required', async (t) => { + const valid = validate({ + CharacteristicName: 'Nitrogen-15', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + true + ) +}) +test('Should reject StableIsotope CharacteristicName', async (t) => { + const valid = validate({ + CharacteristicName: 'Nitrogen-15', + MethodSpeciation: 'as NH4', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal(checkProperty(validate.errors, 'enum', 'MethodSpeciation'), true) +}) +test('Should accept StableIsotope CharacteristicName', async (t) => { + const valid = validate({ + CharacteristicName: 'Nitrogen-15', + MethodSpeciation: 'of NH4', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'MethodSpeciation'), + false + ) +}) // *** ResultDetectionCondition-ResultValue *** // -test("Should reject NOT ResultValue AND NOT ResultDetectionCondition", async (t) => { - const valid = validate({}); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ResultValue"), true); +test('Should reject NOT ResultValue AND NOT ResultDetectionCondition', async (t) => { + const valid = validate({}) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'ResultValue'), true) assert.equal( - checkProperty(validate.errors, "required", "ResultDetectionCondition"), - true, - ); -}); -test("Should reject ResultValue AND ResultDetectionCondition", async (t) => { + checkProperty(validate.errors, 'required', 'ResultDetectionCondition'), + true + ) +}) +test('Should reject ResultValue AND ResultDetectionCondition', async (t) => { const valid = validate({ ResultValue: 1, - ResultDetectionCondition: "Not Reported", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "false schema", "ResultValue"), true); - assert.equal( - checkProperty(validate.errors, "false schema", "ResultDetectionCondition"), - true, - ); -}); + ResultDetectionCondition: 'Not Reported', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'false schema', 'ResultValue'), + true + ) + assert.equal( + checkProperty(validate.errors, 'false schema', 'ResultDetectionCondition'), + true + ) +}) -test("Should accept ResultValue OR ResultDetectionCondition", async (t) => { +test('Should accept ResultValue OR ResultDetectionCondition', async (t) => { let valid = validate({ ResultValue: 1, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ResultValue"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultDetectionCondition"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ResultValue"), false); - assert.equal( - checkProperty(validate.errors, "enum", "ResultDetectionCondition"), - false, - ); + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'ResultValue'), false) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultDetectionCondition'), + false + ) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultValue'), false) + assert.equal( + checkProperty(validate.errors, 'enum', 'ResultDetectionCondition'), + false + ) valid = validate({ - ResultDetectionCondition: "Not Reported", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ResultValue"), false); - assert.equal( - checkProperty(validate.errors, "required", "ResultDetectionCondition"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ResultValue"), false); - assert.equal( - checkProperty(validate.errors, "enum", "ResultDetectionCondition"), - false, - ); -}); + ResultDetectionCondition: 'Not Reported', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'ResultValue'), false) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultDetectionCondition'), + false + ) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultValue'), false) + assert.equal( + checkProperty(validate.errors, 'enum', 'ResultDetectionCondition'), + false + ) +}) // *** ResultDetectionCondition-ResultDetectionQuantitationLimit-above-below *** // -test("Should reject ResultDetectionCondition = Present Above Quantification Limit", async (t) => { +test('Should reject ResultDetectionCondition = Present Above Quantification Limit', async (t) => { const valid = validate({ - ResultDetectionCondition: "Present Above Quantification Limit", - }); - assert.equal(valid, false); + ResultDetectionCondition: 'Present Above Quantification Limit', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitType", + 'dependencies', + 'ResultDetectionQuantitationLimitType' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitMeasure", + 'dependencies', + 'ResultDetectionQuantitationLimitMeasure' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitUnit", + 'dependencies', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); -}); + true + ) +}) -test("Should reject ResultDetectionCondition = Present Below Quantification Limit", async (t) => { +test('Should reject ResultDetectionCondition = Present Below Quantification Limit', async (t) => { const valid = validate({ ResultValue: 1, - ResultDetectionCondition: "Present Below Quantification Limit", - }); - assert.equal(valid, false); + ResultDetectionCondition: 'Present Below Quantification Limit', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitType", + 'dependencies', + 'ResultDetectionQuantitationLimitType' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitMeasure", + 'dependencies', + 'ResultDetectionQuantitationLimitMeasure' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitUnit", + 'dependencies', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); -}); + true + ) +}) -test("Should accept ResultDetectionCondition", async (t) => { +test('Should accept ResultDetectionCondition', async (t) => { const valid = validate({ ResultValue: 1, - ResultDetectionCondition: "Present Below Quantification Limit", - ResultDetectionQuantitationLimitType: "A", + ResultDetectionCondition: 'Present Below Quantification Limit', + ResultDetectionQuantitationLimitType: 'A', ResultDetectionQuantitationLimitMeasure: 1, - ResultDetectionQuantitationLimitUnit: "mg/L", - }); - assert.equal(valid, false); + ResultDetectionQuantitationLimitUnit: 'mg/L', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitType", + 'dependencies', + 'ResultDetectionQuantitationLimitType' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitMeasure", + 'dependencies', + 'ResultDetectionQuantitationLimitMeasure' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitUnit", + 'dependencies', + 'ResultDetectionQuantitationLimitUnit' ), - false, - ); -}); + false + ) +}) // *** ResultDetectionCondition-ResultDetectionQuantitationLimit-not-detect *** // -test("Should reject ResultDetectionCondition = Not Detected", async (t) => { +test('Should reject ResultDetectionCondition = Not Detected', async (t) => { const valid = validate({ - ResultDetectionCondition: "Not Detected", - ResultDetectionQuantitationLimitType: "Sample Detection Limit", + ResultDetectionCondition: 'Not Detected', + ResultDetectionQuantitationLimitType: 'Sample Detection Limit', ResultDetectionQuantitationLimitMeasure: 0, - ResultDetectionQuantitationLimitUnit: "None", - }); - assert.equal(valid, false); + ResultDetectionQuantitationLimitUnit: 'None', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitType", + 'false schema', + 'ResultDetectionQuantitationLimitType' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitMeasure", + 'false schema', + 'ResultDetectionQuantitationLimitMeasure' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitUnit", + 'false schema', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); -}); + true + ) +}) -test("Should accept ResultDetectionCondition = Not Detected", async (t) => { +test('Should accept ResultDetectionCondition = Not Detected', async (t) => { const valid = validate({ - ResultDetectionCondition: "Not Detected", - }); - assert.equal(valid, false); + ResultDetectionCondition: 'Not Detected', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitType", + 'enum', + 'ResultDetectionQuantitationLimitType' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitMeasure", + 'enum', + 'ResultDetectionQuantitationLimitMeasure' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitUnit", + 'enum', + 'ResultDetectionQuantitationLimitUnit' ), - false, - ); -}); + false + ) +}) -test("Should reject ResultDetectionCondition = Detected Not Quantified", async (t) => { +test('Should reject ResultDetectionCondition = Detected Not Quantified', async (t) => { const valid = validate({ - ResultDetectionCondition: "Detected Not Quantified", - ResultDetectionQuantitationLimitType: "Sample Detection Limit", + ResultDetectionCondition: 'Detected Not Quantified', + ResultDetectionQuantitationLimitType: 'Sample Detection Limit', ResultDetectionQuantitationLimitMeasure: 0, - ResultDetectionQuantitationLimitUnit: "None", - }); - assert.equal(valid, false); + ResultDetectionQuantitationLimitUnit: 'None', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitType", + 'false schema', + 'ResultDetectionQuantitationLimitType' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitMeasure", + 'false schema', + 'ResultDetectionQuantitationLimitMeasure' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "false schema", - "ResultDetectionQuantitationLimitUnit", + 'false schema', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); -}); + true + ) +}) -test("Should accept ResultDetectionCondition = Detected Not Quantified", async (t) => { +test('Should accept ResultDetectionCondition = Detected Not Quantified', async (t) => { const valid = validate({ - ResultDetectionCondition: "Detected Not Quantified", - }); - assert.equal(valid, false); + ResultDetectionCondition: 'Detected Not Quantified', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitType", + 'enum', + 'ResultDetectionQuantitationLimitType' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitMeasure", + 'enum', + 'ResultDetectionQuantitationLimitMeasure' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitUnit", + 'enum', + 'ResultDetectionQuantitationLimitUnit' ), - false, - ); -}); + false + ) +}) // *** CSVInjection *** // -test("Should reject columns with potential csv injection", async (t) => { +test('Should reject columns with potential csv injection', async (t) => { const valid = validate({ - DatasetName: "=equals", - MonitoringLocationID: "+positive", - MonitoringLocationName: "-negative", - ResultComment: "@at ", + DatasetName: '=equals', + MonitoringLocationID: '+positive', + MonitoringLocationName: '-negative', + ResultComment: '@at ', ResultAnalyticalMethodID: ` carriage return`, - ResultAnalyticalMethodName: "\ncarriage return", - LaboratoryName: "\rcarriage return", - LaboratorySampleID: "\ttab", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), true); - assert.equal(checkProperty(validate.errors, "pattern", "MonitoringLocationID"), true); - assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationName"), - true, - ); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), true); - assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), - true, - ); - assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), - true, - ); - assert.equal(checkProperty(validate.errors, "pattern", "LaboratoryName"), true); - assert.equal(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), true); -}); + ResultAnalyticalMethodName: '\ncarriage return', + LaboratoryName: '\rcarriage return', + LaboratorySampleID: '\ttab', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), + true + ) + assert.equal(checkProperty(validate.errors, 'pattern', 'ResultComment'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodID'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratoryName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), + true + ) +}) -test("Should accept columns without potential csv injection", async (t) => { - const valid = validate({ - DatasetName: "~", - MonitoringLocationID: "1", - MonitoringLocationName: "&", - ResultComment: "$", - ResultAnalyticalMethodID: "#", - ResultAnalyticalMethodName: "|", - LaboratoryName: "_", - LaboratorySampleID: "*", - }); - assert.equal(valid, false); +test('Should accept columns without potential csv injection', async (t) => { + const valid = validate({ + DatasetName: '~', + MonitoringLocationID: '1', + MonitoringLocationName: '&', + ResultComment: '$', + ResultAnalyticalMethodID: '#', + ResultAnalyticalMethodName: '|', + LaboratoryName: '_', + LaboratorySampleID: '*', + }) + assert.equal(valid, false) // console.log(valid, JSON.stringify(validate.errors, null, 2)) - assert.equal(checkProperty(validate.errors, "pattern", "DatasetName"), false); - assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationID"), - false, - ); - assert.equal( - checkProperty(validate.errors, "pattern", "MonitoringLocationName"), - false, - ); - assert.equal(checkProperty(validate.errors, "pattern", "ResultComment"), false); - assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodID"), - false, - ); - assert.equal( - checkProperty(validate.errors, "pattern", "ResultAnalyticalMethodName"), - false, - ); - assert.equal(checkProperty(validate.errors, "pattern", "LaboratoryName"), false); - assert.equal(checkProperty(validate.errors, "pattern", "LaboratorySampleID"), false); -}); + assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), false) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultComment'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodID'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratoryName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), + false + ) +}) // *** ResultUnit-Salinity *** // -test("Should accept when Salinity and expected unit", async (t) => { +test('Should accept when Salinity and expected unit', async (t) => { const valid = validate({ - CharacteristicName: "Salinity", + CharacteristicName: 'Salinity', ResultValue: 0, - ResultUnit: "PSU", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "enum", "ResultUnit"), false); -}); -test("Should reject when Salinity and `ppt`", async (t) => { - const valid = validate({ - CharacteristicName: "Salinity", - ResultUnit: "ppt", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "enum", "ResultUnit"), true); -}); + ResultUnit: 'PSU', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), false) +}) +test('Should reject when Salinity and `ppt`', async (t) => { + const valid = validate({ + CharacteristicName: 'Salinity', + ResultUnit: 'ppt', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) +}) // *** ResultDetectionQuantitationLimitUnit-Salinity *** // -test("Should accept when Salinity and expected ResultDetectionQuantitationLimitUnit", async (t) => { +test('Should accept when Salinity and expected ResultDetectionQuantitationLimitUnit', async (t) => { const valid = validate({ - CharacteristicName: "Salinity", + CharacteristicName: 'Salinity', ResultDetectionQuantitationLimitMeasure: 0, - ResultDetectionQuantitationLimitUnit: "PSU", - }); - assert.equal(valid, false); + ResultDetectionQuantitationLimitUnit: 'PSU', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitUnit", + 'enum', + 'ResultDetectionQuantitationLimitUnit' ), - false, - ); -}); -test("Should reject when Salinity and ResultDetectionQuantitationLimitUnit=`ppt`", async (t) => { + false + ) +}) +test('Should reject when Salinity and ResultDetectionQuantitationLimitUnit=`ppt`', async (t) => { const valid = validate({ - CharacteristicName: "Salinity", + CharacteristicName: 'Salinity', ResultDetectionQuantitationLimitMeasure: 0, - ResultDetectionQuantitationLimitUnit: "ppt", - }); - assert.equal(valid, false); + ResultDetectionQuantitationLimitUnit: 'ppt', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "enum", - "ResultDetectionQuantitationLimitUnit", + 'enum', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); -}); + true + ) +}) // *** MonitoringLocationType-Well-WellUseType *** // -test("Should reject Well MonitoringLocationType without WellUseType", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); -}); +test('Should reject Well MonitoringLocationType without WellUseType', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'WellUseType'), true) +}) -test("Should reject Piezometer MonitoringLocationType without WellUseType", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Piezometer", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); -}); +test('Should reject Piezometer MonitoringLocationType without WellUseType', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Piezometer', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'WellUseType'), true) +}) -test("Should reject Dug Well MonitoringLocationType without WellUseType", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Dug Well", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellUseType"), true); -}); +test('Should reject Dug Well MonitoringLocationType without WellUseType', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Dug Well', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'WellUseType'), true) +}) -test("Should accept Well MonitoringLocationType with WellUseType", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - WellUseType: "Monitoring - Ambient", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellUseType"), false); -}); +test('Should accept Well MonitoringLocationType with WellUseType', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + WellUseType: 'Monitoring - Ambient', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'WellUseType'), false) +}) -test("Should accept non-well MonitoringLocationType without WellUseType", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellUseType"), false); -}); +test('Should accept non-well MonitoringLocationType without WellUseType', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', + }) + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'required', 'WellUseType'), false) +}) // *** MonitoringLocationType-Well-SampleCondition *** // -test("Should reject Well without SampleCondition for non-CTS", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - ActivityType: "Field Msr/Obs", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), true); -}); +test('Should reject Well without SampleCondition for non-CTS', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + ActivityType: 'Field Msr/Obs', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'SampleCondition'), + true + ) +}) -test("Should accept Well without SampleCondition for CTS", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - ActivityType: "Field Msr/Obs-Continuous Time Series", - ActivityStartTime: "13:15:00", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), false); -}); +test('Should accept Well without SampleCondition for CTS', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + ActivityType: 'Field Msr/Obs-Continuous Time Series', + ActivityStartTime: '13:15:00', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'SampleCondition'), + false + ) +}) -test("Should accept Well with SampleCondition for non-CTS", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - ActivityType: "Field Msr/Obs", - SampleCondition: "Static", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "SampleCondition"), false); -}); +test('Should accept Well with SampleCondition for non-CTS', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + ActivityType: 'Field Msr/Obs', + SampleCondition: 'Static', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'SampleCondition'), + false + ) +}) // *** ActivityDepthHeightMeasure-ActivityDepthAltitudeReferencePoint *** // -test("Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint", async (t) => { +test('Should reject ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", + ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: -5, - ActivityDepthHeightUnit: "m", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), - true, - ); -}); + ActivityDepthHeightUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'required', + 'ActivityDepthAltitudeReferencePoint' + ), + true + ) +}) -test("Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferencePoint", async (t) => { +test('Should accept ActivityDepthHeightMeasure with ActivityDepthAltitudeReferencePoint', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", + ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: -5, - ActivityDepthHeightUnit: "m", - ActivityDepthAltitudeReferencePoint: "Ground surface", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), - false, - ); -}); + ActivityDepthHeightUnit: 'm', + ActivityDepthAltitudeReferencePoint: 'Ground surface', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'required', + 'ActivityDepthAltitudeReferencePoint' + ), + false + ) +}) -test("Should accept ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint for non-GW media", async (t) => { +test('Should accept ActivityDepthHeightMeasure without ActivityDepthAltitudeReferencePoint for non-GW media', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", + ActivityMediaName: 'Surface Water', ActivityDepthHeightMeasure: -5, - ActivityDepthHeightUnit: "m", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), - false, - ); -}); + ActivityDepthHeightUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'required', + 'ActivityDepthAltitudeReferencePoint' + ), + false + ) +}) // *** CharacteristicName-WaterLevel-ActivityDepthAltitudeReferencePoint *** // -test("Should reject Water level CharacteristicName without ActivityDepthAltitudeReferencePoint", async (t) => { +test('Should reject Water level CharacteristicName without ActivityDepthAltitudeReferencePoint', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - CharacteristicName: "Water level in well, depth from a reference point", + ActivityMediaName: 'Groundwater', + CharacteristicName: 'Water level in well, depth from a reference point', ResultValue: -10, - ResultUnit: "m", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), - true, - ); -}); + ResultUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'required', + 'ActivityDepthAltitudeReferencePoint' + ), + true + ) +}) -test("Should accept Water level CharacteristicName with ActivityDepthAltitudeReferencePoint", async (t) => { +test('Should accept Water level CharacteristicName with ActivityDepthAltitudeReferencePoint', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - CharacteristicName: "Water level in well, depth from a reference point", + ActivityMediaName: 'Groundwater', + CharacteristicName: 'Water level in well, depth from a reference point', ResultValue: -10, - ResultUnit: "m", - ActivityDepthAltitudeReferencePoint: "Top of well casing", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "required", "ActivityDepthAltitudeReferencePoint"), - false, - ); -}); + ResultUnit: 'm', + ActivityDepthAltitudeReferencePoint: 'Top of well casing', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'required', + 'ActivityDepthAltitudeReferencePoint' + ), + false + ) +}) // *** CharacteristicName-Depth-ActivityDepthHeightMeasure *** // -test("Should reject ActivityDepthHeightMeasure when CharacteristicName measures depth", async (t) => { +test('Should reject ActivityDepthHeightMeasure when CharacteristicName measures depth', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Depth of water column", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Depth of water column', ActivityDepthHeightMeasure: 5, - ActivityDepthHeightUnit: "m", + ActivityDepthHeightUnit: 'm', ResultValue: 5, - ResultUnit: "m", - }); - assert.equal(valid, false); + ResultUnit: 'm', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "message", - "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + 'message', + 'error-CharacteristicName-Depth-ActivityDepthHeightMeasure' ), - true, - ); -}); + true + ) +}) -test("Should reject ActivityDepthHeightUnit when CharacteristicName measures depth", async (t) => { +test('Should reject ActivityDepthHeightUnit when CharacteristicName measures depth', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Water level", - ActivityDepthHeightUnit: "m", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Water level', + ActivityDepthHeightUnit: 'm', ResultValue: 1.2, - ResultUnit: "m", - }); - assert.equal(valid, false); + ResultUnit: 'm', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "message", - "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + 'message', + 'error-CharacteristicName-Depth-ActivityDepthHeightMeasure' ), - true, - ); -}); + true + ) +}) -test("Should accept depth CharacteristicName without ActivityDepthHeight fields", async (t) => { +test('Should accept depth CharacteristicName without ActivityDepthHeight fields', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Depth of water column", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Depth of water column', ResultValue: 5, - ResultUnit: "m", - }); + ResultUnit: 'm', + }) assert.equal( checkProperty( validate.errors, - "message", - "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + 'message', + 'error-CharacteristicName-Depth-ActivityDepthHeightMeasure' ), - false, - ); -}); + false + ) +}) -test("Should accept ActivityDepthHeightMeasure for a non-depth CharacteristicName", async (t) => { +test('Should accept ActivityDepthHeightMeasure for a non-depth CharacteristicName', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Temperature, water", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Temperature, water', ActivityDepthHeightMeasure: 5, - ActivityDepthHeightUnit: "m", + ActivityDepthHeightUnit: 'm', ResultValue: 12.3, - ResultUnit: "deg C", - }); + ResultUnit: 'deg C', + }) assert.equal( checkProperty( validate.errors, - "message", - "error-CharacteristicName-Depth-ActivityDepthHeightMeasure", + 'message', + 'error-CharacteristicName-Depth-ActivityDepthHeightMeasure' ), - false, - ); -}); + false + ) +}) // *** ActivityMediaName-ActivityDepthHeightMeasure-Maximum *** // test("Should reject ActivityDepthHeightMeasure > 0 for ActivityMediaName 'Surface Water'", async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Temperature, water", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Temperature, water', ActivityDepthHeightMeasure: 5, - ActivityDepthHeightUnit: "m", + ActivityDepthHeightUnit: 'm', ResultValue: 12.3, - ResultUnit: "deg C", - }); - assert.equal(valid, false); + ResultUnit: 'deg C', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "message", - "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + 'message', + 'error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum' ), - true, - ); -}); + true + ) +}) test("Should accept ActivityDepthHeightMeasure <= 0 for ActivityMediaName 'Surface Water'", async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Temperature, water", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Temperature, water', ActivityDepthHeightMeasure: -5, - ActivityDepthHeightUnit: "m", + ActivityDepthHeightUnit: 'm', ResultValue: 12.3, - ResultUnit: "deg C", - }); + ResultUnit: 'deg C', + }) assert.equal( checkProperty( validate.errors, - "message", - "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + 'message', + 'error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum' ), - false, - ); -}); + false + ) +}) test("Should accept ActivityMediaName 'Surface Water' without ActivityDepthHeightMeasure", async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - CharacteristicName: "Temperature, water", + ActivityMediaName: 'Surface Water', + CharacteristicName: 'Temperature, water', ResultValue: 12.3, - ResultUnit: "deg C", - }); + ResultUnit: 'deg C', + }) assert.equal( checkProperty( validate.errors, - "message", - "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + 'message', + 'error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum' ), - false, - ); -}); + false + ) +}) -test("Should not apply the ActivityDepthHeightMeasure maximum to Groundwater (covered by QC warning)", async (t) => { +test('Should not apply the ActivityDepthHeightMeasure maximum to Groundwater (covered by QC warning)', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - CharacteristicName: "Temperature, water", + ActivityMediaName: 'Groundwater', + CharacteristicName: 'Temperature, water', ActivityDepthHeightMeasure: 5, - ActivityDepthHeightUnit: "m", + ActivityDepthHeightUnit: 'm', ResultValue: 12.3, - ResultUnit: "deg C", - }); + ResultUnit: 'deg C', + }) assert.equal( checkProperty( validate.errors, - "message", - "error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum", + 'message', + 'error-ActivityMediaName-ActivityDepthHeightMeasure-Maximum' ), - false, - ); -}); + false + ) +}) // *** ActivityMediaName-Groundwater-DepthMeasure *** // -test("Should reject Groundwater ActivityMediaName without any depth measure", async (t) => { - const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - WellUseType: "Domestic", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), true); - assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), true); - assert.equal(checkProperty(validate.errors, "required", "WellOpenIntervalTopMeasure"), true); - assert.equal(checkProperty(validate.errors, "required", "WellOpenIntervalBottomMeasure"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), true); -}); +test('Should reject Groundwater ActivityMediaName without any depth measure', async (t) => { + const valid = validate({ + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'BoreholeDepthMeasure'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'WellDepthMeasure'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'WellOpenIntervalTopMeasure'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'WellOpenIntervalBottomMeasure'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityDepthHeightMeasure'), + true + ) +}) -test("Should accept Groundwater ActivityMediaName with WellDepthMeasure", async (t) => { +test('Should accept Groundwater ActivityMediaName with WellDepthMeasure', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - WellUseType: "Domestic", + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', WellDepthMeasure: -10, - WellDepthUnit: "m", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), false); - assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); -}); + WellDepthUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'WellDepthMeasure'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'BoreholeDepthMeasure'), + false + ) +}) -test("Should accept Groundwater ActivityMediaName with ActivityDepthHeightMeasure", async (t) => { +test('Should accept Groundwater ActivityMediaName with ActivityDepthHeightMeasure', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - WellUseType: "Domestic", + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + WellUseType: 'Domestic', ActivityDepthHeightMeasure: -5, - ActivityDepthHeightUnit: "m", - ActivityDepthAltitudeReferencePoint: "Ground surface", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), false); - assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); -}); + ActivityDepthHeightUnit: 'm', + ActivityDepthAltitudeReferencePoint: 'Ground surface', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityDepthHeightMeasure'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'BoreholeDepthMeasure'), + false + ) +}) -test("Should accept non-GW ActivityMediaName without any depth measure", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "BoreholeDepthMeasure"), false); - assert.equal(checkProperty(validate.errors, "required", "WellDepthMeasure"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityDepthHeightMeasure"), false); -}); +test('Should accept non-GW ActivityMediaName without any depth measure', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'BoreholeDepthMeasure'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'WellDepthMeasure'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityDepthHeightMeasure'), + false + ) +}) // *** GroundwaterFields-ActivityMediaName-Groundwater *** // -test("Should reject Surface Water with WellID (GW-only field)", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", - WellID: "well-123", - WellIDContext: "AB", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); +test('Should reject Surface Water with WellID (GW-only field)', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', + WellID: 'well-123', + WellIDContext: 'AB', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should reject Surface Water with AquiferCode (GW-only field)", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", - AquiferCode: "AQ-01", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); +test('Should reject Surface Water with AquiferCode (GW-only field)', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', + AquiferCode: 'AQ-01', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should reject Surface Water with WellDepthMeasure (GW-only field)", async (t) => { +test('Should reject Surface Water with WellDepthMeasure (GW-only field)', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', WellDepthMeasure: -10, - WellDepthUnit: "m", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); + WellDepthUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should reject GW field without ActivityMediaName at all", async (t) => { - const valid = validate({ - MonitoringLocationType: "Well", - WellID: "well-123", - WellIDContext: "AB", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); -}); +test('Should reject GW field without ActivityMediaName at all', async (t) => { + const valid = validate({ + MonitoringLocationType: 'Well', + WellID: 'well-123', + WellIDContext: 'AB', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + false + ) +}) -test("Should accept Groundwater with WellID and WellUseType (GW fields allowed)", async (t) => { +test('Should accept Groundwater with WellID and WellUseType (GW fields allowed)', async (t) => { const valid = validate({ - ActivityMediaName: "Groundwater", - MonitoringLocationType: "Well", - WellID: "well-123", - WellIDContext: "AB", - WellUseType: "Domestic", + ActivityMediaName: 'Groundwater', + MonitoringLocationType: 'Well', + WellID: 'well-123', + WellIDContext: 'AB', + WellUseType: 'Domestic', WellDepthMeasure: -10, - WellDepthUnit: "m", - SampleCondition: "Static, before pumping or purging", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); + WellDepthUnit: 'm', + SampleCondition: 'Static, before pumping or purging', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + false + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should accept Porewater with WellID and WellUseType (GW fields allowed)", async (t) => { +test('Should accept Porewater with WellID and WellUseType (GW fields allowed)', async (t) => { const valid = validate({ - ActivityMediaName: "Porewater", - MonitoringLocationType: "Well", - WellID: "well-123", - WellIDContext: "AB", - WellUseType: "Domestic", + ActivityMediaName: 'Porewater', + MonitoringLocationType: 'Well', + WellID: 'well-123', + WellIDContext: 'AB', + WellUseType: 'Domestic', WellDepthMeasure: -10, - WellDepthUnit: "m", - SampleCondition: "Static, before pumping or purging", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - false, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); + WellDepthUnit: 'm', + SampleCondition: 'Static, before pumping or purging', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + false + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should reject Surface Water with MonitoringLocationVerticalAccuracyMeasure (GW-only field)", async (t) => { +test('Should reject Surface Water with MonitoringLocationVerticalAccuracyMeasure (GW-only field)', async (t) => { const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', MonitoringLocationVerticalAccuracyMeasure: 0.5, - MonitoringLocationVerticalAccuracyUnit: "m", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); + MonitoringLocationVerticalAccuracyUnit: 'm', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) -test("Should reject Surface Water with SampleCollectionMethodID (GW-only field)", async (t) => { - const valid = validate({ - ActivityMediaName: "Surface Water", - MonitoringLocationType: "River/Stream", - SampleCollectionMethodID: "method-1", - SampleCollectionMethodContext: "USEPA", - SampleCollectionMethodName: "Test method", - }); - assert.equal(valid, false); - assert.equal( - checkProperty(validate.errors, "message", "error-GroundwaterFields-ActivityMediaName-Groundwater"), - true, - ); - assert.equal(checkProperty(validate.errors, "enum", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), false); -}); +test('Should reject Surface Water with SampleCollectionMethodID (GW-only field)', async (t) => { + const valid = validate({ + ActivityMediaName: 'Surface Water', + MonitoringLocationType: 'River/Stream', + SampleCollectionMethodID: 'method-1', + SampleCollectionMethodContext: 'USEPA', + SampleCollectionMethodName: 'Test method', + }) + assert.equal(valid, false) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'error-GroundwaterFields-ActivityMediaName-Groundwater' + ), + true + ) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + false + ) +}) // *** one off *** // /*test('one off', async (t) => { diff --git a/schemas/data/test/messages.js b/schemas/data/test/messages.js index 4e165562..fe17e0bd 100644 --- a/schemas/data/test/messages.js +++ b/schemas/data/test/messages.js @@ -1,5 +1,5 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; +import { test } from 'node:test' +import assert from 'node:assert/strict' import en from '../locales/en-CA.js' import validate from '../quality-control/index.js' @@ -7,7 +7,7 @@ test('Should transform error message', async (t) => { const valid = validate({ ActivityType: 'Field Msr/Obs', CharacteristicName: 'Temperature, water', - ResultSampleFraction: 'Filtered' + ResultSampleFraction: 'Filtered', }) en(validate.errors) assert.equal(valid, false) @@ -17,31 +17,46 @@ test('Should transform enum error message', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultValue: 7, - ResultUnit: 'mg/L' + ResultUnit: 'mg/L', }) assert.equal(valid, false) en(validate.errors) - assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) + assert.equal( + validate.errors.every( + (e) => typeof e.message === 'string' && e.message.length > 0 + ), + true + ) }) test('Should transform minimum error message', async (t) => { const valid = validate({ ResultValue: -1, - ResultUnit: 'mg/l' + ResultUnit: 'mg/l', }) assert.equal(valid, false) en(validate.errors) - assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) + assert.equal( + validate.errors.every( + (e) => typeof e.message === 'string' && e.message.length > 0 + ), + true + ) }) test('Should transform pattern error message', async (t) => { const valid = validate({ ActivityStartDate: '2020-01-01', - ActivityStartTime: '9:30:00' + ActivityStartTime: '9:30:00', }) assert.equal(valid, false) en(validate.errors) - assert.equal(validate.errors.every(e => typeof e.message === 'string' && e.message.length > 0), true) + assert.equal( + validate.errors.every( + (e) => typeof e.message === 'string' && e.message.length > 0 + ), + true + ) }) test('Should handle null errors gracefully', async (t) => { diff --git a/schemas/data/test/primary.js b/schemas/data/test/primary.js index 98770b31..929bf514 100644 --- a/schemas/data/test/primary.js +++ b/schemas/data/test/primary.js @@ -1,167 +1,182 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import primary from "../primary/index.json" with { type: "json" }; -import frontend from "../frontend/index.json" with { type: "json" }; -import extract from "../extract/index.json" with { type: "json" }; -import backend from "../backend/index.json" with { type: "json" }; -import qualityControl from "../quality-control/index.json" with { type: "json" }; - -const flavours = { primary, frontend, extract, backend, "quality-control": qualityControl }; -const main = primary.allOf[0]; +import { test } from 'node:test' +import assert from 'node:assert/strict' +import primary from '../primary/index.json' with { type: 'json' } +import frontend from '../frontend/index.json' with { type: 'json' } +import extract from '../extract/index.json' with { type: 'json' } +import backend from '../backend/index.json' with { type: 'json' } +import qualityControl from '../quality-control/index.json' with { type: 'json' } + +const flavours = { + primary, + frontend, + extract, + backend, + 'quality-control': qualityControl, +} +const main = primary.allOf[0] // *** $id contract *** // -test("primary $id matches the published URL", () => { - assert.equal(primary.$id, "https://datastream.org/schema/data/primary.json"); -}); +test('primary $id matches the published URL', () => { + assert.equal(primary.$id, 'https://datastream.org/schema/data/primary.json') +}) -test("all flavour $ids match their filesystem paths", () => { +test('all flavour $ids match their filesystem paths', () => { for (const [flavour, schema] of Object.entries(flavours)) { assert.equal( schema.$id, `https://datastream.org/schema/data/${flavour}.json`, `${flavour}/index.json` - ); + ) } -}); +}) // *** structural integrity *** // -test("primary has no unresolved $refs (fully dereferenced bundle)", () => { - assert.equal(JSON.stringify(primary).includes('"$ref":'), false); -}); +test('primary has no unresolved $refs (fully dereferenced bundle)', () => { + assert.equal(JSON.stringify(primary).includes('"$ref":'), false) +}) -test("primary has no transform keyword (strict, no coercion)", () => { - assert.equal(JSON.stringify(primary).includes('"transform":'), false); -}); +test('primary has no transform keyword (strict, no coercion)', () => { + assert.equal(JSON.stringify(primary).includes('"transform":'), false) +}) // *** required fields contract *** // -test("primary required fields match the documented contract", () => { +test('primary required fields match the documented contract', () => { assert.deepEqual(main.required.sort(), [ - "ActivityMediaName", - "ActivityStartDate", - "ActivityType", - "CharacteristicName", - "DatasetName", - "MonitoringLocationHorizontalCoordinateReferenceSystem", - "MonitoringLocationID", - "MonitoringLocationLatitude", - "MonitoringLocationLongitude", - "MonitoringLocationName", - "MonitoringLocationType", - "ResultValueType", - ]); -}); + 'ActivityMediaName', + 'ActivityStartDate', + 'ActivityType', + 'CharacteristicName', + 'DatasetName', + 'MonitoringLocationHorizontalCoordinateReferenceSystem', + 'MonitoringLocationID', + 'MonitoringLocationLatitude', + 'MonitoringLocationLongitude', + 'MonitoringLocationName', + 'MonitoringLocationType', + 'ResultValueType', + ]) +}) // *** GW field constraints (pinned) *** // -test("AquiferCode is text with maxLength 10", () => { - const f = main.properties.AquiferCode; - assert.equal(f.type, "string"); - assert.equal(f.maxLength, 10); -}); - -test("WellID is text with maxLength 55", () => { - const f = main.properties.WellID; - assert.equal(f.type, "string"); - assert.equal(f.maxLength, 55); -}); - -test("SampleCollectionMethodID has maxLength 50", () => { - assert.equal(main.properties.SampleCollectionMethodID.maxLength, 50); -}); - -test("SampleCollectionMethodName has maxLength 300", () => { - assert.equal(main.properties.SampleCollectionMethodName.maxLength, 300); -}); - -test("BoreholeDepthMeasure has maximum 0", () => { - assert.equal(main.properties.BoreholeDepthMeasure.maximum, 0); -}); - -test("WellDepthMeasure has maximum 0", () => { - assert.equal(main.properties.WellDepthMeasure.maximum, 0); -}); - -test("WellOpenIntervalTopMeasure has maximum 0", () => { - assert.equal(main.properties.WellOpenIntervalTopMeasure.maximum, 0); -}); - -test("WellOpenIntervalBottomMeasure has maximum 0", () => { - assert.equal(main.properties.WellOpenIntervalBottomMeasure.maximum, 0); -}); - -test("MonitoringLocationVerticalAccuracyMeasure has minimum 0", () => { - assert.equal(main.properties.MonitoringLocationVerticalAccuracyMeasure.minimum, 0); -}); - -test("ActivityDepthAltitudeReferencePointMeasure has minimum 0", () => { - assert.equal(main.properties.ActivityDepthAltitudeReferencePointMeasure.minimum, 0); -}); +test('AquiferCode is text with maxLength 10', () => { + const f = main.properties.AquiferCode + assert.equal(f.type, 'string') + assert.equal(f.maxLength, 10) +}) + +test('WellID is text with maxLength 55', () => { + const f = main.properties.WellID + assert.equal(f.type, 'string') + assert.equal(f.maxLength, 55) +}) + +test('SampleCollectionMethodID has maxLength 50', () => { + assert.equal(main.properties.SampleCollectionMethodID.maxLength, 50) +}) + +test('SampleCollectionMethodName has maxLength 300', () => { + assert.equal(main.properties.SampleCollectionMethodName.maxLength, 300) +}) + +test('BoreholeDepthMeasure has maximum 0', () => { + assert.equal(main.properties.BoreholeDepthMeasure.maximum, 0) +}) + +test('WellDepthMeasure has maximum 0', () => { + assert.equal(main.properties.WellDepthMeasure.maximum, 0) +}) + +test('WellOpenIntervalTopMeasure has maximum 0', () => { + assert.equal(main.properties.WellOpenIntervalTopMeasure.maximum, 0) +}) + +test('WellOpenIntervalBottomMeasure has maximum 0', () => { + assert.equal(main.properties.WellOpenIntervalBottomMeasure.maximum, 0) +}) + +test('MonitoringLocationVerticalAccuracyMeasure has minimum 0', () => { + assert.equal( + main.properties.MonitoringLocationVerticalAccuracyMeasure.minimum, + 0 + ) +}) + +test('ActivityDepthAltitudeReferencePointMeasure has minimum 0', () => { + assert.equal( + main.properties.ActivityDepthAltitudeReferencePointMeasure.minimum, + 0 + ) +}) // *** non-GW field constraints (pinned) *** // -test("MonitoringLocationLatitude bounded to 0..90 (northern hemisphere)", () => { - const f = main.properties.MonitoringLocationLatitude; - assert.equal(f.minimum, 0); - assert.equal(f.maximum, 90); -}); - -test("MonitoringLocationLongitude bounded to -180..180", () => { - const f = main.properties.MonitoringLocationLongitude; - assert.equal(f.minimum, -180); - assert.equal(f.maximum, 180); -}); - -test("MonitoringLocationHorizontalAccuracyMeasure has minimum 0", () => { - assert.equal(main.properties.MonitoringLocationHorizontalAccuracyMeasure.minimum, 0); -}); - -test("DatasetName has length 1..512", () => { - const f = main.properties.DatasetName; - assert.equal(f.minLength, 1); - assert.equal(f.maxLength, 512); -}); - -test("MonitoringLocationID has length 1..55", () => { - const f = main.properties.MonitoringLocationID; - assert.equal(f.minLength, 1); - assert.equal(f.maxLength, 55); -}); - -test("MonitoringLocationName has length 1..255", () => { - const f = main.properties.MonitoringLocationName; - assert.equal(f.minLength, 1); - assert.equal(f.maxLength, 255); -}); - -test("LaboratoryName has maxLength 100", () => { - assert.equal(main.properties.LaboratoryName.maxLength, 100); -}); - -test("LaboratorySampleID has maxLength 60", () => { - assert.equal(main.properties.LaboratorySampleID.maxLength, 60); -}); - -test("EventID is text with maxLength 255", () => { - const f = main.properties.EventID; - assert.equal(f.type, "string"); - assert.equal(f.maxLength, 255); -}); - -test("ResultComment has maxLength 4000", () => { - assert.equal(main.properties.ResultComment.maxLength, 4000); -}); - -test("ResultAnalyticalMethodID has maxLength 50", () => { - assert.equal(main.properties.ResultAnalyticalMethodID.maxLength, 50); -}); - -test("ResultAnalyticalMethodName has maxLength 300", () => { - assert.equal(main.properties.ResultAnalyticalMethodName.maxLength, 300); -}); +test('MonitoringLocationLatitude bounded to 0..90 (northern hemisphere)', () => { + const f = main.properties.MonitoringLocationLatitude + assert.equal(f.minimum, 0) + assert.equal(f.maximum, 90) +}) + +test('MonitoringLocationLongitude bounded to -180..180', () => { + const f = main.properties.MonitoringLocationLongitude + assert.equal(f.minimum, -180) + assert.equal(f.maximum, 180) +}) + +test('MonitoringLocationHorizontalAccuracyMeasure has minimum 0', () => { + assert.equal( + main.properties.MonitoringLocationHorizontalAccuracyMeasure.minimum, + 0 + ) +}) + +test('DatasetName has length 1..512', () => { + const f = main.properties.DatasetName + assert.equal(f.minLength, 1) + assert.equal(f.maxLength, 512) +}) + +test('MonitoringLocationID has length 1..55', () => { + const f = main.properties.MonitoringLocationID + assert.equal(f.minLength, 1) + assert.equal(f.maxLength, 55) +}) + +test('MonitoringLocationName has length 1..255', () => { + const f = main.properties.MonitoringLocationName + assert.equal(f.minLength, 1) + assert.equal(f.maxLength, 255) +}) + +test('LaboratoryName has maxLength 100', () => { + assert.equal(main.properties.LaboratoryName.maxLength, 100) +}) + +test('LaboratorySampleID has maxLength 60', () => { + assert.equal(main.properties.LaboratorySampleID.maxLength, 60) +}) + +test('EventID is text with maxLength 255', () => { + const f = main.properties.EventID + assert.equal(f.type, 'string') + assert.equal(f.maxLength, 255) +}) + +test('ResultComment has maxLength 4000', () => { + assert.equal(main.properties.ResultComment.maxLength, 4000) +}) + +test('ResultAnalyticalMethodID has maxLength 50', () => { + assert.equal(main.properties.ResultAnalyticalMethodID.maxLength, 50) +}) + +test('ResultAnalyticalMethodName has maxLength 300', () => { + assert.equal(main.properties.ResultAnalyticalMethodName.maxLength, 300) +}) // *** cross-flavour consistency *** // -test("primary, frontend, extract, and backend define the same property names", () => { - const pProps = Object.keys(main.properties).sort(); - for (const flavour of ["frontend", "extract", "backend"]) { - const props = Object.keys(flavours[flavour].allOf[0].properties).sort(); - assert.deepEqual(props, pProps, `${flavour} differs from primary`); +test('primary, frontend, extract, and backend define the same property names', () => { + const pProps = Object.keys(main.properties).sort() + for (const flavour of ['frontend', 'extract', 'backend']) { + const props = Object.keys(flavours[flavour].allOf[0].properties).sort() + assert.deepEqual(props, pProps, `${flavour} differs from primary`) } -}); \ No newline at end of file +}) diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index e3b62580..9759b61b 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -1,5 +1,5 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; +import { test } from 'node:test' +import assert from 'node:assert/strict' import validate from '../quality-control/index.js' const defaultObject = { @@ -33,7 +33,7 @@ const defaultObject = { LaboratorySampleID: '101010011110', AnalysisStartDate: '2018-02-23', AnalysisStartTime: '13:15:00', - AnalysisStartTimeZone: '-06:00' + AnalysisStartTimeZone: '-06:00', } const checkProperty = (errors, keyword, property) => { @@ -85,7 +85,8 @@ const checkProperty = (errors, keyword, property) => { error.instancePath.includes(property) ) { return true - } else if (keyword === 'pattern' && error.instancePath.includes(property)) return true + } else if (keyword === 'pattern' && error.instancePath.includes(property)) + return true } return false } @@ -122,10 +123,13 @@ test('Should accept with undefined values', async (t) => { test('Should reject improperly formatted time', async (t) => { const valid = validate({ ActivityStartDate: '2020-01-01', - ActivityStartTime: '9:30:00' + ActivityStartTime: '9:30:00', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'ActivityStartTime'), + true + ) }) // *** ActivityMediaName-ActivityDepthHeightMeasure-Maximum *** // @@ -135,7 +139,7 @@ test('Should warn ActivityDepthHeightMeasure > 0 when ActivityMediaName is Porew const valid = validate({ ActivityMediaName: 'Porewater', ActivityDepthHeightMeasure: 1, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, false) assert.equal( @@ -147,13 +151,13 @@ test('Should accept ActivityDepthHeightMeasure = 0 when ActivityMediaName is Gro const valid = validate({ ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: 0, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, true) }) test('Should accept when ActivityDepthHeightMeasure is not set and when ActivityMediaName is Groundwater', async (t) => { const valid = validate({ - ActivityMediaName: 'Groundwater' + ActivityMediaName: 'Groundwater', }) assert.equal(valid, true) }) @@ -161,7 +165,7 @@ test('Should NOT raise a QC warning for the Surface Water medium (enforced as a const valid = validate({ ActivityMediaName: 'Surface Water', ActivityDepthHeightMeasure: 1, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, true) assert.equal( @@ -173,7 +177,7 @@ test('Should reject ActivityDepthHeightMeasure > 0 when ActivityMediaName is Gro const valid = validate({ ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: 1, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, false) assert.equal( @@ -185,7 +189,7 @@ test('Should accept ActivityDepthHeightMeasure < 0 when ActivityMediaName is Gro const valid = validate({ ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: -1, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, true) }) @@ -194,7 +198,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is oth const valid = validate({ ActivityMediaName: 'Ambient Air', ActivityDepthHeightMeasure: 1, - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, true) }) @@ -202,7 +206,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when ActivityMediaName is oth test('Should ignore ActivityDepthHeightMeasure > 0 when measure is not defined', async (t) => { const valid = validate({ ActivityMediaName: 'Groundwater', - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, true) assert.equal( @@ -214,7 +218,7 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when measure is a string', as const valid = validate({ ActivityMediaName: 'Groundwater', ActivityDepthHeightMeasure: 'unknown', - ActivityDepthHeightUnit: 'm' + ActivityDepthHeightUnit: 'm', }) assert.equal(valid, false) assert.equal( @@ -224,84 +228,121 @@ test('Should ignore ActivityDepthHeightMeasure > 0 when measure is a string', as }) // ActivityType-CTS-ActivityStartTimeZone -test("Should accept ActivityType without ActivityStartTimeZone for non-CTS", async (t) => { +test('Should accept ActivityType without ActivityStartTimeZone for non-CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs", - }); - assert.equal(valid, true); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); -}); + ActivityType: 'Field Msr/Obs', + }) + assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTimeZone'), + false + ) +}) -test("Should accept ActivityType with ActivityStartTimeZone for non-CTS", async (t) => { +test('Should accept ActivityType with ActivityStartTimeZone for non-CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs", + ActivityType: 'Field Msr/Obs', ActivityStartTime: '13:15:00', ActivityStartTimeZone: '-03:00', - }); - assert.equal(valid, true); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); -}); + }) + assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTimeZone'), + false + ) +}) -test("Should reject ActivityType without ActivityStartTimeZone for CTS", async (t) => { +test('Should reject ActivityType without ActivityStartTimeZone for CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", + ActivityType: 'Field Msr/Obs-Continuous Time Series', ActivityStartDate: '2025-01-01', - ActivityStartTime: '13:15:00' - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), true); -}); + ActivityStartTime: '13:15:00', + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTimeZone'), + true + ) +}) -test("Should accept ActivityType with ActivityStartTimeZone for CTS", async (t) => { +test('Should accept ActivityType with ActivityStartTimeZone for CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", + ActivityType: 'Field Msr/Obs-Continuous Time Series', ActivityStartTime: '13:15:00', ActivityStartTimeZone: '-06:00', - }); - assert.equal(valid, true); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); -}); + }) + assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTimeZone'), + false + ) +}) // ActivityType-CTS-ActivityStartTimeZone-UTC -test("Should accept ActivityType with UTC ActivityStartTimeZone for non-CTS", async (t) => { +test('Should accept ActivityType with UTC ActivityStartTimeZone for non-CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs", + ActivityType: 'Field Msr/Obs', ActivityStartTime: '13:15:00', ActivityStartTimeZone: '+00:00', - }); - assert.equal(valid, true); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartTimeZone"), false); -}); + }) + assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartTimeZone'), + false + ) +}) -test("Should accept ActivityType-CTS-ActivityStartTimeZone-UTC without ActivityStartTimeZone", async (t) => { +test('Should accept ActivityType-CTS-ActivityStartTimeZone-UTC without ActivityStartTimeZone', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", - ActivityStartDate: '2025-01-01' - }); + ActivityType: 'Field Msr/Obs-Continuous Time Series', + ActivityStartDate: '2025-01-01', + }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, "message", "qc-ActivityType-CTS-ActivityStartTimeZone-UTC"), false); -}); + assert.equal( + checkProperty( + validate.errors, + 'message', + 'qc-ActivityType-CTS-ActivityStartTimeZone-UTC' + ), + false + ) +}) -test("Should reject ActivityType with UTC ActivityStartTimeZone for CTS", async (t) => { +test('Should reject ActivityType with UTC ActivityStartTimeZone for CTS', async (t) => { const valid = validate({ - ActivityType: "Field Msr/Obs-Continuous Time Series", + ActivityType: 'Field Msr/Obs-Continuous Time Series', ActivityStartTime: '13:15:00', ActivityStartTimeZone: '+00:00', - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "not", "ActivityStartTimeZone"), true); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'not', 'ActivityStartTimeZone'), + true + ) +}) // *** ActivityType-ResultSampleFraction *** // test('Should reject ResultSampleFraction when ActivityType is set to field', async (t) => { const valid = validate({ ActivityType: 'Field Msr/Obs', CharacteristicName: 'Temperature, water', - ResultSampleFraction: 'Filtered' + ResultSampleFraction: 'Filtered', }) assert.equal(valid, false) assert.equal( @@ -314,7 +355,7 @@ test('Should accept ResultSampleFraction when ActivityType is set to field and C const valid = validate({ ActivityType: 'Field Msr/Obs', CharacteristicName: 'Ammonia, un-ionized', - ResultSampleFraction: 'Filtered' + ResultSampleFraction: 'Filtered', }) assert.equal(valid, true) }) @@ -322,7 +363,7 @@ test('Should accept ResultSampleFraction when ActivityType is set to field and C test('Should accept empty ResultSampleFraction when ActivityType is set to field', async (t) => { const valid = validate({ ActivityType: 'Field Msr/Obs', - CharacteristicName: 'Temperature, water' + CharacteristicName: 'Temperature, water', }) assert.equal(valid, true) }) @@ -331,17 +372,20 @@ test('Should accept empty ResultSampleFraction when ActivityType is set to field test('Should accept CharacteristicName-ActivityMediaName-AmbientAir', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, air', - ActivityMediaName: 'Ambient Air' + ActivityMediaName: 'Ambient Air', }) assert.equal(valid, true) }) test('Should reject CharacteristicName-ActivityMediaName-AmbientAir', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, air', - ActivityMediaName: 'Stormwater' + ActivityMediaName: 'Stormwater', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) }) // *** CharacteristicName-ActivityType-Surrogate *** // @@ -349,8 +393,8 @@ test('Should accept CharacteristicName-ActivityType-Surrogate & ResultUnit', asy const valid = validate({ CharacteristicName: '2-Methylnaphthalene-D10', ResultValue: '10', - ResultUnit: "%", - ActivityType: 'Quality Control Sample-Lab Surrogate Control Standard' + ResultUnit: '%', + ActivityType: 'Quality Control Sample-Lab Surrogate Control Standard', }) assert.equal(valid, true) }) @@ -358,8 +402,8 @@ test('Should reject CharacteristicName-ActivityType-Surrogate & ResultUnit', asy const valid = validate({ CharacteristicName: '2-Methylnaphthalene-D10', ResultValue: '10', - ResultUnit: "%", - ActivityType: 'Field Msr/Obs-Portable Data Logger' + ResultUnit: '%', + ActivityType: 'Field Msr/Obs-Portable Data Logger', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) @@ -369,8 +413,9 @@ test('Should accept CharacteristicName-ActivityType-Surrogate & ResultDetectionQ const valid = validate({ CharacteristicName: 'Indeno[1,2,3-cd]pyrene-d12', ResultDetectionQuantitationLimitMeasure: '10', - ResultDetectionQuantitationLimitUnit: "%", - ActivityType: 'Quality Control Sample-Lab Surrogate Control Standard Duplicate' + ResultDetectionQuantitationLimitUnit: '%', + ActivityType: + 'Quality Control Sample-Lab Surrogate Control Standard Duplicate', }) assert.equal(valid, true) }) @@ -378,8 +423,8 @@ test('Should reject CharacteristicName-ActivityType-Surrogate & ResultDetectionQ const valid = validate({ CharacteristicName: 'Indeno[1,2,3-cd]pyrene-d12', ResultDetectionQuantitationLimitMeasure: '10', - ResultDetectionQuantitationLimitUnit: "%", - ActivityType: 'Quality Control Sample-Lab Surrogate Method Blank' + ResultDetectionQuantitationLimitUnit: '%', + ActivityType: 'Quality Control Sample-Lab Surrogate Method Blank', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) @@ -388,25 +433,31 @@ test('Should reject CharacteristicName-ActivityType-Surrogate & ResultDetectionQ // *** CharacteristicName-Ammonia *** // test('Should accept CharacteristicName Ammonia, un-ionized', async (t) => { const valid = validate({ - CharacteristicName: 'Ammonia, un-ionized' + CharacteristicName: 'Ammonia, un-ionized', }) assert.equal(valid, true) }) test('Should reject CharacteristicName-Ammonia', async (t) => { const valid = validate({ - CharacteristicName: 'Ammonia' + CharacteristicName: 'Ammonia', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'not', 'CharacteristicName'), true) - assert.equal(checkProperty(validate.errors, 'message', 'qc-CharacteristicName-Ammonia'), true) + assert.equal( + checkProperty(validate.errors, 'not', 'CharacteristicName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'message', 'qc-CharacteristicName-Ammonia'), + true + ) }) // *** CharacteristicName-Metal-ResultSampleFraction *** // test('Should accept CharacteristicName-Metal-ResultSampleFraction', async (t) => { const valid = validate({ CharacteristicName: 'Iron', - ResultSampleFraction: 'Total' + ResultSampleFraction: 'Total', }) assert.equal(valid, true) }) @@ -414,7 +465,7 @@ test('Should accept CharacteristicName-Metal-ResultSampleFraction', async (t) => test('Should accept CharacteristicName-Metal-ResultSampleFraction when undefined', async (t) => { const valid = validate({ CharacteristicName: 'Europium', - ResultSampleFraction: undefined + ResultSampleFraction: undefined, }) assert.equal(valid, true) }) @@ -422,94 +473,123 @@ test('Should accept CharacteristicName-Metal-ResultSampleFraction when undefined test('Should reject CharacteristicName-Metal-ResultSampleFraction', async (t) => { const valid = validate({ CharacteristicName: 'Iron', - ResultSampleFraction: 'Total Recoverable' + ResultSampleFraction: 'Total Recoverable', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'not', 'ResultSampleFraction'), true) + assert.equal( + checkProperty(validate.errors, 'not', 'ResultSampleFraction'), + true + ) }) // *** CharacteristicName-MethodSpeciation *** // test('Should accept CharacteristicName-MethodSpeciation when its not expected', async (t) => { const valid = validate({ CharacteristicName: 'Ammonia and ammonium', - MethodSpeciation: 'as N' + MethodSpeciation: 'as N', }) assert.equal(valid, true) }) test('Should reject MethodSpeciation when its not expected', async (t) => { const valid = validate({ CharacteristicName: 'pH', - MethodSpeciation: 'as N' + MethodSpeciation: 'as N', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'false schema', 'MethodSpeciation'), true) + assert.equal( + checkProperty(validate.errors, 'false schema', 'MethodSpeciation'), + true + ) }) test('Should accept MethodSpeciation when its expected', async (t) => { const valid = validate({ - CharacteristicName: 'pH' + CharacteristicName: 'pH', }) assert.equal(valid, true) }) test('Should accept MethodSpeciation when its not expected', async (t) => { const valid = validate({ - CharacteristicName: 'Ammonia and ammonium' + CharacteristicName: 'Ammonia and ammonium', }) assert.equal(valid, true) }) // *** CharacteristicName-pH-ActivityType-Sample *** // -test("Should accept CharacteristicName-pH,lab with ActivityType-Sample", async (t) => { +test('Should accept CharacteristicName-pH,lab with ActivityType-Sample', async (t) => { const valid = validate({ - CharacteristicName: "pH, lab", - ActivityType: "Sample-Routine", - LaboratoryName: "A", - ResultAnalyticalMethodName: "Unspecified" + CharacteristicName: 'pH, lab', + ActivityType: 'Sample-Routine', + LaboratoryName: 'A', + ResultAnalyticalMethodName: 'Unspecified', }) - assert.equal(valid, true); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), false); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), false); - assert.equal(checkProperty(validate.errors, "not", "ActivityType"), false); -}); + assert.equal(valid, true) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + false + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityType'), + false + ) + assert.equal(checkProperty(validate.errors, 'not', 'ActivityType'), false) +}) -test("Should reject CharacteristicName-pH with ActivityType-Sample", async (t) => { +test('Should reject CharacteristicName-pH with ActivityType-Sample', async (t) => { const valid = validate({ - CharacteristicName: "pH", - ActivityType: "Sample-Routine", - LaboratoryName: "A", - ResultAnalyticalMethodName: "Unspecified" + CharacteristicName: 'pH', + ActivityType: 'Sample-Routine', + LaboratoryName: 'A', + ResultAnalyticalMethodName: 'Unspecified', }) - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "not", "ActivityType"), true); - assert.equal(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); -}); + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'not', 'ActivityType'), true) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'qc-CharacteristicName-pH-ActivityType-Sample' + ), + true + ) +}) -test("Should reject CharacteristicName-pH with ActivityType-Quality Control Sample", async (t) => { +test('Should reject CharacteristicName-pH with ActivityType-Quality Control Sample', async (t) => { const valid = validate({ - CharacteristicName: "pH", - ActivityType: "Quality Control Sample-Other", - LaboratoryName: "A", - ResultAnalyticalMethodName: "Unspecified" + CharacteristicName: 'pH', + ActivityType: 'Quality Control Sample-Other', + LaboratoryName: 'A', + ResultAnalyticalMethodName: 'Unspecified', }) - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "not", "ActivityType"), true); - assert.equal(checkProperty(validate.errors, "message", "qc-CharacteristicName-pH-ActivityType-Sample"), true); -}); + assert.equal(valid, false) + assert.equal(checkProperty(validate.errors, 'not', 'ActivityType'), true) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'qc-CharacteristicName-pH-ActivityType-Sample' + ), + true + ) +}) // *** CharacteristicName-Metal-ResultAnalyticalMethodName *** // test('Should accept CharacteristicName-ResultAnalyticalMethodName', async (t) => { const valid = validate({ CharacteristicName: 'Ammonia and ammonium', - ResultAnalyticalMethodName: 'Test Method Name' + ResultAnalyticalMethodName: 'Test Method Name', }) assert.equal(valid, true) }) test('Should reject CharacteristicName-ResultAnalyticalMethodName when empty', async (t) => { const valid = validate({ CharacteristicName: 'Day, ice off', - ResultAnalyticalMethodName: undefined + ResultAnalyticalMethodName: undefined, }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'required', 'ResultAnalyticalMethodName'), true) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultAnalyticalMethodName'), + true + ) }) // MonitoringLocationDepthHeightMeasure - TODO future? @@ -518,7 +598,7 @@ test('Should reject CharacteristicName-ResultAnalyticalMethodName when empty', a test('Should accept MonitoringLocationLatitude/Longitude when its within bounds', async (t) => { const valid = validate({ MonitoringLocationLatitude: 51, - MonitoringLocationLongitude: -114 + MonitoringLocationLongitude: -114, }) assert.equal(valid, true) }) @@ -526,7 +606,7 @@ test('Should accept MonitoringLocationLatitude/Longitude when its within bounds' test('Should reject MonitoringLocationLatitude when its out of bounds', async (t) => { const valid = validate({ MonitoringLocationLatitude: 35, - MonitoringLocationLongitude: -114 + MonitoringLocationLongitude: -114, }) assert.equal(valid, false) assert.equal( @@ -538,7 +618,7 @@ test('Should reject MonitoringLocationLatitude when its out of bounds', async (t test('Should reject MonitoringLocationLongitude when its out of bounds', async (t) => { const valid = validate({ MonitoringLocationLatitude: 51, - MonitoringLocationLongitude: -45 + MonitoringLocationLongitude: -45, }) assert.equal(valid, false) assert.equal( @@ -551,7 +631,7 @@ test('Should reject MonitoringLocationLongitude when its out of bounds', async ( test('Should reject ActivityType when ResultAnalyticalMethodContext is YSI', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'YSI', - ActivityType: 'Sample-Routine' + ActivityType: 'Sample-Routine', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) @@ -559,7 +639,7 @@ test('Should reject ActivityType when ResultAnalyticalMethodContext is YSI', asy test('Should reject ActivityType when ResultAnalyticalMethodContext is Oakton', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'Oakton', - ActivityType: 'Sample-Routine' + ActivityType: 'Sample-Routine', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ActivityType'), true) @@ -567,20 +647,20 @@ test('Should reject ActivityType when ResultAnalyticalMethodContext is Oakton', test('Should accept ActivityType when ResultAnalyticalMethodContext is YSI', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'YSI', - ActivityType: 'Field Msr/Obs-Portable Data Logger' + ActivityType: 'Field Msr/Obs-Portable Data Logger', }) assert.equal(valid, true) }) test('Should accept ActivityType when ResultAnalyticalMethodContext is Oakton', async (t) => { const valid = validate({ ResultAnalyticalMethodContext: 'Oakton', - ActivityType: 'Field Msr/Obs-Portable Data Logger' + ActivityType: 'Field Msr/Obs-Portable Data Logger', }) assert.equal(valid, true) }) test('Should ignore ActivityType when ResultAnalyticalMethodContext is not YSI', async (t) => { const valid = validate({ - ResultAnalyticalMethodContext: 'ANY' + ResultAnalyticalMethodContext: 'ANY', }) assert.equal(valid, true) // assert.equal( @@ -597,7 +677,7 @@ test('Should ignore ActivityType when ResultAnalyticalMethodContext is not YSI', test('Should reject ResultDetectionQuantitationLimit when measure is below 0', async (t) => { const valid = validate({ ResultDetectionQuantitationLimitMeasure: -1, - ResultDetectionQuantitationLimitUnit: 'mg/l' + ResultDetectionQuantitationLimitUnit: 'mg/l', }) assert.equal(valid, false) assert.equal( @@ -612,13 +692,13 @@ test('Should reject ResultDetectionQuantitationLimit when measure is below 0', a test('Should accept ResultDetectionQuantitationLimit when measure is above 0', async (t) => { const valid = validate({ ResultDetectionQuantitationLimitMeasure: 1, - ResultDetectionQuantitationLimitUnit: 'mg/l' + ResultDetectionQuantitationLimitUnit: 'mg/l', }) assert.equal(valid, true) }) test('Should ignore ResultDetectionQuantitationLimit when measure is not defined', async (t) => { const valid = validate({ - ResultDetectionQuantitationLimitUnit: 'mg/l' + ResultDetectionQuantitationLimitUnit: 'mg/l', }) assert.equal(valid, false) assert.equal( @@ -636,7 +716,7 @@ test('Should accept when CharacteristicName is pH and ResultDetectionQuantitatio const valid = validate({ CharacteristicName: 'pH', ResultDetectionQuantitationLimitMeasure: 7, - ResultDetectionQuantitationLimitUnit: 'None' + ResultDetectionQuantitationLimitUnit: 'None', }) assert.equal(valid, true) }) @@ -644,7 +724,7 @@ test('Should reject when CharacteristicName is pH and ResultDetectionQuantitatio const valid = validate({ CharacteristicName: 'pH', ResultDetectionQuantitationLimitMeasure: 7, - ResultDetectionQuantitationLimitUnit: 'mg/L' + ResultDetectionQuantitationLimitUnit: 'mg/L', }) assert.equal(valid, false) assert.equal( @@ -661,17 +741,19 @@ test('Should reject when CharacteristicName is pH and ResultDetectionQuantitatio // *** CharacteristicName-Ratio-ResultDetectionQuantitationLimitUnit-None *** // test('Should accept when CharacteristicName is a ratio and ResultDetectionQuantitationLimitUnit is None', async (t) => { const valid = validate({ - CharacteristicName: 'Sodium adsorption ratio [(Na)/(sq root of 1/2 Ca + Mg)]', + CharacteristicName: + 'Sodium adsorption ratio [(Na)/(sq root of 1/2 Ca + Mg)]', ResultDetectionQuantitationLimitMeasure: 7, - ResultDetectionQuantitationLimitUnit: 'None' + ResultDetectionQuantitationLimitUnit: 'None', }) assert.equal(valid, true) }) test('Should reject when CharacteristicName is a ratio and ResultDetectionQuantitationLimitUnit is not None', async (t) => { const valid = validate({ - CharacteristicName: 'Sodium adsorption ratio [(Na)/(sq root of 1/2 Ca + Mg)]', + CharacteristicName: + 'Sodium adsorption ratio [(Na)/(sq root of 1/2 Ca + Mg)]', ResultDetectionQuantitationLimitMeasure: 7, - ResultDetectionQuantitationLimitUnit: 'mg/L' + ResultDetectionQuantitationLimitUnit: 'mg/L', }) assert.equal(valid, false) assert.equal( @@ -690,14 +772,14 @@ test('Should accept when ResultDetectionQuantitationLimitMeasure & ResultDetecti const valid = validate({ CharacteristicName: 'Temperature, water', ResultDetectionQuantitationLimitMeasure: 0, - ResultDetectionQuantitationLimitUnit: 'deg C' + ResultDetectionQuantitationLimitUnit: 'deg C', }) assert.equal(valid, true) }) test('Should reject when ResultDetectionQuantitationLimitUnit exists without ResultDetectionQuantitationLimitMeasure', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', - ResultDetectionQuantitationLimitUnit: 'deg C' + ResultDetectionQuantitationLimitUnit: 'deg C', }) assert.equal(valid, false) assert.equal( @@ -714,7 +796,7 @@ test('Should reject when ResultDetectionQuantitationLimitUnit exists without Res test('Should accept ResultSampleFraction-ActivityMediaName-Sediment', async (t) => { const valid = validate({ ActivityMediaName: 'Subsurface Soil/Sediment', - ResultSampleFraction: 'Extractable, other' + ResultSampleFraction: 'Extractable, other', }) assert.equal(valid, true) }) @@ -722,39 +804,45 @@ test('Should accept ResultSampleFraction-ActivityMediaName-Sediment', async (t) test('Should reject ResultSampleFraction-ActivityMediaName-Sediment', async (t) => { const valid = validate({ ActivityMediaName: 'Stormwater', - ResultSampleFraction: 'Extractable, other' + ResultSampleFraction: 'Extractable, other', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'enum', 'ActivityMediaName'), true) + assert.equal( + checkProperty(validate.errors, 'enum', 'ActivityMediaName'), + true + ) }) // *** ResultSampleFraction-FreeAvailable *** // test('Should accept ResultSampleFraction Free Available with Chlorine', async (t) => { const valid = validate({ CharacteristicName: 'Chlorine', - ResultSampleFraction: 'Free Available' + ResultSampleFraction: 'Free Available', }) assert.equal(valid, true) }) test('Should accept ResultSampleFraction Free Available with Cyanide', async (t) => { const valid = validate({ CharacteristicName: 'Cyanide', - ResultSampleFraction: 'Free Available' + ResultSampleFraction: 'Free Available', }) assert.equal(valid, true) }) test('Should reject ResultSampleFraction Free Available with unrelated CharacteristicName', async (t) => { const valid = validate({ CharacteristicName: 'Iron', - ResultSampleFraction: 'Free Available' + ResultSampleFraction: 'Free Available', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal( + checkProperty(validate.errors, 'enum', 'CharacteristicName'), + true + ) }) test('Should accept when ResultSampleFraction is not Free Available', async (t) => { const valid = validate({ CharacteristicName: 'Iron', - ResultSampleFraction: 'Total' + ResultSampleFraction: 'Total', }) assert.equal(valid, true) }) @@ -784,7 +872,7 @@ test('Should reject Taxonomic Richness... in None', async (t) => { CharacteristicName: 'Taxonomic Richness, Ephemeroptera, Plecoptera, Tricoptera', ResultValue: 100, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) @@ -794,7 +882,7 @@ test('Should acceptTaxonomic Richness... in %', async (t) => { CharacteristicName: 'Taxonomic Richness, Ephemeroptera, Plecoptera, Tricoptera', ResultValue: 100, - ResultUnit: '%' + ResultUnit: '%', }) assert.equal(valid, true) }) @@ -804,7 +892,7 @@ test('Should accept when CharacteristicName is pH and ResultUnit is None', async const valid = validate({ CharacteristicName: 'pH', ResultValue: 7, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, true) }) @@ -812,7 +900,7 @@ test('Should reject when CharacteristicName is pH and ResultUnit is not None', a const valid = validate({ CharacteristicName: 'pH', ResultValue: 7, - ResultUnit: 'mg/L' + ResultUnit: 'mg/L', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) @@ -824,7 +912,7 @@ test('Should accept when CharacteristicName is a ratio and ResultUnit is None', const valid = validate({ CharacteristicName: 'Anion/cation ratio', ResultValue: 7, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, true) }) @@ -832,7 +920,7 @@ test('Should reject when CharacteristicName is a ratio and ResultUnit is not Non const valid = validate({ CharacteristicName: 'Anion/cation ratio', ResultValue: 7, - ResultUnit: 'mg/L' + ResultUnit: 'mg/L', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) @@ -844,7 +932,7 @@ test('Should accept when ResultValue & ResultUnit exist', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultValue: 0, - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, true) }) @@ -852,10 +940,13 @@ test('Should accept when ResultValue & ResultUnit exist', async (t) => { test('Should reject when ResultUnit exists without ResultValue', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'false schema', 'ResultUnit'), true) + assert.equal( + checkProperty(validate.errors, 'false schema', 'ResultUnit'), + true + ) }) // *** ResultValue-DepthMaximum *** // @@ -882,7 +973,7 @@ test('Should accept Turbidity ResultUnit with Turbidity CharacteristicName', asy const valid = validate({ CharacteristicName: 'Turbidity', ResultValue: 10, - ResultUnit: 'NTU' + ResultUnit: 'NTU', }) assert.equal(valid, true) }) @@ -890,16 +981,19 @@ test('Should reject Turbidity ResultUnit with non-Turbidity CharacteristicName', const valid = validate({ CharacteristicName: 'Iron', ResultValue: 10, - ResultUnit: 'NTU' + ResultUnit: 'NTU', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal( + checkProperty(validate.errors, 'enum', 'CharacteristicName'), + true + ) }) test('Should accept non-Turbidity ResultUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ CharacteristicName: 'Iron', ResultValue: 10, - ResultUnit: 'mg/L' + ResultUnit: 'mg/L', }) assert.equal(valid, true) }) @@ -909,7 +1003,7 @@ test('Should accept Turbidity ResultDetectionQuantitationLimitUnit with Turbidit const valid = validate({ CharacteristicName: 'Turbidity', ResultDetectionQuantitationLimitMeasure: 10, - ResultDetectionQuantitationLimitUnit: 'NTU' + ResultDetectionQuantitationLimitUnit: 'NTU', }) assert.equal(valid, true) }) @@ -917,16 +1011,19 @@ test('Should reject Turbidity ResultDetectionQuantitationLimitUnit with non-Turb const valid = validate({ CharacteristicName: 'Iron', ResultDetectionQuantitationLimitMeasure: 10, - ResultDetectionQuantitationLimitUnit: 'NTU' + ResultDetectionQuantitationLimitUnit: 'NTU', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'enum', 'CharacteristicName'), true) + assert.equal( + checkProperty(validate.errors, 'enum', 'CharacteristicName'), + true + ) }) test('Should accept non-Turbidity ResultDetectionQuantitationLimitUnit with non-Turbidity CharacteristicName', async (t) => { const valid = validate({ CharacteristicName: 'Iron', ResultDetectionQuantitationLimitMeasure: 10, - ResultDetectionQuantitationLimitUnit: 'mg/L' + ResultDetectionQuantitationLimitUnit: 'mg/L', }) assert.equal(valid, true) }) @@ -936,7 +1033,7 @@ test('Should reject Dissolved oxygen (DO) in %', async (t) => { const valid = validate({ CharacteristicName: 'Dissolved oxygen (DO)', ResultValue: 1, - ResultUnit: '%' + ResultUnit: '%', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'enum', 'ResultUnit'), true) @@ -945,7 +1042,7 @@ test('Should accept Dissolved oxygen (DO) in mg/L', async (t) => { const valid = validate({ CharacteristicName: 'Dissolved oxygen (DO)', ResultValue: 1, - ResultUnit: 'mg/L' + ResultUnit: 'mg/L', }) assert.equal(valid, true) }) @@ -955,7 +1052,7 @@ test('Should reject Dissolved oxygen saturation when measure is below 0', async const valid = validate({ CharacteristicName: 'Dissolved oxygen saturation', ResultValue: -1, - ResultUnit: 'mg/l' + ResultUnit: 'mg/l', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) @@ -964,7 +1061,7 @@ test('Should accept Dissolved oxygen saturation when measure is above 0', async const valid = validate({ CharacteristicName: 'Dissolved oxygen saturation', ResultValue: 1, - ResultUnit: 'mg/l' + ResultUnit: 'mg/l', }) assert.equal(valid, true) }) @@ -973,7 +1070,7 @@ test('Should accept Dissolved oxygen saturation when measure is above 0', async test('Should reject Result when measure is below 0', async (t) => { const valid = validate({ ResultValue: -1, - ResultUnit: 'mg/l' + ResultUnit: 'mg/l', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) @@ -981,13 +1078,13 @@ test('Should reject Result when measure is below 0', async (t) => { test('Should accept Result when measure is above 0', async (t) => { const valid = validate({ ResultValue: 1, - ResultUnit: 'mg/l' + ResultUnit: 'mg/l', }) assert.equal(valid, true) }) test('Should ignore Result when measure is not defined', async (t) => { const valid = validate({ - ResultUnit: '#/100ml' + ResultUnit: '#/100ml', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -995,7 +1092,7 @@ test('Should ignore Result when measure is not defined', async (t) => { test('Should ignore Result when measure is a string', async (t) => { const valid = validate({ ResultValue: 'unknown', - ResultUnit: '#/100ml' + ResultUnit: '#/100ml', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1006,7 +1103,7 @@ test('Should reject pH below range', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultValue: -1, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) @@ -1015,7 +1112,7 @@ test('Should reject pH above range', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultValue: 15, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) @@ -1024,14 +1121,14 @@ test('Should accept pH within range', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultValue: 7, - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, true) }) test('Should ignore pH range check when measure is not defined', async (t) => { const valid = validate({ CharacteristicName: 'pH', - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, false) // due to another QC assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1042,7 +1139,7 @@ test('Should ignore pH range check when measure is a string', async (t) => { const valid = validate({ CharacteristicName: 'pH', ResultValue: 'Unknown', - ResultUnit: 'None' + ResultUnit: 'None', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1054,7 +1151,7 @@ test('Should reject Temperature below range', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultValue: -101, - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) @@ -1063,7 +1160,7 @@ test('Should reject Temperature above range', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultValue: 101, - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) @@ -1072,14 +1169,14 @@ test('Should accept Temperature within range', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', ResultValue: 0, - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, true) }) test('Should ignore Temperature range check when measure is not defined', async (t) => { const valid = validate({ CharacteristicName: 'Temperature, water', - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, false) // due to another QC assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1089,7 +1186,7 @@ test('Should ignore Temperature range check when measure is a string', async (t) const valid = validate({ CharacteristicName: 'Temperature, water', ResultValue: 'Unknown', - ResultUnit: 'deg C' + ResultUnit: 'deg C', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1100,7 +1197,7 @@ test('Should ignore Temperature range check when measure is a string', async (t) test('Should reject DOY below range (1-366)', async (t) => { const valid = validate({ ResultUnit: 'DOY', - ResultValue: 0 + ResultValue: 0, }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), true) @@ -1108,7 +1205,7 @@ test('Should reject DOY below range (1-366)', async (t) => { test('Should reject DOY above range (1-366)', async (t) => { const valid = validate({ ResultUnit: 'DOY', - ResultValue: 367 + ResultValue: 367, }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'maximum', 'ResultValue'), true) @@ -1116,13 +1213,13 @@ test('Should reject DOY above range (1-366)', async (t) => { test('Should accept DOY within range (1-366)', async (t) => { const valid = validate({ ResultUnit: 'DOY', - ResultValue: 300 + ResultValue: 300, }) assert.equal(valid, true) }) test('Should ignore DOY range check when measure is not defined', async (t) => { const valid = validate({ - ResultUnit: 'DOY' + ResultUnit: 'DOY', }) assert.equal(valid, false) // due to another QC assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1131,7 +1228,7 @@ test('Should ignore DOY range check when measure is not defined', async (t) => { test('Should ignore DOY range check when measure is a string', async (t) => { const valid = validate({ ResultValue: 'Unknown', - ResultUnit: 'DOY' + ResultUnit: 'DOY', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'minimum', 'ResultValue'), false) @@ -1148,11 +1245,14 @@ test('Should reject columns with extra whitespace', async (t) => { ResultAnalyticalMethodID: ' sum ', ResultAnalyticalMethodName: 'sum ', LaboratoryName: ' sum', - LaboratorySampleID: ' sum ' + LaboratorySampleID: ' sum ', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) - assert.equal(checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'MonitoringLocationID'), + true + ) assert.equal( checkProperty(validate.errors, 'pattern', 'MonitoringLocationName'), true @@ -1166,8 +1266,14 @@ test('Should reject columns with extra whitespace', async (t) => { checkProperty(validate.errors, 'pattern', 'ResultAnalyticalMethodName'), true ) - assert.equal(checkProperty(validate.errors, 'pattern', 'LaboratoryName'), true) - assert.equal(checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratoryName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), + true + ) }) test('Should accept columns without extra whitespace', async (t) => { const valid = validate({ @@ -1178,7 +1284,7 @@ test('Should accept columns without extra whitespace', async (t) => { ResultAnalyticalMethodID: 'sum', ResultAnalyticalMethodName: 'sum', LaboratoryName: 'sum', - LaboratorySampleID: 'A' + LaboratorySampleID: 'A', }) assert.equal(valid, true) }) @@ -1186,23 +1292,29 @@ test('Should accept columns without extra whitespace', async (t) => { // *** ResultStatusID-Deprecated *** // test('Should reject deprecated ResultStatusID Final', async (t) => { const valid = validate({ - ResultStatusID: 'Final' + ResultStatusID: 'Final', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), true) + assert.equal( + checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), + true + ) }) test('Should reject deprecated ResultStatusID Accepted', async (t) => { const valid = validate({ - ResultStatusID: 'Accepted' + ResultStatusID: 'Accepted', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), true) + assert.equal( + checkProperty(validate.errors, 'message', 'qc-ResultStatusID-Deprecated'), + true + ) }) test('Should accept ResultStatusID Validated', async (t) => { const valid = validate({ - ResultStatusID: 'Validated' + ResultStatusID: 'Validated', }) assert.equal(valid, true) }) @@ -1210,16 +1322,23 @@ test('Should accept ResultStatusID Validated', async (t) => { // *** AnalysisStartTime-AnalysisStartTimeZone *** // test('Should warn when AnalysisStartTime is present without AnalysisStartTimeZone', async (t) => { const valid = validate({ - AnalysisStartTime: '13:15:00' + AnalysisStartTime: '13:15:00', }) assert.equal(valid, false) - assert.equal(checkProperty(validate.errors, 'message', 'qc-AnalysisStartTime-AnalysisStartTimeZone'), true) + assert.equal( + checkProperty( + validate.errors, + 'message', + 'qc-AnalysisStartTime-AnalysisStartTimeZone' + ), + true + ) }) test('Should accept AnalysisStartTime with AnalysisStartTimeZone', async (t) => { const valid = validate({ AnalysisStartTime: '13:15:00', - AnalysisStartTimeZone: '-06:00' + AnalysisStartTimeZone: '-06:00', }) assert.equal(valid, true) }) diff --git a/schemas/data/test/required.js b/schemas/data/test/required.js index 145e44d2..e24eabc0 100644 --- a/schemas/data/test/required.js +++ b/schemas/data/test/required.js @@ -1,578 +1,608 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import validate from "../frontend/index.js"; +import { test } from 'node:test' +import assert from 'node:assert/strict' +import validate from '../frontend/index.js' const checkProperty = (errors, keyword, property) => { - if (errors === null) return false; + if (errors === null) return false for (const error of errors) { - if (error.keyword === "errorMessage") { - const nested = checkProperty(error.params.errors, keyword, property); - if (nested) return nested; + if (error.keyword === 'errorMessage') { + const nested = checkProperty(error.params.errors, keyword, property) + if (nested) return nested } - if (error.keyword !== keyword) continue; + if (error.keyword !== keyword) continue if ( - ["required", "dependencies"].includes(keyword) && + ['required', 'dependencies'].includes(keyword) && error.params.missingProperty === property ) { - return true; + return true } else if ( - keyword === "additionalProperties" && + keyword === 'additionalProperties' && error.params.additionalProperty === property ) { - return true; + return true } else if ( - keyword === "unevaluatedProperties" && + keyword === 'unevaluatedProperties' && error.params.unevaluatedProperty === property ) { - return true; + return true } else if ( - keyword === "oneOf" && + keyword === 'oneOf' && error.params.passingSchemas.includes(property) ) { - return true; - } else if (keyword === "anyOf") return true; - else if (keyword === "not" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "enum" && error.instancePath.includes(property)) { - return true; - } else if (keyword === "minimum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'anyOf') return true + else if (keyword === 'not' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'enum' && error.instancePath.includes(property)) { + return true + } else if (keyword === 'minimum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMinimum" && + keyword === 'exclusiveMinimum' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "maximum" && error.instancePath.includes(property)) { - return true; + return true + } else if (keyword === 'maximum' && error.instancePath.includes(property)) { + return true } else if ( - keyword === "exclusiveMaximum" && + keyword === 'exclusiveMaximum' && error.instancePath.includes(property) ) { - return true; + return true } else if ( - keyword === "false schema" && + keyword === 'false schema' && error.instancePath.includes(property) ) { - return true; - } else if (keyword === "pattern") return true; + return true + } else if (keyword === 'pattern') return true } - return false; -}; + return false +} -test("Should not set any defaults", async (t) => { - const data = {}; - const valid = validate(data); - assert.equal(valid, false); - assert.deepEqual(data, {}); -}); +test('Should not set any defaults', async (t) => { + const data = {} + const valid = validate(data) + assert.equal(valid, false) + assert.deepEqual(data, {}) +}) -test("Should require properties", async (t) => { - const valid = validate({}); - assert.equal(valid, false); +test('Should require properties', async (t) => { + const valid = validate({}) + assert.equal(valid, false) // #/allOf/0 - assert.equal(checkProperty(validate.errors, "required", "DatasetName"), true); + assert.equal(checkProperty(validate.errors, 'required', 'DatasetName'), true) assert.equal( - checkProperty(validate.errors, "required", "MonitoringLocationID"), - true, - ); + checkProperty(validate.errors, 'required', 'MonitoringLocationID'), + true + ) assert.equal( - checkProperty(validate.errors, "required", "MonitoringLocationName"), - true, - ); + checkProperty(validate.errors, 'required', 'MonitoringLocationName'), + true + ) assert.equal( - checkProperty(validate.errors, "required", "MonitoringLocationType"), - true, - ); + checkProperty(validate.errors, 'required', 'MonitoringLocationType'), + true + ) assert.equal( - checkProperty(validate.errors, "required", "MonitoringLocationLatitude"), - true, - ); + checkProperty(validate.errors, 'required', 'MonitoringLocationLatitude'), + true + ) assert.equal( - checkProperty(validate.errors, "required", "MonitoringLocationLongitude"), - true, - ); + checkProperty(validate.errors, 'required', 'MonitoringLocationLongitude'), + true + ) assert.equal( checkProperty( validate.errors, - "required", - "MonitoringLocationHorizontalCoordinateReferenceSystem", + 'required', + 'MonitoringLocationHorizontalCoordinateReferenceSystem' ), - true, - ); - assert.equal(checkProperty(validate.errors, "required", "ActivityType"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityMediaName"), true); - assert.equal(checkProperty(validate.errors, "required", "ActivityStartDate"), true); - assert.equal(checkProperty(validate.errors, "required", "CharacteristicName"), true); - assert.equal(checkProperty(validate.errors, "required", "ResultValueType"), true); -}); + true + ) + assert.equal(checkProperty(validate.errors, 'required', 'ActivityType'), true) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityMediaName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ActivityStartDate'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'CharacteristicName'), + true + ) + assert.equal( + checkProperty(validate.errors, 'required', 'ResultValueType'), + true + ) +}) -test("Should not require properties", async (t) => { - const valid = validate({ - DatasetName: "Test", - MonitoringLocationID: "A1", - MonitoringLocationName: "A1 Test", - MonitoringLocationLatitude: "51.0486", - MonitoringLocationLongitude: "-114.0708", - MonitoringLocationHorizontalCoordinateReferenceSystem: "WGS84", - MonitoringLocationType: "Ocean", - ActivityType: "Field Msr/Obs", - ActivityMediaName: "Surface Water", - ActivityDepthHeightMeasure: "-34", - ActivityDepthHeightUnit: "m", - SampleCollectionEquipmentName: "Bucket", - CharacteristicName: "Sulfur", - MethodSpeciation: "as B", - ResultSampleFraction: "Dissolved", - ResultValue: "99.99", - ResultUnit: "ug/l", - ResultValueType: "Actual", - ResultStatusID: "Accepted", - ResultComment: "None at this time", - ResultAnalyticalMethodID: "1", - ResultAnalyticalMethodContext: "APHA", - ActivityStartDate: "2018-02-23", - ActivityStartTime: "13:15:00", - ActivityEndDate: "2018-02-23", - ActivityEndTime: "13:15:00", - LaboratoryName: "Farrell Labs", - LaboratorySampleID: "101010011110", - AnalysisStartDate: "2018-02-23", - AnalysisStartTime: "13:15:00", - AnalysisStartTimeZone: "-06:00", - }); - assert.equal(valid, true); -}); +test('Should not require properties', async (t) => { + const valid = validate({ + DatasetName: 'Test', + MonitoringLocationID: 'A1', + MonitoringLocationName: 'A1 Test', + MonitoringLocationLatitude: '51.0486', + MonitoringLocationLongitude: '-114.0708', + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationType: 'Ocean', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Surface Water', + ActivityDepthHeightMeasure: '-34', + ActivityDepthHeightUnit: 'm', + SampleCollectionEquipmentName: 'Bucket', + CharacteristicName: 'Sulfur', + MethodSpeciation: 'as B', + ResultSampleFraction: 'Dissolved', + ResultValue: '99.99', + ResultUnit: 'ug/l', + ResultValueType: 'Actual', + ResultStatusID: 'Accepted', + ResultComment: 'None at this time', + ResultAnalyticalMethodID: '1', + ResultAnalyticalMethodContext: 'APHA', + ActivityStartDate: '2018-02-23', + ActivityStartTime: '13:15:00', + ActivityEndDate: '2018-02-23', + ActivityEndTime: '13:15:00', + LaboratoryName: 'Farrell Labs', + LaboratorySampleID: '101010011110', + AnalysisStartDate: '2018-02-23', + AnalysisStartTime: '13:15:00', + AnalysisStartTimeZone: '-06:00', + }) + assert.equal(valid, true) +}) -test("Should reject additional headers", async (t) => { +test('Should reject additional headers', async (t) => { const valid = validate({ - MonitoringLocationWaterBody: "Lake", - }); - assert.equal(valid, false); + MonitoringLocationWaterBody: 'Lake', + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "unevaluatedProperties", - "MonitoringLocationWaterBody", + 'unevaluatedProperties', + 'MonitoringLocationWaterBody' ), - true, - ); -}); + true + ) +}) -test("Should treat EventID as an optional, unconditional field", async (t) => { - validate({ EventID: "Spring 2018 survey" }); +test('Should treat EventID as an optional, unconditional field', async (t) => { + validate({ EventID: 'Spring 2018 survey' }) // Recognized column — not rejected as an unknown/additional header. assert.equal( - checkProperty(validate.errors, "unevaluatedProperties", "EventID"), - false, - ); + checkProperty(validate.errors, 'unevaluatedProperties', 'EventID'), + false + ) // Imposes no requirement of its own — never reported as required or as a dependency. - assert.equal(checkProperty(validate.errors, "required", "EventID"), false); - assert.equal(checkProperty(validate.errors, "dependencies", "EventID"), false); -}); + assert.equal(checkProperty(validate.errors, 'required', 'EventID'), false) + assert.equal(checkProperty(validate.errors, 'dependencies', 'EventID'), false) +}) -test("Should reject ActivityDepthHeightMeasure AND NOT ActivityDepthHeightUnit", async (t) => { +test('Should reject ActivityDepthHeightMeasure AND NOT ActivityDepthHeightUnit', async (t) => { const valid = validate({ ActivityDepthHeightMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "ActivityDepthHeightUnit"), - true, - ); -}); -test("Should accept ActivityDepthHeightMeasure AND ActivityDepthHeightUnit", async (t) => { + checkProperty(validate.errors, 'dependencies', 'ActivityDepthHeightUnit'), + true + ) +}) +test('Should accept ActivityDepthHeightMeasure AND ActivityDepthHeightUnit', async (t) => { const valid = validate({ ActivityDepthHeightMeasure: true, ActivityDepthHeightUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "ActivityDepthHeightUnit"), - false, - ); -}); + checkProperty(validate.errors, 'dependencies', 'ActivityDepthHeightUnit'), + false + ) +}) -test("Should reject ResultValue AND NOT ResultUnit", async (t) => { +test('Should reject ResultValue AND NOT ResultUnit', async (t) => { const valid = validate({ ResultValue: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "ResultUnit"), true); -}); -test("Should reject ResultValue AND ResultUnit", async (t) => { + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultUnit'), + true + ) +}) +test('Should reject ResultValue AND ResultUnit', async (t) => { const valid = validate({ ResultValue: true, ResultUnit: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "ResultUnit"), false); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'ResultUnit'), + false + ) +}) -test("Should reject ResultDetectionQuantitationLimitMeasure AND NOT ResultDetectionQuantitationLimit{Unit,Type}", async (t) => { +test('Should reject ResultDetectionQuantitationLimitMeasure AND NOT ResultDetectionQuantitationLimit{Unit,Type}', async (t) => { const valid = validate({ ResultDetectionQuantitationLimitMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitUnit", + 'dependencies', + 'ResultDetectionQuantitationLimitUnit' ), - true, - ); + true + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitType", + 'dependencies', + 'ResultDetectionQuantitationLimitType' ), - true, - ); -}); -test("Should accept ResultDetectionQuantitationLimitMeasure AND ResultDetectionQuantitationLimit{Unit,Type}", async (t) => { + true + ) +}) +test('Should accept ResultDetectionQuantitationLimitMeasure AND ResultDetectionQuantitationLimit{Unit,Type}', async (t) => { const valid = validate({ ResultDetectionQuantitationLimitMeasure: true, ResultDetectionQuantitationLimitUnit: true, ResultDetectionQuantitationLimitType: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitUnit", + 'dependencies', + 'ResultDetectionQuantitationLimitUnit' ), - false, - ); + false + ) assert.equal( checkProperty( validate.errors, - "dependencies", - "ResultDetectionQuantitationLimitType", + 'dependencies', + 'ResultDetectionQuantitationLimitType' ), - false, - ); -}); + false + ) +}) -test("Should accept AnalysisStartTime AND NOT AnalysisStartTimeZone (no longer an error; warning only)", async (t) => { +test('Should accept AnalysisStartTime AND NOT AnalysisStartTimeZone (no longer an error; warning only)', async (t) => { const valid = validate({ AnalysisStartTime: true, - }); + }) assert.equal( - checkProperty(validate.errors, "dependencies", "AnalysisStartTimeZone"), - false, - ); -}); + checkProperty(validate.errors, 'dependencies', 'AnalysisStartTimeZone'), + false + ) +}) -test("Should reject AnalysisStartTimeZone AND NOT AnalysisStartTime", async (t) => { +test('Should reject AnalysisStartTimeZone AND NOT AnalysisStartTime', async (t) => { const valid = validate({ AnalysisStartTimeZone: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "AnalysisStartTime"), - true, - ); -}); + checkProperty(validate.errors, 'dependencies', 'AnalysisStartTime'), + true + ) +}) -test("Should accept AnalysisStartTime AND AnalysisStartTimeZone", async (t) => { +test('Should accept AnalysisStartTime AND AnalysisStartTimeZone', async (t) => { const valid = validate({ AnalysisStartTime: true, AnalysisStartTimeZone: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "AnalysisStartTimeZone"), - false, - ); -}); + checkProperty(validate.errors, 'dependencies', 'AnalysisStartTimeZone'), + false + ) +}) // Groundwater-related dependency tests -test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalUnit", async (t) => { +test('Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalUnit', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalUnit", + 'dependencies', + 'MonitoringLocationVerticalUnit' ), - true, - ); -}); -test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalUnit", async (t) => { + true + ) +}) +test('Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalUnit', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalUnit", + 'dependencies', + 'MonitoringLocationVerticalUnit' ), - false, - ); -}); + false + ) +}) -test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCollectionMethod", async (t) => { +test('Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCollectionMethod', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalCollectionMethod", + 'dependencies', + 'MonitoringLocationVerticalCollectionMethod' ), - true, - ); -}); -test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCollectionMethod", async (t) => { + true + ) +}) +test('Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCollectionMethod', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalCollectionMethod: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalCollectionMethod", + 'dependencies', + 'MonitoringLocationVerticalCollectionMethod' ), - false, - ); -}); + false + ) +}) -test("Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCoordinateReferenceSystem", async (t) => { +test('Should reject MonitoringLocationVerticalMeasure AND NOT MonitoringLocationVerticalCoordinateReferenceSystem', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalCoordinateReferenceSystem", + 'dependencies', + 'MonitoringLocationVerticalCoordinateReferenceSystem' ), - true, - ); -}); -test("Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCoordinateReferenceSystem", async (t) => { + true + ) +}) +test('Should accept MonitoringLocationVerticalMeasure AND MonitoringLocationVerticalCoordinateReferenceSystem', async (t) => { const valid = validate({ MonitoringLocationVerticalMeasure: true, MonitoringLocationVerticalCoordinateReferenceSystem: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalCoordinateReferenceSystem", + 'dependencies', + 'MonitoringLocationVerticalCoordinateReferenceSystem' ), - false, - ); -}); + false + ) +}) -test("Should reject MonitoringLocationVerticalAccuracyMeasure AND NOT MonitoringLocationVerticalAccuracyUnit", async (t) => { +test('Should reject MonitoringLocationVerticalAccuracyMeasure AND NOT MonitoringLocationVerticalAccuracyUnit', async (t) => { const valid = validate({ MonitoringLocationVerticalAccuracyMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalAccuracyUnit", + 'dependencies', + 'MonitoringLocationVerticalAccuracyUnit' ), - true, - ); -}); -test("Should accept MonitoringLocationVerticalAccuracyMeasure AND MonitoringLocationVerticalAccuracyUnit", async (t) => { + true + ) +}) +test('Should accept MonitoringLocationVerticalAccuracyMeasure AND MonitoringLocationVerticalAccuracyUnit', async (t) => { const valid = validate({ MonitoringLocationVerticalAccuracyMeasure: true, MonitoringLocationVerticalAccuracyUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "MonitoringLocationVerticalAccuracyUnit", + 'dependencies', + 'MonitoringLocationVerticalAccuracyUnit' ), - false, - ); -}); + false + ) +}) -test("Should reject WellID AND NOT WellIDContext", async (t) => { +test('Should reject WellID AND NOT WellIDContext', async (t) => { const valid = validate({ WellID: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "WellIDContext"), true); -}); -test("Should accept WellID AND WellIDContext", async (t) => { + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'WellIDContext'), + true + ) +}) +test('Should accept WellID AND WellIDContext', async (t) => { const valid = validate({ WellID: true, WellIDContext: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "WellIDContext"), false); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'WellIDContext'), + false + ) +}) -test("Should reject BoreholeDepthMeasure AND NOT BoreholeDepthUnit", async (t) => { +test('Should reject BoreholeDepthMeasure AND NOT BoreholeDepthUnit', async (t) => { const valid = validate({ BoreholeDepthMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), - true, - ); -}); -test("Should accept BoreholeDepthMeasure AND BoreholeDepthUnit", async (t) => { + checkProperty(validate.errors, 'dependencies', 'BoreholeDepthUnit'), + true + ) +}) +test('Should accept BoreholeDepthMeasure AND BoreholeDepthUnit', async (t) => { const valid = validate({ BoreholeDepthMeasure: true, BoreholeDepthUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "BoreholeDepthUnit"), - false, - ); -}); + checkProperty(validate.errors, 'dependencies', 'BoreholeDepthUnit'), + false + ) +}) -test("Should reject WellDepthMeasure AND NOT WellDepthUnit", async (t) => { +test('Should reject WellDepthMeasure AND NOT WellDepthUnit', async (t) => { const valid = validate({ WellDepthMeasure: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), true); -}); -test("Should accept WellDepthMeasure AND WellDepthUnit", async (t) => { + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'WellDepthUnit'), + true + ) +}) +test('Should accept WellDepthMeasure AND WellDepthUnit', async (t) => { const valid = validate({ WellDepthMeasure: true, WellDepthUnit: true, - }); - assert.equal(valid, false); - assert.equal(checkProperty(validate.errors, "dependencies", "WellDepthUnit"), false); -}); + }) + assert.equal(valid, false) + assert.equal( + checkProperty(validate.errors, 'dependencies', 'WellDepthUnit'), + false + ) +}) -test("Should reject WellOpenIntervalTopMeasure AND NOT WellOpenIntervalTopUnit", async (t) => { +test('Should reject WellOpenIntervalTopMeasure AND NOT WellOpenIntervalTopUnit', async (t) => { const valid = validate({ WellOpenIntervalTopMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), - true, - ); -}); -test("Should accept WellOpenIntervalTopMeasure AND WellOpenIntervalTopUnit", async (t) => { + checkProperty(validate.errors, 'dependencies', 'WellOpenIntervalTopUnit'), + true + ) +}) +test('Should accept WellOpenIntervalTopMeasure AND WellOpenIntervalTopUnit', async (t) => { const valid = validate({ WellOpenIntervalTopMeasure: true, WellOpenIntervalTopUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( - checkProperty(validate.errors, "dependencies", "WellOpenIntervalTopUnit"), - false, - ); -}); + checkProperty(validate.errors, 'dependencies', 'WellOpenIntervalTopUnit'), + false + ) +}) -test("Should reject WellOpenIntervalBottomMeasure AND NOT WellOpenIntervalBottomUnit", async (t) => { +test('Should reject WellOpenIntervalBottomMeasure AND NOT WellOpenIntervalBottomUnit', async (t) => { const valid = validate({ WellOpenIntervalBottomMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "WellOpenIntervalBottomUnit", + 'dependencies', + 'WellOpenIntervalBottomUnit' ), - true, - ); -}); -test("Should accept WellOpenIntervalBottomMeasure AND WellOpenIntervalBottomUnit", async (t) => { + true + ) +}) +test('Should accept WellOpenIntervalBottomMeasure AND WellOpenIntervalBottomUnit', async (t) => { const valid = validate({ WellOpenIntervalBottomMeasure: true, WellOpenIntervalBottomUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "WellOpenIntervalBottomUnit", + 'dependencies', + 'WellOpenIntervalBottomUnit' ), - false, - ); -}); + false + ) +}) -test("Should reject ActivityDepthAltitudeReferencePointMeasure AND NOT ActivityDepthAltitudeReferencePointUnit", async (t) => { +test('Should reject ActivityDepthAltitudeReferencePointMeasure AND NOT ActivityDepthAltitudeReferencePointUnit', async (t) => { const valid = validate({ ActivityDepthAltitudeReferencePointMeasure: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ActivityDepthAltitudeReferencePointUnit", + 'dependencies', + 'ActivityDepthAltitudeReferencePointUnit' ), - true, - ); -}); -test("Should accept ActivityDepthAltitudeReferencePointMeasure AND ActivityDepthAltitudeReferencePointUnit", async (t) => { + true + ) +}) +test('Should accept ActivityDepthAltitudeReferencePointMeasure AND ActivityDepthAltitudeReferencePointUnit', async (t) => { const valid = validate({ ActivityDepthAltitudeReferencePointMeasure: true, ActivityDepthAltitudeReferencePointUnit: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "ActivityDepthAltitudeReferencePointUnit", + 'dependencies', + 'ActivityDepthAltitudeReferencePointUnit' ), - false, - ); -}); + false + ) +}) -test("Should reject SampleCollectionMethodID AND NOT SampleCollectionMethodContext", async (t) => { +test('Should reject SampleCollectionMethodID AND NOT SampleCollectionMethodContext', async (t) => { const valid = validate({ SampleCollectionMethodID: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "SampleCollectionMethodContext", + 'dependencies', + 'SampleCollectionMethodContext' ), - true, - ); -}); -test("Should accept SampleCollectionMethodID AND SampleCollectionMethodContext", async (t) => { + true + ) +}) +test('Should accept SampleCollectionMethodID AND SampleCollectionMethodContext', async (t) => { const valid = validate({ SampleCollectionMethodID: true, SampleCollectionMethodContext: true, - }); - assert.equal(valid, false); + }) + assert.equal(valid, false) assert.equal( checkProperty( validate.errors, - "dependencies", - "SampleCollectionMethodContext", + 'dependencies', + 'SampleCollectionMethodContext' ), - false, - ); -}); + false + ) +}) diff --git a/schemas/data/test/transform.js b/schemas/data/test/transform.js index 5f04b093..f088ec28 100644 --- a/schemas/data/test/transform.js +++ b/schemas/data/test/transform.js @@ -1,5 +1,5 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; +import { test } from 'node:test' +import assert from 'node:assert/strict' import validate from '../frontend/index.js' import validateBackend from '../backend/index.js' import validateExtract from '../extract/index.js' @@ -37,7 +37,7 @@ test('Should transform values (frontend)', async (t) => { LaboratorySampleID: '101010011110 ', AnalysisStartDate: '2018-02-23', AnalysisStartTime: '13:15:00', - AnalysisStartTimeZone: '-06:00' + AnalysisStartTimeZone: '-06:00', }) //console.log(valid, JSON.stringify(validate.errors, null, 2)) assert.equal(valid, true) @@ -77,7 +77,7 @@ test('Should transform values (backend)', async (t) => { LaboratorySampleID: '101010011110 ', AnalysisStartDate: '2018-02-23', AnalysisStartTime: '13:15:00', - AnalysisStartTimeZone: '-06:00' + AnalysisStartTimeZone: '-06:00', }) //console.log(valid, JSON.stringify(validateBackend.errors, null, 2)) assert.equal(valid, true) @@ -100,7 +100,8 @@ const crossFlavourFixtures = [ MonitoringLocationVerticalMeasure: 1050, MonitoringLocationVerticalUnit: 'm', MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', - MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalCollectionMethod: + 'GPS Carrier Phase Static Relative Position', MonitoringLocationVerticalAccuracyMeasure: 0.1, MonitoringLocationVerticalAccuracyUnit: 'm', MonitoringLocationType: 'Well', @@ -148,7 +149,8 @@ const crossFlavourFixtures = [ MonitoringLocationVerticalMeasure: 1050, MonitoringLocationVerticalUnit: 'm', MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', - MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalCollectionMethod: + 'GPS Carrier Phase Static Relative Position', MonitoringLocationVerticalAccuracyMeasure: 0.1, MonitoringLocationVerticalAccuracyUnit: 'm', MonitoringLocationType: 'Well', @@ -178,7 +180,8 @@ const crossFlavourFixtures = [ ActivityDepthAltitudeReferencePointUnit: 'm', SampleCollectionMethodID: 'D4448-01', SampleCollectionMethodContext: 'ASTM', - SampleCollectionMethodName: 'Standard guide for sampling ground-water monitoring wells', + SampleCollectionMethodName: + 'Standard guide for sampling ground-water monitoring wells', SampleCondition: 'Static, before pumping or purging', CharacteristicName: 'Chloride', ResultSampleFraction: 'Dissolved', @@ -229,7 +232,8 @@ const crossFlavourFixtures = [ WellDepthUnit: 'm', SampleCollectionMethodID: 'D4448-01', SampleCollectionMethodContext: 'ASTM', - SampleCollectionMethodName: 'Standard guide for sampling ground-water monitoring wells', + SampleCollectionMethodName: + 'Standard guide for sampling ground-water monitoring wells', ActivityType: 'Field Msr/Obs', ActivityMediaName: 'Groundwater', ActivityStartDate: '2026-01-15', @@ -254,7 +258,8 @@ const crossFlavourFixtures = [ MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', MonitoringLocationVerticalMeasure: 1500, MonitoringLocationVerticalUnit: 'm', - MonitoringLocationVerticalCollectionMethod: 'GPS Carrier Phase Static Relative Position', + MonitoringLocationVerticalCollectionMethod: + 'GPS Carrier Phase Static Relative Position', MonitoringLocationVerticalCoordinateReferenceSystem: 'CGVD2013', MonitoringLocationType: 'Well', WellUseType: 'Domestic', @@ -308,7 +313,7 @@ const negativeFixtures = [ { name: 'WellID exceeding maxLength', mutate: (d) => { - d.WellID = 'x'.repeat(56); + d.WellID = 'x'.repeat(56) d.WellIDContext = 'AB' }, }, @@ -322,8 +327,8 @@ const negativeFixtures = [ for (const { name, mutate } of negativeFixtures) { const build = () => { - const d = structuredClone(baseline); - mutate(d); + const d = structuredClone(baseline) + mutate(d) return d } test(`frontend rejects ${name}`, async () => { From 3918c49b1a49774068120d1393222a026167c640 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 26 Jun 2026 14:53:46 -0400 Subject: [PATCH 40/51] build: enable lint-staged prettier pre-commit hook --- lint-staged.config.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lint-staged.config.js b/lint-staged.config.js index aee44033..dddc0ec4 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,6 @@ export default { - '**/*.js': ['prettier --write', 'standard --fix'], - '**/*.json': ['prettier --write'] + '**/*.js': ['prettier --write'], + '**/*.json': ['prettier --write'], // https://medium.com/slalom-build/pre-commit-hooks-for-terraform-9356ee6db882 // '**/*.tf': [ // 'terraform fmt -recursive -write', diff --git a/package.json b/package.json index 196a881f..0eec49e4 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "prepare": "husky", "commit-msg": "commitlint --config commitlint.config.cjs --edit", - "pre-commit": "", + "pre-commit": "lint-staged", "lint": "npm run lint:js && npm run lint:tf", "lint:js": "prettier --write **/*.{js,json} && standard --fix **/*.js", "lint:tf": "terraform fmt -recursive -write", From d2efd953936bd61ea6b605379f4b12541d6ebdca Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Mon, 29 Jun 2026 16:10:30 -0400 Subject: [PATCH 41/51] chore: rc version bump --- CHANGELOG.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- schemas/data/package-lock.json | 4 ++-- schemas/data/package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b80e11b8..a260be29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. ### Added -- **Groundwater media** — `Groundwater` added to `ActivityMediaName`, plus 24 new Groundwater-related fields covering well identification, aquifer attributes, well construction depths, sample-collection method, and depth-altitude reference: +- **Groundwater media** — `Groundwater` added to `ActivityMediaName`, plus new Groundwater-related fields covering well identification, aquifer attributes, well construction depths, sample-collection method, and depth-altitude reference: - `MonitoringLocationVerticalAccuracyMeasure`, `MonitoringLocationVerticalAccuracyUnit`, `MonitoringLocationVerticalCollectionMethod`, `MonitoringLocationVerticalCoordinateReferenceSystem` - `WellID`, `WellIDContext`, `WellUseType` - `AquiferCode`, `AquiferUnitName`, `AquiferType`, `AquiferUnitPorosityType`, `LithologyType` @@ -33,7 +33,7 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` - **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. No conditional logic or validation checks beyond the standard single-line string pattern. - **`ResultStatusID` deprecation warning** — new quality-control warning `ResultStatusID-Deprecated`: `Final` and `Accepted` are flagged as no longer recommended (use `Preliminary`, `Provisional`, or `Validated`). The values remain valid in the enum; the warning does not block submission. -- **Q2 2026 WQX update** (`wqx` `3.0.267` → `3.0.276`): new values across `CharacteristicName`, `ActivityType`, `ResultAnalyticalMethodContext`, and `SampleCollectionEquipmentName`. +- **Q2 2026 WQX update** (`wqx` `3.0.260` → `3.0.276`): new values across `CharacteristicName`, `ActivityType`, `ResultAnalyticalMethodContext`, and `SampleCollectionEquipmentName`. ### Changed diff --git a/package-lock.json b/package-lock.json index abc811f1..29468305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index 0eec49e4..beecf4bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "description": "DataStream Water Quality Exchange (WQX): JSON Schema and JSON Table Schema for DataStream", "private": true, "type": "module", diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index ecbcc09b..abbb3a30 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "license": "MIT", "dependencies": { "wqx": "3.0.276" diff --git a/schemas/data/package.json b/schemas/data/package.json index 82e4565b..1d6c3495 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -1,6 +1,6 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "description": "DataStream Water Quality Data Schema", "publishConfig": { "cache": "~/.npm", From 6211435c777e73ef98cf33706bb6c1963c0c4364 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 7 Jul 2026 15:06:12 -0400 Subject: [PATCH 42/51] fix(locales): de-duplicate wrapped value blocks and guard build-locales MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five locale files (ResultAnalyticalMethodContext, ResultSampleFraction, MonitoringLocationType, MonitoringLocationHorizontalCoordinateReferenceSystem, ResultStatusID) each held their data twice — once under a top-level wrapper key and once flat. A wrapped file left build-locales.js with no top-level `values`, so its `??=` fill appended a fresh flat block on every build. Collapse each back to a single flat name/description/values structure, preserving the human translations and current enum membership. Harden build-locales.js with a two-phase, fail-fast pass: load and validate every file (rejecting any unexpected top-level key) before writing any, so a malformed file aborts the build instead of silently duplicating — and can never truncate a good file via a mid-run throw. --- schemas/data/bin/build-locales.js | 41 +- ...onHorizontalCoordinateReferenceSystem.json | 224 +------ .../src/locales/MonitoringLocationType.json | 290 ++------- .../ResultAnalyticalMethodContext.json | 438 +------------- .../src/locales/ResultSampleFraction.json | 554 +++--------------- schemas/data/src/locales/ResultStatusID.json | 110 +--- 6 files changed, 220 insertions(+), 1437 deletions(-) diff --git a/schemas/data/bin/build-locales.js b/schemas/data/bin/build-locales.js index 40fc6e25..88b62ee6 100644 --- a/schemas/data/bin/build-locales.js +++ b/schemas/data/bin/build-locales.js @@ -1,7 +1,6 @@ import { readFile, writeFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { subset, sort } from "./build-lib.js"; const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -35,16 +34,38 @@ const columns = [ //"MeasurementUnit", ]; -const setup = async (column) => { +const load = async (column) => { const locales = await readFile( join(__dirname, `../src/locales/${column}.json`) ) .then((res) => JSON.parse(res)) - .catch((e) => ({})); + .catch(() => ({})); const allowedValues = await readFile( join(__dirname, `../src/values/${column}.primary.json`) ).then((res) => JSON.parse(res)); + return { column, locales, allowedValues }; +}; + +// A valid locale file is flat with only these top-level keys. Any other key +// (e.g. the file nested under a "${column}" wrapper) means the file is malformed; +// building it would silently append a duplicate flat block via the `??=` in +// write(). Returns an error string or null. +// TODO: tighten this into a full schema check with ajv +const validate = ({ column, locales }) => { + const unexpected = Object.keys(locales).filter( + (key) => !["name", "description", "values"].includes(key) + ); + if (unexpected.length) { + return ( + `src/locales/${column}.json has unexpected top-level key(s): ${unexpected.join(", ")}. ` + + `Expected only "name", "description", "values" — the file is likely wrapped under a ` + + `"${column}" key. Un-nest it before rebuilding.` + ); + } + return null; +}; +const write = async ({ column, locales, allowedValues }) => { locales.name ??= { en: column, fr: null }; locales.description ??= { en: null, fr: null }; locales.values ??= {}; @@ -74,4 +95,16 @@ const setup = async (column) => { ); }; -await Promise.all(columns.map((column) => setup(column))); +// Two-phase, fail-fast: load and validate EVERY file before writing ANY of them. +// A single malformed file aborts the whole build with no writes, so a bad file +// can never truncate a good one via a mid-run throw during concurrent writes. +const loaded = await Promise.all(columns.map(load)); +const errors = loaded.map(validate).filter(Boolean); +if (errors.length) { + throw new Error( + `Locale validation failed — no files were written:\n${errors + .map((error) => ` - ${error}`) + .join("\n")}` + ); +} +await Promise.all(loaded.map(write)); diff --git a/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json b/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json index 653d655d..dc032736 100644 --- a/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json +++ b/schemas/data/src/locales/MonitoringLocationHorizontalCoordinateReferenceSystem.json @@ -1,193 +1,11 @@ { - "MonitoringLocationHorizontalCoordinateReferenceSystem": { - "name": { - "en": "Monitoring Location Horizontal Coordinate Reference System", - "fr": null - }, - "description": { - "en": "The horizontal datum of the MonitoringLocationLatitude and MonitoringLocationLongitude coordinates (e.g. NAD83, WGS84).", - "fr": "Le système de référence horizontale des coordonnées MonitoringLocationLatitude et MonitoringLocationLongitude (par exemple NAD83, WGS84)." - }, - "values": { - "AMSMA": { - "name": { - "en": "AMSMA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ASTRO": { - "name": { - "en": "ASTRO", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "GUAM": { - "name": { - "en": "GUAM", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HARN": { - "name": { - "en": "HARN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "JHNSN": { - "name": { - "en": "JHNSN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "NAD27": { - "name": { - "en": "NAD27", - "fr": null - }, - "description": { - "en": "North American Datum 1927", - "fr": "Système de référence nord-américain de 1927" - } - }, - "NAD83": { - "name": { - "en": "NAD83", - "fr": null - }, - "description": { - "en": "North American Datum 1983", - "fr": "Système de référence nord-américain de 1983" - } - }, - "OLDHI": { - "name": { - "en": "OLDHI", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "OTHER": { - "name": { - "en": "OTHER", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "PR": { - "name": { - "en": "PR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "SGEOR": { - "name": { - "en": "SGEOR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "SLAWR": { - "name": { - "en": "SLAWR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "SPAUL": { - "name": { - "en": "SPAUL", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "UNKWN": { - "name": { - "en": "UNKWN", - "fr": null - }, - "description": { - "en": "Unknown", - "fr": "Incertain" - } - }, - "WAKE": { - "name": { - "en": "WAKE", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "WGS72": { - "name": { - "en": "WGS72", - "fr": null - }, - "description": { - "en": "World Geodetic System 1972", - "fr": "Système géodésique mondial de 1972" - } - }, - "WGS84": { - "name": { - "en": "WGS84", - "fr": null - }, - "description": { - "en": "World Geodetic System 1984", - "fr": "Système géodésique mondial de 1984" - } - } - } - }, "name": { - "en": "MonitoringLocationHorizontalCoordinateReferenceSystem", + "en": "Monitoring Location Horizontal Coordinate Reference System", "fr": null }, "description": { - "en": null, - "fr": null + "en": "The horizontal datum of the MonitoringLocationLatitude and MonitoringLocationLongitude coordinates (e.g. NAD83, WGS84).", + "fr": "Le système de référence horizontale des coordonnées MonitoringLocationLatitude et MonitoringLocationLongitude (par exemple NAD83, WGS84)." }, "values": { "NAD27": { @@ -196,8 +14,8 @@ "fr": null }, "description": { - "en": null, - "fr": null + "en": "North American Datum 1927", + "fr": "Système de référence nord-américain de 1927" } }, "NAD83": { @@ -206,13 +24,13 @@ "fr": null }, "description": { - "en": null, - "fr": null + "en": "North American Datum 1983", + "fr": "Système de référence nord-américain de 1983" } }, - "UNKWN": { + "OTHER": { "name": { - "en": "UNKWN", + "en": "OTHER", "fr": null }, "description": { @@ -220,34 +38,34 @@ "fr": null } }, - "WGS72": { + "UNKWN": { "name": { - "en": "WGS72", + "en": "UNKWN", "fr": null }, "description": { - "en": null, - "fr": null + "en": "Unknown", + "fr": "Incertain" } }, - "WGS84": { + "WGS72": { "name": { - "en": "WGS84", + "en": "WGS72", "fr": null }, "description": { - "en": null, - "fr": null + "en": "World Geodetic System 1972", + "fr": "Système géodésique mondial de 1972" } }, - "OTHER": { + "WGS84": { "name": { - "en": "OTHER", + "en": "WGS84", "fr": null }, "description": { - "en": null, - "fr": null + "en": "World Geodetic System 1984", + "fr": "Système géodésique mondial de 1984" } } } diff --git a/schemas/data/src/locales/MonitoringLocationType.json b/schemas/data/src/locales/MonitoringLocationType.json index 1dd232f8..d0f52462 100644 --- a/schemas/data/src/locales/MonitoringLocationType.json +++ b/schemas/data/src/locales/MonitoringLocationType.json @@ -1,188 +1,26 @@ { - "MonitoringLocationType": { - "name": { - "en": "Monitoring Location Type", - "fr": null - }, - "description": { - "en": "Type of monitoring location. Must be entered exactly as specified in Allowed Values. (e.g. \"River/Stream\").", - "fr": "Type de lieu de surveillance. Doit être saisi en anglais, exactement comme spécifié dans Valeurs autorisées, dans l'onglet Allowed Values. (par exemple « River/Stream » pour rivière/ruisseau)." - }, - "values": { - "Atmosphere": { - "name": { - "en": "Atmosphere", - "fr": "Atmosphère" - }, - "description": { - "en": null, - "fr": null - } - }, - "Canal Drainage": { - "name": { - "en": "Canal Drainage", - "fr": "Drainage de canal" - }, - "description": { - "en": null, - "fr": null - } - }, - "Canal Irrigation": { - "name": { - "en": "Canal Irrigation", - "fr": "Irrigation de canal" - }, - "description": { - "en": null, - "fr": null - } - }, - "Canal Transport": { - "name": { - "en": "Canal Transport", - "fr": "Transport par canal" - }, - "description": { - "en": null, - "fr": null - } - }, - "Estuary": { - "name": { - "en": "Estuary", - "fr": "Estuaire" - }, - "description": { - "en": null, - "fr": null - } - }, - "Great Lake": { - "name": { - "en": "Great Lake", - "fr": "Grand Lac" - }, - "description": { - "en": null, - "fr": null - } - }, - "Lake/Pond": { - "name": { - "en": "Lake/Pond", - "fr": "Lac/Étang" - }, - "description": { - "en": null, - "fr": null - } - }, - "Ocean": { - "name": { - "en": "Ocean", - "fr": "Océan" - }, - "description": { - "en": null, - "fr": null - } - }, - "Pond-Stormwater": { - "name": { - "en": "Pond-Stormwater", - "fr": "Étang - Eaux de ruissellement" - }, - "description": { - "en": null, - "fr": null - } - }, - "Reservoir": { - "name": { - "en": "Reservoir", - "fr": "Réservoir" - }, - "description": { - "en": null, - "fr": null - } - }, - "River/Stream": { - "name": { - "en": "River/Stream", - "fr": "Rivière/Ruisseau" - }, - "description": { - "en": null, - "fr": null - } - }, - "Spring": { - "name": { - "en": "Spring", - "fr": "Source" - }, - "description": { - "en": null, - "fr": null - } - }, - "Storm Sewer": { - "name": { - "en": "Storm Sewer", - "fr": "Égout pluvial" - }, - "description": { - "en": null, - "fr": null - } - }, - "Unspecified": { - "name": { - "en": "Unspecified", - "fr": "Non spécifié" - }, - "description": { - "en": null, - "fr": null - } - }, - "Wetland": { - "name": { - "en": "Wetland", - "fr": "Zone humide" - }, - "description": { - "en": null, - "fr": null - } - } - } - }, "name": { - "en": "MonitoringLocationType", + "en": "Monitoring Location Type", "fr": null }, "description": { - "en": null, - "fr": null + "en": "Type of monitoring location. Must be entered exactly as specified in Allowed Values. (e.g. \"River/Stream\").", + "fr": "Type de lieu de surveillance. Doit être saisi en anglais, exactement comme spécifié dans Valeurs autorisées, dans l'onglet Allowed Values. (par exemple « River/Stream » pour rivière/ruisseau)." }, "values": { "Atmosphere": { "name": { "en": "Atmosphere", - "fr": null + "fr": "Atmosphère" }, "description": { "en": null, "fr": null } }, - "Canal Drainage": { + "Borehole": { "name": { - "en": "Canal Drainage", + "en": "Borehole", "fr": null }, "description": { @@ -190,39 +28,39 @@ "fr": null } }, - "Canal Irrigation": { + "Canal Drainage": { "name": { - "en": "Canal Irrigation", - "fr": null + "en": "Canal Drainage", + "fr": "Drainage de canal" }, "description": { "en": null, "fr": null } }, - "Canal Transport": { + "Canal Irrigation": { "name": { - "en": "Canal Transport", - "fr": null + "en": "Canal Irrigation", + "fr": "Irrigation de canal" }, "description": { "en": null, "fr": null } }, - "Estuary": { + "Canal Transport": { "name": { - "en": "Estuary", - "fr": null + "en": "Canal Transport", + "fr": "Transport par canal" }, "description": { "en": null, "fr": null } }, - "Great Lake": { + "Dug Well": { "name": { - "en": "Great Lake", + "en": "Dug Well", "fr": null }, "description": { @@ -230,39 +68,39 @@ "fr": null } }, - "Lake/Pond": { + "Estuary": { "name": { - "en": "Lake/Pond", - "fr": null + "en": "Estuary", + "fr": "Estuaire" }, "description": { "en": null, "fr": null } }, - "Ocean": { + "Great Lake": { "name": { - "en": "Ocean", - "fr": null + "en": "Great Lake", + "fr": "Grand Lac" }, "description": { "en": null, "fr": null } }, - "Pond-Stormwater": { + "Lake/Pond": { "name": { - "en": "Pond-Stormwater", - "fr": null + "en": "Lake/Pond", + "fr": "Lac/Étang" }, "description": { "en": null, "fr": null } }, - "Reservoir": { + "Multilevel Well": { "name": { - "en": "Reservoir", + "en": "Multilevel Well", "fr": null }, "description": { @@ -270,9 +108,9 @@ "fr": null } }, - "River/Stream": { + "Nested Well": { "name": { - "en": "River/Stream", + "en": "Nested Well", "fr": null }, "description": { @@ -280,19 +118,19 @@ "fr": null } }, - "Spring": { + "Ocean": { "name": { - "en": "Spring", - "fr": null + "en": "Ocean", + "fr": "Océan" }, "description": { "en": null, "fr": null } }, - "Storm Sewer": { + "Other-Ground Water": { "name": { - "en": "Storm Sewer", + "en": "Other-Ground Water", "fr": null }, "description": { @@ -300,9 +138,9 @@ "fr": null } }, - "Unspecified": { + "Piezometer": { "name": { - "en": "Unspecified", + "en": "Piezometer", "fr": null }, "description": { @@ -310,39 +148,39 @@ "fr": null } }, - "Wetland": { + "Pond-Stormwater": { "name": { - "en": "Wetland", - "fr": null + "en": "Pond-Stormwater", + "fr": "Étang - Eaux de ruissellement" }, "description": { "en": null, "fr": null } }, - "Borehole": { + "Reservoir": { "name": { - "en": "Borehole", - "fr": null + "en": "Reservoir", + "fr": "Réservoir" }, "description": { "en": null, "fr": null } }, - "Dug Well": { + "River/Stream": { "name": { - "en": "Dug Well", - "fr": null + "en": "River/Stream", + "fr": "Rivière/Ruisseau" }, "description": { "en": null, "fr": null } }, - "Multilevel Well": { + "Seep": { "name": { - "en": "Multilevel Well", + "en": "Seep", "fr": null }, "description": { @@ -350,29 +188,29 @@ "fr": null } }, - "Nested Well": { + "Spring": { "name": { - "en": "Nested Well", - "fr": null + "en": "Spring", + "fr": "Source" }, "description": { "en": null, "fr": null } }, - "Other-Ground Water": { + "Storm Sewer": { "name": { - "en": "Other-Ground Water", - "fr": null + "en": "Storm Sewer", + "fr": "Égout pluvial" }, "description": { "en": null, "fr": null } }, - "Piezometer": { + "Sump": { "name": { - "en": "Piezometer", + "en": "Sump", "fr": null }, "description": { @@ -380,19 +218,19 @@ "fr": null } }, - "Seep": { + "Unspecified": { "name": { - "en": "Seep", - "fr": null + "en": "Unspecified", + "fr": "Non spécifié" }, "description": { "en": null, "fr": null } }, - "Sump": { + "Well": { "name": { - "en": "Sump", + "en": "Well", "fr": null }, "description": { @@ -400,10 +238,10 @@ "fr": null } }, - "Well": { + "Wetland": { "name": { - "en": "Well", - "fr": null + "en": "Wetland", + "fr": "Zone humide" }, "description": { "en": null, diff --git a/schemas/data/src/locales/ResultAnalyticalMethodContext.json b/schemas/data/src/locales/ResultAnalyticalMethodContext.json index 9b5fab04..2fc51e1f 100644 --- a/schemas/data/src/locales/ResultAnalyticalMethodContext.json +++ b/schemas/data/src/locales/ResultAnalyticalMethodContext.json @@ -1,443 +1,11 @@ { - "ResultAnalyticalMethodContext": { - "name": { - "en": "Result Analytical Method Context", - "fr": null - }, - "description": { - "en": "Publisher of ResultAnalyticalMethodID.\r\n\r\nFor field data: Manufacturer, brand or publisher of field test or equipment used to collect measurements. \r\n\r\nFor laboratory analyzed data: Publisher of method ID code. For more informaton, see Reporting analytical methods on DataStream's Learning Centre. \r\n\r\nRequired if ResultAnalyticalMethodID is populated.", - "fr": "Diffuseur de ResultAnalyticalMethodID.\r\n\r\nPour les données sur le terrain : Fabricant, marque ou diffuseur du test de terrain ou de l’équipement utilisé pour prélever les mesures. \r\n\r\nPour les données analysées en laboratoire : Diffuseur du code d’identification de la méthode. Pour plus d’information, voir Entrer les méthodes d’analyse dans le Centre d’apprentissage de DataStream. \r\n\r\nObligatoire si le champ ResultAnalyticalMethodID est rempli. \r\n" - }, - "values": { - "AOAC": { - "name": { - "en": "AOAC", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA": { - "name": { - "en": "APHA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM20ED": { - "name": { - "en": "APHA_SM20ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM21ED": { - "name": { - "en": "APHA_SM21ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM22ED": { - "name": { - "en": "APHA_SM22ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM23ED": { - "name": { - "en": "APHA_SM23ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "APHA_SM24ED": { - "name": { - "en": "APHA_SM24ED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ASTM": { - "name": { - "en": "ASTM", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "BC_MOE": { - "name": { - "en": "BC_MOE", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "CSSS": { - "name": { - "en": "CSSS", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "DIN": { - "name": { - "en": "DIN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "DOI": { - "name": { - "en": "DOI", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "EN": { - "name": { - "en": "EN", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ENV/CANADA": { - "name": { - "en": "ENV/CANADA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ENVIROLOGIX": { - "name": { - "en": "ENVIROLOGIX", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HACH": { - "name": { - "en": "HACH", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HANNA": { - "name": { - "en": "HANNA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "HOBO": { - "name": { - "en": "HOBO", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Hydrolab": { - "name": { - "en": "Hydrolab", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "IDEXX": { - "name": { - "en": "IDEXX", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ISO": { - "name": { - "en": "ISO", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "LACHAT": { - "name": { - "en": "LACHAT", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "LaMOTTE": { - "name": { - "en": "LaMOTTE", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "METER Group": { - "name": { - "en": "METER Group", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "MICROLOGY LABS": { - "name": { - "en": "MICROLOGY LABS", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Oakton": { - "name": { - "en": "Oakton", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "ON MECP": { - "name": { - "en": "ON MECP", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Oxyguard": { - "name": { - "en": "Oxyguard", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "PALINTEST LTD": { - "name": { - "en": "PALINTEST LTD", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "PROPRIETARY": { - "name": { - "en": "PROPRIETARY", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "REED": { - "name": { - "en": "REED", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "RBR": { - "name": { - "en": "RBR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Seal": { - "name": { - "en": "Seal", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Solinst": { - "name": { - "en": "Solinst", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "SSSA": { - "name": { - "en": "SSSA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "THERMO-SCIENTIFIC": { - "name": { - "en": "THERMO-SCIENTIFIC", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Turner Designs": { - "name": { - "en": "Turner Designs", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "USDA/SSIR": { - "name": { - "en": "USDA/SSIR", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "USDOI/USGS": { - "name": { - "en": "USDOI/USGS", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "USEPA": { - "name": { - "en": "USEPA", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "VMV": { - "name": { - "en": "VMV", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "YSI": { - "name": { - "en": "YSI", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - } - } - }, "name": { - "en": "ResultAnalyticalMethodContext", + "en": "Result Analytical Method Context", "fr": null }, "description": { - "en": null, - "fr": null + "en": "Publisher of ResultAnalyticalMethodID.\r\n\r\nFor field data: Manufacturer, brand or publisher of field test or equipment used to collect measurements. \r\n\r\nFor laboratory analyzed data: Publisher of method ID code. For more informaton, see Reporting analytical methods on DataStream's Learning Centre. \r\n\r\nRequired if ResultAnalyticalMethodID is populated.", + "fr": "Diffuseur de ResultAnalyticalMethodID.\r\n\r\nPour les données sur le terrain : Fabricant, marque ou diffuseur du test de terrain ou de l’équipement utilisé pour prélever les mesures. \r\n\r\nPour les données analysées en laboratoire : Diffuseur du code d’identification de la méthode. Pour plus d’information, voir Entrer les méthodes d’analyse dans le Centre d’apprentissage de DataStream. \r\n\r\nObligatoire si le champ ResultAnalyticalMethodID est rempli. \r\n" }, "values": { "AOAC": { diff --git a/schemas/data/src/locales/ResultSampleFraction.json b/schemas/data/src/locales/ResultSampleFraction.json index 748094a6..ba4d4cbb 100644 --- a/schemas/data/src/locales/ResultSampleFraction.json +++ b/schemas/data/src/locales/ResultSampleFraction.json @@ -1,449 +1,67 @@ { - "ResultSampleFraction": { - "name": { - "en": "Result Sample Fraction", - "fr": "Fraction d’échantillon" - }, - "description": { - "en": "The portion of the characteristic being analyzed. Metals are typically reported as \"Total\" or \"Dissolved\", while nutrients are typically reported as \"Filtered\" or \"Unfiltered\". Required for certain characteristics (see CharacteristicName LOOKUP tab). \r\n\r\nFor details on reporting sample fractions for metals and nutrients, see our guidance documents in the Learning Centre.", - "fr": "La partie de la caractéristique qui est analysée. Les métaux sont généralement signalés comme « Total » (totaux) ou « Dissolved » (dissous), tandis que les nutriments sont généralement signalés comme « Filtered » (filtrés) ou « Unfiltered » (non filtrés). Obligatoire pour certaines caractéristiques (voir l'onglet CharacteristicName LOOKUP). \r\n\r\nPour plus de détails sur la manière de signaler les fractions d’échantillon relatives aux métaux et aux nutriments, voir nos documents-guides dans le Centre d’apprentissage." - }, - "values": { - "Acid Soluble": { - "name": { - "en": "Acid Soluble", - "fr": "Soluble dans l'acide" - }, - "description": { - "en": "Portion of the analyte that becomes dissolved within the sample following treatment with an appropriate acid.", - "fr": "Partie de l’analyte qui se dissout dans l’échantillon après traitement au moyen d’un acide approprié." - } - }, - "Bioavailable": { - "name": { - "en": "Bioavailable", - "fr": "Biodisponible" - }, - "description": { - "en": "Portion of the analyte that can be absorbed by a specific tissue or organ.", - "fr": "Partie de l’analyte qui peut être absorbée par un tissu ou un organe spécifique." - } - }, - "Comb Available": { - "name": { - "en": "Comb Available", - "fr": "Peigne disponible" - }, - "description": { - "en": "Portion of the analyte or other analyte derivatives which is combined with other derivatives yet is still available to oxidize organic matter.", - "fr": "Partie de l’analyte ou d’autres dérivés de l’analyte qui est combinée à d’autres dérivés mais qui reste disponible pour oxyder la matière organique." - } - }, - "Dissolved": { - "name": { - "en": "Dissolved", - "fr": "Dissous" - }, - "description": { - "en": "Portion of the analyte found in the liquid medium, which cannot be removed by filtration. Filter pore size should be indicated in the ResultComment field if it is different than 0.45 µm. DataStream uses this term for metal-series analytes and other non-nutrients to indicate that the water sample was filtered. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte qui se trouve dans le milieu liquide et qui ne peut pas être éliminée par filtration. La taille des pores du filtre doit être indiquée dans le champ ResultComment si elle est différente de 0,45 µm. DataStream utilise ce terme pour les analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer que l’échantillon d’eau a été filtré. Voir le guide approprié sur datastream.org." - } - }, - "Extractable": { - "name": { - "en": "Extractable", - "fr": "Extractible" - }, - "description": { - "en": "Portion of an analyte that is solubilized from unfiltered water samples or solid samples (e.g., sediment), using a weaker or partial digestion. Applies to unfiltered samples reported by the laboratory as “Acid soluble”. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to weak or partial digestion. See relevant guidance on datastream.org.", - "fr": "Partie d’un analyte qui est solubilisé à partir d’échantillons d’eau non filtrée ou d’échantillons solides (p.ex. sédiment), à l’aide d’une digestion plus faible ou partielle. S’applique aux échantillons non filtrés signalés par le laboratoire comme étant « solubles dans l’acide ». DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion faible ou partielle. Voir le guide approprié sur datastream.org." - } - }, - "Extractable, CaCO3-bound": { - "name": { - "en": "Extractable, CaCO3-bound", - "fr": "Extractibles, liée au CaCO3" - }, - "description": { - "en": null, - "fr": null - } - }, - "Extractable, exchangeable": { - "name": { - "en": "Extractable, exchangeable", - "fr": "Extractible, échangeable" - }, - "description": { - "en": null, - "fr": null - } - }, - "Extractable, organic-bnd": { - "name": { - "en": "Extractable, organic-bnd", - "fr": "Extractibles, lies à l’organique" - }, - "description": { - "en": null, - "fr": null - } - }, - "Extractable, other": { - "name": { - "en": "Extractable, other", - "fr": "Extractible, autre" - }, - "description": { - "en": null, - "fr": null - } - }, - "Extractable, oxide-bound": { - "name": { - "en": "Extractable, oxide-bound", - "fr": "Extractibles, liée à l’oxyde" - }, - "description": { - "en": null, - "fr": null - } - }, - "Extractable, residual": { - "name": { - "en": "Extractable, residual", - "fr": "Extractible, résiduelle" - }, - "description": { - "en": null, - "fr": null - } - }, - "Filter/sieve residue": { - "name": { - "en": "Filter/sieve residue", - "fr": "Résidus de filtre/de tamis" - }, - "description": { - "en": null, - "fr": null - } - }, - "Filterable": { - "name": { - "en": "Filterable", - "fr": "Filtrable" - }, - "description": { - "en": "Portion of the analyte that is in or absorbed to material which passes through the filter during sample filtration.", - "fr": "Partie de l’analyte qui est dans le matériau ou absorbée par le matériau qui passe à travers le filtre lors de la filtration de l’échantillon." - } - }, - "Filtered": { - "name": { - "en": "Filtered", - "fr": "Filtré" - }, - "description": { - "en": "Portion of the analyte measured as the aqueous form through filtration (filtering location unknown). Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration (lieu de filtration inconnu). Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute). Voir le guide approprié sur datastream.org." - } - }, - "Filtered, field": { - "name": { - "en": "Filtered, field", - "fr": "Filtré, terrain" - }, - "description": { - "en": "Portion of the analyte measured as the aqueous form through field filtration. Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration sur le terrain. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute). Voir le guide approprié sur datastream.org." - } - }, - "Filtered, lab": { - "name": { - "en": "Filtered, lab", - "fr": "Filtré, lab" - }, - "description": { - "en": "Portion of the analyte measured as the aqueous form through lab filtration. Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration en laboratoire. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute)." - } - }, - "Fixed": { - "name": { - "en": "Fixed", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Free Available": { - "name": { - "en": "Free Available", - "fr": "Libre disponible" - }, - "description": { - "en": "Portion of the residual analyte present and not combined with any substance or in other less readily available form.", - "fr": "Partie de l’analyte résiduel présente et non combinée à une substance ou sous une autre forme moins aisément disponible." - } - }, - "Inorganic": { - "name": { - "en": "Inorganic", - "fr": "Inorganique" - }, - "description": { - "en": "Portion of the analyte containing inorganic content.", - "fr": "Partie de la substance à analyser contenant des éléments inorganiques." - } - }, - "Non-Filterable (Particle)": { - "name": { - "en": "Non-Filterable (Particle)", - "fr": "Non filtrable (Particule)" - }, - "description": { - "en": "Portion of the analyte that is particulate and does not pass through filter. Used with nutrient data in DataStream when reported as \"Particulate\" fraction. See relevant guidance on datastream.org.", - "fr": "Partie de la substance à analyser qui est particulaire et ne passe pas à travers le filtre. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Particulate » (particulaire). Voir le guide approprié sur datastream.org." - } - }, - "non-linear function": { - "name": { - "en": "non-linear function", - "fr": "fonction non linéaire" - }, - "description": { - "en": null, - "fr": null - } - }, - "Non-settleable": { - "name": { - "en": "Non-settleable", - "fr": "Non réglable" - }, - "description": { - "en": "Portion of the analyte that is in/absorbed to particles remaining in suspension after a settling process.", - "fr": "Portion de l'analyte qui est dans/absorbée par les particules restant en suspension après un processus de décantation." - } - }, - "Non-volatile": { - "name": { - "en": "Non-volatile", - "fr": "Non volatile" - }, - "description": { - "en": "Portion of the analyte that is in a liquid or solid state under normal temperature and pressure.", - "fr": "Partie de la substance à analyser qui se trouve à l’état liquide ou solide à une température et une pression normales." - } - }, - "Organic": { - "name": { - "en": "Organic", - "fr": "Organique" - }, - "description": { - "en": "Portion of the analyte in organic forms.", - "fr": "Partie de la substance à analyser sous forme organique." - } - }, - "Pot. Dissolved": { - "name": { - "en": "Pot. Dissolved", - "fr": "Pot. Dissous" - }, - "description": { - "en": "Portion of the analyte measured from the filtrate of a water sample that was treated with nitric acid prior to filtration. Samples solubilized with nitric acid reported as “Acid soluble” can be assigned the fraction “Pot. Dissolved”. Filter pore size should be indicated in the ResultComment if it is different than 0.45 µm. DataStream uses this term for metal-series analytes and other non-nutrients to indicate that the water sample was filtered. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte mesurée à partir du filtrat d’un échantillon d’eau qui a été traité avec de l’acide nitrique avant d’être filtré. Les échantillons solubilisés avec de l’acide nitrique et signalés comme « Acid soluble » (solubles dans l’acide) peuvent se voir attribuer la fraction « Pot. Dissolved » (Pot. dissous). La taille des pores du filtre doit être indiquée dans ResultComment si elle est différente de 0,45 µm. DataStream utilise ce terme pour les analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer que l’échantillon d’eau a été filtré. Voir le guide approprié sur datastream.org." - } - }, - "Settleable": { - "name": { - "en": "Settleable", - "fr": "Réglable" - }, - "description": { - "en": "Portion of the analyte found in/absorbed to the part of the sample which has settled (fallen out of suspension) to the bottom of the sample container.", - "fr": "Portion de l'analyte trouvée dans/absorbée par la partie de l'échantillon qui s'est déposée (tombée en suspension) au fond du récipient d'échantillon." - } - }, - "Sieved": { - "name": { - "en": "Sieved", - "fr": "Tamisé" - }, - "description": { - "en": null, - "fr": null - } - }, - "Supernate": { - "name": { - "en": "Supernate", - "fr": "Surnageant" - }, - "description": { - "en": "Portion of the analyte found in the liquid layer above a precipitate produced from the sample.", - "fr": "Partie de l’analyte trouvée dans la couche liquide au-dessus d’un précipité produit à partir de l’échantillon." - } - }, - "Suspended": { - "name": { - "en": "Suspended", - "fr": "En suspension" - }, - "description": { - "en": "Portion of the analyte suspended in the sampled medium, either as- or adsorbed to- particles that has been physically separated before analysis. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to weak or partial digestion. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte en suspension dans le milieu échantillonné, sous forme de particules- ou absorbée sur celles-ci-, qui a été physiquement séparée avant l’analyse. DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion faible ou partielle. Voir le guide approprié sur datastream.org." - } - }, - "Total": { - "name": { - "en": "Total", - "fr": "Totale" - }, - "description": { - "en": "Portion of the analyte representing the total of all fractions in an unfiltered water sample, or a sediment sample, obtained by a strong digestion that produces a concentration value that can be assumed to be representative of the entirety of the analyte in the sample. Applies to unfiltered samples reported by the laboratory as \"Total\" or “Total recoverable”. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to strong digestion. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte représentant le total de toutes les fractions dans un échantillon d’eau non filtré ou un échantillon de sédiments, obtenu par une forte digestion qui produit une valeur de concentration que l’on peut supposer représentative de la totalité de l’analyte dans l’échantillon. S’applique aux échantillons non filtrés signalés par le laboratoire comme étant « Total » ou « Total recoverable » (Total récupérables). DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion forte. Voir le guide approprié sur datastream.org." - } - }, - "Total Recoverable": { - "name": { - "en": "Total Recoverable", - "fr": "Total récupérable" - }, - "description": { - "en": "Portion of the analyte available in an unfiltered sample following solubilization.", - "fr": "Partie de l’analyte disponible dans un échantillon non filtré après solubilisation." - } - }, - "Total Residual": { - "name": { - "en": "Total Residual", - "fr": "Total résiduel" - }, - "description": { - "en": "Portion of the analyte remaining after a given contact time. The sum of the combined available residual analyte and the free available residual analyte.", - "fr": "Partie de l’analyte restant après un temps de contact donné. La somme de l'analyte résiduel disponible et de l'analyte résiduel libre." - } - }, - "Unfiltered": { - "name": { - "en": "Unfiltered", - "fr": "Non filtré" - }, - "description": { - "en": "Portion of the analyte containing aqueous and particulate fractions. Used with nutrient data in DataStream when reported as \"Total\" fraction. See relevant guidance on datastream.org.", - "fr": "Partie de l’analyte contenant des fractions aqueuses et particulaires. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Total » (totale). Voir le guide approprié sur datastream.org." - } - }, - "Unspecified": { - "name": { - "en": "Unspecified", - "fr": "Non spécifié" - }, - "description": { - "en": null, - "fr": null - } - }, - "Vapor": { - "name": { - "en": "Vapor", - "fr": "Vapeur" - }, - "description": { - "en": "Portion of the analyte that exists in a gaseous state and that under ordinary conditions is liquid or solid.", - "fr": "Partie de l’analyte qui existe à l’état gazeux et qui, dans des conditions normales, est liquide ou solide." - } - }, - "Volatile": { - "name": { - "en": "Volatile", - "fr": "Volatile" - }, - "description": { - "en": "Portion of the analyte that evaporates readily at normal temperature and pressure.", - "fr": "Partie de l’analyte qui s’évapore facilement à une température et une pression normales." - } - }, - "Field": { - "name": { - "en": "Field", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - } - } - }, "name": { - "en": "ResultSampleFraction", - "fr": null + "en": "Result Sample Fraction", + "fr": "Fraction d’échantillon" }, "description": { - "en": null, - "fr": null + "en": "The portion of the characteristic being analyzed. Metals are typically reported as \"Total\" or \"Dissolved\", while nutrients are typically reported as \"Filtered\" or \"Unfiltered\". Required for certain characteristics (see CharacteristicName LOOKUP tab). \r\n\r\nFor details on reporting sample fractions for metals and nutrients, see our guidance documents in the Learning Centre.", + "fr": "La partie de la caractéristique qui est analysée. Les métaux sont généralement signalés comme « Total » (totaux) ou « Dissolved » (dissous), tandis que les nutriments sont généralement signalés comme « Filtered » (filtrés) ou « Unfiltered » (non filtrés). Obligatoire pour certaines caractéristiques (voir l'onglet CharacteristicName LOOKUP). \r\n\r\nPour plus de détails sur la manière de signaler les fractions d’échantillon relatives aux métaux et aux nutriments, voir nos documents-guides dans le Centre d’apprentissage." }, "values": { "Acid Soluble": { "name": { "en": "Acid Soluble", - "fr": null + "fr": "Soluble dans l'acide" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that becomes dissolved within the sample following treatment with an appropriate acid.", + "fr": "Partie de l’analyte qui se dissout dans l’échantillon après traitement au moyen d’un acide approprié." } }, "Bioavailable": { "name": { "en": "Bioavailable", - "fr": null + "fr": "Biodisponible" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that can be absorbed by a specific tissue or organ.", + "fr": "Partie de l’analyte qui peut être absorbée par un tissu ou un organe spécifique." } }, "Comb Available": { "name": { "en": "Comb Available", - "fr": null + "fr": "Peigne disponible" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte or other analyte derivatives which is combined with other derivatives yet is still available to oxidize organic matter.", + "fr": "Partie de l’analyte ou d’autres dérivés de l’analyte qui est combinée à d’autres dérivés mais qui reste disponible pour oxyder la matière organique." } }, "Dissolved": { "name": { "en": "Dissolved", - "fr": null + "fr": "Dissous" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte found in the liquid medium, which cannot be removed by filtration. Filter pore size should be indicated in the ResultComment field if it is different than 0.45 µm. DataStream uses this term for metal-series analytes and other non-nutrients to indicate that the water sample was filtered. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte qui se trouve dans le milieu liquide et qui ne peut pas être éliminée par filtration. La taille des pores du filtre doit être indiquée dans le champ ResultComment si elle est différente de 0,45 µm. DataStream utilise ce terme pour les analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer que l’échantillon d’eau a été filtré. Voir le guide approprié sur datastream.org." } }, "Extractable": { "name": { "en": "Extractable", - "fr": null + "fr": "Extractible" }, "description": { - "en": null, - "fr": null + "en": "Portion of an analyte that is solubilized from unfiltered water samples or solid samples (e.g., sediment), using a weaker or partial digestion. Applies to unfiltered samples reported by the laboratory as “Acid soluble”. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to weak or partial digestion. See relevant guidance on datastream.org.", + "fr": "Partie d’un analyte qui est solubilisé à partir d’échantillons d’eau non filtrée ou d’échantillons solides (p.ex. sédiment), à l’aide d’une digestion plus faible ou partielle. S’applique aux échantillons non filtrés signalés par le laboratoire comme étant « solubles dans l’acide ». DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion faible ou partielle. Voir le guide approprié sur datastream.org." } }, "Extractable, CaCO3-bound": { "name": { "en": "Extractable, CaCO3-bound", - "fr": null + "fr": "Extractibles, liée au CaCO3" }, "description": { "en": null, @@ -453,7 +71,7 @@ "Extractable, exchangeable": { "name": { "en": "Extractable, exchangeable", - "fr": null + "fr": "Extractible, échangeable" }, "description": { "en": null, @@ -463,7 +81,7 @@ "Extractable, organic-bnd": { "name": { "en": "Extractable, organic-bnd", - "fr": null + "fr": "Extractibles, lies à l’organique" }, "description": { "en": null, @@ -473,7 +91,7 @@ "Extractable, other": { "name": { "en": "Extractable, other", - "fr": null + "fr": "Extractible, autre" }, "description": { "en": null, @@ -483,7 +101,7 @@ "Extractable, oxide-bound": { "name": { "en": "Extractable, oxide-bound", - "fr": null + "fr": "Extractibles, liée à l’oxyde" }, "description": { "en": null, @@ -493,7 +111,7 @@ "Extractable, residual": { "name": { "en": "Extractable, residual", - "fr": null + "fr": "Extractible, résiduelle" }, "description": { "en": null, @@ -503,187 +121,187 @@ "Filterable": { "name": { "en": "Filterable", - "fr": null + "fr": "Filtrable" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that is in or absorbed to material which passes through the filter during sample filtration.", + "fr": "Partie de l’analyte qui est dans le matériau ou absorbée par le matériau qui passe à travers le filtre lors de la filtration de l’échantillon." } }, "Filtered": { "name": { "en": "Filtered", - "fr": null + "fr": "Filtré" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte measured as the aqueous form through filtration (filtering location unknown). Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration (lieu de filtration inconnu). Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute). Voir le guide approprié sur datastream.org." } }, "Filtered, field": { "name": { "en": "Filtered, field", - "fr": null + "fr": "Filtré, terrain" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte measured as the aqueous form through field filtration. Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration sur le terrain. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute). Voir le guide approprié sur datastream.org." } }, "Filtered, lab": { "name": { "en": "Filtered, lab", - "fr": null + "fr": "Filtré, lab" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte measured as the aqueous form through lab filtration. Used with nutrient data in DataStream when reported as \"Dissolved\" fraction. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte mesurée sous forme aqueuse par filtration en laboratoire. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Dissolved » (dissoute)." } }, "Free Available": { "name": { "en": "Free Available", - "fr": null + "fr": "Libre disponible" }, "description": { - "en": null, - "fr": null + "en": "Portion of the residual analyte present and not combined with any substance or in other less readily available form.", + "fr": "Partie de l’analyte résiduel présente et non combinée à une substance ou sous une autre forme moins aisément disponible." } }, "Inorganic": { "name": { "en": "Inorganic", - "fr": null + "fr": "Inorganique" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte containing inorganic content.", + "fr": "Partie de la substance à analyser contenant des éléments inorganiques." } }, "Non-Filterable (Particle)": { "name": { "en": "Non-Filterable (Particle)", - "fr": null + "fr": "Non filtrable (Particule)" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that is particulate and does not pass through filter. Used with nutrient data in DataStream when reported as \"Particulate\" fraction. See relevant guidance on datastream.org.", + "fr": "Partie de la substance à analyser qui est particulaire et ne passe pas à travers le filtre. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Particulate » (particulaire). Voir le guide approprié sur datastream.org." } }, "Non-settleable": { "name": { "en": "Non-settleable", - "fr": null + "fr": "Non réglable" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that is in/absorbed to particles remaining in suspension after a settling process.", + "fr": "Portion de l'analyte qui est dans/absorbée par les particules restant en suspension après un processus de décantation." } }, "Non-volatile": { "name": { "en": "Non-volatile", - "fr": null + "fr": "Non volatile" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that is in a liquid or solid state under normal temperature and pressure.", + "fr": "Partie de la substance à analyser qui se trouve à l’état liquide ou solide à une température et une pression normales." } }, "Organic": { "name": { "en": "Organic", - "fr": null + "fr": "Organique" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte in organic forms.", + "fr": "Partie de la substance à analyser sous forme organique." } }, "Pot. Dissolved": { "name": { "en": "Pot. Dissolved", - "fr": null + "fr": "Pot. Dissous" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte measured from the filtrate of a water sample that was treated with nitric acid prior to filtration. Samples solubilized with nitric acid reported as “Acid soluble” can be assigned the fraction “Pot. Dissolved”. Filter pore size should be indicated in the ResultComment if it is different than 0.45 µm. DataStream uses this term for metal-series analytes and other non-nutrients to indicate that the water sample was filtered. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte mesurée à partir du filtrat d’un échantillon d’eau qui a été traité avec de l’acide nitrique avant d’être filtré. Les échantillons solubilisés avec de l’acide nitrique et signalés comme « Acid soluble » (solubles dans l’acide) peuvent se voir attribuer la fraction « Pot. Dissolved » (Pot. dissous). La taille des pores du filtre doit être indiquée dans ResultComment si elle est différente de 0,45 µm. DataStream utilise ce terme pour les analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer que l’échantillon d’eau a été filtré. Voir le guide approprié sur datastream.org." } }, "Settleable": { "name": { "en": "Settleable", - "fr": null + "fr": "Réglable" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte found in/absorbed to the part of the sample which has settled (fallen out of suspension) to the bottom of the sample container.", + "fr": "Portion de l'analyte trouvée dans/absorbée par la partie de l'échantillon qui s'est déposée (tombée en suspension) au fond du récipient d'échantillon." } }, "Supernate": { "name": { "en": "Supernate", - "fr": null + "fr": "Surnageant" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte found in the liquid layer above a precipitate produced from the sample.", + "fr": "Partie de l’analyte trouvée dans la couche liquide au-dessus d’un précipité produit à partir de l’échantillon." } }, "Suspended": { "name": { "en": "Suspended", - "fr": null + "fr": "En suspension" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte suspended in the sampled medium, either as- or adsorbed to- particles that has been physically separated before analysis. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to weak or partial digestion. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte en suspension dans le milieu échantillonné, sous forme de particules- ou absorbée sur celles-ci-, qui a été physiquement séparée avant l’analyse. DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion faible ou partielle. Voir le guide approprié sur datastream.org." } }, "Total": { "name": { "en": "Total", - "fr": null + "fr": "Totale" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte representing the total of all fractions in an unfiltered water sample, or a sediment sample, obtained by a strong digestion that produces a concentration value that can be assumed to be representative of the entirety of the analyte in the sample. Applies to unfiltered samples reported by the laboratory as \"Total\" or “Total recoverable”. DataStream uses this term for water sample metal-series analytes and other non-nutrients to indicate that it was not filtered and subject to strong digestion. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte représentant le total de toutes les fractions dans un échantillon d’eau non filtré ou un échantillon de sédiments, obtenu par une forte digestion qui produit une valeur de concentration que l’on peut supposer représentative de la totalité de l’analyte dans l’échantillon. S’applique aux échantillons non filtrés signalés par le laboratoire comme étant « Total » ou « Total recoverable » (Total récupérables). DataStream utilise ce terme pour les échantillons d’eau contenant des analytes de la série des métaux et d’autres éléments non nutritifs pour indiquer qu’ils n’ont pas été filtrés et qu’ils ont fait l’objet d’une digestion forte. Voir le guide approprié sur datastream.org." } }, "Total Recoverable": { "name": { "en": "Total Recoverable", - "fr": null + "fr": "Total récupérable" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte available in an unfiltered sample following solubilization.", + "fr": "Partie de l’analyte disponible dans un échantillon non filtré après solubilisation." } }, "Total Residual": { "name": { "en": "Total Residual", - "fr": null + "fr": "Total résiduel" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte remaining after a given contact time. The sum of the combined available residual analyte and the free available residual analyte.", + "fr": "Partie de l’analyte restant après un temps de contact donné. La somme de l'analyte résiduel disponible et de l'analyte résiduel libre." } }, "Unfiltered": { "name": { "en": "Unfiltered", - "fr": null + "fr": "Non filtré" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte containing aqueous and particulate fractions. Used with nutrient data in DataStream when reported as \"Total\" fraction. See relevant guidance on datastream.org.", + "fr": "Partie de l’analyte contenant des fractions aqueuses et particulaires. Utilisé avec les données sur les nutriments dans DataStream lorsqu’elles sont signalées comme fraction « Total » (totale). Voir le guide approprié sur datastream.org." } }, "Unspecified": { "name": { "en": "Unspecified", - "fr": null + "fr": "Non spécifié" }, "description": { "en": null, @@ -693,21 +311,21 @@ "Vapor": { "name": { "en": "Vapor", - "fr": null + "fr": "Vapeur" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that exists in a gaseous state and that under ordinary conditions is liquid or solid.", + "fr": "Partie de l’analyte qui existe à l’état gazeux et qui, dans des conditions normales, est liquide ou solide." } }, "Volatile": { "name": { "en": "Volatile", - "fr": null + "fr": "Volatile" }, "description": { - "en": null, - "fr": null + "en": "Portion of the analyte that evaporates readily at normal temperature and pressure.", + "fr": "Partie de l’analyte qui s’évapore facilement à une température et une pression normales." } } } diff --git a/schemas/data/src/locales/ResultStatusID.json b/schemas/data/src/locales/ResultStatusID.json index ac190eec..b96405e3 100644 --- a/schemas/data/src/locales/ResultStatusID.json +++ b/schemas/data/src/locales/ResultStatusID.json @@ -1,93 +1,11 @@ { - "ResultStatusID": { - "name": { - "en": "Result Status Identifier", - "fr": null - }, - "description": { - "en": "Stage of QA/QC protocol (as described in the dataset’s metadata) applied to the result (e.g. \"Validated\")", - "fr": "Étape du protocole d’AQ/CQ (tel que décrit dans les métadonnées du jeu de données) appliqué au résultat (par exemple, « Validated » (Validé))" - }, - "values": { - "Accepted": { - "name": { - "en": "Accepted", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Final": { - "name": { - "en": "Final", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Historical": { - "name": { - "en": "Historical", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Preliminary": { - "name": { - "en": "Preliminary", - "fr": null - }, - "description": { - "en": "ResultValue not undergone any QA/QC review as described in the dataset metadata. Some aspect of the observation may be subject to change. ", - "fr": "ResultValue qui n’a pas fait l’objet d’un processus d’AQ/CQ tel que décrit dans les métadonnées du jeu de données. Certains aspects de l'observation pourraient être modifiés." - } - }, - "Rejected": { - "name": { - "en": "Rejected", - "fr": null - }, - "description": { - "en": null, - "fr": null - } - }, - "Validated": { - "name": { - "en": "Validated", - "fr": null - }, - "description": { - "en": "ResultValue validated by the QA/QC protocol described in the dataset metadata.  ", - "fr": "Result/Value validé par le protocole AQ/CQ décrit dans les métadonnées du jeu de données." - } - }, - "Provisional": { - "name": { - "en": "Provisional", - "fr": null - }, - "description": { - "en": "ResultValue undergone some but not all QA/QC protocols described in the dataset metadata. Some aspect of the observation may be subject to change. ", - "fr": "Result/Value qui a fait l’objet de certains protocoles d’AQ/CQ décrit dans les métadonnées du jeu de données. Certains aspects de l'observation pourraient être modifiés." - } - } - } - }, "name": { - "en": "ResultStatusID", + "en": "Result Status Identifier", "fr": null }, "description": { - "en": null, - "fr": null + "en": "Stage of QA/QC protocol (as described in the dataset’s metadata) applied to the result (e.g. \"Validated\")", + "fr": "Étape du protocole d’AQ/CQ (tel que décrit dans les métadonnées du jeu de données) appliqué au résultat (par exemple, « Validated » (Validé))" }, "values": { "Accepted": { @@ -126,8 +44,8 @@ "fr": null }, "description": { - "en": null, - "fr": null + "en": "ResultValue not undergone any QA/QC review as described in the dataset metadata. Some aspect of the observation may be subject to change. ", + "fr": "ResultValue qui n’a pas fait l’objet d’un processus d’AQ/CQ tel que décrit dans les métadonnées du jeu de données. Certains aspects de l'observation pourraient être modifiés." } }, "Provisional": { @@ -136,18 +54,8 @@ "fr": null }, "description": { - "en": null, - "fr": null - } - }, - "Rejected": { - "name": { - "en": "Rejected", - "fr": null - }, - "description": { - "en": null, - "fr": null + "en": "ResultValue undergone some but not all QA/QC protocols described in the dataset metadata. Some aspect of the observation may be subject to change. ", + "fr": "Result/Value qui a fait l’objet de certains protocoles d’AQ/CQ décrit dans les métadonnées du jeu de données. Certains aspects de l'observation pourraient être modifiés." } }, "Validated": { @@ -156,8 +64,8 @@ "fr": null }, "description": { - "en": null, - "fr": null + "en": "ResultValue validated by the QA/QC protocol described in the dataset metadata.  ", + "fr": "Result/Value validé par le protocole AQ/CQ décrit dans les métadonnées du jeu de données." } } } From 4e7e234795f2c0b7d411dffb43256323b12fd81c Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 8 Jul 2026 11:13:35 -0400 Subject: [PATCH 43/51] feat: add CSV-injection and whitespace checks to new free-text ID/name fields Bring EventID, WellID, AquiferCode, SampleCollectionMethodID, and SampleCollectionMethodName to parity with existing text columns like LaboratorySampleID: add them to the CSVInjection logic rule and add a WhiteSpace quality-control rule for each. --- CHANGELOG.md | 3 +- schemas/data/src/logic/CSVInjection.json | 15 +++++++++ schemas/data/src/quality-control.json | 15 +++++++++ .../WhiteSpace-AquiferCode.json | 14 ++++++++ .../quality-control/WhiteSpace-EventID.json | 14 ++++++++ .../WhiteSpace-SampleCollectionMethodID.json | 14 ++++++++ ...WhiteSpace-SampleCollectionMethodName.json | 14 ++++++++ .../quality-control/WhiteSpace-WellID.json | 14 ++++++++ schemas/data/test/logic.js | 32 +++++++++++++++++++ schemas/data/test/quality-control.js | 21 ++++++++++++ 10 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 schemas/data/src/quality-control/WhiteSpace-AquiferCode.json create mode 100644 schemas/data/src/quality-control/WhiteSpace-EventID.json create mode 100644 schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodID.json create mode 100644 schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodName.json create mode 100644 schemas/data/src/quality-control/WhiteSpace-WellID.json diff --git a/CHANGELOG.md b/CHANGELOG.md index a260be29..38d74b54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,8 @@ Targets `3.0.0`. Introduces **Groundwater support** to the DataStream schema. - `MonitoringLocationVerticalUnit`: `ft`, `m` - `SampleCollectionEquipmentName`: `Air line`, `Bailer`, `Hydrasleeve`, `Snap sampler`, `Tubing`, `Water level meter`, `Wetted tape` - `CharacteristicName`: `Water level elevation`, `Water level in well, depth from a reference point` -- **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. No conditional logic or validation checks beyond the standard single-line string pattern. +- **`EventID` field** — optional free-text identifier (max 255 characters) for grouping observations by field sampling event; available for all data types. +- **Input-safety checks on new free-text ID/name fields** — `EventID`, `WellID`, `AquiferCode`, `SampleCollectionMethodID`, and `SampleCollectionMethodName` now get the same CSV-injection and leading/trailing-whitespace checks as existing text columns like `LaboratorySampleID`. - **`ResultStatusID` deprecation warning** — new quality-control warning `ResultStatusID-Deprecated`: `Final` and `Accepted` are flagged as no longer recommended (use `Preliminary`, `Provisional`, or `Validated`). The values remain valid in the enum; the warning does not block submission. - **Q2 2026 WQX update** (`wqx` `3.0.260` → `3.0.276`): new values across `CharacteristicName`, `ActivityType`, `ResultAnalyticalMethodContext`, and `SampleCollectionEquipmentName`. diff --git a/schemas/data/src/logic/CSVInjection.json b/schemas/data/src/logic/CSVInjection.json index 95ad7cc8..e504181a 100644 --- a/schemas/data/src/logic/CSVInjection.json +++ b/schemas/data/src/logic/CSVInjection.json @@ -29,6 +29,21 @@ }, "LaboratorySampleID": { "$ref": "../definitions.json#/definitions/csv-injection" + }, + "EventID": { + "$ref": "../definitions.json#/definitions/csv-injection" + }, + "WellID": { + "$ref": "../definitions.json#/definitions/csv-injection" + }, + "AquiferCode": { + "$ref": "../definitions.json#/definitions/csv-injection" + }, + "SampleCollectionMethodID": { + "$ref": "../definitions.json#/definitions/csv-injection" + }, + "SampleCollectionMethodName": { + "$ref": "../definitions.json#/definitions/csv-injection" } }, "required": [] diff --git a/schemas/data/src/quality-control.json b/schemas/data/src/quality-control.json index 7589d813..ba4fe23b 100644 --- a/schemas/data/src/quality-control.json +++ b/schemas/data/src/quality-control.json @@ -237,9 +237,15 @@ { "$ref": "./quality-control/ResultValue-DOY-Range.json" }, + { + "$ref": "quality-control/WhiteSpace-AquiferCode.json" + }, { "$ref": "quality-control/WhiteSpace-DatasetName.json" }, + { + "$ref": "quality-control/WhiteSpace-EventID.json" + }, { "$ref": "quality-control/WhiteSpace-LaboratoryName.json" }, @@ -260,6 +266,15 @@ }, { "$ref": "quality-control/WhiteSpace-ResultComment.json" + }, + { + "$ref": "quality-control/WhiteSpace-SampleCollectionMethodID.json" + }, + { + "$ref": "quality-control/WhiteSpace-SampleCollectionMethodName.json" + }, + { + "$ref": "quality-control/WhiteSpace-WellID.json" } ] } diff --git a/schemas/data/src/quality-control/WhiteSpace-AquiferCode.json b/schemas/data/src/quality-control/WhiteSpace-AquiferCode.json new file mode 100644 index 00000000..2eb24d03 --- /dev/null +++ b/schemas/data/src/quality-control/WhiteSpace-AquiferCode.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/WhiteSpace-AquiferCode.json", + "title": "WhiteSpace-AquiferCode", + "description": "Leading or trailing white space (i.e., spaces inserted before or after your character string) can cause issues with data management.", + "errorMessage": "qc-WhiteSpace", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "AquiferCode": { + "$ref": "../definitions.json#/definitions/trim" + } + }, + "required": [] +} diff --git a/schemas/data/src/quality-control/WhiteSpace-EventID.json b/schemas/data/src/quality-control/WhiteSpace-EventID.json new file mode 100644 index 00000000..7527e460 --- /dev/null +++ b/schemas/data/src/quality-control/WhiteSpace-EventID.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/WhiteSpace-EventID.json", + "title": "WhiteSpace-EventID", + "description": "Leading or trailing white space (i.e., spaces inserted before or after your character string) can cause issues with data management.", + "errorMessage": "qc-WhiteSpace", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "EventID": { + "$ref": "../definitions.json#/definitions/trim" + } + }, + "required": [] +} diff --git a/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodID.json b/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodID.json new file mode 100644 index 00000000..d2f29572 --- /dev/null +++ b/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodID.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/WhiteSpace-SampleCollectionMethodID.json", + "title": "WhiteSpace-SampleCollectionMethodID", + "description": "Leading or trailing white space (i.e., spaces inserted before or after your character string) can cause issues with data management.", + "errorMessage": "qc-WhiteSpace", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "SampleCollectionMethodID": { + "$ref": "../definitions.json#/definitions/trim" + } + }, + "required": [] +} diff --git a/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodName.json b/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodName.json new file mode 100644 index 00000000..a0e8e018 --- /dev/null +++ b/schemas/data/src/quality-control/WhiteSpace-SampleCollectionMethodName.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/WhiteSpace-SampleCollectionMethodName.json", + "title": "WhiteSpace-SampleCollectionMethodName", + "description": "Leading or trailing white space (i.e., spaces inserted before or after your character string) can cause issues with data management.", + "errorMessage": "qc-WhiteSpace", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "SampleCollectionMethodName": { + "$ref": "../definitions.json#/definitions/trim" + } + }, + "required": [] +} diff --git a/schemas/data/src/quality-control/WhiteSpace-WellID.json b/schemas/data/src/quality-control/WhiteSpace-WellID.json new file mode 100644 index 00000000..4dfa8ce7 --- /dev/null +++ b/schemas/data/src/quality-control/WhiteSpace-WellID.json @@ -0,0 +1,14 @@ +{ + "$id": "https://datastream.org/schema/data/quality-control/WhiteSpace-WellID.json", + "title": "WhiteSpace-WellID", + "description": "Leading or trailing white space (i.e., spaces inserted before or after your character string) can cause issues with data management.", + "errorMessage": "qc-WhiteSpace", + "type": "object", + "unevaluatedProperties": true, + "properties": { + "WellID": { + "$ref": "../definitions.json#/definitions/trim" + } + }, + "required": [] +} diff --git a/schemas/data/test/logic.js b/schemas/data/test/logic.js index 11f6dcb7..4f7dc519 100644 --- a/schemas/data/test/logic.js +++ b/schemas/data/test/logic.js @@ -839,6 +839,11 @@ carriage return`, ResultAnalyticalMethodName: '\ncarriage return', LaboratoryName: '\rcarriage return', LaboratorySampleID: '\ttab', + EventID: '=SUM(A1)', + WellID: '+1234', + AquiferCode: '-A1', + SampleCollectionMethodID: '@GRAB', + SampleCollectionMethodName: '@Grab sample', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) @@ -867,6 +872,17 @@ carriage return`, checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), true ) + assert.equal(checkProperty(validate.errors, 'pattern', 'EventID'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'WellID'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'AquiferCode'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodID'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodName'), + true + ) }) test('Should accept columns without potential csv injection', async (t) => { @@ -879,6 +895,11 @@ test('Should accept columns without potential csv injection', async (t) => { ResultAnalyticalMethodName: '|', LaboratoryName: '_', LaboratorySampleID: '*', + EventID: 'Spring 2018 survey', + WellID: 'W-001', + AquiferCode: 'A1', + SampleCollectionMethodID: 'GRAB-01', + SampleCollectionMethodName: 'Grab sample', }) assert.equal(valid, false) // console.log(valid, JSON.stringify(validate.errors, null, 2)) @@ -911,6 +932,17 @@ test('Should accept columns without potential csv injection', async (t) => { checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), false ) + assert.equal(checkProperty(validate.errors, 'pattern', 'EventID'), false) + assert.equal(checkProperty(validate.errors, 'pattern', 'WellID'), false) + assert.equal(checkProperty(validate.errors, 'pattern', 'AquiferCode'), false) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodID'), + false + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodName'), + false + ) }) // *** ResultUnit-Salinity *** // diff --git a/schemas/data/test/quality-control.js b/schemas/data/test/quality-control.js index 9759b61b..9cbb3d82 100644 --- a/schemas/data/test/quality-control.js +++ b/schemas/data/test/quality-control.js @@ -1246,6 +1246,11 @@ test('Should reject columns with extra whitespace', async (t) => { ResultAnalyticalMethodName: 'sum ', LaboratoryName: ' sum', LaboratorySampleID: ' sum ', + EventID: ' sum ', + WellID: ' sum ', + AquiferCode: ' sum ', + SampleCollectionMethodID: ' sum ', + SampleCollectionMethodName: ' sum ', }) assert.equal(valid, false) assert.equal(checkProperty(validate.errors, 'pattern', 'DatasetName'), true) @@ -1274,6 +1279,17 @@ test('Should reject columns with extra whitespace', async (t) => { checkProperty(validate.errors, 'pattern', 'LaboratorySampleID'), true ) + assert.equal(checkProperty(validate.errors, 'pattern', 'EventID'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'WellID'), true) + assert.equal(checkProperty(validate.errors, 'pattern', 'AquiferCode'), true) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodID'), + true + ) + assert.equal( + checkProperty(validate.errors, 'pattern', 'SampleCollectionMethodName'), + true + ) }) test('Should accept columns without extra whitespace', async (t) => { const valid = validate({ @@ -1285,6 +1301,11 @@ test('Should accept columns without extra whitespace', async (t) => { ResultAnalyticalMethodName: 'sum', LaboratoryName: 'sum', LaboratorySampleID: 'A', + EventID: 'Spring 2018 survey', + WellID: 'W-001', + AquiferCode: 'A1', + SampleCollectionMethodID: 'GRAB-01', + SampleCollectionMethodName: 'Grab sample', }) assert.equal(valid, true) }) From b701356a2070ad4b877fd33a4ec9685c53d8ad15 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Wed, 8 Jul 2026 12:52:38 -0400 Subject: [PATCH 44/51] fix(locales): add fr names and drop stale deprecated entries for ActivityGroupType Add French names for the six current ActivityGroupType values and remove the five deprecated entries (Field Set, QC Sample, Replicate, Subsample, Trip) that are no longer in the enum. --- .../data/src/locales/ActivityGroupType.json | 62 ++----------------- 1 file changed, 6 insertions(+), 56 deletions(-) diff --git a/schemas/data/src/locales/ActivityGroupType.json b/schemas/data/src/locales/ActivityGroupType.json index acf231cc..ee4f383e 100644 --- a/schemas/data/src/locales/ActivityGroupType.json +++ b/schemas/data/src/locales/ActivityGroupType.json @@ -11,7 +11,7 @@ "Continuous Data": { "name": { "en": "Continuous Data", - "fr": null + "fr": "Données continues" }, "description": { "en": null, @@ -21,7 +21,7 @@ "Field Measure": { "name": { "en": "Field Measure", - "fr": null + "fr": "Mesure sur le terrain" }, "description": { "en": null, @@ -31,7 +31,7 @@ "Lab Sample": { "name": { "en": "Lab Sample", - "fr": null + "fr": "Échantillon de laboratoire" }, "description": { "en": null, @@ -41,7 +41,7 @@ "Quality Control - Field Measure": { "name": { "en": "Quality Control - Field Measure", - "fr": null + "fr": "Contrôle qualité - Mesure sur le terrain" }, "description": { "en": null, @@ -51,7 +51,7 @@ "Quality Control - Lab Sample": { "name": { "en": "Quality Control - Lab Sample", - "fr": null + "fr": "Contrôle qualité - Échantillon de laboratoire" }, "description": { "en": null, @@ -61,23 +61,13 @@ "Unspecified": { "name": { "en": "Unspecified", - "fr": null + "fr": "Non spécifié" }, "description": { "en": null, "fr": null } }, - "Field Set": { - "name": { - "en": "Field", - "fr": "Terrain" - }, - "description": { - "en": "DEPRECATED", - "fr": null - } - }, "Other": { "name": { "en": "Other", @@ -87,46 +77,6 @@ "en": null, "fr": null } - }, - "QC Sample": { - "name": { - "en": "Quality Control", - "fr": "Contrôle qualité" - }, - "description": { - "en": "DEPRECATED", - "fr": null - } - }, - "Replicate": { - "name": { - "en": "Replicate", - "fr": null - }, - "description": { - "en": "DEPRECATED", - "fr": null - } - }, - "Subsample": { - "name": { - "en": "Lab", - "fr": "Laboratoire" - }, - "description": { - "en": "DEPRECATED", - "fr": null - } - }, - "Trip": { - "name": { - "en": "Trip", - "fr": null - }, - "description": { - "en": "DEPRECATED", - "fr": null - } } } } \ No newline at end of file From 4d19b6d88822a4ace330abae9e42485fe2ab6c7b Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 9 Jul 2026 09:46:53 -0400 Subject: [PATCH 45/51] fix: error message quotes --- schemas/data/src/locales/en-CA.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 9b3b8aac..453ac959 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -147,7 +147,7 @@ qc-WhiteSpace = Leading or trailing white space detected in character string ## quality-control (code) qc-RowCount = A dataset requires at least one row. qc-ColumnCount = Should match column count from the first row -qc-DatasetName = The DatasetName in this CSV file does not match the dataset’s metadata. If you proceed, dataset downloads will include the existing dataset name from the metadata. This CSV file containing the mismatched dataset name will still be available via the dataset Changelog. To match your dataset name across all records, update the DatasetName field in the CSV, or update the dataset's metadata. +qc-DatasetName = The DatasetName in this CSV file does not match the dataset's metadata. If you proceed, dataset downloads will include the existing dataset name from the metadata. This CSV file containing the mismatched dataset name will still be available via the dataset Changelog. To match your dataset name across all records, update the DatasetName field in the CSV, or update the dataset's metadata. qc-Date-Future = Contains date in the future qc-ActivityStartDate-Future = {qc-Date-Future} qc-ActivityEndDate-Future = {qc-Date-Future} From 24c0203e66dd94b37f77caed7c9f09e20a51b295 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 9 Jul 2026 09:53:18 -0400 Subject: [PATCH 46/51] fix(build): stop stripping errorMessage from shared definitions build Keep errorMessage in the shared definitions build (so frontend/extract inherit it) and strip it only for the published json-schema/definitions.json copy, which stays byte-identical. primary/backend still strip per-flavour. Add regression tests asserting the friendly messages surface. --- schemas/data/bin/build | 7 +-- schemas/data/test/messages.js | 99 +++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 3 deletions(-) diff --git a/schemas/data/bin/build b/schemas/data/bin/build index 8cb9d321..e96e6466 100755 --- a/schemas/data/bin/build +++ b/schemas/data/bin/build @@ -23,7 +23,8 @@ deref () { clean () { src=$1 - cmd='del(.. | .["$vocabulary"]?, .["$id"]?, .["$comment"]?, '$2')' + extra=${2:+, $2} + cmd='del(.. | .["$vocabulary"]?, .["$id"]?, .["$comment"]?'"${extra}"')' id=$(jq -r '.["$id"]' src/${src}.build.json) jq "${cmd}" src/${src}.build.json > src/${src}.build.tmp.json @@ -89,8 +90,8 @@ mkdir -p json-schema/ pre definitions deref definitions sast definitions -clean definitions '.errorMessage?' -cp src/definitions.build.json json-schema/definitions.json +clean definitions +jq 'del(.. | .errorMessage?)' src/definitions.build.json > json-schema/definitions.json # primary - strict pre primary diff --git a/schemas/data/test/messages.js b/schemas/data/test/messages.js index fe17e0bd..4606f833 100644 --- a/schemas/data/test/messages.js +++ b/schemas/data/test/messages.js @@ -2,6 +2,8 @@ import { test } from 'node:test' import assert from 'node:assert/strict' import en from '../locales/en-CA.js' import validate from '../quality-control/index.js' +import validateFrontend from '../frontend/index.js' +import validateExtract from '../extract/index.js' test('Should transform error message', async (t) => { const valid = validate({ @@ -64,3 +66,100 @@ test('Should handle null errors gracefully', async (t) => { assert.equal(valid, true) en(validate.errors) }) + +// *** definitions-level errorMessage surfaces in frontend/extract *** // +// Regression guard: the build must NOT strip errorMessage from the shared +// definitions build (see bin/build `clean definitions`), or these friendly +// messages silently fall back to the raw regex. +const messageFor = (fn, record, field) => { + fn(record) + const errors = fn.errors ?? [] + en(errors) + return errors.find( + (e) => e.instancePath === '/' + field && e.keyword === 'errorMessage' + )?.message +} + +const validRow = { + DatasetName: 'Test', + MonitoringLocationID: 'L1', + MonitoringLocationName: 'Station 1', + MonitoringLocationLatitude: '45.4215', + MonitoringLocationLongitude: '-75.6972', + MonitoringLocationHorizontalCoordinateReferenceSystem: 'WGS84', + MonitoringLocationType: 'Estuary', + ActivityType: 'Field Msr/Obs', + ActivityMediaName: 'Surface Water', + ActivityStartDate: '2026-06-15', + CharacteristicName: 'Temperature, water', + ResultValue: '18.5', + ResultUnit: 'deg C', + ResultValueType: 'Actual', +} + +test('frontend surfaces the friendly single-line string message', async (t) => { + const message = messageFor( + validateFrontend, + { ...validRow, EventID: 'a\nb' }, + 'EventID' + ) + assert.match(message, /Only letters, numbers/) +}) + +test('extract surfaces the friendly single-line string message', async (t) => { + const message = messageFor( + validateExtract, + { ...validRow, EventID: 'a\nb' }, + 'EventID' + ) + assert.match(message, /Only letters, numbers/) +}) + +test('frontend surfaces the friendly multiline string message', async (t) => { + const message = messageFor( + validateFrontend, + { ...validRow, ResultComment: 'a\tb' }, + 'ResultComment' + ) + assert.match(message, /line feeds\/carriage returns are allowed/) +}) + +test('frontend surfaces the friendly date-format message', async (t) => { + const message = messageFor( + validateFrontend, + { ...validRow, ActivityStartDate: 'not-a-date' }, + 'ActivityStartDate' + ) + assert.match(message, /YYYY-MM-DD/) +}) + +test('frontend surfaces the friendly loose-time message', async (t) => { + const message = messageFor( + validateFrontend, + { ...validRow, ActivityStartTime: '99:99' }, + 'ActivityStartTime' + ) + assert.match(message, /HH:MM:SS/) +}) + +test('extract surfaces the friendly strict-time message', async (t) => { + const message = messageFor( + validateExtract, + { ...validRow, ActivityStartTime: '9:30:00' }, + 'ActivityStartTime' + ) + assert.match(message, /leading zero/) +}) + +test('frontend surfaces the friendly timezone message', async (t) => { + const message = messageFor( + validateFrontend, + { + ...validRow, + ActivityStartTime: '12:00:00', + ActivityStartTimeZone: 'bad', + }, + 'ActivityStartTimeZone' + ) + assert.match(message, /-06:00/) +}) From f108f8fcd03eb3e7f146b356f3f1c2d748ffb701 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Thu, 9 Jul 2026 10:01:41 -0400 Subject: [PATCH 47/51] chore: update qc warning message --- schemas/data/src/locales/en-CA.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 453ac959..46f3059b 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -104,7 +104,7 @@ error-ResultDetectionQuantitationLimitUnit-Salinity = ResultDetectionQuantitatio error-ResultUnit-Salinity = ResultUnit for CharacteristicName Salinity should be ppth (parts per thousand), ppm (parts per million), PSU (practical salinity unit), mg/L (milligrams per litre), or g/L (grams per litre) ## quality-control -qc-ActivityMediaName-ActivityDepthHeightMeasure-Maximum = ActivityDepthHeightMeasure should be below 0 +qc-ActivityMediaName-ActivityDepthHeightMeasure-Maximum = ActivityDepthHeightMeasure should be reported as a negative value. qc-ActivityType-CTS-ActivityStartTimeZone = ActivityStartTimeZone should be included when ActivityType is 'Field Msr/Obs-Continuous Time Series' qc-ActivityType-CTS-ActivityStartTimeZone-UTC = When ActivityStartTimeZone is '+00:00', consider adding a note in your dataset metadata to let others know your data are reported in UTC/GMT qc-ActivityType-ResultSampleFraction = ResultSampleFraction may not be relevant for selected ActivityType, except for nutrient parameters, which should follow guidance in Best Practices Guide for Nutrient Data (see https://datastream.org/en-ca/documentation/nutrient-data-guidance) From 0eb0839ea09060f63f0b79477381eebff17ceb26 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 10 Jul 2026 12:51:25 -0400 Subject: [PATCH 48/51] chore: update error message --- schemas/data/src/locales/en-CA.ftl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schemas/data/src/locales/en-CA.ftl b/schemas/data/src/locales/en-CA.ftl index 46f3059b..793533e5 100644 --- a/schemas/data/src/locales/en-CA.ftl +++ b/schemas/data/src/locales/en-CA.ftl @@ -157,5 +157,5 @@ qc-MonitoringLocationName-Duplicate = Multiple MonitoringLocationNames are used qc-MonitoringLocationType-Duplicate = Multiple MonitoringLocationTypes are used with the same MonitoringLocationID qc-MonitoringLocationHorizontalCoordinateReferenceSystem-Duplicate = Multiple MonitoringLocationHorizontalCoordinateReferenceSystems are used with the same MonitoringLocationID qc-ActivityTypeContinuous = When there are >= 24 observations of the same type on the same day, ActivityType is expected to equal 'Field Msr/Obs-Continuous Time Series' -error-ActivityMediaName-Groundwater-Mixed = ActivityMediaName must be 'Groundwater' or 'Porewater' on every row when either is reported. Submit other media as a separate dataset. -error-ActivityType-Continuous-Mixed = Continuous time-series data should be uploaded in a separate dataset from discrete (single point-in-time) data +error-ActivityMediaName-Groundwater-Mixed = Groundwater and surface water data must be uploaded in separate datasets. If ActivityMediaName is 'Groundwater' and/or 'Porewater' on any row, file cannot contain any other ActivityMediaName values. +error-ActivityType-Continuous-Mixed = Continuous time-series data must be uploaded in a separate dataset from discrete (single point-in-time) data From 598794c853b8acd7d71736981ad1472feac06edb Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 10 Jul 2026 12:58:09 -0400 Subject: [PATCH 49/51] chore: add missing descriptions for ActivityType values --- schemas/data/src/locales/ActivityType.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/schemas/data/src/locales/ActivityType.json b/schemas/data/src/locales/ActivityType.json index fe4e951a..9ab324cb 100644 --- a/schemas/data/src/locales/ActivityType.json +++ b/schemas/data/src/locales/ActivityType.json @@ -35,7 +35,7 @@ }, "description": { "en": "A discrete measurement collected in the field integrated over an interval or space within which changes in flow are used to alter the proportion of the sampled medium contributing to the integrated sample.", - "fr": null + "fr": "Une mesure discrète prélevées sur le terrain et intégrée sur un intervalle ou un espace au sein duquel les variations du débit servent à modifier la proportion du milieu échantillonné contribuant à l'échantillon intégré." } }, "Field Msr/Obs-Integrated Time Series": { @@ -45,7 +45,7 @@ }, "description": { "en": "A discrete measurement collected in the field that represents an integrated portion or segment of elapsed time.", - "fr": null + "fr": "Une mesure discrète prélevées sur le terrain, représentant une partie ou un segment intégré de temps écoulé." } }, "Field Msr/Obs-Integrated Vertical Profile": { @@ -55,7 +55,7 @@ }, "description": { "en": "A discrete measurement collected in the field that represents an integrated portion or segment of a vertical track within the study area.", - "fr": null + "fr": "Une mesure discrète prélevées sur le terrain, représentant une partie ou un segment intégré d'une trajectoire verticale au sein de la zone d'étude." } }, "Field Msr/Obs-Portable Data Logger": { @@ -124,8 +124,8 @@ "fr": null }, "description": { - "en": "A measurement taken to verify the quality of data taken by a data logger. For discrete measurements collected by portable loggers (e.g. YSI) in the field.", - "fr": "Une mesure prise pour vérifier la qualité des données prélevées à l’aide d’un enregistreur de données. Pour des mesures discrètes prélevées par des enregistreurs portables (par exemple, YSI) sur le terrain." + "en": "A field measurement taken to assess the reproducibility of data collected by a data logger. For discrete measurements collected by portable loggers (e.g. YSI) in the field.", + "fr": "Une mesure de terrain effectuée pour évaluer la reproductibilité des données recueillies par un enregistreur de données. Concerne les mesures ponctuelles réalisées sur le terrain à l'aide d'enregistreurs portatifs (par ex. YSI)." } }, "Quality Control Field Sample Equipment Rinsate Blank": { @@ -415,7 +415,7 @@ }, "description": { "en": "The measured value of a calibration standard taken during or after field work to verify that an instrument has maintained its calibration. The expected calibration standard value should be included in the ResultComment.", - "fr": null + "fr": "Valeur mesurée d'un étalon de calibration relevée pendant ou après le travail sur le terrain afin de vérifier que l'instrument a conservé son étalonnage. La valeur attendue de l'étalon de calibration doit être incluse dans le champ « ResultComment »." } }, "Quality Control-Calibration Check Buffer": { @@ -545,7 +545,7 @@ }, "description": { "en": "A discrete sample that represents an integrated portion or segment of a horizontal and vertical track within the study area.", - "fr": null + "fr": "Un échantillon discret représentant une partie ou un segment intégré d'un tracé horizontal et vertical au sein de la zone d'étude." } }, "Sample-Integrated Horizontal Profile": { @@ -555,7 +555,7 @@ }, "description": { "en": "A discrete sample that represents an integrated portion or segment of a horizontal track within the study area.", - "fr": null + "fr": "Un échantillon discret représentant une partie ou un segment intégré d'un tracé horizontal au sein de la zone d'étude." } }, "Sample-Integrated Time Series": { @@ -565,7 +565,7 @@ }, "description": { "en": "A discrete sample that represents an integrated portion or segment of elapsed time.", - "fr": null + "fr": "Un échantillon discret représentant une partie ou un segment intégré de temps écoulé." } }, "Sample-Integrated Vertical Profile": { @@ -575,7 +575,7 @@ }, "description": { "en": "A discrete sample that represents an integrated portion or segment of a vertical track within the study area.", - "fr": null + "fr": "Un échantillon discret représentant une partie ou un segment intégré d'une trajectoire verticale au sein de la zone d'étude." } }, "Sample-Negative Control": { From d7e346883720ffe3e2d299e7942a8eda9e444a84 Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Fri, 10 Jul 2026 13:11:20 -0400 Subject: [PATCH 50/51] chore: rc version bump --- package-lock.json | 4 ++-- package.json | 2 +- schemas/data/package-lock.json | 4 ++-- schemas/data/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29468305..97b5467d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index beecf4bb..33d0bb64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "description": "DataStream Water Quality Exchange (WQX): JSON Schema and JSON Table Schema for DataStream", "private": true, "type": "module", diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index abbb3a30..2a5a1f0f 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "license": "MIT", "dependencies": { "wqx": "3.0.276" diff --git a/schemas/data/package.json b/schemas/data/package.json index 1d6c3495..500540b7 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -1,6 +1,6 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "description": "DataStream Water Quality Data Schema", "publishConfig": { "cache": "~/.npm", From 459645118de1acb17ba8f130bafc12739a0bbdeb Mon Sep 17 00:00:00 2001 From: Jayakishore Roy Date: Tue, 14 Jul 2026 14:25:13 -0400 Subject: [PATCH 51/51] chore: release version update --- package-lock.json | 4 ++-- package.json | 2 +- schemas/data/package-lock.json | 4 ++-- schemas/data/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97b5467d..ae149944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.2", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.2", + "version": "3.0.0", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index 33d0bb64..be53d1f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datastream/schema-monorepo", - "version": "3.0.0-rc.2", + "version": "3.0.0", "description": "DataStream Water Quality Exchange (WQX): JSON Schema and JSON Table Schema for DataStream", "private": true, "type": "module", diff --git a/schemas/data/package-lock.json b/schemas/data/package-lock.json index 2a5a1f0f..63f478e1 100644 --- a/schemas/data/package-lock.json +++ b/schemas/data/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.2", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.2", + "version": "3.0.0", "license": "MIT", "dependencies": { "wqx": "3.0.276" diff --git a/schemas/data/package.json b/schemas/data/package.json index 500540b7..de399c27 100644 --- a/schemas/data/package.json +++ b/schemas/data/package.json @@ -1,6 +1,6 @@ { "name": "@datastreamapp/data-schema", - "version": "3.0.0-rc.2", + "version": "3.0.0", "description": "DataStream Water Quality Data Schema", "publishConfig": { "cache": "~/.npm",