From ac5d94f030f8a54df0604aa688ac3bae6c419f4d Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 30 Sep 2025 11:52:04 +0200 Subject: [PATCH 001/243] feat: add p_type_rvo --- .changeset/sixty-snakes-repeat.md | 5 ++ fdm-core/src/db/schema.ts | 79 +++++++++++++++++++++++++++++++ fdm-core/src/fertilizer.d.ts | 11 ++++- fdm-core/src/fertilizer.test.ts | 9 +++- fdm-core/src/fertilizer.ts | 13 +++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 .changeset/sixty-snakes-repeat.md diff --git a/.changeset/sixty-snakes-repeat.md b/.changeset/sixty-snakes-repeat.md new file mode 100644 index 000000000..99397aab8 --- /dev/null +++ b/.changeset/sixty-snakes-repeat.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Add `p_type_rvo` as new parameter to fertilizersCatalogue. It describes the 'Mestcode' according to RVO (Dutch government) diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index b505daccf..e9c771b72 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -201,6 +201,84 @@ export type fertilizerApplicationTypeSelect = export type fertilizerApplicationTypeInsert = typeof fertilizerApplication.$inferInsert +// Define farm_managing table +export const typeRvoOptions = [ + { value: "10", label: "Rundvee - Vaste mest" }, + { value: "11", label: "Rundvee - Filtraat na mestscheiding" }, + { value: "12", label: "Rundvee - Gier" }, + { value: "13", label: "Rundvee - Koek na mestscheiding" }, + { value: "14", label: "Rundvee - Drijfmest behalve van vleeskalveren" }, + { value: "17", label: "Rundvee - Bewerkte kalvergier" }, + { value: "18", label: "Rundvee - Vleeskalveren, witvlees" }, + { value: "19", label: "Rundvee - Vleeskalveren, rosevlees" }, + { value: "23", label: "Kalkoenen - Mest, alle systemen" }, + { value: "30", label: "Kippen - Drijfmest" }, + { value: "31", label: "Kippen - Deeppitstal, kanalenstal" }, + { value: "32", label: "Kippen - Mestband" }, + { value: "33", label: "Kippen - Mestband + nadroog" }, + { + value: "35", + label: "Kippen - Geheel of gedeeltelijk strooiselstal (incl. volièrestal/scharrelstal)", + }, + { + value: "39", + label: "Vleeskuikens en parelhoenders - Mest, alle systemen", + }, + { value: "40", label: "Varkens - Vaste mest" }, + { value: "41", label: "Varkens - Filtraat na mestscheiding" }, + { value: "42", label: "Varkens - Gier" }, + { value: "43", label: "Varkens - Koek na mestscheiding" }, + { + value: "46", + label: "Varkens - Drijfmest fokzeugen, incl. biggen, opfokzeugen/-beren, dekberen", + }, + { value: "50", label: "Varkens - Drijfmest vleesvarkens" }, + { value: "56", label: "Schapen - Mest, alle systemen" }, + { value: "60", label: "Geiten - Drijfmest" }, + { value: "61", label: "Geiten - Vaste mest" }, + { value: "75", label: "Nertsen - Vaste mest" }, + { value: "76", label: "Nertsen - Drijfmest" }, + { value: "80", label: "Eenden - Vaste mest" }, + { value: "81", label: "Eenden - Drijfmest" }, + { value: "90", label: "Konijnen - Vaste mest" }, + { + value: "91", + label: "Konijnen - Drijfmest met percentage droge stof < 2,5%", + }, + { value: "92", label: "Konijnen - Drijfmest" }, + { value: "25", label: "Paarden - Vaste mest" }, + { value: "26", label: "Ezels - Vaste mest" }, + { value: "27", label: "Pony’s - Vaste mest" }, + { value: "95", label: "Herten - Vaste mest" }, + { value: "96", label: "Waterbuffels - Mest, alle systemen" }, + { value: "97", label: "Knobbelgans - Vaste mest" }, + { value: "98", label: "Grauwe gans - Vaste mest" }, + { value: "99", label: "Fazanten en patrijzen - Vaste mest" }, + { value: "100", label: "Struisvogels, emoes en nandoes - Vaste mest" }, + { value: "101", label: "Vleesduif - Vaste mest" }, + { value: "102", label: "Bruine rat - Vaste mest" }, + { value: "103", label: "Tamme muis - Vaste mest" }, + { value: "104", label: "Cavia - Vaste mest" }, + { value: "105", label: "Goudhamster - Vaste mest" }, + { value: "106", label: "Gerbil - Vaste mest" }, + { value: "107", label: "Fase 1 substraat" }, + { value: "108", label: "Fase 2 substraat" }, + { value: "109", label: "Fase 3 substraat" }, + { value: "110", label: "Champost" }, + { value: "111", label: "Compost" }, + { value: "112", label: "Zeer schone compost" }, + { value: "113", label: "Zuiveringsslib vloeibaar" }, + { value: "114", label: "Zuiveringsslib steekvast" }, + { value: "115", label: "Kunstmest" }, + { value: "116", label: "Overige mestsoorten" }, + { value: "117", label: "Gescheiden champost" }, + { value: "120", label: "Mineralenconcentraat" }, +] +const typeRvoEnum = fdmSchema.enum( + "p_type_rvo", + typeRvoOptions.map((x) => x.value) as [string, ...string[]], +) + // Define fertilizers_catalogue table export const fertilizersCatalogue = fdmSchema.table( "fertilizers_catalogue", @@ -257,6 +335,7 @@ export const fertilizersCatalogue = fdmSchema.table( p_type_manure: boolean(), p_type_mineral: boolean(), p_type_compost: boolean(), + p_type_rvo: typeRvoEnum(), hash: text(), created: timestamp({ withTimezone: true }).notNull().defaultNow(), updated: timestamp({ withTimezone: true }), diff --git a/fdm-core/src/fertilizer.d.ts b/fdm-core/src/fertilizer.d.ts index 8f49ee459..e49103288 100644 --- a/fdm-core/src/fertilizer.d.ts +++ b/fdm-core/src/fertilizer.d.ts @@ -1,4 +1,5 @@ import type { ApplicationMethods } from "@svenvw/fdm-data" +import type * as schema from "./db/schema" export interface Fertilizer { p_id: string @@ -41,6 +42,7 @@ export interface Fertilizer { p_cl_rt: number | null p_ef_nh3: number | null p_type: FertilizerType | null + p_type_rvo: schema.fertilizersCatalogueTypeSelect["p_type_rvo"] } type FertilizerType = "manure" | "mineral" | "compost" @@ -105,6 +107,7 @@ export type FertilizerParameters = | "p_cl_rt" | "p_ef_nh3" | "p_type" + | "p_type_rvo" export interface FertilizerParameterDescriptionItem { parameter: FertilizerParameters @@ -121,7 +124,13 @@ export interface FertilizerParameterDescriptionItem { | "physical" min?: number max?: number - options?: { value: FertilizerType | ApplicationMethods; label: string }[] + options?: { + value: + | FertilizerType + | ApplicationMethods + | schema.fertilizersCatalogueTypeSelect["p_type_rvo"] + label: string + }[] } export type FertilizerParameterDescription = diff --git a/fdm-core/src/fertilizer.test.ts b/fdm-core/src/fertilizer.test.ts index f3aa65da0..34936d689 100644 --- a/fdm-core/src/fertilizer.test.ts +++ b/fdm-core/src/fertilizer.test.ts @@ -131,6 +131,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) @@ -210,6 +211,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) @@ -287,6 +289,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) @@ -377,6 +380,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) @@ -476,6 +480,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) }) @@ -692,6 +697,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: null, p_type: "manure", + p_type_rvo: "10", }, ) const updatedProperties = { @@ -807,6 +813,7 @@ describe("Fertilizer Data Model", () => { p_cl_rt: 390, p_ef_nh3: 0.8, p_type: "mineral", + p_type_rvo: "115", }, ) @@ -992,7 +999,7 @@ describe("Fertilizer Data Model", () => { b_id, timeframe, ) - fertilizerApplications.map((application) => { + fertilizerApplications.forEach((application) => { expect( application.p_app_date?.getTime(), ).toBeGreaterThanOrEqual(timeframe.start.getTime()) diff --git a/fdm-core/src/fertilizer.ts b/fdm-core/src/fertilizer.ts index 901dc9410..da5d79622 100644 --- a/fdm-core/src/fertilizer.ts +++ b/fdm-core/src/fertilizer.ts @@ -137,6 +137,7 @@ export async function addFertilizerToCatalogue( p_cl_rt: schema.fertilizersCatalogueTypeInsert["p_cl_rt"] p_ef_nh3: schema.fertilizersCatalogueTypeInsert["p_ef_nh3"] p_type: "manure" | "mineral" | "compost" | null + p_type_rvo: schema.fertilizersCatalogueTypeInsert["p_type_rvo"] }, ): Promise { try { @@ -326,6 +327,7 @@ export async function getFertilizer( p_type_manure: schema.fertilizersCatalogue.p_type_manure, p_type_mineral: schema.fertilizersCatalogue.p_type_mineral, p_type_compost: schema.fertilizersCatalogue.p_type_compost, + p_type_rvo: schema.fertilizersCatalogue.p_type_rvo, }) .from(schema.fertilizers) .leftJoin( @@ -437,6 +439,7 @@ export async function updateFertilizerFromCatalogue( p_cl_rt: schema.fertilizersCatalogueTypeInsert["p_cl_rt"] p_ef_nh3: schema.fertilizersCatalogueTypeInsert["p_ef_nh3"] p_type: "manure" | "mineral" | "compost" | null + p_type_rvo: schema.fertilizersCatalogueTypeInsert["p_type_rvo"] }>, ): Promise { try { @@ -597,6 +600,7 @@ export async function getFertilizers( p_type_manure: schema.fertilizersCatalogue.p_type_manure, p_type_mineral: schema.fertilizersCatalogue.p_type_mineral, p_type_compost: schema.fertilizersCatalogue.p_type_compost, + p_type_rvo: schema.fertilizersCatalogue.p_type_rvo, }) .from(schema.fertilizers) .leftJoin( @@ -1047,6 +1051,15 @@ export function getFertilizerParametersDescription( { value: "compost", label: "Compost" }, ], }, + { + parameter: "p_type_rvo", + unit: "", + name: "Mestcode (RVO)", + type: "enum", + category: "general", + description: "Mestcode volgens RVO", + options: schema.typeRvoOptions, + }, { parameter: "p_app_method_options", unit: "", From d6b8900a8140e6ada86e13218c94d394ae73fe39 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:31:27 +0200 Subject: [PATCH 002/243] feat: add p_type_rvo to baat catalogue --- .changeset/rich-nails-march.md | 5 ++ fdm-data/src/fertilizers/catalogues/baat.json | 70 +++++++++++++++++++ fdm-data/src/fertilizers/catalogues/baat.ts | 1 + fdm-data/src/fertilizers/d.ts | 1 + fdm-data/src/fertilizers/hash.test.ts | 9 ++- fdm-data/src/fertilizers/index.test.ts | 1 + 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 .changeset/rich-nails-march.md diff --git a/.changeset/rich-nails-march.md b/.changeset/rich-nails-march.md new file mode 100644 index 000000000..bf920d65d --- /dev/null +++ b/.changeset/rich-nails-march.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-data": minor +--- + +Add `p_type_rvo` to `baat` catalogue diff --git a/fdm-data/src/fertilizers/catalogues/baat.json b/fdm-data/src/fertilizers/catalogues/baat.json index fd4ed7de5..692d7a340 100644 --- a/fdm-data/src/fertilizers/catalogues/baat.json +++ b/fdm-data/src/fertilizers/catalogues/baat.json @@ -34,6 +34,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -74,6 +75,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -114,6 +116,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "spoke wheel||spraying", "p_type_mineral": true, "p_type_manure": false, @@ -154,6 +157,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -194,6 +198,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -234,6 +239,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -274,6 +280,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -314,6 +321,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -354,6 +362,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -394,6 +403,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": false, @@ -434,6 +444,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": false, @@ -474,6 +485,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -514,6 +526,7 @@ "p_mn_rt": 20, "p_mo_rt": 1, "p_zn_rt": 42, + "p_type_rvo": 110, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -554,6 +567,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -594,6 +608,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -634,6 +649,7 @@ "p_mn_rt": 277, "p_mo_rt": 1, "p_zn_rt": 73, + "p_type_rvo": 80, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -674,6 +690,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -714,6 +731,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -754,6 +772,7 @@ "p_mn_rt": 27, "p_mo_rt": 1, "p_zn_rt": 55, + "p_type_rvo": 61, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -794,6 +813,7 @@ "p_mn_rt": 20, "p_mo_rt": 1, "p_zn_rt": 111, + "p_type_rvo": 111, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -834,6 +854,7 @@ "p_mn_rt": 20, "p_mo_rt": 1, "p_zn_rt": 38, + "p_type_rvo": 111, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": false, @@ -874,6 +895,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -914,6 +936,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -954,6 +977,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -994,6 +1018,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1034,6 +1059,7 @@ "p_mn_rt": 277, "p_mo_rt": 2, "p_zn_rt": 167, + "p_type_rvo": 23, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1074,6 +1100,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1114,6 +1141,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1154,6 +1182,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1194,6 +1223,7 @@ "p_mn_rt": 277, "p_mo_rt": 2, "p_zn_rt": 190, + "p_type_rvo": 35, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1234,6 +1264,7 @@ "p_mn_rt": 27, "p_mo_rt": 1, "p_zn_rt": 81, + "p_type_rvo": 90, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1274,6 +1305,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1314,6 +1346,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1354,6 +1387,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1394,6 +1428,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 120, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -1434,6 +1469,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1474,6 +1510,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1514,6 +1551,7 @@ "p_mn_rt": 27, "p_mo_rt": 1, "p_zn_rt": 89, + "p_type_rvo": 75, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1554,6 +1592,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1594,6 +1633,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1634,6 +1674,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1674,6 +1715,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1714,6 +1756,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1754,6 +1797,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "spoke wheel||spraying", "p_type_mineral": true, "p_type_manure": false, @@ -1794,6 +1838,7 @@ "p_mn_rt": 27, "p_mo_rt": 1, "p_zn_rt": 57, + "p_type_rvo": 25, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1834,6 +1879,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -1874,6 +1920,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 33, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1914,6 +1961,7 @@ "p_mn_rt": 13, "p_mo_rt": 0, "p_zn_rt": 4, + "p_type_rvo": 19, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -1954,6 +2002,7 @@ "p_mn_rt": 27, "p_mo_rt": 0, "p_zn_rt": 38, + "p_type_rvo": 10, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -1994,6 +2043,7 @@ "p_mn_rt": 13, "p_mo_rt": 0, "p_zn_rt": 17, + "p_type_rvo": 14, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2034,6 +2084,7 @@ "p_mn_rt": 13, "p_mo_rt": 0, "p_zn_rt": 5, + "p_type_rvo": 12, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2074,6 +2125,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 13, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -2114,6 +2166,7 @@ "p_mn_rt": 27, "p_mo_rt": 1, "p_zn_rt": 55, + "p_type_rvo": 56, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -2154,6 +2207,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 116, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2194,6 +2248,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -2234,6 +2289,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -2274,6 +2330,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "spoke wheel||spraying", "p_type_mineral": true, "p_type_manure": false, @@ -2314,6 +2371,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -2354,6 +2412,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "spoke wheel||spraying", "p_type_mineral": true, "p_type_manure": false, @@ -2394,6 +2453,7 @@ "p_mn_rt": 494, "p_mo_rt": 1, "p_zn_rt": 248, + "p_type_rvo": 40, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -2434,6 +2494,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 43, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -2474,6 +2535,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": false, "p_type_manure": false, @@ -2514,6 +2576,7 @@ "p_mn_rt": 277, "p_mo_rt": 2, "p_zn_rt": 23, + "p_type_rvo": 39, "p_app_method_options": "incorporation||incorporation 2 tracks", "p_type_mineral": false, "p_type_manure": true, @@ -2554,6 +2617,7 @@ "p_mn_rt": 27, "p_mo_rt": 0, "p_zn_rt": 89, + "p_type_rvo": 50, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2594,6 +2658,7 @@ "p_mn_rt": 27, "p_mo_rt": 0, "p_zn_rt": 81, + "p_type_rvo": 42, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2634,6 +2699,7 @@ "p_mn_rt": 13, "p_mo_rt": 0, "p_zn_rt": 4, + "p_type_rvo": 18, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2674,6 +2740,7 @@ "p_mn_rt": 28, "p_mo_rt": 0, "p_zn_rt": 64, + "p_type_rvo": 46, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2714,6 +2781,7 @@ "p_mn_rt": 28, "p_mo_rt": 0, "p_zn_rt": 10, + "p_type_rvo": 42, "p_app_method_options": "slotted coulter||incorporation||incorporation 2 tracks||injection||shallow injection||narrowband", "p_type_mineral": false, "p_type_manure": true, @@ -2754,6 +2822,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, @@ -2794,6 +2863,7 @@ "p_mn_rt": null, "p_mo_rt": null, "p_zn_rt": null, + "p_type_rvo": 115, "p_app_method_options": "broadcasting||pocket placement||incorporation", "p_type_mineral": true, "p_type_manure": false, diff --git a/fdm-data/src/fertilizers/catalogues/baat.ts b/fdm-data/src/fertilizers/catalogues/baat.ts index 00469de1f..f6e6b6e19 100644 --- a/fdm-data/src/fertilizers/catalogues/baat.ts +++ b/fdm-data/src/fertilizers/catalogues/baat.ts @@ -90,6 +90,7 @@ export async function getCatalogueBaat(): Promise { p_type_manure: fertilizer.p_type_manure, p_type_mineral: fertilizer.p_type_mineral, p_type_compost: fertilizer.p_type_compost, + p_type_rvo: fertilizer.p_type_rvo === undefined ? null : String(fertilizer.p_type_rvo), hash: null, } diff --git a/fdm-data/src/fertilizers/d.ts b/fdm-data/src/fertilizers/d.ts index d69fe41a0..7b1df1d6b 100644 --- a/fdm-data/src/fertilizers/d.ts +++ b/fdm-data/src/fertilizers/d.ts @@ -65,6 +65,7 @@ export interface CatalogueFertilizerItem { p_type_manure?: boolean | null p_type_mineral?: boolean | null p_type_compost?: boolean | null + p_type_rvo?: string | null hash?: string | null | undefined } diff --git a/fdm-data/src/fertilizers/hash.test.ts b/fdm-data/src/fertilizers/hash.test.ts index c5750dc5d..8ca9260b4 100644 --- a/fdm-data/src/fertilizers/hash.test.ts +++ b/fdm-data/src/fertilizers/hash.test.ts @@ -56,13 +56,14 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const hash = await hashFertilizer(fertilizer) expect(hash).toBeDefined() expect(typeof hash).toBe("string") expect(hash.length).toBeGreaterThan(0) - expect(hash).toBe("08585267") + expect(hash).toBe("dfb35759") }) it("should generate different hashes for different fertilizer items", async () => { @@ -117,6 +118,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const fertilizer2: CatalogueFertilizerItem = { @@ -170,6 +172,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const hash1 = await hashFertilizer(fertilizer1) @@ -230,6 +233,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const fertilizer2: CatalogueFertilizerItem = { @@ -294,6 +298,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const fertilizer2: CatalogueFertilizerItem = { @@ -358,6 +363,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const fertilizer2: CatalogueFertilizerItem = { @@ -422,6 +428,7 @@ describe("hashFertilizer", () => { p_type_manure: true, p_type_mineral: false, p_type_compost: false, + p_type_rvo: "42", } const fertilizer2: CatalogueFertilizerItem = { diff --git a/fdm-data/src/fertilizers/index.test.ts b/fdm-data/src/fertilizers/index.test.ts index 9d05da434..57f774ed4 100644 --- a/fdm-data/src/fertilizers/index.test.ts +++ b/fdm-data/src/fertilizers/index.test.ts @@ -173,6 +173,7 @@ describe("getCatalogueBaat", async () => { expect(item).toHaveProperty("p_type_manure") expect(item).toHaveProperty("p_type_mineral") expect(item).toHaveProperty("p_type_compost") + expect(item).toHaveProperty("p_type_rvo") expect(item).toHaveProperty("hash") } }) From b58cd0784fc7f493fbe0991903d4944fd9039263 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 30 Sep 2025 14:20:11 +0200 Subject: [PATCH 003/243] feat: Add the functions `addOrganicCertification`, `isOrganicCertificationValid, `listOrganicCertifications`, `getOrganicCertification` and `removeOrganicCertification` to manage organic certifications of a farm --- .changeset/odd-berries-dress.md | 5 + .changeset/ripe-plants-train.md | 5 + fdm-core/src/db/schema.ts | 45 ++++ fdm-core/src/index.ts | 8 + fdm-core/src/organic.d.ts | 9 + fdm-core/src/organic.test.ts | 257 ++++++++++++++++++++ fdm-core/src/organic.ts | 410 ++++++++++++++++++++++++++++++++ 7 files changed, 739 insertions(+) create mode 100644 .changeset/odd-berries-dress.md create mode 100644 .changeset/ripe-plants-train.md create mode 100644 fdm-core/src/organic.d.ts create mode 100644 fdm-core/src/organic.test.ts create mode 100644 fdm-core/src/organic.ts diff --git a/.changeset/odd-berries-dress.md b/.changeset/odd-berries-dress.md new file mode 100644 index 000000000..8bf4b3bad --- /dev/null +++ b/.changeset/odd-berries-dress.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Add the functions `addOrganicCertification`, `isOrganicCertificationValid, `listOrganicCertifications`, `getOrganicCertification`and`removeOrganicCertification` to manage organic certifications of a farm diff --git a/.changeset/ripe-plants-train.md b/.changeset/ripe-plants-train.md new file mode 100644 index 000000000..397068bce --- /dev/null +++ b/.changeset/ripe-plants-train.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Add tables `organic_certifications` and `organic_certifications_holding`to store information of farm if they have organic certificates diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index e9c771b72..688469126 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -791,6 +791,51 @@ export type derogationApplyingTypeSelect = export type derogationApplyingTypeInsert = typeof derogationApplying.$inferInsert +// Define organics table +export const organicCertifications = fdmSchema.table("organic_certifications", { + b_id_organic: text().primaryKey(), + b_organic_traces: text(), + b_organic_skal: text(), + b_organic_issued: timestamp({ withTimezone: true }), + b_organic_expires: timestamp({ withTimezone: true }), + created: timestamp({ withTimezone: true }).notNull().defaultNow(), + updated: timestamp({ withTimezone: true }), +}) + +export type organicCertificationsTypeSelect = + typeof organicCertifications.$inferSelect +export type organicCertificationsTypeInsert = + typeof organicCertifications.$inferInsert + +// Define organic_certifications_holding table +export const organicCertificationsHolding = fdmSchema.table( + "organic_certifications_holding", + { + b_id_farm: text() + .notNull() + .references(() => farms.b_id_farm), + b_id_organic: text() + .notNull() + .references(() => organicCertifications.b_id_organic), + created: timestamp({ withTimezone: true }).notNull().defaultNow(), + updated: timestamp({ withTimezone: true }), + }, + (table) => { + return [ + { + pk: primaryKey({ + columns: [table.b_id_farm, table.b_id_organic], + }), + }, + ] + }, +) + +export type organicCertificationsHoldingTypeSelect = + typeof organicCertificationsHolding.$inferSelect +export type organicCertificationsHoldingTypeInsert = + typeof organicCertificationsHolding.$inferInsert + // Define fertilizer_catalogue_enabling table export const fertilizerCatalogueEnabling = fdmSchema.table( "fertilizer_catalogue_enabling", diff --git a/fdm-core/src/index.ts b/fdm-core/src/index.ts index 3f8138505..b42d22efc 100644 --- a/fdm-core/src/index.ts +++ b/fdm-core/src/index.ts @@ -150,3 +150,11 @@ export type { SoilParameters, } from "./soil.d" export type { Timeframe } from "./timeframe.d" +export { + addOrganicCertification, + isOrganicCertificationValid, + listOrganicCertifications, + getOrganicCertification, + removeOrganicCertification, +} from "./organic" +export type { OrganicCertification } from "./organic.d" diff --git a/fdm-core/src/organic.d.ts b/fdm-core/src/organic.d.ts new file mode 100644 index 000000000..710fedde5 --- /dev/null +++ b/fdm-core/src/organic.d.ts @@ -0,0 +1,9 @@ +import type * as schema from "./db/schema" + +export type OrganicCertification = { + b_id_organic: schema.organicCertificationsTypeSelect["b_id_organic"] + b_organic_traces: schema.organicCertificationsTypeSelect["b_organic_traces"] + b_organic_skal: schema.organicCertificationsTypeSelect["b_organic_skal"] + b_organic_issued: schema.organicCertificationsTypeSelect["b_organic_issued"] + b_organic_expires: schema.organicCertificationsTypeSelect["b_organic_expires"] +} diff --git a/fdm-core/src/organic.test.ts b/fdm-core/src/organic.test.ts new file mode 100644 index 000000000..663af1a67 --- /dev/null +++ b/fdm-core/src/organic.test.ts @@ -0,0 +1,257 @@ +import { eq } from "drizzle-orm" +import { afterEach, beforeEach, describe, expect, it } from "vitest" +import { createFdmServer } from "./fdm-server" +import * as schema from "./db/schema" +import * as authNSchema from "./db/schema-authn" +import { addFarm } from "./farm" +import { + addOrganicCertification, + getOrganicCertification, + isOrganicCertificationValid, + listOrganicCertifications, + removeOrganicCertification, +} from "./organic" + +// Helper function to create a principal for testing purposes +async function createPrincipal(fdm: Awaited>, username: string): Promise { + const newPrincipalId = `principal-${Math.random().toString(36).substring(2, 9)}` + await fdm.insert(authNSchema.user).values({ + id: newPrincipalId, + name: username, + email: `${username}@example.com`, + emailVerified: true, + createdAt: new Date(), + updatedAt: new Date(), + username: username, + lang: "en-US", + }) + return newPrincipalId +} + +describe("Organic Certifications", () => { + let fdm: Awaited> + let principalId: string + let farmId: string + + beforeEach(async () => { + fdm = createFdmServer( + "localhost", + 5432, + "postgres", + "postgres", + "fdm", + ) + principalId = await createPrincipal(fdm, "test-principal") + farmId = await addFarm(fdm, principalId, "Test Farm", undefined, undefined, undefined) + }) + + // afterEach(async () => { + // await fdm.delete(schema.farms) + // await fdm.delete(authNSchema.user) // Corrected to authNSchema.user + // await fdm.delete(schema.organicCertifications) + // await fdm.delete(schema.organicCertificationsHolding) + // await fdm.$client.end() + // }) + + it("should add a new organic certification", async () => { + const traces = "NL-BIO-01.528-0002967.2025.001" + const skal = "026281" + const issued = new Date("2024-01-01T00:00:00Z") + const expires = new Date("2025-12-31T23:59:59Z") + + const certificationId = await addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ) + + expect(certificationId).toBeDefined() + + const certifications = await fdm + .select() + .from(schema.organicCertifications) + .where(eq(schema.organicCertifications.b_id_organic, certificationId)) + + expect(certifications.length).toBe(1) + expect(certifications[0].b_organic_traces).toBe(traces) + expect(certifications[0].b_organic_skal).toBe(skal) + expect(certifications[0].b_organic_issued?.toISOString()).toBe(issued.toISOString()) + expect(certifications[0].b_organic_expires?.toISOString()).toBe(expires.toISOString()) + + const fetchedCertification = await getOrganicCertification(fdm, principalId, certificationId) + expect(fetchedCertification).toBeDefined() + expect(fetchedCertification?.b_id_organic).toBe(certificationId) + expect(fetchedCertification?.b_organic_traces).toBe(traces) + }) + + it("should throw an error for invalid TRACES format", async () => { + const traces = "INVALID-TRACES" + const skal = "026281" + const issued = new Date("2024-01-01T00:00:00Z") + const expires = new Date("2025-12-31T23:59:59Z") + + await expect( + addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ), + ).rejects.toThrow("Invalid TRACES document number format.") + }) + + it("should throw an error for invalid SKAL format", async () => { + const traces = "NL-BIO-01.528-0002967.2025.001" + const skal = "INVALID" + const issued = new Date("2024-01-01T00:00:00Z") + const expires = new Date("2025-12-31T23:59:59Z") + + await expect( + addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ), + ).rejects.toThrow("Invalid SKAL number format.") + }) + + it("should throw an error if issue date is after expiry date", async () => { + const traces = "NL-BIO-01.528-0002967.2025.001" + const skal = "026281" + const issued = new Date("2025-01-01T00:00:00Z") + const expires = new Date("2024-12-31T23:59:59Z") + + await expect( + addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ), + ).rejects.toThrow("Issue date must be before expiry date.") + }) + + it("should list organic certifications for a farm", async () => { + const traces1 = "NL-BIO-01.528-0002967.2025.001" + const skal1 = "026281" + const issued1 = new Date("2024-01-01T00:00:00Z") + const expires1 = new Date("2025-12-31T23:59:59Z") + await addOrganicCertification( + fdm, + principalId, + farmId, + traces1, + skal1, + issued1, + expires1, + ) + + const traces2 = "NL-BIO-01.528-0005471.2025.001" + const skal2 = "024295" + const issued2 = new Date("2023-06-01T00:00:00Z") + const expires2 = new Date("2026-05-31T23:59:59Z") + await addOrganicCertification( + fdm, + principalId, + farmId, + traces2, + skal2, + issued2, + expires2, + ) + + const certifications = await listOrganicCertifications( + fdm, + principalId, + farmId, + ) + + expect(certifications.length).toBe(2) + expect(certifications[0].b_organic_traces).toBe(traces1) + expect(certifications[1].b_organic_traces).toBe(traces2) + }) + + it("should remove an organic certification", async () => { + const traces = "NL-BIO-01.528-0002967.2025.001" + const skal = "026281" + const issued = new Date("2024-01-01T00:00:00Z") + const expires = new Date("2025-12-31T23:59:59Z") + + const certificationId = await addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ) + + await removeOrganicCertification(fdm, principalId, certificationId) + + const certifications = await fdm + .select() + .from(schema.organicCertifications) + .where(eq(schema.organicCertifications.b_id_organic, certificationId)) + + expect(certifications.length).toBe(0) + }) + + it("should check if an organic certification is valid for a given date", async () => { + const traces = "NL-BIO-01.528-0002967.2025.001" + const skal = "026281" + const issued = new Date("2024-01-01T00:00:00Z") + const expires = new Date("2025-12-31T23:59:59Z") + + await addOrganicCertification( + fdm, + principalId, + farmId, + traces, + skal, + issued, + expires, + ) + + const validDate = new Date("2025-06-15T12:00:00Z") + const isValid = await isOrganicCertificationValid( + fdm, + principalId, + farmId, + validDate, + ) + expect(isValid).toBe(true) + + const expiredDate = new Date("2026-01-01T00:00:00Z") + const isExpired = await isOrganicCertificationValid( + fdm, + principalId, + farmId, + expiredDate, + ) + expect(isExpired).toBe(false) + + const futureDate = new Date("2023-12-31T23:59:59Z") + const isFuture = await isOrganicCertificationValid( + fdm, + principalId, + farmId, + futureDate, + ) + expect(isFuture).toBe(false) + }) +}) diff --git a/fdm-core/src/organic.ts b/fdm-core/src/organic.ts new file mode 100644 index 000000000..155bce0c0 --- /dev/null +++ b/fdm-core/src/organic.ts @@ -0,0 +1,410 @@ +import { and, eq, inArray, lte, gte } from "drizzle-orm" +import { checkPermission } from "./authorization" +import type { PrincipalId } from "./authorization.d" +import * as schema from "./db/schema" +import { handleError } from "./error" +import type { FdmType } from "./fdm" +import { createId } from "./id" +import type { OrganicCertification } from "./organic.d" + +/** + * Regular expression for validating EU TRACES document numbers for Organic Operator Certificates. + * Examples: NL-BIO-01.528-0002967.2025.001, NL-BIO-01.528-0005471.2025.001 + */ +const TRACES_REGEX = /^NL-BIO-\d{2}\.\d{3}-\d{7}\.\d{4}\.\d{3}$/ + +/** + * Regular expression for validating SKAL numbers. + * Examples: 026281, 024295 + */ +const SKAL_REGEX = /^\d{6}$/ + +/** + * Validates an EU TRACES document number. + * @param tracesNumber The TRACES document number to validate. + * @returns True if the TRACES number is valid, false otherwise. + */ +export function isValidTracesNumber(tracesNumber: string): boolean { + return TRACES_REGEX.test(tracesNumber) +} + +/** + * Validates a SKAL number. + * @param skalNumber The SKAL number to validate. + * @returns True if the SKAL number is valid, false otherwise. + */ +export function isValidSkalNumber(skalNumber: string): boolean { + return SKAL_REGEX.test(skalNumber) +} + +/** + * Adds a new organic certification for a specific farm. + * + * This function checks if the principal has 'write' permission on the farm, + * then creates a new organic certification and links it to the farm. + * It also validates the TRACES and SKAL numbers, and the issue/expiry dates. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The identifier of the principal creating the certification. + * @param b_id_farm The identifier of the farm receiving the certification. + * @param b_organic_traces The document number according to the EU Traces database. + * @param b_organic_skal The SKAL number. + * @param b_organic_issued The timestamp the certificate is valid from. + * @param b_organic_expires The timestamp the certificate expires. + * @returns The unique identifier for the new organic certification. + * @throws {Error} If the principal does not have permission, validation fails, or the database transaction fails. + */ +export async function addOrganicCertification( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeInsert["b_id_farm"], + b_organic_traces: schema.organicCertificationsTypeInsert["b_organic_traces"], + b_organic_skal: schema.organicCertificationsTypeInsert["b_organic_skal"], + b_organic_issued: schema.organicCertificationsTypeInsert["b_organic_issued"], + b_organic_expires: schema.organicCertificationsTypeInsert["b_organic_expires"], +): Promise { + if (b_organic_traces && !isValidTracesNumber(b_organic_traces)) { + throw new Error("Invalid TRACES document number format.") + } + if (b_organic_skal && !isValidSkalNumber(b_organic_skal)) { + throw new Error("Invalid SKAL number format.") + } + if ( + b_organic_issued && + b_organic_expires && + b_organic_issued.getTime() >= b_organic_expires.getTime() + ) { + throw new Error("Issue date must be before expiry date.") + } + + try { + return await fdm.transaction(async (tx: FdmType) => { + await checkPermission( + tx, + "farm", + "write", + b_id_farm, + principal_id, + "addOrganicCertification", + ) + + const existingCertification = await tx + .select({ id: schema.organicCertifications.b_id_organic }) + .from(schema.organicCertifications) + .leftJoin( + schema.organicCertificationsHolding, + eq( + schema.organicCertifications.b_id_organic, + schema.organicCertificationsHolding.b_id_organic, + ), + ) + .where( + and( + eq( + schema.organicCertificationsHolding.b_id_farm, + b_id_farm, + ), + b_organic_traces + ? eq( + schema.organicCertifications.b_organic_traces, + b_organic_traces, + ) + : undefined, + b_organic_skal + ? eq( + schema.organicCertifications.b_organic_skal, + b_organic_skal, + ) + : undefined, + ), + ) + .limit(1) + + if (existingCertification.length > 0) { + throw new Error( + "Organic certification with similar TRACES/SKAL number already exists for this farm.", + ) + } + + const b_id_organic = createId() + await tx.insert(schema.organicCertifications).values({ + b_id_organic, + b_organic_traces, + b_organic_skal, + b_organic_issued, + b_organic_expires, + }) + + await tx.insert(schema.organicCertificationsHolding).values({ + b_id_farm, + b_id_organic, + }) + + return b_id_organic + }) + } catch (err) { + throw handleError(err, "Exception for addOrganicCertification", { + b_id_farm, + b_organic_traces, + b_organic_skal, + }) + } +} + +/** + * Removes an organic certification. + * + * This function checks if the principal has 'write' permission on the associated farm, + * then deletes the certification and its link to the farm. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The identifier of the principal removing the certification. + * @param b_id_organic The identifier of the organic certification to remove. + * @throws {Error} If the principal does not have permission, the certification does not exist, or the database transaction fails. + */ +export async function removeOrganicCertification( + fdm: FdmType, + principal_id: PrincipalId, + b_id_organic: schema.organicCertificationsTypeInsert["b_id_organic"], +): Promise { + try { + await fdm.transaction(async (tx: FdmType) => { + const holding = await tx + .select() + .from(schema.organicCertificationsHolding) + .where( + eq( + schema.organicCertificationsHolding.b_id_organic, + b_id_organic, + ), + ) + + if (!holding[0]) { + throw new Error("Organic certification not found on any farm.") + } + + await checkPermission( + tx, + "farm", + "write", + holding[0].b_id_farm, + principal_id, + "removeOrganicCertification", + ) + + await tx + .delete(schema.organicCertificationsHolding) + .where( + eq( + schema.organicCertificationsHolding.b_id_organic, + b_id_organic, + ), + ) + + await tx + .delete(schema.organicCertifications) + .where( + eq(schema.organicCertifications.b_id_organic, b_id_organic), + ) + }) + } catch (err) { + throw handleError(err, "Exception for removeOrganicCertification", { + b_id_organic, + }) + } +} + +/** + * Lists all organic certifications for a given farm. + * + * This function checks if the principal has 'read' permission on the farm before returning the list. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The identifier of the principal requesting the list. + * @param b_id_farm The identifier of the farm. + * @returns A Promise that resolves with a list of organic certifications for the specified farm. + * @throws {Error} If the principal does not have permission to read the farm's certifications. + */ +export async function listOrganicCertifications( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeInsert["b_id_farm"], +): Promise { + try { + return await fdm.transaction(async (tx: FdmType) => { + await checkPermission( + tx, + "farm", + "read", + b_id_farm, + principal_id, + "listOrganicCertifications", + ) + + const holdings = await tx + .select({ + b_id_organic: + schema.organicCertificationsHolding.b_id_organic, + }) + .from(schema.organicCertificationsHolding) + .where( + eq( + schema.organicCertificationsHolding.b_id_farm, + b_id_farm, + ), + ) + + if (holdings.length === 0) { + return [] + } + + const organicIds = holdings.map( + (holding: { b_id_organic: string }) => holding.b_id_organic, + ) + + return await tx + .select() + .from(schema.organicCertifications) + .where( + inArray( + schema.organicCertifications.b_id_organic, + organicIds, + ), + ) + }) + } catch (err) { + throw handleError(err, "Exception for listOrganicCertifications", { + b_id_farm, + }) + } +} + +/** + * Retrieves the details of a single organic certification by its ID. + * + * This function checks if the principal has 'read' permission on the associated farm + * before returning the certification details. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The identifier of the principal requesting the certification. + * @param b_id_organic The identifier of the organic certification to retrieve. + * @returns A Promise that resolves with the organic certification details, or undefined if not found. + * @throws {Error} If the principal does not have permission or the database transaction fails. + */ +export async function getOrganicCertification( + fdm: FdmType, + principal_id: PrincipalId, + b_id_organic: schema.organicCertificationsTypeSelect["b_id_organic"], +): Promise { + try { + return await fdm.transaction(async (tx: FdmType) => { + const holding = await tx + .select({ + b_id_farm: schema.organicCertificationsHolding.b_id_farm, + }) + .from(schema.organicCertificationsHolding) + .where( + eq( + schema.organicCertificationsHolding.b_id_organic, + b_id_organic, + ), + ) + .limit(1) + + if (!holding[0]) { + return undefined // Certification not linked to any farm or does not exist + } + + await checkPermission( + tx, + "farm", + "read", + holding[0].b_id_farm, + principal_id, + "getOrganicCertification", + ) + + const certification = await tx + .select() + .from(schema.organicCertifications) + .where( + eq(schema.organicCertifications.b_id_organic, b_id_organic), + ) + .limit(1) + + return certification[0] + }) + } catch (err) { + throw handleError(err, "Exception for getOrganicCertification", { + b_id_organic, + }) + } +} + +/** + * Checks if a farm has a valid organic certification on a specific date. + * + * This function checks if the principal has 'read' permission on the farm. + * A certification is considered valid if the given date falls within its issued and expires dates. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The identifier of the principal making the request. + * @param b_id_farm The identifier of the farm. + * @param date The date to check for a valid certification. + * @returns A Promise that resolves to true if a valid organic certification is found, false otherwise. + * @throws {Error} If the principal does not have permission to read the farm's certifications. + */ +export async function isOrganicCertificationValid( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeInsert["b_id_farm"], + date: Date, +): Promise { + try { + return await fdm.transaction(async (tx: FdmType) => { + await checkPermission( + tx, + "farm", + "read", + b_id_farm, + principal_id, + "isOrganicCertificationValid", + ) + + const result = await tx + .select({ id: schema.organicCertifications.b_id_organic }) + .from(schema.organicCertifications) + .leftJoin( + schema.organicCertificationsHolding, + eq( + schema.organicCertifications.b_id_organic, + schema.organicCertificationsHolding.b_id_organic, + ), + ) + .where( + and( + eq( + schema.organicCertificationsHolding.b_id_farm, + b_id_farm, + ), + lte( + schema.organicCertifications.b_organic_issued, + date, + ), + gte( + schema.organicCertifications.b_organic_expires, + date, + ), + ), + ) + .limit(1) + + return result.length > 0 + }) + } catch (err) { + throw handleError(err, "Exception for isOrganicCertificationValid", { + b_id_farm, + date, + }) + } +} From c3c96e3925fd3a7abac47e20d77f3fd527dd7bf7 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:00:12 +0200 Subject: [PATCH 004/243] refactor: use correct loop --- fdm-core/src/fertilizer.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-core/src/fertilizer.test.ts b/fdm-core/src/fertilizer.test.ts index f3aa65da0..fcfbc5a8a 100644 --- a/fdm-core/src/fertilizer.test.ts +++ b/fdm-core/src/fertilizer.test.ts @@ -992,7 +992,7 @@ describe("Fertilizer Data Model", () => { b_id, timeframe, ) - fertilizerApplications.map((application) => { + fertilizerApplications.forEach((application) => { expect( application.p_app_date?.getTime(), ).toBeGreaterThanOrEqual(timeframe.start.getTime()) From a226f7eb870bf953f22f4bf0b7b17876a3cc7f2e Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:24:54 +0200 Subject: [PATCH 005/243] feat: adds b_lu_start_default and b_date_harvest_default --- .changeset/cold-jars-marry.md | 5 + .changeset/evil-walls-read.md | 5 + fdm-core/src/cultivation.test.ts | 135 +- fdm-core/src/cultivation.ts | 21 + .../src/db/migrations/0014_clean_calypso.sql | 2 + .../src/db/migrations/meta/0014_snapshot.json | 3108 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 213 +- fdm-core/src/db/schema.ts | 2 + 8 files changed, 3387 insertions(+), 104 deletions(-) create mode 100644 .changeset/cold-jars-marry.md create mode 100644 .changeset/evil-walls-read.md create mode 100644 fdm-core/src/db/migrations/0014_clean_calypso.sql create mode 100644 fdm-core/src/db/migrations/meta/0014_snapshot.json diff --git a/.changeset/cold-jars-marry.md b/.changeset/cold-jars-marry.md new file mode 100644 index 000000000..a2cb4d927 --- /dev/null +++ b/.changeset/cold-jars-marry.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Adds `b_lu_start_default` to cultivations catalogue as the default start date of a cultivation diff --git a/.changeset/evil-walls-read.md b/.changeset/evil-walls-read.md new file mode 100644 index 000000000..be179e661 --- /dev/null +++ b/.changeset/evil-walls-read.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Adds `b_date_harvest_default` to cultivations catalogue as the default harvest date of a cultivation diff --git a/fdm-core/src/cultivation.test.ts b/fdm-core/src/cultivation.test.ts index d13af0213..a737994ef 100644 --- a/fdm-core/src/cultivation.test.ts +++ b/fdm-core/src/cultivation.test.ts @@ -116,6 +116,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: ["variety1", "variety2"], + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) b_lu_start = new Date("2024-01-01") @@ -162,6 +164,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: ["variety1", "variety2"], + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) const cultivations = await getCultivationsFromCatalogue( @@ -217,6 +221,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }), ).rejects.toThrow() }) @@ -433,6 +439,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) await updateCultivation( @@ -505,6 +513,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) const newSowingDate = new Date("2024-02-01") @@ -549,6 +559,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) await updateCultivation(fdm, principal_id, b_lu, newCatalogueId) @@ -787,7 +799,7 @@ describe("Cultivation Data Model", () => { b_lu_harvestable: "once", b_lu_hcat3: "test-hcat3", b_lu_hcat3_name: "Test HCAT3 Name", - b_lu_croprotation: "cereal", + b_lu_croprotation: "cereal", // This is the problematic line b_lu_yield: 6000, b_lu_hi: 0.4, b_lu_n_harvestable: 4, @@ -795,6 +807,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: b_lu_variety_options, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) const cultivations = await getCultivationsFromCatalogue( @@ -811,6 +825,113 @@ describe("Cultivation Data Model", () => { b_lu_variety_options, ) }) + + it("should throw an error for invalid b_lu_start_default format", async () => { + const b_lu_catalogue = createId() + + await expect( + addCultivationToCatalogue(fdm, { + b_lu_catalogue, + b_lu_source: b_lu_source, + b_lu_name: "Test Cultivation", + b_lu_name_en: "Test Cultivation (EN)", + b_lu_harvestable: "once" as const, + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "Test HCAT3 Name", + b_lu_croprotation: "cereal", + b_lu_yield: 6000, + b_lu_hi: 0.4, + b_lu_n_harvestable: 4, + b_lu_n_residue: 2, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: ["v1", "v2"], + b_lu_start_default: "2024-03-01", // Invalid format + b_date_harvest_default: "09-15", + }), + ).rejects.toThrow( + "Invalid b_lu_start_default format. Expected MM-dd.", + ) + }) + + it("should throw an error for invalid b_date_harvest_default format", async () => { + const b_lu_catalogue = createId() + await expect( + addCultivationToCatalogue(fdm, { + b_lu_catalogue, + b_lu_source: b_lu_source, + b_lu_name: "Test Cultivation", + b_lu_name_en: "Test Cultivation (EN)", + b_lu_harvestable: "once" as const, + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "Test HCAT3 Name", + b_lu_croprotation: "cereal", + b_lu_yield: 6000, + b_lu_hi: 0.4, + b_lu_n_harvestable: 4, + b_lu_n_residue: 2, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: ["v1", "v2"], + b_lu_start_default: "03-01", + b_date_harvest_default: "2024-09-15", // Invalid format + }), + ).rejects.toThrow( + "Invalid b_date_harvest_default format. Expected MM-dd.", + ) + }) + + it("should not throw an error for valid date formats", async () => { + const b_lu_catalogue = createId() + + await expect( + addCultivationToCatalogue(fdm, { + b_lu_catalogue, + b_lu_source: b_lu_source, + b_lu_name: "Test Cultivation", + b_lu_name_en: "Test Cultivation (EN)", + b_lu_harvestable: "once" as const, + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "Test HCAT3 Name", + b_lu_croprotation: "cereal", + b_lu_yield: 6000, + b_lu_hi: 0.4, + b_lu_n_harvestable: 4, + b_lu_n_residue: 2, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: ["v1", "v2"], + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", + }), + ).resolves.not.toThrow() + }) + + it("should not throw an error when date fields are null", async () => { + const b_lu_catalogue = createId() + + await expect( + addCultivationToCatalogue(fdm, { + b_lu_catalogue, + b_lu_source: b_lu_source, + b_lu_name: "Test Cultivation", + b_lu_name_en: "Test Cultivation (EN)", + b_lu_harvestable: "once" as const, + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "Test HCAT3 Name", + b_lu_croprotation: "maize", + b_lu_yield: 6000, + b_lu_hi: 0.4, + b_lu_n_harvestable: 4, + b_lu_n_residue: 2, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: ["v1", "v2"], + b_lu_start_default: null, + b_date_harvest_default: null, + }), + ).resolves.not.toThrow() + }) }) describe("Cultivation Plan", () => { @@ -899,6 +1020,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) await addCultivation( @@ -1068,6 +1191,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) // Add a second field @@ -1213,6 +1338,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) // Add a cultivation 'Wheat' within the timeframe @@ -1277,6 +1404,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) // Add a cultivation 'Wheat' @@ -1432,6 +1561,8 @@ describe("Cultivation Data Model", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) // Add a cultivation 'Wheat' - outside timeframe @@ -1576,6 +1707,8 @@ describe("buildCultivationTimeframeCondition", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-01", + b_date_harvest_default: "09-15", }) }) diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index c4a55baf9..939849b40 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -119,6 +119,8 @@ export async function addCultivationToCatalogue( b_n_fixation: schema.cultivationsCatalogueTypeInsert["b_n_fixation"] b_lu_rest_oravib: schema.cultivationsCatalogueTypeInsert["b_lu_rest_oravib"] b_lu_variety_options: schema.cultivationsCatalogueTypeInsert["b_lu_variety_options"] + b_lu_start_default: schema.cultivationsCatalogueTypeInsert["b_lu_start_default"] + b_date_harvest_default: schema.cultivationsCatalogueTypeInsert["b_date_harvest_default"] }, ): Promise { try { @@ -139,6 +141,25 @@ export async function addCultivationToCatalogue( throw new Error("Cultivation already exists in catalogue") } + // Validate if b_lu_start_default and b_date_harvest_default follows format MM-dd + const dateRegex = /^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/ + if ( + properties.b_lu_start_default && + !dateRegex.test(properties.b_lu_start_default) + ) { + throw new Error( + "Invalid b_lu_start_default format. Expected MM-dd.", + ) + } + if ( + properties.b_date_harvest_default && + !dateRegex.test(properties.b_date_harvest_default) + ) { + throw new Error( + "Invalid b_date_harvest_default format. Expected MM-dd.", + ) + } + // Insert the cultivation in the db await tx.insert(schema.cultivationsCatalogue).values(properties) }) diff --git a/fdm-core/src/db/migrations/0014_clean_calypso.sql b/fdm-core/src/db/migrations/0014_clean_calypso.sql new file mode 100644 index 000000000..285d2754a --- /dev/null +++ b/fdm-core/src/db/migrations/0014_clean_calypso.sql @@ -0,0 +1,2 @@ +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_lu_start_default" text;--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_date_harvest_default" text; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0014_snapshot.json b/fdm-core/src/db/migrations/meta/0014_snapshot.json new file mode 100644 index 000000000..6dc807e24 --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0014_snapshot.json @@ -0,0 +1,3108 @@ +{ + "id": "d1171b57-f922-421c-b386-3518178537c8", + "prevId": "c953a71f-8431-4aea-94b9-e49a5a96cf0c", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "b_lu_start_default": { + "name": "b_lu_start_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_date_harvest_default": { + "name": "b_date_harvest_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 7d4a6b8e7..9c938894b 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -1,104 +1,111 @@ { - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1731414293847, - "tag": "0000_v0", - "breakpoints": true - }, - { - "idx": 1, - "version": "7", - "when": 1741267610502, - "tag": "0001_v0-15-0", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1743420907290, - "tag": "0002_v0-18-0", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1744205441260, - "tag": "0003_v0-20-0-1", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1745410821339, - "tag": "0004_v0-20-0-2", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1748353081475, - "tag": "0005_v0-20-0-3", - "breakpoints": true - }, - { - "idx": 6, - "version": "7", - "when": 1748353926519, - "tag": "0006_v0-20-0-4", - "breakpoints": true - }, - { - "idx": 7, - "version": "7", - "when": 1750146397071, - "tag": "0007_v0-21-0-1", - "breakpoints": true - }, - { - "idx": 8, - "version": "7", - "when": 1750751079210, - "tag": "0008_v0-21-0-2", - "breakpoints": true - }, - { - "idx": 9, - "version": "7", - "when": 1752056714510, - "tag": "0009_v0-22-0-1", - "breakpoints": true - }, - { - "idx": 10, - "version": "7", - "when": 1753084974762, - "tag": "0010_v0-22-0-2", - "breakpoints": true - }, - { - "idx": 11, - "version": "7", - "when": 1754396961710, - "tag": "0011_v0-22-1-1", - "breakpoints": true - }, - { - "idx": 12, - "version": "7", - "when": 1754661913554, - "tag": "0012_v0-24-0-1", - "breakpoints": true - }, - { - "idx": 13, - "version": "7", - "when": 1755074095394, - "tag": "0013_v0-24-0-2", - "breakpoints": true - } - ] -} + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731414293847, + "tag": "0000_v0", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1741267610502, + "tag": "0001_v0-15-0", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1743420907290, + "tag": "0002_v0-18-0", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1744205441260, + "tag": "0003_v0-20-0-1", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1745410821339, + "tag": "0004_v0-20-0-2", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1748353081475, + "tag": "0005_v0-20-0-3", + "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1748353926519, + "tag": "0006_v0-20-0-4", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1750146397071, + "tag": "0007_v0-21-0-1", + "breakpoints": true + }, + { + "idx": 8, + "version": "7", + "when": 1750751079210, + "tag": "0008_v0-21-0-2", + "breakpoints": true + }, + { + "idx": 9, + "version": "7", + "when": 1752056714510, + "tag": "0009_v0-22-0-1", + "breakpoints": true + }, + { + "idx": 10, + "version": "7", + "when": 1753084974762, + "tag": "0010_v0-22-0-2", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1754396961710, + "tag": "0011_v0-22-1-1", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1754661913554, + "tag": "0012_v0-24-0-1", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1755074095394, + "tag": "0013_v0-24-0-2", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1760005151122, + "tag": "0014_clean_calypso", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index b505daccf..5df4eeb0a 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -371,6 +371,8 @@ export const cultivationsCatalogue = fdmSchema.table( b_n_fixation: numericCasted(), b_lu_rest_oravib: boolean(), b_lu_variety_options: text().array(), + b_lu_start_default: text(), // MM-dd + b_date_harvest_default: text(), // MM-dd hash: text(), created: timestamp({ withTimezone: true }).notNull().defaultNow(), updated: timestamp({ withTimezone: true }), From 97083dd7ea18b2beaa03d83d574ecc4d61e8f1ea Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 12:31:26 +0200 Subject: [PATCH 006/243] feat: adds `b_lu_start_default` and `b_date_harvest_default` to brp catalogue --- .changeset/big-cars-like.md | 5 + fdm-data/src/cultivations/catalogues/brp.json | 2100 ++++++++++++----- fdm-data/src/cultivations/catalogues/brp.ts | 2 + fdm-data/src/cultivations/d.ts | 2 + fdm-data/src/cultivations/hash.test.ts | 20 + 5 files changed, 1604 insertions(+), 525 deletions(-) create mode 100644 .changeset/big-cars-like.md diff --git a/.changeset/big-cars-like.md b/.changeset/big-cars-like.md new file mode 100644 index 000000000..4249b2553 --- /dev/null +++ b/.changeset/big-cars-like.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-data": minor +--- + +Adds `b_lu_start_default` and `b_date_harvest_default` to brp catalogue diff --git a/fdm-data/src/cultivations/catalogues/brp.json b/fdm-data/src/cultivations/catalogues/brp.json index 1f7750133..71e578a06 100644 --- a/fdm-data/src/cultivations/catalogues/brp.json +++ b/fdm-data/src/cultivations/catalogues/brp.json @@ -13,7 +13,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_174", @@ -29,7 +31,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_175", @@ -45,7 +49,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_176", @@ -61,7 +67,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_212", @@ -77,7 +85,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_229", @@ -93,7 +103,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_233", @@ -109,7 +121,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_234", @@ -125,7 +139,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_235", @@ -141,7 +157,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "09-14", + "b_date_harvest_default": "07-21" }, { "b_lu_catalogue": "nl_236", @@ -157,7 +175,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_237", @@ -173,7 +193,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_238", @@ -189,7 +211,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_239", @@ -205,7 +229,9 @@ "b_lu_n_residue": 29.8, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_240", @@ -221,7 +247,9 @@ "b_lu_n_residue": 24.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "07-21" }, { "b_lu_catalogue": "nl_241", @@ -237,7 +265,9 @@ "b_lu_n_residue": 24.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_242", @@ -253,7 +283,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_243", @@ -269,7 +301,9 @@ "b_lu_n_residue": 21.1, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_244", @@ -285,7 +319,9 @@ "b_lu_n_residue": 29.8, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "07-21" }, { "b_lu_catalogue": "nl_246", @@ -301,7 +337,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-15", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_247", @@ -317,7 +355,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_249", @@ -333,7 +373,9 @@ "b_lu_n_residue": 4.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-24" }, { "b_lu_catalogue": "nl_256", @@ -349,7 +391,9 @@ "b_lu_n_residue": 17.5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_257", @@ -365,7 +409,9 @@ "b_lu_n_residue": 17.5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_258", @@ -381,7 +427,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 300, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_259", @@ -397,7 +445,9 @@ "b_lu_n_residue": 10, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_262", @@ -413,7 +463,9 @@ "b_lu_n_residue": 15.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "09-01" }, { "b_lu_catalogue": "nl_263", @@ -429,7 +481,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_265", @@ -445,7 +499,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_266", @@ -461,7 +517,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_294", @@ -477,7 +535,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_308", @@ -493,7 +553,9 @@ "b_lu_n_residue": 24.7, "b_n_fixation": 100, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_311", @@ -509,7 +571,9 @@ "b_lu_n_residue": 21.1, "b_n_fixation": 100, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_314", @@ -525,7 +589,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_316", @@ -541,7 +607,9 @@ "b_lu_n_residue": 10, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_317", @@ -557,7 +625,9 @@ "b_lu_n_residue": 10, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_331", @@ -573,7 +643,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_332", @@ -589,7 +661,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_333", @@ -605,7 +679,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_334", @@ -621,7 +697,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_335", @@ -637,7 +715,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_336", @@ -653,7 +733,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_337", @@ -669,7 +751,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_338", @@ -685,7 +769,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_343", @@ -701,7 +787,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_344", @@ -717,7 +805,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_345", @@ -733,7 +823,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_346", @@ -749,7 +841,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_347", @@ -765,7 +859,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_370", @@ -781,7 +877,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_372", @@ -797,7 +895,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_375", @@ -813,7 +913,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_381", @@ -829,7 +931,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_382", @@ -845,7 +949,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_383", @@ -861,7 +967,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_426", @@ -877,7 +985,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_427", @@ -893,7 +1003,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_428", @@ -909,7 +1021,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_511", @@ -925,7 +1039,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_513", @@ -941,7 +1057,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_515", @@ -957,7 +1075,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_516", @@ -973,7 +1093,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_636", @@ -989,7 +1111,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_637", @@ -1005,7 +1129,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_652", @@ -1021,7 +1147,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_653", @@ -1037,7 +1165,9 @@ "b_lu_n_residue": 3.5, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_654", @@ -1053,7 +1183,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_655", @@ -1069,7 +1201,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_656", @@ -1085,7 +1219,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_657", @@ -1101,7 +1237,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_658", @@ -1117,7 +1255,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_659", @@ -1133,7 +1273,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_660", @@ -1149,7 +1291,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_661", @@ -1165,7 +1309,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_662", @@ -1181,7 +1327,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_663", @@ -1197,7 +1345,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_664", @@ -1213,7 +1363,9 @@ "b_lu_n_residue": 7.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_665", @@ -1229,7 +1381,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_666", @@ -1245,7 +1399,9 @@ "b_lu_n_residue": 4.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-24" }, { "b_lu_catalogue": "nl_669", @@ -1261,7 +1417,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_670", @@ -1277,7 +1435,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_671", @@ -1293,7 +1453,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_672", @@ -1309,7 +1471,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_794", @@ -1325,7 +1489,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_795", @@ -1341,7 +1507,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_796", @@ -1357,7 +1525,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_799", @@ -1373,7 +1543,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_800", @@ -1389,7 +1561,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_801", @@ -1405,7 +1579,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_802", @@ -1421,7 +1597,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_803", @@ -1437,7 +1615,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_804", @@ -1453,7 +1633,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_814", @@ -1469,7 +1651,9 @@ "b_lu_n_residue": 16, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_853", @@ -1485,7 +1669,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 100, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_854", @@ -1501,7 +1687,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 100, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_859", @@ -1517,7 +1705,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_863", @@ -1533,7 +1723,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_864", @@ -1549,7 +1741,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_944", @@ -1565,7 +1759,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_964", @@ -1581,7 +1777,9 @@ "b_lu_n_residue": 17.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_965", @@ -1597,7 +1795,9 @@ "b_lu_n_residue": 17.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_967", @@ -1613,7 +1813,9 @@ "b_lu_n_residue": 13, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_968", @@ -1629,7 +1831,9 @@ "b_lu_n_residue": 13, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_970", @@ -1645,7 +1849,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_971", @@ -1661,7 +1867,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_973", @@ -1677,7 +1885,9 @@ "b_lu_n_residue": 11.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_974", @@ -1693,7 +1903,9 @@ "b_lu_n_residue": 11.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_976", @@ -1709,7 +1921,9 @@ "b_lu_n_residue": 13.4, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_977", @@ -1725,7 +1939,9 @@ "b_lu_n_residue": 13.4, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_979", @@ -1741,7 +1957,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_980", @@ -1757,7 +1975,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_982", @@ -1773,7 +1993,9 @@ "b_lu_n_residue": 12.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_983", @@ -1789,7 +2011,9 @@ "b_lu_n_residue": 12.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_985", @@ -1805,7 +2029,9 @@ "b_lu_n_residue": 13.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_986", @@ -1821,7 +2047,9 @@ "b_lu_n_residue": 13.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_988", @@ -1837,7 +2065,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_989", @@ -1853,7 +2083,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_991", @@ -1869,7 +2101,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_992", @@ -1885,7 +2119,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_994", @@ -1901,7 +2137,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_995", @@ -1917,7 +2155,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_997", @@ -1933,7 +2173,9 @@ "b_lu_n_residue": 17.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_998", @@ -1949,7 +2191,9 @@ "b_lu_n_residue": 13, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_999", @@ -1965,7 +2209,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1000", @@ -1981,7 +2227,9 @@ "b_lu_n_residue": 11.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1001", @@ -1997,7 +2245,9 @@ "b_lu_n_residue": 13.4, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1002", @@ -2013,7 +2263,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1003", @@ -2029,7 +2281,9 @@ "b_lu_n_residue": 12.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1004", @@ -2045,7 +2299,9 @@ "b_lu_n_residue": 13.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1005", @@ -2061,7 +2317,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1006", @@ -2077,7 +2335,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1007", @@ -2093,7 +2353,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1010", @@ -2109,7 +2371,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1011", @@ -2125,7 +2389,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1012", @@ -2141,7 +2407,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1013", @@ -2157,7 +2425,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1014", @@ -2173,7 +2443,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1015", @@ -2189,7 +2461,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1016", @@ -2205,7 +2479,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1017", @@ -2221,7 +2497,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1018", @@ -2237,7 +2515,9 @@ "b_lu_n_residue": 19.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1019", @@ -2253,7 +2533,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1020", @@ -2269,7 +2551,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1021", @@ -2285,7 +2569,9 @@ "b_lu_n_residue": 5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-14", + "b_date_harvest_default": "06-15" }, { "b_lu_catalogue": "nl_1022", @@ -2301,7 +2587,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "08-31" }, { "b_lu_catalogue": "nl_1023", @@ -2317,7 +2605,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-21" }, { "b_lu_catalogue": "nl_1024", @@ -2333,7 +2623,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-21" }, { "b_lu_catalogue": "nl_1025", @@ -2349,7 +2641,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica" + "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica", + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1026", @@ -2365,7 +2659,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica" + "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica", + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1027", @@ -2381,7 +2677,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1028", @@ -2397,7 +2695,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1029", @@ -2413,7 +2713,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1030", @@ -2429,7 +2731,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1031", @@ -2445,7 +2749,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1032", @@ -2461,7 +2767,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1033", @@ -2477,7 +2785,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1034", @@ -2493,7 +2803,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1035", @@ -2509,7 +2821,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1036", @@ -2525,7 +2839,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_1037", @@ -2541,7 +2857,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-15", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1038", @@ -2557,7 +2875,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-15", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1039", @@ -2573,7 +2893,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1040", @@ -2589,7 +2911,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1042", @@ -2605,7 +2929,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1043", @@ -2621,7 +2947,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1044", @@ -2637,7 +2965,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1045", @@ -2653,7 +2983,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1046", @@ -2669,7 +3001,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1047", @@ -2685,7 +3019,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1048", @@ -2701,7 +3037,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1049", @@ -2717,7 +3055,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1050", @@ -2733,7 +3073,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1051", @@ -2749,7 +3091,9 @@ "b_lu_n_residue": 11.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1052", @@ -2765,7 +3109,9 @@ "b_lu_n_residue": 11.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1053", @@ -2781,7 +3127,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1054", @@ -2797,7 +3145,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica" + "b_lu_variety_options": "Alchemilla mollis||Carthamus||Gypsophila paniculata||Lymonium||Lysimachia||Paeonia||Solidago||Veronica", + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1055", @@ -2813,7 +3163,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1067", @@ -2829,7 +3181,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1068", @@ -2845,7 +3199,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1069", @@ -2861,7 +3217,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1070", @@ -2877,7 +3235,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1071", @@ -2893,7 +3253,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1072", @@ -2909,7 +3271,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1073", @@ -2925,7 +3289,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1074", @@ -2941,7 +3307,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1075", @@ -2957,7 +3325,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1076", @@ -2973,7 +3343,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1077", @@ -2989,7 +3361,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1078", @@ -3005,7 +3379,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1079", @@ -3021,7 +3397,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1080", @@ -3037,7 +3415,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1081", @@ -3053,7 +3433,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1082", @@ -3069,7 +3451,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1083", @@ -3085,7 +3469,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1084", @@ -3101,7 +3487,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1085", @@ -3117,7 +3505,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1086", @@ -3133,7 +3523,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1087", @@ -3149,7 +3541,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1088", @@ -3165,7 +3559,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1089", @@ -3181,7 +3577,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1090", @@ -3197,7 +3595,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1091", @@ -3213,7 +3613,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1092", @@ -3229,7 +3631,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1093", @@ -3245,7 +3649,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1094", @@ -3261,7 +3667,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1095", @@ -3277,7 +3685,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1096", @@ -3293,7 +3703,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1097", @@ -3309,7 +3721,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1098", @@ -3325,7 +3739,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1099", @@ -3341,7 +3757,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1100", @@ -3357,7 +3775,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1570", @@ -3373,7 +3793,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1574", @@ -3389,7 +3811,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1575", @@ -3405,7 +3829,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1697", @@ -3421,7 +3847,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1698", @@ -3437,7 +3865,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1869", @@ -3453,7 +3883,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1870", @@ -3469,7 +3901,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1872", @@ -3485,7 +3919,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1873", @@ -3501,7 +3937,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1874", @@ -3517,7 +3955,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1876", @@ -3533,7 +3973,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_1909", @@ -3549,7 +3991,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1910", @@ -3565,7 +4009,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1911", @@ -3581,7 +4027,9 @@ "b_lu_n_residue": 17.6, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_1912", @@ -3597,7 +4045,9 @@ "b_lu_n_residue": 17.6, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_1914", @@ -3613,7 +4063,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1915", @@ -3629,7 +4081,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1916", @@ -3645,7 +4099,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1917", @@ -3661,7 +4117,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1918", @@ -3677,7 +4135,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1919", @@ -3693,7 +4153,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1920", @@ -3709,7 +4171,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1921", @@ -3725,7 +4189,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1922", @@ -3741,7 +4207,9 @@ "b_lu_n_residue": 7.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "08-22", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_1923", @@ -3757,7 +4225,9 @@ "b_lu_n_residue": 7.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_1925", @@ -3773,7 +4243,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1926", @@ -3789,7 +4261,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1927", @@ -3805,7 +4279,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1928", @@ -3821,7 +4297,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1929", @@ -3837,7 +4315,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_1930", @@ -3853,7 +4333,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1931", @@ -3869,7 +4351,9 @@ "b_lu_n_residue": 5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_1932", @@ -3885,7 +4369,9 @@ "b_lu_n_residue": 5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_1933", @@ -3901,7 +4387,9 @@ "b_lu_n_residue": 5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_1934", @@ -3917,7 +4405,9 @@ "b_lu_n_residue": 5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_1935", @@ -3933,7 +4423,9 @@ "b_lu_n_residue": 10, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_1936", @@ -3949,7 +4441,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1940", @@ -3965,7 +4459,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1949", @@ -3981,7 +4477,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_1950", @@ -3997,7 +4495,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_1959", @@ -4013,7 +4513,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2014", @@ -4029,7 +4531,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": "Adora||Annabelle||Bintje||Carlita||Courage||Draga||Felsina||Fontane||Innovator||Inova||Jaerla||Lady Blanca||Lady Olympia||Lady Rosetta||Liseta||Maritiema||Marlen||Miranda||Ramos||Redstar||Sante||Satellite||Victoria||VR 808||Zorba||Agria||Allure||Alpha||Aprilia||Asterix||Aziza||Ballys||Baraka||Bartina||Ceasar||Dore||Eigenheimer||El Paso||Futura||Gloria||Irene||Maradonna||Markies||Milva||Minerva||Mondial||Morene||Mozart||Producent||Remarka||Rodeo||Safari||Saphire||Simply Red||Spirit||Terra Gold||Ukama||Vision" + "b_lu_variety_options": "Adora||Annabelle||Bintje||Carlita||Courage||Draga||Felsina||Fontane||Innovator||Inova||Jaerla||Lady Blanca||Lady Olympia||Lady Rosetta||Liseta||Maritiema||Marlen||Miranda||Ramos||Redstar||Sante||Satellite||Victoria||VR 808||Zorba||Agria||Allure||Alpha||Aprilia||Asterix||Aziza||Ballys||Baraka||Bartina||Ceasar||Dore||Eigenheimer||El Paso||Futura||Gloria||Irene||Maradonna||Markies||Milva||Minerva||Mondial||Morene||Mozart||Producent||Remarka||Rodeo||Safari||Saphire||Simply Red||Spirit||Terra Gold||Ukama||Vision", + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2015", @@ -4045,7 +4549,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": "Adora||Agata||Annabelle||Arinda||Berber||Binella||Climax||Donald||Elisabeth||Fontane||Gloria||Inova||Jaerla||Junior||Lady Rosetta||Lady Olympia||Leyla||Linzer Delikatess||Miriam||Orinana||Premiere||Primura||Prior||Rikea||Romano||Satellite||Sirco||Sirtema||Tresor||Ukama||Arcade||Astarte||Asterix||Baraka||Bartina||Diamant||Dolce Vita||Elles||Elvira||Everest||Florijn||Kardal||Karnico||Maradonna||Mondial||Morene||Mozart||Picasso||Remarka||Resonant||Rodeo||Saphire||Sifra||Simply Red||Spirit||Van Gogh||Vebesta||Vento||Voyager" + "b_lu_variety_options": "Adora||Agata||Annabelle||Arinda||Berber||Binella||Climax||Donald||Elisabeth||Fontane||Gloria||Inova||Jaerla||Junior||Lady Rosetta||Lady Olympia||Leyla||Linzer Delikatess||Miriam||Orinana||Premiere||Primura||Prior||Rikea||Romano||Satellite||Sirco||Sirtema||Tresor||Ukama||Arcade||Astarte||Asterix||Baraka||Bartina||Diamant||Dolce Vita||Elles||Elvira||Everest||Florijn||Kardal||Karnico||Maradonna||Mondial||Morene||Mozart||Picasso||Remarka||Resonant||Rodeo||Saphire||Sifra||Simply Red||Spirit||Van Gogh||Vebesta||Vento||Voyager", + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2016", @@ -4061,7 +4567,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": "Adora||Agata||Annabelle||Arinda||Berber||Binella||Climax||Donald||Elisabeth||Fontane||Gloria||Inova||Jaerla||Junior||Lady Rosetta||Lady Olympia||Leyla||Linzer Delikatess||Miriam||Orinana||Premiere||Primura||Prior||Rikea||Romano||Satellite||Sirco||Sirtema||Tresor||Ukama||Arcade||Astarte||Asterix||Baraka||Bartina||Diamant||Dolce Vita||Elles||Elvira||Everest||Florijn||Kardal||Karnico||Maradonna||Mondial||Morene||Mozart||Picasso||Remarka||Resonant||Rodeo||Saphire||Sifra||Simply Red||Spirit||Van Gogh||Vebesta||Vento||Voyager" + "b_lu_variety_options": "Adora||Agata||Annabelle||Arinda||Berber||Binella||Climax||Donald||Elisabeth||Fontane||Gloria||Inova||Jaerla||Junior||Lady Rosetta||Lady Olympia||Leyla||Linzer Delikatess||Miriam||Orinana||Premiere||Primura||Prior||Rikea||Romano||Satellite||Sirco||Sirtema||Tresor||Ukama||Arcade||Astarte||Asterix||Baraka||Bartina||Diamant||Dolce Vita||Elles||Elvira||Everest||Florijn||Kardal||Karnico||Maradonna||Mondial||Morene||Mozart||Picasso||Remarka||Resonant||Rodeo||Saphire||Sifra||Simply Red||Spirit||Van Gogh||Vebesta||Vento||Voyager", + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2017", @@ -4077,7 +4585,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2025", @@ -4093,7 +4603,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2026", @@ -4109,7 +4621,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2027", @@ -4125,7 +4639,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2029", @@ -4141,7 +4657,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2030", @@ -4157,7 +4675,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2031", @@ -4173,7 +4693,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2032", @@ -4189,7 +4711,9 @@ "b_lu_n_residue": 10, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_2033", @@ -4205,7 +4729,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2297", @@ -4221,7 +4747,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2298", @@ -4237,7 +4765,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2299", @@ -4253,7 +4783,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2300", @@ -4269,7 +4801,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2301", @@ -4285,7 +4819,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2302", @@ -4301,7 +4837,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2303", @@ -4317,7 +4855,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2304", @@ -4333,7 +4873,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2325", @@ -4349,7 +4891,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2326", @@ -4365,7 +4909,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2327", @@ -4381,7 +4927,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2328", @@ -4397,7 +4945,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2617", @@ -4413,7 +4963,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2618", @@ -4429,7 +4981,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2619", @@ -4445,7 +4999,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2620", @@ -4461,7 +5017,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2621", @@ -4477,7 +5035,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2622", @@ -4493,7 +5053,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2624", @@ -4509,7 +5071,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2625", @@ -4525,7 +5089,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2626", @@ -4541,7 +5107,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2628", @@ -4557,7 +5125,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2629", @@ -4573,7 +5143,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2630", @@ -4589,7 +5161,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2631", @@ -4605,7 +5179,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2633", @@ -4621,7 +5197,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2634", @@ -4637,7 +5215,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2635", @@ -4653,7 +5233,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2636", @@ -4669,7 +5251,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2637", @@ -4685,7 +5269,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2638", @@ -4701,7 +5287,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2639", @@ -4717,7 +5305,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2640", @@ -4733,7 +5323,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2641", @@ -4749,7 +5341,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2642", @@ -4765,7 +5359,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2643", @@ -4781,7 +5377,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2644", @@ -4797,7 +5395,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_2645", @@ -4813,7 +5413,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2650", @@ -4829,7 +5431,9 @@ "b_lu_n_residue": 24.7, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2651", @@ -4845,7 +5449,9 @@ "b_lu_n_residue": 17.5, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2652", @@ -4861,7 +5467,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_2653", @@ -4877,7 +5485,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2700", @@ -4893,7 +5503,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2701", @@ -4909,7 +5521,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2702", @@ -4925,7 +5539,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2703", @@ -4941,7 +5557,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2704", @@ -4957,7 +5575,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2705", @@ -4973,7 +5593,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2706", @@ -4989,7 +5611,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2707", @@ -5005,7 +5629,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2708", @@ -5021,7 +5647,9 @@ "b_lu_n_residue": 30, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_2709", @@ -5037,7 +5665,9 @@ "b_lu_n_residue": 30, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-14" }, { "b_lu_catalogue": "nl_2710", @@ -5053,7 +5683,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2711", @@ -5069,7 +5701,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2712", @@ -5085,7 +5719,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2713", @@ -5101,7 +5737,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2714", @@ -5117,7 +5755,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2715", @@ -5133,7 +5773,9 @@ "b_lu_n_residue": 24.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "12-01" }, { "b_lu_catalogue": "nl_2716", @@ -5149,7 +5791,9 @@ "b_lu_n_residue": 24.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "12-01" }, { "b_lu_catalogue": "nl_2717", @@ -5165,7 +5809,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2718", @@ -5181,7 +5827,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2719", @@ -5197,7 +5845,9 @@ "b_lu_n_residue": 41.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2720", @@ -5213,7 +5863,9 @@ "b_lu_n_residue": 41.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2721", @@ -5229,7 +5881,9 @@ "b_lu_n_residue": 43.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2722", @@ -5245,7 +5899,9 @@ "b_lu_n_residue": 43.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2723", @@ -5261,7 +5917,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2724", @@ -5277,7 +5935,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2725", @@ -5293,7 +5953,9 @@ "b_lu_n_residue": 22.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "11-01" }, { "b_lu_catalogue": "nl_2726", @@ -5309,7 +5971,9 @@ "b_lu_n_residue": 22.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "11-01" }, { "b_lu_catalogue": "nl_2727", @@ -5325,7 +5989,9 @@ "b_lu_n_residue": 38.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2728", @@ -5341,7 +6007,9 @@ "b_lu_n_residue": 38.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2729", @@ -5357,7 +6025,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2730", @@ -5373,7 +6043,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2731", @@ -5389,7 +6061,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2732", @@ -5405,7 +6079,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2733", @@ -5421,7 +6097,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2734", @@ -5437,7 +6115,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_2735", @@ -5453,7 +6133,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "09-21" }, { "b_lu_catalogue": "nl_2736", @@ -5469,7 +6151,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "09-21" }, { "b_lu_catalogue": "nl_2737", @@ -5485,7 +6169,9 @@ "b_lu_n_residue": 22.6, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "11-01" }, { "b_lu_catalogue": "nl_2738", @@ -5501,7 +6187,9 @@ "b_lu_n_residue": 22.6, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "11-01" }, { "b_lu_catalogue": "nl_2739", @@ -5517,7 +6205,9 @@ "b_lu_n_residue": 35, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2740", @@ -5533,7 +6223,9 @@ "b_lu_n_residue": 35, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2741", @@ -5549,7 +6241,9 @@ "b_lu_n_residue": 25.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2742", @@ -5565,7 +6259,9 @@ "b_lu_n_residue": 25.7, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2743", @@ -5581,7 +6277,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2744", @@ -5597,7 +6295,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2745", @@ -5613,7 +6313,9 @@ "b_lu_n_residue": 43.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2746", @@ -5629,7 +6331,9 @@ "b_lu_n_residue": 43.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2747", @@ -5645,7 +6349,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2748", @@ -5661,7 +6367,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2749", @@ -5677,7 +6385,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2750", @@ -5693,7 +6403,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2751", @@ -5709,7 +6421,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2752", @@ -5725,7 +6439,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2753", @@ -5741,7 +6457,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "05-21" }, { "b_lu_catalogue": "nl_2754", @@ -5757,7 +6475,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "05-21" }, { "b_lu_catalogue": "nl_2755", @@ -5773,7 +6493,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2756", @@ -5789,7 +6511,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_2757", @@ -5805,7 +6529,9 @@ "b_lu_n_residue": 50, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "05-15" }, { "b_lu_catalogue": "nl_2758", @@ -5821,7 +6547,9 @@ "b_lu_n_residue": 50, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "05-15" }, { "b_lu_catalogue": "nl_2759", @@ -5837,7 +6565,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_2760", @@ -5853,7 +6583,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_2761", @@ -5869,7 +6601,9 @@ "b_lu_n_residue": 31.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "02-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2762", @@ -5885,7 +6619,9 @@ "b_lu_n_residue": 31.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "02-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2763", @@ -5901,7 +6637,9 @@ "b_lu_n_residue": 19.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "11-15" }, { "b_lu_catalogue": "nl_2764", @@ -5917,7 +6655,9 @@ "b_lu_n_residue": 19.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "11-15" }, { "b_lu_catalogue": "nl_2765", @@ -5933,7 +6673,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2766", @@ -5949,7 +6691,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2767", @@ -5965,7 +6709,9 @@ "b_lu_n_residue": 41.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2768", @@ -5981,7 +6727,9 @@ "b_lu_n_residue": 41.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2769", @@ -5997,7 +6745,9 @@ "b_lu_n_residue": 41.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2770", @@ -6013,7 +6763,9 @@ "b_lu_n_residue": 41.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2771", @@ -6029,7 +6781,9 @@ "b_lu_n_residue": 33.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2772", @@ -6045,7 +6799,9 @@ "b_lu_n_residue": 33.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2773", @@ -6061,7 +6817,9 @@ "b_lu_n_residue": 50, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-01" }, { "b_lu_catalogue": "nl_2774", @@ -6077,7 +6835,9 @@ "b_lu_n_residue": 50, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "06-01" }, { "b_lu_catalogue": "nl_2775", @@ -6093,7 +6853,9 @@ "b_lu_n_residue": 35.6, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "06-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_2776", @@ -6109,7 +6871,9 @@ "b_lu_n_residue": 35.6, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "06-01", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_2777", @@ -6125,7 +6889,9 @@ "b_lu_n_residue": 16.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "11-14" }, { "b_lu_catalogue": "nl_2778", @@ -6141,7 +6907,9 @@ "b_lu_n_residue": 16.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "11-14" }, { "b_lu_catalogue": "nl_2779", @@ -6157,7 +6925,9 @@ "b_lu_n_residue": 32.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2780", @@ -6173,7 +6943,9 @@ "b_lu_n_residue": 32.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_2781", @@ -6189,7 +6961,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2782", @@ -6205,7 +6979,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2783", @@ -6221,7 +6997,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2784", @@ -6237,7 +7015,9 @@ "b_lu_n_residue": 22.2, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2785", @@ -6253,7 +7033,9 @@ "b_lu_n_residue": 29, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-21" }, { "b_lu_catalogue": "nl_2786", @@ -6269,7 +7051,9 @@ "b_lu_n_residue": 29, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "10-21" }, { "b_lu_catalogue": "nl_2787", @@ -6285,7 +7069,9 @@ "b_lu_n_residue": 19.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-21", + "b_date_harvest_default": "09-21" }, { "b_lu_catalogue": "nl_2788", @@ -6301,7 +7087,9 @@ "b_lu_n_residue": 19.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-21", + "b_date_harvest_default": "09-21" }, { "b_lu_catalogue": "nl_2789", @@ -6317,7 +7105,9 @@ "b_lu_n_residue": 26.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_2790", @@ -6333,7 +7123,9 @@ "b_lu_n_residue": 26.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "08-14" }, { "b_lu_catalogue": "nl_2791", @@ -6349,7 +7141,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2792", @@ -6365,7 +7159,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2793", @@ -6381,7 +7177,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2794", @@ -6397,7 +7195,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "06-21" }, { "b_lu_catalogue": "nl_2795", @@ -6413,7 +7213,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_2796", @@ -6429,7 +7231,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_2797", @@ -6445,7 +7249,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2798", @@ -6461,7 +7267,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_2799", @@ -6477,7 +7285,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "04-01" }, { "b_lu_catalogue": "nl_2800", @@ -6493,7 +7303,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "07-14", + "b_date_harvest_default": "04-01" }, { "b_lu_catalogue": "nl_2801", @@ -6509,7 +7321,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2802", @@ -6525,7 +7339,9 @@ "b_lu_n_residue": 31.8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "07-14" }, { "b_lu_catalogue": "nl_2951", @@ -6541,7 +7357,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_3055", @@ -6557,7 +7375,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3500", @@ -6573,7 +7393,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3501", @@ -6589,7 +7411,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3502", @@ -6605,7 +7429,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3503", @@ -6621,7 +7447,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3504", @@ -6637,7 +7465,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3505", @@ -6653,7 +7483,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3506", @@ -6669,7 +7501,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3507", @@ -6685,7 +7519,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3508", @@ -6701,7 +7537,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3509", @@ -6717,7 +7555,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3510", @@ -6733,7 +7573,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3511", @@ -6749,7 +7591,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3512", @@ -6765,7 +7609,9 @@ "b_lu_n_residue": 9.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3513", @@ -6781,7 +7627,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3514", @@ -6797,7 +7645,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3515", @@ -6813,7 +7663,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3516", @@ -6829,7 +7681,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3517", @@ -6845,7 +7699,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3518", @@ -6861,7 +7717,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3519", @@ -6877,7 +7735,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3520", @@ -6893,7 +7753,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "08-15", + "b_date_harvest_default": "10-15" }, { "b_lu_catalogue": "nl_3521", @@ -6909,7 +7771,9 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "08-01", + "b_date_harvest_default": "11-15" }, { "b_lu_catalogue": "nl_3522", @@ -6925,7 +7789,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3523", @@ -6941,7 +7807,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3524", @@ -6957,7 +7825,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3718", @@ -6973,7 +7843,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3719", @@ -6989,7 +7861,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3720", @@ -7005,7 +7879,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3721", @@ -7021,7 +7897,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3722", @@ -7037,7 +7915,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3730", @@ -7053,7 +7933,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_3731", @@ -7069,7 +7951,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_3732", @@ -7085,7 +7969,9 @@ "b_lu_n_residue": 22, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_3736", @@ -7101,7 +7987,9 @@ "b_lu_n_residue": 4.7, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-24" }, { "b_lu_catalogue": "nl_3792", @@ -7117,7 +8005,9 @@ "b_lu_n_residue": 16.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-15", + "b_date_harvest_default": "09-14" }, { "b_lu_catalogue": "nl_3801", @@ -7133,7 +8023,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3802", @@ -7149,7 +8041,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3803", @@ -7165,7 +8059,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3804", @@ -7181,7 +8077,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3805", @@ -7197,7 +8095,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3806", @@ -7213,7 +8113,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_3807", @@ -7229,7 +8131,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_3808", @@ -7245,7 +8149,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6520", @@ -7261,7 +8167,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6521", @@ -7277,7 +8185,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6522", @@ -7293,7 +8203,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6632", @@ -7309,7 +8221,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-15", + "b_date_harvest_default": "10-01" }, { "b_lu_catalogue": "nl_6636", @@ -7325,7 +8239,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_6660", @@ -7341,7 +8257,9 @@ "b_lu_n_residue": 15.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "09-01" }, { "b_lu_catalogue": "nl_6664", @@ -7357,7 +8275,9 @@ "b_lu_n_residue": 15.8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "09-01" }, { "b_lu_catalogue": "nl_6746", @@ -7373,7 +8293,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6748", @@ -7389,7 +8311,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6749", @@ -7405,7 +8329,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6750", @@ -7421,7 +8347,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6751", @@ -7437,7 +8365,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6752", @@ -7453,7 +8383,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6753", @@ -7469,7 +8401,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6754", @@ -7485,7 +8419,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6755", @@ -7501,7 +8437,9 @@ "b_lu_n_residue": 9.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6756", @@ -7517,7 +8455,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6757", @@ -7533,7 +8473,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6758", @@ -7549,7 +8491,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6759", @@ -7565,7 +8509,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6760", @@ -7581,7 +8527,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6761", @@ -7597,7 +8545,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6762", @@ -7613,7 +8563,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6763", @@ -7629,7 +8581,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6764", @@ -7645,7 +8599,9 @@ "b_lu_n_residue": 26.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6765", @@ -7661,7 +8617,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6766", @@ -7677,7 +8635,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6767", @@ -7693,7 +8653,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_6768", @@ -7709,7 +8671,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6769", @@ -7725,7 +8689,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6782", @@ -7741,7 +8707,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6783", @@ -7757,7 +8725,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6784", @@ -7773,7 +8743,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6785", @@ -7789,7 +8761,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6786", @@ -7805,7 +8779,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6787", @@ -7821,7 +8797,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6788", @@ -7837,7 +8815,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6789", @@ -7853,7 +8833,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6790", @@ -7869,7 +8851,9 @@ "b_lu_n_residue": 8, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6791", @@ -7885,7 +8869,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6792", @@ -7901,7 +8887,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6793", @@ -7917,7 +8905,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6794", @@ -7933,7 +8923,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_6795", @@ -7949,7 +8941,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6796", @@ -7965,7 +8959,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6797", @@ -7981,7 +8977,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6798", @@ -7997,7 +8995,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6799", @@ -8013,7 +9013,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6800", @@ -8029,7 +9031,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6801", @@ -8045,7 +9049,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6802", @@ -8061,7 +9067,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6803", @@ -8077,7 +9085,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6804", @@ -8093,7 +9103,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6805", @@ -8109,7 +9121,9 @@ "b_lu_n_residue": 11, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6806", @@ -8125,7 +9139,9 @@ "b_lu_n_residue": 4.1, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-01", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_6807", @@ -8141,7 +9157,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6808", @@ -8157,7 +9175,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_6809", @@ -8173,7 +9193,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7121", @@ -8189,7 +9211,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_7122", @@ -8205,7 +9229,9 @@ "b_lu_n_residue": 20, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "03-21", + "b_date_harvest_default": "08-01" }, { "b_lu_catalogue": "nl_7124", @@ -8221,7 +9247,9 @@ "b_lu_n_residue": 7.1, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7125", @@ -8237,7 +9265,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_7126", @@ -8253,7 +9283,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_7127", @@ -8269,7 +9301,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7128", @@ -8285,7 +9319,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7129", @@ -8301,7 +9337,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_7130", @@ -8317,7 +9355,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "01-03", + "b_date_harvest_default": "08-15" }, { "b_lu_catalogue": "nl_7131", @@ -8333,7 +9373,9 @@ "b_lu_n_residue": 5.3, "b_n_fixation": 0, "b_lu_rest_oravib": true, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-01", + "b_date_harvest_default": "12-31" }, { "b_lu_catalogue": "nl_7134", @@ -8349,7 +9391,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7135", @@ -8365,7 +9409,9 @@ "b_lu_n_residue": 22.9, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "10-15", + "b_date_harvest_default": "07-15" }, { "b_lu_catalogue": "nl_7137", @@ -8381,7 +9427,9 @@ "b_lu_n_residue": 13.9, "b_n_fixation": 100, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "05-01", + "b_date_harvest_default": "08-22" }, { "b_lu_catalogue": "nl_7138", @@ -8397,6 +9445,8 @@ "b_lu_n_residue": 34.3, "b_n_fixation": 0, "b_lu_rest_oravib": false, - "b_lu_variety_options": null + "b_lu_variety_options": null, + "b_lu_start_default": "04-01", + "b_date_harvest_default": "10-01" } ] diff --git a/fdm-data/src/cultivations/catalogues/brp.ts b/fdm-data/src/cultivations/catalogues/brp.ts index 0cac1d8d7..bce8057b5 100644 --- a/fdm-data/src/cultivations/catalogues/brp.ts +++ b/fdm-data/src/cultivations/catalogues/brp.ts @@ -69,6 +69,8 @@ export async function getCatalogueBrp(): Promise { .map((s) => s.trim()) .filter((s) => s.length > 0) : null, + b_lu_start_default: cultivation.b_lu_start_default, + b_date_harvest_default: cultivation.b_date_harvest_default, hash: null, } diff --git a/fdm-data/src/cultivations/d.ts b/fdm-data/src/cultivations/d.ts index 38bafca91..f884c96b4 100644 --- a/fdm-data/src/cultivations/d.ts +++ b/fdm-data/src/cultivations/d.ts @@ -28,6 +28,8 @@ export interface CatalogueCultivationItem { b_n_fixation: number b_lu_rest_oravib: boolean b_lu_variety_options: string[] | null + b_lu_start_default: string | null + b_date_harvest_default: string | null hash: string | null } diff --git a/fdm-data/src/cultivations/hash.test.ts b/fdm-data/src/cultivations/hash.test.ts index 62dec409d..6cf0ca7e7 100644 --- a/fdm-data/src/cultivations/hash.test.ts +++ b/fdm-data/src/cultivations/hash.test.ts @@ -20,6 +20,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -47,6 +49,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -66,6 +70,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -92,6 +98,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -122,6 +130,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -152,6 +162,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -183,6 +195,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -214,6 +228,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: ["Agria"], + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -245,6 +261,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } @@ -283,6 +301,8 @@ describe("hashCultivation", () => { b_n_fixation: 0, b_lu_rest_oravib: false, b_lu_variety_options: null, + b_lu_start_default: "03-15", + b_date_harvest_default: "09-15", hash: null, } From 2f7b2815dd867e5870dd910b883c26d2eebced39 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:03:24 +0200 Subject: [PATCH 007/243] feat: adds getDefaultDatesOfCultivation as helper function to determine default dates for cultivations --- .changeset/lovely-mammals-sneeze.md | 5 ++ fdm-core/src/cultivation.d.ts | 5 ++ fdm-core/src/cultivation.test.ts | 104 ++++++++++++++++++++++++ fdm-core/src/cultivation.ts | 118 ++++++++++++++++++++++++++++ fdm-core/src/index.ts | 1 + 5 files changed, 233 insertions(+) create mode 100644 .changeset/lovely-mammals-sneeze.md diff --git a/.changeset/lovely-mammals-sneeze.md b/.changeset/lovely-mammals-sneeze.md new file mode 100644 index 000000000..818e1a545 --- /dev/null +++ b/.changeset/lovely-mammals-sneeze.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Adds getDefaultDatesOfCultivation as helper function to determine default dates for cultivations diff --git a/fdm-core/src/cultivation.d.ts b/fdm-core/src/cultivation.d.ts index 99cc414f7..37208090e 100644 --- a/fdm-core/src/cultivation.d.ts +++ b/fdm-core/src/cultivation.d.ts @@ -58,3 +58,8 @@ export interface CultivationPlan { } export type CultivationCatalogue = schema.cultivationsCatalogueTypeSelect + +export type CultivationDefaultDates = { + b_lu_start: Date + b_lu_end: Date | undefine +} diff --git a/fdm-core/src/cultivation.test.ts b/fdm-core/src/cultivation.test.ts index a737994ef..cbe776ee7 100644 --- a/fdm-core/src/cultivation.test.ts +++ b/fdm-core/src/cultivation.test.ts @@ -11,6 +11,7 @@ import { getCultivationPlan, getCultivations, getCultivationsFromCatalogue, + getDefaultDatesOfCultivation, removeCultivation, updateCultivation, } from "./cultivation" @@ -932,6 +933,109 @@ describe("Cultivation Data Model", () => { }), ).resolves.not.toThrow() }) + describe("getDefaultDatesOfCultivation", () => { + it("should return default start and end dates for a single-harvest cultivation", async () => { + const year = 2024 + const defaultDates = await getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + b_lu_catalogue, + year, + ) + + expect(defaultDates).toBeDefined() + expect(defaultDates.b_lu_start).toEqual(new Date("2024-03-01")) + expect(defaultDates.b_lu_end).toEqual(new Date("2024-09-15")) + }) + + it("should handle harvest in the next year", async () => { + const winterCropCatalogue = createId() + await addCultivationToCatalogue(fdm, { + b_lu_catalogue: winterCropCatalogue, + b_lu_source: b_lu_source, + b_lu_name: "winter-wheat", + b_lu_name_en: "Winter Wheat", + b_lu_harvestable: "once", + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "test-hcat3-name", + b_lu_croprotation: "cereal", + b_lu_yield: 7000, + b_lu_hi: 0.5, + b_lu_n_harvestable: 5, + b_lu_n_residue: 3, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: null, + b_lu_start_default: "10-15", // October 15th + b_date_harvest_default: "07-20", // July 20th + }) + + const year = 2024 + const defaultDates = await getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + winterCropCatalogue, + year, + ) + + expect(defaultDates).toBeDefined() + expect(defaultDates.b_lu_start).toEqual(new Date("2024-10-15")) + expect(defaultDates.b_lu_end).toEqual(new Date("2025-07-20")) + }) + + it("should return only start date for multi-harvest cultivations", async () => { + const multiHarvestCatalogue = createId() + await addCultivationToCatalogue(fdm, { + b_lu_catalogue: multiHarvestCatalogue, + b_lu_source: b_lu_source, + b_lu_name: "grass", + b_lu_name_en: "Grass", + b_lu_harvestable: "multiple", + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "test-hcat3-name", + b_lu_croprotation: "grass", + b_lu_yield: 10000, + b_lu_hi: 0.8, + b_lu_n_harvestable: 6, + b_lu_n_residue: 4, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: null, + b_lu_start_default: "04-01", + b_date_harvest_default: null, + }) + + const year = 2024 + const defaultDates = await getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + multiHarvestCatalogue, + year, + ) + + expect(defaultDates).toBeDefined() + expect(defaultDates.b_lu_start).toEqual(new Date("2024-04-01")) + expect(defaultDates.b_lu_end).toBeUndefined() + }) + + it("should throw an error if cultivation is not found", async () => { + const nonExistentCatalogueId = createId() + const year = 2024 + + await expect( + getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + nonExistentCatalogueId, + year, + ), + ).rejects.toThrow("Cultivation not found in catalogue") + }) + }) }) describe("Cultivation Plan", () => { diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index 939849b40..0eda9f573 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -17,6 +17,7 @@ import type { PrincipalId } from "./authorization.d" import type { Cultivation, CultivationCatalogue, + CultivationDefaultDates, CultivationPlan, } from "./cultivation.d" import * as schema from "./db/schema" @@ -170,6 +171,123 @@ export async function addCultivationToCatalogue( } } +/** + * Retrieves the default start and end dates for a given cultivation in a specific year. + * + * This function checks for read permissions on the farm, then queries the cultivation catalogue + * to find the default sowing and harvest dates for the specified cultivation. It constructs + * Date objects for the given year. For single-harvest crops, it calculates the default end + * date and adjusts the year if the harvest date falls into the next calendar year. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The ID of the principal making the request. + * @param b_id_farm The ID of the farm. + * @param b_lu_catalogue The catalogue ID of the cultivation. + * @param year The year for which to determine the default dates. + * @returns A Promise that resolves with an object containing the default start and end dates. + * @throws {Error} If the cultivation is not found in the enabled catalogues for the farm. + * @alpha + */ +export async function getDefaultDatesOfCultivation( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeSelect["b_id_farm"], + b_lu_catalogue: schema.cultivationsCatalogueTypeSelect["b_lu_catalogue"], + year: number, +): Promise { + try { + await checkPermission( + fdm, + "farm", + "read", + b_id_farm, + principal_id, + "getDefaultDatesOfCultivation", + ) + + // Retrieve the enabled cultivation catalogues for the specified farm. + const enabledCatalogues = await fdm + .select({ + b_lu_source: schema.cultivationCatalogueSelecting.b_lu_source, + }) + .from(schema.cultivationCatalogueSelecting) + .where( + eq(schema.cultivationCatalogueSelecting.b_id_farm, b_id_farm), + ) + + // Fetch the specified cultivation's default date information from the enabled catalogues. + const cultivationsCatalogue = await fdm + .select({ + b_lu_catalogue: schema.cultivationsCatalogue.b_lu_catalogue, + b_lu_harvestable: schema.cultivationsCatalogue.b_lu_harvestable, + b_lu_start_default: + schema.cultivationsCatalogue.b_lu_start_default, + b_date_harvest_default: + schema.cultivationsCatalogue.b_date_harvest_default, + }) + .from(schema.cultivationsCatalogue) + .where( + and( + inArray( + schema.cultivationsCatalogue.b_lu_source, + enabledCatalogues.map( + (c: { b_lu_source: string }) => c.b_lu_source, + ), + ), + eq( + schema.cultivationsCatalogue.b_lu_catalogue, + b_lu_catalogue, + ), + ), + ) + .limit(1) + + if (cultivationsCatalogue.length === 0) { + throw new Error("Cultivation not found in catalogue") + } + + // Construct the default start date using the provided year. + const cultivationDefaultDates: CultivationDefaultDates = { + b_lu_start: new Date( + `${year}-${cultivationsCatalogue[0].b_lu_start_default}`, + ), + b_lu_end: undefined, + } + + // For single-harvest crops, set the default end date based on the default harvest date. + if ( + cultivationsCatalogue[0].b_lu_harvestable === "once" && + cultivationsCatalogue[0].b_date_harvest_default + ) { + cultivationDefaultDates.b_lu_end = new Date( + `${year}-${cultivationsCatalogue[0].b_date_harvest_default}`, + ) + + // If the calculated end date is earlier than the start date, it implies the harvest + // occurs in the following year, so we increment the year for the end date. + if ( + cultivationDefaultDates.b_lu_end.getTime() <= + cultivationDefaultDates.b_lu_start.getTime() + ) { + cultivationDefaultDates.b_lu_end = new Date( + `${year + 1}-${ + cultivationsCatalogue[0].b_date_harvest_default + }`, + ) + } + } + + return cultivationDefaultDates + } catch (err) { + throw handleError(err, "Exception for getDefaultDatesOfCultivation", { + principal_id, + b_id_farm, + b_lu_catalogue, + year, + }) + } +} + /** * Adds a new cultivation to a specific field. * diff --git a/fdm-core/src/index.ts b/fdm-core/src/index.ts index 3f8138505..4d1152353 100644 --- a/fdm-core/src/index.ts +++ b/fdm-core/src/index.ts @@ -37,6 +37,7 @@ export { export { addCultivation, addCultivationToCatalogue, + getDefaultDatesOfCultivation, getCultivation, getCultivationPlan, getCultivations, From 250987e0e01e6d64916f62f7ca285686751a9233 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:18:13 +0200 Subject: [PATCH 008/243] tests: fixes --- fdm-core/src/cultivation.test.ts | 10 +++------- fdm-data/src/cultivations/hash.test.ts | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/fdm-core/src/cultivation.test.ts b/fdm-core/src/cultivation.test.ts index cbe776ee7..02612579f 100644 --- a/fdm-core/src/cultivation.test.ts +++ b/fdm-core/src/cultivation.test.ts @@ -850,9 +850,7 @@ describe("Cultivation Data Model", () => { b_lu_start_default: "2024-03-01", // Invalid format b_date_harvest_default: "09-15", }), - ).rejects.toThrow( - "Invalid b_lu_start_default format. Expected MM-dd.", - ) + ).rejects.toThrow("Exception for addCultivationToCatalogue") }) it("should throw an error for invalid b_date_harvest_default format", async () => { @@ -877,9 +875,7 @@ describe("Cultivation Data Model", () => { b_lu_start_default: "03-01", b_date_harvest_default: "2024-09-15", // Invalid format }), - ).rejects.toThrow( - "Invalid b_date_harvest_default format. Expected MM-dd.", - ) + ).rejects.toThrow("Exception for addCultivationToCatalogue") }) it("should not throw an error for valid date formats", async () => { @@ -1033,7 +1029,7 @@ describe("Cultivation Data Model", () => { nonExistentCatalogueId, year, ), - ).rejects.toThrow("Cultivation not found in catalogue") + ).rejects.toThrow("Exception for getDefaultDatesOfCultivation") }) }) }) diff --git a/fdm-data/src/cultivations/hash.test.ts b/fdm-data/src/cultivations/hash.test.ts index 6cf0ca7e7..64593b7fa 100644 --- a/fdm-data/src/cultivations/hash.test.ts +++ b/fdm-data/src/cultivations/hash.test.ts @@ -29,7 +29,7 @@ describe("hashCultivation", () => { expect(hash).toBeDefined() expect(typeof hash).toBe("string") expect(hash.length).toBeGreaterThan(0) - expect(hash).toBe("f6ceb42b") + expect(hash).toBe("860c0fe5") }) it("should generate different hashes for different cultivation items", async () => { From d279d08cc71cb9743bf95cd881bc4f72e877e597 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:55:27 +0200 Subject: [PATCH 009/243] feat: for cultivations default dates based on the cultivation catalogue date are used for b_lu_start and b_lu_end if available when adding a field with a cultivation --- .changeset/proud-banks-train.md | 5 +++++ .../farm.$b_id_farm.$calendar.field.new.tsx | 20 +++++++++++------ ...farm.create.$b_id_farm.$calendar.atlas.tsx | 22 +++++++++++++------ ...arm.create.$b_id_farm.$calendar.upload.tsx | 14 ++++++++++-- 4 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 .changeset/proud-banks-train.md diff --git a/.changeset/proud-banks-train.md b/.changeset/proud-banks-train.md new file mode 100644 index 000000000..c50da8e26 --- /dev/null +++ b/.changeset/proud-banks-train.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-app": minor +--- + +For cultivations default dates based on the cultivation catalogue date are used for b_lu_start and b_lu_end if available when adding a field with a cultivation diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.new.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.new.tsx index dbec73054..e455ab27d 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.new.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.new.tsx @@ -3,6 +3,7 @@ import { addField, addSoilAnalysis, getCultivationsFromCatalogue, + getDefaultDatesOfCultivation, getFarm, getFarms, getFields, @@ -417,13 +418,18 @@ export async function action({ request, params }: ActionFunctionArgs) { const b_geometry = JSON.parse( JSON.parse(String(formValues.b_geometry)), ) as Polygon - const currentYear = new Date().getFullYear() - const defaultDate = timeframe.start - ? timeframe.start - : `${currentYear}-01-01` - const b_start = defaultDate - const b_lu_start = defaultDate - const b_lu_end = undefined + const currentYear = Number(calendar) + + const cultivationDefaultDates = await getDefaultDatesOfCultivation( + fdm, + session.principal_id, + b_id_farm, + b_lu_catalogue, + currentYear, + ) + const b_start = new Date(`${currentYear}-01-01`) + const b_lu_start = cultivationDefaultDates.b_lu_start + const b_lu_end = cultivationDefaultDates.b_lu_end const b_end = undefined const b_acquiring_method = "unknown" diff --git a/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.atlas.tsx b/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.atlas.tsx index 88ca355b7..0484d0b77 100644 --- a/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.atlas.tsx +++ b/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.atlas.tsx @@ -3,6 +3,7 @@ import { addField, addSoilAnalysis, getCultivations, + getDefaultDatesOfCultivation, getFarm, getFields, } from "@svenvw/fdm-core" @@ -428,13 +429,20 @@ export async function action({ request, params }: ActionFunctionArgs) { const b_id_source = field.properties.b_id_source const b_lu_catalogue = field.properties.b_lu_catalogue const b_geometry = field.geometry - const currentYear = new Date().getFullYear() - const defaultDate = timeframe.start - ? timeframe.start - : `${currentYear}-01-01` - const b_start = defaultDate - const b_lu_start = defaultDate - const b_lu_end = undefined + + const currentYear = Number(calendar) + const cultivationDefaultDates = + await getDefaultDatesOfCultivation( + fdm, + session.principal_id, + b_id_farm, + b_lu_catalogue, + currentYear, + ) + + const b_start = new Date(`${currentYear}-01-01`) + const b_lu_start = cultivationDefaultDates.b_lu_start + const b_lu_end = cultivationDefaultDates.b_lu_end const b_end = undefined const b_acquiring_method = "unknown" diff --git a/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.upload.tsx b/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.upload.tsx index e49ae9326..7e823c342 100644 --- a/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.upload.tsx +++ b/fdm-app/app/routes/farm.create.$b_id_farm.$calendar.upload.tsx @@ -4,6 +4,7 @@ import { addCultivation, addField, addSoilAnalysis, + getDefaultDatesOfCultivation, getFarm, } from "@svenvw/fdm-core" import * as turf from "@turf/turf" @@ -233,13 +234,22 @@ export async function action({ request, params }: ActionFunctionArgs) { b_end, ) + const cultivationDefaultDates = await getDefaultDatesOfCultivation( + fdm, + session.principal_id, + b_id_farm, + b_lu_catalogue, + Number(calendar), + ) + const b_lu_start = cultivationDefaultDates.b_lu_start + const b_lu_end = cultivationDefaultDates.b_lu_end await addCultivation( fdm, session.principal_id, b_lu_catalogue, fieldId, - new Date(`${calendar}-01-01`), - undefined, + b_lu_start, + b_lu_end, ) if (nmiApiKey) { From 97f2b861b27babec7b23645c33513c5910c2ef71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:46:30 +0000 Subject: [PATCH 010/243] chore(deps): bump better-auth Bumps the npm_and_yarn group with 1 update in the / directory: [better-auth](https://github.com/better-auth/better-auth/tree/HEAD/packages/better-auth). Updates `better-auth` from 1.3.5 to 1.3.26 - [Release notes](https://github.com/better-auth/better-auth/releases) - [Commits](https://github.com/better-auth/better-auth/commits/v1.3.26/packages/better-auth) --- updated-dependencies: - dependency-name: better-auth dependency-version: 1.3.26 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 106 ++++++++++++++++++++++++-------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bdeee45ae..abaf3dcbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,8 +28,8 @@ catalogs: specifier: 3.2.4 version: 3.2.4 better-auth: - specifier: ^1.3.11 - version: 1.3.5 + specifier: ^1.3.26 + version: 1.3.27 drizzle-kit: specifier: ^0.31.4 version: 0.31.4 @@ -150,7 +150,7 @@ importers: version: 7.2.0 better-auth: specifier: 'catalog:' - version: 1.3.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@3.25.76) + version: 1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -398,7 +398,7 @@ importers: version: 7946.0.16 better-auth: specifier: 'catalog:' - version: 1.3.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@4.1.9) + version: 1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) drizzle-orm: specifier: 'catalog:' version: 0.44.4(@electric-sql/pglite@0.3.8)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.7)(postgres@3.4.7) @@ -1222,8 +1222,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@better-auth/utils@0.2.6': - resolution: {integrity: sha512-3y/vaL5Ox33dBwgJ6ub3OPkVqr6B5xL2kgxNHG8eHZuryLyG/4JSPGqjbdRSgjuy9kALUZYDFl+ORIAxlWMSuA==} + '@better-auth/core@1.3.27': + resolution: {integrity: sha512-3Sfdax6MQyronY+znx7bOsfQHI6m1SThvJWb0RDscFEAhfqLy95k1sl+/PgGyg0cwc2cUXoEiAOSqYdFYrg3vA==} '@better-auth/utils@0.3.0': resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} @@ -2335,13 +2335,14 @@ packages: '@napi-rs/wasm-runtime@1.0.5': resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} - '@noble/ciphers@0.6.0': - resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} - '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} + '@noble/ciphers@2.0.1': + resolution: {integrity: sha512-xHK3XHPUW8DTAobU+G0XT+/w+JLM7/8k1UFdB5xg/zTFPnFCobhftzw8wl4Lw2aq/Rvir5pxfZV5fEazmeCJ2g==} + engines: {node: '>= 20.19.0'} + '@noble/curves@1.9.7': resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} @@ -2350,6 +2351,10 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5266,17 +5271,34 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - better-auth@1.3.5: - resolution: {integrity: sha512-jo4WTqvco7vjWNodxZyKVky9i6A7RqOb2DgS4uKwIAVucrXDv5OPxnoNE2iuEMD4Bm6l2UHRqYeqnsvsi2F23g==} + better-auth@1.3.27: + resolution: {integrity: sha512-SwiGAJ7yU6dBhNg0NdV1h5M8T5sa7/AszZVc4vBfMDrLLmvUfbt9JoJ0uRUJUEdKRAAxTyl9yA+F3+GhtAD80w==} peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - zod: ^3.25.0 || ^4.0.0 + '@lynx-js/react': '*' + '@sveltejs/kit': '*' + next: '*' + react: '*' + react-dom: '*' + solid-js: '*' + svelte: '*' + vue: '*' peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true react: optional: true react-dom: optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true better-call@1.0.19: resolution: {integrity: sha512-sI3GcA1SCVa3H+CDHl8W8qzhlrckwXOTKhqq3OOPXjgn5aTOMIqGY34zLY/pHA6tRRMjTUC3lz5Mi7EbDA24Kw==} @@ -7286,8 +7308,8 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + jose@6.1.0: + resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7951,9 +7973,9 @@ packages: engines: {node: ^18 || >=20} hasBin: true - nanostores@0.11.4: - resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==} - engines: {node: ^18.0.0 || >=20.0.0} + nanostores@1.0.1: + resolution: {integrity: sha512-kNZ9xnoJYKg/AfxjrVL4SS0fKX++4awQReGqWnwTRHxeHGZ1FJFVgTqr/eMrNQdp0Tz7M7tG/TDaX8QfHDwVCw==} + engines: {node: ^20.0.0 || >=22.0.0} negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -11479,9 +11501,10 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@better-auth/utils@0.2.6': + '@better-auth/core@1.3.27': dependencies: - uncrypto: 0.1.3 + better-call: 1.0.19 + zod: 4.1.9 '@better-auth/utils@0.3.0': {} @@ -13203,16 +13226,18 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@noble/ciphers@0.6.0': {} - '@noble/ciphers@1.3.0': {} + '@noble/ciphers@2.0.1': {} + '@noble/curves@1.9.7': dependencies: '@noble/hashes': 1.8.0 '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.1': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17179,37 +17204,20 @@ snapshots: batch@0.6.1: {} - better-auth@1.3.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@3.25.76): + better-auth@1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@better-auth/utils': 0.2.6 - '@better-fetch/fetch': 1.1.18 - '@noble/ciphers': 0.6.0 - '@noble/hashes': 1.8.0 - '@simplewebauthn/browser': 13.2.0 - '@simplewebauthn/server': 13.2.1 - better-call: 1.0.19 - defu: 6.1.4 - jose: 5.10.0 - kysely: 0.28.7 - nanostores: 0.11.4 - zod: 3.25.76 - optionalDependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - - better-auth@1.3.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@4.1.9): - dependencies: - '@better-auth/utils': 0.2.6 + '@better-auth/core': 1.3.27 + '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 - '@noble/ciphers': 0.6.0 - '@noble/hashes': 1.8.0 + '@noble/ciphers': 2.0.1 + '@noble/hashes': 2.0.1 '@simplewebauthn/browser': 13.2.0 '@simplewebauthn/server': 13.2.1 better-call: 1.0.19 defu: 6.1.4 - jose: 5.10.0 + jose: 6.1.0 kysely: 0.28.7 - nanostores: 0.11.4 + nanostores: 1.0.1 zod: 4.1.9 optionalDependencies: react: 19.1.1 @@ -19400,7 +19408,7 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - jose@5.10.0: {} + jose@6.1.0: {} js-tokens@4.0.0: {} @@ -20307,7 +20315,7 @@ snapshots: nanoid@5.1.5: {} - nanostores@0.11.4: {} + nanostores@1.0.1: {} negotiator@0.6.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6251a646a..5c4425ffb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,7 +13,7 @@ catalog: '@rollup/plugin-terser': ^0.4.4 '@rollup/plugin-typescript': ^12.1.4 '@vitest/coverage-v8': 3.2.4 - better-auth: ^1.3.11 + better-auth: ^1.3.26 drizzle-kit: ^0.31.4 drizzle-orm: ^0.44.5 rollup: ^4.50.2 From afc85b78e9fb098c17db2d34516d9eaf4f744ce0 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:21:43 +0200 Subject: [PATCH 011/243] fix: winter crops should be sown previous year instead of harvest next year --- fdm-core/src/cultivation.test.ts | 4 ++-- fdm-core/src/cultivation.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fdm-core/src/cultivation.test.ts b/fdm-core/src/cultivation.test.ts index 02612579f..203d7cc32 100644 --- a/fdm-core/src/cultivation.test.ts +++ b/fdm-core/src/cultivation.test.ts @@ -977,8 +977,8 @@ describe("Cultivation Data Model", () => { ) expect(defaultDates).toBeDefined() - expect(defaultDates.b_lu_start).toEqual(new Date("2024-10-15")) - expect(defaultDates.b_lu_end).toEqual(new Date("2025-07-20")) + expect(defaultDates.b_lu_start).toEqual(new Date("2023-10-15")) + expect(defaultDates.b_lu_end).toEqual(new Date("2024-07-20")) }) it("should return only start date for multi-harvest cultivations", async () => { diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index 0eda9f573..fa8112022 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -177,7 +177,7 @@ export async function addCultivationToCatalogue( * This function checks for read permissions on the farm, then queries the cultivation catalogue * to find the default sowing and harvest dates for the specified cultivation. It constructs * Date objects for the given year. For single-harvest crops, it calculates the default end - * date and adjusts the year if the harvest date falls into the next calendar year. + * date and adjusts the year if the sowing date felt into the previous calendar year. * * @param fdm The FDM instance providing the connection to the database. * @param principal_id The ID of the principal making the request. @@ -263,15 +263,15 @@ export async function getDefaultDatesOfCultivation( `${year}-${cultivationsCatalogue[0].b_date_harvest_default}`, ) - // If the calculated end date is earlier than the start date, it implies the harvest - // occurs in the following year, so we increment the year for the end date. + // If the calculated end date is earlier than the start date, it implies the sowing + // occured in the previous year, so we use the previous year for the start date. if ( cultivationDefaultDates.b_lu_end.getTime() <= cultivationDefaultDates.b_lu_start.getTime() ) { - cultivationDefaultDates.b_lu_end = new Date( - `${year + 1}-${ - cultivationsCatalogue[0].b_date_harvest_default + cultivationDefaultDates.b_lu_start = new Date( + `${year - 1}-${ + cultivationsCatalogue[0].b_lu_start_default }`, ) } From 945f7528e0a785a6ca34593e401aa962392ecabb Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:44:13 +0200 Subject: [PATCH 012/243] refactor: combine changesets --- .changeset/cold-jars-marry.md | 2 +- .changeset/evil-walls-read.md | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .changeset/evil-walls-read.md diff --git a/.changeset/cold-jars-marry.md b/.changeset/cold-jars-marry.md index a2cb4d927..60118e162 100644 --- a/.changeset/cold-jars-marry.md +++ b/.changeset/cold-jars-marry.md @@ -2,4 +2,4 @@ "@svenvw/fdm-core": minor --- -Adds `b_lu_start_default` to cultivations catalogue as the default start date of a cultivation +Adds `b_lu_start_default` and `b_date_harvest_default` to cultivations catalogue as the default start and end dates of a cultivation diff --git a/.changeset/evil-walls-read.md b/.changeset/evil-walls-read.md deleted file mode 100644 index be179e661..000000000 --- a/.changeset/evil-walls-read.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@svenvw/fdm-core": minor ---- - -Adds `b_date_harvest_default` to cultivations catalogue as the default harvest date of a cultivation From c3c8e41ccf7654c71c89b315d5f895e04d5c7c06 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:46:22 +0200 Subject: [PATCH 013/243] fix: typo --- fdm-core/src/cultivation.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-core/src/cultivation.d.ts b/fdm-core/src/cultivation.d.ts index 37208090e..9f9f27bb2 100644 --- a/fdm-core/src/cultivation.d.ts +++ b/fdm-core/src/cultivation.d.ts @@ -61,5 +61,5 @@ export type CultivationCatalogue = schema.cultivationsCatalogueTypeSelect export type CultivationDefaultDates = { b_lu_start: Date - b_lu_end: Date | undefine + b_lu_end: Date | undefined } From a4268f73c063868158f366bf3b75eab158518441 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:52:59 +0200 Subject: [PATCH 014/243] refactor: validate date format --- fdm-data/src/cultivations/catalogues/brp.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/fdm-data/src/cultivations/catalogues/brp.ts b/fdm-data/src/cultivations/catalogues/brp.ts index bce8057b5..ca3b5f204 100644 --- a/fdm-data/src/cultivations/catalogues/brp.ts +++ b/fdm-data/src/cultivations/catalogues/brp.ts @@ -69,8 +69,20 @@ export async function getCatalogueBrp(): Promise { .map((s) => s.trim()) .filter((s) => s.length > 0) : null, - b_lu_start_default: cultivation.b_lu_start_default, - b_date_harvest_default: cultivation.b_date_harvest_default, + b_lu_start_default: + typeof cultivation.b_lu_start_default === "string" && + /^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/.test( + cultivation.b_lu_start_default.trim(), + ) + ? cultivation.b_lu_start_default.trim() + : null, + b_date_harvest_default: + typeof cultivation.b_date_harvest_default === "string" && + /^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/.test( + cultivation.b_date_harvest_default.trim(), + ) + ? cultivation.b_date_harvest_default.trim() + : null, hash: null, } From c35663a185ba0f262111facdc4847e8da66a6a87 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:08:08 +0200 Subject: [PATCH 015/243] refactor: use fixed default dates if not provided --- fdm-core/src/cultivation.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index fa8112022..a2e4d5129 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -246,22 +246,24 @@ export async function getDefaultDatesOfCultivation( throw new Error("Cultivation not found in catalogue") } + // Set default dates of March 15th to September 15th if not provided + const defaultStart = + cultivationsCatalogue[0].b_lu_start_default ?? "03-15" + const defaultEnd = + cultivationsCatalogue[0].b_date_harvest_default ?? "09-15" + // Construct the default start date using the provided year. const cultivationDefaultDates: CultivationDefaultDates = { - b_lu_start: new Date( - `${year}-${cultivationsCatalogue[0].b_lu_start_default}`, - ), + b_lu_start: new Date(`${year}-${defaultStart}`), b_lu_end: undefined, } // For single-harvest crops, set the default end date based on the default harvest date. if ( cultivationsCatalogue[0].b_lu_harvestable === "once" && - cultivationsCatalogue[0].b_date_harvest_default + defaultEnd ) { - cultivationDefaultDates.b_lu_end = new Date( - `${year}-${cultivationsCatalogue[0].b_date_harvest_default}`, - ) + cultivationDefaultDates.b_lu_end = new Date(`${year}-${defaultEnd}`) // If the calculated end date is earlier than the start date, it implies the sowing // occured in the previous year, so we use the previous year for the start date. @@ -270,9 +272,7 @@ export async function getDefaultDatesOfCultivation( cultivationDefaultDates.b_lu_start.getTime() ) { cultivationDefaultDates.b_lu_start = new Date( - `${year - 1}-${ - cultivationsCatalogue[0].b_lu_start_default - }`, + `${year - 1}-${defaultStart}`, ) } } From 95309db82a95e23c04a1156120ca2ece14ff7b0c Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:13:49 +0200 Subject: [PATCH 016/243] fix: add validation for year --- fdm-core/src/cultivation.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index a2e4d5129..6bdd5301c 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -205,6 +205,11 @@ export async function getDefaultDatesOfCultivation( "getDefaultDatesOfCultivation", ) + // Validate year + if (!year || Number.isInteger(year) === false || year < 1970 || year >= 2100) { + throw new Error("Invalid year") + } + // Retrieve the enabled cultivation catalogues for the specified farm. const enabledCatalogues = await fdm .select({ From b90c1d2fc03b96183e7fc3e636f2a69774bd0c28 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:57:59 +0200 Subject: [PATCH 017/243] refactor: add check to db for format of default dates --- .../db/migrations/0014_ancient_ezekiel_stane.sql | 4 ++++ fdm-core/src/db/migrations/0014_clean_calypso.sql | 2 -- fdm-core/src/db/migrations/meta/0014_snapshot.json | 13 +++++++++++-- fdm-core/src/db/migrations/meta/_journal.json | 4 ++-- fdm-core/src/db/schema.ts | 14 +++++++++++++- 5 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql delete mode 100644 fdm-core/src/db/migrations/0014_clean_calypso.sql diff --git a/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql b/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql new file mode 100644 index 000000000..6d904c5e6 --- /dev/null +++ b/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql @@ -0,0 +1,4 @@ +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_lu_start_default" text;--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_date_harvest_default" text;--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_lu_start_default_format" CHECK (b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$');--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_date_harvest_default_format" CHECK (b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'); \ No newline at end of file diff --git a/fdm-core/src/db/migrations/0014_clean_calypso.sql b/fdm-core/src/db/migrations/0014_clean_calypso.sql deleted file mode 100644 index 285d2754a..000000000 --- a/fdm-core/src/db/migrations/0014_clean_calypso.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_lu_start_default" text;--> statement-breakpoint -ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_date_harvest_default" text; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0014_snapshot.json b/fdm-core/src/db/migrations/meta/0014_snapshot.json index 6dc807e24..b67a8d35e 100644 --- a/fdm-core/src/db/migrations/meta/0014_snapshot.json +++ b/fdm-core/src/db/migrations/meta/0014_snapshot.json @@ -1,5 +1,5 @@ { - "id": "d1171b57-f922-421c-b386-3518178537c8", + "id": "5ba4f7c3-7e93-40b0-b184-e837bcbc41cc", "prevId": "c953a71f-8431-4aea-94b9-e49a5a96cf0c", "version": "7", "dialect": "postgresql", @@ -504,7 +504,16 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {}, "policies": {}, - "checkConstraints": {}, + "checkConstraints": { + "b_lu_start_default_format": { + "name": "b_lu_start_default_format", + "value": "b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + }, + "b_date_harvest_default_format": { + "name": "b_date_harvest_default_format", + "value": "b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + } + }, "isRLSEnabled": false }, "fdm.derogation_applying": { diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 9c938894b..86770ff78 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -103,8 +103,8 @@ { "idx": 14, "version": "7", - "when": 1760005151122, - "tag": "0014_clean_calypso", + "when": 1760089257152, + "tag": "0014_ancient_ezekiel_stane", "breakpoints": true } ] diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index 5df4eeb0a..aa40c2e31 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -1,6 +1,7 @@ import type { ApplicationMethods } from "@svenvw/fdm-data" import { boolean, + check, index, integer, pgSchema, @@ -10,6 +11,7 @@ import { uniqueIndex, } from "drizzle-orm/pg-core" import { geometry, numericCasted } from "./schema-custom-types" +import { sql } from "drizzle-orm" // Define postgres schema export const fdmSchema = pgSchema("fdm") @@ -377,7 +379,17 @@ export const cultivationsCatalogue = fdmSchema.table( created: timestamp({ withTimezone: true }).notNull().defaultNow(), updated: timestamp({ withTimezone: true }), }, - (table) => [uniqueIndex("b_lu_catalogue_idx").on(table.b_lu_catalogue)], + (table) => [ + uniqueIndex("b_lu_catalogue_idx").on(table.b_lu_catalogue), + check( + "b_lu_start_default_format", + sql`b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'`, + ), + check( + "b_date_harvest_default_format", + sql`b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'`, + ), + ], ) export type cultivationsCatalogueTypeSelect = From cc91da290283954d33a49e15ddba97a68cfbda12 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:06:46 +0200 Subject: [PATCH 018/243] nitpicks --- .changeset/cold-jars-marry.md | 2 +- fdm-core/src/cultivation.test.ts | 74 +++++++++++++++++++++++++++++++- fdm-core/src/cultivation.ts | 4 +- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/.changeset/cold-jars-marry.md b/.changeset/cold-jars-marry.md index 60118e162..5befeb1c5 100644 --- a/.changeset/cold-jars-marry.md +++ b/.changeset/cold-jars-marry.md @@ -2,4 +2,4 @@ "@svenvw/fdm-core": minor --- -Adds `b_lu_start_default` and `b_date_harvest_default` to cultivations catalogue as the default start and end dates of a cultivation +Adds `b_lu_start_default` and `b_date_harvest_default` to cultivations catalogue as the default start and harvest dates of a cultivation diff --git a/fdm-core/src/cultivation.test.ts b/fdm-core/src/cultivation.test.ts index 203d7cc32..888275d37 100644 --- a/fdm-core/src/cultivation.test.ts +++ b/fdm-core/src/cultivation.test.ts @@ -800,7 +800,7 @@ describe("Cultivation Data Model", () => { b_lu_harvestable: "once", b_lu_hcat3: "test-hcat3", b_lu_hcat3_name: "Test HCAT3 Name", - b_lu_croprotation: "cereal", // This is the problematic line + b_lu_croprotation: "cereal", b_lu_yield: 6000, b_lu_hi: 0.4, b_lu_n_harvestable: 4, @@ -1017,6 +1017,78 @@ describe("Cultivation Data Model", () => { expect(defaultDates.b_lu_end).toBeUndefined() }) + it("should return only start date when harvestable is 'none'", async () => { + const noneHarvestableCatalogue = createId() + await addCultivationToCatalogue(fdm, { + b_lu_catalogue: noneHarvestableCatalogue, + b_lu_source: b_lu_source, + b_lu_name: "cover-crop", + b_lu_name_en: "Cover Crop", + b_lu_harvestable: "none", + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "test-hcat3-name", + b_lu_croprotation: "other", + b_lu_yield: 0, + b_lu_hi: 0, + b_lu_n_harvestable: 0, + b_lu_n_residue: 0, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: null, + b_lu_start_default: "04-01", + b_date_harvest_default: null, + }) + + const year = 2024 + const defaultDates = await getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + noneHarvestableCatalogue, + year, + ) + + expect(defaultDates).toBeDefined() + expect(defaultDates.b_lu_start).toEqual(new Date("2024-04-01")) + expect(defaultDates.b_lu_end).toBeUndefined() + }) + + it("should return default start date of '03-15' when b_lu_start_default is null", async () => { + const nullStartDefaultCatalogue = createId() + await addCultivationToCatalogue(fdm, { + b_lu_catalogue: nullStartDefaultCatalogue, + b_lu_source: b_lu_source, + b_lu_name: "null-start-default", + b_lu_name_en: "Null Start Default", + b_lu_harvestable: "once", + b_lu_hcat3: "test-hcat3", + b_lu_hcat3_name: "test-hcat3-name", + b_lu_croprotation: "cereal", + b_lu_yield: 6000, + b_lu_hi: 0.4, + b_lu_n_harvestable: 4, + b_lu_n_residue: 2, + b_n_fixation: 0, + b_lu_rest_oravib: false, + b_lu_variety_options: null, + b_lu_start_default: null, + b_date_harvest_default: "09-15", + }) + + const year = 2024 + const defaultDates = await getDefaultDatesOfCultivation( + fdm, + principal_id, + b_id_farm, + nullStartDefaultCatalogue, + year, + ) + + expect(defaultDates).toBeDefined() + expect(defaultDates.b_lu_start).toEqual(new Date("2024-03-15")) + expect(defaultDates.b_lu_end).toEqual(new Date("2024-09-15")) + }) + it("should throw an error if cultivation is not found", async () => { const nonExistentCatalogueId = createId() const year = 2024 diff --git a/fdm-core/src/cultivation.ts b/fdm-core/src/cultivation.ts index 6bdd5301c..80dff73be 100644 --- a/fdm-core/src/cultivation.ts +++ b/fdm-core/src/cultivation.ts @@ -206,7 +206,7 @@ export async function getDefaultDatesOfCultivation( ) // Validate year - if (!year || Number.isInteger(year) === false || year < 1970 || year >= 2100) { + if (!year || !Number.isInteger(year) || year < 1970 || year >= 2100) { throw new Error("Invalid year") } @@ -271,7 +271,7 @@ export async function getDefaultDatesOfCultivation( cultivationDefaultDates.b_lu_end = new Date(`${year}-${defaultEnd}`) // If the calculated end date is earlier than the start date, it implies the sowing - // occured in the previous year, so we use the previous year for the start date. + // occurred in the previous year, so we use the previous year for the start date. if ( cultivationDefaultDates.b_lu_end.getTime() <= cultivationDefaultDates.b_lu_start.getTime() From 77c309d21db871580ed48eb1c6e264c2f5b1b018 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:50:29 +0200 Subject: [PATCH 019/243] feat: improve nitrogen balance when a field has an error --- .changeset/cruel-bushes-care.md | 5 + .changeset/gentle-actors-teach.md | 5 + .changeset/pink-pants-leave.md | 5 + ..._farm.$calendar.balance.nitrogen.$b_id.tsx | 129 +++---- ...farm.$calendar.balance.nitrogen._index.tsx | 143 +++---- fdm-calculator/src/balance/nitrogen/index.ts | 350 ++++++++++-------- fdm-calculator/src/balance/nitrogen/input.ts | 11 +- .../src/balance/nitrogen/types.d.ts | 34 +- fdm-calculator/src/index.ts | 3 +- 9 files changed, 369 insertions(+), 316 deletions(-) create mode 100644 .changeset/cruel-bushes-care.md create mode 100644 .changeset/gentle-actors-teach.md create mode 100644 .changeset/pink-pants-leave.md diff --git a/.changeset/cruel-bushes-care.md b/.changeset/cruel-bushes-care.md new file mode 100644 index 000000000..5d1f2ff02 --- /dev/null +++ b/.changeset/cruel-bushes-care.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-calculator": minor +--- + +The nitrogen balance can now be calculated per field instead of only per farm. diff --git a/.changeset/gentle-actors-teach.md b/.changeset/gentle-actors-teach.md new file mode 100644 index 000000000..08631a75b --- /dev/null +++ b/.changeset/gentle-actors-teach.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-app": minor +--- + +In case a field has an error at the nitrogen balance calculation, the balance at farm level and other fields are still shown, but an error message for the specific field is shown diff --git a/.changeset/pink-pants-leave.md b/.changeset/pink-pants-leave.md new file mode 100644 index 000000000..77de7532f --- /dev/null +++ b/.changeset/pink-pants-leave.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-calculator": minor +--- + +The nitrogen balance calculation now gracefully handles errors for individual fields. Instead of failing the entire farm calculation, it will now return partial results for successfully calculated fields and provide specific error messages for fields that encountered issues. diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx index c849e8596..2de23c541 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx @@ -37,7 +37,6 @@ import { getTimeframe } from "~/lib/calendar" import { clientConfig } from "~/lib/config" import { fdm } from "~/lib/fdm.server" import { useCalendarStore } from "~/store/calendar" -import { serverConfig } from "../lib/config.server" // Meta export const meta: MetaFunction = () => { @@ -53,8 +52,6 @@ export const meta: MetaFunction = () => { } export async function loader({ request, params }: LoaderFunctionArgs) { - const datasetsUrl = serverConfig.datasets_url - // Get the farm id const b_id_farm = params.b_id_farm if (!b_id_farm) { @@ -97,25 +94,30 @@ export async function loader({ request, params }: LoaderFunctionArgs) { session.principal_id, b_id_farm, timeframe, - datasetsUrl, + b_id, ) .then(async (input) => { - const result = await calculateNitrogenBalance(input) + const nitrogenBalanceResult = + await calculateNitrogenBalance(input) + const fieldResult = nitrogenBalanceResult.fields.find( + (field: { b_id: string }) => field.b_id === b_id, + ) + + // If fieldResult is not found, it means the field was not processed + if (!fieldResult) { + throw new Error(`Nitrogen balance data not found for field ${b_id}`); + } + return { - input: input.fields.find( - (field: { field: { b_id: string } }) => - field.field.b_id === b_id, - ), - result: result.fields.find( - (field: { b_id: string }) => field.b_id === b_id, - ), - errorMessage: null, + fieldResult: fieldResult, } }) .catch((error) => ({ - input: null, - result: null, - errorMessage: String(error).replace("Error: ", ""), + fieldResult: { + b_id: b_id, + b_area: field?.b_area ?? 0, + errorMessage: String(error).replace("Error: ", ""), + }, })) return { @@ -154,39 +156,13 @@ function NitrogenBalance({ field, nitrogenBalanceResult, }: Awaited>) { - const { input, result, errorMessage } = use(nitrogenBalanceResult) + const { fieldResult } = use(nitrogenBalanceResult) const location = useLocation() const page = location.pathname const calendar = useCalendarStore((state) => state.calendar) - if (!input) { - return ( -
- - - Ongeldig jaar - - -
-

- Dit perceel was niet in gebruik voor dit jaar. - Als dit perceel wel in gebruik was, werk dan de - startdatum bij in de perceelsinstelling. -

-
-
- - - - - -
-
- ) - } - - if (errorMessage) { + if (fieldResult.errorMessage) { return (
@@ -197,31 +173,27 @@ function NitrogenBalance({ - {!errorMessage ? ( + {fieldResult.errorMessage.match( + /Missing required soil parameters/, + ) ? (

- Er is een onbekende fout opgetreden. Probeer - opnieuw of neem contact op met - Ondersteuning. -

-
- ) : errorMessage.match( - /Missing required soil parameters/, - ) ? ( -
-

- Voor niet alle percelen zijn de benodigde - bodemparameters bekend: + Voor dit perceel zijn de benodigde + bodemparameters niet bekend:


    - {errorMessage.match(/a_n_rt/) ? ( + {fieldResult.errorMessage.match(/a_n_rt/) ? (
  • Totaal stikstofgehalte
  • ) : null} - {errorMessage.match(/b_soiltype_agr/) ? ( + {fieldResult.errorMessage.match( + /b_soiltype_agr/, + ) ? (
  • Agrarisch bodemtype
  • ) : null} - {errorMessage.match(/a_c_of|a_som_loi/) ? ( + {fieldResult.errorMessage.match( + /a_c_of|a_som_loi/, + ) ? (
  • Organische stofgehalte
  • ) : null}
@@ -237,7 +209,8 @@ function NitrogenBalance({
                                         {JSON.stringify(
                                             {
-                                                message: errorMessage,
+                                                message:
+                                                    fieldResult.errorMessage,
                                                 page: page,
                                                 timestamp: new Date(),
                                             },
@@ -254,6 +227,38 @@ function NitrogenBalance({
         )
     }
 
+    // If fieldResult.balance is undefined, it means there was an error that was caught
+    // and handled by returning an errorMessage, which is handled above.
+    // If it's still undefined here, it's an unexpected state, so we can return a generic error.
+    if (!fieldResult.balance) {
+        return (
+            
+ + + Ongeldig jaar of onbekende fout + + +
+

+ Dit perceel was niet in gebruik voor dit jaar of + er is een onbekende fout opgetreden. Als dit + perceel wel in gebruik was, werk dan de + startdatum bij in de perceelsinstelling. +

+
+
+ + + + + +
+
+ ) + } + + const result = fieldResult.balance; // Use the actual balance data + return ( <>
@@ -359,7 +364,7 @@ function NitrogenBalance({
diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index 97c8ed505..a25575276 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -1,7 +1,7 @@ import { calculateNitrogenBalance, collectInputForNitrogenBalance, - type NitrogenBalanceNumeric, + type NitrogenBalanceFieldResultNumeric, } from "@svenvw/fdm-calculator" import { getFarm, getFields } from "@svenvw/fdm-core" import { @@ -11,6 +11,7 @@ import { ArrowUpFromLine, CircleAlert, CircleCheck, + CircleX, } from "lucide-react" import { Suspense, use } from "react" import { @@ -19,7 +20,6 @@ import { type MetaFunction, NavLink, useLoaderData, - useLocation, } from "react-router" import { NitrogenBalanceChart } from "~/components/blocks/balance/nitrogen-chart" import { NitrogenBalanceFallback } from "~/components/blocks/balance/skeletons" @@ -36,6 +36,11 @@ import { getTimeframe } from "~/lib/calendar" import { clientConfig } from "~/lib/config" import { fdm } from "~/lib/fdm.server" import { useFieldFilterStore } from "~/store/field-filter" +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "~/components/ui/tooltip" // Meta export const meta: MetaFunction = () => { @@ -87,18 +92,11 @@ export async function loader({ request, params }: LoaderFunctionArgs) { timeframe, ) - let nitrogenBalanceResult = null as NitrogenBalanceNumeric | null - let errorMessage = null as string | null - try { - nitrogenBalanceResult = - await calculateNitrogenBalance(nitrogenBalanceInput) - } catch (error) { - errorMessage = String(error).replace("Error: ", "") - } + const nitrogenBalanceResult = + await calculateNitrogenBalance(nitrogenBalanceInput) return { nitrogenBalanceResult: nitrogenBalanceResult, - errorMessage: errorMessage, } })() @@ -138,85 +136,17 @@ function FarmBalanceNitrogenOverview({ fields, asyncData, }: Awaited>) { - const location = useLocation() - const page = location.pathname - const { nitrogenBalanceResult, errorMessage } = use(asyncData) + const { nitrogenBalanceResult } = use(asyncData) const { showProductiveOnly } = useFieldFilterStore() const resolvedNitrogenBalanceResult = nitrogenBalanceResult - if (errorMessage) { - return ( -
- - - - Helaas is het niet mogelijk om je balans uit te - rekenen - - - - {!errorMessage ? ( -
-

- Er is een onbekende fout opgetreden. Probeer - opnieuw of neem contact op met - Ondersteuning. -

-
- ) : errorMessage.match( - /Missing required soil parameters/, - ) ? ( -
-

- Voor niet alle percelen zijn de benodigde - bodemparameters bekend: -

-
-
    - {errorMessage.match(/a_n_rt/) ? ( -
  • Totaal stikstofgehalte
  • - ) : null} - {errorMessage.match(/b_soiltype_agr/) ? ( -
  • Agrarisch bodemtype
  • - ) : null} - {errorMessage.match(/a_c_of|a_som_loi/) ? ( -
  • Organische stofgehalte
  • - ) : null} -
-
- ) : ( -
-

- Er is helaas wat misgegaan. Probeer opnieuw - of neem contact op met Ondersteuning en deel - de volgende foutmelding: -

-
-
-                                        {JSON.stringify(
-                                            {
-                                                message: errorMessage,
-                                                page: page,
-                                                timestamp: new Date(),
-                                            },
-                                            null,
-                                            2,
-                                        )}
-                                    
-
-
- )} -
-
-
- ) - } + const { hasErrors } = resolvedNitrogenBalanceResult const fieldsMap = new Map(fields.map((f) => [f.b_id, f])) const filteredFields = resolvedNitrogenBalanceResult.fields.filter( - (field) => { + (fieldResult) => { if (!showProductiveOnly) return true - const fieldData = fieldsMap.get(field.b_id) + const fieldData = fieldsMap.get(fieldResult.b_id) return fieldData ? fieldData.b_isproductive === true : false }, ) @@ -237,11 +167,21 @@ function FarmBalanceNitrogenOverview({

{`${resolvedNitrogenBalanceResult.balance} / ${resolvedNitrogenBalanceResult.target}`}

- {resolvedNitrogenBalanceResult.balance <= - resolvedNitrogenBalanceResult.target ? ( + {hasErrors ? ( + + + + + + Niet alle percelen konden worden + berekend + + + ) : resolvedNitrogenBalanceResult.balance <= + resolvedNitrogenBalanceResult.target ? ( ) : ( - + )}
@@ -332,22 +272,31 @@ function FarmBalanceNitrogenOverview({
{filteredFields.map( ( - field: NitrogenBalanceNumeric["fields"][number], + fieldResult: NitrogenBalanceFieldResultNumeric, ) => { - const fieldData = fieldsMap.get(field.b_id) + const fieldData = fieldsMap.get( + fieldResult.b_id, + ) return (
- {field.balance <= field.target ? ( - + {fieldResult.balance ? ( + fieldResult.balance.balance <= + fieldResult.balance.target ? ( + + ) : ( + + ) ) : ( - + )}
- +

{fieldData?.b_name}

@@ -357,7 +306,13 @@ function FarmBalanceNitrogenOverview({

- {field.balance} / {field.target} + {fieldResult.balance ? ( + `${fieldResult.balance.balance} / ${fieldResult.balance.target}` + ) : ( +

+ {"? / ?"} +

+ )}
) diff --git a/fdm-calculator/src/balance/nitrogen/index.ts b/fdm-calculator/src/balance/nitrogen/index.ts index 23b13209d..88c40df5d 100644 --- a/fdm-calculator/src/balance/nitrogen/index.ts +++ b/fdm-calculator/src/balance/nitrogen/index.ts @@ -18,6 +18,8 @@ import type { FieldInput, NitrogenBalance, NitrogenBalanceField, + NitrogenBalanceFieldResult, + NitrogenBalanceFieldNumeric, NitrogenBalanceInput, NitrogenBalanceNumeric, SoilAnalysisPicked, @@ -37,77 +39,82 @@ import type { export async function calculateNitrogenBalance( nitrogenBalanceInput: NitrogenBalanceInput, ): Promise { - // Changed return type - try { - // Destructure input directly - const { fields, fertilizerDetails, cultivationDetails, timeFrame } = - nitrogenBalanceInput + // Destructure input directly + const { fields, fertilizerDetails, cultivationDetails, timeFrame } = + nitrogenBalanceInput - // Set the link to location of FDM public data - const fdmPublicDataUrl = getFdmPublicDataUrl() + // Set the link to location of FDM public data + const fdmPublicDataUrl = getFdmPublicDataUrl() - // Pre-process details into Maps for efficient lookups - const fertilizerDetailsMap = new Map( - fertilizerDetails.map((detail) => [detail.p_id_catalogue, detail]), - ) - const cultivationDetailsMap = new Map( - cultivationDetails.map((detail) => [detail.b_lu_catalogue, detail]), - ) + // Pre-process details into Maps for efficient lookups + const fertilizerDetailsMap = new Map( + fertilizerDetails.map((detail) => [detail.p_id_catalogue, detail]), + ) + const cultivationDetailsMap = new Map( + cultivationDetails.map((detail) => [detail.b_lu_catalogue, detail]), + ) - // Fetch all deposition data in a single, batched request to avoid requesting the GeoTIIF for every field - const depositionByField = - await calculateAllFieldsNitrogenSupplyByDeposition( - fields, - timeFrame, - fdmPublicDataUrl, - ) + // Fetch all deposition data in a single, batched request to avoid requesting the GeoTIIF for every field + const depositionByField = + await calculateAllFieldsNitrogenSupplyByDeposition( + fields, + timeFrame, + fdmPublicDataUrl, + ) - // - // Process fields in batches to control concurrency. - // Instead of running all fields in parallel with Promise.all, which can - // overwhelm the server for farms with many fields, we process them in - // smaller, manageable chunks. This provides more stable performance. - const batchSize = 50 // A sensible default, can be tuned based on profiling. - const fieldsWithBalance: NitrogenBalanceField[] = [] - - for (let i = 0; i < fields.length; i += batchSize) { - const batch = fields.slice(i, i + batchSize) - const batchResults = batch.map((field: FieldInput) => { - const depositionSupply = depositionByField.get(field.field.b_id) - if (!depositionSupply) { - // This should not happen if the deposition calculation is correct - throw new Error( - `Deposition data not found for field ${field.field.b_id}`, - ) + // Process fields in batches to control concurrency. + // Instead of running all fields in parallel with Promise.all, which can + // overwhelm the server for farms with many fields, we process them in + // smaller, manageable chunks. This provides more stable performance. + const batchSize = 50 // A sensible default, can be tuned based on profiling. + const fieldsWithBalanceResults: NitrogenBalanceFieldResult[] = [] + let hasErrors = false + const fieldErrorMessages: string[] = [] + + for (let i = 0; i < fields.length; i += batchSize) { + const batch = fields.slice(i, i + batchSize) + const batchPromises = batch.map(async (field: FieldInput) => { + const depositionSupply = depositionByField.get(field.field.b_id) + if (!depositionSupply) { + // This should not happen if the deposition calculation is correct + hasErrors = true + fieldErrorMessages.push( + `Deposition data not found for field ${field.field.b_id}`, + ) + return { + b_id: field.field.b_id, + b_area: field.field.b_area ?? 0, + errorMessage: `Deposition data not found for field ${field.field.b_id}`, } + } - return calculateNitrogenBalanceField( - field.field, - field.cultivations, - field.harvests, - field.fertilizerApplications, - field.soilAnalyses, - fertilizerDetailsMap, - cultivationDetailsMap, - timeFrame, - depositionSupply, - ) - }) + return calculateNitrogenBalanceField( + field.field, + field.cultivations, + field.harvests, + field.fertilizerApplications, + field.soilAnalyses, + fertilizerDetailsMap, + cultivationDetailsMap, + timeFrame, + depositionSupply, + ) + }) - fieldsWithBalance.push(...batchResults) - } + const batchResults = await Promise.all(batchPromises) + fieldsWithBalanceResults.push(...batchResults) + } - // Aggregate the field balances to farm level - const farmWithBalanceDecimal = calculateNitrogenBalancesFieldToFarm( - fieldsWithBalance, - fields, - ) + // Aggregate the field balances to farm level + const farmWithBalanceDecimal = calculateNitrogenBalancesFieldToFarm( + fieldsWithBalanceResults, + fields, + hasErrors, + fieldErrorMessages, + ) - // Convert the final result to use numbers instead of Decimals - return convertNitrogenBalanceToNumeric(farmWithBalanceDecimal) - } catch (error) { - throw new Error(String(error)) - } + // Convert the final result to use numbers instead of Decimals + return convertNitrogenBalanceToNumeric(farmWithBalanceDecimal) } /** @@ -133,8 +140,7 @@ export async function calculateNitrogenBalance( * @param cultivationDetailsMap - A map containing details for each cultivation. * @param timeFrame - The time frame for the calculation. * @param depositionSupply - The pre-calculated nitrogen supply from deposition. - * @returns The calculated nitrogen balance for the field. - * @throws Throws an error if any of the calculations fail. + * @returns The calculated nitrogen balance for the field, or an error message if the calculation fails. */ export function calculateNitrogenBalanceField( field: FieldInput["field"], @@ -146,72 +152,90 @@ export function calculateNitrogenBalanceField( cultivationDetailsMap: Map, timeFrame: NitrogenBalanceInput["timeFrame"], depositionSupply: NitrogenBalanceField["supply"]["deposition"], -): NitrogenBalanceField { - // Get the details of the field +): NitrogenBalanceFieldResult { + try { const fieldDetails = field - // Combine soil analyses - const soilAnalysis = combineSoilAnalyses(soilAnalyses) - - // Use a field-local timeframe (intersection with input timeframe) - const timeFrameField = { - start: - field.b_start && field.b_start.getTime() > timeFrame.start.getTime() - ? field.b_start - : timeFrame.start, - end: - field.b_end && field.b_end.getTime() < timeFrame.end.getTime() - ? field.b_end - : timeFrame.end, - } - // Normalize: ensure start <= end - if (timeFrameField.end.getTime() < timeFrameField.start.getTime()) { - // Clamp to an empty interval at the boundary to signal “no overlap” - timeFrameField.end = timeFrameField.start - } + // Get the details of the field + const fieldDetails = field + + // Combine soil analyses + const soilAnalysis = combineSoilAnalyses(soilAnalyses) + + // Use a field-local timeframe (intersection with input timeframe) + const timeFrameField = { + start: + field.b_start && + field.b_start.getTime() > timeFrame.start.getTime() + ? field.b_start + : timeFrame.start, + end: + field.b_end && + field.b_end.getTime() < timeFrame.end.getTime() + ? field.b_end + : timeFrame.end, + } + // Normalize: ensure start <= end + if (timeFrameField.end.getTime() < timeFrameField.start.getTime()) { + // Clamp to an empty interval at the boundary to signal “no overlap” + timeFrameField.end = timeFrameField.start + } - // Calculate the amount of Nitrogen supplied - const supply = calculateNitrogenSupply( - cultivations, - fertilizerApplications, - soilAnalysis, - cultivationDetailsMap, - fertilizerDetailsMap, - depositionSupply, - timeFrameField, - ) + // Calculate the amount of Nitrogen supplied + const supply = calculateNitrogenSupply( + cultivations, + fertilizerApplications, + soilAnalysis, + cultivationDetailsMap, + fertilizerDetailsMap, + depositionSupply, + timeFrameField, + ) - // Calculate the amount of Nitrogen removed - const removal = calculateNitrogenRemoval( - cultivations, - harvests, - cultivationDetailsMap, - ) + // Calculate the amount of Nitrogen removed + const removal = calculateNitrogenRemoval( + cultivations, + harvests, + cultivationDetailsMap, + ) - // Calculate the amount of Nitrogen that is volatilized - const emission = calculateNitrogenEmission( - cultivations, - harvests, - fertilizerApplications, - cultivationDetailsMap, - fertilizerDetailsMap, - ) + // Calculate the amount of Nitrogen that is volatilized + const emission = calculateNitrogenEmission( + cultivations, + harvests, + fertilizerApplications, + cultivationDetailsMap, + fertilizerDetailsMap, + ) - // Calculate the target for the Nitrogen balance - const target = calculateTargetForNitrogenBalance( - cultivations, - soilAnalysis, - cultivationDetailsMap, - timeFrameField, - ) + // Calculate the target for the Nitrogen balance + const target = calculateTargetForNitrogenBalance( + cultivations, + soilAnalysis, + cultivationDetailsMap, + timeFrameField, + ) - return { - b_id: fieldDetails.b_id, - balance: supply.total.add(removal.total).add(emission.ammonia.total), - supply: supply, - removal: removal, - emission: emission, - target: target, + return { + b_id: fieldDetails.b_id, + b_area: fieldDetails.b_area ?? 0, + balance: { + b_id: fieldDetails.b_id, + balance: supply.total + .add(removal.total) + .add(emission.ammonia.total), + supply: supply, + removal: removal, + emission: emission, + target: target, + }, + } + } catch (error) { + return { + b_id: field.b_id, + b_area: field.b_area ?? 0, + errorMessage: String(error).replace("Error: ", ""), + } } } @@ -224,67 +248,71 @@ export function calculateNitrogenBalanceField( * * The function returns a comprehensive nitrogen balance for the farm, including total supply, * removal, emission, and the overall balance. - * @param fieldsWithBalance - An array of nitrogen balance results for individual fields. + * @param fieldsWithBalanceResults - An array of nitrogen balance results for individual fields, potentially including errors. + * @param fields - All field inputs, used to get original field data like area. + * @param hasErrors - Indicates if any field calculations failed. + * @param fieldErrorMessages - A list of error messages for fields that failed to calculate. * @returns The aggregated nitrogen balance for the farm. */ export function calculateNitrogenBalancesFieldToFarm( - fieldsWithBalance: NitrogenBalanceField[], + fieldsWithBalanceResults: NitrogenBalanceFieldResult[], fields: FieldInput[], + hasErrors: boolean, + fieldErrorMessages: string[], ): NitrogenBalance { - // Explicitly state it returns the Decimal version - // Calculate the total farm area - const totalFarmArea = fields.reduce( - (sum, field) => sum.add(new Decimal(field.field.b_area ?? 0)), - Decimal(0), - ) + // Filter out fields that have errors for aggregation + const successfulFieldBalances = fieldsWithBalanceResults.filter( + (result) => result.balance !== undefined, + ) as (NitrogenBalanceFieldResult & { balance: NitrogenBalanceField })[] // Calculate total weighted supply, removal, and emission across the farm let totalFarmSupply = new Decimal(0) let totalFarmRemoval = new Decimal(0) let totalFarmEmission = new Decimal(0) let totalFarmTarget = new Decimal(0) + let totalFarmArea = new Decimal(0) - for (const fieldBalance of fieldsWithBalance) { + for (const fieldResult of successfulFieldBalances) { const fieldInput = fields.find( - (f) => f.field.b_id === fieldBalance.b_id, + (f) => f.field.b_id === fieldResult.b_id, ) if (!fieldInput) { - // Should not happen if inputs are consistent, but good to handle console.warn( - `Could not find field input for field balance ${fieldBalance.b_id}`, + `Could not find field input for field balance ${fieldResult.b_id}`, ) - continue // Skip this iteration if fieldInput is not found + continue } const fieldArea = new Decimal(fieldInput.field.b_area ?? 0) + totalFarmArea = totalFarmArea .add(fieldArea); totalFarmSupply = totalFarmSupply.add( - fieldBalance.supply.total.times(fieldArea), + fieldResult.balance.supply.total.times(fieldArea), ) totalFarmRemoval = totalFarmRemoval.add( - fieldBalance.removal.total.times(fieldArea), + fieldResult.balance.removal.total.times(fieldArea), ) totalFarmEmission = totalFarmEmission.add( - fieldBalance.emission.ammonia.total.times(fieldArea), + fieldResult.balance.emission.ammonia.total.times(fieldArea), ) totalFarmTarget = totalFarmTarget.add( - fieldBalance.target.times(fieldArea), + fieldResult.balance.target.times(fieldArea), ) } - // Calculate average values per hectare for the farm - const avgFarmSupply = totalFarmArea.isZero() + // Calculate average values per hectare for the farm, only considering the area of successfully calculated fields + const avgFarmSupply = totalFarmArea .isZero() ? new Decimal(0) - : totalFarmSupply.dividedBy(totalFarmArea) - const avgFarmRemoval = totalFarmArea.isZero() + : totalFarmSupply.dividedBy(totalFarmArea ) + const avgFarmRemoval = totalFarmArea .isZero() ? new Decimal(0) - : totalFarmRemoval.dividedBy(totalFarmArea) - const avgFarmEmission = totalFarmArea.isZero() + : totalFarmRemoval.dividedBy(totalFarmArea ) + const avgFarmEmission = totalFarmArea .isZero() ? new Decimal(0) - : totalFarmEmission.dividedBy(totalFarmArea) - const avgFarmTarget = totalFarmArea.isZero() + : totalFarmEmission.dividedBy(totalFarmArea ) + const avgFarmTarget = totalFarmArea .isZero() ? new Decimal(0) - : totalFarmTarget.dividedBy(totalFarmArea) + : totalFarmTarget.dividedBy(totalFarmArea ) // Calculate the average balance at farm level (Supply + Removal + Emission) const avgFarmBalance = avgFarmSupply @@ -298,7 +326,9 @@ export function calculateNitrogenBalancesFieldToFarm( removal: avgFarmRemoval, emission: avgFarmEmission, target: avgFarmTarget, - fields: fieldsWithBalance, + fields: fieldsWithBalanceResults, + hasErrors: hasErrors || (fieldsWithBalanceResults.length !== successfulFieldBalances.length), + fieldErrorMessages: fieldErrorMessages, } return farmWithBalance @@ -331,7 +361,25 @@ export function convertNitrogenBalanceToNumeric( balance: NitrogenBalance, // Input is the original Decimal-based type ): NitrogenBalanceNumeric { // Output is the new number-based type - return convertDecimalToNumberRecursive(balance) as NitrogenBalanceNumeric + const numericBalance = convertDecimalToNumberRecursive(balance) as NitrogenBalanceNumeric; + + // Ensure fields are correctly converted, especially handling errorMessage + numericBalance.fields = balance.fields.map(fieldResult => { + if (fieldResult.balance) { + return { + b_id: fieldResult.b_id, + b_area: fieldResult.b_area, + balance: convertDecimalToNumberRecursive(fieldResult.balance) as NitrogenBalanceFieldNumeric, + }; + } + return { + b_id: fieldResult.b_id, + b_area: fieldResult.b_area, + errorMessage: fieldResult.errorMessage, + }; + }); + + return numericBalance; } /** diff --git a/fdm-calculator/src/balance/nitrogen/input.ts b/fdm-calculator/src/balance/nitrogen/input.ts index 07d45591d..7659c11ab 100644 --- a/fdm-calculator/src/balance/nitrogen/input.ts +++ b/fdm-calculator/src/balance/nitrogen/input.ts @@ -9,6 +9,7 @@ import { getCultivationsFromCatalogue, getFertilizerApplications, getFertilizers, + getField, getFields, getHarvests, getSoilAnalyses, @@ -37,16 +38,14 @@ export async function collectInputForNitrogenBalance( principal_id: PrincipalId, b_id_farm: fdmSchema.farmsTypeSelect["b_id_farm"], timeframe: Timeframe, + b_id?: fdmSchema.fieldsTypeSelect["b_id"], ): Promise { try { return await fdm.transaction(async (tx: FdmType) => { // Collect the fields for the farm - const farmFields = await getFields( - tx, - principal_id, - b_id_farm, - timeframe, - ) + const farmFields = b_id + ? [await getField(tx, principal_id, b_id)] + : await getFields(tx, principal_id, b_id_farm, timeframe) // Collect the details per field const fields = await Promise.all( diff --git a/fdm-calculator/src/balance/nitrogen/types.d.ts b/fdm-calculator/src/balance/nitrogen/types.d.ts index 68b623727..aba90ba12 100644 --- a/fdm-calculator/src/balance/nitrogen/types.d.ts +++ b/fdm-calculator/src/balance/nitrogen/types.d.ts @@ -347,6 +347,16 @@ export type NitrogenBalanceField = { target: Decimal } +/** + * Represents the result of a nitrogen balance calculation for a single field, which may include an error message. + */ +export type NitrogenBalanceFieldResult = { + b_id: string + b_area: number + balance?: NitrogenBalanceField + errorMessage?: string +} + /** * Represents the total nitrogen balance across all fields. * All values are in kilograms of nitrogen per hectare (kg N / ha). @@ -375,7 +385,15 @@ export type NitrogenBalance = { /** * A detailed breakdown of the nitrogen balance for each individual field. */ - fields: NitrogenBalanceField[] + fields: NitrogenBalanceFieldResult[] + /** + * Indicates if any field calculations failed. + */ + hasErrors: boolean + /** + * A list of error messages for fields that failed to calculate. + */ + fieldErrorMessages: string[] } export type SoilAnalysisPicked = Pick< @@ -571,6 +589,16 @@ export type NitrogenBalanceFieldNumeric = { emission: NitrogenEmissionNumeric } +/** + * Represents the numeric version of NitrogenBalanceFieldResult. + */ +export type NitrogenBalanceFieldResultNumeric = { + b_id: string + b_area: number + balance?: NitrogenBalanceFieldNumeric + errorMessage?: string +} + // Numeric version of NitrogenBalance export type NitrogenBalanceNumeric = { balance: number @@ -578,5 +606,7 @@ export type NitrogenBalanceNumeric = { removal: number emission: number target: number - fields: NitrogenBalanceFieldNumeric[] + fields: NitrogenBalanceFieldResultNumeric[] + hasErrors: boolean + fieldErrorMessages: string[] } diff --git a/fdm-calculator/src/index.ts b/fdm-calculator/src/index.ts index 0d0eaa3d6..3231374eb 100644 --- a/fdm-calculator/src/index.ts +++ b/fdm-calculator/src/index.ts @@ -4,6 +4,8 @@ export type { FieldInput, NitrogenBalanceInput, NitrogenBalanceNumeric, + NitrogenBalanceFieldNumeric, + NitrogenBalanceFieldResultNumeric, NitrogenEmissionAmmoniaFertilizersNumeric, NitrogenEmissionAmmoniaNumeric, NitrogenEmissionAmmoniaResiduesNumeric, @@ -14,7 +16,6 @@ export type { NitrogenSupplyFixationNumeric, NitrogenSupplyMineralizationNumeric, NitrogenSupplyNumeric, - NitrogenVolatilizationNumeric, } from "./balance/nitrogen/types" export { calculateDose } from "./doses/calculate-dose" export type { Dose } from "./doses/d" From 4fbccf9769807da3c196141ed449a8a92345ef37 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:07:54 +0200 Subject: [PATCH 020/243] fix --- fdm-calculator/src/balance/nitrogen/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/index.ts b/fdm-calculator/src/balance/nitrogen/index.ts index 88c40df5d..c9bc4a383 100644 --- a/fdm-calculator/src/balance/nitrogen/index.ts +++ b/fdm-calculator/src/balance/nitrogen/index.ts @@ -154,8 +154,6 @@ export function calculateNitrogenBalanceField( depositionSupply: NitrogenBalanceField["supply"]["deposition"], ): NitrogenBalanceFieldResult { try { - const fieldDetails = field - // Get the details of the field const fieldDetails = field From 88e8ef4d22f84215248d7dbd21596257eeee780d Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:50:25 +0200 Subject: [PATCH 021/243] feat: improve error message display --- ...$b_id_farm.$calendar.balance.nitrogen._index.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index a25575276..c069a1218 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -309,9 +309,16 @@ function FarmBalanceNitrogenOverview({ {fieldResult.balance ? ( `${fieldResult.balance.balance} / ${fieldResult.balance.target}` ) : ( -

- {"? / ?"} -

+ +

+ {"Foutdetails:"} +

+

+ { + fieldResult.errorMessage + } +

+
)}
From be363417c98de4b8614ff675f0dab3cf23909129 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 09:10:25 +0200 Subject: [PATCH 022/243] fix: Guard against getField returning null/undefined when b_id is provided --- fdm-calculator/src/balance/nitrogen/input.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/input.ts b/fdm-calculator/src/balance/nitrogen/input.ts index 7659c11ab..086b43ba8 100644 --- a/fdm-calculator/src/balance/nitrogen/input.ts +++ b/fdm-calculator/src/balance/nitrogen/input.ts @@ -43,9 +43,21 @@ export async function collectInputForNitrogenBalance( try { return await fdm.transaction(async (tx: FdmType) => { // Collect the fields for the farm - const farmFields = b_id - ? [await getField(tx, principal_id, b_id)] - : await getFields(tx, principal_id, b_id_farm, timeframe) + let farmFields: fdmSchema.fieldsTypeSelect[] + if (b_id) { + const field = await getField(tx, principal_id, b_id) + if (!field) { + throw new Error(`Field not found: ${String(b_id)}`) + } + farmFields = [field] + } else { + farmFields = await getFields( + tx, + principal_id, + b_id_farm, + timeframe, + ) + } // Collect the details per field const fields = await Promise.all( From beef80c90ffd04da0b2ccbf15befe19f5431fdb0 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 10:55:53 +0200 Subject: [PATCH 023/243] feat: Submit calculation errors at nitrogen balance calculation to Sentry --- .changeset/crazy-poets-juggle.md | 5 + fdm-app/app/lib/error.ts | 28 +++ ..._farm.$calendar.balance.nitrogen.$b_id.tsx | 141 ++++++++------- ...farm.$calendar.balance.nitrogen._index.tsx | 162 +++++++++++++----- fdm-app/package.json | 1 + pnpm-lock.yaml | 3 + 6 files changed, 234 insertions(+), 106 deletions(-) create mode 100644 .changeset/crazy-poets-juggle.md diff --git a/.changeset/crazy-poets-juggle.md b/.changeset/crazy-poets-juggle.md new file mode 100644 index 000000000..c0d0d77c3 --- /dev/null +++ b/.changeset/crazy-poets-juggle.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-app": patch +--- + +Submit calculation errors at nitrogen balance calculation to Sentry diff --git a/fdm-app/app/lib/error.ts b/fdm-app/app/lib/error.ts index 4b2c2f66e..c008a09e0 100644 --- a/fdm-app/app/lib/error.ts +++ b/fdm-app/app/lib/error.ts @@ -1,5 +1,33 @@ import { data, redirect } from "react-router" import { dataWithError, dataWithWarning } from "remix-toast" +import { customAlphabet } from "nanoid" +import * as Sentry from "@sentry/react-router" +import { clientConfig } from "~/lib/config" + +const customErrorAlphabet = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ" // No lookalikes (0, 1, I, O, S, Z) +const errorIdSize = 8 // Number of characters in ID + +export const createErrorId = customAlphabet(customErrorAlphabet, errorIdSize) + +export function reportError(error: unknown, tags: Record = {}, context?: Record): string { + const errorId = createErrorId().match(/.{1,4}/g)?.join("-") || createErrorId() // Format as XXXX-XXXX + + if (clientConfig.analytics.sentry?.dsn) { + Sentry.captureException(error, { + tags: { + ...tags, + }, + extra: { + ...context, + errorId: errorId, + }, + }) + } else { + console.error(`Error (code: ${errorId}):`, error, context) + } + + return errorId +} export function handleLoaderError(error: unknown) { // Handle 'data' thrown errors diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx index 2de23c541..cc166547d 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx @@ -37,6 +37,7 @@ import { getTimeframe } from "~/lib/calendar" import { clientConfig } from "~/lib/config" import { fdm } from "~/lib/fdm.server" import { useCalendarStore } from "~/store/calendar" +import { handleLoaderError, reportError } from "~/lib/error" // Meta export const meta: MetaFunction = () => { @@ -52,78 +53,97 @@ export const meta: MetaFunction = () => { } export async function loader({ request, params }: LoaderFunctionArgs) { - // Get the farm id - const b_id_farm = params.b_id_farm - if (!b_id_farm) { - throw data("invalid: b_id_farm", { - status: 400, - statusText: "invalid: b_id_farm", - }) - } + try { + // Get the farm id + const b_id_farm = params.b_id_farm + if (!b_id_farm) { + throw data("invalid: b_id_farm", { + status: 400, + statusText: "invalid: b_id_farm", + }) + } - // Get the farm id - const b_id = params.b_id - if (!b_id) { - throw data("invalid: b_id", { - status: 400, - statusText: "invalid: b_id", - }) - } + // Get the farm id + const b_id = params.b_id + if (!b_id) { + throw data("invalid: b_id", { + status: 400, + statusText: "invalid: b_id", + }) + } - // Get the session - const session = await getSession(request) + // Get the session + const session = await getSession(request) - // Get timeframe from calendar store - const timeframe = getTimeframe(params) + // Get timeframe from calendar store + const timeframe = getTimeframe(params) - // Get details of farm - const farm = await getFarm(fdm, session.principal_id, b_id_farm) - if (!farm) { - throw data("not found: b_id_farm", { - status: 404, - statusText: "not found: b_id_farm", - }) - } + // Get details of farm + const farm = await getFarm(fdm, session.principal_id, b_id_farm) + if (!farm) { + throw data("not found: b_id_farm", { + status: 404, + statusText: "not found: b_id_farm", + }) + } - // Get details of field - const field = await getField(fdm, session.principal_id, b_id) + // Get details of field + const field = await getField(fdm, session.principal_id, b_id) - // Return promise directly for React Router v7 Suspense pattern - const nitrogenBalancePromise = collectInputForNitrogenBalance( - fdm, - session.principal_id, - b_id_farm, - timeframe, - b_id, - ) - .then(async (input) => { - const nitrogenBalanceResult = - await calculateNitrogenBalance(input) - const fieldResult = nitrogenBalanceResult.fields.find( + // Return promise directly for React Router v7 Suspense pattern + const nitrogenBalancePromise = collectInputForNitrogenBalance( + fdm, + session.principal_id, + b_id_farm, + timeframe, + b_id, + ).then(async (input) => { + const nitrogenBalanceResult = await calculateNitrogenBalance(input) + let fieldResult = nitrogenBalanceResult.fields.find( (field: { b_id: string }) => field.b_id === b_id, ) - // If fieldResult is not found, it means the field was not processed if (!fieldResult) { - throw new Error(`Nitrogen balance data not found for field ${b_id}`); + throw new Error( + `Nitrogen balance data not found for field ${b_id}`, + ) + } + + if (fieldResult.errorMessage) { + const errorId = reportError( + fieldResult.errorMessage, + { + page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/{b_id}", + }, + { + b_id, + b_id_farm, + timeframe, + fieldArea: field?.b_area, + userId: session.principal_id, + }, + ) + + fieldResult = { + b_id: b_id, + b_area: field?.b_area ?? 0, + errorMessage: fieldResult.errorMessage, + errorId: errorId, + } } return { fieldResult: fieldResult, } }) - .catch((error) => ({ - fieldResult: { - b_id: b_id, - b_area: field?.b_area ?? 0, - errorMessage: String(error).replace("Error: ", ""), - }, - })) - return { - nitrogenBalanceResult: nitrogenBalancePromise, - field: field, - farm: farm, + return { + nitrogenBalanceResult: nitrogenBalancePromise, + field: field, + farm: farm, + } + } catch (error) { + throw handleLoaderError(error) } } @@ -183,7 +203,9 @@ function NitrogenBalance({


    - {fieldResult.errorMessage.match(/a_n_rt/) ? ( + {fieldResult.errorMessage.match( + /a_n_rt/, + ) ? (
  • Totaal stikstofgehalte
  • ) : null} {fieldResult.errorMessage.match( @@ -209,8 +231,9 @@ function NitrogenBalance({
                                             {JSON.stringify(
                                                 {
    -                                                message:
    -                                                    fieldResult.errorMessage,
    +                                                // message:
    +                                                //     fieldResult.errorMessage,
    +                                                errorId: fieldResult.errorId,
                                                     page: page,
                                                     timestamp: new Date(),
                                                 },
    @@ -257,7 +280,7 @@ function NitrogenBalance({
             )
         }
     
    -    const result = fieldResult.balance; // Use the actual balance data
    +    const result = fieldResult.balance // Use the actual balance data
     
         return (
             <>
    diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx
    index c069a1218..2b7adcf69 100644
    --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx
    +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx
    @@ -36,6 +36,7 @@ import { getTimeframe } from "~/lib/calendar"
     import { clientConfig } from "~/lib/config"
     import { fdm } from "~/lib/fdm.server"
     import { useFieldFilterStore } from "~/store/field-filter"
    +import { handleLoaderError, reportError } from "~/lib/error"
     import {
         Tooltip,
         TooltipContent,
    @@ -56,54 +57,84 @@ export const meta: MetaFunction = () => {
     }
     
     export async function loader({ request, params }: LoaderFunctionArgs) {
    -    // Get the farm id
    -    const b_id_farm = params.b_id_farm
    -    if (!b_id_farm) {
    -        throw data("invalid: b_id_farm", {
    -            status: 400,
    -            statusText: "invalid: b_id_farm",
    -        })
    -    }
    +    try {
    +        // Get the farm id
    +        const b_id_farm = params.b_id_farm
    +        if (!b_id_farm) {
    +            throw data("invalid: b_id_farm", {
    +                status: 400,
    +                statusText: "invalid: b_id_farm",
    +            })
    +        }
     
    -    // Get the session
    -    const session = await getSession(request)
    +        // Get the session
    +        const session = await getSession(request)
     
    -    // Get timeframe from calendar store
    -    const timeframe = getTimeframe(params)
    +        // Get timeframe from calendar store
    +        const timeframe = getTimeframe(params)
     
    -    // Get details of farm
    -    const farm = await getFarm(fdm, session.principal_id, b_id_farm)
    -    if (!farm) {
    -        throw data("not found: b_id_farm", {
    -            status: 404,
    -            statusText: "not found: b_id_farm",
    -        })
    -    }
    +        // Get details of farm
    +        const farm = await getFarm(fdm, session.principal_id, b_id_farm)
    +        if (!farm) {
    +            throw data("not found: b_id_farm", {
    +                status: 404,
    +                statusText: "not found: b_id_farm",
    +            })
    +        }
     
    -    // Get details of fields
    -    const fields = await getFields(fdm, session.principal_id, b_id_farm)
    +        // Get details of fields
    +        const fields = await getFields(fdm, session.principal_id, b_id_farm)
     
    -    const asyncData = (async () => {
    -        // Collect input data for nutrient balance calculation
    -        const nitrogenBalanceInput = await collectInputForNitrogenBalance(
    -            fdm,
    -            session.principal_id,
    -            b_id_farm,
    -            timeframe,
    -        )
    +        const asyncData = (async () => {
    +            // Collect input data for nutrient balance calculation
    +            const nitrogenBalanceInput = await collectInputForNitrogenBalance(
    +                fdm,
    +                session.principal_id,
    +                b_id_farm,
    +                timeframe,
    +            )
    +
    +            let nitrogenBalanceResult =
    +                await calculateNitrogenBalance(nitrogenBalanceInput)
     
    -        const nitrogenBalanceResult =
    -            await calculateNitrogenBalance(nitrogenBalanceInput)
    +            if (nitrogenBalanceResult.errorMessage) {
    +                const errorId = reportError(
    +                    nitrogenBalanceResult.errorMessage,
    +                    {
    +                        page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/_index",
    +                    },
    +                    {
    +                        b_id_farm,
    +                        timeframe,
    +                        userId: session.principal_id,
    +                    },
    +                )
    +
    +                nitrogenBalanceResult = {
    +                    balance: 0,
    +                    target: 0,
    +                    supply: 0,
    +                    removal: 0,
    +                    emission: 0,
    +                    hasErrors: true,
    +                    fields: [],
    +                    errorMessage: nitrogenBalanceResult.errorMessage,
    +                    errorId: errorId,
    +                }
    +            }
    +
    +            return {
    +                nitrogenBalanceResult: nitrogenBalanceResult,
    +            }
    +        })()
     
             return {
    -            nitrogenBalanceResult: nitrogenBalanceResult,
    +            farm: farm,
    +            fields: fields,
    +            asyncData: asyncData,
             }
    -    })()
    -
    -    return {
    -        farm: farm,
    -        fields: fields,
    -        asyncData: asyncData,
    +    } catch (error) {
    +        throw handleLoaderError(error)
         }
     }
     
    @@ -140,11 +171,49 @@ function FarmBalanceNitrogenOverview({
         const { showProductiveOnly } = useFieldFilterStore()
     
         const resolvedNitrogenBalanceResult = nitrogenBalanceResult
    +
    +    if (resolvedNitrogenBalanceResult.errorMessage) {
    +        return (
    +            
    + + + + Helaas is het niet mogelijk om je balans uit te + rekenen + + + +
    +

    + Er is helaas wat misgegaan. Probeer opnieuw of + neem contact op met Ondersteuning en deel de + volgende foutmelding: +

    +
    +
    +                                    {JSON.stringify(
    +                                        {
    +                                            message:
    +                                                resolvedNitrogenBalanceResult.errorMessage,
    +                                            timestamp: new Date(),
    +                                        },
    +                                        null,
    +                                        2,
    +                                    )}
    +                                
    +
    +
    +
    +
    +
    + ) + } + const { hasErrors } = resolvedNitrogenBalanceResult const fieldsMap = new Map(fields.map((f) => [f.b_id, f])) const filteredFields = resolvedNitrogenBalanceResult.fields.filter( - (fieldResult) => { + (fieldResult: NitrogenBalanceFieldResultNumeric) => { if (!showProductiveOnly) return true const fieldData = fieldsMap.get(fieldResult.b_id) return fieldData ? fieldData.b_isproductive === true : false @@ -309,16 +378,15 @@ function FarmBalanceNitrogenOverview({ {fieldResult.balance ? ( `${fieldResult.balance.balance} / ${fieldResult.balance.target}` ) : ( - -

    - {"Foutdetails:"} -

    -

    + +

    { - fieldResult.errorMessage + "Bekijk foutmelding" }

    -
    + )} diff --git a/fdm-app/package.json b/fdm-app/package.json index fa98e58c9..3bfee5c6c 100644 --- a/fdm-app/package.json +++ b/fdm-app/package.json @@ -51,6 +51,7 @@ "lodash.throttle": "^4.1.1", "lucide-react": "^0.544.0", "mapbox-gl": "^3.15.0", + "nanoid": "^5.1.5", "next-themes": "^0.4.6", "postgres": "^3.4.7", "posthog-js": "^1.266.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abaf3dcbd..781efd637 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -190,6 +190,9 @@ importers: mapbox-gl: specifier: ^3.15.0 version: 3.15.0 + nanoid: + specifier: ^5.1.5 + version: 5.1.5 next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) From 1a89d67d7a88bb5c458f7ff83dfd3f5e5dfd6e27 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:02:21 +0200 Subject: [PATCH 024/243] feat: Submit "other" errors for loaders and actions to Sentry --- .changeset/brown-trees-sin.md | 5 ++++ fdm-app/app/lib/error.ts | 24 +++++++++++++++---- ..._farm.$calendar.balance.nitrogen.$b_id.tsx | 1 + ...farm.$calendar.balance.nitrogen._index.tsx | 1 + 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 .changeset/brown-trees-sin.md diff --git a/.changeset/brown-trees-sin.md b/.changeset/brown-trees-sin.md new file mode 100644 index 000000000..872a0d13f --- /dev/null +++ b/.changeset/brown-trees-sin.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-app": patch +--- + +Submit "other" errors for loaders and actions to Sentry diff --git a/fdm-app/app/lib/error.ts b/fdm-app/app/lib/error.ts index c008a09e0..f86c278a1 100644 --- a/fdm-app/app/lib/error.ts +++ b/fdm-app/app/lib/error.ts @@ -9,8 +9,15 @@ const errorIdSize = 8 // Number of characters in ID export const createErrorId = customAlphabet(customErrorAlphabet, errorIdSize) -export function reportError(error: unknown, tags: Record = {}, context?: Record): string { - const errorId = createErrorId().match(/.{1,4}/g)?.join("-") || createErrorId() // Format as XXXX-XXXX +export function reportError( + error: unknown, + tags: Record = {}, + context?: Record, +): string { + const errorId = + createErrorId() + .match(/.{1,4}/g) + ?.join("-") || createErrorId() // Format as XXXX-XXXX if (clientConfig.analytics.sentry?.dsn) { Sentry.captureException(error, { @@ -125,14 +132,18 @@ export function handleLoaderError(error: unknown) { // All other errors console.error("Loader Error: ", error) + // Forward error to Sentry + const errorId = reportError(error, { + scope: "loader", + }) + return data( { warning: error instanceof Error ? error.message : "Unknown error", }, { status: 500, - statusText: - "Er is helaas iets fout gegaan. Probeer het later opnieuw of neem contact op met Ondersteuning.", + statusText: `Er is helaas iets fout gegaan. Probeer het later opnieuw of neem contact op met Ondersteuning en meldt de volgende foutcode: ${errorId}.`, }, ) } @@ -227,8 +238,11 @@ export function handleActionError(error: unknown) { // All other errors console.error("Error: ", error) + const errorId = reportError(error, { + scope: "action", + }) return dataWithError( error instanceof Error ? error.message : "Unknown error", - "Er is helaas iets fout gegaan. Probeer het later opnieuw of neem contact op met Ondersteuning.", + `Er is helaas iets fout gegaan. Probeer het later opnieuw of neem contact op met Ondersteuning en meldt de volgende foutcode: ${errorId}.`, ) } diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx index cc166547d..9d5c46a1a 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx @@ -114,6 +114,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { fieldResult.errorMessage, { page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/{b_id}", + scope: "loader", }, { b_id, diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index 2b7adcf69..384c8871f 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -102,6 +102,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { nitrogenBalanceResult.errorMessage, { page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/_index", + scope: "loader", }, { b_id_farm, From dda7111c0e8501467554a7cf13ca8eab57662180 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:06:52 +0200 Subject: [PATCH 025/243] nitpicks --- fdm-calculator/src/balance/nitrogen/types.d.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/types.d.ts b/fdm-calculator/src/balance/nitrogen/types.d.ts index aba90ba12..4ad783272 100644 --- a/fdm-calculator/src/balance/nitrogen/types.d.ts +++ b/fdm-calculator/src/balance/nitrogen/types.d.ts @@ -545,10 +545,6 @@ export type NitrogenEmissionAmmoniaFertilizersNumeric = { total: number applications: { id: string; value: number }[] } - mineral: { - total: number - applications: { id: string; value: number }[] - } compost: { total: number applications: { id: string; value: number }[] @@ -577,6 +573,7 @@ export type NitrogenEmissionAmmoniaNumeric = { export type NitrogenEmissionNumeric = { total: number ammonia: NitrogenEmissionAmmoniaNumeric + nitrate: { total: number } } // Numeric version of NitrogenBalanceField From 917ae5074fa7c9640782de26991c3c986adf6aad Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:22:58 +0200 Subject: [PATCH 026/243] fix: Propagate per-field errors into hasErrors and fieldErrorMessages --- fdm-calculator/src/balance/nitrogen/index.ts | 53 ++++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/index.ts b/fdm-calculator/src/balance/nitrogen/index.ts index c9bc4a383..a0f42e343 100644 --- a/fdm-calculator/src/balance/nitrogen/index.ts +++ b/fdm-calculator/src/balance/nitrogen/index.ts @@ -102,6 +102,12 @@ export async function calculateNitrogenBalance( }) const batchResults = await Promise.all(batchPromises) + for (const r of batchResults) { + if (r.errorMessage) { + hasErrors = true + fieldErrorMessages.push(`[${r.b_id}] ${r.errorMessage}`) + } + } fieldsWithBalanceResults.push(...batchResults) } @@ -168,8 +174,7 @@ export function calculateNitrogenBalanceField( ? field.b_start : timeFrame.start, end: - field.b_end && - field.b_end.getTime() < timeFrame.end.getTime() + field.b_end && field.b_end.getTime() < timeFrame.end.getTime() ? field.b_end : timeFrame.end, } @@ -271,9 +276,7 @@ export function calculateNitrogenBalancesFieldToFarm( let totalFarmArea = new Decimal(0) for (const fieldResult of successfulFieldBalances) { - const fieldInput = fields.find( - (f) => f.field.b_id === fieldResult.b_id, - ) + const fieldInput = fields.find((f) => f.field.b_id === fieldResult.b_id) if (!fieldInput) { console.warn( @@ -282,7 +285,7 @@ export function calculateNitrogenBalancesFieldToFarm( continue } const fieldArea = new Decimal(fieldInput.field.b_area ?? 0) - totalFarmArea = totalFarmArea .add(fieldArea); + totalFarmArea = totalFarmArea.add(fieldArea) totalFarmSupply = totalFarmSupply.add( fieldResult.balance.supply.total.times(fieldArea), @@ -299,18 +302,18 @@ export function calculateNitrogenBalancesFieldToFarm( } // Calculate average values per hectare for the farm, only considering the area of successfully calculated fields - const avgFarmSupply = totalFarmArea .isZero() + const avgFarmSupply = totalFarmArea.isZero() ? new Decimal(0) - : totalFarmSupply.dividedBy(totalFarmArea ) - const avgFarmRemoval = totalFarmArea .isZero() + : totalFarmSupply.dividedBy(totalFarmArea) + const avgFarmRemoval = totalFarmArea.isZero() ? new Decimal(0) - : totalFarmRemoval.dividedBy(totalFarmArea ) - const avgFarmEmission = totalFarmArea .isZero() + : totalFarmRemoval.dividedBy(totalFarmArea) + const avgFarmEmission = totalFarmArea.isZero() ? new Decimal(0) - : totalFarmEmission.dividedBy(totalFarmArea ) - const avgFarmTarget = totalFarmArea .isZero() + : totalFarmEmission.dividedBy(totalFarmArea) + const avgFarmTarget = totalFarmArea.isZero() ? new Decimal(0) - : totalFarmTarget.dividedBy(totalFarmArea ) + : totalFarmTarget.dividedBy(totalFarmArea) // Calculate the average balance at farm level (Supply + Removal + Emission) const avgFarmBalance = avgFarmSupply @@ -325,7 +328,9 @@ export function calculateNitrogenBalancesFieldToFarm( emission: avgFarmEmission, target: avgFarmTarget, fields: fieldsWithBalanceResults, - hasErrors: hasErrors || (fieldsWithBalanceResults.length !== successfulFieldBalances.length), + hasErrors: + hasErrors || + fieldsWithBalanceResults.length !== successfulFieldBalances.length, fieldErrorMessages: fieldErrorMessages, } @@ -359,25 +364,29 @@ export function convertNitrogenBalanceToNumeric( balance: NitrogenBalance, // Input is the original Decimal-based type ): NitrogenBalanceNumeric { // Output is the new number-based type - const numericBalance = convertDecimalToNumberRecursive(balance) as NitrogenBalanceNumeric; + const numericBalance = convertDecimalToNumberRecursive( + balance, + ) as NitrogenBalanceNumeric // Ensure fields are correctly converted, especially handling errorMessage - numericBalance.fields = balance.fields.map(fieldResult => { + numericBalance.fields = balance.fields.map((fieldResult) => { if (fieldResult.balance) { return { b_id: fieldResult.b_id, b_area: fieldResult.b_area, - balance: convertDecimalToNumberRecursive(fieldResult.balance) as NitrogenBalanceFieldNumeric, - }; + balance: convertDecimalToNumberRecursive( + fieldResult.balance, + ) as NitrogenBalanceFieldNumeric, + } } return { b_id: fieldResult.b_id, b_area: fieldResult.b_area, errorMessage: fieldResult.errorMessage, - }; - }); + } + }) - return numericBalance; + return numericBalance } /** From 277cd2cd146f687b7d5dbace3a97df6c7d3e6ebf Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:31:14 +0200 Subject: [PATCH 027/243] test: fix --- fdm-calculator/src/balance/nitrogen/index.test.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/index.test.ts b/fdm-calculator/src/balance/nitrogen/index.test.ts index 480c3aec3..5a4831606 100644 --- a/fdm-calculator/src/balance/nitrogen/index.test.ts +++ b/fdm-calculator/src/balance/nitrogen/index.test.ts @@ -129,9 +129,10 @@ describe("calculateNitrogenBalance", () => { }, } - await expect( - calculateNitrogenBalance(mockNitrogenBalanceInput), - ).rejects.toThrowError() + const result = await calculateNitrogenBalance(mockNitrogenBalanceInput) + + expect(result.hasErrors).toBe(true) + expect(result.fieldErrorMessages.length).toBeGreaterThan(0) }) }) From ddbc28f68ac8ef64299aae4bfe18ce0c1d2cfe2e Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:48:35 +0200 Subject: [PATCH 028/243] refactor: remove duplicate error tracking --- fdm-calculator/src/balance/nitrogen/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/fdm-calculator/src/balance/nitrogen/index.ts b/fdm-calculator/src/balance/nitrogen/index.ts index a0f42e343..851f2a6f2 100644 --- a/fdm-calculator/src/balance/nitrogen/index.ts +++ b/fdm-calculator/src/balance/nitrogen/index.ts @@ -76,11 +76,6 @@ export async function calculateNitrogenBalance( const batchPromises = batch.map(async (field: FieldInput) => { const depositionSupply = depositionByField.get(field.field.b_id) if (!depositionSupply) { - // This should not happen if the deposition calculation is correct - hasErrors = true - fieldErrorMessages.push( - `Deposition data not found for field ${field.field.b_id}`, - ) return { b_id: field.field.b_id, b_area: field.field.b_area ?? 0, From 34057eae08b47ccbffab1e924535532cc837365a Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:51:05 +0200 Subject: [PATCH 029/243] fix: reporting errors --- .../farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index 384c8871f..cf9b1d1c0 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -97,9 +97,9 @@ export async function loader({ request, params }: LoaderFunctionArgs) { let nitrogenBalanceResult = await calculateNitrogenBalance(nitrogenBalanceInput) - if (nitrogenBalanceResult.errorMessage) { + if (nitrogenBalanceResult.hasErrors) { const errorId = reportError( - nitrogenBalanceResult.errorMessage, + nitrogenBalanceResult.fieldErrorMessages.join(",\n"), { page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/_index", scope: "loader", From 9f691a150108971958917780f4fce44a320ad7d0 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 13 Oct 2025 12:41:56 +0200 Subject: [PATCH 030/243] fix: showing error message --- ...id_farm.$calendar.balance.nitrogen._index.tsx | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index cf9b1d1c0..58042bd83 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -94,11 +94,11 @@ export async function loader({ request, params }: LoaderFunctionArgs) { timeframe, ) - let nitrogenBalanceResult = + const nitrogenBalanceResult = await calculateNitrogenBalance(nitrogenBalanceInput) if (nitrogenBalanceResult.hasErrors) { - const errorId = reportError( + reportError( nitrogenBalanceResult.fieldErrorMessages.join(",\n"), { page: "farm/{b_id_farm}/{calendar}/balance/nitrogen/_index", @@ -110,18 +110,6 @@ export async function loader({ request, params }: LoaderFunctionArgs) { userId: session.principal_id, }, ) - - nitrogenBalanceResult = { - balance: 0, - target: 0, - supply: 0, - removal: 0, - emission: 0, - hasErrors: true, - fields: [], - errorMessage: nitrogenBalanceResult.errorMessage, - errorId: errorId, - } } return { From 6bcb5286a399049daaef9217f4a29a53676561a8 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:03:04 +0200 Subject: [PATCH 031/243] feat: Add the missing options for b_acquiring_method: "In gebuik van een terreinbeherende organisatie" (nl_03), "Tijdelijk gebuik in het kader van landinrichting" (nl_04), "Pacht van geringe oppervlakten" (nl_10) and "Natuurpacht" (nl_11) --- .changeset/wide-apes-hear.md | 5 ++++ fdm-core/src/db/schema.ts | 16 +++++------ fdm-core/src/field.test.ts | 54 ++++++++++++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 .changeset/wide-apes-hear.md diff --git a/.changeset/wide-apes-hear.md b/.changeset/wide-apes-hear.md new file mode 100644 index 000000000..4e429808c --- /dev/null +++ b/.changeset/wide-apes-hear.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": patch +--- + +Add the missing options for b_acquiring_method: "In gebuik van een terreinbeherende organisatie" (nl_03), "Tijdelijk gebuik in het kader van landinrichting" (nl_04), "Pacht van geringe oppervlakten" (nl_10) and "Natuurpacht" (nl_11) diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index b505daccf..80b887ea0 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -37,22 +37,22 @@ export type farmsTypeInsert = typeof farms.$inferInsert export const acquiringMethodOptions = [ { value: "nl_01", label: "Eigendom" }, { value: "nl_02", label: "Reguliere pacht" }, + { value: "nl_03", label: "In gebuik van een terreinbeherende organisatie" }, + { + value: "nl_04", + label: "Tijdelijk gebuik in het kader van landinrichting", + }, { value: "nl_07", label: "Overige exploitatievormen" }, { value: "nl_09", label: "Erfpacht" }, + { value: "nl_10", label: "Pacht van geringe oppervlakten" }, + { value: "nl_11", label: "Natuurpacht" }, { value: "nl_12", label: "Geliberaliseerde pacht, langer dan 6 jaar" }, { value: "nl_13", label: "Geliberaliseerde pacht, 6 jaar of korter" }, { value: "nl_61", label: "Reguliere pacht kortlopend" }, { value: "nl_63", label: "Teeltpacht" }, - // { value: "nl_xx", label: "Pacht van geringe oppervlakten" }, - // { value: "nl_xx", label: "Natuurpacht" }, - // { value: "nl_xx", label: "In gebuik van een terreinbeherende organisatie" }, - // { - // value: "nl_xx", - // label: "Tijdelijk gebuik in het kader van landinrichting", - // }, { value: "unknown", label: "Onbekend" }, ] -const acquiringMethodEnum = fdmSchema.enum( +export const acquiringMethodEnum = fdmSchema.enum( "b_acquiring_method", acquiringMethodOptions.map((x) => x.value) as [string, ...string[]], ) diff --git a/fdm-core/src/field.test.ts b/fdm-core/src/field.test.ts index 6e8024d9e..ba0b5b7b2 100644 --- a/fdm-core/src/field.test.ts +++ b/fdm-core/src/field.test.ts @@ -36,12 +36,25 @@ describe("Farm Data Model", () => { }) describe("Field CRUD", () => { - it("should add a new field", async () => { + let fdm: FdmType + let principal_id: string + let b_id_farm: string + + beforeEach(async () => { + const host = inject("host") + const port = inject("port") + const user = inject("user") + const password = inject("password") + const database = inject("database") + fdm = createFdmServer(host, port, user, password, database) + principal_id = "test_principal" + + // Create a test farm const farmName = "Test Farm" const farmBusinessId = "123456" const farmAddress = "123 Farm Lane" const farmPostalCode = "12345" - const b_id_farm = await addFarm( + b_id_farm = await addFarm( fdm, principal_id, farmName, @@ -49,7 +62,9 @@ describe("Farm Data Model", () => { farmAddress, farmPostalCode, ) + }) + it("should add a new field", async () => { const fieldName = "Test Field" const fieldIDSource = "test-field-id" const fieldGeometry: Polygon = { @@ -96,6 +111,41 @@ describe("Farm Data Model", () => { expect(field.b_acquiring_method).toBe(AcquiringMethod) }) + it("should add a new field with a later added option for b_acquiring_method", async () => { + const fieldName = "Test Field" + const fieldIDSource = "test-field-id" + const fieldGeometry: Polygon = { + type: "Polygon", + coordinates: [ + [ + [0, 0], + [0, 1], + [1, 1], + [1, 0], + [0, 0], + ], + ], + } + const AcquireDate = new Date("2023-01-01") + const discardingDate = new Date("2023-12-31") + const AcquiringMethod = "nl_11" + const b_id = await addField( + fdm, + principal_id, + b_id_farm, + fieldName, + fieldIDSource, + fieldGeometry, + AcquireDate, + AcquiringMethod, + discardingDate, + ) + expect(b_id).toBeDefined() + + const field = await getField(fdm, principal_id, b_id) + expect(field.b_acquiring_method).toBe(AcquiringMethod) + }) + describe("getFields", () => { let fdm: FdmType let principal_id: string From a8d05daf21d948cd081bb51e1778c67fb9eaf31e Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:00:44 +0200 Subject: [PATCH 032/243] chore: add db migration --- .../src/db/migrations/0014_smart_malice.sql | 4 + .../src/db/migrations/meta/0014_snapshot.json | 3115 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 213 +- 3 files changed, 3229 insertions(+), 103 deletions(-) create mode 100644 fdm-core/src/db/migrations/0014_smart_malice.sql create mode 100644 fdm-core/src/db/migrations/meta/0014_snapshot.json diff --git a/fdm-core/src/db/migrations/0014_smart_malice.sql b/fdm-core/src/db/migrations/0014_smart_malice.sql new file mode 100644 index 000000000..83ec7aee3 --- /dev/null +++ b/fdm-core/src/db/migrations/0014_smart_malice.sql @@ -0,0 +1,4 @@ +ALTER TYPE fdm.b_acquiring_method ADD VALUE IF NOT EXISTS 'nl_03';--> statement-breakpoint +ALTER TYPE fdm.b_acquiring_method ADD VALUE IF NOT EXISTS 'nl_04';--> statement-breakpoint +ALTER TYPE fdm.b_acquiring_method ADD VALUE IF NOT EXISTS 'nl_10';--> statement-breakpoint +ALTER TYPE fdm.b_acquiring_method ADD VALUE IF NOT EXISTS 'nl_11'; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0014_snapshot.json b/fdm-core/src/db/migrations/meta/0014_snapshot.json new file mode 100644 index 000000000..e091317ad --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0014_snapshot.json @@ -0,0 +1,3115 @@ +{ + "id": "45dcb87d-89c8-4cf7-a504-0db74ba68640", + "prevId": "c953a71f-8431-4aea-94b9-e49a5a96cf0c", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.b_acquiring_method": { + "name": "b_acquiring_method", + "schema": "fdm", + "values": [ + "nl_01", + "nl_02", + "nl_03", + "nl_04", + "nl_07", + "nl_09", + "nl_10", + "nl_11", + "nl_12", + "nl_13", + "nl_61", + "nl_63", + "unknown" + ] + }, + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 7d4a6b8e7..1d8df0db1 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -1,104 +1,111 @@ { - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1731414293847, - "tag": "0000_v0", - "breakpoints": true - }, - { - "idx": 1, - "version": "7", - "when": 1741267610502, - "tag": "0001_v0-15-0", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1743420907290, - "tag": "0002_v0-18-0", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1744205441260, - "tag": "0003_v0-20-0-1", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1745410821339, - "tag": "0004_v0-20-0-2", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1748353081475, - "tag": "0005_v0-20-0-3", - "breakpoints": true - }, - { - "idx": 6, - "version": "7", - "when": 1748353926519, - "tag": "0006_v0-20-0-4", - "breakpoints": true - }, - { - "idx": 7, - "version": "7", - "when": 1750146397071, - "tag": "0007_v0-21-0-1", - "breakpoints": true - }, - { - "idx": 8, - "version": "7", - "when": 1750751079210, - "tag": "0008_v0-21-0-2", - "breakpoints": true - }, - { - "idx": 9, - "version": "7", - "when": 1752056714510, - "tag": "0009_v0-22-0-1", - "breakpoints": true - }, - { - "idx": 10, - "version": "7", - "when": 1753084974762, - "tag": "0010_v0-22-0-2", - "breakpoints": true - }, - { - "idx": 11, - "version": "7", - "when": 1754396961710, - "tag": "0011_v0-22-1-1", - "breakpoints": true - }, - { - "idx": 12, - "version": "7", - "when": 1754661913554, - "tag": "0012_v0-24-0-1", - "breakpoints": true - }, - { - "idx": 13, - "version": "7", - "when": 1755074095394, - "tag": "0013_v0-24-0-2", - "breakpoints": true - } - ] -} + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731414293847, + "tag": "0000_v0", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1741267610502, + "tag": "0001_v0-15-0", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1743420907290, + "tag": "0002_v0-18-0", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1744205441260, + "tag": "0003_v0-20-0-1", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1745410821339, + "tag": "0004_v0-20-0-2", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1748353081475, + "tag": "0005_v0-20-0-3", + "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1748353926519, + "tag": "0006_v0-20-0-4", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1750146397071, + "tag": "0007_v0-21-0-1", + "breakpoints": true + }, + { + "idx": 8, + "version": "7", + "when": 1750751079210, + "tag": "0008_v0-21-0-2", + "breakpoints": true + }, + { + "idx": 9, + "version": "7", + "when": 1752056714510, + "tag": "0009_v0-22-0-1", + "breakpoints": true + }, + { + "idx": 10, + "version": "7", + "when": 1753084974762, + "tag": "0010_v0-22-0-2", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1754396961710, + "tag": "0011_v0-22-1-1", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1754661913554, + "tag": "0012_v0-24-0-1", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1755074095394, + "tag": "0013_v0-24-0-2", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1760450273146, + "tag": "0014_smart_malice", + "breakpoints": true + } + ] +} \ No newline at end of file From 028a2bc9b8020fa492c10821200bad8072a468c1 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:08:48 +0200 Subject: [PATCH 033/243] chore: update pnpm --- .github/workflows/deploy-docs-test.yml | 2 +- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/tests.yml | 6 +++--- fdm-app/package.json | 2 +- fdm-calculator/package.json | 2 +- fdm-core/package.json | 2 +- fdm-data/package.json | 2 +- fdm-docs/package.json | 2 +- package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy-docs-test.yml b/.github/workflows/deploy-docs-test.yml index f2f11bc81..01fd4ca6f 100644 --- a/.github/workflows/deploy-docs-test.yml +++ b/.github/workflows/deploy-docs-test.yml @@ -35,7 +35,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index aed5acb37..5f57586ae 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -38,7 +38,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 064206399..8b216c56d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,7 @@ jobs: - name: Setup pnpm 10 uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8b792301c..b8ec75904 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -53,7 +53,7 @@ jobs: - name: Setup pnpm 10 uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 @@ -146,7 +146,7 @@ jobs: - name: Setup pnpm 10 uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 @@ -226,7 +226,7 @@ jobs: - name: Setup pnpm 10 uses: pnpm/action-setup@v4 with: - version: 10.17.0 + version: 10.18.3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 diff --git a/fdm-app/package.json b/fdm-app/package.json index fa98e58c9..7981c8d11 100644 --- a/fdm-app/package.json +++ b/fdm-app/package.json @@ -106,5 +106,5 @@ "engines": { "node": ">=20.0.0" }, - "packageManager": "pnpm@10.17.0" + "packageManager": "pnpm@10.18.3" } diff --git a/fdm-calculator/package.json b/fdm-calculator/package.json index 7845cb85e..22667b029 100644 --- a/fdm-calculator/package.json +++ b/fdm-calculator/package.json @@ -61,5 +61,5 @@ "typescript": "catalog:", "vitest": "catalog:" }, - "packageManager": "pnpm@10.17.0" + "packageManager": "pnpm@10.18.3" } diff --git a/fdm-core/package.json b/fdm-core/package.json index 2422765bc..8a862bca1 100644 --- a/fdm-core/package.json +++ b/fdm-core/package.json @@ -73,7 +73,7 @@ "postgres": "^3.4.7", "unique-username-generator": "^1.5.1" }, - "packageManager": "pnpm@10.17.0", + "packageManager": "pnpm@10.18.3", "publishConfig": { "registry": "https://npm.pkg.github.com" } diff --git a/fdm-data/package.json b/fdm-data/package.json index dba82c157..c820aa5d4 100644 --- a/fdm-data/package.json +++ b/fdm-data/package.json @@ -57,7 +57,7 @@ "typescript": "catalog:", "vitest": "catalog:" }, - "packageManager": "pnpm@10.17.0", + "packageManager": "pnpm@10.18.3", "publishConfig": { "registry": "https://npm.pkg.github.com" }, diff --git a/fdm-docs/package.json b/fdm-docs/package.json index 880a2da95..5989819e2 100644 --- a/fdm-docs/package.json +++ b/fdm-docs/package.json @@ -53,5 +53,5 @@ "engines": { "node": ">=18.0" }, - "packageManager": "pnpm@10.14.0" + "packageManager": "pnpm@10.18.3" } diff --git a/package.json b/package.json index 01e6c30af..9c78d9202 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@changesets/cli": "^2.29.7", "turbo": "^2.5.6" }, - "packageManager": "pnpm@10.17.0", + "packageManager": "pnpm@10.18.3", "pnpm": { "packageExtensions": { "vite-plugin-dts": { From 6cbed2211d10ebc4a963d98ae6110f86e917369b Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:09:40 +0200 Subject: [PATCH 034/243] chore: update turbo --- package.json | 2 +- pnpm-lock.yaml | 58 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 9c78d9202..e9650deff 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@biomejs/biome": "^2.2.4", "@changesets/cli": "^2.29.7", - "turbo": "^2.5.6" + "turbo": "^2.5.8" }, "packageManager": "pnpm@10.18.3", "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abaf3dcbd..b16aead45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,8 +74,8 @@ importers: specifier: ^2.29.7 version: 2.29.7(@types/node@24.5.2) turbo: - specifier: ^2.5.6 - version: 2.5.6 + specifier: ^2.5.8 + version: 2.5.8 fdm-app: dependencies: @@ -9972,41 +9972,41 @@ packages: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} - turbo-darwin-64@2.5.6: - resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} + turbo-darwin-64@2.5.8: + resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.6: - resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} + turbo-darwin-arm64@2.5.8: + resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.6: - resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} + turbo-linux-64@2.5.8: + resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.6: - resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} + turbo-linux-arm64@2.5.8: + resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} cpu: [arm64] os: [linux] turbo-stream@3.1.0: resolution: {integrity: sha512-tVI25WEXl4fckNEmrq70xU1XumxUwEx/FZD5AgEcV8ri7Wvrg2o7GEq8U7htrNx3CajciGm+kDyhRf5JB6t7/A==} - turbo-windows-64@2.5.6: - resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} + turbo-windows-64@2.5.8: + resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.6: - resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} + turbo-windows-arm64@2.5.8: + resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} cpu: [arm64] os: [win32] - turbo@2.5.6: - resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} + turbo@2.5.8: + resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} hasBin: true type-fest@0.18.1: @@ -22495,35 +22495,35 @@ snapshots: dependencies: tslib: 1.14.1 - turbo-darwin-64@2.5.6: + turbo-darwin-64@2.5.8: optional: true - turbo-darwin-arm64@2.5.6: + turbo-darwin-arm64@2.5.8: optional: true - turbo-linux-64@2.5.6: + turbo-linux-64@2.5.8: optional: true - turbo-linux-arm64@2.5.6: + turbo-linux-arm64@2.5.8: optional: true turbo-stream@3.1.0: optional: true - turbo-windows-64@2.5.6: + turbo-windows-64@2.5.8: optional: true - turbo-windows-arm64@2.5.6: + turbo-windows-arm64@2.5.8: optional: true - turbo@2.5.6: + turbo@2.5.8: optionalDependencies: - turbo-darwin-64: 2.5.6 - turbo-darwin-arm64: 2.5.6 - turbo-linux-64: 2.5.6 - turbo-linux-arm64: 2.5.6 - turbo-windows-64: 2.5.6 - turbo-windows-arm64: 2.5.6 + turbo-darwin-64: 2.5.8 + turbo-darwin-arm64: 2.5.8 + turbo-linux-64: 2.5.8 + turbo-linux-arm64: 2.5.8 + turbo-windows-64: 2.5.8 + turbo-windows-arm64: 2.5.8 type-fest@0.18.1: {} From 7b46b887fcbc612b2dec15e72ef0d456af0b5eca Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:10:21 +0200 Subject: [PATCH 035/243] chore: update root packages --- package.json | 2 +- pnpm-lock.yaml | 107 ++++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index e9650deff..70ea4212d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "format-and-lint:fix-unsafe": "biome check . --write --unsafe" }, "devDependencies": { - "@biomejs/biome": "^2.2.4", + "@biomejs/biome": "^2.2.6", "@changesets/cli": "^2.29.7", "turbo": "^2.5.8" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b16aead45..96d3230f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: ^2.2.4 - version: 2.2.4 + specifier: ^2.2.6 + version: 2.2.6 '@changesets/cli': specifier: ^2.29.7 version: 2.29.7(@types/node@24.5.2) @@ -1231,55 +1231,55 @@ packages: '@better-fetch/fetch@1.1.18': resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==} - '@biomejs/biome@2.2.4': - resolution: {integrity: sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==} + '@biomejs/biome@2.2.6': + resolution: {integrity: sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.2.4': - resolution: {integrity: sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==} + '@biomejs/cli-darwin-arm64@2.2.6': + resolution: {integrity: sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.2.4': - resolution: {integrity: sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==} + '@biomejs/cli-darwin-x64@2.2.6': + resolution: {integrity: sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.2.4': - resolution: {integrity: sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==} + '@biomejs/cli-linux-arm64-musl@2.2.6': + resolution: {integrity: sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.2.4': - resolution: {integrity: sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==} + '@biomejs/cli-linux-arm64@2.2.6': + resolution: {integrity: sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.2.4': - resolution: {integrity: sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==} + '@biomejs/cli-linux-x64-musl@2.2.6': + resolution: {integrity: sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.2.4': - resolution: {integrity: sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==} + '@biomejs/cli-linux-x64@2.2.6': + resolution: {integrity: sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.2.4': - resolution: {integrity: sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==} + '@biomejs/cli-win32-arm64@2.2.6': + resolution: {integrity: sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.2.4': - resolution: {integrity: sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==} + '@biomejs/cli-win32-x64@2.2.6': + resolution: {integrity: sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -6930,8 +6930,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} hasBin: true human-signals@2.1.0: @@ -9467,6 +9467,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -11510,39 +11515,39 @@ snapshots: '@better-fetch/fetch@1.1.18': {} - '@biomejs/biome@2.2.4': + '@biomejs/biome@2.2.6': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.2.4 - '@biomejs/cli-darwin-x64': 2.2.4 - '@biomejs/cli-linux-arm64': 2.2.4 - '@biomejs/cli-linux-arm64-musl': 2.2.4 - '@biomejs/cli-linux-x64': 2.2.4 - '@biomejs/cli-linux-x64-musl': 2.2.4 - '@biomejs/cli-win32-arm64': 2.2.4 - '@biomejs/cli-win32-x64': 2.2.4 - - '@biomejs/cli-darwin-arm64@2.2.4': + '@biomejs/cli-darwin-arm64': 2.2.6 + '@biomejs/cli-darwin-x64': 2.2.6 + '@biomejs/cli-linux-arm64': 2.2.6 + '@biomejs/cli-linux-arm64-musl': 2.2.6 + '@biomejs/cli-linux-x64': 2.2.6 + '@biomejs/cli-linux-x64-musl': 2.2.6 + '@biomejs/cli-win32-arm64': 2.2.6 + '@biomejs/cli-win32-x64': 2.2.6 + + '@biomejs/cli-darwin-arm64@2.2.6': optional: true - '@biomejs/cli-darwin-x64@2.2.4': + '@biomejs/cli-darwin-x64@2.2.6': optional: true - '@biomejs/cli-linux-arm64-musl@2.2.4': + '@biomejs/cli-linux-arm64-musl@2.2.6': optional: true - '@biomejs/cli-linux-arm64@2.2.4': + '@biomejs/cli-linux-arm64@2.2.6': optional: true - '@biomejs/cli-linux-x64-musl@2.2.4': + '@biomejs/cli-linux-x64-musl@2.2.6': optional: true - '@biomejs/cli-linux-x64@2.2.4': + '@biomejs/cli-linux-x64@2.2.6': optional: true - '@biomejs/cli-win32-arm64@2.2.4': + '@biomejs/cli-win32-arm64@2.2.6': optional: true - '@biomejs/cli-win32-x64@2.2.4': + '@biomejs/cli-win32-x64@2.2.6': optional: true '@borewit/text-codec@0.1.1': {} @@ -11561,7 +11566,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -11570,7 +11575,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: @@ -11603,7 +11608,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -11628,7 +11633,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 '@changesets/get-release-plan@4.0.13': dependencies: @@ -11688,7 +11693,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.1 + human-id: 4.1.2 prettier: 2.8.8 '@colors/colors@1.5.0': @@ -13504,7 +13509,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.14.2 require-in-the-middle: 7.5.2 - semver: 7.7.2 + semver: 7.7.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -19066,7 +19071,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@4.1.1: {} + human-id@4.1.2: {} human-signals@2.1.0: {} @@ -19615,7 +19620,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 map-obj@1.0.1: {} @@ -20335,7 +20340,7 @@ snapshots: node-abi@3.77.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-emoji@2.2.0: dependencies: @@ -20363,7 +20368,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@5.0.0: @@ -21950,6 +21955,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + send@0.19.0: dependencies: debug: 2.6.9 From ebecab312f694802b08e57883a585e3e97e10c88 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:16:59 +0200 Subject: [PATCH 036/243] Update .changeset/wide-apes-hear.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Sven Verweij <37927107+SvenVw@users.noreply.github.com> --- .changeset/wide-apes-hear.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/wide-apes-hear.md b/.changeset/wide-apes-hear.md index 4e429808c..e12eecc4b 100644 --- a/.changeset/wide-apes-hear.md +++ b/.changeset/wide-apes-hear.md @@ -2,4 +2,4 @@ "@svenvw/fdm-core": patch --- -Add the missing options for b_acquiring_method: "In gebuik van een terreinbeherende organisatie" (nl_03), "Tijdelijk gebuik in het kader van landinrichting" (nl_04), "Pacht van geringe oppervlakten" (nl_10) and "Natuurpacht" (nl_11) +Add the missing options for b_acquiring_method: "In gebruik van een terreinbeherende organisatie" (nl_03), "Tijdelijk gebruik in het kader van landinrichting" (nl_04), "Pacht van geringe oppervlakten" (nl_10) and "Natuurpacht" (nl_11) From 3933c04852b9dda3e0e2ddcfee69beb0221e2d6a Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:17:09 +0200 Subject: [PATCH 037/243] Update fdm-core/src/db/schema.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Sven Verweij <37927107+SvenVw@users.noreply.github.com> --- fdm-core/src/db/schema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index 80b887ea0..336b3bd59 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -37,10 +37,10 @@ export type farmsTypeInsert = typeof farms.$inferInsert export const acquiringMethodOptions = [ { value: "nl_01", label: "Eigendom" }, { value: "nl_02", label: "Reguliere pacht" }, - { value: "nl_03", label: "In gebuik van een terreinbeherende organisatie" }, + { value: "nl_03", label: "In gebruik van een terreinbeherende organisatie" }, { value: "nl_04", - label: "Tijdelijk gebuik in het kader van landinrichting", + label: "Tijdelijk gebruik in het kader van landinrichting", }, { value: "nl_07", label: "Overige exploitatievormen" }, { value: "nl_09", label: "Erfpacht" }, From 1d0972cc01656dbee6ff640474c5e7aaf228a802 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:19:47 +0200 Subject: [PATCH 038/243] chore: update minor dependencies --- fdm-app/package.json | 50 +- fdm-core/package.json | 6 +- fdm-docs/package.json | 8 +- pnpm-lock.yaml | 4745 +++++++++++++++++++++++------------------ pnpm-workspace.yaml | 20 +- 5 files changed, 2666 insertions(+), 2163 deletions(-) diff --git a/fdm-app/package.json b/fdm-app/package.json index 7981c8d11..9040c9cff 100644 --- a/fdm-app/package.json +++ b/fdm-app/package.json @@ -22,18 +22,18 @@ "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.2.6", - "@react-email/components": "^0.5.3", + "@react-email/components": "^0.5.6", "@react-email/tailwind": "1.2.2", - "@react-router/node": "^7.9.1", - "@react-router/serve": "^7.9.1", + "@react-router/node": "^7.9.4", + "@react-router/serve": "^7.9.4", "@remix-run/file-storage": "^0.9.0", "@remix-run/form-data-parser": "^0.10.1", - "@sentry/profiling-node": "^10.12.0", - "@sentry/react-router": "^10.12.0", + "@sentry/profiling-node": "^10.19.0", + "@sentry/react-router": "^10.19.0", "@svenvw/fdm-calculator": "workspace:^", "@svenvw/fdm-core": "workspace:^", "@svenvw/fdm-data": "workspace:*", - "@tailwindcss/vite": "^4.1.13", + "@tailwindcss/vite": "^4.1.14", "@tanstack/react-table": "^8.21.3", "@turf/centroid": "^7.2.0", "@turf/turf": "^7.2.0", @@ -44,34 +44,34 @@ "date-fns": "^4.1.0", "drizzle-orm": "catalog:", "file-type": "^21.0.0", - "flatgeobuf": "^4.2.0", - "framer-motion": "^12.23.14", + "flatgeobuf": "^4.3.1", + "framer-motion": "^12.23.24", "fuzzysort": "^3.1.0", - "isbot": "^5.1.30", + "isbot": "^5.1.31", "lodash.throttle": "^4.1.1", "lucide-react": "^0.544.0", "mapbox-gl": "^3.15.0", "next-themes": "^0.4.6", "postgres": "^3.4.7", - "posthog-js": "^1.266.0", - "posthog-node": "^5.8.4", + "posthog-js": "^1.275.2", + "posthog-node": "^5.10.0", "postmark": "^4.0.5", "proj4": "^2.19.10", "radix-ui": "^1.4.3", - "react": "^19.1.1", + "react": "^19.2.0", "react-day-picker": "9.10.0", - "react-dom": "^19.1.1", - "react-hook-form": "^7.62.0", - "react-map-gl": "^8.0.4", + "react-dom": "^19.2.0", + "react-hook-form": "^7.65.0", + "react-map-gl": "^8.1.0", "react-markdown": "^10.1.0", - "react-router": "^7.9.1", - "react-router-dom": "^7.9.1", + "react-router": "^7.9.4", + "react-router-dom": "^7.9.4", "recharts": "^2.15.4", "remark-gfm": "^4.0.1", "remix-hook-form": "7.1.0", - "remix-toast": "^3.2.0", + "remix-toast": "^3.3.0", "remix-utils": "^8.8.0", - "shpjs": "^6.1.0", + "shpjs": "^6.2.0", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", @@ -82,23 +82,23 @@ }, "devDependencies": { "@dotenvx/dotenvx": "catalog:", - "@react-router/dev": "^7.9.1", - "@react-router/fs-routes": "^7.9.1", + "@react-router/dev": "^7.9.4", + "@react-router/fs-routes": "^7.9.4", "@svenvw/fdm-calculator": "workspace:*", "@svenvw/fdm-core": "workspace:*", "@svenvw/fdm-data": "workspace:*", - "@tailwindcss/postcss": "^4.1.13", + "@tailwindcss/postcss": "^4.1.14", "@types/geojson": "^7946.0.16", "@types/lodash.throttle": "^4.1.9", "@types/mapbox-gl": "^3.4.1", "@types/mapbox__geojson-extent": "^1.0.3", "@types/mapbox__mapbox-gl-geocoder": "^5.0.0", - "@types/react": "^19.1.13", - "@types/react-dom": "^19.1.9", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", "@types/react-map-gl": "^6.1.7", "@types/validator": "^13.15.3", "postcss": "^8.5.6", - "tailwindcss": "^4.1.13", + "tailwindcss": "^4.1.14", "typescript": "catalog:", "vite": "catalog:", "vite-tsconfig-paths": "catalog:" diff --git a/fdm-core/package.json b/fdm-core/package.json index 8a862bca1..fc3fe5085 100644 --- a/fdm-core/package.json +++ b/fdm-core/package.json @@ -51,7 +51,7 @@ "@rollup/plugin-terser": "catalog:", "@rollup/plugin-typescript": "catalog:", "@svenvw/fdm-data": "workspace:^0.17.1", - "@types/node": "^24.5.2", + "@types/node": "^24.7.2", "@vitest/coverage-v8": "catalog:", "drizzle-kit": "catalog:", "fs-extra": "^11.3.2", @@ -64,12 +64,12 @@ "vitest": "catalog:" }, "dependencies": { - "@electric-sql/pglite": "^0.3.8", + "@electric-sql/pglite": "^0.3.11", "@svenvw/fdm-data": "workspace:*", "@types/geojson": "^7946.0.16", "better-auth": "catalog:", "drizzle-orm": "catalog:", - "nanoid": "^5.1.5", + "nanoid": "^5.1.6", "postgres": "^3.4.7", "unique-username-generator": "^1.5.1" }, diff --git a/fdm-docs/package.json b/fdm-docs/package.json index 5989819e2..c9072fff1 100644 --- a/fdm-docs/package.json +++ b/fdm-docs/package.json @@ -20,14 +20,14 @@ }, "dependencies": { "@docusaurus/core": "3.8.1", - "@docusaurus/faster": "^3.8.1", + "@docusaurus/faster": "^3.9.1", "@docusaurus/preset-classic": "3.8.1", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", "lucide-react": "^0.544.0", "prism-react-renderer": "^2.4.1", - "react": "^19.1.1", - "react-dom": "^19.1.1" + "react": "^19.2.0", + "react-dom": "^19.2.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.8.1", @@ -35,7 +35,7 @@ "@docusaurus/types": "3.8.1", "docusaurus-plugin-typedoc": "^1.4.2", "typedoc": "catalog:", - "typedoc-plugin-markdown": "^4.8.1", + "typedoc-plugin-markdown": "^4.9.0", "typescript": "catalog:" }, "browserslist": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96d3230f3..1d4b782ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: catalogs: default: '@dotenvx/dotenvx': - specifier: ^1.49.1 + specifier: ^1.51.0 version: 1.48.4 '@rollup/plugin-commonjs': specifier: ^28.0.6 @@ -16,7 +16,7 @@ catalogs: specifier: ^6.1.0 version: 6.1.0 '@rollup/plugin-node-resolve': - specifier: ^16.0.1 + specifier: ^16.0.3 version: 16.0.1 '@rollup/plugin-terser': specifier: ^0.4.4 @@ -28,32 +28,32 @@ catalogs: specifier: 3.2.4 version: 3.2.4 better-auth: - specifier: ^1.3.26 + specifier: ^1.3.27 version: 1.3.27 drizzle-kit: - specifier: ^0.31.4 - version: 0.31.4 + specifier: ^0.31.5 + version: 0.31.5 drizzle-orm: - specifier: ^0.44.5 + specifier: ^0.44.6 version: 0.44.4 rollup: - specifier: ^4.50.2 + specifier: ^4.52.4 version: 4.50.2 rollup-plugin-polyfill-node: specifier: ^0.13.0 version: 0.13.0 typedoc: - specifier: ^0.28.13 + specifier: ^0.28.14 version: 0.28.13 typedoc-plugin-missing-exports: - specifier: ^4.1.0 + specifier: ^4.1.2 version: 4.1.0 typescript: - specifier: ^5.9.2 + specifier: ^5.9.3 version: 5.9.2 vite: - specifier: ^7.1.6 - version: 7.1.6 + specifier: ^7.1.10 + version: 7.1.10 vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4 @@ -72,7 +72,7 @@ importers: version: 2.2.6 '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@24.5.2) + version: 2.29.7(@types/node@24.7.2) turbo: specifier: ^2.5.8 version: 2.5.8 @@ -84,7 +84,7 @@ importers: version: 1.4.1 '@hookform/resolvers': specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.62.0(react@19.1.1)) + version: 5.2.2(react-hook-form@7.65.0(react@19.2.0)) '@mapbox/geojson-extent': specifier: ^1.0.1 version: 1.0.1 @@ -93,28 +93,28 @@ importers: version: 5.1.2 '@radix-ui/react-alert-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-icons': specifier: ^1.3.2 - version: 1.3.2(react@19.1.1) + version: 1.3.2(react@19.2.0) '@radix-ui/react-slot': specifier: ^1.2.3 - version: 1.2.3(@types/react@19.1.13)(react@19.1.1) + version: 1.2.3(@types/react@19.2.2)(react@19.2.0) '@radix-ui/react-switch': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-email/components': - specifier: ^0.5.3 - version: 0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^0.5.6 + version: 0.5.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-email/tailwind': specifier: 1.2.2 - version: 1.2.2(react@19.1.1) + version: 1.2.2(react@19.2.0) '@react-router/node': - specifier: ^7.9.1 - version: 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) + specifier: ^7.9.4 + version: 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) '@react-router/serve': - specifier: ^7.9.1 - version: 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) + specifier: ^7.9.4 + version: 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) '@remix-run/file-storage': specifier: ^0.9.0 version: 0.9.0 @@ -122,11 +122,11 @@ importers: specifier: ^0.10.1 version: 0.10.1 '@sentry/profiling-node': - specifier: ^10.12.0 - version: 10.12.0 + specifier: ^10.19.0 + version: 10.19.0 '@sentry/react-router': - specifier: ^10.12.0 - version: 10.12.0(@react-router/node@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + specifier: ^10.19.0 + version: 10.19.0(@react-router/node@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) '@svenvw/fdm-calculator': specifier: workspace:^ version: link:../fdm-calculator @@ -137,11 +137,11 @@ importers: specifier: workspace:* version: link:../fdm-data '@tailwindcss/vite': - specifier: ^4.1.13 - version: 4.1.13(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + specifier: ^4.1.14 + version: 4.1.14(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.21.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@turf/centroid': specifier: ^7.2.0 version: 7.2.0 @@ -150,7 +150,7 @@ importers: version: 7.2.0 better-auth: specifier: 'catalog:' - version: 1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -159,49 +159,49 @@ importers: version: 2.1.1 cmdk: specifier: 1.1.1 - version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) date-fns: specifier: ^4.1.0 version: 4.1.0 drizzle-orm: specifier: 'catalog:' - version: 0.44.4(@electric-sql/pglite@0.3.8)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.7)(postgres@3.4.7) + version: 0.44.6(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7) file-type: specifier: ^21.0.0 version: 21.0.0 flatgeobuf: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.3.1 + version: 4.3.1 framer-motion: - specifier: ^12.23.14 - version: 12.23.14(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^12.23.24 + version: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fuzzysort: specifier: ^3.1.0 version: 3.1.0 isbot: - specifier: ^5.1.30 - version: 5.1.30 + specifier: ^5.1.31 + version: 5.1.31 lodash.throttle: specifier: ^4.1.1 version: 4.1.1 lucide-react: specifier: ^0.544.0 - version: 0.544.0(react@19.1.1) + version: 0.544.0(react@19.2.0) mapbox-gl: specifier: ^3.15.0 version: 3.15.0 next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postgres: specifier: ^3.4.7 version: 3.4.7 posthog-js: - specifier: ^1.266.0 - version: 1.266.0 + specifier: ^1.275.2 + version: 1.275.2 posthog-node: - specifier: ^5.8.4 - version: 5.8.4 + specifier: ^5.10.0 + version: 5.10.0 postmark: specifier: ^4.0.5 version: 4.0.5 @@ -210,83 +210,83 @@ importers: version: 2.19.10 radix-ui: specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: - specifier: ^19.1.1 - version: 19.1.1 + specifier: ^19.2.0 + version: 19.2.0 react-day-picker: specifier: 9.10.0 - version: 9.10.0(react@19.1.1) + version: 9.10.0(react@19.2.0) react-dom: - specifier: ^19.1.1 - version: 19.1.1(react@19.1.1) + specifier: ^19.2.0 + version: 19.2.0(react@19.2.0) react-hook-form: - specifier: ^7.62.0 - version: 7.62.0(react@19.1.1) + specifier: ^7.65.0 + version: 7.65.0(react@19.2.0) react-map-gl: - specifier: ^8.0.4 - version: 8.0.4(mapbox-gl@3.15.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^8.1.0 + version: 8.1.0(mapbox-gl@3.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.1.13)(react@19.1.1) + version: 10.1.0(@types/react@19.2.2)(react@19.2.0) react-router: - specifier: ^7.9.1 - version: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^7.9.4 + version: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-router-dom: - specifier: ^7.9.1 - version: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^7.9.4 + version: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) recharts: specifier: ^2.15.4 - version: 2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) remark-gfm: specifier: ^4.0.1 version: 4.0.1 remix-hook-form: specifier: 7.1.0 - version: 7.1.0(react-dom@19.1.1(react@19.1.1))(react-hook-form@7.62.0(react@19.1.1))(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 7.1.0(react-dom@19.2.0(react@19.2.0))(react-hook-form@7.65.0(react@19.2.0))(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) remix-toast: - specifier: ^3.2.0 - version: 3.2.0(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + specifier: ^3.3.0 + version: 3.3.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) remix-utils: specifier: ^8.8.0 - version: 8.8.0(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(zod@3.25.76) + version: 8.8.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(zod@3.25.76) shpjs: - specifier: ^6.1.0 - version: 6.1.0 + specifier: ^6.2.0 + version: 6.2.0 sonner: specifier: ^2.0.7 - version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwind-merge: specifier: ^3.3.1 version: 3.3.1 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.1.13) + version: 1.0.7(tailwindcss@4.1.14) validator: specifier: ^13.15.15 version: 13.15.15 vite-node: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) zod: specifier: ^3.25.76 version: 3.25.76 zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + version: 5.0.8(@types/react@19.2.2)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) devDependencies: '@dotenvx/dotenvx': specifier: 'catalog:' - version: 1.48.4 + version: 1.51.0 '@react-router/dev': - specifier: ^7.9.1 - version: 7.9.1(@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(@types/node@24.5.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.5.1)(lightningcss@1.30.1)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + specifier: ^7.9.4 + version: 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@react-router/fs-routes': - specifier: ^7.9.1 - version: 7.9.1(@react-router/dev@7.9.1(@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(@types/node@24.5.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.5.1)(lightningcss@1.30.1)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2) + specifier: ^7.9.4 + version: 7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3) '@tailwindcss/postcss': - specifier: ^4.1.13 - version: 4.1.13 + specifier: ^4.1.14 + version: 4.1.14 '@types/geojson': specifier: ^7946.0.16 version: 7946.0.16 @@ -303,11 +303,11 @@ importers: specifier: ^5.0.0 version: 5.0.0 '@types/react': - specifier: ^19.1.13 - version: 19.1.13 + specifier: ^19.2.2 + version: 19.2.2 '@types/react-dom': - specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.13) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) '@types/react-map-gl': specifier: ^6.1.7 version: 6.1.7 @@ -318,17 +318,17 @@ importers: specifier: ^8.5.6 version: 8.5.6 tailwindcss: - specifier: ^4.1.13 - version: 4.1.13 + specifier: ^4.1.14 + version: 4.1.14 typescript: specifier: 'catalog:' - version: 5.9.2 + version: 5.9.3 vite: specifier: 'catalog:' - version: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: 'catalog:' - version: 5.1.4(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) fdm-calculator: dependencies: @@ -362,7 +362,7 @@ importers: version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) postgres: specifier: ^3.4.7 version: 3.4.7 @@ -383,13 +383,13 @@ importers: version: 5.9.2 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) fdm-core: dependencies: '@electric-sql/pglite': - specifier: ^0.3.8 - version: 0.3.8 + specifier: ^0.3.11 + version: 0.3.11 '@svenvw/fdm-data': specifier: workspace:* version: link:../fdm-data @@ -398,13 +398,13 @@ importers: version: 7946.0.16 better-auth: specifier: 'catalog:' - version: 1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) drizzle-orm: specifier: 'catalog:' - version: 0.44.4(@electric-sql/pglite@0.3.8)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.7)(postgres@3.4.7) + version: 0.44.4(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7) nanoid: - specifier: ^5.1.5 - version: 5.1.5 + specifier: ^5.1.6 + version: 5.1.6 postgres: specifier: ^3.4.7 version: 3.4.7 @@ -428,14 +428,14 @@ importers: specifier: 'catalog:' version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) '@types/node': - specifier: ^24.5.2 - version: 24.5.2 + specifier: ^24.7.2 + version: 24.7.2 '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) drizzle-kit: specifier: 'catalog:' - version: 0.31.4 + version: 0.31.5 fs-extra: specifier: ^11.3.2 version: 11.3.2 @@ -459,7 +459,7 @@ importers: version: 5.9.2 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) fdm-data: dependencies: @@ -487,7 +487,7 @@ importers: version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) rollup: specifier: 'catalog:' version: 4.50.2 @@ -505,64 +505,64 @@ importers: version: 5.9.2 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) fdm-docs: dependencies: '@docusaurus/core': specifier: 3.8.1 - version: 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/faster': - specifier: ^3.8.1 - version: 3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + specifier: ^3.9.1 + version: 3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) '@docusaurus/preset-classic': specifier: 3.8.1 - version: 3.8.1(@algolia/client-search@5.37.0)(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.2) + version: 3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2) '@mdx-js/react': specifier: ^3.1.1 - version: 3.1.1(@types/react@19.1.13)(react@19.1.1) + version: 3.1.1(@types/react@19.2.2)(react@19.2.0) clsx: specifier: ^2.1.1 version: 2.1.1 lucide-react: specifier: ^0.544.0 - version: 0.544.0(react@19.1.1) + version: 0.544.0(react@19.2.0) prism-react-renderer: specifier: ^2.4.1 - version: 2.4.1(react@19.1.1) + version: 2.4.1(react@19.2.0) react: - specifier: ^19.1.1 - version: 19.1.1 + specifier: ^19.2.0 + version: 19.2.0 react-dom: - specifier: ^19.1.1 - version: 19.1.1(react@19.1.1) + specifier: ^19.2.0 + version: 19.2.0(react@19.2.0) devDependencies: '@docusaurus/module-type-aliases': specifier: 3.8.1 - version: 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/tsconfig': specifier: 3.8.1 version: 3.8.1 '@docusaurus/types': specifier: 3.8.1 - version: 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) docusaurus-plugin-typedoc: specifier: ^1.4.2 - version: 1.4.2(typedoc-plugin-markdown@4.8.1(typedoc@0.28.13(typescript@5.9.2))) + version: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) typedoc: specifier: 'catalog:' version: 0.28.13(typescript@5.9.2) typedoc-plugin-markdown: - specifier: ^4.8.1 - version: 4.8.1(typedoc@0.28.13(typescript@5.9.2)) + specifier: ^4.9.0 + version: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) typescript: specifier: 'catalog:' version: 5.9.2 packages: - '@algolia/abtesting@1.3.0': - resolution: {integrity: sha512-KqPVLdVNfoJzX5BKNGM9bsW8saHeyax8kmPFXul5gejrSPN3qss7PgsFH5mMem7oR8tvjvNkia97ljEYPYCN8Q==} + '@algolia/abtesting@1.6.0': + resolution: {integrity: sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==} engines: {node: '>= 14.0.0'} '@algolia/autocomplete-core@1.17.9': @@ -585,59 +585,59 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.37.0': - resolution: {integrity: sha512-Dp2Zq+x9qQFnuiQhVe91EeaaPxWBhzwQ6QnznZQnH9C1/ei3dvtmAFfFeaTxM6FzfJXDLvVnaQagTYFTQz3R5g==} + '@algolia/client-abtesting@5.40.0': + resolution: {integrity: sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.37.0': - resolution: {integrity: sha512-wyXODDOluKogTuZxRII6mtqhAq4+qUR3zIUJEKTiHLe8HMZFxfUEI4NO2qSu04noXZHbv/sRVdQQqzKh12SZuQ==} + '@algolia/client-analytics@5.40.0': + resolution: {integrity: sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.37.0': - resolution: {integrity: sha512-GylIFlPvLy9OMgFG8JkonIagv3zF+Dx3H401Uo2KpmfMVBBJiGfAb9oYfXtplpRMZnZPxF5FnkWaI/NpVJMC+g==} + '@algolia/client-common@5.40.0': + resolution: {integrity: sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.37.0': - resolution: {integrity: sha512-T63afO2O69XHKw2+F7mfRoIbmXWGzgpZxgOFAdP3fR4laid7pWBt20P4eJ+Zn23wXS5kC9P2K7Bo3+rVjqnYiw==} + '@algolia/client-insights@5.40.0': + resolution: {integrity: sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.37.0': - resolution: {integrity: sha512-1zOIXM98O9zD8bYDCJiUJRC/qNUydGHK/zRK+WbLXrW1SqLFRXECsKZa5KoG166+o5q5upk96qguOtE8FTXDWQ==} + '@algolia/client-personalization@5.40.0': + resolution: {integrity: sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.37.0': - resolution: {integrity: sha512-31Nr2xOLBCYVal+OMZn1rp1H4lPs1914Tfr3a34wU/nsWJ+TB3vWjfkUUuuYhWoWBEArwuRzt3YNLn0F/KRVkg==} + '@algolia/client-query-suggestions@5.40.0': + resolution: {integrity: sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.37.0': - resolution: {integrity: sha512-DAFVUvEg+u7jUs6BZiVz9zdaUebYULPiQ4LM2R4n8Nujzyj7BZzGr2DCd85ip4p/cx7nAZWKM8pLcGtkTRTdsg==} + '@algolia/client-search@5.40.0': + resolution: {integrity: sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==} engines: {node: '>= 14.0.0'} '@algolia/events@4.0.1': resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - '@algolia/ingestion@1.37.0': - resolution: {integrity: sha512-pkCepBRRdcdd7dTLbFddnu886NyyxmhgqiRcHHaDunvX03Ij4WzvouWrQq7B7iYBjkMQrLS8wQqSP0REfA4W8g==} + '@algolia/ingestion@1.40.0': + resolution: {integrity: sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.37.0': - resolution: {integrity: sha512-fNw7pVdyZAAQQCJf1cc/ih4fwrRdQSgKwgor4gchsI/Q/ss9inmC6bl/69jvoRSzgZS9BX4elwHKdo0EfTli3w==} + '@algolia/monitoring@1.40.0': + resolution: {integrity: sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.37.0': - resolution: {integrity: sha512-U+FL5gzN2ldx3TYfQO5OAta2TBuIdabEdFwD5UVfWPsZE5nvOKkc/6BBqP54Z/adW/34c5ZrvvZhlhNTZujJXQ==} + '@algolia/recommend@5.40.0': + resolution: {integrity: sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.37.0': - resolution: {integrity: sha512-Ao8GZo8WgWFABrU7iq+JAftXV0t+UcOtCDL4mzHHZ+rQeTTf1TZssr4d0vIuoqkVNnKt9iyZ7T4lQff4ydcTrw==} + '@algolia/requester-browser-xhr@5.40.0': + resolution: {integrity: sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.37.0': - resolution: {integrity: sha512-H7OJOXrFg5dLcGJ22uxx8eiFId0aB9b0UBhoOi4SMSuDBe6vjJJ/LeZyY25zPaSvkXNBN3vAM+ad6M0h6ha3AA==} + '@algolia/requester-fetch@5.40.0': + resolution: {integrity: sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.37.0': - resolution: {integrity: sha512-npZ9aeag4SGTx677eqPL3rkSPlQrnzx/8wNrl1P7GpWq9w/eTmRbOq+wKrJ2r78idlY0MMgmY/mld2tq6dc44g==} + '@algolia/requester-node-http@5.40.0': + resolution: {integrity: sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==} engines: {node: '>= 14.0.0'} '@alloc/quick-lru@5.2.0': @@ -648,6 +648,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@apm-js-collab/code-transformer@0.8.2': + resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + + '@apm-js-collab/tracing-hooks@0.3.1': + resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1388,8 +1394,8 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/postcss-alpha-function@1.0.0': - resolution: {integrity: sha512-r2L8KNg5Wriq5n8IUQcjzy2Rh37J5YjzP9iOyHZL5fxdWYHB08vqykHQa4wAzN/tXwDuCHnhQDGCtxfS76xn7g==} + '@csstools/postcss-alpha-function@1.0.1': + resolution: {integrity: sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1400,32 +1406,38 @@ packages: peerDependencies: postcss: ^8.4 - '@csstools/postcss-color-function-display-p3-linear@1.0.0': - resolution: {integrity: sha512-7q+OuUqfowRrP84m/Jl0wv3pfCQyUTCW5MxDIux+/yty5IkUUHOTigCjrC0Fjy3OT0ncGLudHbfLWmP7E1arNA==} + '@csstools/postcss-color-function-display-p3-linear@1.0.1': + resolution: {integrity: sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function@4.0.12': + resolution: {integrity: sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-color-function@4.0.11': - resolution: {integrity: sha512-AtH22zLHTLm64HLdpv5EedT/zmYTm1MtdQbQhRZXxEB6iYtS6SrS1jLX3TcmUWMFzpumK/OVylCm3HcLms4slw==} + '@csstools/postcss-color-mix-function@3.0.12': + resolution: {integrity: sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-color-mix-function@3.0.11': - resolution: {integrity: sha512-cQpXBelpTx0YhScZM5Ve0jDCA4RzwFc7oNafzZOGgCHt/GQVYiU8Vevz9QJcwy/W0Pyi/BneY+KMjz23lI9r+Q==} + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2': + resolution: {integrity: sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.1': - resolution: {integrity: sha512-c7hyBtbF+jlHIcUGVdWY06bHICgguV9ypfcELU3eU3W/9fiz2dxM8PqxQk2ndXYTzLnwPvNNqu1yCmQ++N6Dcg==} + '@csstools/postcss-content-alt-text@2.0.8': + resolution: {integrity: sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-content-alt-text@2.0.7': - resolution: {integrity: sha512-cq/zWaEkpcg3RttJ5+GdNwk26NwxY5KgqgtNL777Fdd28AVGHxuBvqmK4Jq4oKhW1NX4M2LbgYAVVN0NZ+/XYQ==} + '@csstools/postcss-contrast-color-function@2.0.12': + resolution: {integrity: sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1448,20 +1460,20 @@ packages: peerDependencies: postcss: ^8.4 - '@csstools/postcss-gradients-interpolation-method@5.0.11': - resolution: {integrity: sha512-8M3mcNTL3cGIJXDnvrJ2oWEcKi3zyw7NeYheFKePUlBmLYm1gkw9Rr/BA7lFONrOPeQA3yeMPldrrws6lqHrug==} + '@csstools/postcss-gradients-interpolation-method@5.0.12': + resolution: {integrity: sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-hwb-function@4.0.11': - resolution: {integrity: sha512-9meZbsVWTZkWsSBazQips3cHUOT29a/UAwFz0AMEXukvpIGGDR9+GMl3nIckWO5sPImsadu4F5Zy+zjt8QgCdA==} + '@csstools/postcss-hwb-function@4.0.12': + resolution: {integrity: sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-ic-unit@4.0.3': - resolution: {integrity: sha512-RtYYm2qUIu9vAaHB0cC8rQGlOCQAUgEc2tMr7ewlGXYipBQKjoWmyVArqsk7SEr8N3tErq6P6UOJT3amaVof5Q==} + '@csstools/postcss-ic-unit@4.0.4': + resolution: {integrity: sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1478,8 +1490,8 @@ packages: peerDependencies: postcss: ^8.4 - '@csstools/postcss-light-dark-function@2.0.10': - resolution: {integrity: sha512-g7Lwb294lSoNnyrwcqoooh9fTAp47rRNo+ILg7SLRSMU3K9ePIwRt566sNx+pehiCelv4E1ICaU1EwLQuyF2qw==} + '@csstools/postcss-light-dark-function@2.0.11': + resolution: {integrity: sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1538,14 +1550,14 @@ packages: peerDependencies: postcss: ^8.4 - '@csstools/postcss-oklab-function@4.0.11': - resolution: {integrity: sha512-9f03ZGxZ2VmSCrM4SDXlAYP+Xpu4VFzemfQUQFL9OYxAbpvDy0FjDipZ0i8So1pgs8VIbQI0bNjFWgfdpGw8ig==} + '@csstools/postcss-oklab-function@4.0.12': + resolution: {integrity: sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-progressive-custom-properties@4.2.0': - resolution: {integrity: sha512-fWCXRasX17N1NCPTCuwC3FJDV+Wc031f16cFuuMEfIsYJ1q5ABCa59W0C6VeMGqjNv6ldf37vvwXXAeaZjD9PA==} + '@csstools/postcss-progressive-custom-properties@4.2.1': + resolution: {integrity: sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1556,8 +1568,8 @@ packages: peerDependencies: postcss: ^8.4 - '@csstools/postcss-relative-color-syntax@3.0.11': - resolution: {integrity: sha512-oQ5fZvkcBrWR+k6arHXk0F8FlkmD4IxM+rcGDLWrF2f31tWyEM3lSraeWAV0f7BGH6LIrqmyU3+Qo/1acfoJng==} + '@csstools/postcss-relative-color-syntax@3.0.12': + resolution: {integrity: sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -1669,9 +1681,9 @@ packages: resolution: {integrity: sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==} engines: {node: '>=18.0'} - '@docusaurus/faster@3.8.1': - resolution: {integrity: sha512-XYrj3qnTm+o2d5ih5drCq9s63GJoM8vZ26WbLG5FZhURsNxTSXgHJcx11Qo7nWPUStCQkuqk1HvItzscCUnd4A==} - engines: {node: '>=18.0'} + '@docusaurus/faster@3.9.1': + resolution: {integrity: sha512-zJIrIv+R/IN5TTLV9L+SvO3hwz62L6pO/L16k+b2nC3to3Gn01cnEGHL6doTGAezuPwTSmteJl+kzaoOf+znzg==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/types': '*' @@ -1823,6 +1835,10 @@ packages: resolution: {integrity: sha512-GpJWpGVI5JGhNzFlWOjCD3KMiN3xU1US4oLKQ7SiiGru4LvR7sUf3pDMpfjtlgzHStL5ydq4ekfZcRxWpHaJkA==} hasBin: true + '@dotenvx/dotenvx@1.51.0': + resolution: {integrity: sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww==} + hasBin: true + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -1832,8 +1848,8 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@electric-sql/pglite@0.3.8': - resolution: {integrity: sha512-VlAz/R7mktifp9IHzNvjxWJM8p3fPH2lHpustYuRSOXOpXiAMTlA5qqxcufPaDnfee6CZCE9qrT1MHDT7riSHg==} + '@electric-sql/pglite@0.3.11': + resolution: {integrity: sha512-FJtjnEyez8XgmgyE5Ewmx89TGVN+75ZjykFoExApRIbJBMT4dsbsuZkF/YWLuymGDfGFHDACjvENPMEqg4FoWg==} '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} @@ -2155,8 +2171,8 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@gerrit0/mini-shiki@3.12.2': - resolution: {integrity: sha512-HKZPmO8OSSAAo20H2B3xgJdxZaLTwtlMwxg0967scnrDlPwe6j5+ULGHyIqwgTbFCn9yv/ff8CmfWZLE9YKBzA==} + '@gerrit0/mini-shiki@3.13.1': + resolution: {integrity: sha512-fDWM5QQc70jwBIt/WYMybdyXdyBmoJe7r1hpM+V/bHnyla79sygVDK2/LlVxIPc4n5FA3B5Wzt7AQH2+psNphg==} '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2332,8 +2348,8 @@ packages: '@module-federation/webpack-bundler-runtime@0.18.0': resolution: {integrity: sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==} - '@napi-rs/wasm-runtime@1.0.5': - resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} @@ -2547,8 +2563,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/redis-common@0.38.0': - resolution: {integrity: sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==} + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} engines: {node: ^18.19.0 || >=20.6.0} '@opentelemetry/resources@2.1.0': @@ -2567,8 +2583,8 @@ packages: resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} - '@opentelemetry/sql-common@0.41.0': - resolution: {integrity: sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==} + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -2609,8 +2625,8 @@ packages: '@peculiar/x509@1.14.0': resolution: {integrity: sha512-Yc4PDxN3OrxUPiXgU63c+ZRXKGE8YKF2McTciYhUHFtHVB0KMnjeFSU0qpztGhsp4P0uKix4+J2xEpIEDu8oXg==} - '@petamoriken/float16@3.9.2': - resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@petamoriken/float16@3.9.3': + resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2631,8 +2647,8 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@posthog/core@1.0.2': - resolution: {integrity: sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==} + '@posthog/core@1.3.0': + resolution: {integrity: sha512-hxLL8kZNHH098geedcxCz8y6xojkNYbmJEW+1vFXsmPcExyCXIUUJ/34X6xa9GcprKxd0Wsx3vfJQLQX4iVPhw==} '@prisma/instrumentation@6.15.0': resolution: {integrity: sha512-6TXaH6OmDkMOQvOxwLZ8XS51hU2v4A3vmE2pSijCIiGRJYyNeMcL6nMHQMyYdZRD8wl7LF3Wzc+AMPMV/9Oo7A==} @@ -3363,8 +3379,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.5.3': - resolution: {integrity: sha512-8G5vsoMehuGOT4cDqaYLdpagtqCYPl4vThXNylClxO6SrN2w9Mh1+i2RNGj/rdqh/woamHORjlXMYCA/kzDMew==} + '@react-email/components@0.5.6': + resolution: {integrity: sha512-3o9ellDaF3bBcVMWeos9HI0iUIT1zGygPRcn9WSfI5JREORiN6ViEJIvz5SKWEn1KPNZtw/iaW8ct7PpVyhomg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3428,8 +3444,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@1.2.3': - resolution: {integrity: sha512-qu3XYNkHGao3teJexVD5CrcgFkNLrzbZvpZN17a7EyQYUN3kHkTkE9saqY4VbvGx6QoNU3p8rsk/Xm++D/+pTw==} + '@react-email/render@1.3.2': + resolution: {integrity: sha512-oq8/BD/I/YspeuBjjdLJG6xaf9tsPYk+VWu8/mX9xWbRN0t0ExKSVm9sEBL6RsCpndQA2jbY2VgPEreIrzUgqw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3459,14 +3475,14 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-router/dev@7.9.1': - resolution: {integrity: sha512-fW/qubsdHq1nsufHPLpXa6hiNvXXV9JBtWqRlJ02OOhFeaWERZw4rGoHjG1DCg8/QTTadgbzplmP97ZnzWPkcA==} + '@react-router/dev@7.9.4': + resolution: {integrity: sha512-bLs6DjKMJExT7Y57EBx25hkeGGUla3pURxvOn15IN8Mmaw2+euDtBUX9+OFrAPsAzD1xIj6+2HNLXlFH/LB86Q==} engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - '@react-router/serve': ^7.9.1 + '@react-router/serve': ^7.9.4 '@vitejs/plugin-rsc': '*' - react-router: ^7.9.1 + react-router: ^7.9.4 typescript: ^5.1.0 vite: ^5.1.0 || ^6.0.0 || ^7.0.0 wrangler: ^3.28.2 || ^4.0.0 @@ -3480,43 +3496,43 @@ packages: wrangler: optional: true - '@react-router/express@7.9.1': - resolution: {integrity: sha512-d1sfsD3AJXZj+C5k3jAmxAD3vJXGfoh3lNmtSwxp0NdZFHI54zPC5S9o80cy3P8p6Gc7XzSEQJYk9k7fAM/AIw==} + '@react-router/express@7.9.4': + resolution: {integrity: sha512-qba2YnZXWz8kyXNxXKDa0qS88ct4MwJKMwINmto/LPb08W/YdgRUBSZIw7QnOdN7aFkvWTRGXKBTCcle8WDnRA==} engines: {node: '>=20.0.0'} peerDependencies: express: ^4.17.1 || ^5 - react-router: 7.9.1 + react-router: 7.9.4 typescript: ^5.1.0 peerDependenciesMeta: typescript: optional: true - '@react-router/fs-routes@7.9.1': - resolution: {integrity: sha512-K97pQ7PIUJnmYPzoC5lrJxr3XKDn5ZLBMkp403usQJlucpP2NUfRw7I5N3NdqQ5XDbPEyROOJr6wsZnWGPPC7g==} + '@react-router/fs-routes@7.9.4': + resolution: {integrity: sha512-k3IWKOGiPDJqGsoqKaI4V1WY4ulfG5/lWLlI0G5p1Yij4eDyYW3D+p/+inBFs49Oxsc/PbB2rnAXY4j5Bjruhg==} engines: {node: '>=20.0.0'} peerDependencies: - '@react-router/dev': ^7.9.1 + '@react-router/dev': ^7.9.4 typescript: ^5.1.0 peerDependenciesMeta: typescript: optional: true - '@react-router/node@7.9.1': - resolution: {integrity: sha512-XfyVLM+sDUDB1frGNr7iqaKNglrPwBiUp8+sFdL4///bngy49pUb2RuEtn2J2Cy5yjL+IlKbjJFrsmfimLBmeg==} + '@react-router/node@7.9.4': + resolution: {integrity: sha512-sdeDNRaqAB71BR2hPlhcQbPbrXh8uGJUjLVc+NpRiPsQbv6B8UvIucN4IX9YGVJkw3UxVQBn2vPSwxACAck32Q==} engines: {node: '>=20.0.0'} peerDependencies: - react-router: 7.9.1 + react-router: 7.9.4 typescript: ^5.1.0 peerDependenciesMeta: typescript: optional: true - '@react-router/serve@7.9.1': - resolution: {integrity: sha512-yVBSb5KsNCdkSoOk186/M5GJtcIvKE32Ax9LhXySVpM+suCSjucI+p2TXDOJIYsBqr2aKcBl/bNBm5sIJxG/HA==} + '@react-router/serve@7.9.4': + resolution: {integrity: sha512-zXub2L4qwtGd8+pdXi1QheI8PHPxSwi5EF0D1924fji8yN1R8csP/2cr055/xFOEtbkbJSZyVRrJ44fFnBxKCw==} engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - react-router: 7.9.1 + react-router: 7.9.4 '@remix-run/file-storage@0.9.0': resolution: {integrity: sha512-GbrmqGTdgevRMqkcTzGG9eyUn3eo32ST/jmqdh2g8h5MNKmONF6TJpVDZvtGhrvl93kX/k01WigUk/R8j58/eA==} @@ -3533,6 +3549,9 @@ packages: '@remix-run/multipart-parser@0.11.0': resolution: {integrity: sha512-AE/H+ok0fWOZb84sJ8vREOJiSwYoEoGL0rpHZSAiPmCkBKbnsmHCbiUtg5+wELem4Q0HAEY6vjVK83u9cIlAhw==} + '@remix-run/node-fetch-server@0.9.0': + resolution: {integrity: sha512-SoLMv7dbH+njWzXnOY6fI08dFMI5+/dQ+vY3n8RnnbdG7MdJEgiP28Xj/xWlnRnED/aB6SFw56Zop+LbmaaKqA==} + '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} @@ -3608,160 +3627,270 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.50.2': resolution: {integrity: sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.50.2': resolution: {integrity: sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.50.2': resolution: {integrity: sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.50.2': resolution: {integrity: sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.50.2': resolution: {integrity: sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': resolution: {integrity: sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.50.2': resolution: {integrity: sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.50.2': resolution: {integrity: sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.50.2': resolution: {integrity: sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.50.2': resolution: {integrity: sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.50.2': resolution: {integrity: sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.50.2': resolution: {integrity: sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.50.2': resolution: {integrity: sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.50.2': resolution: {integrity: sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.50.2': resolution: {integrity: sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.50.2': resolution: {integrity: sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-openharmony-arm64@4.50.2': resolution: {integrity: sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.50.2': resolution: {integrity: sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.50.2': resolution: {integrity: sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.50.2': resolution: {integrity: sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==} cpu: [x64] os: [win32] - '@rspack/binding-darwin-arm64@1.5.5': - resolution: {integrity: sha512-Kg3ywEZHLX+aROfTQ5tMOv+Ud+8b4jk8ruUgsi0W8oBkEkR5xBdhFa9vcf6pzy+gfoLCnEI68U9i8ttm+G0csA==} + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + + '@rspack/binding-darwin-arm64@1.5.8': + resolution: {integrity: sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.5.5': - resolution: {integrity: sha512-uoGTYnlYW8m47yiDCKvXOehhAOH12wlePJq4sbUbBoHmG07vbDw7fUqnvy2k8319NTVEpMJWGoKyisgI09/uMQ==} + '@rspack/binding-darwin-x64@1.5.8': + resolution: {integrity: sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.5.5': - resolution: {integrity: sha512-KgVN3TeUJ3iNwwOX3JGY4arvoLHX94eItJ4TeOSyetRiSJUrQI0evP16i5kIh+n+p7mVnXmfUS944Gl+uNsJmg==} + '@rspack/binding-linux-arm64-gnu@1.5.8': + resolution: {integrity: sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.5.5': - resolution: {integrity: sha512-1gKthlCQinXtWar6Hl9Il6BQ/NgYBH0NVuUsjjf85ejD/cTPQENKyIpGvVa1rSIHSfnG/XujUbruHAeY9mEHCA==} + '@rspack/binding-linux-arm64-musl@1.5.8': + resolution: {integrity: sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.5.5': - resolution: {integrity: sha512-haPFg4M9GwpSI5g9BQhKUNdzCKDvFexIUkLiAHBjFU9iWQTEcI9VfYPixestOIwzUv7E34rHM+jAsmRGWdgmXw==} + '@rspack/binding-linux-x64-gnu@1.5.8': + resolution: {integrity: sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.5.5': - resolution: {integrity: sha512-oUny56JEkCZvIu4n8/P7IPLPNtJnL89EDhxHINH87XLBY3OOgo8JHELR11Zj9SFWiGNsRcLqi+Q78tWa0ligBQ==} + '@rspack/binding-linux-x64-musl@1.5.8': + resolution: {integrity: sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==} cpu: [x64] os: [linux] - '@rspack/binding-wasm32-wasi@1.5.5': - resolution: {integrity: sha512-tRgxBgIXaBKBH/0KlwvyqbIMqQrg8jKOyFOEQseEE7Oqs2M9KkJ7Vp5QN11u3NvZ9nz5GbZxmVGBMkdj9Gth1w==} + '@rspack/binding-wasm32-wasi@1.5.8': + resolution: {integrity: sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.5.5': - resolution: {integrity: sha512-wGWd2yluoFdQgtkIbny6FoHnzahTk+o9RzrptjeS1u/NV1lKrWzmWhwZojMGOUqPiaukZKaziOEo7gpRn2XbEQ==} + '@rspack/binding-win32-arm64-msvc@1.5.8': + resolution: {integrity: sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.5.5': - resolution: {integrity: sha512-Ikml8AQkzjPCG24vTO4pG2bpJ8vp93jVEgo9X9uYjO2vQbIp5QSOmeZOTM7tXCf8AfTfHEF/yAdE/pR/+tXXGQ==} + '@rspack/binding-win32-ia32-msvc@1.5.8': + resolution: {integrity: sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.5.5': - resolution: {integrity: sha512-m2059ms0i/GIQGWTlZ5GI6SWpuMFAPMsWlhXLk2LZRIydhi+N/YPkmc33lFRTlDA3QpKDCvowvCvIIA7g6WSlg==} + '@rspack/binding-win32-x64-msvc@1.5.8': + resolution: {integrity: sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==} cpu: [x64] os: [win32] - '@rspack/binding@1.5.5': - resolution: {integrity: sha512-JkB943uBU0lABnKG/jdO+gg3/eeO9CEQMR/1dL6jSU9GTxaNf3XIVc05RhRC7qoVsiXuhSMMFxWyV0hyHxp2bA==} + '@rspack/binding@1.5.8': + resolution: {integrity: sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==} - '@rspack/core@1.5.5': - resolution: {integrity: sha512-AOIuMktK6X/xHAjJ/0QJ2kbSkILXj641GCPE+EOfWO27ODA8fHPArKbyz5AVGVePV3aUfEo2VFcsNzP67VBEPA==} + '@rspack/core@1.5.8': + resolution: {integrity: sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -3776,96 +3905,96 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry-internal/browser-utils@10.12.0': - resolution: {integrity: sha512-dozbx389jhKynj0d657FsgbBVOar7pX3mb6GjqCxslXF0VKpZH2Xks0U32RgDY/nK27O+o095IWz7YvjVmPkDw==} + '@sentry-internal/browser-utils@10.19.0': + resolution: {integrity: sha512-E3H6R+tX7sYMIjfCRAMO0qIH43dtUqv2rSo0vv6eHDi4lDXtlDc+Vb67n4VIesT7YVxQD7GIkNhMk3hmRDIwww==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.12.0': - resolution: {integrity: sha512-0+7ceO6yQPPqfxRc9ue/xoPHKcnB917ezPaehGQNfAFNQB9PNTG1y55+8mRu0Fw+ANbZeCt/HyoCmXuRdxmkpg==} + '@sentry-internal/feedback@10.19.0': + resolution: {integrity: sha512-AJ8rpzNYgfmWzovmFss51q9FtBaa2qYTLwkbVdTf58fZbLMUrgZ6qf9qMk0ePiS3nB87w9+mpbLzRObYOsK9RA==} engines: {node: '>=18'} '@sentry-internal/node-cpu-profiler@2.2.0': resolution: {integrity: sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.12.0': - resolution: {integrity: sha512-W/z1/+69i3INNfPjD1KuinSNaRQaApjzwb37IFmiyF440F93hxmEYgXHk3poOlYYaigl2JMYbysGPWOiXnqUXA==} + '@sentry-internal/replay-canvas@10.19.0': + resolution: {integrity: sha512-DulLU4lvtrGPExKtpbCveLxPACrFmGx4eEYhzIn35UH8iIx6ONRSLemQyiUJQoLau7KXJy0I8AWxN+SagfebEA==} engines: {node: '>=18'} - '@sentry-internal/replay@10.12.0': - resolution: {integrity: sha512-/1093gSNGN5KlOBsuyAl33JkzGiG38kCnxswQLZWpPpR6LBbR1Ddb18HjhDpoQNNEZybJBgJC3a5NKl43C2TSQ==} + '@sentry-internal/replay@10.19.0': + resolution: {integrity: sha512-bOWsm/t+d2LCYa3gUjgwFds6kKSW+K6i4pssgDY4XiV/MxHsQtQ2rbHX80chLRQe2HFCX2njvjVSJN+Nsdjmpg==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@4.3.0': - resolution: {integrity: sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==} + '@sentry/babel-plugin-component-annotate@4.4.0': + resolution: {integrity: sha512-Pzjpn9MZg6yR61ThJgOoD28dLNCj457O0/t8d276K+Bzf8iOZKbrNO4sltp1vUB1yqhV+ulvIZO8xu8ABohtsg==} engines: {node: '>= 14'} - '@sentry/browser@10.12.0': - resolution: {integrity: sha512-lKyaB2NFmr7SxPjmMTLLhQ7xfxaY3kdkMhpzuRI5qwOngtKt4+FtvNYHRuz+PTtEFv4OaHhNNbRn6r91gWguQg==} + '@sentry/browser@10.19.0': + resolution: {integrity: sha512-/+B84qFOLg1vJhg4YSA4a7Pneq5Pbt1BXEdrp/UW4tJmtGPZb28qXlMdoPfmFWZgVezrawaPkxLmbu+47/+rsQ==} engines: {node: '>=18'} - '@sentry/bundler-plugin-core@4.3.0': - resolution: {integrity: sha512-dmR4DJhJ4jqVWGWppuTL2blNFqOZZnt4aLkewbD1myFG3KVfUx8CrMQWEmGjkgPOtj5TO6xH9PyTJjXC6o5tnA==} + '@sentry/bundler-plugin-core@4.4.0': + resolution: {integrity: sha512-WTGhgwxzyolzOg0sudULK0rRgLndtsEiBt4QwltKW/WYArMtFyf286aZx19uQ+rD+bSx3Il81SD23nqDOTtnzg==} engines: {node: '>= 14'} - '@sentry/cli-darwin@2.53.0': - resolution: {integrity: sha512-NNPfpILMwKgpHiyJubHHuauMKltkrgLQ5tvMdxNpxY60jBNdo5VJtpESp4XmXlnidzV4j1z61V4ozU6ttDgt5Q==} + '@sentry/cli-darwin@2.56.1': + resolution: {integrity: sha512-zfhT8MrvB5x/xRdIVGwg+sG0Cx3i0G6RH2zCrdQ/moWn8TfkwsM0O1k/AxpwbpcRfAHCkVb04CU/yKciKwg2KA==} engines: {node: '>=10'} os: [darwin] - '@sentry/cli-linux-arm64@2.53.0': - resolution: {integrity: sha512-xY/CZ1dVazsSCvTXzKpAgXaRqfljVfdrFaYZRUaRPf1ZJRGa3dcrivoOhSIeG/p5NdYtMvslMPY9Gm2MT0M83A==} + '@sentry/cli-linux-arm64@2.56.1': + resolution: {integrity: sha512-AypXIwZvOMJb9RgjI/98hTAd06FcOjqjIm6G9IR0OI4pJCOcaAXz9NKXdJqxpZd7phSMJnD+Bx/8iYOUPeY73A==} engines: {node: '>=10'} cpu: [arm64] os: [linux, freebsd, android] - '@sentry/cli-linux-arm@2.53.0': - resolution: {integrity: sha512-NdRzQ15Ht83qG0/Lyu11ciy/Hu/oXbbtJUgwzACc7bWvHQA8xEwTsehWexqn1529Kfc5EjuZ0Wmj3MHmp+jOWw==} + '@sentry/cli-linux-arm@2.56.1': + resolution: {integrity: sha512-fNB/Ng11HrkGOSEIDg+fc3zfTCV7q6kJddp6ndK3QlYFsCffRSnclaX1SMp+mqxdWkHqe1kkp85OY8G/x5uAWw==} engines: {node: '>=10'} cpu: [arm] os: [linux, freebsd, android] - '@sentry/cli-linux-i686@2.53.0': - resolution: {integrity: sha512-0REmBibGAB4jtqt9S6JEsFF4QybzcXHPcHtJjgMi5T0ueh952uG9wLzjSxQErCsxTKF+fL8oG0Oz5yKBuCwCCQ==} + '@sentry/cli-linux-i686@2.56.1': + resolution: {integrity: sha512-vnH+WJEsUq7Lf7xc9udzE/M4hoDXXsniFFYr/7BvdnXtCQlNNaWFMXHbEDYAql3baIlHkWoG8cEHWuB/YKyniw==} engines: {node: '>=10'} cpu: [x86, ia32] os: [linux, freebsd, android] - '@sentry/cli-linux-x64@2.53.0': - resolution: {integrity: sha512-9UGJL+Vy5N/YL1EWPZ/dyXLkShlNaDNrzxx4G7mTS9ywjg+BIuemo6rnN7w43K1NOjObTVO6zY0FwumJ1pCyLg==} + '@sentry/cli-linux-x64@2.56.1': + resolution: {integrity: sha512-3/BlKe5Vdnia36MeovghHJD8lbcum5TFIxLp+PSfH2sVb09+5Jo0L95oRTI2JkD8Fs+QNssvTqTxJj5eIo/n+A==} engines: {node: '>=10'} cpu: [x64] os: [linux, freebsd, android] - '@sentry/cli-win32-arm64@2.53.0': - resolution: {integrity: sha512-G1kjOjrjMBY20rQcJV2GA8KQE74ufmROCDb2GXYRfjvb1fKAsm4Oh8N5+Tqi7xEHdjQoLPkE4CNW0aH68JSUDQ==} + '@sentry/cli-win32-arm64@2.56.1': + resolution: {integrity: sha512-Gg8RV7CV7Tz4fiR1EN1Af5AVhJsnEXiZvfvfQXI4lp51MKAhcxZIMtEfg9HaWsn3Dm/wgwYBinyeywfWbTXYDg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@sentry/cli-win32-i686@2.53.0': - resolution: {integrity: sha512-qbGTZUzesuUaPtY9rPXdNfwLqOZKXrJRC1zUFn52hdo6B+Dmv0m/AHwRVFHZP53Tg1NCa8bDei2K/uzRN0dUZw==} + '@sentry/cli-win32-i686@2.56.1': + resolution: {integrity: sha512-6u6a060yC3i76Ze1apqgWr5luQSyhuD5ND84eWfh/UbddsEa42UHjoVHOiBwmpZqf/hvNZAtzLnE4NCvU4zOMg==} engines: {node: '>=10'} cpu: [x86, ia32] os: [win32] - '@sentry/cli-win32-x64@2.53.0': - resolution: {integrity: sha512-1TXYxYHtwgUq5KAJt3erRzzUtPqg7BlH9T7MdSPHjJatkrr/kwZqnVe2H6Arr/5NH891vOlIeSPHBdgJUAD69g==} + '@sentry/cli-win32-x64@2.56.1': + resolution: {integrity: sha512-11cdflajBrDWlRZqI9MOu7ok2vnPzFjKmbU3YvBYWQapNE+HHAsWdsRL/u/P1RmU62vj7Y42iSUcj6x1SNrdPw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@sentry/cli@2.53.0': - resolution: {integrity: sha512-n2ZNb+5Z6AZKQSI0SusQ7ZzFL637mfw3Xh4C3PEyVSn9LiF683fX0TTq8OeGmNZQS4maYfS95IFD+XpydU0dEA==} + '@sentry/cli@2.56.1': + resolution: {integrity: sha512-VDAIg+gmjNtJS5VUZQMDSK9RaKC9hYQi3PoXpNa+owNfQNk60bCi8z8jkbWRcKbNGn3V51WqvrQAqLoNAdPc9w==} engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.12.0': - resolution: {integrity: sha512-Jrf0Yo7DvmI/ZQcvBnA0xKNAFkJlVC/fMlvcin+5IrFNRcqOToZ2vtF+XqTgjRZymXQNE8s1QTD7IomPHk0TAw==} + '@sentry/core@10.19.0': + resolution: {integrity: sha512-OqZjYDYsK6ZmBG5UzML0uKiKq//G6mMwPcszfuCsFgPt+pg5giUCrCUbt5VIVkHdN1qEEBk321JO2haU5n2Eig==} engines: {node: '>=18'} - '@sentry/node-core@10.12.0': - resolution: {integrity: sha512-ki+pX4YyVVMhue1Qso0Kiz862ragDe1PgRc/AgtUJ0jc75s5PTvQw6N+9DAtSahL8t078+8rC7UzyGdLTPCl5w==} + '@sentry/node-core@10.19.0': + resolution: {integrity: sha512-m3xTaIDSh1V88K+e1zaGwKKuhDUAHMX1nncJmsGm8Hwg7FLK2fdr7wm9IJaIF0S1E4R38oHC4kZdL+ebrUghDg==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -3876,12 +4005,12 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.37.0 - '@sentry/node@10.12.0': - resolution: {integrity: sha512-rnrNKJkG8rbm1NZaYAhTfLqGmZmiOjv9Y6apa1G9+hsfAqdK4SGFa/s22WG//qVnvqW4aDXR883Dvc0236op+g==} + '@sentry/node@10.19.0': + resolution: {integrity: sha512-GUN/UVRsqnXd4O8GCxR8F682nyYemeO4mr0Yc5JPz0CxT2gYkemuifT29bFOont8V5o055WJv32NrQnZcm/nyg==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.12.0': - resolution: {integrity: sha512-bkUfLVpu0qTfCrQsz7uE/ch0kCJSV2KlFtguWPLMG2m0JOLDI+iivLm2nbp+Bg16FopZojKs5P8aevCSl+ilEw==} + '@sentry/opentelemetry@10.19.0': + resolution: {integrity: sha512-o1NWDWXM4flBIqqBECcaZ+y0TS44UxQh5BtTTPJzkU0FsWOytn9lp9ccVi7qBMb7Zrl3rw3Q0BRNETKVG5Ag/w==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -3890,40 +4019,40 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.37.0 - '@sentry/profiling-node@10.12.0': - resolution: {integrity: sha512-F6ZyDi2zCQEpUFpp2n2H+WRDgyFpiY1B4BsTJsUitZPGuVxq5gF0Kxc0685q2pWgY2S23eOY61OZvFOvL3Kjrg==} + '@sentry/profiling-node@10.19.0': + resolution: {integrity: sha512-PRFlxHLngxkJkzZkxD6deWtwzUtBo6EYPJkcPneDo/q29skQGtzVfPaWwNTldnOBBfgjtpA90hZLQoKuffxvqA==} engines: {node: '>=18'} hasBin: true - '@sentry/react-router@10.12.0': - resolution: {integrity: sha512-0rAr63ARYb807tPd4gc94fyuf1BjPk5TCaXLlAo+v9/mFNWIjtZhaSXkR++UCE6XV5aNhgCquiLonYaDbfaLlw==} + '@sentry/react-router@10.19.0': + resolution: {integrity: sha512-ckD9abODeB+nJPjauVY6ARMfooMrQondZ0CSCSCuJFmAqrc8r4PqIzgvoEtcvs5SXuvfWwMs22FeXEgIhbPgiA==} engines: {node: '>=20'} peerDependencies: '@react-router/node': 7.x react: '>=18' react-router: 7.x - '@sentry/react@10.12.0': - resolution: {integrity: sha512-TpqgdoYbkf5JynmmW2oQhHQ/h5w+XPYk0cEb/UrsGlvJvnBSR+5tgh0AqxCSi3gvtp82rAXI5w1TyRPBbhLDBw==} + '@sentry/react@10.19.0': + resolution: {integrity: sha512-LgADcXfJ4hVVtOSW6IkY3Wsefw4xPHIQpiEux28GHf2EAYkWxyCWWb9uQH4voAacG+FcX63XfJkpUMZjadE9qw==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vite-plugin@4.3.0': - resolution: {integrity: sha512-MeTAHMmTOgBPMAjeW7/ONyXwgScZdaFFtNiALKcAODnVqC7eoHdSRIWeH5mkLr2Dvs7nqtBaDpKxRjUBgfm9LQ==} + '@sentry/vite-plugin@4.4.0': + resolution: {integrity: sha512-sOq1xJj5URIa/c4fSJomjOjp7l0ljk4WWRjol6ERwJ5wntOKDrw5Y7T1ZbyiDGD8/ndzQnn4Od03Z+jSvpqwog==} engines: {node: '>= 14'} - '@shikijs/engine-oniguruma@3.12.2': - resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} - '@shikijs/langs@3.12.2': - resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} - '@shikijs/themes@3.12.2': - resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} - '@shikijs/types@3.12.2': - resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -3937,11 +4066,11 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@simplewebauthn/browser@13.2.0': - resolution: {integrity: sha512-N3fuA1AAnTo5gCStYoIoiasPccC+xPLx2YU88Dv0GeAmPQTWHETlZQq5xZ0DgUq1H9loXMWQH5qqUjcI7BHJ1A==} + '@simplewebauthn/browser@13.2.2': + resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} - '@simplewebauthn/server@13.2.1': - resolution: {integrity: sha512-Inmfye5opZXe3HI0GaksqBnQiM7glcNySoG6DH1GgkO1Lh9dvuV4XSV9DK02DReUVX39HpcDob9nxHELjECoQw==} + '@simplewebauthn/server@13.2.2': + resolution: {integrity: sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==} engines: {node: '>=20.0.0'} '@sinclair/typebox@0.27.8': @@ -4117,68 +4246,68 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/html-darwin-arm64@1.13.5': - resolution: {integrity: sha512-5r4kGFQJm85EKOxSiP9pUT/9T1uq+tx0s5HRqfM/J1hVZmpIq2GudBVYS8CGklVWAVQ0tBHhBuP9SysAb/pcSA==} + '@swc/html-darwin-arm64@1.13.20': + resolution: {integrity: sha512-i4JhqTd/bt+rG/+Uc78Ce3D9r0O8jBBMVUnbQ8QREoZsyT3cN8ecWh05sxswB63kBbcc8a8uR65iYvUciSBsMg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/html-darwin-x64@1.13.5': - resolution: {integrity: sha512-bCY0BSfxrmbKpInB/wZFX0DH4hgEQBwWLeKNwZhafIR5R/tvzuiIvb/VdkeKv8+26r2lkedbp+EreCFnDqQ2BQ==} + '@swc/html-darwin-x64@1.13.20': + resolution: {integrity: sha512-k4lTekp9rIqb4n/xvQNwLDhKZf83UsufKTUyF4HsEsdUep7CBy5BfozocyC+sDmNIJSF27xjHsj/7kRC6Ote+Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/html-linux-arm-gnueabihf@1.13.5': - resolution: {integrity: sha512-o6TVZERfx7Z8btauYE7nHgMEPPIVemqAZL3ViUTuBK6asF9wfJ4m2YAbsrlzi8xaLgaizWvdUV7W1qE5yfOxPg==} + '@swc/html-linux-arm-gnueabihf@1.13.20': + resolution: {integrity: sha512-uCbb0wzInSQ5fHfo2Q7Kl23HjZOokTgKgXIG32vwWcSNqhoDnbDTiy8bxF9CfrCVoNxP166OycEfJ2Aow0keHg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/html-linux-arm64-gnu@1.13.5': - resolution: {integrity: sha512-I/Ip5FtCfQ0wYg2MurytkEWPZrFB1SOPOeTNu4n+PAWDBjEcX3q+wgmMpzoGgVljvpEAQviJ+jzRyLW2tDDVHA==} + '@swc/html-linux-arm64-gnu@1.13.20': + resolution: {integrity: sha512-SGmmo6V5IXWOcDRcnQwJ44hEWtERGuJ7Fd9qgElErUZlx4kri9nS8MbudGViLyYm/ElClUs51sgxGqrg1F2TYA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/html-linux-arm64-musl@1.13.5': - resolution: {integrity: sha512-q8RTISYZuI5qOR8wEhox2oC+ZBo5IBaT6N43b5W+JRSIMKIsY7hVgC3gSI/tG4/6K14hv2QrqtAUFzVpLwtkyA==} + '@swc/html-linux-arm64-musl@1.13.20': + resolution: {integrity: sha512-HrqXdFuBeCe3nfSn4NSizPrtth4lsLJPF1LwwqYHgsE1bAuUkIOEgWmtcLlG1hZ7AhonLX+CIT0JNiSN0ALE7w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/html-linux-x64-gnu@1.13.5': - resolution: {integrity: sha512-YFU0/xVWzjAtg5V6QREW510O5/SNILrm18Vo2qF1bTktCB2eCjNSjCHOdicvPXTImEUlTp0ey6wO+QvEuvRFAg==} + '@swc/html-linux-x64-gnu@1.13.20': + resolution: {integrity: sha512-4F7MY4p7YQ/WjyPCwuAtWICyZSief1uoE6stMCIC4yVm5ybwbWKJqLPrd0lbC9W0jllk4TYHoUYI6WAc7jCJKA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/html-linux-x64-musl@1.13.5': - resolution: {integrity: sha512-/ilgZm7umDQTea97FlE0pIcoHTAlICE+aSoVvLi+ONL3wr4g1ebwlgQ5Cxpgp5cxnKeghDYpqP/mFLh+Ztl8DQ==} + '@swc/html-linux-x64-musl@1.13.20': + resolution: {integrity: sha512-aL6BNlq2vIC2nS+Y0OEHZcOit9BFig0bzb78fSfK8eCz8+/ZIQujgLRxnKw2smAPtMBwS00mqaQPeRJt0J60bQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/html-win32-arm64-msvc@1.13.5': - resolution: {integrity: sha512-aLZvyEhzM6e7E53jelEp9ob/CrZ4K0atmsq+ctsaki8PNOu8shM03CEK1yQNCdZLR1kKkUgytyUVMEbhqz+IQQ==} + '@swc/html-win32-arm64-msvc@1.13.20': + resolution: {integrity: sha512-x2APd7wcxaer8cjKL6V9J+Y8dCUbxyrLC2GyB7xopL4TLfzqcY6V6jRWKB8eT41pF4ZqF3GqFv73jPZk1HNyOw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/html-win32-ia32-msvc@1.13.5': - resolution: {integrity: sha512-51QXTdKMmgRriRmTzH0gkeyHLY4knJdAKEY1kPTBeguXCjgLIUX2nMQd24oe9ovJfPce0NCOmCSrODri8PiduQ==} + '@swc/html-win32-ia32-msvc@1.13.20': + resolution: {integrity: sha512-PZYEc8M32pGazbRv2NVxakHe8XqGUTUmLgORlZFG1mW6c2/wSUl6+J/C/4+Q8lQu2IjeUdCd8HHovpoKPXR/EA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/html-win32-x64-msvc@1.13.5': - resolution: {integrity: sha512-MnU1fMNZijEKkKTp12SKbNuH7rglgHhXSFZr+zjDhQmtVPEF4goCrBfoY8ZJ4j9FjOGyodFcYH6ulz95l9/QwQ==} + '@swc/html-win32-x64-msvc@1.13.20': + resolution: {integrity: sha512-hYYsqFgeR0/rao2dPkyHnAArqpu364IxhbJIUhjRr6uv2nQn1KiKS6vLtoZkR4GiVAHkOi8Vl7verEPoDBiaXQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/html@1.13.5': - resolution: {integrity: sha512-eVAyb3kk6wltz4FnWNRL06iYnqkQuTfpe5Fin9oLLmcpIYr2DgHcrGgeDJF4vJc9YZwACvEYmV8DC+1NfdzAJQ==} + '@swc/html@1.13.20': + resolution: {integrity: sha512-WzMTUUVd27Y1/Nhu333YA9bbfXujsn3geENnxa7pFmkA8L3ea+ZtMShJl51IC/X5fr2973ObzhNiFQb3iWF+ig==} engines: {node: '>=14'} '@swc/types@0.1.25': @@ -4192,65 +4321,65 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@tailwindcss/node@4.1.13': - resolution: {integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==} + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} - '@tailwindcss/oxide-android-arm64@4.1.13': - resolution: {integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==} + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.13': - resolution: {integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.13': - resolution: {integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==} + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.13': - resolution: {integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==} + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': - resolution: {integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': - resolution: {integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.13': - resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.13': - resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.13': - resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==} + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.13': - resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==} + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -4261,27 +4390,27 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': - resolution: {integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.13': - resolution: {integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.13': - resolution: {integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==} + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.1.13': - resolution: {integrity: sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==} + '@tailwindcss/postcss@4.1.14': + resolution: {integrity: sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==} - '@tailwindcss/vite@4.1.13': - resolution: {integrity: sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==} + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 @@ -4721,11 +4850,11 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - '@types/express-serve-static-core@5.0.7': - resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} '@types/express@4.17.23': resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} @@ -4817,8 +4946,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@24.5.2': - resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4844,10 +4973,10 @@ packages: '@types/rbush@4.0.0': resolution: {integrity: sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ==} - '@types/react-dom@19.1.9': - resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} + '@types/react-dom@19.2.2': + resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: - '@types/react': ^19.0.0 + '@types/react': ^19.2.0 '@types/react-map-gl@6.1.7': resolution: {integrity: sha512-szkfkWd3FbySDkxyn0MDj9yzD8XYk+RIi4od6sGb3lVHNBGcW20G2v2vcq2N5k18UYAdqAoKGSYuHkGV4JOCrA==} @@ -4861,8 +4990,8 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@19.1.13': - resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4879,11 +5008,14 @@ packages: '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + '@types/send@1.2.0': + resolution: {integrity: sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==} + '@types/serve-index@1.9.4': resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/serve-static@1.15.9': + resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} @@ -4921,8 +5053,8 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vis.gl/react-mapbox@8.0.4': - resolution: {integrity: sha512-NFk0vsWcNzSs0YCsVdt2100Zli9QWR+pje8DacpLkkGEAXFaJsFtI1oKD0Hatiate4/iAIW39SQHhgfhbeEPfQ==} + '@vis.gl/react-mapbox@8.1.0': + resolution: {integrity: sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==} peerDependencies: mapbox-gl: '>=3.5.0' react: '>=16.3.0' @@ -4931,8 +5063,8 @@ packages: mapbox-gl: optional: true - '@vis.gl/react-maplibre@8.0.4': - resolution: {integrity: sha512-HwZyfLjEu+y1mUFvwDAkVxinGm8fEegaWN+O8np/WZ2Sqe5Lv6OXFpV6GWz9LOEvBYMbGuGk1FQdejo+4HCJ5w==} + '@vis.gl/react-maplibre@8.1.0': + resolution: {integrity: sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ==} peerDependencies: maplibre-gl: '>=4.0.0' react: '>=16.3.0' @@ -5107,8 +5239,8 @@ packages: peerDependencies: algoliasearch: '>= 3.1 < 6' - algoliasearch@5.37.0: - resolution: {integrity: sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA==} + algoliasearch@5.40.0: + resolution: {integrity: sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==} engines: {node: '>= 14.0.0'} ansi-align@3.0.1: @@ -5195,8 +5327,8 @@ packages: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} - ast-v8-to-istanbul@0.3.5: - resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + ast-v8-to-istanbul@0.3.6: + resolution: {integrity: sha512-9tx1z/7OF/a8EdYL3FKoBhxLf3h3D8fXvuSj0HknsVeli2HE40qbNZxyFhMtnydaRiamwFu9zhb+BsJ5tVPehQ==} astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} @@ -5260,8 +5392,8 @@ packages: base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} - baseline-browser-mapping@2.8.5: - resolution: {integrity: sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q==} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} hasBin: true basic-auth@2.0.1: @@ -5345,8 +5477,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.26.2: - resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5428,8 +5560,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5649,8 +5781,8 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - copy-text-to-clipboard@3.2.1: - resolution: {integrity: sha512-3am6cw+WOicd0+HyzhC4kYS02wHJUiVQXmAADxfUARKsHBkWl1Vl3QQEiILlSs8YcPS/C0+y/urCNEYQk+byWA==} + copy-text-to-clipboard@3.2.2: + resolution: {integrity: sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==} engines: {node: '>=12'} copy-webpack-plugin@11.0.0: @@ -5659,14 +5791,14 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.45.1: - resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} - core-js-pure@3.45.1: - resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} - core-js@3.45.1: - resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5694,8 +5826,8 @@ packages: peerDependencies: postcss: ^8.4 - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + css-declaration-sorter@7.3.0: + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 @@ -5770,8 +5902,8 @@ packages: csscolorparser@1.0.3: resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} - cssdb@8.4.0: - resolution: {integrity: sha512-lyATYGyvXwQ8h55WeQeEHXhI+47rl52pXSYkFK/ZrCbAJSgVIaPFjYc3RM8TpRHKk7W3wsAZImmLps+P5VyN9g==} + cssdb@8.4.2: + resolution: {integrity: sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==} cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -5988,8 +6120,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node-es@1.1.0: @@ -6059,12 +6191,12 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.2: - resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} - drizzle-kit@0.31.4: - resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} + drizzle-kit@0.31.5: + resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==} hasBin: true drizzle-orm@0.44.4: @@ -6159,6 +6291,98 @@ packages: sqlite3: optional: true + drizzle-orm@0.44.6: + resolution: {integrity: sha512-uy6uarrrEOc9K1u5/uhBFJbdF5VJ5xQ/Yzbecw3eAYOunv5FDeYkR2m8iitocdHBOHbvorviKOW5GVw0U1j4LQ==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@upstash/redis': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6175,15 +6399,15 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.15: - resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} + eciesjs@0.4.16: + resolution: {integrity: sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.221: - resolution: {integrity: sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==} + electron-to-chromium@1.5.235: + resolution: {integrity: sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6418,8 +6642,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.2.2: - resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + fast-equals@5.3.2: + resolution: {integrity: sha512-6rxyATwPCkaFIL3JLqw8qXqMpIZ942pTX/tbQFkRsDGblS8tNGtlUauA/+mt6RUfqn/4MoEr+WDkYoIQbibWuQ==} engines: {node: '>=6.0.0'} fast-glob@3.3.3: @@ -6506,8 +6730,8 @@ packages: flatbuffers@24.12.23: resolution: {integrity: sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==} - flatgeobuf@4.2.0: - resolution: {integrity: sha512-Uauls7eBIxttVEZYMMuUF23SBjXgC3t/QZWCDEEbF2tXu8R/ozChcnOe15tWo9S+NA3r/McNSDGcgasF/IRMQQ==} + flatgeobuf@4.3.1: + resolution: {integrity: sha512-KWOMr70S4n8ZyNOHhOf9lDp+GI2dOgPtSXnsKpQT0QZGF60THyvH1n1hivSjo/JGFMJemxycqC82AWnEh5fIDQ==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -6552,8 +6776,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.23.14: - resolution: {integrity: sha512-8BQ6dvqOht2w8P1CwIEvAA0gypDR3fNG/M6/f5lT0QgNIKnJf7J43Bpv++NnCWU8YfmL47UEm2hbI0GRvdVhsQ==} + framer-motion@12.23.24: + resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6610,6 +6834,10 @@ packages: fuzzysort@3.1.0: resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -6661,8 +6889,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} @@ -6968,8 +7196,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.14.2: - resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -7103,8 +7331,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -7247,8 +7475,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.30: - resolution: {integrity: sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==} + isbot@5.1.31: + resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} engines: {node: '>=18'} isexe@2.0.0: @@ -7301,8 +7529,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true joi@17.13.3: @@ -7330,6 +7558,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -7378,8 +7611,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - kysely@0.28.7: - resolution: {integrity: sha512-u/cAuTL4DRIiO2/g4vNGRgklEKNIj5Q3CG7RoUB5DV5SfEC2hMvPxKi0GWPmnzwL2ryIeud2VTcEEmqzTzEPNw==} + kysely@0.28.8: + resolution: {integrity: sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==} engines: {node: '>=20.0.0'} latest-version@7.0.0: @@ -7399,70 +7632,140 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.30.1: resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.30.1: resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.30.1: resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.30.1: resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.30.1: resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.30.1: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -7473,8 +7776,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -7535,8 +7838,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -7920,15 +8223,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} @@ -7936,8 +8234,8 @@ packages: resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} engines: {node: '>= 0.8.0'} - motion-dom@12.23.12: - resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + motion-dom@12.23.23: + resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} @@ -7968,8 +8266,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true @@ -7997,8 +8295,8 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.77.0: - resolution: {integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==} + node-abi@3.78.0: + resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} engines: {node: '>=10'} node-emoji@2.2.0: @@ -8018,8 +8316,8 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -8380,8 +8678,8 @@ packages: peerDependencies: postcss: ^8.4.6 - postcss-color-functional-notation@7.0.11: - resolution: {integrity: sha512-zfqoUSaHMko/k2PA9xnaydVTHqYv5vphq5Q2AHcG/dCdv/OkHYWcVWfVTBKZ526uzT8L7NghuvSw3C9PxlKnLg==} + postcss-color-functional-notation@7.0.12: + resolution: {integrity: sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -8464,8 +8762,8 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-double-position-gradients@6.0.3: - resolution: {integrity: sha512-Dl0Z9sdbMwrPslgOaGBZRGo3TASmmgTcqcUODr82MTYyJk6devXZM6MlQjpQKMJqlLJ6oL1w78U7IXFdPA5+ug==} + postcss-double-position-gradients@6.0.4: + resolution: {integrity: sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -8499,8 +8797,8 @@ packages: peerDependencies: postcss: ^8.4 - postcss-lab-function@7.0.11: - resolution: {integrity: sha512-BEA4jId8uQe1gyjZZ6Bunb6ZsH2izks+v25AxQJDBtigXCjTLmCPWECwQpLTtcxH589MVxhs/9TAmRC6lUEmXQ==} + postcss-lab-function@7.0.12: + resolution: {integrity: sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -8673,8 +8971,8 @@ packages: peerDependencies: postcss: ^8.4 - postcss-preset-env@10.3.1: - resolution: {integrity: sha512-8ZOOWVwQ0iMpfEYkYo+U6W7fE2dJ/tP6dtEFwPJ66eB5JjnFupfYh+y6zo+vWDO72nGhKOVdxwhTjfzcSNRg4Q==} + postcss-preset-env@10.4.0: + resolution: {integrity: sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -8773,8 +9071,8 @@ packages: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} - posthog-js@1.266.0: - resolution: {integrity: sha512-437KsO9N+pMW6FtilgKYTHel0RCWs2S7PvsNRJf20/f3npChX9i6F8cNCJ6O4Az37scC1kPdTknFY/xEGazVJw==} + posthog-js@1.275.2: + resolution: {integrity: sha512-g1fnV/GAcEdwwk4EVbJ1HMZhlhgKYxG1Z5KPGvr+q5re0ltyVq8jFA2PsF333jvOlI8R01LLdpYSIgU8sBiZfg==} peerDependencies: '@rrweb/types': 2.0.0-alpha.17 rrweb-snapshot: 2.0.0-alpha.17 @@ -8784,8 +9082,8 @@ packages: rrweb-snapshot: optional: true - posthog-node@5.8.4: - resolution: {integrity: sha512-O0lObQqeIiggNCjc5BQx5PaHqPzXxwKnCJdb+DuNkbDO6Vc442SQ5FDv0WjPd5Ejfwme1uGZmM5/xhHWKegFfQ==} + posthog-node@5.10.0: + resolution: {integrity: sha512-uNN+YUuOdbDSbDMGk/Wq57o2YBEH0Unu1kEq2PuYmqFmnu+oYsKyJBrb58VNwEuYsaXVJmk4FtbD+Tl8BT69+w==} engines: {node: '>=20'} postmark@4.0.5: @@ -8975,16 +9273,16 @@ packages: peerDependencies: react: '>=16.8.0' - react-dom@19.1.1: - resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^19.1.1 + react: ^19.2.0 react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - react-hook-form@7.62.0: - resolution: {integrity: sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==} + react-hook-form@7.65.0: + resolution: {integrity: sha512-xtOzDz063WcXvGWaHgLNrNzlsdFgtUWcb32E6WFaGTd7kPZG3EeDusjdZfUsPwKCKVXy1ZlntifaHZ4l8pAsmw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -9008,8 +9306,8 @@ packages: react-loadable: '*' webpack: '>=4.41.1 || 5.x' - react-map-gl@8.0.4: - resolution: {integrity: sha512-SHdpvFIvswsZBg6BCPcwY/nbKuCo3sJM1Cj7Sd+gA3gFRFOixD+KtZ2XSuUWq2WySL2emYEXEgrLZoXsV4Ut4Q==} + react-map-gl@8.1.0: + resolution: {integrity: sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg==} peerDependencies: mapbox-gl: '>=1.13.0' maplibre-gl: '>=1.13.0' @@ -9065,8 +9363,8 @@ packages: peerDependencies: react: '>=15' - react-router-dom@7.9.1: - resolution: {integrity: sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==} + react-router-dom@7.9.4: + resolution: {integrity: sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -9077,8 +9375,8 @@ packages: peerDependencies: react: '>=15' - react-router@7.9.1: - resolution: {integrity: sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==} + react-router@7.9.4: + resolution: {integrity: sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -9109,8 +9407,8 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} read-pkg-up@7.0.1: @@ -9186,8 +9484,8 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@6.3.1: - resolution: {integrity: sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} registry-auth-token@5.1.0: @@ -9201,8 +9499,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true rehype-raw@7.0.0: @@ -9248,10 +9546,10 @@ packages: react-hook-form: ^7.55.0 react-router: '>=7.5.0' - remix-toast@3.2.0: - resolution: {integrity: sha512-xn4XUt0IXCKulN6DQ7ctPfzYY+xpeCFacZcYLtXeikFh/yM/LtlATTb2ap68tGgmQlo0HgPe1k8XYIqHtG1hRA==} + remix-toast@3.3.0: + resolution: {integrity: sha512-fC41y9Cl9kpngkYlcUaE/qs6zxv4PLsEjrtPPyEcIh6Iw1R+vVP9F3W7vxqS4nj7xccm1WyvT/KvpoVzvWUgPQ==} peerDependencies: - react-router: '>=7.8.0' + react-router: '>=7.9.0' remix-utils@8.8.0: resolution: {integrity: sha512-5CR4a3YwPaCoPUHg+O69UMek05tnFMrtQsoXTU4KzsyU7heDO94IFTjKVzEFhi+s+SSo+ebRMxWvjf/QiPpqiQ==} @@ -9378,6 +9676,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rou3@0.5.1: resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} @@ -9419,8 +9722,8 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -9429,8 +9732,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} search-insights@2.17.3: @@ -9462,11 +9765,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -9541,8 +9839,8 @@ packages: shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - shpjs@6.1.0: - resolution: {integrity: sha512-uaUpod7uIWetJK80yiiedZ3x4z9ZAPgDVT89N27+8F97Z8ZOqmu88P96I6CBC8N+YyERqdneZNT/wNFUEnzNpw==} + shpjs@6.2.0: + resolution: {integrity: sha512-8cR/RKYHQepmVyBMtzZQ+1bnSbWrtLXS6aoEJmpUlOSHtSUddterebVxYmIWq2g9kOEX9jm2kjHiikyPX7cNQA==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -9699,6 +9997,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -9778,11 +10079,11 @@ packages: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} - style-to-js@1.1.17: - resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + style-to-js@1.1.18: + resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} - style-to-object@1.0.9: - resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + style-to-object@1.0.11: + resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} stylehacks@6.1.1: resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} @@ -9836,15 +10137,15 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@4.1.13: - resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==} + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} engines: {node: '>=18'} term-size@2.2.1: @@ -10074,8 +10375,8 @@ packages: peerDependencies: typedoc-plugin-markdown: '>=4.8.0' - typedoc-plugin-markdown@4.8.1: - resolution: {integrity: sha512-ug7fc4j0SiJxSwBGLncpSo8tLvrT9VONvPUQqQDTKPxCoFQBADLli832RGPtj6sfSVJebNSrHZQRUdEryYH/7g==} + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} engines: {node: '>= 18'} peerDependencies: typedoc: 0.28.x @@ -10097,6 +10398,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + typewise-core@1.2.0: resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} @@ -10117,8 +10423,8 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@7.12.0: - resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -10231,8 +10537,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -10254,8 +10560,8 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - valibot@0.41.0: - resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} + valibot@1.1.0: + resolution: {integrity: sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -10305,8 +10611,8 @@ packages: vite: optional: true - vite@7.1.6: - resolution: {integrity: sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -10439,8 +10745,8 @@ packages: webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - webpack@5.101.3: - resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10601,8 +10907,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.1.9: - resolution: {integrity: sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==} + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} zstddec@0.1.0: resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} @@ -10630,119 +10936,119 @@ packages: snapshots: - '@algolia/abtesting@1.3.0': + '@algolia/abtesting@1.6.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)': + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0) - '@algolia/client-search': 5.37.0 - algoliasearch: 5.37.0 + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)': + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: - '@algolia/client-search': 5.37.0 - algoliasearch: 5.37.0 + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 - '@algolia/client-abtesting@5.37.0': + '@algolia/client-abtesting@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-analytics@5.37.0': + '@algolia/client-analytics@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-common@5.37.0': {} + '@algolia/client-common@5.40.0': {} - '@algolia/client-insights@5.37.0': + '@algolia/client-insights@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-personalization@5.37.0': + '@algolia/client-personalization@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-query-suggestions@5.37.0': + '@algolia/client-query-suggestions@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-search@5.37.0': + '@algolia/client-search@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 '@algolia/events@4.0.1': {} - '@algolia/ingestion@1.37.0': + '@algolia/ingestion@1.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/monitoring@1.37.0': + '@algolia/monitoring@1.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/recommend@5.37.0': + '@algolia/recommend@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/requester-browser-xhr@5.37.0': + '@algolia/requester-browser-xhr@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-fetch@5.37.0': + '@algolia/requester-fetch@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-node-http@5.37.0': + '@algolia/requester-node-http@5.40.0': dependencies: - '@algolia/client-common': 5.37.0 + '@algolia/client-common': 5.40.0 '@alloc/quick-lru@5.2.0': {} @@ -10751,6 +11057,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@apm-js-collab/code-transformer@0.8.2': {} + + '@apm-js-collab/tracing-hooks@0.3.1': + dependencies: + '@apm-js-collab/code-transformer': 0.8.2 + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -10795,7 +11111,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.2 + browserslist: 4.26.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -10816,7 +11132,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.3.1 + regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)': @@ -11440,7 +11756,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) - core-js-compat: 3.45.1 + core-js-compat: 3.46.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -11477,7 +11793,7 @@ snapshots: '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.45.1 + core-js-pure: 3.46.0 '@babel/runtime@7.28.4': {} @@ -11509,7 +11825,7 @@ snapshots: '@better-auth/core@1.3.27': dependencies: better-call: 1.0.19 - zod: 4.1.9 + zod: 4.1.12 '@better-auth/utils@0.3.0': {} @@ -11581,7 +11897,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@24.5.2)': + '@changesets/cli@2.29.7(@types/node@24.7.2)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -11597,7 +11913,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@24.5.2) + '@inquirer/external-editor': 1.0.2(@types/node@24.7.2) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -11729,12 +12045,12 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-alpha-function@1.0.0(postcss@8.5.6)': + '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 @@ -11744,47 +12060,56 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - '@csstools/postcss-color-function-display-p3-linear@1.0.0(postcss@8.5.6)': + '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-color-function@4.0.11(postcss@8.5.6)': + '@csstools/postcss-color-function@4.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-color-mix-function@3.0.11(postcss@8.5.6)': + '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.1(postcss@8.5.6)': + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-content-alt-text@2.0.7(postcss@8.5.6)': + '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.6)': dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 @@ -11808,27 +12133,27 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 postcss: 8.5.6 - '@csstools/postcss-gradients-interpolation-method@5.0.11(postcss@8.5.6)': + '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-hwb-function@4.0.11(postcss@8.5.6)': + '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-ic-unit@4.0.3(postcss@8.5.6)': + '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -11843,11 +12168,11 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - '@csstools/postcss-light-dark-function@2.0.10(postcss@8.5.6)': + '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.6)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 @@ -11900,16 +12225,16 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@4.0.11(postcss@8.5.6)': + '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - '@csstools/postcss-progressive-custom-properties@4.2.0(postcss@8.5.6)': + '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.6)': dependencies: postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -11921,12 +12246,12 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 postcss: 8.5.6 - '@csstools/postcss-relative-color-syntax@3.0.11(postcss@8.5.6)': + '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.6)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 @@ -11984,21 +12309,21 @@ snapshots: '@docsearch/css@3.9.0': {} - '@docsearch/react@3.9.0(@algolia/client-search@5.37.0)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)': + '@docsearch/react@3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.37.0)(algoliasearch@5.37.0) + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) '@docsearch/css': 3.9.0 - algoliasearch: 5.37.0 + algoliasearch: 5.40.0 optionalDependencies: - '@types/react': 19.1.13 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@types/react': 19.2.2 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/babel@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/babel@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -12011,7 +12336,7 @@ snapshots: '@babel/runtime-corejs3': 7.28.4 '@babel/traverse': 7.28.4 '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) babel-plugin-dynamic-import-node: 2.3.3 fs-extra: 11.3.2 tslib: 2.8.1 @@ -12024,34 +12349,34 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/bundler@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: '@babel/core': 7.28.4 - '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/cssnano-preset': 3.8.1 '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.101.3(@swc/core@1.13.5)) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.102.1(@swc/core@1.13.5)) clean-css: 5.3.3 - copy-webpack-plugin: 11.0.0(webpack@5.101.3(@swc/core@1.13.5)) - css-loader: 6.11.0(@rspack/core@1.5.5)(webpack@5.101.3(@swc/core@1.13.5)) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.101.3(@swc/core@1.13.5)) + copy-webpack-plugin: 11.0.0(webpack@5.102.1(@swc/core@1.13.5)) + css-loader: 6.11.0(@rspack/core@1.5.8)(webpack@5.102.1(@swc/core@1.13.5)) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.102.1(@swc/core@1.13.5)) cssnano: 6.1.2(postcss@8.5.6) - file-loader: 6.2.0(webpack@5.101.3(@swc/core@1.13.5)) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.13.5)) html-minifier-terser: 7.2.0 - mini-css-extract-plugin: 2.9.4(webpack@5.101.3(@swc/core@1.13.5)) - null-loader: 4.0.1(webpack@5.101.3(@swc/core@1.13.5)) + mini-css-extract-plugin: 2.9.4(webpack@5.102.1(@swc/core@1.13.5)) + null-loader: 4.0.1(webpack@5.102.1(@swc/core@1.13.5)) postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.3(@swc/core@1.13.5)) - postcss-preset-env: 10.3.1(postcss@8.5.6) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.101.3(@swc/core@1.13.5)) + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.102.1(@swc/core@1.13.5)) + postcss-preset-env: 10.4.0(postcss@8.5.6) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)) tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.3(@swc/core@1.13.5)))(webpack@5.101.3(@swc/core@1.13.5)) - webpack: 5.101.3(@swc/core@1.13.5) - webpackbar: 6.0.1(webpack@5.101.3(@swc/core@1.13.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.13.5)))(webpack@5.102.1(@swc/core@1.13.5)) + webpack: 5.102.1(@swc/core@1.13.5) + webpackbar: 6.0.1(webpack@5.102.1(@swc/core@1.13.5)) optionalDependencies: - '@docusaurus/faster': 3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + '@docusaurus/faster': 3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -12067,23 +12392,23 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/core@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/bundler': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/bundler': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mdx-js/react': 3.1.1(@types/react@19.1.13)(react@19.1.1) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) boxen: 6.2.1 chalk: 4.1.2 chokidar: 3.6.0 cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - core-js: 3.45.1 + core-js: 3.46.0 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 @@ -12091,28 +12416,28 @@ snapshots: execa: 5.1.1 fs-extra: 11.3.2 html-tags: 3.3.1 - html-webpack-plugin: 5.6.4(@rspack/core@1.5.5)(webpack@5.101.3(@swc/core@1.13.5)) + html-webpack-plugin: 5.6.4(@rspack/core@1.5.8)(webpack@5.102.1(@swc/core@1.13.5)) leven: 3.1.0 lodash: 4.17.21 open: 8.4.2 p-map: 4.0.0 prompts: 2.4.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)' - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.1))(webpack@5.101.3(@swc/core@1.13.5)) - react-router: 5.3.4(react@19.1.1) - react-router-config: 5.1.1(react-router@5.3.4(react@19.1.1))(react@19.1.1) - react-router-dom: 5.3.4(react@19.1.1) - semver: 7.7.2 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.102.1(@swc/core@1.13.5)) + react-router: 5.3.4(react@19.2.0) + react-router-config: 5.1.1(react-router@5.3.4(react@19.2.0))(react@19.2.0) + react-router-dom: 5.3.4(react@19.2.0) + semver: 7.7.3 serve-handler: 6.1.6 tinypool: 1.1.1 tslib: 2.8.1 update-notifier: 6.0.2 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.101.3(@swc/core@1.13.5)) + webpack-dev-server: 4.15.2(webpack@5.102.1(@swc/core@1.13.5)) webpack-merge: 6.0.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12138,17 +12463,17 @@ snapshots: postcss-sort-media-queries: 5.2.0(postcss@8.5.6) tslib: 2.8.1 - '@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': + '@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@rspack/core': 1.5.5 + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@rspack/core': 1.5.8 '@swc/core': 1.13.5 - '@swc/html': 1.13.5 - browserslist: 4.26.2 - lightningcss: 1.30.1 - swc-loader: 0.2.6(@swc/core@1.13.5)(webpack@5.101.3(@swc/core@1.13.5)) + '@swc/html': 1.13.20 + browserslist: 4.26.3 + lightningcss: 1.30.2 + swc-loader: 0.2.6(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)) tslib: 2.8.1 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@swc/helpers' - esbuild @@ -12160,22 +12485,22 @@ snapshots: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/mdx-loader@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.4.0 - file-loader: 6.2.0(webpack@5.101.3(@swc/core@1.13.5)) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.13.5)) fs-extra: 11.3.2 image-size: 2.0.2 mdast-util-mdx: 3.0.0 mdast-util-to-string: 4.0.0 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) rehype-raw: 7.0.0 remark-directive: 3.0.1 remark-emoji: 4.0.1 @@ -12185,9 +12510,9 @@ snapshots: tslib: 2.8.1 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.3(@swc/core@1.13.5)))(webpack@5.101.3(@swc/core@1.13.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.13.5)))(webpack@5.102.1(@swc/core@1.13.5)) vfile: 6.0.3 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@swc/core' - esbuild @@ -12195,17 +12520,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/module-type-aliases@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 '@types/react-router-dom': 5.3.3 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)' - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.1)' + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' transitivePeerDependencies: - '@swc/core' - esbuild @@ -12213,29 +12538,29 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.3.2 lodash: 4.17.21 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) schema-dts: 1.1.5 srcset: 4.0.0 tslib: 2.8.1 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -12254,28 +12579,28 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.2 js-yaml: 4.1.0 lodash: 4.17.21 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) schema-dts: 1.1.5 tslib: 2.8.1 utility-types: 3.11.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -12294,18 +12619,18 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-content-pages@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -12324,12 +12649,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-css-cascade-layers@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12351,15 +12676,15 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-debug@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-json-view-lite: 2.5.0(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-json-view-lite: 2.5.0(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12379,13 +12704,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-analytics@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12405,14 +12730,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-gtag@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/gtag.js': 0.0.12 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12432,13 +12757,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-google-tag-manager@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12458,17 +12783,17 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-sitemap@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) sitemap: 7.1.2 tslib: 2.8.1 transitivePeerDependencies: @@ -12489,18 +12814,18 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/plugin-svgr@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/webpack': 8.1.0(typescript@5.9.2) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -12519,25 +12844,25 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.37.0)(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.2)': - dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-css-cascade-layers': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-debug': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-google-analytics': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-google-gtag': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-google-tag-manager': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-sitemap': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-svgr': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/theme-classic': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.37.0)(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2)': + dependencies: + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-css-cascade-layers': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-debug': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-google-analytics': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-google-gtag': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-google-tag-manager': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-sitemap': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-svgr': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/theme-classic': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/faster' @@ -12559,38 +12884,38 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/react-loadable@6.0.0(react@19.1.1)': + '@docusaurus/react-loadable@6.0.0(react@19.2.0)': dependencies: - '@types/react': 19.1.13 - react: 19.1.1 + '@types/react': 19.2.2 + react: 19.2.0 - '@docusaurus/theme-classic@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@docusaurus/theme-classic@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mdx-js/react': 3.1.1(@types/react@19.1.13)(react@19.1.1) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) clsx: 2.1.1 - copy-text-to-clipboard: 3.2.1 + copy-text-to-clipboard: 3.2.2 infima: 0.2.0-alpha.45 lodash: 4.17.21 nprogress: 0.2.0 postcss: 8.5.6 - prism-react-renderer: 2.4.1(react@19.1.1) + prism-react-renderer: 2.4.1(react@19.2.0) prismjs: 1.30.0 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-router-dom: 5.3.4(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-router-dom: 5.3.4(react@19.2.0) rtlcss: 4.3.0 tslib: 2.8.1 utility-types: 3.11.0 @@ -12612,21 +12937,21 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 clsx: 2.1.1 parse-numeric-range: 1.3.0 - prism-react-renderer: 2.4.1(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + prism-react-renderer: 2.4.1(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 utility-types: 3.11.0 transitivePeerDependencies: @@ -12636,24 +12961,24 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.37.0)(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3)(typescript@5.9.2)': + '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2)': dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.37.0)(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(search-insights@2.17.3) - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@docsearch/react': 3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3) + '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@docusaurus/logger': 3.8.1 - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.8.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))(@rspack/core@1.5.5)(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - algoliasearch: 5.37.0 - algoliasearch-helper: 3.26.0(algoliasearch@5.37.0) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + algoliasearch: 5.40.0 + algoliasearch-helper: 3.26.0(algoliasearch@5.40.0) clsx: 2.1.1 eta: 2.2.0 fs-extra: 11.3.2 lodash: 4.17.21 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 utility-types: 3.11.0 transitivePeerDependencies: @@ -12684,18 +13009,18 @@ snapshots: '@docusaurus/tsconfig@3.8.1': {} - '@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 commander: 5.1.0 joi: 17.13.3 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)' + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' utility-types: 3.11.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -12704,9 +13029,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/utils-common@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' @@ -12717,11 +13042,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/utils-validation@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 joi: 17.13.3 js-yaml: 4.1.0 @@ -12736,14 +13061,14 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@docusaurus/utils@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) escape-string-regexp: 4.0.0 execa: 5.1.1 - file-loader: 6.2.0(webpack@5.101.3(@swc/core@1.13.5)) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.13.5)) fs-extra: 11.3.2 github-slugger: 1.5.0 globby: 11.1.0 @@ -12756,9 +13081,9 @@ snapshots: prompts: 2.4.2 resolve-pathname: 3.0.0 tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.3(@swc/core@1.13.5)))(webpack@5.101.3(@swc/core@1.13.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.13.5)))(webpack@5.102.1(@swc/core@1.13.5)) utility-types: 3.11.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - '@swc/core' - esbuild @@ -12771,8 +13096,20 @@ snapshots: '@dotenvx/dotenvx@1.48.4': dependencies: commander: 11.1.0 - dotenv: 17.2.2 - eciesjs: 0.4.15 + dotenv: 17.2.3 + eciesjs: 0.4.16 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.3) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.3 + which: 4.0.0 + + '@dotenvx/dotenvx@1.51.0': + dependencies: + commander: 11.1.0 + dotenv: 17.2.3 + eciesjs: 0.4.16 execa: 5.1.1 fdir: 6.5.0(picomatch@4.0.3) ignore: 5.3.2 @@ -12786,7 +13123,7 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@electric-sql/pglite@0.3.8': {} + '@electric-sql/pglite@0.3.11': {} '@emnapi/core@1.5.0': dependencies: @@ -12812,7 +13149,7 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.10.1 + get-tsconfig: 4.12.0 '@esbuild/aix-ppc64@0.25.10': optional: true @@ -12967,20 +13304,20 @@ snapshots: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/dom': 1.7.4 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) '@floating-ui/utils@0.2.10': {} - '@gerrit0/mini-shiki@3.12.2': + '@gerrit0/mini-shiki@3.13.1': dependencies: - '@shikijs/engine-oniguruma': 3.12.2 - '@shikijs/langs': 3.12.2 - '@shikijs/themes': 3.12.2 - '@shikijs/types': 3.12.2 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 '@hapi/hoek@9.3.0': {} @@ -12991,17 +13328,17 @@ snapshots: '@hexagon/base64@1.1.28': {} - '@hookform/resolvers@5.2.2(react-hook-form@7.62.0(react@19.1.1))': + '@hookform/resolvers@5.2.2(react-hook-form@7.65.0(react@19.2.0))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.62.0(react@19.1.1) + react-hook-form: 7.65.0(react@19.2.0) - '@inquirer/external-editor@1.0.2(@types/node@24.5.2)': + '@inquirer/external-editor@1.0.2(@types/node@24.7.2)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@isaacs/balanced-match@4.0.1': {} @@ -13033,7 +13370,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -13188,11 +13525,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1)': + '@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.13 - react: 19.1.1 + '@types/react': 19.2.2 + react: 19.2.0 '@mjackson/node-fetch-server@0.2.0': {} @@ -13224,7 +13561,7 @@ snapshots: '@module-federation/runtime': 0.18.0 '@module-federation/sdk': 0.18.0 - '@napi-rs/wasm-runtime@1.0.5': + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -13263,7 +13600,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -13276,7 +13613,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - bluebird @@ -13383,7 +13720,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -13442,7 +13779,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -13461,7 +13798,7 @@ snapshots: '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.5 '@types/pg-pool': 2.0.6 transitivePeerDependencies: @@ -13471,7 +13808,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/redis-common': 0.38.2 '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -13497,7 +13834,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.204.0 - import-in-the-middle: 1.14.2 + import-in-the-middle: 1.15.0 require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color @@ -13507,14 +13844,14 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.14.2 + import-in-the-middle: 1.15.0 require-in-the-middle: 7.5.2 semver: 7.7.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/redis-common@0.38.0': {} + '@opentelemetry/redis-common@0.38.2': {} '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': dependencies: @@ -13531,7 +13868,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.37.0': {} - '@opentelemetry/sql-common@0.41.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) @@ -13632,7 +13969,7 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 - '@petamoriken/float16@3.9.2': {} + '@petamoriken/float16@3.9.3': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -13651,7 +13988,7 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@posthog/core@1.0.2': {} + '@posthog/core@1.3.0': {} '@prisma/instrumentation@6.15.0(@opentelemetry/api@1.9.0)': dependencies: @@ -13664,866 +14001,866 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) - - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-context@1.1.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) aria-hidden: 1.2.6 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-icons@1.3.2(react@19.1.1)': + '@radix-ui/react-icons@1.3.2(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@radix-ui/react-id@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) aria-hidden: 1.2.6 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) aria-hidden: 1.2.6 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) '@radix-ui/rect': 1.1.1 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) aria-hidden: 1.2.6 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 - use-sync-external-store: 1.5.0(react@19.1.1) + react: 19.2.0 + use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - react: 19.1.1 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) '@radix-ui/rect@1.1.1': {} - '@react-email/body@0.1.0(react@19.1.1)': + '@react-email/body@0.1.0(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/button@0.2.0(react@19.1.1)': + '@react-email/button@0.2.0(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/code-block@0.1.0(react@19.1.1)': + '@react-email/code-block@0.1.0(react@19.2.0)': dependencies: prismjs: 1.30.0 - react: 19.1.1 - - '@react-email/code-inline@0.0.5(react@19.1.1)': - dependencies: - react: 19.1.1 - - '@react-email/column@0.0.13(react@19.1.1)': - dependencies: - react: 19.1.1 - - '@react-email/components@0.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@react-email/body': 0.1.0(react@19.1.1) - '@react-email/button': 0.2.0(react@19.1.1) - '@react-email/code-block': 0.1.0(react@19.1.1) - '@react-email/code-inline': 0.0.5(react@19.1.1) - '@react-email/column': 0.0.13(react@19.1.1) - '@react-email/container': 0.0.15(react@19.1.1) - '@react-email/font': 0.0.9(react@19.1.1) - '@react-email/head': 0.0.12(react@19.1.1) - '@react-email/heading': 0.0.15(react@19.1.1) - '@react-email/hr': 0.0.11(react@19.1.1) - '@react-email/html': 0.0.11(react@19.1.1) - '@react-email/img': 0.0.11(react@19.1.1) - '@react-email/link': 0.0.12(react@19.1.1) - '@react-email/markdown': 0.0.15(react@19.1.1) - '@react-email/preview': 0.0.13(react@19.1.1) - '@react-email/render': 1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/row': 0.0.12(react@19.1.1) - '@react-email/section': 0.0.16(react@19.1.1) - '@react-email/tailwind': 1.2.2(react@19.1.1) - '@react-email/text': 0.1.5(react@19.1.1) - react: 19.1.1 + react: 19.2.0 + + '@react-email/code-inline@0.0.5(react@19.2.0)': + dependencies: + react: 19.2.0 + + '@react-email/column@0.0.13(react@19.2.0)': + dependencies: + react: 19.2.0 + + '@react-email/components@0.5.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@react-email/body': 0.1.0(react@19.2.0) + '@react-email/button': 0.2.0(react@19.2.0) + '@react-email/code-block': 0.1.0(react@19.2.0) + '@react-email/code-inline': 0.0.5(react@19.2.0) + '@react-email/column': 0.0.13(react@19.2.0) + '@react-email/container': 0.0.15(react@19.2.0) + '@react-email/font': 0.0.9(react@19.2.0) + '@react-email/head': 0.0.12(react@19.2.0) + '@react-email/heading': 0.0.15(react@19.2.0) + '@react-email/hr': 0.0.11(react@19.2.0) + '@react-email/html': 0.0.11(react@19.2.0) + '@react-email/img': 0.0.11(react@19.2.0) + '@react-email/link': 0.0.12(react@19.2.0) + '@react-email/markdown': 0.0.15(react@19.2.0) + '@react-email/preview': 0.0.13(react@19.2.0) + '@react-email/render': 1.3.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-email/row': 0.0.12(react@19.2.0) + '@react-email/section': 0.0.16(react@19.2.0) + '@react-email/tailwind': 1.2.2(react@19.2.0) + '@react-email/text': 0.1.5(react@19.2.0) + react: 19.2.0 transitivePeerDependencies: - react-dom - '@react-email/container@0.0.15(react@19.1.1)': + '@react-email/container@0.0.15(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/font@0.0.9(react@19.1.1)': + '@react-email/font@0.0.9(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/head@0.0.12(react@19.1.1)': + '@react-email/head@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/heading@0.0.15(react@19.1.1)': + '@react-email/heading@0.0.15(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/hr@0.0.11(react@19.1.1)': + '@react-email/hr@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/html@0.0.11(react@19.1.1)': + '@react-email/html@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/img@0.0.11(react@19.1.1)': + '@react-email/img@0.0.11(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/link@0.0.12(react@19.1.1)': + '@react-email/link@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/markdown@0.0.15(react@19.1.1)': + '@react-email/markdown@0.0.15(react@19.2.0)': dependencies: - md-to-react-email: 5.0.5(react@19.1.1) - react: 19.1.1 + md-to-react-email: 5.0.5(react@19.2.0) + react: 19.2.0 - '@react-email/preview@0.0.13(react@19.1.1)': + '@react-email/preview@0.0.13(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/render@1.2.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/render@1.3.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-promise-suspense: 0.3.4 - '@react-email/row@0.0.12(react@19.1.1)': + '@react-email/row@0.0.12(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/section@0.0.16(react@19.1.1)': + '@react-email/section@0.0.16(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/tailwind@1.2.2(react@19.1.1)': + '@react-email/tailwind@1.2.2(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-email/text@0.1.5(react@19.1.1)': + '@react-email/text@0.1.5(react@19.2.0)': dependencies: - react: 19.1.1 + react: 19.2.0 - '@react-router/dev@7.9.1(@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(@types/node@24.5.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.5.1)(lightningcss@1.30.1)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -14533,31 +14870,31 @@ snapshots: '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 '@npmcli/package-json': 4.0.1 - '@react-router/node': 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) + '@react-router/node': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) + '@remix-run/node-fetch-server': 0.9.0 arg: 5.0.2 babel-dead-code-elimination: 1.0.10 chokidar: 4.0.3 dedent: 1.7.0 es-module-lexer: 1.7.0 exit-hook: 2.2.1 - isbot: 5.1.30 + isbot: 5.1.31 jsesc: 3.0.2 lodash: 4.17.21 pathe: 1.1.2 picocolors: 1.1.1 prettier: 3.6.2 react-refresh: 0.14.2 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - semver: 7.7.2 - set-cookie-parser: 2.7.1 + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + semver: 7.7.3 tinyglobby: 0.2.15 - valibot: 0.41.0(typescript@5.9.2) - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + valibot: 1.1.0(typescript@5.9.3) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) optionalDependencies: - '@react-router/serve': 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) - '@vitejs/plugin-rsc': 0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - typescript: 5.9.2 + '@react-router/serve': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) + '@vitejs/plugin-rsc': 0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + typescript: 5.9.3 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -14574,37 +14911,38 @@ snapshots: - tsx - yaml - '@react-router/express@7.9.1(express@4.21.2)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2)': + '@react-router/express@7.9.4(express@4.21.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)': dependencies: - '@react-router/node': 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) + '@react-router/node': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) express: 4.21.2 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@react-router/fs-routes@7.9.1(@react-router/dev@7.9.1(@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(@types/node@24.5.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.5.1)(lightningcss@1.30.1)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2)': + '@react-router/fs-routes@7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)': dependencies: - '@react-router/dev': 7.9.1(@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(@types/node@24.5.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.5.1)(lightningcss@1.30.1)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + '@react-router/dev': 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) minimatch: 9.0.5 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@react-router/node@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2)': + '@react-router/node@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)': dependencies: '@mjackson/node-fetch-server': 0.2.0 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@react-router/serve@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2)': + '@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)': dependencies: - '@react-router/express': 7.9.1(express@4.21.2)(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) - '@react-router/node': 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) + '@mjackson/node-fetch-server': 0.2.0 + '@react-router/express': 7.9.4(express@4.21.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) + '@react-router/node': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) compression: 1.8.1 express: 4.21.2 get-port: 5.1.1 morgan: 1.10.1 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) source-map-support: 0.5.21 transitivePeerDependencies: - supports-color @@ -14628,6 +14966,8 @@ snapshots: dependencies: '@remix-run/headers': 0.12.0 + '@remix-run/node-fetch-server@0.9.0': {} + '@repeaterjs/repeater@3.0.6': {} '@rollup/plugin-commonjs@28.0.6(rollup@4.50.2)': @@ -14694,115 +15034,181 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.50.2': optional: true + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + '@rollup/rollup-android-arm64@4.50.2': optional: true + '@rollup/rollup-android-arm64@4.52.4': + optional: true + '@rollup/rollup-darwin-arm64@4.50.2': optional: true + '@rollup/rollup-darwin-arm64@4.52.4': + optional: true + '@rollup/rollup-darwin-x64@4.50.2': optional: true + '@rollup/rollup-darwin-x64@4.52.4': + optional: true + '@rollup/rollup-freebsd-arm64@4.50.2': optional: true + '@rollup/rollup-freebsd-arm64@4.52.4': + optional: true + '@rollup/rollup-freebsd-x64@4.50.2': optional: true + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.50.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.50.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-arm64-musl@4.50.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.52.4': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.50.2': optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.50.2': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.50.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.50.2': optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.4': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.50.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-x64-gnu@4.50.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.52.4': + optional: true + '@rollup/rollup-linux-x64-musl@4.50.2': optional: true + '@rollup/rollup-linux-x64-musl@4.52.4': + optional: true + '@rollup/rollup-openharmony-arm64@4.50.2': optional: true + '@rollup/rollup-openharmony-arm64@4.52.4': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.50.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.4': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.50.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + '@rollup/rollup-win32-x64-msvc@4.50.2': optional: true - '@rspack/binding-darwin-arm64@1.5.5': + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + + '@rspack/binding-darwin-arm64@1.5.8': optional: true - '@rspack/binding-darwin-x64@1.5.5': + '@rspack/binding-darwin-x64@1.5.8': optional: true - '@rspack/binding-linux-arm64-gnu@1.5.5': + '@rspack/binding-linux-arm64-gnu@1.5.8': optional: true - '@rspack/binding-linux-arm64-musl@1.5.5': + '@rspack/binding-linux-arm64-musl@1.5.8': optional: true - '@rspack/binding-linux-x64-gnu@1.5.5': + '@rspack/binding-linux-x64-gnu@1.5.8': optional: true - '@rspack/binding-linux-x64-musl@1.5.5': + '@rspack/binding-linux-x64-musl@1.5.8': optional: true - '@rspack/binding-wasm32-wasi@1.5.5': + '@rspack/binding-wasm32-wasi@1.5.8': dependencies: - '@napi-rs/wasm-runtime': 1.0.5 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rspack/binding-win32-arm64-msvc@1.5.5': + '@rspack/binding-win32-arm64-msvc@1.5.8': optional: true - '@rspack/binding-win32-ia32-msvc@1.5.5': + '@rspack/binding-win32-ia32-msvc@1.5.8': optional: true - '@rspack/binding-win32-x64-msvc@1.5.5': + '@rspack/binding-win32-x64-msvc@1.5.8': optional: true - '@rspack/binding@1.5.5': + '@rspack/binding@1.5.8': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.5.5 - '@rspack/binding-darwin-x64': 1.5.5 - '@rspack/binding-linux-arm64-gnu': 1.5.5 - '@rspack/binding-linux-arm64-musl': 1.5.5 - '@rspack/binding-linux-x64-gnu': 1.5.5 - '@rspack/binding-linux-x64-musl': 1.5.5 - '@rspack/binding-wasm32-wasi': 1.5.5 - '@rspack/binding-win32-arm64-msvc': 1.5.5 - '@rspack/binding-win32-ia32-msvc': 1.5.5 - '@rspack/binding-win32-x64-msvc': 1.5.5 - - '@rspack/core@1.5.5': + '@rspack/binding-darwin-arm64': 1.5.8 + '@rspack/binding-darwin-x64': 1.5.8 + '@rspack/binding-linux-arm64-gnu': 1.5.8 + '@rspack/binding-linux-arm64-musl': 1.5.8 + '@rspack/binding-linux-x64-gnu': 1.5.8 + '@rspack/binding-linux-x64-musl': 1.5.8 + '@rspack/binding-wasm32-wasi': 1.5.8 + '@rspack/binding-win32-arm64-msvc': 1.5.8 + '@rspack/binding-win32-ia32-msvc': 1.5.8 + '@rspack/binding-win32-x64-msvc': 1.5.8 + + '@rspack/core@1.5.8': dependencies: '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.5 + '@rspack/binding': 1.5.8 '@rspack/lite-tapable': 1.0.1 '@rspack/lite-tapable@1.0.1': {} @@ -14812,44 +15218,44 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry-internal/browser-utils@10.12.0': + '@sentry-internal/browser-utils@10.19.0': dependencies: - '@sentry/core': 10.12.0 + '@sentry/core': 10.19.0 - '@sentry-internal/feedback@10.12.0': + '@sentry-internal/feedback@10.19.0': dependencies: - '@sentry/core': 10.12.0 + '@sentry/core': 10.19.0 '@sentry-internal/node-cpu-profiler@2.2.0': dependencies: - detect-libc: 2.1.0 - node-abi: 3.77.0 + detect-libc: 2.1.2 + node-abi: 3.78.0 - '@sentry-internal/replay-canvas@10.12.0': + '@sentry-internal/replay-canvas@10.19.0': dependencies: - '@sentry-internal/replay': 10.12.0 - '@sentry/core': 10.12.0 + '@sentry-internal/replay': 10.19.0 + '@sentry/core': 10.19.0 - '@sentry-internal/replay@10.12.0': + '@sentry-internal/replay@10.19.0': dependencies: - '@sentry-internal/browser-utils': 10.12.0 - '@sentry/core': 10.12.0 + '@sentry-internal/browser-utils': 10.19.0 + '@sentry/core': 10.19.0 - '@sentry/babel-plugin-component-annotate@4.3.0': {} + '@sentry/babel-plugin-component-annotate@4.4.0': {} - '@sentry/browser@10.12.0': + '@sentry/browser@10.19.0': dependencies: - '@sentry-internal/browser-utils': 10.12.0 - '@sentry-internal/feedback': 10.12.0 - '@sentry-internal/replay': 10.12.0 - '@sentry-internal/replay-canvas': 10.12.0 - '@sentry/core': 10.12.0 + '@sentry-internal/browser-utils': 10.19.0 + '@sentry-internal/feedback': 10.19.0 + '@sentry-internal/replay': 10.19.0 + '@sentry-internal/replay-canvas': 10.19.0 + '@sentry/core': 10.19.0 - '@sentry/bundler-plugin-core@4.3.0': + '@sentry/bundler-plugin-core@4.4.0': dependencies: '@babel/core': 7.28.4 - '@sentry/babel-plugin-component-annotate': 4.3.0 - '@sentry/cli': 2.53.0 + '@sentry/babel-plugin-component-annotate': 4.4.0 + '@sentry/cli': 2.56.1 dotenv: 16.6.1 find-up: 5.0.0 glob: 9.3.5 @@ -14859,31 +15265,31 @@ snapshots: - encoding - supports-color - '@sentry/cli-darwin@2.53.0': + '@sentry/cli-darwin@2.56.1': optional: true - '@sentry/cli-linux-arm64@2.53.0': + '@sentry/cli-linux-arm64@2.56.1': optional: true - '@sentry/cli-linux-arm@2.53.0': + '@sentry/cli-linux-arm@2.56.1': optional: true - '@sentry/cli-linux-i686@2.53.0': + '@sentry/cli-linux-i686@2.56.1': optional: true - '@sentry/cli-linux-x64@2.53.0': + '@sentry/cli-linux-x64@2.56.1': optional: true - '@sentry/cli-win32-arm64@2.53.0': + '@sentry/cli-win32-arm64@2.56.1': optional: true - '@sentry/cli-win32-i686@2.53.0': + '@sentry/cli-win32-i686@2.56.1': optional: true - '@sentry/cli-win32-x64@2.53.0': + '@sentry/cli-win32-x64@2.56.1': optional: true - '@sentry/cli@2.53.0': + '@sentry/cli@2.56.1': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 @@ -14891,22 +15297,23 @@ snapshots: proxy-from-env: 1.1.0 which: 2.0.2 optionalDependencies: - '@sentry/cli-darwin': 2.53.0 - '@sentry/cli-linux-arm': 2.53.0 - '@sentry/cli-linux-arm64': 2.53.0 - '@sentry/cli-linux-i686': 2.53.0 - '@sentry/cli-linux-x64': 2.53.0 - '@sentry/cli-win32-arm64': 2.53.0 - '@sentry/cli-win32-i686': 2.53.0 - '@sentry/cli-win32-x64': 2.53.0 + '@sentry/cli-darwin': 2.56.1 + '@sentry/cli-linux-arm': 2.56.1 + '@sentry/cli-linux-arm64': 2.56.1 + '@sentry/cli-linux-i686': 2.56.1 + '@sentry/cli-linux-x64': 2.56.1 + '@sentry/cli-win32-arm64': 2.56.1 + '@sentry/cli-win32-i686': 2.56.1 + '@sentry/cli-win32-x64': 2.56.1 transitivePeerDependencies: - encoding - supports-color - '@sentry/core@10.12.0': {} + '@sentry/core@10.19.0': {} - '@sentry/node-core@10.12.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/node-core@10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: + '@apm-js-collab/tracing-hooks': 0.3.1 '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) @@ -14914,11 +15321,13 @@ snapshots: '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.12.0 - '@sentry/opentelemetry': 10.12.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.14.2 + '@sentry/core': 10.19.0 + '@sentry/opentelemetry': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.15.0 + transitivePeerDependencies: + - supports-color - '@sentry/node@10.12.0': + '@sentry/node@10.19.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) @@ -14950,80 +15359,80 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 '@prisma/instrumentation': 6.15.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.12.0 - '@sentry/node-core': 10.12.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/opentelemetry': 10.12.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.14.2 + '@sentry/core': 10.19.0 + '@sentry/node-core': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/opentelemetry': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.15.0 minimatch: 9.0.5 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.12.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/opentelemetry@10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.12.0 + '@sentry/core': 10.19.0 - '@sentry/profiling-node@10.12.0': + '@sentry/profiling-node@10.19.0': dependencies: '@sentry-internal/node-cpu-profiler': 2.2.0 - '@sentry/core': 10.12.0 - '@sentry/node': 10.12.0 + '@sentry/core': 10.19.0 + '@sentry/node': 10.19.0 transitivePeerDependencies: - supports-color - '@sentry/react-router@10.12.0(@react-router/node@7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2))(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@sentry/react-router@10.19.0(@react-router/node@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@react-router/node': 7.9.1(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(typescript@5.9.2) - '@sentry/browser': 10.12.0 - '@sentry/cli': 2.53.0 - '@sentry/core': 10.12.0 - '@sentry/node': 10.12.0 - '@sentry/react': 10.12.0(react@19.1.1) - '@sentry/vite-plugin': 4.3.0 + '@react-router/node': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) + '@sentry/browser': 10.19.0 + '@sentry/cli': 2.56.1 + '@sentry/core': 10.19.0 + '@sentry/node': 10.19.0 + '@sentry/react': 10.19.0(react@19.2.0) + '@sentry/vite-plugin': 4.4.0 glob: 11.0.1 - react: 19.1.1 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.2.0 + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - encoding - supports-color - '@sentry/react@10.12.0(react@19.1.1)': + '@sentry/react@10.19.0(react@19.2.0)': dependencies: - '@sentry/browser': 10.12.0 - '@sentry/core': 10.12.0 + '@sentry/browser': 10.19.0 + '@sentry/core': 10.19.0 hoist-non-react-statics: 3.3.2 - react: 19.1.1 + react: 19.2.0 - '@sentry/vite-plugin@4.3.0': + '@sentry/vite-plugin@4.4.0': dependencies: - '@sentry/bundler-plugin-core': 4.3.0 + '@sentry/bundler-plugin-core': 4.4.0 unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color - '@shikijs/engine-oniguruma@3.12.2': + '@shikijs/engine-oniguruma@3.13.0': dependencies: - '@shikijs/types': 3.12.2 + '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.12.2': + '@shikijs/langs@3.13.0': dependencies: - '@shikijs/types': 3.12.2 + '@shikijs/types': 3.13.0 - '@shikijs/themes@3.12.2': + '@shikijs/themes@3.13.0': dependencies: - '@shikijs/types': 3.12.2 + '@shikijs/types': 3.13.0 - '@shikijs/types@3.12.2': + '@shikijs/types@3.13.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -15038,9 +15447,9 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@simplewebauthn/browser@13.2.0': {} + '@simplewebauthn/browser@13.2.2': {} - '@simplewebauthn/server@13.2.1': + '@simplewebauthn/server@13.2.2': dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.11 @@ -15057,13 +15466,13 @@ snapshots: '@sindresorhus/is@5.6.0': {} - '@slorber/react-helmet-async@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 invariant: 2.2.4 prop-types: 15.8.1 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-fast-compare: 3.2.2 shallowequal: 1.1.0 @@ -15216,50 +15625,50 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/html-darwin-arm64@1.13.5': + '@swc/html-darwin-arm64@1.13.20': optional: true - '@swc/html-darwin-x64@1.13.5': + '@swc/html-darwin-x64@1.13.20': optional: true - '@swc/html-linux-arm-gnueabihf@1.13.5': + '@swc/html-linux-arm-gnueabihf@1.13.20': optional: true - '@swc/html-linux-arm64-gnu@1.13.5': + '@swc/html-linux-arm64-gnu@1.13.20': optional: true - '@swc/html-linux-arm64-musl@1.13.5': + '@swc/html-linux-arm64-musl@1.13.20': optional: true - '@swc/html-linux-x64-gnu@1.13.5': + '@swc/html-linux-x64-gnu@1.13.20': optional: true - '@swc/html-linux-x64-musl@1.13.5': + '@swc/html-linux-x64-musl@1.13.20': optional: true - '@swc/html-win32-arm64-msvc@1.13.5': + '@swc/html-win32-arm64-msvc@1.13.20': optional: true - '@swc/html-win32-ia32-msvc@1.13.5': + '@swc/html-win32-ia32-msvc@1.13.20': optional: true - '@swc/html-win32-x64-msvc@1.13.5': + '@swc/html-win32-x64-msvc@1.13.20': optional: true - '@swc/html@1.13.5': + '@swc/html@1.13.20': dependencies: '@swc/counter': 0.1.3 optionalDependencies: - '@swc/html-darwin-arm64': 1.13.5 - '@swc/html-darwin-x64': 1.13.5 - '@swc/html-linux-arm-gnueabihf': 1.13.5 - '@swc/html-linux-arm64-gnu': 1.13.5 - '@swc/html-linux-arm64-musl': 1.13.5 - '@swc/html-linux-x64-gnu': 1.13.5 - '@swc/html-linux-x64-musl': 1.13.5 - '@swc/html-win32-arm64-msvc': 1.13.5 - '@swc/html-win32-ia32-msvc': 1.13.5 - '@swc/html-win32-x64-msvc': 1.13.5 + '@swc/html-darwin-arm64': 1.13.20 + '@swc/html-darwin-x64': 1.13.20 + '@swc/html-linux-arm-gnueabihf': 1.13.20 + '@swc/html-linux-arm64-gnu': 1.13.20 + '@swc/html-linux-arm64-musl': 1.13.20 + '@swc/html-linux-x64-gnu': 1.13.20 + '@swc/html-linux-x64-musl': 1.13.20 + '@swc/html-win32-arm64-msvc': 1.13.20 + '@swc/html-win32-ia32-msvc': 1.13.20 + '@swc/html-win32-x64-msvc': 1.13.20 '@swc/types@0.1.25': dependencies: @@ -15273,90 +15682,90 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.1.13': + '@tailwindcss/node@4.1.14': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 - jiti: 2.5.1 + jiti: 2.6.1 lightningcss: 1.30.1 magic-string: 0.30.19 source-map-js: 1.2.1 - tailwindcss: 4.1.13 + tailwindcss: 4.1.14 - '@tailwindcss/oxide-android-arm64@4.1.13': + '@tailwindcss/oxide-android-arm64@4.1.14': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.13': + '@tailwindcss/oxide-darwin-arm64@4.1.14': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.13': + '@tailwindcss/oxide-darwin-x64@4.1.14': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.13': + '@tailwindcss/oxide-freebsd-x64@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.13': + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.13': + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.13': + '@tailwindcss/oxide-linux-x64-musl@4.1.14': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.13': + '@tailwindcss/oxide-wasm32-wasi@4.1.14': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.13': + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': optional: true - '@tailwindcss/oxide@4.1.13': + '@tailwindcss/oxide@4.1.14': dependencies: - detect-libc: 2.1.0 - tar: 7.4.3 + detect-libc: 2.1.2 + tar: 7.5.1 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.13 - '@tailwindcss/oxide-darwin-arm64': 4.1.13 - '@tailwindcss/oxide-darwin-x64': 4.1.13 - '@tailwindcss/oxide-freebsd-x64': 4.1.13 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.13 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.13 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.13 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.13 - '@tailwindcss/oxide-linux-x64-musl': 4.1.13 - '@tailwindcss/oxide-wasm32-wasi': 4.1.13 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.13 - - '@tailwindcss/postcss@4.1.13': + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/postcss@4.1.14': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.13 - '@tailwindcss/oxide': 4.1.13 + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 postcss: 8.5.6 - tailwindcss: 4.1.13 + tailwindcss: 4.1.14 - '@tailwindcss/vite@4.1.13(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@tailwindcss/node': 4.1.13 - '@tailwindcss/oxide': 4.1.13 - tailwindcss: 4.1.13 - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@tanstack/react-table@8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-table@8.21.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/table-core': 8.21.3 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) '@tanstack/table-core@8.21.3': {} @@ -16490,17 +16899,17 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -16509,12 +16918,12 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.0.7 - '@types/node': 24.5.2 + '@types/express-serve-static-core': 5.1.0 + '@types/node': 24.7.2 '@types/connect@3.4.38': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/d3-array@3.2.2': {} @@ -16564,26 +16973,26 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.6': + '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 + '@types/send': 1.2.0 - '@types/express-serve-static-core@5.0.7': + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 + '@types/send': 1.2.0 '@types/express@4.17.23': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.6 + '@types/express-serve-static-core': 4.19.7 '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.9 '@types/geojson-vt@3.2.5': dependencies: @@ -16607,7 +17016,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -16623,7 +17032,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/lodash.throttle@4.1.9': dependencies: @@ -16660,19 +17069,19 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/node@12.20.55': {} '@types/node@17.0.45': {} - '@types/node@24.5.2': + '@types/node@24.7.2': dependencies: - undici-types: 7.12.0 + undici-types: 7.14.0 '@types/normalize-package-data@2.4.4': {} @@ -16684,7 +17093,7 @@ snapshots: '@types/pg@8.15.5': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -16697,35 +17106,35 @@ snapshots: '@types/rbush@4.0.0': optional: true - '@types/react-dom@19.1.9(@types/react@19.1.13)': + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-map-gl@6.1.7': dependencies: '@types/geojson': 7946.0.16 '@types/mapbox-gl': 3.4.1 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/viewport-mercator-project': 6.1.6 '@types/react-router-config@5.0.11': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router': 5.1.20 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 19.1.13 + '@types/react': 19.2.2 - '@types/react@19.1.13': + '@types/react@19.2.2': dependencies: csstype: 3.1.3 @@ -16733,7 +17142,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/retry@0.12.0': {} @@ -16744,23 +17153,27 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.5.2 + '@types/node': 24.7.2 + + '@types/send@1.2.0': + dependencies: + '@types/node': 24.7.2 '@types/serve-index@1.9.4': dependencies: '@types/express': 4.17.23 - '@types/serve-static@1.15.8': + '@types/serve-static@1.15.9': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/send': 0.17.5 '@types/shimmer@1.2.0': {} '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/supercluster@7.1.3': dependencies: @@ -16768,7 +17181,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/unist@2.0.11': {} @@ -16782,7 +17195,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 '@types/yargs-parser@21.0.3': {} @@ -16792,38 +17205,38 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vis.gl/react-mapbox@8.0.4(mapbox-gl@3.15.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@vis.gl/react-mapbox@8.1.0(mapbox-gl@3.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: mapbox-gl: 3.15.0 - '@vis.gl/react-maplibre@8.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@vis.gl/react-maplibre@8.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@maplibre/maplibre-gl-style-spec': 19.3.3 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) - '@vitejs/plugin-rsc@0.4.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@mjackson/node-fetch-server': 0.7.0 es-module-lexer: 1.7.0 estree-walker: 3.0.3 magic-string: 0.30.19 periscopic: 4.0.2 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) turbo-stream: 3.1.0 - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.5 + ast-v8-to-istanbul: 0.3.6 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -16831,10 +17244,10 @@ snapshots: istanbul-reports: 3.2.0 magic-string: 0.30.19 magicast: 0.3.5 - std-env: 3.9.0 + std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -16846,13 +17259,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -17023,27 +17436,27 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch-helper@3.26.0(algoliasearch@5.37.0): + algoliasearch-helper@3.26.0(algoliasearch@5.40.0): dependencies: '@algolia/events': 4.0.1 - algoliasearch: 5.37.0 - - algoliasearch@5.37.0: - dependencies: - '@algolia/abtesting': 1.3.0 - '@algolia/client-abtesting': 5.37.0 - '@algolia/client-analytics': 5.37.0 - '@algolia/client-common': 5.37.0 - '@algolia/client-insights': 5.37.0 - '@algolia/client-personalization': 5.37.0 - '@algolia/client-query-suggestions': 5.37.0 - '@algolia/client-search': 5.37.0 - '@algolia/ingestion': 1.37.0 - '@algolia/monitoring': 1.37.0 - '@algolia/recommend': 5.37.0 - '@algolia/requester-browser-xhr': 5.37.0 - '@algolia/requester-fetch': 5.37.0 - '@algolia/requester-node-http': 5.37.0 + algoliasearch: 5.40.0 + + algoliasearch@5.40.0: + dependencies: + '@algolia/abtesting': 1.6.0 + '@algolia/client-abtesting': 5.40.0 + '@algolia/client-analytics': 5.40.0 + '@algolia/client-common': 5.40.0 + '@algolia/client-insights': 5.40.0 + '@algolia/client-personalization': 5.40.0 + '@algolia/client-query-suggestions': 5.40.0 + '@algolia/client-search': 5.40.0 + '@algolia/ingestion': 1.40.0 + '@algolia/monitoring': 1.40.0 + '@algolia/recommend': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 ansi-align@3.0.1: dependencies: @@ -17117,7 +17530,7 @@ snapshots: assign-symbols@1.0.0: {} - ast-v8-to-istanbul@0.3.5: + ast-v8-to-istanbul@0.3.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -17131,8 +17544,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.26.2 - caniuse-lite: 1.0.30001743 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001750 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -17160,12 +17573,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.28.4)(webpack@5.101.3(@swc/core@1.13.5)): + babel-loader@9.2.1(@babel/core@7.28.4)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@babel/core': 7.28.4 find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.101.3(@swc/core@1.13.5) + schema-utils: 4.3.3 + webpack: 5.102.1(@swc/core@1.13.5) babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -17184,7 +17597,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) - core-js-compat: 3.45.1 + core-js-compat: 3.46.0 transitivePeerDependencies: - supports-color @@ -17201,7 +17614,7 @@ snapshots: base-64@0.1.0: {} - baseline-browser-mapping@2.8.5: {} + baseline-browser-mapping@2.8.16: {} basic-auth@2.0.1: dependencies: @@ -17209,24 +17622,24 @@ snapshots: batch@0.6.1: {} - better-auth@1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + better-auth@1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@better-auth/core': 1.3.27 '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 '@noble/ciphers': 2.0.1 '@noble/hashes': 2.0.1 - '@simplewebauthn/browser': 13.2.0 - '@simplewebauthn/server': 13.2.1 + '@simplewebauthn/browser': 13.2.2 + '@simplewebauthn/server': 13.2.2 better-call: 1.0.19 defu: 6.1.4 jose: 6.1.0 - kysely: 0.28.7 + kysely: 0.28.8 nanostores: 1.0.1 - zod: 4.1.9 + zod: 4.1.12 optionalDependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) better-call@1.0.19: dependencies: @@ -17305,13 +17718,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.26.2: + browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.5 - caniuse-lite: 1.0.30001743 - electron-to-chromium: 1.5.221 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.2) + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.235 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) buffer-from@1.1.2: {} @@ -17394,12 +17807,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.26.2 - caniuse-lite: 1.0.30001743 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001750 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001750: {} ccount@2.0.1: {} @@ -17507,14 +17920,14 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -17613,25 +18026,25 @@ snapshots: cookie@1.0.2: {} - copy-text-to-clipboard@3.2.1: {} + copy-text-to-clipboard@3.2.2: {} - copy-webpack-plugin@11.0.0(webpack@5.101.3(@swc/core@1.13.5)): + copy-webpack-plugin@11.0.0(webpack@5.102.1(@swc/core@1.13.5)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 globby: 13.2.2 normalize-path: 3.0.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) - core-js-compat@3.45.1: + core-js-compat@3.46.0: dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 - core-js-pure@3.45.1: {} + core-js-pure@3.46.0: {} - core-js@3.45.1: {} + core-js@3.46.0: {} core-util-is@1.0.3: {} @@ -17659,7 +18072,7 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - css-declaration-sorter@7.2.0(postcss@8.5.6): + css-declaration-sorter@7.3.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -17670,7 +18083,7 @@ snapshots: postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - css-loader@6.11.0(@rspack/core@1.5.5)(webpack@5.101.3(@swc/core@1.13.5)): + css-loader@6.11.0(@rspack/core@1.5.8)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -17679,20 +18092,20 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - '@rspack/core': 1.5.5 - webpack: 5.101.3(@swc/core@1.13.5) + '@rspack/core': 1.5.8 + webpack: 5.102.1(@swc/core@1.13.5) - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.101.3(@swc/core@1.13.5)): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 6.1.2(postcss@8.5.6) jest-worker: 29.7.0 postcss: 8.5.6 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) optionalDependencies: clean-css: 5.3.3 @@ -17730,14 +18143,14 @@ snapshots: csscolorparser@1.0.3: {} - cssdb@8.4.0: {} + cssdb@8.4.2: {} cssesc@3.0.0: {} cssnano-preset-advanced@6.1.2(postcss@8.5.6): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) - browserslist: 4.26.2 + browserslist: 4.26.3 cssnano-preset-default: 6.1.2(postcss@8.5.6) postcss: 8.5.6 postcss-discard-unused: 6.0.5(postcss@8.5.6) @@ -17747,8 +18160,8 @@ snapshots: cssnano-preset-default@6.1.2(postcss@8.5.6): dependencies: - browserslist: 4.26.2 - css-declaration-sorter: 7.2.0(postcss@8.5.6) + browserslist: 4.26.3 + css-declaration-sorter: 7.3.0(postcss@8.5.6) cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 postcss-calc: 9.0.1(postcss@8.5.6) @@ -17934,7 +18347,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.1.0: {} + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -17959,10 +18372,10 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - docusaurus-plugin-typedoc@1.4.2(typedoc-plugin-markdown@4.8.1(typedoc@0.28.13(typescript@5.9.2))): + docusaurus-plugin-typedoc@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): dependencies: - typedoc-docusaurus-theme: 1.4.2(typedoc-plugin-markdown@4.8.1(typedoc@0.28.13(typescript@5.9.2))) - typedoc-plugin-markdown: 4.8.1(typedoc@0.28.13(typescript@5.9.2)) + typedoc-docusaurus-theme: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) dom-converter@0.2.0: dependencies: @@ -18018,9 +18431,9 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.2.2: {} + dotenv@17.2.3: {} - drizzle-kit@0.31.4: + drizzle-kit@0.31.5: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -18029,12 +18442,20 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.4(@electric-sql/pglite@0.3.8)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.7)(postgres@3.4.7): + drizzle-orm@0.44.4(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7): optionalDependencies: - '@electric-sql/pglite': 0.3.8 + '@electric-sql/pglite': 0.3.11 '@opentelemetry/api': 1.9.0 '@types/pg': 8.15.5 - kysely: 0.28.7 + kysely: 0.28.8 + postgres: 3.4.7 + + drizzle-orm@0.44.6(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7): + optionalDependencies: + '@electric-sql/pglite': 0.3.11 + '@opentelemetry/api': 1.9.0 + '@types/pg': 8.15.5 + kysely: 0.28.8 postgres: 3.4.7 dunder-proto@1.0.1: @@ -18051,7 +18472,7 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.15: + eciesjs@0.4.16: dependencies: '@ecies/ciphers': 0.2.4(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 @@ -18060,7 +18481,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.221: {} + electron-to-chromium@1.5.235: {} emoji-regex@8.0.0: {} @@ -18083,7 +18504,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.3 + tapable: 2.3.0 enquirer@2.4.1: dependencies: @@ -18331,7 +18752,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 require-like: 0.1.2 eventemitter3@3.1.2: {} @@ -18409,7 +18830,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-equals@5.2.2: {} + fast-equals@5.3.2: {} fast-glob@3.3.3: dependencies: @@ -18451,11 +18872,11 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-loader@6.2.0(webpack@5.101.3(@swc/core@1.13.5)): + file-loader@6.2.0(webpack@5.102.1(@swc/core@1.13.5)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) file-type@21.0.0: dependencies: @@ -18506,7 +18927,7 @@ snapshots: flatbuffers@24.12.23: {} - flatgeobuf@4.2.0: + flatgeobuf@4.3.1: dependencies: '@repeaterjs/repeater': 3.0.6 flatbuffers: 24.12.23 @@ -18551,14 +18972,14 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.23.14(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - motion-dom: 12.23.12 + motion-dom: 12.23.23 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) fresh@0.5.2: {} @@ -18604,6 +19025,8 @@ snapshots: fuzzysort@3.1.0: {} + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} geojson-equality-ts@1.0.2: @@ -18620,7 +19043,7 @@ snapshots: geotiff@2.1.3: dependencies: - '@petamoriken/float16': 3.9.2 + '@petamoriken/float16': 3.9.3 lerc: 3.0.0 pako: 2.1.0 parse-headers: 2.0.6 @@ -18665,7 +19088,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: + get-tsconfig@4.12.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -18870,7 +19293,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 + style-to-js: 1.1.18 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -18890,7 +19313,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 + style-to-js: 1.1.18 unist-util-position: 5.0.0 vfile-message: 4.0.3 transitivePeerDependencies: @@ -18988,16 +19411,16 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.4(@rspack/core@1.5.5)(webpack@5.101.3(@swc/core@1.13.5)): + html-webpack-plugin@5.6.4(@rspack/core@1.5.8)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.3 + tapable: 2.3.0 optionalDependencies: - '@rspack/core': 1.5.5 - webpack: 5.101.3(@swc/core@1.13.5) + '@rspack/core': 1.5.8 + webpack: 5.102.1(@swc/core@1.13.5) htmlparser2@6.1.0: dependencies: @@ -19098,7 +19521,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.14.2: + import-in-the-middle@1.15.0: dependencies: acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -19219,9 +19642,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -19340,7 +19764,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.30: {} + isbot@5.1.31: {} isexe@2.0.0: {} @@ -19382,7 +19806,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 24.7.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -19390,20 +19814,20 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@1.21.7: {} - jiti@2.5.1: {} + jiti@2.6.1: {} joi@17.13.3: dependencies: @@ -19430,6 +19854,8 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -19466,7 +19892,7 @@ snapshots: kleur@3.0.3: {} - kysely@0.28.7: {} + kysely@0.28.8: {} latest-version@7.0.0: dependencies: @@ -19483,39 +19909,72 @@ snapshots: leven@3.1.0: {} + lightningcss-android-arm64@1.30.2: + optional: true + lightningcss-darwin-arm64@1.30.1: optional: true + lightningcss-darwin-arm64@1.30.2: + optional: true + lightningcss-darwin-x64@1.30.1: optional: true + lightningcss-darwin-x64@1.30.2: + optional: true + lightningcss-freebsd-x64@1.30.1: optional: true + lightningcss-freebsd-x64@1.30.2: + optional: true + lightningcss-linux-arm-gnueabihf@1.30.1: optional: true + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + lightningcss-linux-arm64-gnu@1.30.1: optional: true + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + lightningcss-linux-arm64-musl@1.30.1: optional: true + lightningcss-linux-arm64-musl@1.30.2: + optional: true + lightningcss-linux-x64-gnu@1.30.1: optional: true + lightningcss-linux-x64-gnu@1.30.2: + optional: true + lightningcss-linux-x64-musl@1.30.1: optional: true + lightningcss-linux-x64-musl@1.30.2: + optional: true + lightningcss-win32-arm64-msvc@1.30.1: optional: true + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + lightningcss-win32-x64-msvc@1.30.1: optional: true + lightningcss-win32-x64-msvc@1.30.2: + optional: true + lightningcss@1.30.1: dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -19528,6 +19987,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -19536,7 +20011,7 @@ snapshots: dependencies: uc.micro: 2.1.0 - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} loader-utils@2.0.4: dependencies: @@ -19586,7 +20061,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.1: {} + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -19598,9 +20073,9 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.544.0(react@19.1.1): + lucide-react@0.544.0(react@19.2.0): dependencies: - react: 19.1.1 + react: 19.2.0 lunr@2.3.9: {} @@ -19685,10 +20160,10 @@ snapshots: math-intrinsics@1.1.0: {} - md-to-react-email@5.0.5(react@19.1.1): + md-to-react-email@5.0.5(react@19.2.0): dependencies: marked: 7.0.4 - react: 19.1.1 + react: 19.2.0 mdast-util-directive@3.1.0: dependencies: @@ -20241,11 +20716,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.4(webpack@5.101.3(@swc/core@1.13.5)): + mini-css-extract-plugin@2.9.4(webpack@5.102.1(@swc/core@1.13.5)): dependencies: - schema-utils: 4.3.2 - tapable: 2.2.3 - webpack: 5.101.3(@swc/core@1.13.5) + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.102.1(@swc/core@1.13.5) minimalistic-assert@1.0.1: {} @@ -20277,12 +20752,10 @@ snapshots: minipass@7.1.2: {} - minizlib@3.0.2: + minizlib@3.1.0: dependencies: minipass: 7.1.2 - mkdirp@3.0.1: {} - module-details-from-path@1.0.4: {} morgan@1.10.1: @@ -20295,7 +20768,7 @@ snapshots: transitivePeerDependencies: - supports-color - motion-dom@12.23.12: + motion-dom@12.23.23: dependencies: motion-utils: 12.23.6 @@ -20318,7 +20791,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.5: {} + nanoid@5.1.6: {} nanostores@1.0.1: {} @@ -20328,17 +20801,17 @@ snapshots: neo-async@2.6.2: {} - next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.77.0: + node-abi@3.78.0: dependencies: semver: 7.7.3 @@ -20355,7 +20828,7 @@ snapshots: node-forge@1.3.1: {} - node-releases@2.0.21: {} + node-releases@2.0.23: {} normalize-package-data@2.5.0: dependencies: @@ -20375,7 +20848,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 is-core-module: 2.16.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -20388,7 +20861,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 npm-normalize-package-bin@3.0.1: {} @@ -20396,7 +20869,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 proc-log: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 5.0.1 npm-pick-manifest@8.0.2: @@ -20404,7 +20877,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.2 + semver: 7.7.3 npm-run-path@4.0.1: dependencies: @@ -20416,11 +20889,11 @@ snapshots: dependencies: boolbase: 1.0.0 - null-loader@4.0.1(webpack@5.101.3(@swc/core@1.13.5)): + null-loader@4.0.1(webpack@5.102.1(@swc/core@1.13.5)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) object-assign@4.1.1: {} @@ -20547,7 +21020,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.2 + semver: 7.7.3 package-manager-detector@0.2.11: dependencies: @@ -20627,7 +21100,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.2.1 + lru-cache: 11.2.2 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -20712,12 +21185,12 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@7.0.11(postcss@8.5.6): + postcss-color-functional-notation@7.0.12(postcss@8.5.6): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 @@ -20735,7 +21208,7 @@ snapshots: postcss-colormin@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -20743,7 +21216,7 @@ snapshots: postcss-convert-values@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -20798,9 +21271,9 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-double-position-gradients@6.0.3(postcss@8.5.6): + postcss-double-position-gradients@6.0.4(postcss@8.5.6): dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -20829,22 +21302,22 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-lab-function@7.0.11(postcss@8.5.6): + postcss-lab-function@7.0.12(postcss@8.5.6): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.3(@swc/core@1.13.5)): + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: cosmiconfig: 8.3.6(typescript@5.9.2) jiti: 1.21.7 postcss: 8.5.6 - semver: 7.7.2 - webpack: 5.101.3(@swc/core@1.13.5) + semver: 7.7.3 + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - typescript @@ -20867,7 +21340,7 @@ snapshots: postcss-merge-rules@6.1.1(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 @@ -20887,7 +21360,7 @@ snapshots: postcss-minify-params@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -20956,7 +21429,7 @@ snapshots: postcss-normalize-unicode@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -20994,24 +21467,25 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-preset-env@10.3.1(postcss@8.5.6): + postcss-preset-env@10.4.0(postcss@8.5.6): dependencies: - '@csstools/postcss-alpha-function': 1.0.0(postcss@8.5.6) + '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.6) '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.6) - '@csstools/postcss-color-function': 4.0.11(postcss@8.5.6) - '@csstools/postcss-color-function-display-p3-linear': 1.0.0(postcss@8.5.6) - '@csstools/postcss-color-mix-function': 3.0.11(postcss@8.5.6) - '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.1(postcss@8.5.6) - '@csstools/postcss-content-alt-text': 2.0.7(postcss@8.5.6) + '@csstools/postcss-color-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.6) + '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.6) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.6) + '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.6) + '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.6) '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.6) '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.6) '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.6) - '@csstools/postcss-gradients-interpolation-method': 5.0.11(postcss@8.5.6) - '@csstools/postcss-hwb-function': 4.0.11(postcss@8.5.6) - '@csstools/postcss-ic-unit': 4.0.3(postcss@8.5.6) + '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.6) + '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.6) '@csstools/postcss-initial': 2.0.1(postcss@8.5.6) '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.6) - '@csstools/postcss-light-dark-function': 2.0.10(postcss@8.5.6) + '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.6) '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.6) '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.6) '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.6) @@ -21021,10 +21495,10 @@ snapshots: '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.6) '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.6) '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.6) - '@csstools/postcss-oklab-function': 4.0.11(postcss@8.5.6) - '@csstools/postcss-progressive-custom-properties': 4.2.0(postcss@8.5.6) + '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) '@csstools/postcss-random-function': 2.0.1(postcss@8.5.6) - '@csstools/postcss-relative-color-syntax': 3.0.11(postcss@8.5.6) + '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.6) '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.6) '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.6) '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.6) @@ -21032,28 +21506,28 @@ snapshots: '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.6) '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.6) autoprefixer: 10.4.21(postcss@8.5.6) - browserslist: 4.26.2 + browserslist: 4.26.3 css-blank-pseudo: 7.0.1(postcss@8.5.6) css-has-pseudo: 7.0.3(postcss@8.5.6) css-prefers-color-scheme: 10.0.0(postcss@8.5.6) - cssdb: 8.4.0 + cssdb: 8.4.2 postcss: 8.5.6 postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.6) postcss-clamp: 4.1.0(postcss@8.5.6) - postcss-color-functional-notation: 7.0.11(postcss@8.5.6) + postcss-color-functional-notation: 7.0.12(postcss@8.5.6) postcss-color-hex-alpha: 10.0.0(postcss@8.5.6) postcss-color-rebeccapurple: 10.0.0(postcss@8.5.6) postcss-custom-media: 11.0.6(postcss@8.5.6) postcss-custom-properties: 14.0.6(postcss@8.5.6) postcss-custom-selectors: 8.0.5(postcss@8.5.6) postcss-dir-pseudo-class: 9.0.1(postcss@8.5.6) - postcss-double-position-gradients: 6.0.3(postcss@8.5.6) + postcss-double-position-gradients: 6.0.4(postcss@8.5.6) postcss-focus-visible: 10.0.1(postcss@8.5.6) postcss-focus-within: 9.0.1(postcss@8.5.6) postcss-font-variant: 5.0.0(postcss@8.5.6) postcss-gap-properties: 6.0.0(postcss@8.5.6) postcss-image-set-function: 7.0.0(postcss@8.5.6) - postcss-lab-function: 7.0.11(postcss@8.5.6) + postcss-lab-function: 7.0.12(postcss@8.5.6) postcss-logical: 8.1.0(postcss@8.5.6) postcss-nesting: 13.0.2(postcss@8.5.6) postcss-opacity-percentage: 3.0.0(postcss@8.5.6) @@ -21076,7 +21550,7 @@ snapshots: postcss-reduce-initial@6.1.0(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -21144,17 +21618,17 @@ snapshots: postgres@3.4.7: {} - posthog-js@1.266.0: + posthog-js@1.275.2: dependencies: - '@posthog/core': 1.0.2 - core-js: 3.45.1 + '@posthog/core': 1.3.0 + core-js: 3.46.0 fflate: 0.4.8 preact: 10.27.2 web-vitals: 4.2.4 - posthog-node@5.8.4: + posthog-node@5.10.0: dependencies: - '@posthog/core': 1.0.2 + '@posthog/core': 1.3.0 postmark@4.0.5: dependencies: @@ -21177,11 +21651,11 @@ snapshots: pretty-time@1.1.0: {} - prism-react-renderer@2.4.1(react@19.1.1): + prism-react-renderer@2.4.1(react@19.2.0): dependencies: '@types/prismjs': 1.26.5 clsx: 2.1.1 - react: 19.1.1 + react: 19.2.0 prismjs@1.30.0: {} @@ -21268,68 +21742,68 @@ snapshots: quickselect@3.0.0: {} - radix-ui@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + radix-ui@1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) randombytes@2.1.0: dependencies: @@ -21366,57 +21840,57 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-day-picker@9.10.0(react@19.1.1): + react-day-picker@9.10.0(react@19.2.0): dependencies: '@date-fns/tz': 1.4.1 date-fns: 4.1.0 date-fns-jalali: 4.1.0-0 - react: 19.1.1 + react: 19.2.0 - react-dom@19.1.1(react@19.1.1): + react-dom@19.2.0(react@19.2.0): dependencies: - react: 19.1.1 - scheduler: 0.26.0 + react: 19.2.0 + scheduler: 0.27.0 react-fast-compare@3.2.2: {} - react-hook-form@7.62.0(react@19.1.1): + react-hook-form@7.65.0(react@19.2.0): dependencies: - react: 19.1.1 + react: 19.2.0 react-is@16.13.1: {} react-is@18.3.1: {} - react-json-view-lite@2.5.0(react@19.1.1): + react-json-view-lite@2.5.0(react@19.2.0): dependencies: - react: 19.1.1 + react: 19.2.0 - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.1))(webpack@5.101.3(@swc/core@1.13.5)): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@babel/runtime': 7.28.4 - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.1)' - webpack: 5.101.3(@swc/core@1.13.5) + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' + webpack: 5.102.1(@swc/core@1.13.5) - react-map-gl@8.0.4(mapbox-gl@3.15.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-map-gl@8.1.0(mapbox-gl@3.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@vis.gl/react-mapbox': 8.0.4(mapbox-gl@3.15.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@vis.gl/react-maplibre': 8.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@vis.gl/react-mapbox': 8.1.0(mapbox-gl@3.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@vis.gl/react-maplibre': 8.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: mapbox-gl: 3.15.0 - react-markdown@10.1.0(@types/react@19.1.13)(react@19.1.1): + react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.1.13 + '@types/react': 19.2.2 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.0 - react: 19.1.1 + react: 19.2.0 remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 @@ -21431,49 +21905,49 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.1.1): + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): dependencies: - react: 19.1.1 - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - react-remove-scroll@2.7.1(@types/react@19.1.13)(react@19.1.1): + react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): dependencies: - react: 19.1.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.13)(react@19.1.1) - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.13)(react@19.1.1) - use-sidecar: 1.1.3(@types/react@19.1.13)(react@19.1.1) + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - react-router-config@5.1.1(react-router@5.3.4(react@19.1.1))(react@19.1.1): + react-router-config@5.1.1(react-router@5.3.4(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 - react: 19.1.1 - react-router: 5.3.4(react@19.1.1) + react: 19.2.0 + react-router: 5.3.4(react@19.2.0) - react-router-dom@5.3.4(react@19.1.1): + react-router-dom@5.3.4(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.1.1 - react-router: 5.3.4(react@19.1.1) + react: 19.2.0 + react-router: 5.3.4(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - react-router-dom@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router-dom@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-router@5.3.4(react@19.1.1): + react-router@5.3.4(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 history: 4.10.1 @@ -21481,45 +21955,45 @@ snapshots: loose-envify: 1.4.0 path-to-regexp: 1.9.0 prop-types: 15.8.1 - react: 19.1.1 + react: 19.2.0 react-is: 16.13.1 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: cookie: 1.0.2 - react: 19.1.1 + react: 19.2.0 set-cookie-parser: 2.7.1 optionalDependencies: - react-dom: 19.1.1(react@19.1.1) + react-dom: 19.2.0(react@19.2.0) - react-smooth@4.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-smooth@4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - fast-equals: 5.2.2 + fast-equals: 5.3.2 prop-types: 15.8.1 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-style-singleton@2.2.3(@types/react@19.1.13)(react@19.1.1): + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): dependencies: get-nonce: 1.0.1 - react: 19.1.1 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - react-transition-group@4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) - react@19.1.1: {} + react@19.2.0: {} read-pkg-up@7.0.1: dependencies: @@ -21567,15 +22041,15 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + recharts@2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-is: 18.3.1 - react-smooth: 4.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-smooth: 4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 @@ -21642,12 +22116,12 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@6.3.1: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 @@ -21661,9 +22135,9 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.12.0: + regjsparser@0.13.0: dependencies: - jsesc: 3.0.2 + jsesc: 3.1.0 rehype-raw@7.0.0: dependencies: @@ -21748,24 +22222,24 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - remix-hook-form@7.1.0(react-dom@19.1.1(react@19.1.1))(react-hook-form@7.62.0(react@19.1.1))(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): + remix-hook-form@7.1.0(react-dom@19.2.0(react@19.2.0))(react-hook-form@7.65.0(react@19.2.0))(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0): dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-hook-form: 7.62.0(react@19.1.1) - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-hook-form: 7.65.0(react@19.2.0) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - remix-toast@3.2.0(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)): + remix-toast@3.3.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): dependencies: - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) zod: 3.25.76 - remix-utils@8.8.0(react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(zod@3.25.76): + remix-utils@8.8.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(zod@3.25.76): dependencies: type-fest: 4.41.0 optionalDependencies: - react: 19.1.1 - react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.2.0 + react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) zod: 3.25.76 renderkid@3.0.0: @@ -21866,6 +22340,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.50.2 fsevents: 2.3.3 + rollup@4.52.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 + fsevents: 2.3.3 + rou3@0.5.1: {} rtlcss@4.3.0: @@ -21910,7 +22412,7 @@ snapshots: sax@1.4.1: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} schema-dts@1.1.5: {} @@ -21920,7 +22422,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -21947,14 +22449,12 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 semver@5.7.2: {} semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.3: {} send@0.19.0: @@ -22063,7 +22563,7 @@ snapshots: shimmer@1.2.1: {} - shpjs@6.1.0: + shpjs@6.2.0: dependencies: but-unzip: 0.1.7 parsedbf: 2.0.0 @@ -22143,10 +22643,10 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 - sonner@2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + sonner@2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) sort-asc@0.2.0: {} @@ -22234,6 +22734,8 @@ snapshots: statuses@2.0.1: {} + std-env@3.10.0: {} + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: @@ -22325,17 +22827,17 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - style-to-js@1.1.17: + style-to-js@1.1.18: dependencies: - style-to-object: 1.0.9 + style-to-object: 1.0.11 - style-to-object@1.0.9: + style-to-object@1.0.11: dependencies: inline-style-parser: 0.2.4 stylehacks@6.1.1(postcss@8.5.6): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 postcss: 8.5.6 postcss-selector-parser: 6.1.2 @@ -22372,11 +22874,11 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - swc-loader@0.2.6(@swc/core@1.13.5)(webpack@5.101.3(@swc/core@1.13.5)): + swc-loader@0.2.6(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@swc/core': 1.13.5 '@swc/counter': 0.1.3 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) sweepline-intersections@1.5.0: dependencies: @@ -22384,33 +22886,32 @@ snapshots: tailwind-merge@3.3.1: {} - tailwindcss-animate@1.0.7(tailwindcss@4.1.13): + tailwindcss-animate@1.0.7(tailwindcss@4.1.14): dependencies: - tailwindcss: 4.1.13 + tailwindcss: 4.1.14 - tailwindcss@4.1.13: {} + tailwindcss@4.1.14: {} - tapable@2.2.3: {} + tapable@2.3.0: {} - tar@7.4.3: + tar@7.5.1: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 + minizlib: 3.1.0 yallist: 5.0.0 term-size@2.2.1: {} - terser-webpack-plugin@5.3.14(@swc/core@1.13.5)(webpack@5.101.3(@swc/core@1.13.5)): + terser-webpack-plugin@5.3.14(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) optionalDependencies: '@swc/core': 1.13.5 @@ -22490,9 +22991,9 @@ snapshots: trough@2.2.0: {} - tsconfck@3.1.6(typescript@5.9.2): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 tslib@1.14.1: {} @@ -22599,11 +23100,11 @@ snapshots: typed-array-buffer: 1.0.3 typed-array-byte-offset: 1.0.4 - typedoc-docusaurus-theme@1.4.2(typedoc-plugin-markdown@4.8.1(typedoc@0.28.13(typescript@5.9.2))): + typedoc-docusaurus-theme@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): dependencies: - typedoc-plugin-markdown: 4.8.1(typedoc@0.28.13(typescript@5.9.2)) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) - typedoc-plugin-markdown@4.8.1(typedoc@0.28.13(typescript@5.9.2)): + typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): dependencies: typedoc: 0.28.13(typescript@5.9.2) @@ -22613,7 +23114,7 @@ snapshots: typedoc@0.28.13(typescript@5.9.2): dependencies: - '@gerrit0/mini-shiki': 3.12.2 + '@gerrit0/mini-shiki': 3.13.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -22622,6 +23123,8 @@ snapshots: typescript@5.9.2: {} + typescript@5.9.3: {} + typewise-core@1.2.0: {} typewise@1.0.3: @@ -22641,7 +23144,7 @@ snapshots: uncrypto@0.1.3: {} - undici-types@7.12.0: {} + undici-types@7.14.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -22719,9 +23222,9 @@ snapshots: webpack-sources: 3.3.3 webpack-virtual-modules: 0.5.0 - update-browserslist-db@1.1.3(browserslist@4.26.2): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -22738,7 +23241,7 @@ snapshots: is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.3.0 - semver: 7.7.2 + semver: 7.7.3 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -22746,33 +23249,33 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.101.3(@swc/core@1.13.5)))(webpack@5.101.3(@swc/core@1.13.5)): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.13.5)))(webpack@5.102.1(@swc/core@1.13.5)): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) optionalDependencies: - file-loader: 6.2.0(webpack@5.101.3(@swc/core@1.13.5)) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.13.5)) - use-callback-ref@1.3.3(@types/react@19.1.13)(react@19.1.1): + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): dependencies: - react: 19.1.1 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - use-sidecar@1.1.3(@types/react@19.1.13)(react@19.1.1): + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): dependencies: detect-node-es: 1.1.0 - react: 19.1.1 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.2.2 - use-sync-external-store@1.5.0(react@19.1.1): + use-sync-external-store@1.6.0(react@19.2.0): dependencies: - react: 19.1.1 + react: 19.2.0 util-deprecate@1.0.2: {} @@ -22784,9 +23287,9 @@ snapshots: uuid@8.3.2: {} - valibot@0.41.0(typescript@5.9.2): + valibot@1.1.0(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 validate-npm-package-license@3.0.4: dependencies: @@ -22833,13 +23336,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -22854,43 +23357,43 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.2) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.50.2 + rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.7.2 fsevents: 2.3.3 - jiti: 2.5.1 - lightningcss: 1.30.1 + jiti: 2.6.1 + lightningcss: 1.30.2 terser: 5.44.0 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) optional: true - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -22908,12 +23411,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.5.2 + '@types/node': 24.7.2 transitivePeerDependencies: - jiti - less @@ -22963,22 +23466,22 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@5.3.4(webpack@5.101.3(@swc/core@1.13.5)): + webpack-dev-middleware@5.3.4(webpack@5.102.1(@swc/core@1.13.5)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.2 - webpack: 5.101.3(@swc/core@1.13.5) + schema-utils: 4.3.3 + webpack: 5.102.1(@swc/core@1.13.5) - webpack-dev-server@4.15.2(webpack@5.101.3(@swc/core@1.13.5)): + webpack-dev-server@4.15.2(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.23 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.9 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -22997,15 +23500,15 @@ snapshots: open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.101.3(@swc/core@1.13.5)) + webpack-dev-middleware: 5.3.4(webpack@5.102.1(@swc/core@1.13.5)) ws: 8.18.3 optionalDependencies: - webpack: 5.101.3(@swc/core@1.13.5) + webpack: 5.102.1(@swc/core@1.13.5) transitivePeerDependencies: - bufferutil - debug @@ -23028,7 +23531,7 @@ snapshots: webpack-virtual-modules@0.5.0: {} - webpack@5.101.3(@swc/core@1.13.5): + webpack@5.102.1(@swc/core@1.13.5): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -23038,7 +23541,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 + browserslist: 4.26.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -23047,12 +23550,12 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.101.3(@swc/core@1.13.5)) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -23060,7 +23563,7 @@ snapshots: - esbuild - uglify-js - webpackbar@6.0.1(webpack@5.101.3(@swc/core@1.13.5)): + webpackbar@6.0.1(webpack@5.102.1(@swc/core@1.13.5)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -23068,8 +23571,8 @@ snapshots: figures: 3.2.0 markdown-table: 2.0.0 pretty-time: 1.1.0 - std-env: 3.9.0 - webpack: 5.101.3(@swc/core@1.13.5) + std-env: 3.10.0 + webpack: 5.102.1(@swc/core@1.13.5) wrap-ansi: 7.0.0 websocket-driver@0.7.4: @@ -23101,7 +23604,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -23207,14 +23710,14 @@ snapshots: zod@3.25.76: {} - zod@4.1.9: {} + zod@4.1.12: {} zstddec@0.1.0: {} - zustand@5.0.8(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): + zustand@5.0.8(@types/react@19.2.2)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): optionalDependencies: - '@types/react': 19.1.13 - react: 19.1.1 - use-sync-external-store: 1.5.0(react@19.1.1) + '@types/react': 19.2.2 + react: 19.2.0 + use-sync-external-store: 1.6.0(react@19.2.0) zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5c4425ffb..8e013fa8e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,21 +6,21 @@ packages: - fdm-app catalog: - '@dotenvx/dotenvx': ^1.49.1 + '@dotenvx/dotenvx': ^1.51.0 '@rollup/plugin-commonjs': ^28.0.6 '@rollup/plugin-json': ^6.1.0 - '@rollup/plugin-node-resolve': ^16.0.1 + '@rollup/plugin-node-resolve': ^16.0.3 '@rollup/plugin-terser': ^0.4.4 '@rollup/plugin-typescript': ^12.1.4 '@vitest/coverage-v8': 3.2.4 - better-auth: ^1.3.26 - drizzle-kit: ^0.31.4 - drizzle-orm: ^0.44.5 - rollup: ^4.50.2 + better-auth: ^1.3.27 + drizzle-kit: ^0.31.5 + drizzle-orm: ^0.44.6 + rollup: ^4.52.4 rollup-plugin-polyfill-node: ^0.13.0 - typedoc: ^0.28.13 - typedoc-plugin-missing-exports: ^4.1.0 - typescript: ^5.9.2 - vite: ^7.1.6 + typedoc: ^0.28.14 + typedoc-plugin-missing-exports: ^4.1.2 + typescript: ^5.9.3 + vite: ^7.1.10 vite-tsconfig-paths: ^5.1.4 vitest: ^3.2.4 From 34322362e6496ffee09f9b260b5f3ef172a875a0 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:40:24 +0200 Subject: [PATCH 039/243] chore: updare major vesions of dependencies --- fdm-app/package.json | 6 +++--- fdm-docs/package.json | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fdm-app/package.json b/fdm-app/package.json index 9040c9cff..dad58b4d4 100644 --- a/fdm-app/package.json +++ b/fdm-app/package.json @@ -49,7 +49,7 @@ "fuzzysort": "^3.1.0", "isbot": "^5.1.31", "lodash.throttle": "^4.1.1", - "lucide-react": "^0.544.0", + "lucide-react": "^0.545.0", "mapbox-gl": "^3.15.0", "next-themes": "^0.4.6", "postgres": "^3.4.7", @@ -59,7 +59,7 @@ "proj4": "^2.19.10", "radix-ui": "^1.4.3", "react": "^19.2.0", - "react-day-picker": "9.10.0", + "react-day-picker": "9.11.1", "react-dom": "^19.2.0", "react-hook-form": "^7.65.0", "react-map-gl": "^8.1.0", @@ -70,7 +70,7 @@ "remark-gfm": "^4.0.1", "remix-hook-form": "7.1.0", "remix-toast": "^3.3.0", - "remix-utils": "^8.8.0", + "remix-utils": "^9.0.0", "shpjs": "^6.2.0", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1", diff --git a/fdm-docs/package.json b/fdm-docs/package.json index c9072fff1..daf8cc50f 100644 --- a/fdm-docs/package.json +++ b/fdm-docs/package.json @@ -19,20 +19,20 @@ "preinstall": "npx only-allow pnpm" }, "dependencies": { - "@docusaurus/core": "3.8.1", + "@docusaurus/core": "3.9.1", "@docusaurus/faster": "^3.9.1", - "@docusaurus/preset-classic": "3.8.1", + "@docusaurus/preset-classic": "3.9.1", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "lucide-react": "^0.544.0", + "lucide-react": "^0.545.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.0", "react-dom": "^19.2.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/tsconfig": "3.8.1", - "@docusaurus/types": "3.8.1", + "@docusaurus/module-type-aliases": "3.9.1", + "@docusaurus/tsconfig": "3.9.1", + "@docusaurus/types": "3.9.1", "docusaurus-plugin-typedoc": "^1.4.2", "typedoc": "catalog:", "typedoc-plugin-markdown": "^4.9.0", From 195b0fe2f6986b0ee4368b716a5b4a98c1de70fd Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:49:52 +0200 Subject: [PATCH 040/243] chore: fix lockfile --- pnpm-lock.yaml | 1659 ++++++++++++++++++++++-------------------------- 1 file changed, 749 insertions(+), 910 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d4b782ee..4ce7e0eda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,7 @@ catalogs: default: '@dotenvx/dotenvx': specifier: ^1.51.0 - version: 1.48.4 + version: 1.51.0 '@rollup/plugin-commonjs': specifier: ^28.0.6 version: 28.0.6 @@ -17,7 +17,7 @@ catalogs: version: 6.1.0 '@rollup/plugin-node-resolve': specifier: ^16.0.3 - version: 16.0.1 + version: 16.0.3 '@rollup/plugin-terser': specifier: ^0.4.4 version: 0.4.4 @@ -35,22 +35,22 @@ catalogs: version: 0.31.5 drizzle-orm: specifier: ^0.44.6 - version: 0.44.4 + version: 0.44.6 rollup: specifier: ^4.52.4 - version: 4.50.2 + version: 4.52.4 rollup-plugin-polyfill-node: specifier: ^0.13.0 version: 0.13.0 typedoc: specifier: ^0.28.14 - version: 0.28.13 + version: 0.28.14 typedoc-plugin-missing-exports: specifier: ^4.1.2 - version: 4.1.0 + version: 4.1.2 typescript: specifier: ^5.9.3 - version: 5.9.2 + version: 5.9.3 vite: specifier: ^7.1.10 version: 7.1.10 @@ -185,8 +185,8 @@ importers: specifier: ^4.1.1 version: 4.1.1 lucide-react: - specifier: ^0.544.0 - version: 0.544.0(react@19.2.0) + specifier: ^0.545.0 + version: 0.545.0(react@19.2.0) mapbox-gl: specifier: ^3.15.0 version: 3.15.0 @@ -215,8 +215,8 @@ importers: specifier: ^19.2.0 version: 19.2.0 react-day-picker: - specifier: 9.10.0 - version: 9.10.0(react@19.2.0) + specifier: 9.11.1 + version: 9.11.1(react@19.2.0) react-dom: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) @@ -248,8 +248,8 @@ importers: specifier: ^3.3.0 version: 3.3.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) remix-utils: - specifier: ^8.8.0 - version: 8.8.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(zod@3.25.76) + specifier: ^9.0.0 + version: 9.0.0(@standard-schema/spec@1.0.0)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) shpjs: specifier: ^6.2.0 version: 6.2.0 @@ -280,10 +280,10 @@ importers: version: 1.51.0 '@react-router/dev': specifier: ^7.9.4 - version: 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@react-router/fs-routes': specifier: ^7.9.4 - version: 7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3) + version: 7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3) '@tailwindcss/postcss': specifier: ^4.1.14 version: 4.1.14 @@ -347,19 +347,19 @@ importers: devDependencies: '@dotenvx/dotenvx': specifier: 'catalog:' - version: 1.48.4 + version: 1.51.0 '@rollup/plugin-commonjs': specifier: 'catalog:' - version: 28.0.6(rollup@4.50.2) + version: 28.0.6(rollup@4.52.4) '@rollup/plugin-node-resolve': specifier: 'catalog:' - version: 16.0.1(rollup@4.50.2) + version: 16.0.3(rollup@4.52.4) '@rollup/plugin-terser': specifier: 'catalog:' - version: 0.4.4(rollup@4.50.2) + version: 0.4.4(rollup@4.52.4) '@rollup/plugin-typescript': specifier: 'catalog:' - version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) + version: 12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 'catalog:' version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) @@ -368,19 +368,19 @@ importers: version: 3.4.7 rollup: specifier: 'catalog:' - version: 4.50.2 + version: 4.52.4 rollup-plugin-polyfill-node: specifier: 'catalog:' - version: 0.13.0(rollup@4.50.2) + version: 0.13.0(rollup@4.52.4) typedoc: specifier: 'catalog:' - version: 0.28.13(typescript@5.9.2) + version: 0.28.14(typescript@5.9.3) typedoc-plugin-missing-exports: specifier: 'catalog:' - version: 4.1.0(typedoc@0.28.13(typescript@5.9.2)) + version: 4.1.2(typedoc@0.28.14(typescript@5.9.3)) typescript: specifier: 'catalog:' - version: 5.9.2 + version: 5.9.3 vitest: specifier: 'catalog:' version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) @@ -401,7 +401,7 @@ importers: version: 1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) drizzle-orm: specifier: 'catalog:' - version: 0.44.4(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7) + version: 0.44.6(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7) nanoid: specifier: ^5.1.6 version: 5.1.6 @@ -414,19 +414,19 @@ importers: devDependencies: '@dotenvx/dotenvx': specifier: 'catalog:' - version: 1.48.4 + version: 1.51.0 '@rollup/plugin-commonjs': specifier: 'catalog:' - version: 28.0.6(rollup@4.50.2) + version: 28.0.6(rollup@4.52.4) '@rollup/plugin-node-resolve': specifier: 'catalog:' - version: 16.0.1(rollup@4.50.2) + version: 16.0.3(rollup@4.52.4) '@rollup/plugin-terser': specifier: 'catalog:' - version: 0.4.4(rollup@4.50.2) + version: 0.4.4(rollup@4.52.4) '@rollup/plugin-typescript': specifier: 'catalog:' - version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) + version: 12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.9.3) '@types/node': specifier: ^24.7.2 version: 24.7.2 @@ -444,19 +444,19 @@ importers: version: 16.4.0 rollup: specifier: 'catalog:' - version: 4.50.2 + version: 4.52.4 rollup-plugin-polyfill-node: specifier: 'catalog:' - version: 0.13.0(rollup@4.50.2) + version: 0.13.0(rollup@4.52.4) typedoc: specifier: 'catalog:' - version: 0.28.13(typescript@5.9.2) + version: 0.28.14(typescript@5.9.3) typedoc-plugin-missing-exports: specifier: 'catalog:' - version: 4.1.0(typedoc@0.28.13(typescript@5.9.2)) + version: 4.1.2(typedoc@0.28.14(typescript@5.9.3)) typescript: specifier: 'catalog:' - version: 5.9.2 + version: 5.9.3 vitest: specifier: 'catalog:' version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) @@ -469,40 +469,40 @@ importers: devDependencies: '@dotenvx/dotenvx': specifier: 'catalog:' - version: 1.48.4 + version: 1.51.0 '@rollup/plugin-commonjs': specifier: 'catalog:' - version: 28.0.6(rollup@4.50.2) + version: 28.0.6(rollup@4.52.4) '@rollup/plugin-json': specifier: 'catalog:' - version: 6.1.0(rollup@4.50.2) + version: 6.1.0(rollup@4.52.4) '@rollup/plugin-node-resolve': specifier: 'catalog:' - version: 16.0.1(rollup@4.50.2) + version: 16.0.3(rollup@4.52.4) '@rollup/plugin-terser': specifier: 'catalog:' - version: 0.4.4(rollup@4.50.2) + version: 0.4.4(rollup@4.52.4) '@rollup/plugin-typescript': specifier: 'catalog:' - version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2) + version: 12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.9.3) '@vitest/coverage-v8': specifier: 'catalog:' version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) rollup: specifier: 'catalog:' - version: 4.50.2 + version: 4.52.4 rollup-plugin-polyfill-node: specifier: 'catalog:' - version: 0.13.0(rollup@4.50.2) + version: 0.13.0(rollup@4.52.4) typedoc: specifier: 'catalog:' - version: 0.28.13(typescript@5.9.2) + version: 0.28.14(typescript@5.9.3) typedoc-plugin-missing-exports: specifier: 'catalog:' - version: 4.1.0(typedoc@0.28.13(typescript@5.9.2)) + version: 4.1.2(typedoc@0.28.14(typescript@5.9.3)) typescript: specifier: 'catalog:' - version: 5.9.2 + version: 5.9.3 vitest: specifier: 'catalog:' version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) @@ -510,14 +510,14 @@ importers: fdm-docs: dependencies: '@docusaurus/core': - specifier: 3.8.1 - version: 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) + specifier: 3.9.1 + version: 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) '@docusaurus/faster': specifier: ^3.9.1 - version: 3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) '@docusaurus/preset-classic': - specifier: 3.8.1 - version: 3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2) + specifier: 3.9.1 + version: 3.9.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3) '@mdx-js/react': specifier: ^3.1.1 version: 3.1.1(@types/react@19.2.2)(react@19.2.0) @@ -525,8 +525,8 @@ importers: specifier: ^2.1.1 version: 2.1.1 lucide-react: - specifier: ^0.544.0 - version: 0.544.0(react@19.2.0) + specifier: ^0.545.0 + version: 0.545.0(react@19.2.0) prism-react-renderer: specifier: ^2.4.1 version: 2.4.1(react@19.2.0) @@ -538,49 +538,69 @@ importers: version: 19.2.0(react@19.2.0) devDependencies: '@docusaurus/module-type-aliases': - specifier: 3.8.1 - version: 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 3.9.1 + version: 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/tsconfig': - specifier: 3.8.1 - version: 3.8.1 + specifier: 3.9.1 + version: 3.9.1 '@docusaurus/types': - specifier: 3.8.1 - version: 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 3.9.1 + version: 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) docusaurus-plugin-typedoc: specifier: ^1.4.2 - version: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) + version: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))) typedoc: specifier: 'catalog:' - version: 0.28.13(typescript@5.9.2) + version: 0.28.14(typescript@5.9.3) typedoc-plugin-markdown: specifier: ^4.9.0 - version: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + version: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) typescript: specifier: 'catalog:' - version: 5.9.2 + version: 5.9.3 packages: + '@ai-sdk/gateway@1.0.40': + resolution: {integrity: sha512-zlixM9jac0w0jjYl5gwNq+w9nydvraAmLaZQbbh+QpHU+OPkTIZmyBcKeTq5eGQKQxhi+oquHxzCSKyJx3egGw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.12': + resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@ai-sdk/react@2.0.70': + resolution: {integrity: sha512-84So0vv9R2eL+7XAS1xAoqCx1jQGKb2WH8miJV8rBvF1QF9G5otFm35LhPPwZyJDq68vuVsvhIde1yzDCw2B8A==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + '@algolia/abtesting@1.6.0': resolution: {integrity: sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==} engines: {node: '>= 14.0.0'} - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} + '@algolia/autocomplete-core@1.19.2': + resolution: {integrity: sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==} - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} + '@algolia/autocomplete-plugin-algolia-insights@1.19.2': + resolution: {integrity: sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==} peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} + '@algolia/autocomplete-shared@1.19.2': + resolution: {integrity: sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' @@ -1635,11 +1655,11 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@docsearch/css@3.9.0': - resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} + '@docsearch/css@4.2.0': + resolution: {integrity: sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==} - '@docsearch/react@3.9.0': - resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} + '@docsearch/react@4.2.0': + resolution: {integrity: sha512-zSN/KblmtBcerf7Z87yuKIHZQmxuXvYc6/m0+qnjyNu+Ir67AVOagTa1zBqcxkVUVkmBqUExdcyrdo9hbGbqTw==} peerDependencies: '@types/react': '>= 16.8.0 < 20.0.0' react: '>= 16.8.0 < 20.0.0' @@ -1655,31 +1675,31 @@ packages: search-insights: optional: true - '@docusaurus/babel@3.8.1': - resolution: {integrity: sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==} - engines: {node: '>=18.0'} + '@docusaurus/babel@3.9.1': + resolution: {integrity: sha512-/uoi3oG+wvbVWNBRfPrzrEslOSeLxrQEyWMywK51TLDFTANqIRivzkMusudh5bdDty8fXzCYUT+tg5t697jYqg==} + engines: {node: '>=20.0'} - '@docusaurus/bundler@3.8.1': - resolution: {integrity: sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==} - engines: {node: '>=18.0'} + '@docusaurus/bundler@3.9.1': + resolution: {integrity: sha512-E1c9DgNmAz4NqbNtiJVp4UgjLtr8O01IgtXD/NDQ4PZaK8895cMiTOgb3k7mN0qX8A3lb8vqyrPJ842+yMpuUg==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/faster': '*' peerDependenciesMeta: '@docusaurus/faster': optional: true - '@docusaurus/core@3.8.1': - resolution: {integrity: sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==} - engines: {node: '>=18.0'} + '@docusaurus/core@3.9.1': + resolution: {integrity: sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==} + engines: {node: '>=20.0'} hasBin: true peerDependencies: '@mdx-js/react': ^3.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/cssnano-preset@3.8.1': - resolution: {integrity: sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==} - engines: {node: '>=18.0'} + '@docusaurus/cssnano-preset@3.9.1': + resolution: {integrity: sha512-2y7+s7RWQMqBg+9ejeKwvZs7Bdw/hHIVJIodwMXbs2kr+S48AhcmAfdOh6Cwm0unJb0hJUshN0ROwRoQMwl3xg==} + engines: {node: '>=20.0'} '@docusaurus/faster@3.9.1': resolution: {integrity: sha512-zJIrIv+R/IN5TTLV9L+SvO3hwz62L6pO/L16k+b2nC3to3Gn01cnEGHL6doTGAezuPwTSmteJl+kzaoOf+znzg==} @@ -1687,94 +1707,94 @@ packages: peerDependencies: '@docusaurus/types': '*' - '@docusaurus/logger@3.8.1': - resolution: {integrity: sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==} - engines: {node: '>=18.0'} + '@docusaurus/logger@3.9.1': + resolution: {integrity: sha512-C9iFzXwHzwvGlisE4bZx+XQE0JIqlGAYAd5LzpR7fEDgjctu7yL8bE5U4nTNywXKHURDzMt4RJK8V6+stFHVkA==} + engines: {node: '>=20.0'} - '@docusaurus/mdx-loader@3.8.1': - resolution: {integrity: sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==} - engines: {node: '>=18.0'} + '@docusaurus/mdx-loader@3.9.1': + resolution: {integrity: sha512-/1PY8lqry8jCt0qZddJSpc0U2sH6XC27kVJZfpA7o2TiQ3mdBQyH5AVbj/B2m682B1ounE+XjI0LdpOkAQLPoA==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/module-type-aliases@3.8.1': - resolution: {integrity: sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==} + '@docusaurus/module-type-aliases@3.9.1': + resolution: {integrity: sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==} peerDependencies: react: '*' react-dom: '*' - '@docusaurus/plugin-content-blog@3.8.1': - resolution: {integrity: sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-blog@3.9.1': + resolution: {integrity: sha512-vT6kIimpJLWvW9iuWzH4u7VpTdsGlmn4yfyhq0/Kb1h4kf9uVouGsTmrD7WgtYBUG1P+TSmQzUUQa+ALBSRTig==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-docs@3.8.1': - resolution: {integrity: sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-docs@3.9.1': + resolution: {integrity: sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-pages@3.8.1': - resolution: {integrity: sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-content-pages@3.9.1': + resolution: {integrity: sha512-/1wFzRnXYASI+Nv9ck9IVPIMw0O5BGQ8ZVhDzEwhkL+tl44ycvSnY6PIe6rW2HLxsw61Z3WFwAiU8+xMMtMZpg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-css-cascade-layers@3.8.1': - resolution: {integrity: sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-css-cascade-layers@3.9.1': + resolution: {integrity: sha512-/QyW2gRCk/XE3ttCK/ERIgle8KJ024dBNKMu6U5SmpJvuT2il1n5jR/48Pp/9wEwut8WVml4imNm6X8JsL5A0Q==} + engines: {node: '>=20.0'} - '@docusaurus/plugin-debug@3.8.1': - resolution: {integrity: sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-debug@3.9.1': + resolution: {integrity: sha512-qPeAuk0LccC251d7jg2MRhNI+o7niyqa924oEM/AxnZJvIpMa596aAxkRImiAqNN6+gtLE1Hkrz/RHUH2HDGsA==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-analytics@3.8.1': - resolution: {integrity: sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-analytics@3.9.1': + resolution: {integrity: sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-gtag@3.8.1': - resolution: {integrity: sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-gtag@3.9.1': + resolution: {integrity: sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-tag-manager@3.8.1': - resolution: {integrity: sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-google-tag-manager@3.9.1': + resolution: {integrity: sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-sitemap@3.8.1': - resolution: {integrity: sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-sitemap@3.9.1': + resolution: {integrity: sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-svgr@3.8.1': - resolution: {integrity: sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==} - engines: {node: '>=18.0'} + '@docusaurus/plugin-svgr@3.9.1': + resolution: {integrity: sha512-TeZOXT2PSdTNR1OpDJMkYqFyX7MMhbd4t16hQByXksgZQCXNyw3Dio+KaDJ2Nj+LA4WkOvsk45bWgYG5MAaXSQ==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/preset-classic@3.8.1': - resolution: {integrity: sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==} - engines: {node: '>=18.0'} + '@docusaurus/preset-classic@3.9.1': + resolution: {integrity: sha512-ZHga2xsxxsyd0dN1BpLj8S889Eu9eMBuj2suqxdw/vaaXu/FjJ8KEGbcaeo6nHPo8VQcBBnPEdkBtSDm2TfMNw==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -1784,56 +1804,52 @@ packages: peerDependencies: react: '*' - '@docusaurus/theme-classic@3.8.1': - resolution: {integrity: sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==} - engines: {node: '>=18.0'} + '@docusaurus/theme-classic@3.9.1': + resolution: {integrity: sha512-LrAIu/mQ04nG6s1cssC0TMmICD8twFIIn/hJ5Pd9uIPQvtKnyAKEn12RefopAul5KfMo9kixPaqogV5jIJr26w==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-common@3.8.1': - resolution: {integrity: sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==} - engines: {node: '>=18.0'} + '@docusaurus/theme-common@3.9.1': + resolution: {integrity: sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==} + engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-search-algolia@3.8.1': - resolution: {integrity: sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==} - engines: {node: '>=18.0'} + '@docusaurus/theme-search-algolia@3.9.1': + resolution: {integrity: sha512-WjM28bzlgfT6nHlEJemkwyGVpvGsZWPireV/w+wZ1Uo64xCZ8lNOb4xwQRukDaLSed3oPBN0gSnu06l5VuCXHg==} + engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-translations@3.8.1': - resolution: {integrity: sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==} - engines: {node: '>=18.0'} + '@docusaurus/theme-translations@3.9.1': + resolution: {integrity: sha512-mUQd49BSGKTiM6vP9+JFgRJL28lMIN3PUvXjF3rzuOHMByUZUBNwCt26Z23GkKiSIOrRkjKoaBNTipR/MHdYSQ==} + engines: {node: '>=20.0'} - '@docusaurus/tsconfig@3.8.1': - resolution: {integrity: sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==} + '@docusaurus/tsconfig@3.9.1': + resolution: {integrity: sha512-stdzM1dNDgRO0OvxeznXlE3N1igUoeHPNJjiKqyffLizgpVgNXJBAWeG6fuoYiCH4udGUBqy2dyM+1+kG2/UPQ==} - '@docusaurus/types@3.8.1': - resolution: {integrity: sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==} + '@docusaurus/types@3.9.1': + resolution: {integrity: sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/utils-common@3.8.1': - resolution: {integrity: sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==} - engines: {node: '>=18.0'} - - '@docusaurus/utils-validation@3.8.1': - resolution: {integrity: sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==} - engines: {node: '>=18.0'} + '@docusaurus/utils-common@3.9.1': + resolution: {integrity: sha512-4M1u5Q8Zn2CYL2TJ864M51FV4YlxyGyfC3x+7CLuR6xsyTVNBNU4QMcPgsTHRS9J2+X6Lq7MyH6hiWXyi/sXUQ==} + engines: {node: '>=20.0'} - '@docusaurus/utils@3.8.1': - resolution: {integrity: sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==} - engines: {node: '>=18.0'} + '@docusaurus/utils-validation@3.9.1': + resolution: {integrity: sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ==} + engines: {node: '>=20.0'} - '@dotenvx/dotenvx@1.48.4': - resolution: {integrity: sha512-GpJWpGVI5JGhNzFlWOjCD3KMiN3xU1US4oLKQ7SiiGru4LvR7sUf3pDMpfjtlgzHStL5ydq4ekfZcRxWpHaJkA==} - hasBin: true + '@docusaurus/utils@3.9.1': + resolution: {integrity: sha512-YAL4yhhWLl9DXuf5MVig260a6INz4MehrBGFU/CZu8yXmRiYEuQvRFWh9ZsjfAOyaG7za1MNmBVZ4VVAi/CiJA==} + engines: {node: '>=20.0'} '@dotenvx/dotenvx@1.51.0': resolution: {integrity: sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww==} @@ -2244,6 +2260,42 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.0': + resolution: {integrity: sha512-6RX+W5a+ZUY/c/7J5s5jK9UinLfJo5oWKh84fb4X0yK2q4WXEWUWZWuEMjvCb1YNUQhEAhUfr5scEGOH7jC4YQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.20.0': + resolution: {integrity: sha512-adcXFVorSQULtT4XDL0giRLr2EVGIcyWm6eQKZWTrRA4EEydGOY8QVQtL0PaITQpUyu+lOd/QOicw6vdy1v8QQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2327,9 +2379,6 @@ packages: '@mjackson/node-fetch-server@0.2.0': resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} - '@mjackson/node-fetch-server@0.7.0': - resolution: {integrity: sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==} - '@module-federation/error-codes@0.18.0': resolution: {integrity: sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==} @@ -3582,8 +3631,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.1': - resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -3622,201 +3671,101 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.50.2': - resolution: {integrity: sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.52.4': resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.2': - resolution: {integrity: sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.52.4': resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.2': - resolution: {integrity: sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.52.4': resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.2': - resolution: {integrity: sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.52.4': resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.2': - resolution: {integrity: sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.52.4': resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.2': - resolution: {integrity: sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.4': resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.2': - resolution: {integrity: sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.2': - resolution: {integrity: sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.4': resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.2': - resolution: {integrity: sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.4': resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.2': - resolution: {integrity: sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.4': resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.50.2': - resolution: {integrity: sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.4': resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.2': - resolution: {integrity: sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.4': resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.2': - resolution: {integrity: sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.4': resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.2': - resolution: {integrity: sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.4': resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.2': - resolution: {integrity: sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.4': resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.2': - resolution: {integrity: sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.4': resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.2': - resolution: {integrity: sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.4': resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.2': - resolution: {integrity: sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.52.4': resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.2': - resolution: {integrity: sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.52.4': resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.2': - resolution: {integrity: sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.4': resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] @@ -3827,11 +3776,6 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.2': - resolution: {integrity: sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.4': resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} cpu: [x64] @@ -4093,6 +4037,9 @@ packages: '@slorber/remark-comment@1.0.0': resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -4853,9 +4800,6 @@ packages: '@types/express-serve-static-core@4.19.7': resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - '@types/express-serve-static-core@5.1.0': - resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} - '@types/express@4.17.23': resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} @@ -4999,8 +4943,8 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -5053,6 +4997,10 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vercel/oidc@3.0.2': + resolution: {integrity: sha512-JekxQ0RApo4gS4un/iMGsIL1/k4KUBe3HmnGcDvzHuFBdQdudEJgTqcsJC7y6Ul4Yw5CeykgvQbX2XeEJd0+DA==} + engines: {node: '>= 20'} + '@vis.gl/react-mapbox@8.1.0': resolution: {integrity: sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==} peerDependencies: @@ -5073,13 +5021,6 @@ packages: maplibre-gl: optional: true - '@vitejs/plugin-rsc@0.4.11': - resolution: {integrity: sha512-+4H4wLi+Y9yF58znBfKgGfX8zcqUGt8ngnmNgzrdGdF1SVz7EO0sg7WnhK5fFVHt6fUxsVEjmEabsCWHKPL1Tw==} - peerDependencies: - react: '*' - react-dom: '*' - vite: '*' - '@vitest/coverage-v8@3.2.4': resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: @@ -5210,6 +5151,12 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ai@5.0.70: + resolution: {integrity: sha512-srJV++Ml1X8I33gTiiJQpq6GUbAv5ivjSzDzzF9SM4d25zq+/m+zTtHBb794tYKTz2PgbJ3oop9+gU50ZdCLbQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -5485,6 +5432,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + but-unzip@0.1.7: resolution: {integrity: sha512-fGmYleG7dAYaoqMVZCoM6zjSeaIYNlyVreUVyUkVPtPLRTbKq8J8KdNnyqMaiLqun7P9bBuSMeqJs0YxN86GJA==} @@ -5781,10 +5732,6 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - copy-text-to-clipboard@3.2.2: - resolution: {integrity: sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==} - engines: {node: '>=12'} - copy-webpack-plugin@11.0.0: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} @@ -6073,9 +6020,13 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} @@ -6089,6 +6040,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -6199,98 +6154,6 @@ packages: resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==} hasBin: true - drizzle-orm@0.44.4: - resolution: {integrity: sha512-ZyzKFpTC/Ut3fIqc2c0dPZ6nhchQXriTsqTNs4ayRgl6sZcFlMs9QZKPSHXK4bdOf41GHGWf+FrpcDDYwW+W6Q==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=4' - '@electric-sql/pglite': '>=0.2.0' - '@libsql/client': '>=0.10.0' - '@libsql/client-wasm': '>=0.10.0' - '@neondatabase/serverless': '>=0.10.0' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1.13' - '@prisma/client': '*' - '@tidbcloud/serverless': '*' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' - '@vercel/postgres': '>=0.8.0' - '@xata.io/client': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=14.0.0' - gel: '>=2' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - prisma: '*' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@libsql/client-wasm': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@prisma/client': - optional: true - '@tidbcloud/serverless': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@upstash/redis': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - gel: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - prisma: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - drizzle-orm@0.44.6: resolution: {integrity: sha512-uy6uarrrEOc9K1u5/uhBFJbdF5VJ5xQ/Yzbecw3eAYOunv5FDeYkR2m8iitocdHBOHbvorviKOW5GVw0U1j4LQ==} peerDependencies: @@ -6606,6 +6469,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -6806,9 +6673,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-monkey@1.1.0: - resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6910,6 +6774,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -6922,10 +6792,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} @@ -7068,9 +6934,6 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -7166,6 +7029,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -7215,10 +7082,6 @@ packages: resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} engines: {node: '>=12'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -7311,6 +7174,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -7342,6 +7210,11 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -7357,6 +7230,10 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + is-npm@6.1.0: resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7400,9 +7277,6 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.3: - resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -7462,6 +7336,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + is-yarn-global@0.4.1: resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} @@ -7579,6 +7457,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stringify-pretty-compact@3.0.0: resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==} @@ -7853,8 +7734,8 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.544.0: - resolution: {integrity: sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==} + lucide-react@0.545.0: + resolution: {integrity: sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -7903,6 +7784,11 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@16.4.0: + resolution: {integrity: sha512-CTPAcRBq57cn3R8n3hwc2REddc28hjR7RzDXQ+lXLmMJYqn20BaI2cGw6QjgZGIgVfp2Wdfw4aMzgNteQ6qJgQ==} + engines: {node: '>= 20'} + hasBin: true + marked@7.0.4: resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} engines: {node: '>= 16'} @@ -7987,9 +7873,8 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@4.49.0: + resolution: {integrity: sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==} meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} @@ -8159,6 +8044,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -8423,6 +8312,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8490,9 +8383,9 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} @@ -8562,10 +8455,6 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} @@ -8614,9 +8503,6 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - periscopic@4.0.2: - resolution: {integrity: sha512-sqpQDUy8vgB7ycLkendSKS6HnVz1Rneoc3Rc+ZBUCe2pbqlVuCC5vF52l0NJ1aiMg/r1qfYF9/myz8CZeI2rjA==} - pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -9267,8 +9153,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-day-picker@9.10.0: - resolution: {integrity: sha512-tedecLSd+fpSN+J08601MaMsf122nxtqZXxB6lwX37qFoLtuPNuRJN8ylxFjLhyJS1kaLfAqL1GUkSLd2BMrpQ==} + react-day-picker@9.11.1: + resolution: {integrity: sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw==} engines: {node: '>=18'} peerDependencies: react: '>=16.8.0' @@ -9551,8 +9437,8 @@ packages: peerDependencies: react-router: '>=7.9.0' - remix-utils@8.8.0: - resolution: {integrity: sha512-5CR4a3YwPaCoPUHg+O69UMek05tnFMrtQsoXTU4KzsyU7heDO94IFTjKVzEFhi+s+SSo+ebRMxWvjf/QiPpqiQ==} + remix-utils@9.0.0: + resolution: {integrity: sha512-xpDnw6hIjYbHR9/noE4lKNPRzfxvGai3XBQcjOjcwIwZVW9O1bdsnYAl+aqJ2fMXSQTNMjNuR8Cetn76HqwXCg==} engines: {node: '>=20.0.0'} peerDependencies: '@edgefirst-dev/batcher': ^1.0.0 @@ -9565,7 +9451,6 @@ packages: is-ip: ^5.0.1 react: ^18.0.0 || ^19.0.0 react-router: ^7.0.0 - zod: ^3.22.4 peerDependenciesMeta: '@edgefirst-dev/batcher': optional: true @@ -9585,9 +9470,7 @@ packages: optional: true react: optional: true - react-router: - optional: true - zod: + react-router: optional: true renderkid@3.0.0: @@ -9655,11 +9538,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - robust-predicates@2.0.4: resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} @@ -9671,11 +9549,6 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.50.2: - resolution: {integrity: sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.52.4: resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -9689,6 +9562,10 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -10000,9 +9877,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -10072,8 +9946,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} @@ -10129,6 +10003,11 @@ packages: sweepline-intersections@1.5.0: resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} @@ -10177,6 +10056,16 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -10213,8 +10102,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -10248,6 +10137,12 @@ packages: resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} engines: {node: '>= 0.4'} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -10298,9 +10193,6 @@ packages: cpu: [arm64] os: [linux] - turbo-stream@3.1.0: - resolution: {integrity: sha512-tVI25WEXl4fckNEmrq70xU1XumxUwEx/FZD5AgEcV8ri7Wvrg2o7GEq8U7htrNx3CajciGm+kDyhRf5JB6t7/A==} - turbo-windows-64@2.5.8: resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} cpu: [x64] @@ -10381,23 +10273,18 @@ packages: peerDependencies: typedoc: 0.28.x - typedoc-plugin-missing-exports@4.1.0: - resolution: {integrity: sha512-p1M5jXnEbQ4qqy0erJz41BBZEDb8XDrbLjndlH4RhYEcymbdQr0xLF6yUw1GWBrhSIfkU98m3BELMAiQh+R1zA==} + typedoc-plugin-missing-exports@4.1.2: + resolution: {integrity: sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==} peerDependencies: typedoc: ^0.28.1 - typedoc@0.28.13: - resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + typedoc@0.28.14: + resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -10651,14 +10538,6 @@ packages: yaml: optional: true - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - peerDependenciesMeta: - vite: - optional: true - vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -10711,18 +10590,21 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true - webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + engines: {node: '>= 18.12.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true - webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5.0.0 webpack-cli: '*' peerDependenciesMeta: webpack: @@ -10856,6 +10738,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -10901,9 +10787,6 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - zimmerframe@1.1.4: - resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -10936,6 +10819,34 @@ packages: snapshots: + '@ai-sdk/gateway@1.0.40(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@vercel/oidc': 3.0.2 + zod: 4.1.12 + + '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@2.0.70(react@19.2.0)(zod@4.1.12)': + dependencies: + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + ai: 5.0.70(zod@4.1.12) + react: 19.2.0 + swr: 2.3.6(react@19.2.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 4.1.12 + '@algolia/abtesting@1.6.0': dependencies: '@algolia/client-common': 5.40.0 @@ -10943,30 +10854,24 @@ snapshots: '@algolia/requester-fetch': 5.40.0 '@algolia/requester-node-http': 5.40.0 - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) - '@algolia/client-search': 5.40.0 - algoliasearch: 5.40.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: '@algolia/client-search': 5.40.0 algoliasearch: 5.40.0 @@ -12307,14 +12212,17 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@docsearch/css@3.9.0': {} + '@docsearch/css@4.2.0': {} - '@docsearch/react@3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)': + '@docsearch/react@4.2.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) - '@docsearch/css': 3.9.0 + '@ai-sdk/react': 2.0.70(react@19.2.0)(zod@4.1.12) + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@docsearch/css': 4.2.0 + ai: 5.0.70(zod@4.1.12) algoliasearch: 5.40.0 + marked: 16.4.0 + zod: 4.1.12 optionalDependencies: '@types/react': 19.2.2 react: 19.2.0 @@ -12323,7 +12231,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/babel@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/babel@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -12335,8 +12243,8 @@ snapshots: '@babel/runtime': 7.28.4 '@babel/runtime-corejs3': 7.28.4 '@babel/traverse': 7.28.4 - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) babel-plugin-dynamic-import-node: 2.3.3 fs-extra: 11.3.2 tslib: 2.8.1 @@ -12349,14 +12257,14 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/bundler@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: '@babel/core': 7.28.4 - '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/cssnano-preset': 3.8.1 - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/babel': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/cssnano-preset': 3.9.1 + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.102.1(@swc/core@1.13.5)) clean-css: 5.3.3 copy-webpack-plugin: 11.0.0(webpack@5.102.1(@swc/core@1.13.5)) @@ -12368,7 +12276,7 @@ snapshots: mini-css-extract-plugin: 2.9.4(webpack@5.102.1(@swc/core@1.13.5)) null-loader: 4.0.1(webpack@5.102.1(@swc/core@1.13.5)) postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.102.1(@swc/core@1.13.5)) + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.9.3)(webpack@5.102.1(@swc/core@1.13.5)) postcss-preset-env: 10.4.0(postcss@8.5.6) terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.102.1(@swc/core@1.13.5)) tslib: 2.8.1 @@ -12376,7 +12284,7 @@ snapshots: webpack: 5.102.1(@swc/core@1.13.5) webpackbar: 6.0.1(webpack@5.102.1(@swc/core@1.13.5)) optionalDependencies: - '@docusaurus/faster': 3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + '@docusaurus/faster': 3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -12392,15 +12300,15 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/core@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/babel': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/bundler': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/babel': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/bundler': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) boxen: 6.2.1 chalk: 4.1.2 @@ -12437,7 +12345,7 @@ snapshots: update-notifier: 6.0.2 webpack: 5.102.1(@swc/core@1.13.5) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.102.1(@swc/core@1.13.5)) + webpack-dev-server: 5.2.2(webpack@5.102.1(@swc/core@1.13.5)) webpack-merge: 6.0.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12456,16 +12364,16 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/cssnano-preset@3.8.1': + '@docusaurus/cssnano-preset@3.9.1': dependencies: cssnano-preset-advanced: 6.1.2(postcss@8.5.6) postcss: 8.5.6 postcss-sort-media-queries: 5.2.0(postcss@8.5.6) tslib: 2.8.1 - '@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': + '@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@rspack/core': 1.5.8 '@swc/core': 1.13.5 '@swc/html': 1.13.20 @@ -12480,16 +12388,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/logger@3.8.1': + '@docusaurus/logger@3.9.1': dependencies: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/mdx-loader@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 @@ -12520,9 +12428,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/module-type-aliases@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 @@ -12538,17 +12446,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': - dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-blog@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.3.2 @@ -12579,17 +12487,17 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': - dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.2 @@ -12619,13 +12527,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-content-pages@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -12649,12 +12557,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-css-cascade-layers@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -12676,11 +12584,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-debug@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -12704,11 +12612,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-google-analytics@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 @@ -12730,11 +12638,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-google-gtag@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/gtag.js': 0.0.12 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -12757,11 +12665,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-google-tag-manager@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 @@ -12783,14 +12691,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-sitemap@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -12814,14 +12722,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': + '@docusaurus/plugin-svgr@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/webpack': 8.1.0(typescript@5.9.2) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/webpack': 8.1.0(typescript@5.9.3) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 @@ -12844,23 +12752,23 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2)': - dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-css-cascade-layers': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-debug': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-google-analytics': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-google-gtag': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-google-tag-manager': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-sitemap': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-svgr': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/theme-classic': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2) - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/preset-classic@3.9.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-css-cascade-layers': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-debug': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-google-analytics': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-google-gtag': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-google-tag-manager': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-sitemap': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-svgr': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/theme-classic': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-search-algolia': 3.9.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -12889,24 +12797,23 @@ snapshots: '@types/react': 19.2.2 react: 19.2.0 - '@docusaurus/theme-classic@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': - dependencies: - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/plugin-content-pages': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-classic@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-translations': 3.9.1 + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) clsx: 2.1.1 - copy-text-to-clipboard: 3.2.2 infima: 0.2.0-alpha.45 lodash: 4.17.21 nprogress: 0.2.0 @@ -12937,13 +12844,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/theme-common@3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/mdx-loader': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 '@types/react': 19.2.2 '@types/react-router-config': 5.0.11 @@ -12961,16 +12868,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.2)': + '@docusaurus/theme-search-algolia@3.9.1(@algolia/client-search@5.40.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)': dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3) - '@docusaurus/core': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/logger': 3.8.1 - '@docusaurus/plugin-content-docs': 3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docsearch/react': 4.2.0(@algolia/client-search@5.40.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3) + '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/logger': 3.9.1 + '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-translations': 3.9.1 + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) algoliasearch: 5.40.0 algoliasearch-helper: 3.26.0(algoliasearch@5.40.0) clsx: 2.1.1 @@ -13002,17 +12909,18 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-translations@3.8.1': + '@docusaurus/theme-translations@3.9.1': dependencies: fs-extra: 11.3.2 tslib: 2.8.1 - '@docusaurus/tsconfig@3.8.1': {} + '@docusaurus/tsconfig@3.9.1': {} - '@docusaurus/types@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 + '@types/mdast': 4.0.4 '@types/react': 19.2.2 commander: 5.1.0 joi: 17.13.3 @@ -13029,9 +12937,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils-common@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' @@ -13042,11 +12950,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils-validation@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/logger': 3.9.1 + '@docusaurus/utils': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 joi: 17.13.3 js-yaml: 4.1.0 @@ -13061,11 +12969,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.8.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/logger': 3.9.1 + '@docusaurus/types': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) escape-string-regexp: 4.0.0 execa: 5.1.1 file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.13.5)) @@ -13093,18 +13001,6 @@ snapshots: - uglify-js - webpack-cli - '@dotenvx/dotenvx@1.48.4': - dependencies: - commander: 11.1.0 - dotenv: 17.2.3 - eciesjs: 0.4.16 - execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.3) - ignore: 5.3.2 - object-treeify: 1.1.33 - picomatch: 4.0.3 - which: 4.0.0 - '@dotenvx/dotenvx@1.51.0': dependencies: commander: 11.1.0 @@ -13398,6 +13294,41 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.20.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + '@leichtgewicht/ip-codec@2.0.5': {} '@levischuck/tiny-cbor@0.2.11': {} @@ -13533,9 +13464,6 @@ snapshots: '@mjackson/node-fetch-server@0.2.0': {} - '@mjackson/node-fetch-server@0.7.0': - optional: true - '@module-federation/error-codes@0.18.0': {} '@module-federation/runtime-core@0.18.0': @@ -14860,7 +14788,7 @@ snapshots: dependencies: react: 19.2.0 - '@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -14893,7 +14821,6 @@ snapshots: vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) optionalDependencies: '@react-router/serve': 7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) - '@vitejs/plugin-rsc': 0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) typescript: 5.9.3 transitivePeerDependencies: - '@types/node' @@ -14919,9 +14846,9 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@react-router/fs-routes@7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)': + '@react-router/fs-routes@7.9.4(@react-router/dev@7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)': dependencies: - '@react-router/dev': 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)))(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + '@react-router/dev': 7.9.4(@react-router/serve@7.9.4(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3))(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(terser@5.44.0)(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) minimatch: 9.0.5 optionalDependencies: typescript: 5.9.3 @@ -14970,9 +14897,9 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} - '@rollup/plugin-commonjs@28.0.6(rollup@4.50.2)': + '@rollup/plugin-commonjs@28.0.6(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -14980,183 +14907,120 @@ snapshots: magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 - '@rollup/plugin-inject@5.0.5(rollup@4.50.2)': + '@rollup/plugin-inject@5.0.5(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) estree-walker: 2.0.2 magic-string: 0.30.19 optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 - '@rollup/plugin-json@6.1.0(rollup@4.50.2)': + '@rollup/plugin-json@6.1.0(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.50.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 - '@rollup/plugin-terser@0.4.4(rollup@4.50.2)': + '@rollup/plugin-terser@0.4.4(rollup@4.52.4)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.44.0 optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 - '@rollup/plugin-typescript@12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.9.2)': + '@rollup/plugin-typescript@12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.9.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) resolve: 1.22.10 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - rollup: 4.50.2 + rollup: 4.52.4 tslib: 2.8.1 - '@rollup/pluginutils@5.3.0(rollup@4.50.2)': + '@rollup/pluginutils@5.3.0(rollup@4.52.4)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.50.2 - - '@rollup/rollup-android-arm-eabi@4.50.2': - optional: true + rollup: 4.52.4 '@rollup/rollup-android-arm-eabi@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.50.2': - optional: true - '@rollup/rollup-android-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.50.2': - optional: true - '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.50.2': - optional: true - '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.50.2': - optional: true - '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.50.2': - optional: true - '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.2': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.2': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.2': - optional: true - '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.2': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.2': - optional: true - '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.50.2': - optional: true - '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-openharmony-arm64@4.50.2': - optional: true - '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.2': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.2': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true '@rollup/rollup-win32-x64-gnu@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.2': - optional: true - '@rollup/rollup-win32-x64-msvc@4.52.4': optional: true @@ -15482,6 +15346,8 @@ snapshots: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 + '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.4)': @@ -15528,12 +15394,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.4) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.4) - '@svgr/core@8.1.0(typescript@5.9.2)': + '@svgr/core@8.1.0(typescript@5.9.3)': dependencies: '@babel/core': 7.28.4 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -15544,35 +15410,35 @@ snapshots: '@babel/types': 7.28.4 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': dependencies: '@babel/core': 7.28.4 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) - '@svgr/core': 8.1.0(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.9.2) - cosmiconfig: 8.3.6(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@5.9.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/webpack@8.1.0(typescript@5.9.2)': + '@svgr/webpack@8.1.0(typescript@5.9.3)': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.4) '@babel/preset-env': 7.28.3(@babel/core@7.28.4) '@babel/preset-react': 7.27.1(@babel/core@7.28.4) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript @@ -16918,7 +16784,7 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.1.0 + '@types/express-serve-static-core': 4.19.7 '@types/node': 24.7.2 '@types/connect@3.4.38': @@ -16980,13 +16846,6 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 1.2.0 - '@types/express-serve-static-core@5.1.0': - dependencies: - '@types/node': 24.7.2 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.0 - '@types/express@4.17.23': dependencies: '@types/body-parser': 1.19.6 @@ -17144,11 +17003,11 @@ snapshots: dependencies: '@types/node': 24.7.2 - '@types/retry@0.12.0': {} + '@types/retry@0.12.2': {} '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 24.7.2 '@types/send@0.17.5': dependencies: @@ -17205,6 +17064,8 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vercel/oidc@3.0.2': {} + '@vis.gl/react-mapbox@8.1.0(mapbox-gl@3.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: react: 19.2.0 @@ -17218,20 +17079,6 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@vitejs/plugin-rsc@0.4.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': - dependencies: - '@mjackson/node-fetch-server': 0.7.0 - es-module-lexer: 1.7.0 - estree-walker: 3.0.3 - magic-string: 0.30.19 - periscopic: 4.0.2 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - turbo-stream: 3.1.0 - vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) - optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 @@ -17275,7 +17122,7 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 - strip-literal: 3.0.0 + strip-literal: 3.1.0 '@vitest/snapshot@3.2.4': dependencies: @@ -17285,7 +17132,7 @@ snapshots: '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.3 + tinyspy: 4.0.4 '@vitest/utils@3.2.4': dependencies: @@ -17409,6 +17256,14 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ai@5.0.70(zod@4.1.12): + dependencies: + '@ai-sdk/gateway': 1.0.40(zod@4.1.12) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@opentelemetry/api': 1.9.0 + zod: 4.1.12 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -17728,6 +17583,10 @@ snapshots: buffer-from@1.1.2: {} + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + but-unzip@0.1.7: {} bytes@3.0.0: {} @@ -18026,8 +17885,6 @@ snapshots: cookie@1.0.2: {} - copy-text-to-clipboard@3.2.2: {} - copy-webpack-plugin@11.0.0(webpack@5.102.1(@swc/core@1.13.5)): dependencies: fast-glob: 3.3.3 @@ -18048,14 +17905,14 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.9.2): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 cross-spawn@7.0.6: dependencies: @@ -18313,9 +18170,12 @@ snapshots: deepmerge@4.3.1: {} - default-gateway@6.0.3: + default-browser-id@5.0.0: {} + + default-browser@5.2.1: dependencies: - execa: 5.1.1 + bundle-name: 4.1.0 + default-browser-id: 5.0.0 defer-to-connect@2.0.1: {} @@ -18327,6 +18187,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -18372,10 +18234,10 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - docusaurus-plugin-typedoc@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): + docusaurus-plugin-typedoc@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))): dependencies: - typedoc-docusaurus-theme: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))) - typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + typedoc-docusaurus-theme: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) dom-converter@0.2.0: dependencies: @@ -18442,14 +18304,6 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.4(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7): - optionalDependencies: - '@electric-sql/pglite': 0.3.11 - '@opentelemetry/api': 1.9.0 - '@types/pg': 8.15.5 - kysely: 0.28.8 - postgres: 3.4.7 - drizzle-orm@0.44.6(@electric-sql/pglite@0.3.11)(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(postgres@3.4.7): optionalDependencies: '@electric-sql/pglite': 0.3.11 @@ -18761,6 +18615,8 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.6: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -19001,8 +18857,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-monkey@1.1.0: {} - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -19106,6 +18960,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.4.5: @@ -19126,15 +18984,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@9.3.5: dependencies: fs.realpath: 1.0.0 @@ -19373,8 +19222,6 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - html-entities@2.6.0: {} - html-escaper@2.0.2: {} html-minifier-terser@6.1.0: @@ -19498,6 +19345,8 @@ snapshots: human-signals@2.1.0: {} + hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -19536,11 +19385,6 @@ snapshots: infima@0.2.0-alpha.45: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.3: {} inherits@2.0.4: {} @@ -19628,6 +19472,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extendable@0.1.1: {} is-extendable@1.0.1: @@ -19656,6 +19502,10 @@ snapshots: is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 @@ -19667,6 +19517,8 @@ snapshots: is-negative-zero@2.0.3: {} + is-network-error@1.3.0: {} + is-npm@6.1.0: {} is-number-object@1.1.1: @@ -19696,11 +19548,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-reference@3.0.3: - dependencies: - '@types/estree': 1.0.8 - optional: true - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -19756,6 +19603,10 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + is-yarn-global@0.4.1: {} isarray@0.0.1: {} @@ -19866,6 +19717,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} + json-stringify-pretty-compact@3.0.0: {} json5@2.2.3: {} @@ -20073,7 +19926,7 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.544.0(react@19.2.0): + lucide-react@0.545.0(react@19.2.0): dependencies: react: 19.2.0 @@ -20150,6 +20003,8 @@ snapshots: markdown-table@3.0.4: {} + marked@16.4.0: {} + marked@7.0.4: {} martinez-polygon-clipping@0.7.4: @@ -20361,9 +20216,14 @@ snapshots: media-typer@0.3.0: {} - memfs@3.5.3: + memfs@4.49.0: dependencies: - fs-monkey: 1.1.0 + '@jsonjoy.com/json-pack': 1.20.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 meow@9.0.0: dependencies: @@ -20704,6 +20564,10 @@ snapshots: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mimic-fn@2.1.0: {} @@ -20941,6 +20805,13 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@10.2.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -21002,9 +20873,10 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 - p-retry@4.6.2: + p-retry@6.2.1: dependencies: - '@types/retry': 0.12.0 + '@types/retry': 0.12.2 + is-network-error: 1.3.0 retry: 0.13.1 p-timeout@3.2.0: @@ -21085,8 +20957,6 @@ snapshots: path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} path-key@3.1.1: {} @@ -21125,13 +20995,6 @@ snapshots: peberminta@0.9.0: {} - periscopic@4.0.2: - dependencies: - '@types/estree': 1.0.8 - is-reference: 3.0.3 - zimmerframe: 1.1.4 - optional: true - pg-int8@1.0.1: {} pg-protocol@1.10.3: {} @@ -21311,9 +21174,9 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.2)(webpack@5.102.1(@swc/core@1.13.5)): + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.9.3)(webpack@5.102.1(@swc/core@1.13.5)): dependencies: - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) jiti: 1.21.7 postcss: 8.5.6 semver: 7.7.3 @@ -21840,7 +21703,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-day-picker@9.10.0(react@19.2.0): + react-day-picker@9.11.1(react@19.2.0): dependencies: '@date-fns/tz': 1.4.1 date-fns: 4.1.0 @@ -22234,13 +22097,13 @@ snapshots: react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) zod: 3.25.76 - remix-utils@8.8.0(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(zod@3.25.76): + remix-utils@9.0.0(@standard-schema/spec@1.0.0)(react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0): dependencies: type-fest: 4.41.0 optionalDependencies: + '@standard-schema/spec': 1.0.0 react: 19.2.0 react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - zod: 3.25.76 renderkid@3.0.0: dependencies: @@ -22300,45 +22163,14 @@ snapshots: reusify@1.1.0: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - robust-predicates@2.0.4: {} robust-predicates@3.0.2: {} - rollup-plugin-polyfill-node@0.13.0(rollup@4.50.2): - dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.50.2) - rollup: 4.50.2 - - rollup@4.50.2: + rollup-plugin-polyfill-node@0.13.0(rollup@4.52.4): dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.2 - '@rollup/rollup-android-arm64': 4.50.2 - '@rollup/rollup-darwin-arm64': 4.50.2 - '@rollup/rollup-darwin-x64': 4.50.2 - '@rollup/rollup-freebsd-arm64': 4.50.2 - '@rollup/rollup-freebsd-x64': 4.50.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.2 - '@rollup/rollup-linux-arm-musleabihf': 4.50.2 - '@rollup/rollup-linux-arm64-gnu': 4.50.2 - '@rollup/rollup-linux-arm64-musl': 4.50.2 - '@rollup/rollup-linux-loong64-gnu': 4.50.2 - '@rollup/rollup-linux-ppc64-gnu': 4.50.2 - '@rollup/rollup-linux-riscv64-gnu': 4.50.2 - '@rollup/rollup-linux-riscv64-musl': 4.50.2 - '@rollup/rollup-linux-s390x-gnu': 4.50.2 - '@rollup/rollup-linux-x64-gnu': 4.50.2 - '@rollup/rollup-linux-x64-musl': 4.50.2 - '@rollup/rollup-openharmony-arm64': 4.50.2 - '@rollup/rollup-win32-arm64-msvc': 4.50.2 - '@rollup/rollup-win32-ia32-msvc': 4.50.2 - '@rollup/rollup-win32-x64-msvc': 4.50.2 - fsevents: 2.3.3 + '@rollup/plugin-inject': 5.0.5(rollup@4.52.4) + rollup: 4.52.4 rollup@4.52.4: dependencies: @@ -22377,6 +22209,8 @@ snapshots: postcss: 8.5.6 strip-json-comments: 3.1.1 + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -22736,8 +22570,6 @@ snapshots: std-env@3.10.0: {} - std-env@3.9.0: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -22819,7 +22651,7 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -22884,6 +22716,12 @@ snapshots: dependencies: tinyqueue: 2.0.3 + swr@2.3.6(react@19.2.0): + dependencies: + dequal: 2.0.3 + react: 19.2.0 + use-sync-external-store: 1.6.0(react@19.2.0) + tailwind-merge@3.3.1: {} tailwindcss-animate@1.0.7(tailwindcss@4.1.14): @@ -22928,6 +22766,12 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + throttleit@2.1.0: {} + thunky@1.1.0: {} tiny-invariant@1.3.3: {} @@ -22953,7 +22797,7 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} + tinyspy@4.0.4: {} to-regex-range@5.0.1: dependencies: @@ -22985,6 +22829,10 @@ snapshots: typedarray.prototype.slice: 1.0.5 which-typed-array: 1.1.19 + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + trim-lines@3.0.1: {} trim-newlines@3.0.1: {} @@ -23015,9 +22863,6 @@ snapshots: turbo-linux-arm64@2.5.8: optional: true - turbo-stream@3.1.0: - optional: true - turbo-windows-64@2.5.8: optional: true @@ -23100,29 +22945,27 @@ snapshots: typed-array-buffer: 1.0.3 typed-array-byte-offset: 1.0.4 - typedoc-docusaurus-theme@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2))): + typedoc-docusaurus-theme@1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))): dependencies: - typedoc-plugin-markdown: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.14(typescript@5.9.3)) - typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): + typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)): dependencies: - typedoc: 0.28.13(typescript@5.9.2) + typedoc: 0.28.14(typescript@5.9.3) - typedoc-plugin-missing-exports@4.1.0(typedoc@0.28.13(typescript@5.9.2)): + typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.14(typescript@5.9.3)): dependencies: - typedoc: 0.28.13(typescript@5.9.2) + typedoc: 0.28.14(typescript@5.9.3) - typedoc@0.28.13(typescript@5.9.2): + typedoc@0.28.14(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 3.13.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.2 + typescript: 5.9.3 yaml: 2.8.1 - typescript@5.9.2: {} - typescript@5.9.3: {} typewise-core@1.2.0: {} @@ -23384,11 +23227,6 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)): - optionalDependencies: - vite: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - optional: true - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 @@ -23405,7 +23243,7 @@ snapshots: magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 @@ -23466,20 +23304,23 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@5.3.4(webpack@5.102.1(@swc/core@1.13.5)): + webpack-dev-middleware@7.4.5(webpack@5.102.1(@swc/core@1.13.5)): dependencies: colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 + memfs: 4.49.0 + mime-types: 3.0.1 + on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 + optionalDependencies: webpack: 5.102.1(@swc/core@1.13.5) - webpack-dev-server@4.15.2(webpack@5.102.1(@swc/core@1.13.5)): + webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.13.5)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.23 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.9 '@types/sockjs': 0.3.36 @@ -23490,22 +23331,19 @@ snapshots: colorette: 2.0.20 compression: 1.8.1 connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 express: 4.21.2 graceful-fs: 4.2.11 - html-entities: 2.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 launch-editor: 2.11.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 + open: 10.2.0 + p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.102.1(@swc/core@1.13.5)) + webpack-dev-middleware: 7.4.5(webpack@5.102.1(@swc/core@1.13.5)) ws: 8.18.3 optionalDependencies: webpack: 5.102.1(@swc/core@1.13.5) @@ -23679,6 +23517,10 @@ snapshots: ws@8.18.3: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xdg-basedir@5.1.0: {} xml-js@1.6.11: @@ -23705,9 +23547,6 @@ snapshots: yocto-queue@1.2.1: {} - zimmerframe@1.1.4: - optional: true - zod@3.25.76: {} zod@4.1.12: {} From 78e376ae4da6569e6697cf1daa8e9281eed582bf Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 09:58:17 +0200 Subject: [PATCH 041/243] refactor: move vite-node to devDependency and fix docusaures/faster --- fdm-app/package.json | 2 +- fdm-docs/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fdm-app/package.json b/fdm-app/package.json index dad58b4d4..1e9a164f6 100644 --- a/fdm-app/package.json +++ b/fdm-app/package.json @@ -76,7 +76,6 @@ "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", "validator": "^13.15.15", - "vite-node": "^3.2.4", "zod": "^3.25.76", "zustand": "^5.0.8" }, @@ -101,6 +100,7 @@ "tailwindcss": "^4.1.14", "typescript": "catalog:", "vite": "catalog:", + "vite-node": "^3.2.4", "vite-tsconfig-paths": "catalog:" }, "engines": { diff --git a/fdm-docs/package.json b/fdm-docs/package.json index daf8cc50f..2fd17d736 100644 --- a/fdm-docs/package.json +++ b/fdm-docs/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@docusaurus/core": "3.9.1", - "@docusaurus/faster": "^3.9.1", + "@docusaurus/faster": "3.9.1", "@docusaurus/preset-classic": "3.9.1", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ce7e0eda..6a959257b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -265,9 +265,6 @@ importers: validator: specifier: ^13.15.15 version: 13.15.15 - vite-node: - specifier: ^3.2.4 - version: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -326,6 +323,9 @@ importers: vite: specifier: 'catalog:' version: 7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: 'catalog:' version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) @@ -513,7 +513,7 @@ importers: specifier: 3.9.1 version: 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.5.8)(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) '@docusaurus/faster': - specifier: ^3.9.1 + specifier: 3.9.1 version: 3.9.1(@docusaurus/types@3.9.1(@swc/core@1.13.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) '@docusaurus/preset-classic': specifier: 3.9.1 From c939de9e7e08cbf09cdf1e270176c8bd46dc6ecb Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:07:48 +0200 Subject: [PATCH 042/243] feat: Add the table `intending_grazing` to store if the farm is planning to perform grazing --- .changeset/moody-paths-ask.md | 5 +++++ fdm-core/src/db/schema.ts | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .changeset/moody-paths-ask.md diff --git a/.changeset/moody-paths-ask.md b/.changeset/moody-paths-ask.md new file mode 100644 index 000000000..f5951fb7f --- /dev/null +++ b/.changeset/moody-paths-ask.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Add the table `intending_grazing` to store if the farm is planning to perform grazing diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index 64b4e6e28..c7b0e672d 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -37,7 +37,10 @@ export type farmsTypeInsert = typeof farms.$inferInsert export const acquiringMethodOptions = [ { value: "nl_01", label: "Eigendom" }, { value: "nl_02", label: "Reguliere pacht" }, - { value: "nl_03", label: "In gebruik van een terreinbeherende organisatie" }, + { + value: "nl_03", + label: "In gebruik van een terreinbeherende organisatie", + }, { value: "nl_04", label: "Tijdelijk gebruik in het kader van landinrichting", @@ -836,6 +839,28 @@ export type organicCertificationsHoldingTypeSelect = export type organicCertificationsHoldingTypeInsert = typeof organicCertificationsHolding.$inferInsert +// Define intending_grazing table +export const intendingGrazing = fdmSchema.table( + "intending_grazing", + { + b_id_farm: text().primaryKey(), + b_grazing_intention: boolean().notNull(), + b_grazing_intention_year: integer().notNull(), + created: timestamp({ withTimezone: true }).notNull().defaultNow(), + updated: timestamp({ withTimezone: true }), + }, + (table) => { + return [ + { + pk: primaryKey({ columns: [table.b_id_farm, table.b_grazing_intention_year] }), + }, + ] + }, +) + +export type intendingGrazingTypeSelect = typeof intendingGrazing.$inferSelect +export type intendingGrazingTypeInsert = typeof intendingGrazing.$inferInsert + // Define fertilizer_catalogue_enabling table export const fertilizerCatalogueEnabling = fdmSchema.table( "fertilizer_catalogue_enabling", From a00a331a6eb9e711eb80a6f304a561eec812bda2 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:09:23 +0200 Subject: [PATCH 043/243] feat: Add the functions `setGrazingIntention`, `removeGrazingIntention`, `getGrazingIntention` and `getGrazingIntentions` to manage if a farm is planning to do grazing --- .changeset/few-loops-play.md | 5 + fdm-core/src/grazing_intention.test.ts | 145 +++++++++++++++++++ fdm-core/src/grazing_intention.ts | 190 +++++++++++++++++++++++++ fdm-core/src/index.ts | 6 + 4 files changed, 346 insertions(+) create mode 100644 .changeset/few-loops-play.md create mode 100644 fdm-core/src/grazing_intention.test.ts create mode 100644 fdm-core/src/grazing_intention.ts diff --git a/.changeset/few-loops-play.md b/.changeset/few-loops-play.md new file mode 100644 index 000000000..603c5f9a3 --- /dev/null +++ b/.changeset/few-loops-play.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-core": minor +--- + +Add the functions `setGrazingIntention`, `removeGrazingIntention`, `getGrazingIntention` and `getGrazingIntentions` to manage if a farm is planning to do grazing diff --git a/fdm-core/src/grazing_intention.test.ts b/fdm-core/src/grazing_intention.test.ts new file mode 100644 index 000000000..81b6137e1 --- /dev/null +++ b/fdm-core/src/grazing_intention.test.ts @@ -0,0 +1,145 @@ +import { beforeEach, describe, expect, inject, it } from "vitest" +import { addFarm } from "./farm" +import type { FdmType } from "./fdm" +import { createFdmServer } from "./fdm-server" +import { + getGrazingIntention, + getGrazingIntentions, + removeGrazingIntention, + setGrazingIntention, +} from "./grazing_intention" + +describe("Grazing Intention", () => { + let fdm: FdmType + let principal_id: string + let b_id_farm: string + + beforeEach(async () => { + const host = inject("host") + const port = inject("port") + const user = inject("user") + const password = inject("password") + const database = inject("database") + fdm = createFdmServer(host, port, user, password, database) + principal_id = "test_principal" + + // Create a test farm + b_id_farm = await addFarm( + fdm, + principal_id, + "Test Farm for Grazing", + "654321", + "321 Farm Road", + "54321", + ) + }) + + describe("setGrazingIntention", () => { + it("should add a new grazing intention", async () => { + const b_grazing_intention_year = 2025 + const intention = true + + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, intention) + + const result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(intention) + }) + + it("should update an existing grazing intention", async () => { + const b_grazing_intention_year = 2026 + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, true) + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, false) + + const result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(false) + }) + + it("should throw an error if principal does not have permission", async () => { + const invalidPrincipal = "invalid_user" + await expect( + setGrazingIntention(fdm, invalidPrincipal, b_id_farm, 2027, true), + ).rejects.toThrowError("Principal does not have permission to perform this action") + }) + }) + + describe("getGrazingIntention", () => { + it("should return the correct intention for a given b_grazing_intention_year", async () => { + const b_grazing_intention_year = 2028 + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, true) + + const result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(true) + }) + + it("should return false if no intention is set for the b_grazing_intention_year", async () => { + const b_grazing_intention_year = 2029 + const result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(false) + }) + + it("should throw an error if principal does not have permission", async () => { + const invalidPrincipal = "invalid_user" + await expect( + getGrazingIntention(fdm, invalidPrincipal, b_id_farm, 2030), + ).rejects.toThrowError("Principal does not have permission to perform this action") + }) + }) + + describe("getGrazingIntentions", () => { + it("should return all grazing intentions for a farm", async () => { + await setGrazingIntention(fdm, principal_id, b_id_farm, 2031, true) + await setGrazingIntention(fdm, principal_id, b_id_farm, 2032, false) + + const intentions = await getGrazingIntentions(fdm, principal_id, b_id_farm) + expect(intentions.length).toBe(2) + expect(intentions.map((i) => i.b_grazing_intention_year)).toEqual( + expect.arrayContaining([2031, 2032]), + ) + }) + + it("should return an empty array if no intentions are set", async () => { + const new_b_id_farm = await addFarm(fdm, principal_id, "Farm Without Intentions", undefined, undefined, undefined) + const intentions = await getGrazingIntentions(fdm, principal_id, new_b_id_farm) + expect(intentions.length).toBe(0) + }) + + it("should throw an error if principal does not have permission", async () => { + const invalidPrincipal = "invalid_user" + await expect( + getGrazingIntentions(fdm, invalidPrincipal, b_id_farm), + ).rejects.toThrowError("Principal does not have permission to perform this action") + }) + }) + + describe("removeGrazingIntention", () => { + it("should remove an existing grazing intention", async () => { + const b_grazing_intention_year = 2033 + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, true) + + let result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(true) + + await removeGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + + result = await getGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year) + expect(result).toBe(false) + }) + + it("should not throw an error when removing a non-existent intention", async () => { + const b_grazing_intention_year = 2034 + await expect( + removeGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year), + ).resolves.not.toThrow() + }) + + it("should throw an error if principal does not have permission", async () => { + const b_grazing_intention_year = 2035 + await setGrazingIntention(fdm, principal_id, b_id_farm, b_grazing_intention_year, true) + const invalidPrincipal = "invalid_user" + + await expect( + removeGrazingIntention(fdm, invalidPrincipal, b_id_farm, b_grazing_intention_year), + ).rejects.toThrowError("Principal does not have permission to perform this action") + }) + }) +}) diff --git a/fdm-core/src/grazing_intention.ts b/fdm-core/src/grazing_intention.ts new file mode 100644 index 000000000..a3bb8745a --- /dev/null +++ b/fdm-core/src/grazing_intention.ts @@ -0,0 +1,190 @@ +import { and, eq } from "drizzle-orm" +import { checkPermission } from "./authorization" +import type { PrincipalId } from "./authorization.d" +import * as schema from "./db/schema" +import { handleError } from "./error" +import type { FdmType } from "./fdm" + +/** + * Sets a grazing intention for a farm for a specific year. + * This will create a new record if one does not exist, or update the existing one. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The unique identifier of the principal performing the operation. + * @param b_id_farm Identifier of the farm. + * @param b_grazing_intention_year The year of the grazing intention. + * @param b_grazing_intention The grazing intention (true or false). + * @returns A promise that resolves when the operation is complete. + * @alpha + */ +export async function setGrazingIntention( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.intendingGrazingTypeInsert["b_id_farm"], + b_grazing_intention_year: schema.intendingGrazingTypeInsert["b_grazing_intention_year"], + b_grazing_intention: schema.intendingGrazingTypeInsert["b_grazing_intention"], +): Promise { + try { + await checkPermission( + fdm, + "farm", + "write", + b_id_farm, + principal_id, + "setGrazingIntention", + ) + + await fdm + .insert(schema.intendingGrazing) + .values({ + b_id_farm, + b_grazing_intention_year: b_grazing_intention_year, + b_grazing_intention: b_grazing_intention, + }) + .onConflictDoUpdate({ + target: [ + schema.intendingGrazing.b_id_farm, + schema.intendingGrazing.b_grazing_intention_year, + ], + set: { + b_grazing_intention: b_grazing_intention, + updated: new Date(), + }, + }) + } catch (err) { + throw handleError(err, "Exception for setGrazingIntention", { + b_id_farm, + b_grazing_intention_year, + b_grazing_intention, + }) + } +} + +/** + * Removes a grazing intention for a specific farm and year. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The unique identifier of the principal performing the operation. + * @param b_id_farm The unique identifier of the farm. + * @param b_grazing_intention_year The year of the grazing intention to remove. + * @returns A promise that resolves when the grazing intention has been successfully removed. + * @alpha + */ +export async function removeGrazingIntention( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.intendingGrazingTypeSelect["b_id_farm"], + b_grazing_intention_year: schema.intendingGrazingTypeSelect["b_grazing_intention_year"], +): Promise { + try { + await checkPermission( + fdm, + "farm", + "write", + b_id_farm, + principal_id, + "removeGrazingIntention", + ) + + await fdm + .delete(schema.intendingGrazing) + .where( + and( + eq(schema.intendingGrazing.b_id_farm, b_id_farm), + eq( + schema.intendingGrazing.b_grazing_intention_year, + b_grazing_intention_year, + ), + ), + ) + } catch (err) { + throw handleError(err, "Exception for removeGrazingIntention", { + b_id_farm, + b_grazing_intention_year, + }) + } +} + +/** + * Retrieves all grazing intentions for a specified farm. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The ID of the principal making the request. + * @param b_id_farm The unique identifier of the farm. + * @returns A Promise resolving to an array of grazing intention objects. + * @alpha + */ +export async function getGrazingIntentions( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeSelect["b_id_farm"], +): Promise { + try { + await checkPermission( + fdm, + "farm", + "read", + b_id_farm, + principal_id, + "getGrazingIntentions", + ) + + return await fdm + .select() + .from(schema.intendingGrazing) + .where(eq(schema.intendingGrazing.b_id_farm, b_id_farm)) + } catch (err) { + throw handleError(err, "Exception for getGrazingIntentions", { + b_id_farm, + }) + } +} + +/** + * Retrieves the grazing intention for a specific farm and year. + * + * @param fdm The FDM instance providing the connection to the database. + * @param principal_id The ID of the principal making the request. + * @param b_id_farm The unique identifier of the farm. + * @param b_grazing_intention_year The year to retrieve the grazing intention for. + * @returns A Promise resolving to a boolean representing the grazing intention. Returns `false` if no intention is found. + * @alpha + */ +export async function getGrazingIntention( + fdm: FdmType, + principal_id: PrincipalId, + b_id_farm: schema.farmsTypeSelect["b_id_farm"], + b_grazing_intention_year: number, +): Promise { + try { + await checkPermission( + fdm, + "farm", + "read", + b_id_farm, + principal_id, + "getGrazingIntention", + ) + + const result = await fdm + .select({ intention: schema.intendingGrazing.b_grazing_intention }) + .from(schema.intendingGrazing) + .where( + and( + eq(schema.intendingGrazing.b_id_farm, b_id_farm), + eq( + schema.intendingGrazing.b_grazing_intention_year, + b_grazing_intention_year, + ), + ), + ) + .limit(1) + + return result[0]?.intention ?? false + } catch (err) { + throw handleError(err, "Exception for getGrazingIntention", { + b_id_farm, + b_grazing_intention_year, + }) + } +} diff --git a/fdm-core/src/index.ts b/fdm-core/src/index.ts index b42d22efc..f776c20ba 100644 --- a/fdm-core/src/index.ts +++ b/fdm-core/src/index.ts @@ -158,3 +158,9 @@ export { removeOrganicCertification, } from "./organic" export type { OrganicCertification } from "./organic.d" +export { + setGrazingIntention, + removeGrazingIntention, + getGrazingIntention, + getGrazingIntentions, +} from "./grazing_intention" From caec86e53fa9eaf07ff09d36132d82dc6ea8f051 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:10:47 +0200 Subject: [PATCH 044/243] chore: add db migration --- .../db/migrations/0015_square_arclight.sql | 29 + .../src/db/migrations/meta/0015_snapshot.json | 3353 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 7 + fdm-core/src/db/schema.ts | 2 +- 4 files changed, 3390 insertions(+), 1 deletion(-) create mode 100644 fdm-core/src/db/migrations/0015_square_arclight.sql create mode 100644 fdm-core/src/db/migrations/meta/0015_snapshot.json diff --git a/fdm-core/src/db/migrations/0015_square_arclight.sql b/fdm-core/src/db/migrations/0015_square_arclight.sql new file mode 100644 index 000000000..71cee9e0e --- /dev/null +++ b/fdm-core/src/db/migrations/0015_square_arclight.sql @@ -0,0 +1,29 @@ +CREATE TYPE "fdm"."p_type_rvo" AS ENUM('10', '11', '12', '13', '14', '17', '18', '19', '23', '30', '31', '32', '33', '35', '39', '40', '41', '42', '43', '46', '50', '56', '60', '61', '75', '76', '80', '81', '90', '91', '92', '25', '26', '27', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '120');--> statement-breakpoint +CREATE TABLE "fdm"."intending_grazing" ( + "b_id_farm" text PRIMARY KEY NOT NULL, + "b_grazing_intention" boolean NOT NULL, + "b_grazing_intention_year" integer NOT NULL, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone +); +--> statement-breakpoint +CREATE TABLE "fdm"."organic_certifications" ( + "b_id_organic" text PRIMARY KEY NOT NULL, + "b_organic_traces" text, + "b_organic_skal" text, + "b_organic_issued" timestamp with time zone, + "b_organic_expires" timestamp with time zone, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone +); +--> statement-breakpoint +CREATE TABLE "fdm"."organic_certifications_holding" ( + "b_id_farm" text NOT NULL, + "b_id_organic" text NOT NULL, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone +); +--> statement-breakpoint +ALTER TABLE "fdm"."fertilizers_catalogue" ADD COLUMN "p_type_rvo" "fdm"."p_type_rvo";--> statement-breakpoint +ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk" FOREIGN KEY ("b_id_organic") REFERENCES "fdm"."organic_certifications"("b_id_organic") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json new file mode 100644 index 000000000..9cddc06cf --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0015_snapshot.json @@ -0,0 +1,3353 @@ +{ + "id": "e37fbf35-5e1f-447a-ad42-35405b02dbc4", + "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_rvo": { + "name": "p_type_rvo", + "type": "p_type_rvo", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.intending_grazing": { + "name": "intending_grazing", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_grazing_intention": { + "name": "b_grazing_intention", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "b_grazing_intention_year": { + "name": "b_grazing_intention_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.organic_certifications": { + "name": "organic_certifications", + "schema": "fdm", + "columns": { + "b_id_organic": { + "name": "b_id_organic", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_organic_traces": { + "name": "b_organic_traces", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_organic_skal": { + "name": "b_organic_skal", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_organic_issued": { + "name": "b_organic_issued", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_organic_expires": { + "name": "b_organic_expires", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.organic_certifications_holding": { + "name": "organic_certifications_holding", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_organic": { + "name": "b_id_organic", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk": { + "name": "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "organic_certifications_holding", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk": { + "name": "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk", + "tableFrom": "organic_certifications_holding", + "tableTo": "organic_certifications", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_organic" + ], + "columnsTo": [ + "b_id_organic" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.b_acquiring_method": { + "name": "b_acquiring_method", + "schema": "fdm", + "values": [ + "nl_01", + "nl_02", + "nl_03", + "nl_04", + "nl_07", + "nl_09", + "nl_10", + "nl_11", + "nl_12", + "nl_13", + "nl_61", + "nl_63", + "unknown" + ] + }, + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + }, + "fdm.p_type_rvo": { + "name": "p_type_rvo", + "schema": "fdm", + "values": [ + "10", + "11", + "12", + "13", + "14", + "17", + "18", + "19", + "23", + "30", + "31", + "32", + "33", + "35", + "39", + "40", + "41", + "42", + "43", + "46", + "50", + "56", + "60", + "61", + "75", + "76", + "80", + "81", + "90", + "91", + "92", + "25", + "26", + "27", + "95", + "96", + "97", + "98", + "99", + "100", + "101", + "102", + "103", + "104", + "105", + "106", + "107", + "108", + "109", + "110", + "111", + "112", + "113", + "114", + "115", + "116", + "117", + "120" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 1d8df0db1..4c405c09c 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -106,6 +106,13 @@ "when": 1760450273146, "tag": "0014_smart_malice", "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1760526983873, + "tag": "0015_square_arclight", + "breakpoints": true } ] } \ No newline at end of file diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index c7b0e672d..f92bc6c63 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -277,7 +277,7 @@ export const typeRvoOptions = [ { value: "117", label: "Gescheiden champost" }, { value: "120", label: "Mineralenconcentraat" }, ] -const typeRvoEnum = fdmSchema.enum( +export const typeRvoEnum = fdmSchema.enum( "p_type_rvo", typeRvoOptions.map((x) => x.value) as [string, ...string[]], ) From b5adfdeaac2fa3b71263a6bb11cabda790c1650f Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:20:38 +0200 Subject: [PATCH 045/243] test: fix --- fdm-core/src/fertilizer.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdm-core/src/fertilizer.test.ts b/fdm-core/src/fertilizer.test.ts index 34936d689..f4aed69a9 100644 --- a/fdm-core/src/fertilizer.test.ts +++ b/fdm-core/src/fertilizer.test.ts @@ -1066,7 +1066,7 @@ describe("Fertilizer Data Model", () => { describe("getFertilizerParametersDescription", () => { it("should return the correct fertilizer parameter descriptions for NL-nl locale", () => { const descriptions = getFertilizerParametersDescription("NL-nl") - expect(descriptions).toHaveLength(24) + expect(descriptions).toHaveLength(25) for (const description of descriptions) { expect(description).toHaveProperty("parameter") expect(description).toHaveProperty("unit") @@ -1091,7 +1091,7 @@ describe("getFertilizerParametersDescription", () => { it("should return the correct fertilizer parameter descriptions for default locale", () => { const descriptions = getFertilizerParametersDescription() - expect(descriptions).toHaveLength(24) + expect(descriptions).toHaveLength(25) for (const description of descriptions) { expect(description).toHaveProperty("parameter") expect(description).toHaveProperty("unit") From 14ab28125a0f1db007d4afc33f185c008b339ce7 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:30:22 +0200 Subject: [PATCH 046/243] fix: reference to farm table --- ...clight.sql => 0015_polite_jane_foster.sql} | 5 ++-- .../src/db/migrations/meta/0015_snapshot.json | 23 +++++++++++++++---- fdm-core/src/db/migrations/meta/_journal.json | 4 ++-- fdm-core/src/db/schema.ts | 6 +++-- 4 files changed, 28 insertions(+), 10 deletions(-) rename fdm-core/src/db/migrations/{0015_square_arclight.sql => 0015_polite_jane_foster.sql} (86%) diff --git a/fdm-core/src/db/migrations/0015_square_arclight.sql b/fdm-core/src/db/migrations/0015_polite_jane_foster.sql similarity index 86% rename from fdm-core/src/db/migrations/0015_square_arclight.sql rename to fdm-core/src/db/migrations/0015_polite_jane_foster.sql index 71cee9e0e..262e4828a 100644 --- a/fdm-core/src/db/migrations/0015_square_arclight.sql +++ b/fdm-core/src/db/migrations/0015_polite_jane_foster.sql @@ -1,7 +1,7 @@ CREATE TYPE "fdm"."p_type_rvo" AS ENUM('10', '11', '12', '13', '14', '17', '18', '19', '23', '30', '31', '32', '33', '35', '39', '40', '41', '42', '43', '46', '50', '56', '60', '61', '75', '76', '80', '81', '90', '91', '92', '25', '26', '27', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '120');--> statement-breakpoint CREATE TABLE "fdm"."intending_grazing" ( - "b_id_farm" text PRIMARY KEY NOT NULL, - "b_grazing_intention" boolean NOT NULL, + "b_id_farm" text NOT NULL, + "b_grazing_intention" boolean, "b_grazing_intention_year" integer NOT NULL, "created" timestamp with time zone DEFAULT now() NOT NULL, "updated" timestamp with time zone @@ -25,5 +25,6 @@ CREATE TABLE "fdm"."organic_certifications_holding" ( ); --> statement-breakpoint ALTER TABLE "fdm"."fertilizers_catalogue" ADD COLUMN "p_type_rvo" "fdm"."p_type_rvo";--> statement-breakpoint +ALTER TABLE "fdm"."intending_grazing" ADD CONSTRAINT "intending_grazing_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk" FOREIGN KEY ("b_id_organic") REFERENCES "fdm"."organic_certifications"("b_id_organic") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json index 9cddc06cf..a98560df1 100644 --- a/fdm-core/src/db/migrations/meta/0015_snapshot.json +++ b/fdm-core/src/db/migrations/meta/0015_snapshot.json @@ -1,5 +1,5 @@ { - "id": "e37fbf35-5e1f-447a-ad42-35405b02dbc4", + "id": "ff3e17ab-43af-4427-8582-e5057365e136", "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", "version": "7", "dialect": "postgresql", @@ -1834,14 +1834,14 @@ "b_id_farm": { "name": "b_id_farm", "type": "text", - "primaryKey": true, + "primaryKey": false, "notNull": true }, "b_grazing_intention": { "name": "b_grazing_intention", "type": "boolean", "primaryKey": false, - "notNull": true + "notNull": false }, "b_grazing_intention_year": { "name": "b_grazing_intention_year", @@ -1864,7 +1864,22 @@ } }, "indexes": {}, - "foreignKeys": {}, + "foreignKeys": { + "intending_grazing_b_id_farm_farms_b_id_farm_fk": { + "name": "intending_grazing_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "intending_grazing", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, "compositePrimaryKeys": {}, "uniqueConstraints": {}, "policies": {}, diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 4c405c09c..be533f17c 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -110,8 +110,8 @@ { "idx": 15, "version": "7", - "when": 1760526983873, - "tag": "0015_square_arclight", + "when": 1760527725262, + "tag": "0015_polite_jane_foster", "breakpoints": true } ] diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index f92bc6c63..11b320cf2 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -843,8 +843,10 @@ export type organicCertificationsHoldingTypeInsert = export const intendingGrazing = fdmSchema.table( "intending_grazing", { - b_id_farm: text().primaryKey(), - b_grazing_intention: boolean().notNull(), + b_id_farm: text() + .notNull() + .references(() => farms.b_id_farm), + b_grazing_intention: boolean(), b_grazing_intention_year: integer().notNull(), created: timestamp({ withTimezone: true }).notNull().defaultNow(), updated: timestamp({ withTimezone: true }), From 97c487f47c79e7e5d654bb0907c0485457ea35c1 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:38:15 +0200 Subject: [PATCH 047/243] feat: at removeFarm delete the associated derogations, organic certifications and grazing intentions as well --- fdm-core/src/farm.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/fdm-core/src/farm.ts b/fdm-core/src/farm.ts index 488972464..1e5e6894f 100644 --- a/fdm-core/src/farm.ts +++ b/fdm-core/src/farm.ts @@ -663,9 +663,63 @@ export async function removeFarm( .where(inArray(schema.fertilizerPicking.p_id, pIds)) } + // Get all derogation IDs associated with this farm + const derogationIdsToDelete = await tx + .select({ b_id_derogation: schema.derogationApplying.b_id_derogation }) + .from(schema.derogationApplying) + .where(eq(schema.derogationApplying.b_id_farm, b_id_farm)) + + // Delete derogation applying records await tx .delete(schema.derogationApplying) .where(eq(schema.derogationApplying.b_id_farm, b_id_farm)) + + // Delete derogations that were associated with this farm + if (derogationIdsToDelete.length > 0) { + const bIdsDerogation = derogationIdsToDelete.map( + (d: { b_id_derogation: schema.derogationsTypeSelect["b_id_derogation"] }) => + d.b_id_derogation, + ) + await tx + .delete(schema.derogations) + .where( + inArray( + schema.derogations.b_id_derogation, + bIdsDerogation, + ), + ) + } + + // Get all organic certification IDs associated with this farm + const organicCertificationIdsToDelete = await tx + .select({ b_id_organic: schema.organicCertificationsHolding.b_id_organic }) + .from(schema.organicCertificationsHolding) + .where(eq(schema.organicCertificationsHolding.b_id_farm, b_id_farm)) + + // Delete organic certifications holding records + await tx + .delete(schema.organicCertificationsHolding) + .where(eq(schema.organicCertificationsHolding.b_id_farm, b_id_farm)) + + // Delete organic certifications that were associated with this farm + if (organicCertificationIdsToDelete.length > 0) { + const bIdsOrganic = organicCertificationIdsToDelete.map( + (o: { b_id_organic: schema.organicCertificationsTypeSelect["b_id_organic"] }) => + o.b_id_organic, + ) + await tx + .delete(schema.organicCertifications) + .where( + inArray( + schema.organicCertifications.b_id_organic, + bIdsOrganic, + ), + ) + } + + await tx + .delete(schema.intendingGrazing) + .where(eq(schema.intendingGrazing.b_id_farm, b_id_farm)) await tx .delete(schema.fertilizerCatalogueEnabling) .where( From 80aa92e3fb27d6f74c77d3225ee5df59feb92a74 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:52:09 +0200 Subject: [PATCH 048/243] fix: key on intending_grazing table --- ...015_polite_jane_foster.sql => 0015_new_stick.sql} | 3 ++- fdm-core/src/db/migrations/meta/0015_snapshot.json | 12 ++++++++++-- fdm-core/src/db/migrations/meta/_journal.json | 4 ++-- fdm-core/src/db/schema.ts | 12 +++++------- 4 files changed, 19 insertions(+), 12 deletions(-) rename fdm-core/src/db/migrations/{0015_polite_jane_foster.sql => 0015_new_stick.sql} (93%) diff --git a/fdm-core/src/db/migrations/0015_polite_jane_foster.sql b/fdm-core/src/db/migrations/0015_new_stick.sql similarity index 93% rename from fdm-core/src/db/migrations/0015_polite_jane_foster.sql rename to fdm-core/src/db/migrations/0015_new_stick.sql index 262e4828a..f9cafee14 100644 --- a/fdm-core/src/db/migrations/0015_polite_jane_foster.sql +++ b/fdm-core/src/db/migrations/0015_new_stick.sql @@ -4,7 +4,8 @@ CREATE TABLE "fdm"."intending_grazing" ( "b_grazing_intention" boolean, "b_grazing_intention_year" integer NOT NULL, "created" timestamp with time zone DEFAULT now() NOT NULL, - "updated" timestamp with time zone + "updated" timestamp with time zone, + CONSTRAINT "intending_grazing_b_id_farm_b_grazing_intention_year_pk" PRIMARY KEY("b_id_farm","b_grazing_intention_year") ); --> statement-breakpoint CREATE TABLE "fdm"."organic_certifications" ( diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json index a98560df1..120c1390e 100644 --- a/fdm-core/src/db/migrations/meta/0015_snapshot.json +++ b/fdm-core/src/db/migrations/meta/0015_snapshot.json @@ -1,5 +1,5 @@ { - "id": "ff3e17ab-43af-4427-8582-e5057365e136", + "id": "ce358cf4-6c4f-4551-87de-35e01db3ed67", "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", "version": "7", "dialect": "postgresql", @@ -1880,7 +1880,15 @@ "onUpdate": "no action" } }, - "compositePrimaryKeys": {}, + "compositePrimaryKeys": { + "intending_grazing_b_id_farm_b_grazing_intention_year_pk": { + "name": "intending_grazing_b_id_farm_b_grazing_intention_year_pk", + "columns": [ + "b_id_farm", + "b_grazing_intention_year" + ] + } + }, "uniqueConstraints": {}, "policies": {}, "checkConstraints": {}, diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index be533f17c..eaf890b40 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -110,8 +110,8 @@ { "idx": 15, "version": "7", - "when": 1760527725262, - "tag": "0015_polite_jane_foster", + "when": 1760528792955, + "tag": "0015_new_stick", "breakpoints": true } ] diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index 11b320cf2..7a1417410 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -851,13 +851,11 @@ export const intendingGrazing = fdmSchema.table( created: timestamp({ withTimezone: true }).notNull().defaultNow(), updated: timestamp({ withTimezone: true }), }, - (table) => { - return [ - { - pk: primaryKey({ columns: [table.b_id_farm, table.b_grazing_intention_year] }), - }, - ] - }, + (table) => ({ + pk: primaryKey({ + columns: [table.b_id_farm, table.b_grazing_intention_year], + }), + }), ) export type intendingGrazingTypeSelect = typeof intendingGrazing.$inferSelect From 05048a42168779a17e0e7c71f91b5e950d79db7f Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:56:13 +0200 Subject: [PATCH 049/243] test: fix setup for organic certifications --- fdm-core/src/organic.test.ts | 83 ++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/fdm-core/src/organic.test.ts b/fdm-core/src/organic.test.ts index 663af1a67..28ca32027 100644 --- a/fdm-core/src/organic.test.ts +++ b/fdm-core/src/organic.test.ts @@ -1,8 +1,7 @@ import { eq } from "drizzle-orm" -import { afterEach, beforeEach, describe, expect, it } from "vitest" +import { beforeEach, describe, expect, inject, it } from "vitest" import { createFdmServer } from "./fdm-server" import * as schema from "./db/schema" -import * as authNSchema from "./db/schema-authn" import { addFarm } from "./farm" import { addOrganicCertification, @@ -11,48 +10,38 @@ import { listOrganicCertifications, removeOrganicCertification, } from "./organic" - -// Helper function to create a principal for testing purposes -async function createPrincipal(fdm: Awaited>, username: string): Promise { - const newPrincipalId = `principal-${Math.random().toString(36).substring(2, 9)}` - await fdm.insert(authNSchema.user).values({ - id: newPrincipalId, - name: username, - email: `${username}@example.com`, - emailVerified: true, - createdAt: new Date(), - updatedAt: new Date(), - username: username, - lang: "en-US", - }) - return newPrincipalId -} +import type { FdmServerType } from "./fdm-server.d" +import { createId } from "./id" describe("Organic Certifications", () => { - let fdm: Awaited> - let principalId: string + let fdm: FdmServerType let farmId: string + let principalId: string beforeEach(async () => { - fdm = createFdmServer( - "localhost", - 5432, - "postgres", - "postgres", - "fdm", + const host = inject("host") + const port = inject("port") + const user = inject("user") + const password = inject("password") + const database = inject("database") + fdm = createFdmServer(host, port, user, password, database) + + // Create test field and analyses before each test + const farmName = "Test Farm" + const farmBusinessId = "123456" + const farmAddress = "123 Farm Lane" + const farmPostalCode = "12345" + principalId = createId() + farmId = await addFarm( + fdm, + principalId, + farmName, + farmBusinessId, + farmAddress, + farmPostalCode, ) - principalId = await createPrincipal(fdm, "test-principal") - farmId = await addFarm(fdm, principalId, "Test Farm", undefined, undefined, undefined) }) - // afterEach(async () => { - // await fdm.delete(schema.farms) - // await fdm.delete(authNSchema.user) // Corrected to authNSchema.user - // await fdm.delete(schema.organicCertifications) - // await fdm.delete(schema.organicCertificationsHolding) - // await fdm.$client.end() - // }) - it("should add a new organic certification", async () => { const traces = "NL-BIO-01.528-0002967.2025.001" const skal = "026281" @@ -74,15 +63,25 @@ describe("Organic Certifications", () => { const certifications = await fdm .select() .from(schema.organicCertifications) - .where(eq(schema.organicCertifications.b_id_organic, certificationId)) + .where( + eq(schema.organicCertifications.b_id_organic, certificationId), + ) expect(certifications.length).toBe(1) expect(certifications[0].b_organic_traces).toBe(traces) expect(certifications[0].b_organic_skal).toBe(skal) - expect(certifications[0].b_organic_issued?.toISOString()).toBe(issued.toISOString()) - expect(certifications[0].b_organic_expires?.toISOString()).toBe(expires.toISOString()) + expect(certifications[0].b_organic_issued?.toISOString()).toBe( + issued.toISOString(), + ) + expect(certifications[0].b_organic_expires?.toISOString()).toBe( + expires.toISOString(), + ) - const fetchedCertification = await getOrganicCertification(fdm, principalId, certificationId) + const fetchedCertification = await getOrganicCertification( + fdm, + principalId, + certificationId, + ) expect(fetchedCertification).toBeDefined() expect(fetchedCertification?.b_id_organic).toBe(certificationId) expect(fetchedCertification?.b_organic_traces).toBe(traces) @@ -206,7 +205,9 @@ describe("Organic Certifications", () => { const certifications = await fdm .select() .from(schema.organicCertifications) - .where(eq(schema.organicCertifications.b_id_organic, certificationId)) + .where( + eq(schema.organicCertifications.b_id_organic, certificationId), + ) expect(certifications.length).toBe(0) }) From 726ae00d12b03abb3f134b05dd9b65d0815e67e7 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:09:04 +0200 Subject: [PATCH 050/243] Fix: differentiate stikstofgebruiksnorm for grassland based on "beweiden" or "volledig maaien" --- .changeset/free-lizards-serve.md | 5 +++ fdm-calculator/src/norms/nl/2025/input.ts | 13 +++++- .../nl/2025/stikstofgebruiksnorm-data.ts | 43 ++++++++++--------- .../src/norms/nl/2025/stikstofgebruiksnorm.ts | 12 +++++- fdm-calculator/src/norms/nl/2025/types.d.ts | 1 + 5 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 .changeset/free-lizards-serve.md diff --git a/.changeset/free-lizards-serve.md b/.changeset/free-lizards-serve.md new file mode 100644 index 000000000..c3c4215bd --- /dev/null +++ b/.changeset/free-lizards-serve.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-calculator": patch +--- + +Fixes to differentiate stikstofgebruiksnorm for grassland based on "beweiden" or "volledig maaien" diff --git a/fdm-calculator/src/norms/nl/2025/input.ts b/fdm-calculator/src/norms/nl/2025/input.ts index 9e3853e04..ae99529c9 100644 --- a/fdm-calculator/src/norms/nl/2025/input.ts +++ b/fdm-calculator/src/norms/nl/2025/input.ts @@ -5,6 +5,8 @@ import { getField, isDerogationGrantedForYear, type Timeframe, + getGrazingIntention, + type PrincipalId, } from "@svenvw/fdm-core" import type { NL2025NormsInput } from "./types.d" @@ -46,7 +48,15 @@ export async function collectNL2025InputForNorms( 2025, ) - // 3. Get the details of the cultivations + // 3. Get the grazing intention for the farm + const has_grazing_intention = await getGrazingIntention( + fdm, + principal_id as PrincipalId, + field.b_id_farm, + 2025, + ) + + // 4. Get the details of the cultivations const cultivations = await getCultivations( fdm, principal_id, @@ -75,6 +85,7 @@ export async function collectNL2025InputForNorms( return { farm: { is_derogatie_bedrijf, + has_grazing_intention, }, field: field, cultivations: cultivations, diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts index 29a93b63d..1bd4182dc 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts +++ b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts @@ -5,27 +5,28 @@ export const nitrogenStandardsData = [ type: "grasland", is_winterteelt: true, is_vanggewas: false, - norms: { - klei: { standard: 345, nv_area: 276 }, - zand_nwc: { standard: 250, nv_area: 200 }, - zand_zuid: { standard: 250, nv_area: 200 }, - loess: { standard: 250, nv_area: 200 }, - veen: { standard: 265, nv_area: 212 }, - }, - }, - { - cultivation_rvo_table2: "Grasland met volledig maaien", - b_lu_catalogue_match: ["nl_265", "nl_331"], - type: "grasland", - is_winterteelt: true, - is_vanggewas: false, - norms: { - klei: { standard: 385, nv_area: 308 }, - zand_nwc: { standard: 320, nv_area: 256 }, - zand_zuid: { standard: 320, nv_area: 256 }, - loess: { standard: 320, nv_area: 256 }, - veen: { standard: 300, nv_area: 240 }, - }, + sub_types: [ + { + omschrijving: "beweiden", + norms: { + klei: { standard: 345, nv_area: 276 }, + zand_nwc: { standard: 250, nv_area: 200 }, + zand_zuid: { standard: 250, nv_area: 200 }, + loess: { standard: 250, nv_area: 200 }, + veen: { standard: 265, nv_area: 212 }, + }, + }, + { + omschrijving: "volledig maaien", + norms: { + klei: { standard: 385, nv_area: 308 }, + zand_nwc: { standard: 320, nv_area: 256 }, + zand_zuid: { standard: 320, nv_area: 256 }, + loess: { standard: 320, nv_area: 256 }, + veen: { standard: 300, nv_area: 240 }, + }, + }, + ], }, { cultivation_rvo_table2: "Tijdelijk grasland", diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts index 6025078b0..4c3a8e7ea 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts @@ -147,7 +147,7 @@ export async function getRegion( function getNormsForCultivation( selectedStandard: NitrogenStandard, b_lu_end: Date, - subTypeOmschrijving?: string, // New parameter + subTypeOmschrijving?: string, ): NormsByRegion | undefined { if (selectedStandard.sub_types) { type SubType = NonNullable[number] @@ -207,7 +207,13 @@ function determineSubTypeOmschrijving( standard: NitrogenStandard, is_derogatie_bedrijf: boolean | undefined, cultivations: NL2025NormsInputForCultivation[], + has_grazing_intention: boolean | undefined, ): string | undefined { + // Grasland logic based on grazing intention + if (standard.type === "grasland") { + return has_grazing_intention ? "beweiden" : "volledig maaien" + } + // Potato logic based on variety if (standard.type === "aardappel") { if (cultivation.b_lu_variety) { @@ -527,6 +533,7 @@ export async function getNL2025StikstofGebruiksNorm( input: NL2025NormsInput, ): Promise { const is_derogatie_bedrijf = input.farm.is_derogatie_bedrijf + const has_grazing_intention = input.farm.has_grazing_intention const field = input.field const cultivations = input.cultivations @@ -596,12 +603,13 @@ export async function getNL2025StikstofGebruiksNorm( selectedStandard, is_derogatie_bedrijf, cultivations, + has_grazing_intention, ) const applicableNorms = getNormsForCultivation( selectedStandard, cultivation.b_lu_end, - subTypeOmschrijving, // Pass the determined subTypeOmschrijving + subTypeOmschrijving, ) if (!applicableNorms) { diff --git a/fdm-calculator/src/norms/nl/2025/types.d.ts b/fdm-calculator/src/norms/nl/2025/types.d.ts index 68062b107..d7e2cce05 100644 --- a/fdm-calculator/src/norms/nl/2025/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/types.d.ts @@ -15,6 +15,7 @@ export type NL2025NormsInput = { /** Farm-level properties, such as derogation status. */ farm: { is_derogatie_bedrijf: boolean + has_grazing_intention: boolean } /** The field record from fdm-core, including its ID and centroid for location-based checks. */ field: Pick From d7ecb611e07ad87f79d239572a75f7af53ff388f Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:24:34 +0200 Subject: [PATCH 051/243] test: update for grazing intention --- .../src/norms/nl/2025/input.test.ts | 21 ++++-- .../nl/2025/stikstofgebruiksnorm.test.ts | 68 ++++++++++++------- 2 files changed, 60 insertions(+), 29 deletions(-) diff --git a/fdm-calculator/src/norms/nl/2025/input.test.ts b/fdm-calculator/src/norms/nl/2025/input.test.ts index b729d3523..b2f84053a 100644 --- a/fdm-calculator/src/norms/nl/2025/input.test.ts +++ b/fdm-calculator/src/norms/nl/2025/input.test.ts @@ -16,6 +16,7 @@ vi.mock("@svenvw/fdm-core", async () => { getCultivations: vi.fn(), getCurrentSoilData: vi.fn(), isDerogationGrantedForYear: vi.fn(), + getGrazingIntention: vi.fn(), } }) @@ -52,6 +53,7 @@ describe("collectNL2025InputForNorms", () => { mockSoilAnalysis as unknown as SoilAnalysis[], ) vi.mocked(fdmCore.isDerogationGrantedForYear).mockResolvedValue(false) + vi.mocked(fdmCore.getGrazingIntention).mockResolvedValue(false) const result = await collectNL2025InputForNorms( mockFdm, @@ -60,6 +62,7 @@ describe("collectNL2025InputForNorms", () => { ) expect(result.farm.is_derogatie_bedrijf).toBe(false) + expect(result.farm.has_grazing_intention).toBe(false) expect(result.field).toBe(mockField) expect(result.cultivations).toBe(mockCultivations) expect(result.soilAnalysis).toEqual({ a_p_cc: 1.0, a_p_al: 20 }) @@ -68,6 +71,18 @@ describe("collectNL2025InputForNorms", () => { mockPrincipalId, mockFieldId, ) + expect(fdmCore.isDerogationGrantedForYear).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "farm-1", + 2025, + ) + expect(fdmCore.getGrazingIntention).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "farm-1", + 2025, + ) expect(fdmCore.getCultivations).toHaveBeenCalledWith( mockFdm, mockPrincipalId, @@ -80,11 +95,5 @@ describe("collectNL2025InputForNorms", () => { mockFieldId, timeframe, ) - expect(fdmCore.isDerogationGrantedForYear).toHaveBeenCalledWith( - mockFdm, - mockPrincipalId, - "farm-1", - 2025, - ) }) }) diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts index 8c6d13366..d0d549a80 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts @@ -35,9 +35,9 @@ describe("stikstofgebruiksnorm helpers", () => { }) describe("getNL2025StikstofGebruiksNorm", () => { - it("should return the correct norm for grasland", async () => { + it("should return the correct norm for grasland (beweiden)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: true }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], @@ -54,12 +54,34 @@ describe("getNL2025StikstofGebruiksNorm", () => { const result = await getNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(345) - expect(result.normSource).toEqual("Grasland.") + expect(result.normSource).toEqual("Grasland (beweiden).") + }) + + it("should return the correct norm for grasland (volledig maaien)", async () => { + const mockInput: NL2025NormsInput = { + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, + field: { + b_id: "1", + b_centroid: [5.6279889, 51.975571], + } as Field, + cultivations: [ + { + b_lu_catalogue: "nl_265", + b_lu_start: new Date(2025, 0, 1), // Current year cultivation + b_lu_end: new Date(2025, 5, 1), + } as Partial, + ] as NL2025NormsInputForCultivation[], + soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, + } + + const result = await getNL2025StikstofGebruiksNorm(mockInput) + expect(result.normValue).toBe(385) + expect(result.normSource).toEqual("Grasland (volledig maaien).") }) it("should return the correct norm for potatoes", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], @@ -84,7 +106,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should apply 0 korting if winterteelt is present in zand_nwc region (hoofdteelt 2025)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: true }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -104,13 +126,13 @@ describe("getNL2025StikstofGebruiksNorm", () => { // The base norm for Grasland in zand_nwc is 200 in nv-gebied. With winterteelt, korting should be 0. expect(result.normValue).toBe(200) expect(result.normSource).toEqual( - "Grasland. Geen korting: winterteelt aanwezig", + "Grasland (beweiden). Geen korting: winterteelt aanwezig", ) }) it("should apply 0 korting if vanggewas is present (sown <= Oct 1st)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -140,7 +162,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should apply 5 korting if vanggewas is present (sown Oct 2nd - Oct 14th)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -170,7 +192,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should apply 10 korting if vanggewas is present (sown Oct 15th - Oct 31st)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -200,7 +222,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should apply 20 korting if vanggewas is present (sown Nov 1st or later)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -230,7 +252,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should apply 20 korting if no winterteelt or vanggewas is present in zand_nwc region", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.656346970245633, 51.987872886419524], // This centroid is in 'zand_nwc' @@ -260,7 +282,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should not apply korting if region is not sandy or loess, even without winterteelt/vanggewas", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.648307588666836, 51.96484772224782], // This centroid is in 'klei' @@ -290,7 +312,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Gras voor industriële verwerking (eerste jaar)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -314,7 +336,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Gras voor industriële verwerking (volgende jaren)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -343,7 +365,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Graszaad, Engels raaigras (1e jaars)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -367,7 +389,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Graszaad, Engels raaigras (overjarig)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -396,7 +418,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Akkerbouwgewassen, Roodzwenkgras (1e jaars)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -420,7 +442,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Akkerbouwgewassen, Roodzwenkgras (overjarig)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -449,7 +471,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Winterui (1e jaars)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -473,7 +495,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Winterui (2e jaars)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -497,7 +519,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Bladgewassen, Spinazie (1e teelt)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -519,7 +541,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Bladgewassen, Slasoorten (1e teelt)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region @@ -543,7 +565,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for Bladgewassen, Andijvie eerste teelt volgteelt (1e teelt)", async () => { const mockInput: NL2025NormsInput = { - farm: { is_derogatie_bedrijf: false }, + farm: { is_derogatie_bedrijf: false, has_grazing_intention: false }, field: { b_id: "1", b_centroid: [5.6279889, 51.975571], // Klei region From 81497ddd66fa0ac919bab724365b91dad257dcc3 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:11:08 +0200 Subject: [PATCH 052/243] feat: add table 11 --- .../nl/2025/filling/table-11-mestcodes.ts | 336 ++++++++++++++++++ .../src/norms/nl/2025/filling/types.d.ts | 8 + 2 files changed, 344 insertions(+) create mode 100644 fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/types.d.ts diff --git a/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts b/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts new file mode 100644 index 000000000..bbac1b3fc --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts @@ -0,0 +1,336 @@ +import type { Table11Mestcodes } from "./types" + +export const table11Mestcodes: Table11Mestcodes = [ + { + p_type_rvo: "10", + p_type_animal: true, + p_n_rt: 6.4, + p_p_rt: 3.2, + }, + { + p_type_rvo: "11", + p_type_animal: true, + p_n_rt: 4.0, + p_p_rt: 1.3, + }, + { + p_type_rvo: "12", + p_type_animal: true, + p_n_rt: 4.0, + p_p_rt: 0.2, + }, + { + p_type_rvo: "13", + p_type_animal: true, + p_n_rt: 9.2, + p_p_rt: 9.2, + }, + { + p_type_rvo: "14", + p_type_animal: true, + p_n_rt: 4.0, + p_p_rt: 1.5, + }, + { + p_type_rvo: "17", + p_type_animal: true, + p_n_rt: 4.2, + p_p_rt: 5.0, + }, + { + p_type_rvo: "18", + p_type_animal: true, + p_n_rt: 3.2, + p_p_rt: 1.2, + }, + { + p_type_rvo: "19", + p_type_animal: true, + p_n_rt: 5.5, + p_p_rt: 2.2, + }, + { + p_type_rvo: "23", + p_type_animal: true, + p_n_rt: 30.1, + p_p_rt: 22.9, + }, + { + p_type_rvo: "30", + p_type_animal: true, + p_n_rt: 9.9, + p_p_rt: 6.2, + }, + { + p_type_rvo: "31", + p_type_animal: true, + p_n_rt: 24.3, + p_p_rt: 22.1, + }, + { + p_type_rvo: "32", + p_type_animal: true, + p_n_rt: 26.0, + p_p_rt: 20.9, + }, + { + p_type_rvo: "33", + p_type_animal: true, + p_n_rt: 32.6, + p_p_rt: 26.3, + }, + { + p_type_rvo: "35", + p_type_animal: true, + p_n_rt: 26.8, + p_p_rt: 24.9, + }, + { + p_type_rvo: "39", + p_type_animal: true, + p_n_rt: 31.1, + p_p_rt: 15.4, + }, + { + p_type_rvo: "40", + p_type_animal: true, + p_n_rt: 8.1, + p_p_rt: 8.0, + }, + { + p_type_rvo: "41", + p_type_animal: true, + p_n_rt: 6.8, + p_p_rt: 1.6, + }, + { + p_type_rvo: "42", + p_type_animal: true, + p_n_rt: 2.0, + p_p_rt: 0.9, + }, + { + p_type_rvo: "43", + p_type_animal: true, + p_n_rt: 11.0, + p_p_rt: 17.8, + }, + { + p_type_rvo: "46", + p_type_animal: true, + p_n_rt: 3.8, + p_p_rt: 2.4, + }, + { + p_type_rvo: "50", + p_type_animal: true, + p_n_rt: 6.4, + p_p_rt: 3.8, + }, + { + p_type_rvo: "56", + p_type_animal: true, + p_n_rt: 8.5, + p_p_rt: 4.7, + }, + { + p_type_rvo: "60", + p_type_animal: true, + p_n_rt: 4.8, + p_p_rt: 2.5, + }, + { + p_type_rvo: "61", + p_type_animal: true, + p_n_rt: 9.1, + p_p_rt: 4.8, + }, + { + p_type_rvo: "75", + p_type_animal: true, + p_n_rt: 27.7, + p_p_rt: 45.7, + }, + { + p_type_rvo: "76", + p_type_animal: true, + p_n_rt: 7.9, + p_p_rt: 3.1, + }, + { + p_type_rvo: "80", + p_type_animal: true, + p_n_rt: 9.7, + p_p_rt: 9.4, + }, + { + p_type_rvo: "81", + p_type_animal: true, + p_n_rt: 5.8, + p_p_rt: 3.8, + }, + { + p_type_rvo: "90", + p_type_animal: true, + p_n_rt: 11.3, + p_p_rt: 11.7, + }, + { + p_type_rvo: "91", + p_type_animal: true, + p_n_rt: 0.81, + p_p_rt: 0.14, + }, + { + p_type_rvo: "92", + p_type_animal: true, + p_n_rt: 4.4, + p_p_rt: 3.0, + }, + { + p_type_rvo: "25", + p_type_animal: true, + p_n_rt: 4.8, + p_p_rt: 2.5, + }, + { + p_type_rvo: "26", + p_type_animal: true, + p_n_rt: 5.0, + p_p_rt: 3.0, + }, + { + p_type_rvo: "27", + p_type_animal: true, + p_n_rt: 4.7, + p_p_rt: 3.2, + }, + { + p_type_rvo: "95", + p_type_animal: true, + p_n_rt: 7.1, + p_p_rt: 5.3, + }, + { + p_type_rvo: "96", + p_type_animal: true, + p_n_rt: 4.1, + p_p_rt: 2.1, + }, + { + p_type_rvo: "97", + p_type_animal: true, + p_n_rt: 8.9, + p_p_rt: 8.1, + }, + { + p_type_rvo: "98", + p_type_animal: true, + p_n_rt: 8.9, + p_p_rt: 8.1, + }, + { + p_type_rvo: "99", + p_type_animal: true, + p_n_rt: 32.6, + p_p_rt: 17.7, + }, + { + p_type_rvo: "100", + p_type_animal: true, + p_n_rt: 23.1, + p_p_rt: 18.7, + }, + { + p_type_rvo: "101", + p_type_animal: true, + p_n_rt: 23.1, + p_p_rt: 18.7, + }, + { + p_type_rvo: "102", + p_type_animal: true, + p_n_rt: 11.9, + p_p_rt: 11.7, + }, + { + p_type_rvo: "103", + p_type_animal: true, + p_n_rt: 11.9, + p_p_rt: 11.7, + }, + { + p_type_rvo: "104", + p_type_animal: true, + p_n_rt: 11.9, + p_p_rt: 11.7, + }, + { + p_type_rvo: "105", + p_type_animal: true, + p_n_rt: 11.9, + p_p_rt: 11.7, + }, + { + p_type_rvo: "106", + p_type_animal: true, + p_n_rt: 11.9, + p_p_rt: 11.7, + }, + { + p_type_rvo: "107", + p_type_animal: true, + p_n_rt: 5.5, + p_p_rt: 3.1, + }, + { + p_type_rvo: "108", + p_type_animal: true, + }, + { + p_type_rvo: "109", + p_type_animal: true, + p_n_rt: 8.0, + p_p_rt: 4.4, + }, + { + p_type_rvo: "110", + p_type_animal: true, + p_n_rt: 7.0, + p_p_rt: 3.9, + }, + { + p_type_rvo: "111", + p_type_animal: false, + }, + { + p_type_rvo: "112", + p_type_animal: false, + }, + { + p_type_rvo: "113", + p_type_animal: false, + }, + { + p_type_rvo: "114", + p_type_animal: false, + }, + { + p_type_rvo: "115", + p_type_animal: false, + }, + { + p_type_rvo: "116", + p_type_animal: false, + }, + { + p_type_rvo: "117", + p_type_animal: true, + p_n_rt: 7.1, + p_p_rt: 4.1, + }, + { + p_type_rvo: "120", + p_type_animal: true, + }, +] diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts new file mode 100644 index 000000000..385266db3 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -0,0 +1,8 @@ +import type { fdmSchema } from "@svenvw/fdm-core" + +export type Table11Mestcodes = { + p_type_rvo: fdmSchema.fertilizersCatalogueTypeSelect["p_type_rvo"] + p_type_animal: boolean + p_n_rt?: number + p_p_rt?: number +}[] From 6f5d0b41d17e732d6fbfa269a14a6ed593632122 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 16 Oct 2025 09:59:56 +0200 Subject: [PATCH 053/243] feat: implement the function to calculate the filling for dierlijke mest gebruiksnorm --- fdm-calculator/src/norms/index.test.ts | 8 +- fdm-calculator/src/norms/index.ts | 8 +- .../dierlijke-mest-gebruiksnorm.test.ts | 152 ++++++++++++++++++ .../filling/dierlijke-mest-gebruiksnorm.ts | 96 +++++++++++ .../nl/2025/filling/table-11-mestcodes.ts | 116 ++++++------- .../src/norms/nl/2025/filling/types.d.ts | 10 +- 6 files changed, 322 insertions(+), 68 deletions(-) create mode 100644 fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts diff --git a/fdm-calculator/src/norms/index.test.ts b/fdm-calculator/src/norms/index.test.ts index 47b971ad0..f19f49f87 100644 --- a/fdm-calculator/src/norms/index.test.ts +++ b/fdm-calculator/src/norms/index.test.ts @@ -8,6 +8,8 @@ import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-geb import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" import { collectNL2025InputForNorms } from "./nl/2025/input" import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" +import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" +import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" describe("createFunctionsForNorms", () => { it("should return the correct functions for NL region and year 2025", () => { @@ -56,10 +58,8 @@ describe("createFunctionsForFertilizerApplicationFilling", () => { ).toThrowError( "calculateFertilizerApplicationFillingForNitrogen is not implemented yet", ) - expect( - functions.calculateFertilizerApplicationFillingForManure, - ).toThrowError( - "calculateFertilizerApplicationFillingForManure is not implemented yet", + expect(functions.calculateFertilizerApplicationFillingForManure).toBe( + calculateFertilizerApplicationFillingForManure, ) expect( functions.calculateFertilizerApplicationFillingForPhosphate, diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index 5dfa708fb..bfce0591f 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -1,5 +1,6 @@ import { aggregateNormsToFarmLevel } from "./farm" import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" +import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" import { collectNL2025InputForNorms } from "./nl/2025/input" import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" @@ -38,11 +39,8 @@ export function createFunctionsForFertilizerApplicationFilling( "calculateFertilizerApplicationFillingForNitrogen is not implemented yet", ) }, - calculateFertilizerApplicationFillingForManure: () => { - throw new Error( - "calculateFertilizerApplicationFillingForManure is not implemented yet", - ) - }, + calculateFertilizerApplicationFillingForManure: + calculateFertilizerApplicationFillingForManure, calculateFertilizerApplicationFillingForPhosphate: () => { throw new Error( "calculateFertilizerApplicationFillingForPhosphate is not implemented yet", diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts new file mode 100644 index 000000000..2833ed3a1 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts @@ -0,0 +1,152 @@ +import { describe, it, expect } from "vitest" +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import { calculateFertilizerApplicationFillingForManure } from "./dierlijke-mest-gebruiksnorm" + +describe("calculateFertilizerApplicationFillingForManure", () => { + const mockFertilizers: Fertilizer[] = [ + { + p_id_catalogue: "1", + p_type_rvo: "11", + p_n_rt: 0.5, + }, + { + p_id_catalogue: "2", + p_type_rvo: "12", + }, + { + p_id_catalogue: "3", + p_type_rvo: "200", // Not in table11Mestcodes + }, + { + p_id_catalogue: "4", + // No p_type_rvo + }, + { + p_id_catalogue: "5", + p_type_rvo: "115", // Not relevant for nitrates directive + }, + ] + + const mockApplications: FertilizerApplication[] = [ + { + p_app_id: "app1", + p_id_catalogue: "1", + p_app_amount: 10000, + }, + { + p_app_id: "app2", + p_id_catalogue: "2", + p_app_amount: 20000, + }, + ] + + it("should calculate the norm filling for a single application", () => { + const result = calculateFertilizerApplicationFillingForManure({ + applications: [mockApplications[0]], + fertilizers: mockFertilizers, + }) + + expect(result.normFilling).toBe(5) + expect(result.applicationFilling).toEqual([ + { + p_app_id: "app1", + normFilling: 5, + }, + ]) + }) + + it("should calculate the norm filling for multiple applications", () => { + const result = calculateFertilizerApplicationFillingForManure({ + applications: mockApplications, + fertilizers: mockFertilizers, + }) + + expect(result.normFilling).toBe(85) // 5 + 80 + expect(result.applicationFilling).toEqual([ + { + p_app_id: "app1", + normFilling: 5, + }, + { + p_app_id: "app2", + normFilling: 80, + }, + ]) + }) + + it("should return zero filling for fertilizers not relevant to the nitrates directive", () => { + const result = calculateFertilizerApplicationFillingForManure({ + applications: [ + { + p_app_id: "app3", + p_id_catalogue: "5", + p_app_amount: 10, + }, + ], + fertilizers: mockFertilizers, + }) + + expect(result.normFilling).toBe(0) + expect(result.applicationFilling).toEqual([ + { + p_app_id: "app3", + normFilling: 0, + }, + ]) + }) + + it("should throw an error if a fertilizer is not found", () => { + expect(() => + calculateFertilizerApplicationFillingForManure({ + applications: [ + { + p_app_id: "app4", + p_id_catalogue: "999", + p_app_amount: 10, + }, + ], + fertilizers: mockFertilizers, + }), + ).toThrow("Fertilizer 999 not found for application app4") + }) + + it("should throw an error if a fertilizer has no p_type_rvo", () => { + expect(() => + calculateFertilizerApplicationFillingForManure({ + applications: [ + { + p_app_id: "app5", + p_id_catalogue: "4", + p_app_amount: 10, + }, + ], + fertilizers: mockFertilizers, + }), + ).toThrow("Fertilizer 4 has no p_type_rvo") + }) + + it("should throw an error if a fertilizer has an unknown p_type_rvo", () => { + expect(() => + calculateFertilizerApplicationFillingForManure({ + applications: [ + { + p_app_id: "app6", + p_id_catalogue: "3", + p_app_amount: 10, + }, + ], + fertilizers: mockFertilizers, + }), + ).toThrow("Fertilizer 3 has unknown p_type_rvo 200") + }) + + it("should return zero filling when no applications are provided", () => { + const result = calculateFertilizerApplicationFillingForManure({ + applications: [], + fertilizers: mockFertilizers, + }) + + expect(result.normFilling).toBe(0) + expect(result.applicationFilling).toEqual([]) + }) +}) diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts new file mode 100644 index 000000000..8dd16f02d --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts @@ -0,0 +1,96 @@ +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import Decimal from "decimal.js" +import { table11Mestcodes } from "./table-11-mestcodes" +import type { NormFilling } from "./types" + +/** + * Calculates the nitrogen usage from animal manure for a list of fertilizer applications. + * + * This function determines the contribution of each fertilizer application to the nitrogen norm + * based on the type of manure used. It uses predefined values from `table11Mestcodes` to identify + * which fertilizers are considered animal manure and to find their nitrogen content. + * + * @param {object} params - The parameters for the calculation. + * @param {FertilizerApplication[]} params.applications - A list of fertilizer applications, each specifying the amount and type of fertilizer used. + * @param {Fertilizer[]} params.fertilizers - A list of available fertilizers, providing details like nitrogen content. + * @returns {NormFilling} An object containing the total nitrogen usage (`normFilling`) and a detailed breakdown per application (`applicationFilling`). + * @throws {Error} Throws an error if a fertilizer or its RVO type is not found, ensuring data integrity. + */ +export function calculateFertilizerApplicationFillingForManure({ + applications, + fertilizers, +}: { + applications: FertilizerApplication[] + fertilizers: Fertilizer[] +}): NormFilling { + // Create maps for efficient lookups of fertilizers and RVO types. + // This avoids iterating over the arrays repeatedly in a loop. + const fertilizersMap = new Map( + fertilizers.map((fertilizer) => [fertilizer.p_id_catalogue, fertilizer]), + ) + const rvoTypeMap = new Map( + table11Mestcodes.map((rvoType) => [rvoType.p_type_rvo, rvoType]), + ) + + // Use reduce to iterate over applications and calculate the total norm filling. + const { totalFilling, applicationFilling } = applications.reduce( + (acc, application) => { + // Retrieve the fertilizer for the current application. + const fertilizer = fertilizersMap.get(application.p_id_catalogue) + if (!fertilizer) { + throw new Error( + `Fertilizer ${application.p_id_catalogue} not found for application ${application.p_app_id}`, + ) + } + + // Get the RVO type of the fertilizer. + const p_type_rvo = fertilizer.p_type_rvo + if (!p_type_rvo) { + throw new Error( + `Fertilizer ${application.p_id_catalogue} has no p_type_rvo`, + ) + } + + // Find the properties associated with the RVO type. + const rvoTypeProperties = rvoTypeMap.get(p_type_rvo) + if (!rvoTypeProperties) { + throw new Error( + `Fertilizer ${application.p_id_catalogue} has unknown p_type_rvo ${p_type_rvo}`, + ) + } + + let normFilling = new Decimal(0) + // Check if the fertilizer is relevant for the nitrates directive. + if (rvoTypeProperties.p_type_nitratesdirective) { + const amount = new Decimal(application.p_app_amount) + // Determine the nitrogen content, using specific values if available, otherwise fallback to default. + const p_n_rt = new Decimal( + fertilizer.p_n_rt ?? rvoTypeProperties.p_n_rt ?? 0, + ) + // Calculate the norm filling for this application. + normFilling = amount.times(p_n_rt).dividedBy(1000) + } + + // Add the filling of the current application to the total. + acc.totalFilling = acc.totalFilling.plus(normFilling) + // Add the detailed filling for this application to the list. + acc.applicationFilling.push({ + p_app_id: application.p_app_id, + normFilling: normFilling.toNumber(), + }) + + return acc + }, + // Initial value for the accumulator. + { + totalFilling: new Decimal(0), + applicationFilling: [] as { p_app_id: string; normFilling: number }[], + }, + ) + + // Return the total norm filling and the breakdown per application. + return { + normFilling: totalFilling.toNumber(), + applicationFilling, + } +} diff --git a/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts b/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts index bbac1b3fc..34d5d38a2 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts @@ -3,334 +3,334 @@ import type { Table11Mestcodes } from "./types" export const table11Mestcodes: Table11Mestcodes = [ { p_type_rvo: "10", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 6.4, p_p_rt: 3.2, }, { p_type_rvo: "11", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.0, p_p_rt: 1.3, }, { p_type_rvo: "12", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.0, p_p_rt: 0.2, }, { p_type_rvo: "13", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 9.2, p_p_rt: 9.2, }, { p_type_rvo: "14", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.0, p_p_rt: 1.5, }, { p_type_rvo: "17", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.2, p_p_rt: 5.0, }, { p_type_rvo: "18", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 3.2, p_p_rt: 1.2, }, { p_type_rvo: "19", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 5.5, p_p_rt: 2.2, }, { p_type_rvo: "23", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 30.1, p_p_rt: 22.9, }, { p_type_rvo: "30", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 9.9, p_p_rt: 6.2, }, { p_type_rvo: "31", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 24.3, p_p_rt: 22.1, }, { p_type_rvo: "32", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 26.0, p_p_rt: 20.9, }, { p_type_rvo: "33", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 32.6, p_p_rt: 26.3, }, { p_type_rvo: "35", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 26.8, p_p_rt: 24.9, }, { p_type_rvo: "39", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 31.1, p_p_rt: 15.4, }, { p_type_rvo: "40", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 8.1, p_p_rt: 8.0, }, { p_type_rvo: "41", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 6.8, p_p_rt: 1.6, }, { p_type_rvo: "42", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 2.0, p_p_rt: 0.9, }, { p_type_rvo: "43", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.0, p_p_rt: 17.8, }, { p_type_rvo: "46", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 3.8, p_p_rt: 2.4, }, { p_type_rvo: "50", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 6.4, p_p_rt: 3.8, }, { p_type_rvo: "56", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 8.5, p_p_rt: 4.7, }, { p_type_rvo: "60", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.8, p_p_rt: 2.5, }, { p_type_rvo: "61", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 9.1, p_p_rt: 4.8, }, { p_type_rvo: "75", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 27.7, p_p_rt: 45.7, }, { p_type_rvo: "76", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 7.9, p_p_rt: 3.1, }, { p_type_rvo: "80", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 9.7, p_p_rt: 9.4, }, { p_type_rvo: "81", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 5.8, p_p_rt: 3.8, }, { p_type_rvo: "90", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.3, p_p_rt: 11.7, }, { p_type_rvo: "91", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 0.81, p_p_rt: 0.14, }, { p_type_rvo: "92", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.4, p_p_rt: 3.0, }, { p_type_rvo: "25", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.8, p_p_rt: 2.5, }, { p_type_rvo: "26", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 5.0, p_p_rt: 3.0, }, { p_type_rvo: "27", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.7, p_p_rt: 3.2, }, { p_type_rvo: "95", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 7.1, p_p_rt: 5.3, }, { p_type_rvo: "96", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 4.1, p_p_rt: 2.1, }, { p_type_rvo: "97", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 8.9, p_p_rt: 8.1, }, { p_type_rvo: "98", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 8.9, p_p_rt: 8.1, }, { p_type_rvo: "99", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 32.6, p_p_rt: 17.7, }, { p_type_rvo: "100", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 23.1, p_p_rt: 18.7, }, { p_type_rvo: "101", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 23.1, p_p_rt: 18.7, }, { p_type_rvo: "102", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.9, p_p_rt: 11.7, }, { p_type_rvo: "103", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.9, p_p_rt: 11.7, }, { p_type_rvo: "104", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.9, p_p_rt: 11.7, }, { p_type_rvo: "105", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.9, p_p_rt: 11.7, }, { p_type_rvo: "106", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 11.9, p_p_rt: 11.7, }, { p_type_rvo: "107", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 5.5, p_p_rt: 3.1, }, { p_type_rvo: "108", - p_type_animal: true, + p_type_nitratesdirective: true, }, { p_type_rvo: "109", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 8.0, p_p_rt: 4.4, }, { p_type_rvo: "110", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 7.0, p_p_rt: 3.9, }, { p_type_rvo: "111", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "112", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "113", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "114", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "115", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "116", - p_type_animal: false, + p_type_nitratesdirective: false, }, { p_type_rvo: "117", - p_type_animal: true, + p_type_nitratesdirective: true, p_n_rt: 7.1, p_p_rt: 4.1, }, { p_type_rvo: "120", - p_type_animal: true, + p_type_nitratesdirective: true, }, ] diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 385266db3..5e38f06a7 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -1,8 +1,16 @@ import type { fdmSchema } from "@svenvw/fdm-core" +export type NormFilling = { + normFilling: number + applicationFilling: { + p_app_id: string + normFilling: number + }[] +} + export type Table11Mestcodes = { p_type_rvo: fdmSchema.fertilizersCatalogueTypeSelect["p_type_rvo"] - p_type_animal: boolean + p_type_nitratesdirective: boolean p_n_rt?: number p_p_rt?: number }[] From a38d20777d999421e5a2e7b54898678232c9c104 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:32:49 +0200 Subject: [PATCH 054/243] chore: remove migration to merge dev branch --- .../migrations/0014_ancient_ezekiel_stane.sql | 4 - .../src/db/migrations/meta/0014_snapshot.json | 3117 ----------------- fdm-core/src/db/migrations/meta/_journal.json | 213 +- 3 files changed, 103 insertions(+), 3231 deletions(-) delete mode 100644 fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql delete mode 100644 fdm-core/src/db/migrations/meta/0014_snapshot.json diff --git a/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql b/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql deleted file mode 100644 index 6d904c5e6..000000000 --- a/fdm-core/src/db/migrations/0014_ancient_ezekiel_stane.sql +++ /dev/null @@ -1,4 +0,0 @@ -ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_lu_start_default" text;--> statement-breakpoint -ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_date_harvest_default" text;--> statement-breakpoint -ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_lu_start_default_format" CHECK (b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$');--> statement-breakpoint -ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_date_harvest_default_format" CHECK (b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'); \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0014_snapshot.json b/fdm-core/src/db/migrations/meta/0014_snapshot.json deleted file mode 100644 index b67a8d35e..000000000 --- a/fdm-core/src/db/migrations/meta/0014_snapshot.json +++ /dev/null @@ -1,3117 +0,0 @@ -{ - "id": "5ba4f7c3-7e93-40b0-b184-e837bcbc41cc", - "prevId": "c953a71f-8431-4aea-94b9-e49a5a96cf0c", - "version": "7", - "dialect": "postgresql", - "tables": { - "fdm.cultivation_catalogue_selecting": { - "name": "cultivation_catalogue_selecting", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_source": { - "name": "b_lu_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { - "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "cultivation_catalogue_selecting", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_ending": { - "name": "cultivation_ending", - "schema": "fdm", - "columns": { - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_end": { - "name": "b_lu_end", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "m_cropresidue": { - "name": "m_cropresidue", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_ending_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_ending", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_harvesting": { - "name": "cultivation_harvesting", - "schema": "fdm", - "columns": { - "b_id_harvesting": { - "name": "b_id_harvesting", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_harvest_date": { - "name": "b_lu_harvest_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { - "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", - "tableFrom": "cultivation_harvesting", - "tableTo": "harvestables", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable" - ], - "columnsTo": [ - "b_id_harvestable" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_harvesting", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_starting": { - "name": "cultivation_starting", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_start": { - "name": "b_lu_start", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_sowing_amount": { - "name": "b_sowing_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_sowing_method": { - "name": "b_sowing_method", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_starting_b_id_fields_b_id_fk": { - "name": "cultivation_starting_b_id_fields_b_id_fk", - "tableFrom": "cultivation_starting", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "cultivation_starting_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_starting", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivations": { - "name": "cultivations", - "schema": "fdm", - "columns": { - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_catalogue": { - "name": "b_lu_catalogue", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_variety": { - "name": "b_lu_variety", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_lu_idx": { - "name": "b_lu_idx", - "columns": [ - { - "expression": "b_lu", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { - "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", - "tableFrom": "cultivations", - "tableTo": "cultivations_catalogue", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu_catalogue" - ], - "columnsTo": [ - "b_lu_catalogue" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivations_catalogue": { - "name": "cultivations_catalogue", - "schema": "fdm", - "columns": { - "b_lu_catalogue": { - "name": "b_lu_catalogue", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_source": { - "name": "b_lu_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_name": { - "name": "b_lu_name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_name_en": { - "name": "b_lu_name_en", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_harvestable": { - "name": "b_lu_harvestable", - "type": "b_lu_harvestable", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": true - }, - "b_lu_hcat3": { - "name": "b_lu_hcat3", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_hcat3_name": { - "name": "b_lu_hcat3_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_croprotation": { - "name": "b_lu_croprotation", - "type": "b_lu_croprotation", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "b_lu_yield": { - "name": "b_lu_yield", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_hi": { - "name": "b_lu_hi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_harvestable": { - "name": "b_lu_n_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_residue": { - "name": "b_lu_n_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_n_fixation": { - "name": "b_n_fixation", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_rest_oravib": { - "name": "b_lu_rest_oravib", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "b_lu_variety_options": { - "name": "b_lu_variety_options", - "type": "text[]", - "primaryKey": false, - "notNull": false - }, - "b_lu_start_default": { - "name": "b_lu_start_default", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_date_harvest_default": { - "name": "b_date_harvest_default", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "hash": { - "name": "hash", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_lu_catalogue_idx": { - "name": "b_lu_catalogue_idx", - "columns": [ - { - "expression": "b_lu_catalogue", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": { - "b_lu_start_default_format": { - "name": "b_lu_start_default_format", - "value": "b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" - }, - "b_date_harvest_default_format": { - "name": "b_date_harvest_default_format", - "value": "b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" - } - }, - "isRLSEnabled": false - }, - "fdm.derogation_applying": { - "name": "derogation_applying", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_derogation": { - "name": "b_id_derogation", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "derogation_applying_b_id_farm_farms_b_id_farm_fk": { - "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "derogation_applying", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { - "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", - "tableFrom": "derogation_applying", - "tableTo": "derogations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_derogation" - ], - "columnsTo": [ - "b_id_derogation" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.derogations": { - "name": "derogations", - "schema": "fdm", - "columns": { - "b_id_derogation": { - "name": "b_id_derogation", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_derogation_year": { - "name": "b_derogation_year", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.farms": { - "name": "farms", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_name_farm": { - "name": "b_name_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_businessid_farm": { - "name": "b_businessid_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_address_farm": { - "name": "b_address_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_postalcode_farm": { - "name": "b_postalcode_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_farm_idx": { - "name": "b_id_farm_idx", - "columns": [ - { - "expression": "b_id_farm", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_acquiring": { - "name": "fertilizer_acquiring", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_acquiring_amount": { - "name": "p_acquiring_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_acquiring_date": { - "name": "p_acquiring_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { - "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "fertilizer_acquiring", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_acquiring", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_applying": { - "name": "fertilizer_applying", - "schema": "fdm", - "columns": { - "p_app_id": { - "name": "p_app_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_app_amount": { - "name": "p_app_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_app_method": { - "name": "p_app_method", - "type": "p_app_method", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "p_app_date": { - "name": "p_app_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_app_idx": { - "name": "p_app_idx", - "columns": [ - { - "expression": "p_app_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "fertilizer_applying_b_id_fields_b_id_fk": { - "name": "fertilizer_applying_b_id_fields_b_id_fk", - "tableFrom": "fertilizer_applying", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_applying_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_applying", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_catalogue_enabling": { - "name": "fertilizer_catalogue_enabling", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_source": { - "name": "p_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { - "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "fertilizer_catalogue_enabling", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_picking": { - "name": "fertilizer_picking", - "schema": "fdm", - "columns": { - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id_catalogue": { - "name": "p_id_catalogue", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_picking_date": { - "name": "p_picking_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_picking_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_picking", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { - "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", - "tableFrom": "fertilizer_picking", - "tableTo": "fertilizers_catalogue", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id_catalogue" - ], - "columnsTo": [ - "p_id_catalogue" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizers": { - "name": "fertilizers", - "schema": "fdm", - "columns": { - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_id_idx": { - "name": "p_id_idx", - "columns": [ - { - "expression": "p_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizers_catalogue": { - "name": "fertilizers_catalogue", - "schema": "fdm", - "columns": { - "p_id_catalogue": { - "name": "p_id_catalogue", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "p_source": { - "name": "p_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_name_nl": { - "name": "p_name_nl", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_name_en": { - "name": "p_name_en", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "p_description": { - "name": "p_description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "p_app_method_options": { - "name": "p_app_method_options", - "type": "p_app_method[]", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "p_dm": { - "name": "p_dm", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_density": { - "name": "p_density", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_om": { - "name": "p_om", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_a": { - "name": "p_a", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_hc": { - "name": "p_hc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_eom": { - "name": "p_eom", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_eoc": { - "name": "p_eoc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_rt": { - "name": "p_c_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_of": { - "name": "p_c_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_if": { - "name": "p_c_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_fr": { - "name": "p_c_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cn_of": { - "name": "p_cn_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_rt": { - "name": "p_n_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_if": { - "name": "p_n_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_of": { - "name": "p_n_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_wc": { - "name": "p_n_wc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_no3_rt": { - "name": "p_no3_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_nh4_rt": { - "name": "p_nh4_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_p_rt": { - "name": "p_p_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_k_rt": { - "name": "p_k_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mg_rt": { - "name": "p_mg_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ca_rt": { - "name": "p_ca_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ne": { - "name": "p_ne", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_s_rt": { - "name": "p_s_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_s_wc": { - "name": "p_s_wc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cu_rt": { - "name": "p_cu_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_zn_rt": { - "name": "p_zn_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_na_rt": { - "name": "p_na_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_si_rt": { - "name": "p_si_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_b_rt": { - "name": "p_b_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mn_rt": { - "name": "p_mn_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ni_rt": { - "name": "p_ni_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_fe_rt": { - "name": "p_fe_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mo_rt": { - "name": "p_mo_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_co_rt": { - "name": "p_co_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_as_rt": { - "name": "p_as_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cd_rt": { - "name": "p_cd_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cr_rt": { - "name": "p_cr_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cr_vi": { - "name": "p_cr_vi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_pb_rt": { - "name": "p_pb_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_hg_rt": { - "name": "p_hg_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cl_rt": { - "name": "p_cl_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ef_nh3": { - "name": "p_ef_nh3", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_type_manure": { - "name": "p_type_manure", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "p_type_mineral": { - "name": "p_type_mineral", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "p_type_compost": { - "name": "p_type_compost", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "hash": { - "name": "hash", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_id_catalogue_idx": { - "name": "p_id_catalogue_idx", - "columns": [ - { - "expression": "p_id_catalogue", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.field_acquiring": { - "name": "field_acquiring", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_start": { - "name": "b_start", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_acquiring_method": { - "name": "b_acquiring_method", - "type": "b_acquiring_method", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": true, - "default": "'unknown'" - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "field_acquiring_b_id_fields_b_id_fk": { - "name": "field_acquiring_b_id_fields_b_id_fk", - "tableFrom": "field_acquiring", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "field_acquiring_b_id_farm_farms_b_id_farm_fk": { - "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "field_acquiring", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.field_discarding": { - "name": "field_discarding", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_end": { - "name": "b_end", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "field_discarding_b_id_fields_b_id_fk": { - "name": "field_discarding_b_id_fields_b_id_fk", - "tableFrom": "field_discarding", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fields": { - "name": "fields", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_name": { - "name": "b_name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_geometry": { - "name": "b_geometry", - "type": "geometry(Polygon,4326)", - "primaryKey": false, - "notNull": false - }, - "b_id_source": { - "name": "b_id_source", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_idx": { - "name": "b_id_idx", - "columns": [ - { - "expression": "b_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - }, - "b_geom_idx": { - "name": "b_geom_idx", - "columns": [ - { - "expression": "b_geometry", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gist", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestable_analyses": { - "name": "harvestable_analyses", - "schema": "fdm", - "columns": { - "b_id_harvestable_analysis": { - "name": "b_id_harvestable_analysis", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_yield": { - "name": "b_lu_yield", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_harvestable": { - "name": "b_lu_n_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_residue": { - "name": "b_lu_n_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_p_harvestable": { - "name": "b_lu_p_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_p_residue": { - "name": "b_lu_p_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_k_harvestable": { - "name": "b_lu_k_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_k_residue": { - "name": "b_lu_k_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_harvestable_analyses_idx": { - "name": "b_id_harvestable_analyses_idx", - "columns": [ - { - "expression": "b_id_harvestable_analysis", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestable_sampling": { - "name": "harvestable_sampling", - "schema": "fdm", - "columns": { - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_harvestable_analysis": { - "name": "b_id_harvestable_analysis", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_sampling_date": { - "name": "b_sampling_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { - "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", - "tableFrom": "harvestable_sampling", - "tableTo": "harvestables", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable" - ], - "columnsTo": [ - "b_id_harvestable" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { - "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", - "tableFrom": "harvestable_sampling", - "tableTo": "harvestable_analyses", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable_analysis" - ], - "columnsTo": [ - "b_id_harvestable_analysis" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestables": { - "name": "harvestables", - "schema": "fdm", - "columns": { - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_harvestable_idx": { - "name": "b_id_harvestable_idx", - "columns": [ - { - "expression": "b_id_harvestable", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.soil_analysis": { - "name": "soil_analysis", - "schema": "fdm", - "columns": { - "a_id": { - "name": "a_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "a_date": { - "name": "a_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "a_source": { - "name": "a_source", - "type": "a_source", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false, - "default": "'other'" - }, - "a_al_ox": { - "name": "a_al_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_c_of": { - "name": "a_c_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ca_co": { - "name": "a_ca_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ca_co_po": { - "name": "a_ca_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_caco3_if": { - "name": "a_caco3_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cec_co": { - "name": "a_cec_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_clay_mi": { - "name": "a_clay_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cn_fr": { - "name": "a_cn_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_com_fr": { - "name": "a_com_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cu_cc": { - "name": "a_cu_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_density_sa": { - "name": "a_density_sa", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_fe_ox": { - "name": "a_fe_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_cc": { - "name": "a_k_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_co": { - "name": "a_k_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_co_po": { - "name": "a_k_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_cc": { - "name": "a_mg_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_co": { - "name": "a_mg_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_co_po": { - "name": "a_mg_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_n_pmn": { - "name": "a_n_pmn", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_n_rt": { - "name": "a_n_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_nh4_cc": { - "name": "a_nh4_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_nmin_cc": { - "name": "a_nmin_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_no3_cc": { - "name": "a_no3_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_al": { - "name": "a_p_al", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_cc": { - "name": "a_p_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_ox": { - "name": "a_p_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_rt": { - "name": "a_p_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_sg": { - "name": "a_p_sg", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_wa": { - "name": "a_p_wa", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ph_cc": { - "name": "a_ph_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_s_rt": { - "name": "a_s_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_sand_mi": { - "name": "a_sand_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_silt_mi": { - "name": "a_silt_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_som_loi": { - "name": "a_som_loi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_zn_cc": { - "name": "a_zn_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_gwl_class": { - "name": "b_gwl_class", - "type": "b_gwl_class", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "b_soiltype_agr": { - "name": "b_soiltype_agr", - "type": "b_soiltype_agr", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.soil_sampling": { - "name": "soil_sampling", - "schema": "fdm", - "columns": { - "b_id_sampling": { - "name": "b_id_sampling", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "a_id": { - "name": "a_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "a_depth_upper": { - "name": "a_depth_upper", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "a_depth_lower": { - "name": "a_depth_lower", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_sampling_date": { - "name": "b_sampling_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_sampling_geometry": { - "name": "b_sampling_geometry", - "type": "geometry(MultiPoint,4326)", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "soil_sampling_b_id_fields_b_id_fk": { - "name": "soil_sampling_b_id_fields_b_id_fk", - "tableFrom": "soil_sampling", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "soil_sampling_a_id_soil_analysis_a_id_fk": { - "name": "soil_sampling_a_id_soil_analysis_a_id_fk", - "tableFrom": "soil_sampling", - "tableTo": "soil_analysis", - "schemaTo": "fdm", - "columnsFrom": [ - "a_id" - ], - "columnsTo": [ - "a_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.account": { - "name": "account", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "account_id": { - "name": "account_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "access_token_expires_at": { - "name": "access_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "refresh_token_expires_at": { - "name": "refresh_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "scope": { - "name": "scope", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "account_user_id_user_id_fk": { - "name": "account_user_id_user_id_fk", - "tableFrom": "account", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.invitation": { - "name": "invitation", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "organization_id": { - "name": "organization_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "inviter_id": { - "name": "inviter_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "invitation_organization_id_organization_id_fk": { - "name": "invitation_organization_id_organization_id_fk", - "tableFrom": "invitation", - "tableTo": "organization", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "organization_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "invitation_inviter_id_user_id_fk": { - "name": "invitation_inviter_id_user_id_fk", - "tableFrom": "invitation", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "inviter_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.member": { - "name": "member", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "organization_id": { - "name": "organization_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "member_organization_id_organization_id_fk": { - "name": "member_organization_id_organization_id_fk", - "tableFrom": "member", - "tableTo": "organization", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "organization_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "member_user_id_user_id_fk": { - "name": "member_user_id_user_id_fk", - "tableFrom": "member", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.organization": { - "name": "organization", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "logo": { - "name": "logo", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "metadata": { - "name": "metadata", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "organization_slug_unique": { - "name": "organization_slug_unique", - "nullsNotDistinct": false, - "columns": [ - "slug" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.rate_limit": { - "name": "rate_limit", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "key": { - "name": "key", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "count": { - "name": "count", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "last_request": { - "name": "last_request", - "type": "bigint", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.session": { - "name": "session", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "active_organization_id": { - "name": "active_organization_id", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "session_token_unique": { - "name": "session_token_unique", - "nullsNotDistinct": false, - "columns": [ - "token" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.user": { - "name": "user", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email_verified": { - "name": "email_verified", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "image": { - "name": "image", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "display_username": { - "name": "display_username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "firstname": { - "name": "firstname", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "surname": { - "name": "surname", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "lang": { - "name": "lang", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "farm_active": { - "name": "farm_active", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_email_unique": { - "name": "user_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - }, - "user_username_unique": { - "name": "user_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.verification": { - "name": "verification", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "identifier": { - "name": "identifier", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authz.audit": { - "name": "audit", - "schema": "fdm-authz", - "columns": { - "audit_id": { - "name": "audit_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "audit_timestamp": { - "name": "audit_timestamp", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "audit_origin": { - "name": "audit_origin", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "principal_id": { - "name": "principal_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "target_resource": { - "name": "target_resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "target_resource_id": { - "name": "target_resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "granting_resource": { - "name": "granting_resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "granting_resource_id": { - "name": "granting_resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "action": { - "name": "action", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "allowed": { - "name": "allowed", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "duration": { - "name": "duration", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authz.role": { - "name": "role", - "schema": "fdm-authz", - "columns": { - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "resource": { - "name": "resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "principal_id": { - "name": "principal_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted": { - "name": "deleted", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "role_idx": { - "name": "role_idx", - "columns": [ - { - "expression": "resource", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "resource_id", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "principal_id", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "role", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "deleted", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - } - }, - "enums": { - "fdm.p_app_method": { - "name": "p_app_method", - "schema": "fdm", - "values": [ - "slotted coulter", - "incorporation", - "incorporation 2 tracks", - "injection", - "shallow injection", - "spraying", - "broadcasting", - "spoke wheel", - "pocket placement", - "narrowband" - ] - }, - "fdm.b_gwl_class": { - "name": "b_gwl_class", - "schema": "fdm", - "values": [ - "I", - "Ia", - "Ic", - "II", - "IIa", - "IIb", - "IIc", - "III", - "IIIa", - "IIIb", - "IV", - "IVu", - "IVc", - "V", - "Va", - "Vao", - "Vad", - "Vb", - "Vbo", - "Vbd", - "sV", - "sVb", - "VI", - "VIo", - "VId", - "VII", - "VIIo", - "VIId", - "VIII", - "VIIIo", - "VIIId" - ] - }, - "fdm.b_lu_harvestable": { - "name": "b_lu_harvestable", - "schema": "fdm", - "values": [ - "none", - "once", - "multiple" - ] - }, - "fdm.b_lu_croprotation": { - "name": "b_lu_croprotation", - "schema": "fdm", - "values": [ - "other", - "clover", - "nature", - "potato", - "grass", - "rapeseed", - "starch", - "maize", - "cereal", - "sugarbeet", - "alfalfa", - "catchcrop" - ] - }, - "fdm.a_source": { - "name": "a_source", - "schema": "fdm", - "values": [ - "nl-rva-l122", - "nl-rva-l136", - "nl-rva-l264", - "nl-rva-l320", - "nl-rva-l335", - "nl-rva-l610", - "nl-rva-l648", - "nl-rva-l697", - "nl-other-nmi", - "other" - ] - }, - "fdm.b_soiltype_agr": { - "name": "b_soiltype_agr", - "schema": "fdm", - "values": [ - "moerige_klei", - "rivierklei", - "dekzand", - "zeeklei", - "dalgrond", - "veen", - "loess", - "duinzand", - "maasklei" - ] - } - }, - "schemas": { - "fdm": "fdm", - "fdm-authn": "fdm-authn", - "fdm-authz": "fdm-authz" - }, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 86770ff78..7d4a6b8e7 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -1,111 +1,104 @@ { - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1731414293847, - "tag": "0000_v0", - "breakpoints": true - }, - { - "idx": 1, - "version": "7", - "when": 1741267610502, - "tag": "0001_v0-15-0", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1743420907290, - "tag": "0002_v0-18-0", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1744205441260, - "tag": "0003_v0-20-0-1", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1745410821339, - "tag": "0004_v0-20-0-2", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1748353081475, - "tag": "0005_v0-20-0-3", - "breakpoints": true - }, - { - "idx": 6, - "version": "7", - "when": 1748353926519, - "tag": "0006_v0-20-0-4", - "breakpoints": true - }, - { - "idx": 7, - "version": "7", - "when": 1750146397071, - "tag": "0007_v0-21-0-1", - "breakpoints": true - }, - { - "idx": 8, - "version": "7", - "when": 1750751079210, - "tag": "0008_v0-21-0-2", - "breakpoints": true - }, - { - "idx": 9, - "version": "7", - "when": 1752056714510, - "tag": "0009_v0-22-0-1", - "breakpoints": true - }, - { - "idx": 10, - "version": "7", - "when": 1753084974762, - "tag": "0010_v0-22-0-2", - "breakpoints": true - }, - { - "idx": 11, - "version": "7", - "when": 1754396961710, - "tag": "0011_v0-22-1-1", - "breakpoints": true - }, - { - "idx": 12, - "version": "7", - "when": 1754661913554, - "tag": "0012_v0-24-0-1", - "breakpoints": true - }, - { - "idx": 13, - "version": "7", - "when": 1755074095394, - "tag": "0013_v0-24-0-2", - "breakpoints": true - }, - { - "idx": 14, - "version": "7", - "when": 1760089257152, - "tag": "0014_ancient_ezekiel_stane", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731414293847, + "tag": "0000_v0", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1741267610502, + "tag": "0001_v0-15-0", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1743420907290, + "tag": "0002_v0-18-0", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1744205441260, + "tag": "0003_v0-20-0-1", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1745410821339, + "tag": "0004_v0-20-0-2", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1748353081475, + "tag": "0005_v0-20-0-3", + "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1748353926519, + "tag": "0006_v0-20-0-4", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1750146397071, + "tag": "0007_v0-21-0-1", + "breakpoints": true + }, + { + "idx": 8, + "version": "7", + "when": 1750751079210, + "tag": "0008_v0-21-0-2", + "breakpoints": true + }, + { + "idx": 9, + "version": "7", + "when": 1752056714510, + "tag": "0009_v0-22-0-1", + "breakpoints": true + }, + { + "idx": 10, + "version": "7", + "when": 1753084974762, + "tag": "0010_v0-22-0-2", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1754396961710, + "tag": "0011_v0-22-1-1", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1754661913554, + "tag": "0012_v0-24-0-1", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1755074095394, + "tag": "0013_v0-24-0-2", + "breakpoints": true + } + ] +} From d30a616dbdb791ea19b44368e91875c5b231bf19 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:35:37 +0200 Subject: [PATCH 055/243] chore: add db migration --- .../src/db/migrations/0015_flippant_spyke.sql | 4 + .../src/db/migrations/meta/0015_snapshot.json | 3136 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 7 + 3 files changed, 3147 insertions(+) create mode 100644 fdm-core/src/db/migrations/0015_flippant_spyke.sql create mode 100644 fdm-core/src/db/migrations/meta/0015_snapshot.json diff --git a/fdm-core/src/db/migrations/0015_flippant_spyke.sql b/fdm-core/src/db/migrations/0015_flippant_spyke.sql new file mode 100644 index 000000000..6d904c5e6 --- /dev/null +++ b/fdm-core/src/db/migrations/0015_flippant_spyke.sql @@ -0,0 +1,4 @@ +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_lu_start_default" text;--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD COLUMN "b_date_harvest_default" text;--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_lu_start_default_format" CHECK (b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$');--> statement-breakpoint +ALTER TABLE "fdm"."cultivations_catalogue" ADD CONSTRAINT "b_date_harvest_default_format" CHECK (b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'); \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json new file mode 100644 index 000000000..0f0676e27 --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0015_snapshot.json @@ -0,0 +1,3136 @@ +{ + "id": "60e262a4-309d-4384-ae3d-130a6e208f05", + "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "b_lu_start_default": { + "name": "b_lu_start_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_date_harvest_default": { + "name": "b_date_harvest_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "b_lu_start_default_format": { + "name": "b_lu_start_default_format", + "value": "b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + }, + "b_date_harvest_default_format": { + "name": "b_date_harvest_default_format", + "value": "b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + } + }, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.b_acquiring_method": { + "name": "b_acquiring_method", + "schema": "fdm", + "values": [ + "nl_01", + "nl_02", + "nl_03", + "nl_04", + "nl_07", + "nl_09", + "nl_10", + "nl_11", + "nl_12", + "nl_13", + "nl_61", + "nl_63", + "unknown" + ] + }, + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 1d8df0db1..9780a70da 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -106,6 +106,13 @@ "when": 1760450273146, "tag": "0014_smart_malice", "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1760621691069, + "tag": "0015_flippant_spyke", + "breakpoints": true } ] } \ No newline at end of file From 60e5933f90092cb553b7aef188f3c558ee402b50 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:38:47 +0200 Subject: [PATCH 056/243] feat: implement filling calculation of fosfaatgebruiksnorm --- fdm-calculator/src/norms/index.test.ts | 4 +- fdm-calculator/src/norms/index.ts | 8 +- .../2025/filling/fosfaatgebruiksnorm.test.ts | 394 ++++++++++++++++++ .../nl/2025/filling/fosfaatgebruiksnorm.ts | 298 +++++++++++++ .../src/norms/nl/2025/filling/types.d.ts | 1 + 5 files changed, 698 insertions(+), 7 deletions(-) create mode 100644 fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts diff --git a/fdm-calculator/src/norms/index.test.ts b/fdm-calculator/src/norms/index.test.ts index f19f49f87..aa8c9b94d 100644 --- a/fdm-calculator/src/norms/index.test.ts +++ b/fdm-calculator/src/norms/index.test.ts @@ -63,8 +63,8 @@ describe("createFunctionsForFertilizerApplicationFilling", () => { ) expect( functions.calculateFertilizerApplicationFillingForPhosphate, - ).toThrowError( - "calculateFertilizerApplicationFillingForPhosphate is not implemented yet", + ).toBe( + calculateFertilizerApplicationFillingForPhosphate, ) }) diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index bfce0591f..54f1e6a4c 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -1,6 +1,7 @@ import { aggregateNormsToFarmLevel } from "./farm" import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" +import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" import { collectNL2025InputForNorms } from "./nl/2025/input" import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" @@ -41,11 +42,8 @@ export function createFunctionsForFertilizerApplicationFilling( }, calculateFertilizerApplicationFillingForManure: calculateFertilizerApplicationFillingForManure, - calculateFertilizerApplicationFillingForPhosphate: () => { - throw new Error( - "calculateFertilizerApplicationFillingForPhosphate is not implemented yet", - ) - }, + calculateFertilizerApplicationFillingForPhosphate: + calculateFertilizerApplicationFillingForPhosphate, } } throw new Error("Year not supported") diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts new file mode 100644 index 000000000..503486924 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts @@ -0,0 +1,394 @@ +import { describe, it, expect } from "vitest" +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import { calculateFertilizerApplicationFillingForPhosphate } from "./fosfaatgebruiksnorm" + +// Mock data for fertilizers +const mockFertilizers: Fertilizer[] = [ + { + p_id_catalogue: "f1", + p_name_nl: "Drijfmest van rundvee", + p_type: "manure", + p_type_rvo: "14", + p_p_rt: 1.5, // Example 1: 30kg P / 20 = 1.5 + }, + { + p_id_catalogue: "f2", + p_name_nl: "Strorijke vaste mest van rundvee", + p_type: "manure", + p_type_rvo: "10", + p_p_rt: 0.75, // Example 1: 30kg P / 40 = 0.75 + }, + { + p_id_catalogue: "f3", + p_name_nl: "Groencompost", + p_type: "compost", + p_type_rvo: "111", + p_p_rt: 10, // Example 2: 1200 kg P / 120 = 10 + }, + { + p_id_catalogue: "f4", + p_name_nl: "Drijfmest", + p_type: "manure", + p_type_rvo: "14", + p_p_rt: 1.0, // Example 3: 60kg P / 60 = 1.0 + }, + { + p_id_catalogue: "f5", + p_name_nl: "GFT-compost", + p_type: "compost", + p_type_rvo: "112", + p_p_rt: 0.25, // Example 4: 10kg P / 40 = 0.25 + }, + { + p_id_catalogue: "f6", + p_name_nl: "Strorijke vaste mest van paarden", + p_type: "manure", + p_type_rvo: "25", + p_p_rt: 0.75, // Example 4: 10kg P / 13.3 = 0.75 + }, + { + p_id_catalogue: "f7", + p_name_nl: "Vaste mest varkens (biologisch)", + p_type: "manure", + p_type_rvo: "40", + p_p_rt: 0.75, + }, + { + p_id_catalogue: "f8", + p_name_nl: "Kunstmest", + p_type: "mineral", + p_type_rvo: "115", + p_p_rt: 50, + }, + { + p_id_catalogue: "f9", + p_name_nl: "Fertilizer with no p_p_rt", + p_type: "manure", + p_type_rvo: "108", // A type_rvo that has no p_p_rt in table11Mestcodes + p_p_rt: null, + }, + { + p_id_catalogue: "f10", + p_name_nl: "Fertilizer with p_p_rt in table11Mestcodes", + p_type: "manure", + p_type_rvo: "107", // A type_rvo that has p_p_rt in table11Mestcodes (3.1) + p_p_rt: null, + }, +] + +describe("calculateFertilizerApplicationFillingForPhosphate", () => { + // Helper to create a FertilizerApplication + const createApplication = ( + fertilizerId: string, + amount: number, + appId: string, + ): FertilizerApplication => ({ + p_app_id: appId, + p_id_catalogue: fertilizerId, + p_name_nl: `Application for ${fertilizerId}`, + p_app_amount: amount, + p_app_method: "spreading", + p_app_date: new Date(), + }) + + describe("5 examples from Staatscourant 2023-5152", () => { + // Example 1: Strorijke vaste mest van rundvee + it("should correctly calculate for Example 1 (Strorijke vaste mest)", () => { + const applications = [ + createApplication("f1", 20000, "app1"), // Drijfmest: 30kg P (20000 kg fertilizer * 1.5 P_RT / 1000) + createApplication("f2", 53333.33, "app2"), // Strorijke vaste mest: 40kg P (53333.33 kg fertilizer * 0.75 P_RT / 1000) + ] + const fosfaatgebruiksnorm = 60 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + + expect(result.normFilling).toBeCloseTo(60) + expect(result.applicationFilling).toHaveLength(2) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(30) // Standard + expect(result.applicationFilling[1].normFilling).toBeCloseTo(30) // OS-rich (40 * 0.75) + }) + + // Example 2a: Groencompost + it("should correctly calculate for Example 2 (Groencompost)", () => { + const applications = [ + createApplication("f3", 12000, "app1"), // Groencompost: 120kg P (12000 kg fertilizer * 10 P_RT / 1000) + createApplication("f3", 9000, "app2"), // Groencompost: 90kg P (9000 kg fertilizer * 10 P_RT / 1000) + ] + const fosfaatgebruiksnorm = 120 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + // console.log(result) // Keep for debugging if needed + + expect(result.normFilling).toBeCloseTo(120) + expect(result.applicationFilling).toHaveLength(2) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(30) // OS-rich (120 * 0.25) + expect(result.applicationFilling[1].normFilling).toBeCloseTo(90) // OS-rich (90 * 1.00) + }) + + // Example 2b: Groencompost (This test case seems to be a duplicate or misinterpretation of Example 2 in the document. The document's Example 2 has only one OS-rich application of 120kg P, and then an additional 90kg P is mentioned as "extra space". The test here uses two applications of f3, which is fine, but the expected output for the first application is 120, which is the total norm. This needs to be adjusted to reflect the actual contribution of the first application.) + // Based on the document's Example 2, the total actual P from Groencompost is 120kg + 90kg = 210kg. + // 120kg is discounted at 25% -> 30kg. + // Remaining 90kg is counted at 100% -> 90kg. + // Total norm filling = 30 + 90 = 120kg. + // The test should reflect this breakdown. + it("should correctly calculate for Example 2 (Groencompost) - detailed breakdown", () => { + const applications = [ + createApplication("f3", 12000, "app1"), // Groencompost: 120kg P + createApplication("f3", 9000, "app2"), // Groencompost: 90kg P + ] + const fosfaatgebruiksnorm = 120 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + // console.log(result) // Keep for debugging if needed + + expect(result.normFilling).toBeCloseTo(120) + expect(result.applicationFilling).toHaveLength(2) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(30) // 120kg * 0.25 + expect(result.applicationFilling[1].normFilling).toBeCloseTo(90) // 90kg * 1.00 (beyond discounted limit) + }) + + // Example 3: Groencompost with Drijfmest + it("should correctly calculate for Example 3 (Groencompost with Drijfmest)", () => { + const applications = [ + createApplication("f4", 60000, "app1"), // Drijfmest: 60kg P + createApplication("f3", 10500, "app2"), // Groencompost: 105kg P + ] + const fosfaatgebruiksnorm = 105 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + + expect(result.normFilling).toBeCloseTo(86.25) // 60 + (105 * 0.25) + expect(result.applicationFilling).toHaveLength(2) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(60) // Standard + expect(result.applicationFilling[1].normFilling).toBeCloseTo(26.25) // OS-rich (105 * 0.25) + }) + + // Example 4: GFT-compost and Strorijke mest van paarden with Drijfmest + it("should correctly calculate for Example 4 (Mixed OS-rich with Drijfmest)", () => { + const applications = [ + createApplication("f4", 40000, "app1"), // Drijfmest: 40kg P + createApplication("f5", 160000, "app2"), // GFT-compost: 40kg P + createApplication("f6", 17733.33, "app3"), // Strorijke mest paarden: 13.3kg P + ] + const fosfaatgebruiksnorm = 60 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + + expect(result.normFilling).toBeCloseTo(59.975) // 40 + (40 * 0.25) + (13.3 * 0.75) = 40 + 10 + 9.975 = 59.975 + expect(result.applicationFilling).toHaveLength(3) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(40) // Standard + expect(result.applicationFilling[1].normFilling).toBeCloseTo(10) // OS-rich (40 * 0.25) + expect(result.applicationFilling[2].normFilling).toBeCloseTo(9.975) // OS-rich (13.3 * 0.75) + }) + + // Example 5: Groencompost with Drijfmest, not filling the norm completely + it("should correctly calculate for Example 5 (Groencompost, Drijfmest, partial filling)", () => { + const applications = [ + createApplication("f3", 12000, "app1"), // Groencompost: 120kg P + createApplication("f4", 40000, "app2"), // Drijfmest: 40kg P + ] + const fosfaatgebruiksnorm = 120 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + + expect(result.normFilling).toBeCloseTo(70) // (120 * 0.25) + 40 = 30 + 40 + expect(result.applicationFilling).toHaveLength(2) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(30) // OS-rich (120 * 0.25) + expect(result.applicationFilling[1].normFilling).toBeCloseTo(40) // Standard + }) + }) + + // Additional Test Cases for coverage + + it("should return 0 for no applications", () => { + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications: [], + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm: 100, + }) + expect(result.normFilling).toBe(0) + expect(result.applicationFilling).toHaveLength(0) + }) + + it("should handle applications with only standard fertilizers", () => { + const applications = [ + createApplication("f1", 10000, "app1"), // Drijfmest: 10 * 1.5 = 15kg P + createApplication("f4", 20000, "app2"), // Drijfmest: 20 * 1.0 = 20kg P + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBeCloseTo(35) + expect(result.applicationFilling).toHaveLength(2) + }) + + it("should count OS-rich fertilizers at 100% if total applied is below 20kg threshold", () => { + const applications = [ + createApplication("f3", 1000, "app1"), // Groencompost: 10kg P (below 20kg threshold) + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBeCloseTo(10) // 100% counted + expect(result.applicationFilling[0].normFillingDetails).toContain( + "OS-rijke meststof, minimumdrempel niet gehaald, 100% geteld.", + ) + }) + + it("should correctly apply 75% discount for organic pig manure on an organic farm", () => { + const applications = [ + createApplication("f7", 40000, "app1"), // Vaste mest varkens (biologisch): 30kg P (75% discounted) + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: true, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBeCloseTo(22.5) // 30 * 0.75 = 22.5 + expect(result.applicationFilling[0].normFillingDetails).toContain( + "75% korting", + ) + }) + + it("should count organic pig manure at 100% on a non-organic farm", () => { + const applications = [ + createApplication("f7", 40000, "app1"), // Vaste mest varkens (biologisch): 30kg P (100% counted) + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBeCloseTo(30) // 100% counted + expect(result.applicationFilling[0].normFillingDetails).toContain( + "Standaard meststof", + ) + }) + + it("should use p_p_rt from table11Mestcodes if not on fertilizer object", () => { + const applications = [ + createApplication("f10", 10000, "app1"), // Fertilizer with p_p_rt in table11Mestcodes (3.1) + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBeCloseTo(10 * 3.1) // 31 + }) + + it("should use 0 if p_p_rt is not on fertilizer and not in table11Mestcodes", () => { + const applications = [ + createApplication("f9", 10000, "app1"), // Fertilizer with no p_p_rt + ] + const fosfaatgebruiksnorm = 100 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + expect(result.normFilling).toBe(0) + }) + + it("should correctly handle OS-rich applications exceeding the norm", () => { + const applications = [ + createApplication("f4", 10000, "app1"), // Drijfmest: 10 * 1.0 = 10kg P + createApplication("f3", 20000, "app2"), // Groencompost: 200 * 0.25 = 50kg P (25% discounted) + ] + const fosfaatgebruiksnorm = 30 // Small norm + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + // Standard: 10kg. Remaining norm: 20kg. + // Groencompost: 200kg actual P. Discounted: 50kg. + // To fill 20kg norm with 25% discounted: need 20 / 0.25 = 80kg actual P. + // So 80kg of Groencompost is discounted to 20kg. + // Remaining Groencompost: 200 - 80 = 120kg. This counts 100%. + // Standard: 10kg. Remaining norm: 20kg. + // Groencompost: 200kg actual P. Discounted: 50kg. + // To fill 20kg norm with 25% discounted: need 20 / 0.25 = 80kg actual P. + // So 80kg of Groencompost is discounted to 20kg. + // Remaining Groencompost: 200 - 80 = 120kg. This counts 100%. + // Total: 10 (standard) + 177.5 (Groencompost) = 187.5. Capped at 30. + expect(result.normFilling).toBeCloseTo(30) + expect(result.applicationFilling[1].normFilling).toBeCloseTo(177.5) // 7.5 (discounted) + 170 (100% counted) + expect(result.applicationFilling[1].normFillingDetails).toContain( + "OS-rijke meststof (25% korting) draagt 7.50kg bij aan de norm. Plus 170.00kg (100% geteld) boven de kortingslimiet.", + ) + }) + + it("should handle multiple OS-rich applications filling and exceeding the norm", () => { + const applications = [ + createApplication("f4", 10000, "app1"), // Drijfmest: 10kg P + createApplication("f3", 4000, "app2"), // Groencompost: 40kg actual P (25% discounted) + createApplication("f2", 20000, "app3"), // Strorijke vaste mest: 20kg actual P (75% discounted) + ] + const fosfaatgebruiksnorm = 30 + const result = calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers: mockFertilizers, + has_organic_certification: false, + fosfaatgebruiksnorm, + }) + // Standard: 10kg. + // App2 (Groencompost): 40kg actual P. + // Eligible for discount: min(40, 30 - 0) = 30kg. Discounted: 30 * 0.25 = 7.5kg. + // Remaining actual P: 40 - 30 = 10kg. This counts 100%. + // App2 contribution: 7.5 + 10 = 17.5kg. + // App3 (Strorijke mest): 20kg actual P. + // Eligible for discount: min(20, 30 - 30) = 0kg. Discounted: 0kg. + // Remaining actual P: 20 - 0 = 20kg. This counts 100%. + // App3 contribution: 0 + 20 = 20kg. + // Total: 10 (app1) + 17.5 (app2) + 20 (app3) = 47.5kg. Capped at 30. + expect(result.normFilling).toBeCloseTo(30) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(10) + expect(result.applicationFilling[1].normFilling).toBeCloseTo(17.5) + expect(result.applicationFilling[2].normFilling).toBeCloseTo(20) + expect(result.applicationFilling[2].normFillingDetails).toContain( + "OS-rijke meststof (75% korting) draagt 0.00kg bij aan de norm. Plus 20.00kg (100% geteld) boven de kortingslimiet.", + ) + }) +}) diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts new file mode 100644 index 000000000..a12a74747 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts @@ -0,0 +1,298 @@ +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import type { NormFilling } from "./types" +import { table11Mestcodes } from "./table-11-mestcodes" +import Decimal from "decimal.js" +const rvoMestcodesOrganicRich25Percent = ["111", "112"] // Compost, Zeer schone compost +const rvoMestcodesOrganicRich75Percent = ["110", "10", "61", "25", "56"] // Champost, Rundvee - Vaste mest, Geiten - Vaste mest, Paarden - Vaste mest, Schapen - Mest, alle systemen +const rvoMestcodesOrganicRich75PercentOrganic = ["40"] // Varkens - Vaste mest (for organic certification) + +/** + * Calculates the norm filling for phosphate application, taking into account the + * "Stimuleren organische stofrijke meststoffen" (Stimulating organic-rich fertilizers) regulation. + * + * This regulation, detailed in Staatscourant 2023, nr. 5152, aims to encourage the use of + * organic-rich fertilizers by applying a differentiated percentage to their phosphate content + * when calculating against the phosphate usage norm. + * + * Key aspects of the regulation implemented: + * 1. **Minimum Threshold (Condition 1):** A discount is only applied if at least 20 kg/ha of + * phosphate from organic-rich fertilizers is applied. + * 2. **Iterative Discounting:** The differentiated percentage (25% or 75% mee) is applied + * iteratively. The discount is only valid for the portion of organic-rich phosphate + * that, when summed with other discounted organic-rich phosphate, does not exceed + * the `fosfaatgebruiksnorm`. Any organic-rich phosphate applied beyond this limit + * is counted at 100% towards the norm. + * 3. **Prioritization:** To maximize the benefit for the farmer, fertilizers with a 25% + * contribution factor (e.g., compost) are prioritized for the discount over those + * with a 75% contribution factor (e.g., strorijke vaste mest). + * This has been acknowledged by RVO to be possible in personal communication with Sven. + * + * @param {object} params - The parameters for the calculation. + * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. + * @param {Fertilizer[]} params.fertilizers - An array of available fertilizers. + * @param {boolean} params.has_organic_certification - Indicates if the farm has organic certification, which affects certain fertilizer types. + * @param {number} params.fosfaatgebruiksnorm - The maximum phosphate usage norm in kg/ha. + * @returns {NormFilling} An object containing the total norm filling and a breakdown per application. + */ +export function calculateFertilizerApplicationFillingForPhosphate({ + applications, + fertilizers, + has_organic_certification, + fosfaatgebruiksnorm, +}: { + applications: FertilizerApplication[] + fertilizers: Fertilizer[] + has_organic_certification: boolean + fosfaatgebruiksnorm: number +}): NormFilling { + // Create maps for efficient lookups of fertilizers and RVO types. + // This avoids iterating over the arrays repeatedly in a loop. + const fertilizersMap = new Map( + fertilizers.map((fertilizer) => [ + fertilizer.p_id_catalogue, + fertilizer, + ]), + ) + + // Determines if at least 20 kg P2O5 / ha is applied with organic-rich fertilizers + const condition1 = + determineCondition1StimuleringOrganischeStofrijkeMeststoffen({ + applications, + fertilizersMap, + has_organic_certification, + }) + + let totalFilling = new Decimal(0) + const applicationsFilling = [] as { + p_app_id: string + normFilling: number + normFillingDetails?: string + }[] + const normLimit = new Decimal(fosfaatgebruiksnorm) + let remainingDiscountablePhosphate = normLimit // This tracks the remaining P that can be discounted + + // Separate applications into standard and organic-rich + const standardApplications: { + application: FertilizerApplication + p_p_rt: Decimal + p_app_amount: Decimal + }[] = [] + const organicRichApplications: { + application: FertilizerApplication + p_p_rt: Decimal + p_app_amount: Decimal + p_type_rvo: string + discountFactor: Decimal + originalIndex: number + }[] = [] + + applications.forEach((application, index) => { + const p_app_amount = new Decimal(application.p_app_amount ?? 0) + const p_p_rt = new Decimal( + fertilizersMap.get(application.p_id_catalogue)?.p_p_rt ?? + table11Mestcodes.find( + (t) => + t.p_type_rvo === + fertilizersMap.get(application.p_id_catalogue) + ?.p_type_rvo, + )?.p_p_rt ?? + 0, + ) + const p_type_rvo = + fertilizersMap.get(application.p_id_catalogue)?.p_type_rvo ?? "" + + if ( + rvoMestcodesOrganicRich25Percent.includes(p_type_rvo) || + rvoMestcodesOrganicRich75Percent.includes(p_type_rvo) || + (rvoMestcodesOrganicRich75PercentOrganic.includes(p_type_rvo) && + has_organic_certification) + ) { + let discountFactor: Decimal + if (rvoMestcodesOrganicRich25Percent.includes(p_type_rvo)) { + discountFactor = new Decimal(0.25) + } else { + discountFactor = new Decimal(0.75) + } + organicRichApplications.push({ + application, + p_p_rt, + p_app_amount, + p_type_rvo, + discountFactor, + originalIndex: index, + }) + } else { + standardApplications.push({ application, p_p_rt, p_app_amount }) + } + }) + + // Sort organic-rich applications to prioritize 25% discount over 75% discount + organicRichApplications.sort((a, b) => + a.discountFactor.cmp(b.discountFactor), + ) + + // Initialize applicationsFilling with placeholders to maintain original order + const orderedApplicationsFilling: { + p_app_id: string + normFilling: number + normFillingDetails?: string + }[] = new Array(applications.length) + + // Process standard applications first + for (const { application, p_p_rt, p_app_amount } of standardApplications) { + const normFilling = p_app_amount.times(p_p_rt).dividedBy(1000) + totalFilling = totalFilling.plus(normFilling) + orderedApplicationsFilling[ + applications.findIndex((app) => app.p_app_id === application.p_app_id) + ] = { + p_app_id: application.p_app_id, + normFilling: normFilling.toNumber(), + normFillingDetails: "Standaard meststof", + } + } + + // Process organic-rich applications with iterative discounting + if (condition1) { + for (const { + application, + p_p_rt, + p_app_amount, + discountFactor, + originalIndex, + } of organicRichApplications) { + const actualPhosphateApplied = p_app_amount + .times(p_p_rt) + .dividedBy(1000) + let currentApplicationFilling = new Decimal(0) + let normFillingDetails: string + + // Calculate how much of this application can be discounted + const phosphateToDiscount = Decimal.min( + actualPhosphateApplied, + remainingDiscountablePhosphate, + ) + + if (phosphateToDiscount.gt(0)) { + currentApplicationFilling = currentApplicationFilling.plus( + phosphateToDiscount.times(discountFactor), + ) + remainingDiscountablePhosphate = + remainingDiscountablePhosphate.minus(phosphateToDiscount) + normFillingDetails = `OS-rijke meststof (${discountFactor.times( + 100, + )}% korting) draagt ${phosphateToDiscount + .times(discountFactor) + .toFixed(2)}kg bij aan de norm.` + } else { + normFillingDetails = + "OS-rijke meststof, geen korting toegepast." + } + + // Add any remaining actual phosphate (beyond the discountable limit) at 100% + const phosphateBeyondDiscount = + actualPhosphateApplied.minus(phosphateToDiscount) + if (phosphateBeyondDiscount.gt(0)) { + currentApplicationFilling = currentApplicationFilling.plus( + phosphateBeyondDiscount, + ) + normFillingDetails += ` Plus ${phosphateBeyondDiscount.toFixed( + 2, + )}kg (100% geteld) boven de kortingslimiet.` + } + + totalFilling = totalFilling.plus(currentApplicationFilling) + orderedApplicationsFilling[originalIndex] = { + p_app_id: application.p_app_id, + normFilling: currentApplicationFilling.toNumber(), + normFillingDetails: normFillingDetails, + } + } + } else { + // If condition1 is not met, organic-rich fertilizers are counted at 100% + for (const { + application, + p_p_rt, + p_app_amount, + originalIndex, + } of organicRichApplications) { + const normFilling = p_app_amount.times(p_p_rt).dividedBy(1000) + totalFilling = totalFilling.plus(normFilling) + orderedApplicationsFilling[originalIndex] = { + p_app_id: application.p_app_id, + normFilling: normFilling.toNumber(), + normFillingDetails: + "OS-rijke meststof, minimumdrempel niet gehaald, 100% geteld.", + } + } + } + + // Ensure totalFilling does not exceed fosfaatgebruiksnorm + const finalTotalFilling = Decimal.min(totalFilling, normLimit) + + // Return the total norm filling and the breakdown per application. + return { + normFilling: finalTotalFilling.toNumber(), + applicationFilling: orderedApplicationsFilling, + } +} + +/** + * Determines if at least 20 kg P2O5 / ha is applied with organic-rich fertilizers. + * This is Condition 1 for the "Stimuleren organische stofrijke meststoffen" regulation. + * + * @param {object} params - The parameters for the condition check. + * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. + * @param {Map} params.fertilizersMap - A map of fertilizers for efficient lookup. + * @param {boolean} params.has_organic_certification - Indicates if the farm has organic certification. + * @returns {boolean} True if the 20 kg/ha threshold is met, false otherwise. + */ +function determineCondition1StimuleringOrganischeStofrijkeMeststoffen({ + applications, + fertilizersMap, + has_organic_certification, +}: { + applications: FertilizerApplication[] + fertilizersMap: Map + has_organic_certification: boolean +}): boolean { + // Set the RVO mestcodes for organic-rich fertilizers + const rvoMestcodesOrganicRich = [ + ...rvoMestcodesOrganicRich25Percent, + ...rvoMestcodesOrganicRich75Percent, + ] + if (has_organic_certification) { + rvoMestcodesOrganicRich.push(...rvoMestcodesOrganicRich75PercentOrganic) + } + + // Sum the phosphate dose of organic-rich fertilizers + const totalPhosphateDoseOrganicDose = applications.reduce( + (acc, application) => { + const fertilizer = fertilizersMap.get(application.p_id_catalogue) + if (!fertilizer) { + return acc + } + + const p_p_rt = new Decimal( + fertilizer.p_p_rt ?? + table11Mestcodes.find( + (t) => t.p_type_rvo === fertilizer.p_type_rvo, + )?.p_p_rt ?? + 0, + ) + + if (p_p_rt.isZero()) { + return acc + } + + const p_app_amount = new Decimal(application.p_app_amount ?? 0) + const actualPhosphate = p_app_amount.times(p_p_rt).dividedBy(1000) + + if (rvoMestcodesOrganicRich.includes(fertilizer.p_type_rvo ?? "")) { + return acc.plus(actualPhosphate) + } + return acc + }, + new Decimal(0), + ) + return totalPhosphateDoseOrganicDose.gte(20) +} diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 5e38f06a7..3df543bdc 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -5,6 +5,7 @@ export type NormFilling = { applicationFilling: { p_app_id: string normFilling: number + normFillingDetails?: string }[] } From 12ff3a0b7be8fa0cd6e31c1ecfb5653ae25eb9fb Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:09:45 +0200 Subject: [PATCH 057/243] docs: fix comment --- .../routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx index 9d5c46a1a..9f4856ee7 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx @@ -63,7 +63,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { }) } - // Get the farm id + // Get the field id const b_id = params.b_id if (!b_id) { throw data("invalid: b_id", { From e41b18902a06bc71f925888277c0a1725a18aaf3 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:27:53 +0200 Subject: [PATCH 058/243] fix: broken lockfile --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 820109d1b..3d4df7969 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -192,7 +192,7 @@ importers: version: 3.15.0 nanoid: specifier: ^5.1.5 - version: 5.1.5 + version: 5.1.6 next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) From 75d573354d096b7daff7ff77c168e76a2a78d0c1 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 13:28:39 +0200 Subject: [PATCH 059/243] feat: implement function to determine the filling of stikstofgebruiksnorm --- .../2025/filling/stikstofgebruiksnorm.test.ts | 714 ++++++++++++++++++ .../nl/2025/filling/stikstofgebruiksnorm.ts | 247 ++++++ .../src/norms/nl/2025/filling/table-9.ts | 178 +++++ .../src/norms/nl/2025/filling/types.d.ts | 16 + 4 files changed, 1155 insertions(+) create mode 100644 fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/table-9.ts diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts new file mode 100644 index 000000000..c8e330d47 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts @@ -0,0 +1,714 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest" +import { + calculateFertilizerApplicationFillingForNitrogen, + isBouwland, + getWorkingCoefficient, +} from "./stikstofgebruiksnorm" +import { getRegion } from "../stikstofgebruiksnorm" +import type { + Fertilizer, + FertilizerApplication, + CurrentSoilData, + Cultivation, +} from "@svenvw/fdm-core" +import type { RegionKey } from "../types" + +// Mock getRegion +vi.mock("../stikstofgebruiksnorm", () => ({ + getRegion: vi.fn(), +})) + +describe("isBouwland", () => { + it("should return true if cultivation is not in non-bouwland codes", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-01-01", + b_lu_catalogue: "nl_2014", // A generic bouwland code + }, + ] + const applicationDate = new Date("2025-06-15") + expect(isBouwland(cultivations, applicationDate)).toBe(true) + }) + + it("should return false if cultivation is in non-bouwland codes", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-01-01", + b_lu_catalogue: "nl_265", // Grasland + }, + ] + const applicationDate = new Date("2025-06-15") + expect(isBouwland(cultivations, applicationDate)).toBe(false) + }) + + it("should return false if no active cultivation exists", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2024-01-01", + b_end: "2024-12-31", + b_lu_catalogue: "nl_2014", + }, + ] + const applicationDate = new Date("2025-06-15") + expect(isBouwland(cultivations, applicationDate)).toBe(false) + }) + + it("should return true for a cultivation spanning the application date", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-01-01", + b_end: "2025-12-31", + b_lu_catalogue: "nl_2014", + }, + ] + const applicationDate = new Date("2025-07-01") + expect(isBouwland(cultivations, applicationDate)).toBe(true) + }) + + it("should return false for a cultivation ending before the application date", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-01-01", + b_end: "2025-06-30", + b_lu_catalogue: "nl_2014", + }, + ] + const applicationDate = new Date("2025-07-01") + expect(isBouwland(cultivations, applicationDate)).toBe(false) + }) + + it("should return false for a cultivation starting after the application date", () => { + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-08-01", + b_end: "2025-12-31", + b_lu_catalogue: "nl_2014", + }, + ] + const applicationDate = new Date("2025-07-01") + expect(isBouwland(cultivations, applicationDate)).toBe(false) + }) +}) + +describe("getWorkingCoefficient", () => { + // Helper to determine onFarmProduced for tests + const isDrijfmest = (p_type_rvo: string) => + [ + "14", + "18", + "19", + "60", + "46", + "50", + "30", + "76", + "81", + "91", + "92", + ].includes(p_type_rvo) + const isVasteMest = (p_type_rvo: string) => + [ + "10", + "56", + "61", + "25", + "26", + "27", + "95", + "96", + "23", + "31", + "32", + "33", + "35", + "39", + "40", + "43", + "75", + "80", + "90", + "97", + "98", + "99", + "100", + "101", + "102", + "103", + "104", + "105", + "106", + "11", + "13", + ].includes(p_type_rvo) + + it("should return 1.0 if p_type_rvo is null or undefined", () => { + expect( + getWorkingCoefficient( + null, + "zand_nwc", + true, + true, + new Date(), + false, + ), + ).toBe(1.0) + expect( + getWorkingCoefficient( + undefined, + "zand_nwc", + true, + true, + new Date(), + false, + ), + ).toBe(1.0) + }) + + it("should return 1.0 if p_type_rvo is not found in table9", () => { + expect( + getWorkingCoefficient( + "999", + "zand_nwc", + true, + true, + new Date(), + false, + ), + ).toBe(1.0) + }) + + // Drijfmest van graasdieren op het eigen bedrijf geproduceerd + describe("Drijfmest van graasdieren op het eigen bedrijf geproduceerd (onFarmProduced: true)", () => { + const p_type_rvo = "14" // Drijfmest rundvee + const soilType: RegionKey = "zand_nwc" + const isBouwland = false // Grasland + const fertilizerOnFarmProduced = isDrijfmest(p_type_rvo) + + it("should return 0.45 for on-farm produced drijfmest with grazing intention", () => { + const b_grazing_intention = true + const applicationDate = new Date("2025-06-15") + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.45) + }) + + it("should return 0.60 for on-farm produced drijfmest without grazing intention", () => { + const b_grazing_intention = false + const applicationDate = new Date("2025-06-15") + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.6) + }) + }) + + // Drijfmest van graasdieren aangevoerd + it("should return 0.60 for aangevoerd drijfmest (onFarmProduced: false)", () => { + const p_type_rvo = "14" // Drijfmest rundvee + const soilType: RegionKey = "zand_nwc" + const b_grazing_intention = true + const isBouwland = false + const applicationDate = new Date("2025-06-15") + const fertilizerOnFarmProduced = false // Explicitly false for aangevoerd + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.6) + }) + + // Drijfmest van varkens + describe("Drijfmest van varkens", () => { + const p_type_rvo = "46" // Drijfmest fokzeugen + const b_grazing_intention = false + const isBouwland = true + const applicationDate = new Date("2025-06-15") + const fertilizerOnFarmProduced = isDrijfmest(p_type_rvo) + + it("should return 0.60 for klei en veen soil", () => { + const soilType: RegionKey = "klei" + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.6) + }) + + it("should return 0.80 for zand en löss soil", () => { + const soilType: RegionKey = "zand_nwc" + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.8) + }) + }) + + // Dunnen fractie na mestbewerking en gier + it("should return 0.80 for dunne fractie", () => { + const p_type_rvo = "12" // Filtraat na mestscheiding + const soilType: RegionKey = "zand_nwc" + const b_grazing_intention = false + const isBouwland = true + const applicationDate = new Date("2025-06-15") + const fertilizerOnFarmProduced = isDrijfmest(p_type_rvo) + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.8) + }) + + // Vaste mest van graasdieren op het eigen bedrijf geproduceerd + describe("Vaste mest van graasdieren op het eigen bedrijf geproduceerd (onFarmProduced: true)", () => { + const p_type_rvo = "10" // Vaste mest rundvee + const fertilizerOnFarmProduced = true + const b_grazing_intention = false + const isBouwland = true + const soilType: RegionKey = "klei" + + it("should return 0.30 for bouwland on klei/veen from Sep 1 to Jan 31", () => { + const applicationDate = new Date("2025-10-15") // October + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.3) + }) + + it("should return 0.45 for overige toepassingen on bedrijf met beweiding (outside Sep-Jan period)", () => { + const applicationDate = new Date("2025-03-15") // March + const b_grazing_intention_true = true + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention_true, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.45) + }) + + it("should return 0.60 for overige toepassingen on bedrijf zonder beweiding (outside Sep-Jan period)", () => { + const applicationDate = new Date("2025-03-15") // March + const b_grazing_intention_false = false + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention_false, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.6) + }) + }) + + // Vaste mest van graasdieren aangevoerd + it("should return 0.40 for aangevoerd vaste mest (onFarmProduced: false) overige toepassingen", () => { + const p_type_rvo = "10" // Vaste mest rundvee + const soilType: RegionKey = "zand_nwc" + const b_grazing_intention = false + const isBouwland = true + const applicationDate = new Date("2025-06-15") + const fertilizerOnFarmProduced = false // Explicitly false for aangevoerd + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.4) + }) + + // Vaste mest van varkens, pluimvee en nertsen + it("should return 0.55 for vaste mest van varkens, pluimvee en nertsen", () => { + const p_type_rvo = "40" // Varkens, vaste mest + const soilType: RegionKey = "zand_nwc" + const b_grazing_intention = false + const isBouwland = true + const applicationDate = new Date("2025-06-15") + const fertilizerOnFarmProduced = isVasteMest(p_type_rvo) + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.55) + }) + + // Vaste mest van overige diersoorten + describe("Vaste mest van overige diersoorten", () => { + const p_type_rvo = "104" // Cavia, vaste mest + const soilType: RegionKey = "klei" + const b_grazing_intention = false + const isBouwland = true + const fertilizerOnFarmProduced = isVasteMest(p_type_rvo) + + it("should return 0.30 for bouwland on klei/veen from Sep 1 to Jan 31", () => { + const applicationDate = new Date("2025-11-01") // November + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.3) + }) + + it("should return 0.40 for overige toepassingen (outside Sep-Jan period)", () => { + const applicationDate = new Date("2025-04-01") // April + expect( + getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ), + ).toBe(0.4) + }) + }) + + // Overig (top-level entries) + it("should return 0.10 for Compost", () => { + expect( + getWorkingCoefficient( + "111", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(0.1) + }) + + it("should return 0.25 for Champost", () => { + expect( + getWorkingCoefficient( + "110", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(0.25) + }) + + it("should return 0.40 for Zuiveringsslib", () => { + expect( + getWorkingCoefficient( + "114", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(0.4) + }) + + it("should return 0.50 for Overige organische meststoffen", () => { + expect( + getWorkingCoefficient( + "116", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(0.5) + }) + + it("should return 1.0 for Kunstmest", () => { + expect( + getWorkingCoefficient( + "115", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(1.0) + }) + + it("should return 1.0 for Mineralenconcentraat", () => { + expect( + getWorkingCoefficient( + "120", + "zand_nwc", + false, + true, + new Date(), + false, + ), + ).toBe(1.0) + }) +}) + +describe("calculateFertilizerApplicationFillingForNitrogen", () => { + // Mock getRegion to return a consistent soil type for these tests + beforeEach(() => { + vi.mocked(getRegion).mockResolvedValue("zand_nwc") + }) + + afterEach(() => { + vi.clearAllMocks() + }) + + it("should calculate norm filling correctly for a single application with known nitrogen content", async () => { + const applications: FertilizerApplication[] = [ + { + p_app_id: "app1", + b_id: "field1", + p_app_date: "2025-05-01", + p_app_amount: 1000, + p_id_catalogue: "fert1", + }, + ] + const fertilizers: Fertilizer[] = [ + { + p_id_catalogue: "fert1", + p_n_rt: 5, // 5 kg N per ton + p_type_rvo: "115", // Kunstmest (working coefficient 1.0) + }, + ] + const soilData: CurrentSoilData[] = [] // Mocked + const b_grazing_intention = false + const cultivations: Cultivation[] = [] + + const result = await calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, + }) + + // Expected: 1000 kg * 5 kg/ton * 1.0 (100%) / 1000 = 5 + expect(result.normFilling).toBeCloseTo(5) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(5) + }) + + it("should calculate norm filling correctly for multiple applications", async () => { + const applications: FertilizerApplication[] = [ + { + p_app_id: "app1", + b_id: "field1", + p_app_date: "2025-05-01", + p_app_amount: 1000, + p_id_catalogue: "fert1", + }, + { + p_app_id: "app2", + b_id: "field1", + p_app_date: "2025-03-15", + p_app_amount: 500, + p_id_catalogue: "fert2", + }, + ] + const fertilizers: Fertilizer[] = [ + { + p_id_catalogue: "fert1", + p_n_rt: 5, // 5 kg N per ton + p_type_rvo: "115", // Kunstmest (working coefficient 1.0) + }, + { + p_id_catalogue: "fert2", + p_n_rt: 10, // 10 kg N per ton + p_type_rvo: "111", // Compost (working coefficient 0.1) + }, + ] + const soilData: CurrentSoilData[] = [] // Mocked + const b_grazing_intention = false + const cultivations: Cultivation[] = [] + + const result = await calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, + }) + console.log(result) + + // App1: 1000 * 5 * 1.0 / 1000 = 5 + // App2: 500 * 10 * 0.1 / 1000 = 0.5 + // Total: 5.5 + expect(result.normFilling).toBeCloseTo(5.5) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(5) + expect(result.applicationFilling[1].normFilling).toBeCloseTo(0.5) + }) + + it("should use table11Mestcodes for nitrogen content if p_n_rt is 0", async () => { + const applications: FertilizerApplication[] = [ + { + p_app_id: "app1", + b_id: "field1", + p_app_date: "2025-05-01", + p_app_amount: 1000, + p_id_catalogue: "fert1", + }, + ] + const fertilizers: Fertilizer[] = [ + { + p_id_catalogue: "fert1", + p_n_rt: 0, // Nitrogen content not directly known + p_type_rvo: "14", // Drijfmest rundvee (Table 11: 4.0 kg N/ton) + }, + ] + const soilData: CurrentSoilData[] = [] // Mocked + const b_grazing_intention = true // Drijfmest graasdieren, met beweiding -> 0.45 + const cultivations: Cultivation[] = [] + + const result = await calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, + }) + + // Expected: 1000 * 4.0 (from Table 11) * 0.45 (from Table 9) / 1000 = 1.8 + expect(result.normFilling).toBeCloseTo(1.8) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(1.8) + }) + + it("should throw an error if fertilizer cannot be found", async () => { + const applications: FertilizerApplication[] = [ + { + p_app_id: "app1", + b_id: "field1", + p_app_date: "2025-05-01", + p_app_amount: 1000, + p_id_catalogue: "nonExistentFert", + }, + ] + const fertilizers: Fertilizer[] = [] // Empty fertilizers array + const soilData: CurrentSoilData[] = [] + const b_grazing_intention = false + const cultivations: Cultivation[] = [] + + await expect(() => + calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, + }), + ).rejects.toThrow( + "Fertilizer nonExistentFert not found for application app1", + ) + }) + + it("should correctly apply bouwland logic for working coefficient", async () => { + vi.mocked(getRegion).mockResolvedValue("klei") // Soil type for bouwland rule + const applications: FertilizerApplication[] = [ + { + p_app_id: "app1", + b_id: "field1", + p_app_date: "2025-10-15", // Sep 1 to Jan 31 period + p_app_amount: 1000, + p_id_catalogue: "fert1", + }, + ] + const fertilizers: Fertilizer[] = [ + { + p_id_catalogue: "fert1", + p_n_rt: 10, // 10 kg N per ton + p_type_rvo: "10", // Vaste mest rundvee (onFarmProduced: true in table9, but our temp logic makes it false) + }, + ] + const soilData: CurrentSoilData[] = [] + const b_grazing_intention = false + const cultivations: Cultivation[] = [ + { + b_lu: "cult1", + b_start: "2025-01-01", + b_end: "2025-12-31", + b_lu_catalogue: "nl_2014", // Bouwland + }, + ] + + const result = await calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, + }) + + // For p_type_rvo "10" (Vaste mest rundvee), onFarmProduced: true in table9. + // Our temporary logic `onFarmProduced = isDrijfmest` makes it `false`. + // This means the `entry.onFarmProduced !== onFarmProduced` check will cause it to `continue`. + // It will then fall through to the "Vaste mest van graasdieren aangevoerd" entry, + // which has onFarmProduced: false. + // For "bouwland op klei en veen, van 1 september t/m 31 januari", p_n_wcl is 0.3. + // Expected: 1000 * 10 * 0.3 / 1000 = 3 + expect(result.normFilling).toBeCloseTo(3) + expect(result.applicationFilling[0].normFilling).toBeCloseTo(3) + }) +}) diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts new file mode 100644 index 000000000..9c4fd57b6 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts @@ -0,0 +1,247 @@ +import type { + Fertilizer, + FertilizerApplication, + CurrentSoilData, + Cultivation, +} from "@svenvw/fdm-core" +import type { NormFilling } from "./types" +import { table11Mestcodes } from "./table-11-mestcodes" +import { table9 } from "./table-9" +import { getRegion } from "../stikstofgebruiksnorm" +import type { RegionKey } from "../types" +import Decimal from "decimal.js" + +/** + * Calculates the nitrogen utilization norm filling for a set of fertilizer applications. + * This function determines the amount of effective nitrogen applied, taking into account + * fertilizer type, nitrogen content, working coefficients, soil type, grazing intention, + * and land use (bouwland/arable land). + * + * @param {Object} params - The parameters for the calculation. + * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. + * @param {Fertilizer[]} params.fertilizers - An array of available fertilizers. + * @param {CurrentSoilData[]} params.soilData - Current soil data for the farm. + * @param {boolean} params.b_grazing_intention - Indicates if there is a grazing intention for the farm. + * @param {Cultivation[]} params.cultivations - An array of cultivations for the farm. + * @returns {Promise} An object containing the total norm filling and details for each application. + */ +export async function calculateFertilizerApplicationFillingForNitrogen({ + applications, + fertilizers, + soilData, + b_grazing_intention, + cultivations, +}: { + applications: FertilizerApplication[] + fertilizers: Fertilizer[] + soilData: CurrentSoilData[] + b_grazing_intention: boolean + cultivations: Cultivation[] +}): Promise { + const applicationFillings: NormFilling["applicationFilling"] = [] + let totalNormFilling = new Decimal(0) + + const soilType = await getRegion(soilData) + + for (const application of applications) { + const fertilizer = fertilizers.find( + (f) => f.p_id_catalogue === application.p_id_catalogue, + ) + if (!fertilizer) { + throw new Error( + `Fertilizer ${application.p_id_catalogue} not found for application ${application.p_app_id}`, + ) + } + + // If nitrogen content is not known (explicitly 0 or undefined/null), use the value from Table 11 based on p_type_rvo + let nitrogenContentValue = fertilizer.p_n_rt + if ( + nitrogenContentValue === 0 || + nitrogenContentValue === undefined || + nitrogenContentValue === null + ) { + const table11Entry = table11Mestcodes.find( + (entry) => entry.p_type_rvo === fertilizer.p_type_rvo, + ) + nitrogenContentValue = table11Entry?.p_n_rt ?? 0 + } + const p_n_rt = new Decimal(nitrogenContentValue) + + const p_app_date = new Date(application.p_app_date) + const isCurrentBouwland = isBouwland(cultivations, p_app_date) + + // Determine the onFarmProduced status of the *actual fertilizer* based on temporary logic. + // TODO: Implement proper determination of onFarmProduced based on actual farm data. + const isDrijfmest = [ + "14", + "18", + "19", + "60", + "46", + "50", + "30", + "76", + "81", + "91", + "92", + ].includes(fertilizer.p_type_rvo ?? "") + const fertilizerOnFarmProduced = isDrijfmest // Assume drijfmest is on-farm, vaste mest is not for now. + + const p_n_wcl = getWorkingCoefficient( + fertilizer.p_type_rvo, + soilType, + b_grazing_intention, + isCurrentBouwland, + p_app_date, + fertilizerOnFarmProduced, // Pass the determined onFarmProduced status + ) + + // Calculate norm filling: amount * nitrogen content * (working coefficient / 100) / 1000 + const p_app_amount = new Decimal(application.p_app_amount) + const normFilling = p_app_amount + .times(p_n_rt) + .times(p_n_wcl) + .dividedBy(1000) + totalNormFilling = totalNormFilling.plus(normFilling) + + applicationFillings.push({ + p_app_id: application.p_app_id, + normFilling: normFilling.toNumber(), + }) + } + + return { + normFilling: totalNormFilling.toNumber(), + applicationFilling: applicationFillings, + } +} + +/** + * Determines if a field is considered "Bouwland" (arable land) at a given application date. + * A field is not considered Bouwland if its active cultivation's `b_lu_catalogue` code + * is one of the specified non-bouwland codes. + * + * @param {Cultivation[]} cultivations - An array of cultivations for the farm. + * @param {Date} p_app_date - The date of the fertilizer application. + * @returns {boolean} True if the field is considered Bouwland, false otherwise. + */ +export function isBouwland( + cultivations: Cultivation[], + p_app_date: Date, +): boolean { + const nonBouwlandCodes = ["nl_265", "nl_266", "nl_331", "nl_332"] + + const activeCultivation = cultivations.find((c) => { + const startDate = new Date(c.b_start) + const endDate = c.b_end ? new Date(c.b_end) : undefined + return ( + p_app_date >= startDate && + (endDate === undefined || p_app_date <= endDate) + ) + }) + + if ( + !activeCultivation || + nonBouwlandCodes.includes(activeCultivation.b_lu_catalogue) + ) { + return false + } + + return true +} + +/** + * Determines the working coefficient for a given fertilizer application based on various conditions. + * The working coefficient is retrieved from `table9` and depends on the fertilizer type, + * whether it's produced on-farm, soil type, grazing intention, land use, and application date. + * + * @param {string | null | undefined} p_type_rvo - The RVO fertilizer type code. + * @param {RegionKey | undefined} soilType - The soil type of the field. + * @param {boolean} b_grazing_intention - Indicates if there is a grazing intention for the farm. + * @param {boolean} isBouwland - True if the land is arable land (bouwland), false otherwise. + * @param {Date} p_app_date - The date of the fertilizer application. + * @param {boolean} fertilizerOnFarmProduced - True if the fertilizer is produced on the farm, false otherwise. + * @returns {number} The working coefficient as a decimal (e.g., 0.45 for 45%). Defaults to 1.0 (100%) if no specific rule applies. + */ +export function getWorkingCoefficient( + p_type_rvo: string | null | undefined, + soilType: RegionKey | undefined, + b_grazing_intention: boolean, + isBouwland: boolean, + p_app_date: Date, + fertilizerOnFarmProduced: boolean, // New parameter +): number { + const p_n_wcl = 1.0 // Default working coefficient is 100% (1.0) + + if (!p_type_rvo) { + return p_n_wcl + } + + for (const entry of table9) { + if (entry.p_type_rvo.includes(p_type_rvo)) { + // If the table entry explicitly specifies an onFarmProduced requirement, + // the fertilizer's onFarmProduced status must match it. + if ( + entry.onFarmProduced !== undefined && + entry.onFarmProduced !== fertilizerOnFarmProduced + ) { + continue // Mismatch, try next entry + } + + if (entry.subTypes) { + const matchingSubType = entry.subTypes.find((subType) => { + if ( + subType.b_grazing_intention !== undefined && + subType.b_grazing_intention !== b_grazing_intention + ) { + return false + } + + if ( + subType.grondsoortCode && + !subType.grondsoortCode.includes(soilType as any) + ) { + return false + } + + if ( + subType.isBouwland !== undefined && + subType.isBouwland !== isBouwland + ) { + return false + } + + if (subType.applicationPeriod) { + const appMonth = p_app_date.getMonth() // 0-11 (Jan is 0, Dec is 11) + const appDay = p_app_date.getDate() + + if ( + subType.applicationPeriod === + "1 september t/m 31 januari" + ) { + // September (month 8) to January (month 0) + if ( + !( + (appMonth >= 8 && appMonth <= 11) || + (appMonth === 0 && appDay <= 31) + ) + ) { + return false + } + } + } + return true // All conditions for this subType match + }) + + if (matchingSubType) { + return matchingSubType.p_n_wcl + } + } else if (entry.p_n_wcl !== undefined) { + // If no subTypes, use the main entry's p_n_wcl + return entry.p_n_wcl + } + } + } + + return p_n_wcl // If no specific rule is found, return the default 100% (1.0) +} diff --git a/fdm-calculator/src/norms/nl/2025/filling/table-9.ts b/fdm-calculator/src/norms/nl/2025/filling/table-9.ts new file mode 100644 index 000000000..8dc288730 --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/table-9.ts @@ -0,0 +1,178 @@ +import type { Table9 } from "./types" + +export const table9: Table9 = [ + { + description: + "Drijfmest van graasdieren op het eigen bedrijf geproduceerd", + p_type_rvo: ["14", "60", "18", "19"], + onFarmProduced: true, + subTypes: [ + { + description: "Op bedrijf met beweiding", + b_grazing_intention: true, + p_n_wcl: 0.45, + }, + { + description: "Op bedrijf zonder beweiding", + b_grazing_intention: false, + p_n_wcl: 0.6, + }, + ], + }, + { + description: "Drijfmest van graasdieren aangevoerd", + p_type_rvo: ["14", "60", "18", "19"], + onFarmProduced: false, + p_n_wcl: 0.6, + }, + { + description: "Drijfmest van varkens", + p_type_rvo: ["46", "50"], + subTypes: [ + { + description: "Op klei en veen", + grondsoortCode: ["klei", "veen"], + p_n_wcl: 0.6, + }, + { + description: "Op zand en löss", + grondsoortCode: ["zand_nwc", "zand_zuid", "loess"], + p_n_wcl: 0.8, + }, + ], + }, + { + description: "Drijfmest van overige diersoorten", + p_type_rvo: ["30", "76", "81", "91", "92"], + p_n_wcl: 0.6, + }, + { + description: "Dunne fractie na mestbewerking en gier", + p_type_rvo: ["12", "17", "41", "42"], + p_n_wcl: 0.8, + }, + { + description: + "Vaste mest van graasdieren op het eigen bedrijf geproduceerd", + p_type_rvo: ["10", "56", "61", "25", "26", "27", "95", "96"], + onFarmProduced: true, + subTypes: [ + { + description: + "Op bouwland op klei en veen, van 1 september t/m 31 januari", + grondsoortCode: ["klei", "veen"], + isBouwland: true, + applicationPeriod: "1 september t/m 31 januari", + p_n_wcl: 0.3, + }, + { + description: "Overige toepassingen op bedrijf met beweiding", + b_grazing_intention: true, + p_n_wcl: 0.45, + }, + { + description: "Overige toepassingen op bedrijf zonder beweiding", + b_grazing_intention: false, + p_n_wcl: 0.6, + }, + ], + }, + { + description: "Vaste mest van graasdieren aangevoerd", + p_type_rvo: ["10", "56", "61", "25", "26", "27", "95", "96"], + onFarmProduced: false, + subTypes: [ + { + description: + "Op bouwland op klei en veen, van 1 september t/m 31 januari", + grondsoortCode: ["klei", "veen"], + isBouwland: true, + applicationPeriod: "1 september t/m 31 januari", + p_n_wcl: 0.3, + }, + { + description: "Overige toepassingen", + p_n_wcl: 0.4, + }, + ], + }, + { + description: "Vaste mest van varkens, pluimvee en nertsen", + p_type_rvo: [ + "23", + "31", + "32", + "33", + "35", + "39", + "40", + "43", + "75", + "80", + "97", + "98", + "99", + "100", + "101", + ], + p_n_wcl: 0.55, + }, + { + description: "Vaste mest van overige diersoorten", + p_type_rvo: [ + "11", + "13", + "24", + "30", + "76", + "81", + "90", + "91", + "92", + "102", + "103", + "104", + "105", + "106", + ], + subTypes: [ + { + description: + "Op bouwland op klei en veen, van 1 september t/m 31 januari", + grondsoortCode: ["klei", "veen"], + isBouwland: true, + applicationPeriod: "1 september t/m 31 januari", + p_n_wcl: 0.3, + }, + { + description: "Overige toepassingen", + p_n_wcl: 0.4, + }, + ], + }, + { + description: "Compost", + p_type_rvo: ["111", "112"], + p_n_wcl: 0.1, + }, + { + description: "Champost", + p_type_rvo: ["110", "117"], + p_n_wcl: 0.25, + }, + { + description: "Zuiveringsslib", + p_type_rvo: ["113", "114"], + p_n_wcl: 0.4, + }, + { + description: "Overige organische meststoffen", + p_type_rvo: ["116"], + p_n_wcl: 0.5, + }, + { + description: "Mineralenconcentraat", + p_type_rvo: ["120"], + p_n_wcl: 1, + }, +] diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 3df543bdc..2c5edfdc1 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -1,4 +1,5 @@ import type { fdmSchema } from "@svenvw/fdm-core" +import { RegionKey } from "../types" export type NormFilling = { normFilling: number @@ -15,3 +16,18 @@ export type Table11Mestcodes = { p_n_rt?: number p_p_rt?: number }[] + +export type Table9 = { + description: string + p_type_rvo: fdmSchema.fertilizersCatalogueTypeSelect["p_type_rvo"][] + onFarmProduced?: boolean + subTypes?: { + description: string + b_grazing_intention?: boolean + grondsoortCode?: RegionKey[] + applicationPeriod?: "1 september t/m 31 januari" | "hele jaar" + isBouwland?: boolean + p_n_wcl: number + }[] + p_n_wcl?: number +}[] From a9daa3e3dbe964746d983f4a707c47976bf5da66 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 13:47:21 +0200 Subject: [PATCH 060/243] chore: ignore coverage folder at fdm-calculator --- fdm-calculator/.gitignore | 1 + .../2025/filling/stikstofgebruiksnorm.test.ts | 500 ++++++++++-------- .../nl/2025/filling/stikstofgebruiksnorm.ts | 37 +- .../src/norms/nl/2025/filling/types.d.ts | 6 + 4 files changed, 310 insertions(+), 234 deletions(-) diff --git a/fdm-calculator/.gitignore b/fdm-calculator/.gitignore index 1cac5597e..231bf6cdf 100644 --- a/fdm-calculator/.gitignore +++ b/fdm-calculator/.gitignore @@ -11,6 +11,7 @@ node_modules dist dist-ssr *.local +coverage # Editor directories and files .vscode/* diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts index c8e330d47..515191764 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts @@ -147,40 +147,32 @@ describe("getWorkingCoefficient", () => { "13", ].includes(p_type_rvo) - it("should return 1.0 if p_type_rvo is null or undefined", () => { - expect( - getWorkingCoefficient( - null, - "zand_nwc", - true, - true, - new Date(), - false, - ), - ).toBe(1.0) - expect( - getWorkingCoefficient( - undefined, - "zand_nwc", - true, - true, - new Date(), - false, - ), - ).toBe(1.0) + it("should return default details if p_type_rvo is null or undefined", () => { + const result = getWorkingCoefficient( + null, + "zand_nwc", + true, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(1.0) + expect(result.description).toBe("Kunstmest of niet gevonden in Tabel 9") + expect(result.subTypeDescription).toBeUndefined() }) - it("should return 1.0 if p_type_rvo is not found in table9", () => { - expect( - getWorkingCoefficient( - "999", - "zand_nwc", - true, - true, - new Date(), - false, - ), - ).toBe(1.0) + it("should return default details if p_type_rvo is not found in table9", () => { + const result = getWorkingCoefficient( + "999", + "zand_nwc", + true, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(1.0) + expect(result.description).toBe("Kunstmest of niet gevonden in Tabel 9") + expect(result.subTypeDescription).toBeUndefined() }) // Drijfmest van graasdieren op het eigen bedrijf geproduceerd @@ -193,31 +185,39 @@ describe("getWorkingCoefficient", () => { it("should return 0.45 for on-farm produced drijfmest with grazing intention", () => { const b_grazing_intention = true const applicationDate = new Date("2025-06-15") - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.45) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.45) + expect(result.description).toBe( + "Drijfmest van graasdieren op het eigen bedrijf geproduceerd", + ) + expect(result.subTypeDescription).toBe("Op bedrijf met beweiding") }) it("should return 0.60 for on-farm produced drijfmest without grazing intention", () => { const b_grazing_intention = false const applicationDate = new Date("2025-06-15") - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.6) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.6) + expect(result.description).toBe( + "Drijfmest van graasdieren op het eigen bedrijf geproduceerd", + ) + expect(result.subTypeDescription).toBe( + "Op bedrijf zonder beweiding", + ) }) }) @@ -229,16 +229,17 @@ describe("getWorkingCoefficient", () => { const isBouwland = false const applicationDate = new Date("2025-06-15") const fertilizerOnFarmProduced = false // Explicitly false for aangevoerd - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.6) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.6) + expect(result.description).toBe("Drijfmest van graasdieren aangevoerd") + expect(result.subTypeDescription).toBeUndefined() }) // Drijfmest van varkens @@ -251,30 +252,32 @@ describe("getWorkingCoefficient", () => { it("should return 0.60 for klei en veen soil", () => { const soilType: RegionKey = "klei" - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.6) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.6) + expect(result.description).toBe("Drijfmest van varkens") + expect(result.subTypeDescription).toBe("Op klei en veen") }) it("should return 0.80 for zand en löss soil", () => { const soilType: RegionKey = "zand_nwc" - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.8) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.8) + expect(result.description).toBe("Drijfmest van varkens") + expect(result.subTypeDescription).toBe("Op zand en löss") }) }) @@ -286,16 +289,19 @@ describe("getWorkingCoefficient", () => { const isBouwland = true const applicationDate = new Date("2025-06-15") const fertilizerOnFarmProduced = isDrijfmest(p_type_rvo) - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.8) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.8) + expect(result.description).toBe( + "Dunne fractie na mestbewerking en gier", + ) + expect(result.subTypeDescription).toBeUndefined() }) // Vaste mest van graasdieren op het eigen bedrijf geproduceerd @@ -308,46 +314,61 @@ describe("getWorkingCoefficient", () => { it("should return 0.30 for bouwland on klei/veen from Sep 1 to Jan 31", () => { const applicationDate = new Date("2025-10-15") // October - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.3) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.3) + expect(result.description).toBe( + "Vaste mest van graasdieren op het eigen bedrijf geproduceerd", + ) + expect(result.subTypeDescription).toBe( + "Op bouwland op klei en veen, van 1 september t/m 31 januari", + ) }) it("should return 0.45 for overige toepassingen on bedrijf met beweiding (outside Sep-Jan period)", () => { const applicationDate = new Date("2025-03-15") // March const b_grazing_intention_true = true - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention_true, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.45) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention_true, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.45) + expect(result.description).toBe( + "Vaste mest van graasdieren op het eigen bedrijf geproduceerd", + ) + expect(result.subTypeDescription).toBe( + "Overige toepassingen op bedrijf met beweiding", + ) }) it("should return 0.60 for overige toepassingen on bedrijf zonder beweiding (outside Sep-Jan period)", () => { const applicationDate = new Date("2025-03-15") // March const b_grazing_intention_false = false - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention_false, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.6) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention_false, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.6) + expect(result.description).toBe( + "Vaste mest van graasdieren op het eigen bedrijf geproduceerd", + ) + expect(result.subTypeDescription).toBe( + "Overige toepassingen op bedrijf zonder beweiding", + ) }) }) @@ -359,16 +380,17 @@ describe("getWorkingCoefficient", () => { const isBouwland = true const applicationDate = new Date("2025-06-15") const fertilizerOnFarmProduced = false // Explicitly false for aangevoerd - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.4) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.4) + expect(result.description).toBe("Vaste mest van graasdieren aangevoerd") + expect(result.subTypeDescription).toBe("Overige toepassingen") }) // Vaste mest van varkens, pluimvee en nertsen @@ -379,16 +401,19 @@ describe("getWorkingCoefficient", () => { const isBouwland = true const applicationDate = new Date("2025-06-15") const fertilizerOnFarmProduced = isVasteMest(p_type_rvo) - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.55) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.55) + expect(result.description).toBe( + "Vaste mest van varkens, pluimvee en nertsen", + ) + expect(result.subTypeDescription).toBeUndefined() }) // Vaste mest van overige diersoorten @@ -401,110 +426,124 @@ describe("getWorkingCoefficient", () => { it("should return 0.30 for bouwland on klei/veen from Sep 1 to Jan 31", () => { const applicationDate = new Date("2025-11-01") // November - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.3) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.3) + expect(result.description).toBe( + "Vaste mest van overige diersoorten", + ) + expect(result.subTypeDescription).toBe( + "Op bouwland op klei en veen, van 1 september t/m 31 januari", + ) }) it("should return 0.40 for overige toepassingen (outside Sep-Jan period)", () => { const applicationDate = new Date("2025-04-01") // April - expect( - getWorkingCoefficient( - p_type_rvo, - soilType, - b_grazing_intention, - isBouwland, - applicationDate, - fertilizerOnFarmProduced, - ), - ).toBe(0.4) + const result = getWorkingCoefficient( + p_type_rvo, + soilType, + b_grazing_intention, + isBouwland, + applicationDate, + fertilizerOnFarmProduced, + ) + expect(result.p_n_wcl).toBe(0.4) + expect(result.description).toBe( + "Vaste mest van overige diersoorten", + ) + expect(result.subTypeDescription).toBe("Overige toepassingen") }) }) // Overig (top-level entries) it("should return 0.10 for Compost", () => { - expect( - getWorkingCoefficient( - "111", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(0.1) + const result = getWorkingCoefficient( + "111", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(0.1) + expect(result.description).toBe("Compost") + expect(result.subTypeDescription).toBeUndefined() }) it("should return 0.25 for Champost", () => { - expect( - getWorkingCoefficient( - "110", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(0.25) + const result = getWorkingCoefficient( + "110", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(0.25) + expect(result.description).toBe("Champost") + expect(result.subTypeDescription).toBeUndefined() }) it("should return 0.40 for Zuiveringsslib", () => { - expect( - getWorkingCoefficient( - "114", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(0.4) + const result = getWorkingCoefficient( + "114", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(0.4) + expect(result.description).toBe("Zuiveringsslib") + expect(result.subTypeDescription).toBeUndefined() }) it("should return 0.50 for Overige organische meststoffen", () => { - expect( - getWorkingCoefficient( - "116", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(0.5) + const result = getWorkingCoefficient( + "116", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(0.5) + expect(result.description).toBe("Overige organische meststoffen") + expect(result.subTypeDescription).toBeUndefined() }) it("should return 1.0 for Kunstmest", () => { - expect( - getWorkingCoefficient( - "115", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(1.0) + const result = getWorkingCoefficient( + "115", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(1.0) + expect(result.description).toBe("Kunstmest of niet gevonden in Tabel 9") + expect(result.subTypeDescription).toBeUndefined() }) it("should return 1.0 for Mineralenconcentraat", () => { - expect( - getWorkingCoefficient( - "120", - "zand_nwc", - false, - true, - new Date(), - false, - ), - ).toBe(1.0) + const result = getWorkingCoefficient( + "120", + "zand_nwc", + false, + true, + new Date(), + false, + ) + expect(result.p_n_wcl).toBe(1.0) + expect(result.description).toBe("Mineralenconcentraat") + expect(result.subTypeDescription).toBeUndefined() }) }) @@ -550,6 +589,9 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { // Expected: 1000 kg * 5 kg/ton * 1.0 (100%) / 1000 = 5 expect(result.normFilling).toBeCloseTo(5) expect(result.applicationFilling[0].normFilling).toBeCloseTo(5) + expect(result.applicationFilling[0].normFillingDetails).toBe( + "Werkingscoëfficiënt: 100% - Kunstmest of niet gevonden in Tabel 9", + ) }) it("should calculate norm filling correctly for multiple applications", async () => { @@ -592,14 +634,19 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { b_grazing_intention, cultivations, }) - console.log(result) // App1: 1000 * 5 * 1.0 / 1000 = 5 // App2: 500 * 10 * 0.1 / 1000 = 0.5 // Total: 5.5 expect(result.normFilling).toBeCloseTo(5.5) expect(result.applicationFilling[0].normFilling).toBeCloseTo(5) + expect(result.applicationFilling[0].normFillingDetails).toBe( + "Werkingscoëfficiënt: 100% - Kunstmest of niet gevonden in Tabel 9", + ) expect(result.applicationFilling[1].normFilling).toBeCloseTo(0.5) + expect(result.applicationFilling[1].normFillingDetails).toBe( + "Werkingscoëfficiënt: 10% - Compost", + ) }) it("should use table11Mestcodes for nitrogen content if p_n_rt is 0", async () => { @@ -634,6 +681,9 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { // Expected: 1000 * 4.0 (from Table 11) * 0.45 (from Table 9) / 1000 = 1.8 expect(result.normFilling).toBeCloseTo(1.8) expect(result.applicationFilling[0].normFilling).toBeCloseTo(1.8) + expect(result.applicationFilling[0].normFillingDetails).toBe( + "Werkingscoëfficiënt: 45% - Drijfmest van graasdieren op het eigen bedrijf geproduceerd - Op bedrijf met beweiding", + ) }) it("should throw an error if fertilizer cannot be found", async () => { @@ -703,12 +753,14 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { // For p_type_rvo "10" (Vaste mest rundvee), onFarmProduced: true in table9. // Our temporary logic `onFarmProduced = isDrijfmest` makes it `false`. - // This means the `entry.onFarmProduced !== onFarmProduced` check will cause it to `continue`. // It will then fall through to the "Vaste mest van graasdieren aangevoerd" entry, // which has onFarmProduced: false. // For "bouwland op klei en veen, van 1 september t/m 31 januari", p_n_wcl is 0.3. // Expected: 1000 * 10 * 0.3 / 1000 = 3 expect(result.normFilling).toBeCloseTo(3) expect(result.applicationFilling[0].normFilling).toBeCloseTo(3) + expect(result.applicationFilling[0].normFillingDetails).toBe( + "Werkingscoëfficiënt: 30% - Vaste mest van graasdieren aangevoerd - Op bouwland op klei en veen, van 1 september t/m 31 januari", + ) }) }) diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts index 9c4fd57b6..ead5f1af4 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts @@ -4,7 +4,7 @@ import type { CurrentSoilData, Cultivation, } from "@svenvw/fdm-core" -import type { NormFilling } from "./types" +import type { NormFilling, WorkingCoefficientDetails } from "./types" import { table11Mestcodes } from "./table-11-mestcodes" import { table9 } from "./table-9" import { getRegion } from "../stikstofgebruiksnorm" @@ -87,7 +87,7 @@ export async function calculateFertilizerApplicationFillingForNitrogen({ ].includes(fertilizer.p_type_rvo ?? "") const fertilizerOnFarmProduced = isDrijfmest // Assume drijfmest is on-farm, vaste mest is not for now. - const p_n_wcl = getWorkingCoefficient( + const workingCoefficientDetails = getWorkingCoefficient( fertilizer.p_type_rvo, soilType, b_grazing_intention, @@ -100,13 +100,20 @@ export async function calculateFertilizerApplicationFillingForNitrogen({ const p_app_amount = new Decimal(application.p_app_amount) const normFilling = p_app_amount .times(p_n_rt) - .times(p_n_wcl) + .times(workingCoefficientDetails.p_n_wcl) .dividedBy(1000) totalNormFilling = totalNormFilling.plus(normFilling) + const descriptionParts = [workingCoefficientDetails.description] + if (workingCoefficientDetails.subTypeDescription) { + descriptionParts.push(workingCoefficientDetails.subTypeDescription) + } + const normFillingDetailString = `Werkingscoëfficiënt: ${workingCoefficientDetails.p_n_wcl * 100}% - ${descriptionParts.join(" - ")}` + applicationFillings.push({ p_app_id: application.p_app_id, normFilling: normFilling.toNumber(), + normFillingDetails: normFillingDetailString, }) } @@ -161,7 +168,7 @@ export function isBouwland( * @param {boolean} isBouwland - True if the land is arable land (bouwland), false otherwise. * @param {Date} p_app_date - The date of the fertilizer application. * @param {boolean} fertilizerOnFarmProduced - True if the fertilizer is produced on the farm, false otherwise. - * @returns {number} The working coefficient as a decimal (e.g., 0.45 for 45%). Defaults to 1.0 (100%) if no specific rule applies. + * @returns {WorkingCoefficientDetails} An object containing the working coefficient, its main description, and an optional subtype description. */ export function getWorkingCoefficient( p_type_rvo: string | null | undefined, @@ -170,11 +177,14 @@ export function getWorkingCoefficient( isBouwland: boolean, p_app_date: Date, fertilizerOnFarmProduced: boolean, // New parameter -): number { - const p_n_wcl = 1.0 // Default working coefficient is 100% (1.0) +): WorkingCoefficientDetails { + const defaultDetails: WorkingCoefficientDetails = { + p_n_wcl: 1.0, + description: "Kunstmest of niet gevonden in Tabel 9", + } if (!p_type_rvo) { - return p_n_wcl + return defaultDetails } for (const entry of table9) { @@ -234,14 +244,21 @@ export function getWorkingCoefficient( }) if (matchingSubType) { - return matchingSubType.p_n_wcl + return { + p_n_wcl: matchingSubType.p_n_wcl, + description: entry.description, + subTypeDescription: matchingSubType.description, + } } } else if (entry.p_n_wcl !== undefined) { // If no subTypes, use the main entry's p_n_wcl - return entry.p_n_wcl + return { + p_n_wcl: entry.p_n_wcl, + description: entry.description, + } } } } - return p_n_wcl // If no specific rule is found, return the default 100% (1.0) + return defaultDetails // If no specific rule is found, return the default 100% (1.0) } diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 2c5edfdc1..2557e53ab 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -31,3 +31,9 @@ export type Table9 = { }[] p_n_wcl?: number }[] + +export type WorkingCoefficientDetails = { + p_n_wcl: number + description: string + subTypeDescription?: string +} From 3cf2845795a0ec389dac3abe482eb0746aeecbf8 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:13:49 +0200 Subject: [PATCH 061/243] fix: remove capping --- .../nl/2025/filling/fosfaatgebruiksnorm.test.ts | 8 ++++---- .../norms/nl/2025/filling/fosfaatgebruiksnorm.ts | 16 +++++----------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts index 503486924..cb617d533 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts @@ -352,8 +352,8 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { // To fill 20kg norm with 25% discounted: need 20 / 0.25 = 80kg actual P. // So 80kg of Groencompost is discounted to 20kg. // Remaining Groencompost: 200 - 80 = 120kg. This counts 100%. - // Total: 10 (standard) + 177.5 (Groencompost) = 187.5. Capped at 30. - expect(result.normFilling).toBeCloseTo(30) + // Total: 10 (standard) + 177.5 (Groencompost) = 187.5. + expect(result.normFilling).toBeCloseTo(187.5) expect(result.applicationFilling[1].normFilling).toBeCloseTo(177.5) // 7.5 (discounted) + 170 (100% counted) expect(result.applicationFilling[1].normFillingDetails).toContain( "OS-rijke meststof (25% korting) draagt 7.50kg bij aan de norm. Plus 170.00kg (100% geteld) boven de kortingslimiet.", @@ -382,8 +382,8 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { // Eligible for discount: min(20, 30 - 30) = 0kg. Discounted: 0kg. // Remaining actual P: 20 - 0 = 20kg. This counts 100%. // App3 contribution: 0 + 20 = 20kg. - // Total: 10 (app1) + 17.5 (app2) + 20 (app3) = 47.5kg. Capped at 30. - expect(result.normFilling).toBeCloseTo(30) + // Total: 10 (app1) + 17.5 (app2) + 20 (app3) = 47.5kg. + expect(result.normFilling).toBeCloseTo(47.5) expect(result.applicationFilling[0].normFilling).toBeCloseTo(10) expect(result.applicationFilling[1].normFilling).toBeCloseTo(17.5) expect(result.applicationFilling[2].normFilling).toBeCloseTo(20) diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts index a12a74747..7c3ba5527 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts @@ -63,11 +63,6 @@ export function calculateFertilizerApplicationFillingForPhosphate({ }) let totalFilling = new Decimal(0) - const applicationsFilling = [] as { - p_app_id: string - normFilling: number - normFillingDetails?: string - }[] const normLimit = new Decimal(fosfaatgebruiksnorm) let remainingDiscountablePhosphate = normLimit // This tracks the remaining P that can be discounted @@ -83,7 +78,7 @@ export function calculateFertilizerApplicationFillingForPhosphate({ p_app_amount: Decimal p_type_rvo: string discountFactor: Decimal - originalIndex: number + originalIndex: number }[] = [] applications.forEach((application, index) => { @@ -143,7 +138,9 @@ export function calculateFertilizerApplicationFillingForPhosphate({ const normFilling = p_app_amount.times(p_p_rt).dividedBy(1000) totalFilling = totalFilling.plus(normFilling) orderedApplicationsFilling[ - applications.findIndex((app) => app.p_app_id === application.p_app_id) + applications.findIndex( + (app) => app.p_app_id === application.p_app_id, + ) ] = { p_app_id: application.p_app_id, normFilling: normFilling.toNumber(), @@ -226,12 +223,9 @@ export function calculateFertilizerApplicationFillingForPhosphate({ } } - // Ensure totalFilling does not exceed fosfaatgebruiksnorm - const finalTotalFilling = Decimal.min(totalFilling, normLimit) - // Return the total norm filling and the breakdown per application. return { - normFilling: finalTotalFilling.toNumber(), + normFilling: totalFilling.toNumber(), applicationFilling: orderedApplicationsFilling, } } From 87a7cc7c2cc4a0b68a32f40a9af9b07e93eabdc6 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:29:38 +0200 Subject: [PATCH 062/243] test: fixes --- .../nl/2025/filling/fosfaatgebruiksnorm.test.ts | 12 +++++------- .../src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts index cb617d533..e7f65cb8d 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts @@ -297,9 +297,7 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fosfaatgebruiksnorm, }) expect(result.normFilling).toBeCloseTo(30) // 100% counted - expect(result.applicationFilling[0].normFillingDetails).toContain( - "Standaard meststof", - ) + expect(result.applicationFilling[0].normFillingDetails).toBeUndefined() }) it("should use p_p_rt from table11Mestcodes if not on fertilizer object", () => { @@ -382,13 +380,13 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { // Eligible for discount: min(20, 30 - 30) = 0kg. Discounted: 0kg. // Remaining actual P: 20 - 0 = 20kg. This counts 100%. // App3 contribution: 0 + 20 = 20kg. - // Total: 10 (app1) + 17.5 (app2) + 20 (app3) = 47.5kg. - expect(result.normFilling).toBeCloseTo(47.5) + // Total: 10 (app1) + 17.5 (app2) + 15 (app3) = 42.5kg. + expect(result.normFilling).toBeCloseTo(42.5) expect(result.applicationFilling[0].normFilling).toBeCloseTo(10) expect(result.applicationFilling[1].normFilling).toBeCloseTo(17.5) - expect(result.applicationFilling[2].normFilling).toBeCloseTo(20) + expect(result.applicationFilling[2].normFilling).toBeCloseTo(15) expect(result.applicationFilling[2].normFillingDetails).toContain( - "OS-rijke meststof (75% korting) draagt 0.00kg bij aan de norm. Plus 20.00kg (100% geteld) boven de kortingslimiet.", + "OS-rijke meststof, geen korting toegepast. Plus 15.00kg (100% geteld) boven de kortingslimiet.", ) }) }) diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts index 7c3ba5527..f202dc003 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts @@ -144,7 +144,6 @@ export function calculateFertilizerApplicationFillingForPhosphate({ ] = { p_app_id: application.p_app_id, normFilling: normFilling.toNumber(), - normFillingDetails: "Standaard meststof", } } From 05f933b269121b131ccc8eb37ec5c4da3c488a98 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:31:38 +0200 Subject: [PATCH 063/243] fix: type --- .../src/norms/nl/2025/filling/stikstofgebruiksnorm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts index ead5f1af4..e06a4bb5a 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts @@ -209,7 +209,7 @@ export function getWorkingCoefficient( if ( subType.grondsoortCode && - !subType.grondsoortCode.includes(soilType as any) + !subType.grondsoortCode.includes(soilType as RegionKey) ) { return false } From a960b16d84789a4b9b36d57a2c60a72cafd537ab Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:33:10 +0200 Subject: [PATCH 064/243] feat: include the nitrogen filling functions --- fdm-calculator/src/norms/index.test.ts | 11 ++++------- fdm-calculator/src/norms/index.ts | 8 +++----- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/fdm-calculator/src/norms/index.test.ts b/fdm-calculator/src/norms/index.test.ts index aa8c9b94d..f337a85e4 100644 --- a/fdm-calculator/src/norms/index.test.ts +++ b/fdm-calculator/src/norms/index.test.ts @@ -10,6 +10,7 @@ import { collectNL2025InputForNorms } from "./nl/2025/input" import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" +import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" describe("createFunctionsForNorms", () => { it("should return the correct functions for NL region and year 2025", () => { @@ -53,19 +54,15 @@ describe("createFunctionsForFertilizerApplicationFilling", () => { ).toThrowError( "collectInputForFertilizerApplicationFilling is not implemented yet", ) - expect( - functions.calculateFertilizerApplicationFillingForNitrogen, - ).toThrowError( - "calculateFertilizerApplicationFillingForNitrogen is not implemented yet", + expect(functions.calculateFertilizerApplicationFillingForNitrogen).toBe( + calculateFertilizerApplicationFillingForNitrogen, ) expect(functions.calculateFertilizerApplicationFillingForManure).toBe( calculateFertilizerApplicationFillingForManure, ) expect( functions.calculateFertilizerApplicationFillingForPhosphate, - ).toBe( - calculateFertilizerApplicationFillingForPhosphate, - ) + ).toBe(calculateFertilizerApplicationFillingForPhosphate) }) it("should throw an error for an unsupported year", () => { diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index 54f1e6a4c..b523309cb 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -2,6 +2,7 @@ import { aggregateNormsToFarmLevel } from "./farm" import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" +import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" import { collectNL2025InputForNorms } from "./nl/2025/input" import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" @@ -35,11 +36,8 @@ export function createFunctionsForFertilizerApplicationFilling( "collectInputForFertilizerApplicationFilling is not implemented yet", ) }, - calculateFertilizerApplicationFillingForNitrogen: () => { - throw new Error( - "calculateFertilizerApplicationFillingForNitrogen is not implemented yet", - ) - }, + calculateFertilizerApplicationFillingForNitrogen: + calculateFertilizerApplicationFillingForNitrogen, calculateFertilizerApplicationFillingForManure: calculateFertilizerApplicationFillingForManure, calculateFertilizerApplicationFillingForPhosphate: From 62a45db744ce5f17937a1aeed65721eec722d50d Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:33:47 +0200 Subject: [PATCH 065/243] feat: add function to collect input data for norm filling calculation --- fdm-calculator/src/norms/index.test.ts | 7 +- fdm-calculator/src/norms/index.ts | 8 +- .../dierlijke-mest-gebruiksnorm.test.ts | 52 +++++- .../filling/dierlijke-mest-gebruiksnorm.ts | 20 +-- .../2025/filling/fosfaatgebruiksnorm.test.ts | 78 +++++++-- .../nl/2025/filling/fosfaatgebruiksnorm.ts | 52 +++--- .../src/norms/nl/2025/filling/input.test.ts | 151 ++++++++++++++++++ .../src/norms/nl/2025/filling/input.ts | 96 +++++++++++ .../2025/filling/stikstofgebruiksnorm.test.ts | 62 ++++--- .../nl/2025/filling/stikstofgebruiksnorm.ts | 38 ++--- .../src/norms/nl/2025/filling/types.d.ts | 10 ++ 11 files changed, 442 insertions(+), 132 deletions(-) create mode 100644 fdm-calculator/src/norms/nl/2025/filling/input.test.ts create mode 100644 fdm-calculator/src/norms/nl/2025/filling/input.ts diff --git a/fdm-calculator/src/norms/index.test.ts b/fdm-calculator/src/norms/index.test.ts index f337a85e4..fa93d8245 100644 --- a/fdm-calculator/src/norms/index.test.ts +++ b/fdm-calculator/src/norms/index.test.ts @@ -11,6 +11,7 @@ import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" +import { collectInputForFertilizerApplicationFilling } from "./nl/2025/filling/input" describe("createFunctionsForNorms", () => { it("should return the correct functions for NL region and year 2025", () => { @@ -49,10 +50,8 @@ describe("createFunctionsForFertilizerApplicationFilling", () => { "NL", "2025", ) - expect( - functions.collectInputForFertilizerApplicationFilling, - ).toThrowError( - "collectInputForFertilizerApplicationFilling is not implemented yet", + expect(functions.collectInputForFertilizerApplicationFilling).toBe( + collectInputForFertilizerApplicationFilling, ) expect(functions.calculateFertilizerApplicationFillingForNitrogen).toBe( calculateFertilizerApplicationFillingForNitrogen, diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index b523309cb..74dfc3393 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -2,6 +2,7 @@ import { aggregateNormsToFarmLevel } from "./farm" import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" +import { collectInputForFertilizerApplicationFilling } from "./nl/2025/filling/input" import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" import { collectNL2025InputForNorms } from "./nl/2025/input" @@ -31,11 +32,8 @@ export function createFunctionsForFertilizerApplicationFilling( if (year === "2025") { // TODO: Implement fertilizer application filling functions for NL 2025 return { - collectInputForFertilizerApplicationFilling: () => { - throw new Error( - "collectInputForFertilizerApplicationFilling is not implemented yet", - ) - }, + collectInputForFertilizerApplicationFilling: + collectInputForFertilizerApplicationFilling, calculateFertilizerApplicationFillingForNitrogen: calculateFertilizerApplicationFillingForNitrogen, calculateFertilizerApplicationFillingForManure: diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts index 2833ed3a1..e8971b26b 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect } from "vitest" -import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import type { Fertilizer, FertilizerApplication, Cultivation } from "@svenvw/fdm-core" import { calculateFertilizerApplicationFillingForManure } from "./dierlijke-mest-gebruiksnorm" +import type { NL2025NormsFillingInput } from "./types" describe("calculateFertilizerApplicationFillingForManure", () => { const mockFertilizers: Fertilizer[] = [ @@ -44,7 +45,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { const result = calculateFertilizerApplicationFillingForManure({ applications: [mockApplications[0]], fertilizers: mockFertilizers, - }) + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(5) expect(result.applicationFilling).toEqual([ @@ -59,7 +65,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { const result = calculateFertilizerApplicationFillingForManure({ applications: mockApplications, fertilizers: mockFertilizers, - }) + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(85) // 5 + 80 expect(result.applicationFilling).toEqual([ @@ -84,7 +95,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { }, ], fertilizers: mockFertilizers, - }) + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(0) expect(result.applicationFilling).toEqual([ @@ -106,7 +122,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { }, ], fertilizers: mockFertilizers, - }), + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput), ).toThrow("Fertilizer 999 not found for application app4") }) @@ -121,7 +142,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { }, ], fertilizers: mockFertilizers, - }), + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput), ).toThrow("Fertilizer 4 has no p_type_rvo") }) @@ -136,7 +162,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { }, ], fertilizers: mockFertilizers, - }), + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput), ).toThrow("Fertilizer 3 has unknown p_type_rvo 200") }) @@ -144,7 +175,12 @@ describe("calculateFertilizerApplicationFillingForManure", () => { const result = calculateFertilizerApplicationFillingForManure({ applications: [], fertilizers: mockFertilizers, - }) + cultivations: [], + has_organic_certification: false, + has_grazining_intention: false, + fosfaatgebruiksnorm: 0, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(0) expect(result.applicationFilling).toEqual([]) diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts index 8dd16f02d..65b7c6678 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts @@ -1,7 +1,7 @@ -import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" import Decimal from "decimal.js" import { table11Mestcodes } from "./table-11-mestcodes" -import type { NormFilling } from "./types" +import type { NormFilling, NL2025NormsFillingInput } from "./types" +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" /** * Calculates the nitrogen usage from animal manure for a list of fertilizer applications. @@ -10,19 +10,15 @@ import type { NormFilling } from "./types" * based on the type of manure used. It uses predefined values from `table11Mestcodes` to identify * which fertilizers are considered animal manure and to find their nitrogen content. * - * @param {object} params - The parameters for the calculation. - * @param {FertilizerApplication[]} params.applications - A list of fertilizer applications, each specifying the amount and type of fertilizer used. - * @param {Fertilizer[]} params.fertilizers - A list of available fertilizers, providing details like nitrogen content. + * @param {NL2025NormsFillingInput} input - The standardized input object containing all necessary data. * @returns {NormFilling} An object containing the total nitrogen usage (`normFilling`) and a detailed breakdown per application (`applicationFilling`). * @throws {Error} Throws an error if a fertilizer or its RVO type is not found, ensuring data integrity. */ -export function calculateFertilizerApplicationFillingForManure({ - applications, - fertilizers, -}: { - applications: FertilizerApplication[] - fertilizers: Fertilizer[] -}): NormFilling { +export function calculateFertilizerApplicationFillingForManure( + input: NL2025NormsFillingInput, +): NormFilling { + const { applications, fertilizers } = input; + // Create maps for efficient lookups of fertilizers and RVO types. // This avoids iterating over the arrays repeatedly in a loop. const fertilizersMap = new Map( diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts index e7f65cb8d..005a65c41 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect } from "vitest" -import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" +import type { Fertilizer, FertilizerApplication, Cultivation } from "@svenvw/fdm-core" import { calculateFertilizerApplicationFillingForPhosphate } from "./fosfaatgebruiksnorm" +import type { NL2025NormsFillingInput } from "./types" // Mock data for fertilizers const mockFertilizers: Fertilizer[] = [ @@ -104,7 +105,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(60) expect(result.applicationFilling).toHaveLength(2) @@ -124,7 +128,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) // console.log(result) // Keep for debugging if needed expect(result.normFilling).toBeCloseTo(120) @@ -150,7 +157,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) // console.log(result) // Keep for debugging if needed expect(result.normFilling).toBeCloseTo(120) @@ -171,7 +181,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(86.25) // 60 + (105 * 0.25) expect(result.applicationFilling).toHaveLength(2) @@ -192,7 +205,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(59.975) // 40 + (40 * 0.25) + (13.3 * 0.75) = 40 + 10 + 9.975 = 59.975 expect(result.applicationFilling).toHaveLength(3) @@ -213,7 +229,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(70) // (120 * 0.25) + 40 = 30 + 40 expect(result.applicationFilling).toHaveLength(2) @@ -230,7 +249,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm: 100, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(0) expect(result.applicationFilling).toHaveLength(0) }) @@ -246,7 +268,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(35) expect(result.applicationFilling).toHaveLength(2) }) @@ -261,7 +286,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(10) // 100% counted expect(result.applicationFilling[0].normFillingDetails).toContain( "OS-rijke meststof, minimumdrempel niet gehaald, 100% geteld.", @@ -278,7 +306,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: true, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(22.5) // 30 * 0.75 = 22.5 expect(result.applicationFilling[0].normFillingDetails).toContain( "75% korting", @@ -295,7 +326,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(30) // 100% counted expect(result.applicationFilling[0].normFillingDetails).toBeUndefined() }) @@ -310,7 +344,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBeCloseTo(10 * 3.1) // 31 }) @@ -324,7 +361,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) expect(result.normFilling).toBe(0) }) @@ -339,7 +379,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) // Standard: 10kg. Remaining norm: 20kg. // Groencompost: 200kg actual P. Discounted: 50kg. // To fill 20kg norm with 25% discounted: need 20 / 0.25 = 80kg actual P. @@ -370,7 +413,10 @@ describe("calculateFertilizerApplicationFillingForPhosphate", () => { fertilizers: mockFertilizers, has_organic_certification: false, fosfaatgebruiksnorm, - }) + cultivations: [], + has_grazining_intention: false, + b_centroid: [0, 0], + } as NL2025NormsFillingInput) // Standard: 10kg. // App2 (Groencompost): 40kg actual P. // Eligible for discount: min(40, 30 - 0) = 30kg. Discounted: 30 * 0.25 = 7.5kg. diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts index f202dc003..8d35d4fc2 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts @@ -1,7 +1,8 @@ -import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" -import type { NormFilling } from "./types" +import type { NormFilling, NL2025NormsFillingInput } from "./types" import { table11Mestcodes } from "./table-11-mestcodes" import Decimal from "decimal.js" +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" + const rvoMestcodesOrganicRich25Percent = ["111", "112"] // Compost, Zeer schone compost const rvoMestcodesOrganicRich75Percent = ["110", "10", "61", "25", "56"] // Champost, Rundvee - Vaste mest, Geiten - Vaste mest, Paarden - Vaste mest, Schapen - Mest, alle systemen const rvoMestcodesOrganicRich75PercentOrganic = ["40"] // Varkens - Vaste mest (for organic certification) @@ -27,24 +28,14 @@ const rvoMestcodesOrganicRich75PercentOrganic = ["40"] // Varkens - Vaste mest ( * with a 75% contribution factor (e.g., strorijke vaste mest). * This has been acknowledged by RVO to be possible in personal communication with Sven. * - * @param {object} params - The parameters for the calculation. - * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. - * @param {Fertilizer[]} params.fertilizers - An array of available fertilizers. - * @param {boolean} params.has_organic_certification - Indicates if the farm has organic certification, which affects certain fertilizer types. - * @param {number} params.fosfaatgebruiksnorm - The maximum phosphate usage norm in kg/ha. + * @param {NL2025NormsFillingInput} input - The standardized input object containing all necessary data. * @returns {NormFilling} An object containing the total norm filling and a breakdown per application. */ -export function calculateFertilizerApplicationFillingForPhosphate({ - applications, - fertilizers, - has_organic_certification, - fosfaatgebruiksnorm, -}: { - applications: FertilizerApplication[] - fertilizers: Fertilizer[] - has_organic_certification: boolean - fosfaatgebruiksnorm: number -}): NormFilling { +export function calculateFertilizerApplicationFillingForPhosphate( + input: NL2025NormsFillingInput, +): NormFilling { + const { applications, fertilizers, has_organic_certification, fosfaatgebruiksnorm } = input; + // Create maps for efficient lookups of fertilizers and RVO types. // This avoids iterating over the arrays repeatedly in a loop. const fertilizersMap = new Map( @@ -56,11 +47,11 @@ export function calculateFertilizerApplicationFillingForPhosphate({ // Determines if at least 20 kg P2O5 / ha is applied with organic-rich fertilizers const condition1 = - determineCondition1StimuleringOrganischeStofrijkeMeststoffen({ + determineCondition1StimuleringOrganischeStofrijkeMeststoffen( applications, fertilizersMap, has_organic_certification, - }) + ) let totalFilling = new Decimal(0) const normLimit = new Decimal(fosfaatgebruiksnorm) @@ -233,21 +224,16 @@ export function calculateFertilizerApplicationFillingForPhosphate({ * Determines if at least 20 kg P2O5 / ha is applied with organic-rich fertilizers. * This is Condition 1 for the "Stimuleren organische stofrijke meststoffen" regulation. * - * @param {object} params - The parameters for the condition check. - * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. - * @param {Map} params.fertilizersMap - A map of fertilizers for efficient lookup. - * @param {boolean} params.has_organic_certification - Indicates if the farm has organic certification. + * @param {FertilizerApplication[]} applications - An array of fertilizer applications. + * @param {Map} fertilizersMap - A map of fertilizers for efficient lookup. + * @param {boolean} has_organic_certification - Indicates if the farm has organic certification. * @returns {boolean} True if the 20 kg/ha threshold is met, false otherwise. */ -function determineCondition1StimuleringOrganischeStofrijkeMeststoffen({ - applications, - fertilizersMap, - has_organic_certification, -}: { - applications: FertilizerApplication[] - fertilizersMap: Map - has_organic_certification: boolean -}): boolean { +function determineCondition1StimuleringOrganischeStofrijkeMeststoffen( + applications: FertilizerApplication[], + fertilizersMap: Map, + has_organic_certification: boolean, +): boolean { // Set the RVO mestcodes for organic-rich fertilizers const rvoMestcodesOrganicRich = [ ...rvoMestcodesOrganicRich25Percent, diff --git a/fdm-calculator/src/norms/nl/2025/filling/input.test.ts b/fdm-calculator/src/norms/nl/2025/filling/input.test.ts new file mode 100644 index 000000000..a28ae0e7d --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/input.test.ts @@ -0,0 +1,151 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest" +import { collectInputForFertilizerApplicationFilling } from "./input" +import type { + FdmType, + Field, + Cultivation, + FertilizerApplication, + Fertilizer, +} from "@svenvw/fdm-core" +import type { NL2025NormsFillingInput } from "./types" + +// Mock the entire @svenvw/fdm-core module +vi.mock("@svenvw/fdm-core", () => ({ + getField: vi.fn(), + getGrazingIntention: vi.fn(), + isOrganicCertificationValid: vi.fn(), + getCultivations: vi.fn(), + getFertilizerApplications: vi.fn(), + getFertilizers: vi.fn(), +})) + +// Import the mocked functions +import { + getField, + getGrazingIntention, + isOrganicCertificationValid, + getCultivations, + getFertilizerApplications, + getFertilizers, +} from "@svenvw/fdm-core" + +describe("collectInputForFertilizerApplicationFilling", () => { + const mockFdm = {} as FdmType + const mockPrincipalId = "principal123" + const mockFieldId = "field456" + const mockFosfaatgebruiksnorm = 100 + + beforeEach(() => { + // Reset all mocks before each test + vi.clearAllMocks() + + // Set up default mock implementations for a successful scenario + vi.mocked(getField).mockResolvedValue({ + b_id: mockFieldId, + b_id_farm: "farm789", + b_centroid: [10, 20], + // Add other necessary Field properties + } as Field) + vi.mocked(getGrazingIntention).mockResolvedValue(true) + vi.mocked(isOrganicCertificationValid).mockResolvedValue(false) + vi.mocked(getCultivations).mockResolvedValue([ + { b_lu: "cult1", b_start: "2025-01-01", b_lu_catalogue: "nl_2014" }, + ] as Cultivation[]) + vi.mocked(getFertilizerApplications).mockResolvedValue([ + { p_app_id: "app1", p_id_catalogue: "fert1", p_app_amount: 1000 }, + ] as FertilizerApplication[]) + vi.mocked(getFertilizers).mockResolvedValue([ + { p_id_catalogue: "fert1", p_n_rt: 5, p_type_rvo: "115" }, + ] as Fertilizer[]) + }) + + it("should successfully collect all input data for a valid scenario", async () => { + const expectedB_centroid: [number, number] = [10, 20] + const expectedCultivations: Cultivation[] = [ + { b_lu: "cult1", b_start: "2025-01-01", b_lu_catalogue: "nl_2014" }, + ] + const expectedApplications: FertilizerApplication[] = [ + { p_app_id: "app1", p_id_catalogue: "fert1", p_app_amount: 1000 }, + ] + const expectedFertilizers: Fertilizer[] = [ + { p_id_catalogue: "fert1", p_n_rt: 5, p_type_rvo: "115" }, + ] + + const result = await collectInputForFertilizerApplicationFilling( + mockFdm, + mockPrincipalId, + mockFieldId, + mockFosfaatgebruiksnorm, + ) + + // Assert that all fdm-core functions were called with the correct arguments + expect(getField).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + mockFieldId, + ) + expect(getGrazingIntention).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "farm789", + 2025, + ) + expect(isOrganicCertificationValid).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "farm789", + new Date(2025, 4, 15), + ) + expect(getCultivations).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + mockFieldId, + { start: new Date(2025, 0, 1), end: new Date(2025, 11, 31) }, + ) + expect(getFertilizerApplications).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "field456", + { start: new Date(2025, 0, 1), end: new Date(2025, 11, 31) }, + ) + expect(getFertilizers).toHaveBeenCalledWith( + mockFdm, + mockPrincipalId, + "farm789", + ) + + // Assert the structure and content of the returned NL2025NormsFillingInput object + expect(result).toEqual({ + cultivations: expectedCultivations, + applications: expectedApplications, + fertilizers: expectedFertilizers, + has_organic_certification: false, + has_grazining_intention: true, + fosfaatgebruiksnorm: mockFosfaatgebruiksnorm, + b_centroid: expectedB_centroid, + } as NL2025NormsFillingInput) + }) + + it("should throw an error if the field is not found", async () => { + vi.mocked(getField).mockResolvedValue(null) // Simulate field not found + + await expect( + collectInputForFertilizerApplicationFilling( + mockFdm, + mockPrincipalId, + mockFieldId, + mockFosfaatgebruiksnorm, + ), + ).rejects.toThrow( + `Field with id ${mockFieldId} not found for principal ${mockPrincipalId}`, + ) + }) + + // Add more tests for edge cases and different scenarios as needed + // For example: + // - No cultivations + // - No applications + // - No fertilizers + // - Different grazing intention / organic certification status + // - Empty b_centroid (if getField returns a field without centroid, though current mock ensures it has one) +}) diff --git a/fdm-calculator/src/norms/nl/2025/filling/input.ts b/fdm-calculator/src/norms/nl/2025/filling/input.ts new file mode 100644 index 000000000..118b0672d --- /dev/null +++ b/fdm-calculator/src/norms/nl/2025/filling/input.ts @@ -0,0 +1,96 @@ +import type { FdmType, Timeframe } from "@svenvw/fdm-core" +import type { NL2025NormsFillingInput } from "./types" +import { + getCultivations, + getFertilizerApplications, + getFertilizers, + isOrganicCertificationValid, + getField, + getGrazingIntention, +} from "@svenvw/fdm-core" + +/** + * Collects all necessary input data from fdm-core functions for the NL 2025 norms filling calculations. + * This function standardizes the data collection process, ensuring all calculation functions + * receive a unified input object (NL2025NormsFillingInput). + * + * @param {FdmType} fdm - The FdmType instance for interacting with the Farm Data Model. + * @param {string} principal_id - The ID of the principal (user or organization) performing the calculation. + * @param {string} b_id - The ID of the field for which the norms are being calculated. + * @param {number} fosfaatgebruiksnorm - The phosphate usage norm in kg/ha for the current calculation. + * @returns {Promise} A promise that resolves to a standardized input object + * containing cultivations, fertilizer applications, fertilizers, organic certification status, + * grazing intention status, the phosphate usage norm, and the field's centroid. + * @throws {Error} Throws an error if the specified field cannot be found. + */ +export async function collectInputForFertilizerApplicationFilling( + fdm: FdmType, + principal_id: string, + b_id: string, + fosfaatgebruiksnorm: number, +): Promise { + // Define the calendar year for the norms calculation. + const year = 2025 + // Define the timeframe for data collection for the current year. + const startOfYear = new Date(year, 0, 1) // January 1st of the specified year + const endOfYear = new Date(year, 11, 31) // December 31st of the specified year + const timeframe2025: Timeframe = { start: startOfYear, end: endOfYear } + + // 1. Retrieve field details using the field ID. + // This is crucial for obtaining the farm ID and the field's geographical centroid. + const field = await getField(fdm, principal_id, b_id) + if (!field) { + throw new Error(`Field with id ${b_id} not found for principal ${principal_id}`); + } + const b_id_farm = field.b_id_farm + const b_centroid = field.b_centroid + + // 2. Retrieve the grazing intention status for the farm for the specified year. + // This indicates whether grazing is intended on the farm, affecting certain norm calculations. + const has_grazing_intention = await getGrazingIntention( + fdm, + principal_id, + b_id_farm, + year, + ) + + // 3. Check the organic certification status for the farm. + // This is relevant for specific organic-rich fertilizer regulations. + // The date is set to mid-year to ensure it falls within the certification period if applicable. + const has_organic_certification = await isOrganicCertificationValid( + fdm, + principal_id, + b_id_farm, + new Date(year, 4, 15), // May 15th of the specified year + ) + + // 4. Retrieve all cultivations associated with the field within the defined cultivation timeframe. + // This data is used to determine land use (e.g., bouwland/grasland). + const cultivations = await getCultivations( + fdm, + principal_id, + b_id, + timeframe2025, + ) + + // 5. Retrieve all fertilizer applications for the farm within the current year's timeframe. + const applications = await getFertilizerApplications( + fdm, + principal_id, + b_id, + timeframe2025, + ) + // 6. Retrieve details of all fertilizers used on the farm. + const fertilizers = await getFertilizers(fdm, principal_id, b_id_farm) + + // Assemble all collected data into the standardized NL2025NormsFillingInput object. + return { + cultivations: cultivations, + applications: applications, + fertilizers: fertilizers, + has_organic_certification: has_organic_certification, + has_grazining_intention: has_grazing_intention, + fosfaatgebruiksnorm: fosfaatgebruiksnorm, + b_centroid: b_centroid, + } +} diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts index 515191764..11cccbfbd 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts @@ -8,10 +8,10 @@ import { getRegion } from "../stikstofgebruiksnorm" import type { Fertilizer, FertilizerApplication, - CurrentSoilData, Cultivation, } from "@svenvw/fdm-core" import type { RegionKey } from "../types" +import type { NL2025NormsFillingInput } from "./types" // Mock getRegion vi.mock("../stikstofgebruiksnorm", () => ({ @@ -574,17 +574,19 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { p_type_rvo: "115", // Kunstmest (working coefficient 1.0) }, ] - const soilData: CurrentSoilData[] = [] // Mocked - const b_grazing_intention = false + const b_centroid: [number, number] = [0, 0] + const has_grazining_intention = false const cultivations: Cultivation[] = [] const result = await calculateFertilizerApplicationFillingForNitrogen({ applications, fertilizers, - soilData, - b_grazing_intention, + b_centroid, + has_grazining_intention, cultivations, - }) + has_organic_certification: false, // Default value for tests + fosfaatgebruiksnorm: 0, // Default value for tests + } as NL2025NormsFillingInput) // Expected: 1000 kg * 5 kg/ton * 1.0 (100%) / 1000 = 5 expect(result.normFilling).toBeCloseTo(5) @@ -623,17 +625,19 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { p_type_rvo: "111", // Compost (working coefficient 0.1) }, ] - const soilData: CurrentSoilData[] = [] // Mocked - const b_grazing_intention = false + const b_centroid: [number, number] = [0, 0] + const has_grazining_intention = false const cultivations: Cultivation[] = [] const result = await calculateFertilizerApplicationFillingForNitrogen({ applications, fertilizers, - soilData, - b_grazing_intention, + b_centroid, + has_grazining_intention, cultivations, - }) + has_organic_certification: false, // Default value for tests + fosfaatgebruiksnorm: 0, // Default value for tests + } as NL2025NormsFillingInput) // App1: 1000 * 5 * 1.0 / 1000 = 5 // App2: 500 * 10 * 0.1 / 1000 = 0.5 @@ -666,17 +670,19 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { p_type_rvo: "14", // Drijfmest rundvee (Table 11: 4.0 kg N/ton) }, ] - const soilData: CurrentSoilData[] = [] // Mocked - const b_grazing_intention = true // Drijfmest graasdieren, met beweiding -> 0.45 + const b_centroid: [number, number] = [0, 0] + const has_grazining_intention = true // Drijfmest graasdieren, met beweiding -> 0.45 const cultivations: Cultivation[] = [] const result = await calculateFertilizerApplicationFillingForNitrogen({ applications, fertilizers, - soilData, - b_grazing_intention, + b_centroid, + has_grazining_intention, cultivations, - }) + has_organic_certification: false, // Default value for tests + fosfaatgebruiksnorm: 0, // Default value for tests + } as NL2025NormsFillingInput) // Expected: 1000 * 4.0 (from Table 11) * 0.45 (from Table 9) / 1000 = 1.8 expect(result.normFilling).toBeCloseTo(1.8) @@ -697,18 +703,20 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { }, ] const fertilizers: Fertilizer[] = [] // Empty fertilizers array - const soilData: CurrentSoilData[] = [] - const b_grazing_intention = false + const b_centroid: [number, number] = [0, 0] + const has_grazining_intention = false const cultivations: Cultivation[] = [] await expect(() => calculateFertilizerApplicationFillingForNitrogen({ applications, fertilizers, - soilData, - b_grazing_intention, + b_centroid, + has_grazining_intention, cultivations, - }), + has_organic_certification: false, // Default value for tests + fosfaatgebruiksnorm: 0, // Default value for tests + } as NL2025NormsFillingInput), ).rejects.toThrow( "Fertilizer nonExistentFert not found for application app1", ) @@ -732,8 +740,8 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { p_type_rvo: "10", // Vaste mest rundvee (onFarmProduced: true in table9, but our temp logic makes it false) }, ] - const soilData: CurrentSoilData[] = [] - const b_grazing_intention = false + const b_centroid: [number, number] = [0, 0] + const has_grazining_intention = false const cultivations: Cultivation[] = [ { b_lu: "cult1", @@ -746,10 +754,12 @@ describe("calculateFertilizerApplicationFillingForNitrogen", () => { const result = await calculateFertilizerApplicationFillingForNitrogen({ applications, fertilizers, - soilData, - b_grazing_intention, + b_centroid, + has_grazining_intention, cultivations, - }) + has_organic_certification: false, // Default value for tests + fosfaatgebruiksnorm: 0, // Default value for tests + } as NL2025NormsFillingInput) // For p_type_rvo "10" (Vaste mest rundvee), onFarmProduced: true in table9. // Our temporary logic `onFarmProduced = isDrijfmest` makes it `false`. diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts index e06a4bb5a..0f7c4b258 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts @@ -1,10 +1,5 @@ -import type { - Fertilizer, - FertilizerApplication, - CurrentSoilData, - Cultivation, -} from "@svenvw/fdm-core" -import type { NormFilling, WorkingCoefficientDetails } from "./types" +import type { Cultivation } from "@svenvw/fdm-core" +import type { NormFilling, WorkingCoefficientDetails, NL2025NormsFillingInput } from "./types" import { table11Mestcodes } from "./table-11-mestcodes" import { table9 } from "./table-9" import { getRegion } from "../stikstofgebruiksnorm" @@ -17,31 +12,18 @@ import Decimal from "decimal.js" * fertilizer type, nitrogen content, working coefficients, soil type, grazing intention, * and land use (bouwland/arable land). * - * @param {Object} params - The parameters for the calculation. - * @param {FertilizerApplication[]} params.applications - An array of fertilizer applications. - * @param {Fertilizer[]} params.fertilizers - An array of available fertilizers. - * @param {CurrentSoilData[]} params.soilData - Current soil data for the farm. - * @param {boolean} params.b_grazing_intention - Indicates if there is a grazing intention for the farm. - * @param {Cultivation[]} params.cultivations - An array of cultivations for the farm. + * @param {NL2025NormsFillingInput} input - The standardized input object containing all necessary data. * @returns {Promise} An object containing the total norm filling and details for each application. */ -export async function calculateFertilizerApplicationFillingForNitrogen({ - applications, - fertilizers, - soilData, - b_grazing_intention, - cultivations, -}: { - applications: FertilizerApplication[] - fertilizers: Fertilizer[] - soilData: CurrentSoilData[] - b_grazing_intention: boolean - cultivations: Cultivation[] -}): Promise { +export async function calculateFertilizerApplicationFillingForNitrogen( + input: NL2025NormsFillingInput, +): Promise { + const { applications, fertilizers, b_centroid, has_grazining_intention, cultivations } = input; + const applicationFillings: NormFilling["applicationFilling"] = [] let totalNormFilling = new Decimal(0) - const soilType = await getRegion(soilData) + const soilType = await getRegion(b_centroid) for (const application of applications) { const fertilizer = fertilizers.find( @@ -90,7 +72,7 @@ export async function calculateFertilizerApplicationFillingForNitrogen({ const workingCoefficientDetails = getWorkingCoefficient( fertilizer.p_type_rvo, soilType, - b_grazing_intention, + has_grazining_intention, isCurrentBouwland, p_app_date, fertilizerOnFarmProduced, // Pass the determined onFarmProduced status diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 2557e53ab..95ffe7028 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -37,3 +37,13 @@ export type WorkingCoefficientDetails = { description: string subTypeDescription?: string } + +export type NL2025NormsFillingInput = { + cultivations: cultivations + applications: FertilizerApplication[] + fertilizers: Fertilizer[] + has_organic_certification: boolean + has_grazining_intention: boolean + fosfaatgebruiksnorm: number + b_centroid: Field["b_centroid"] +} From c09c94e9dbbaca9c5a0aaf011cf551c9fb0db480 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:34:48 +0200 Subject: [PATCH 066/243] chore: cleanup --- .../norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts | 2 +- .../src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts | 1 - .../src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts | 2 +- fdm-calculator/src/norms/nl/2025/filling/input.test.ts | 2 +- fdm-calculator/src/norms/nl/2025/filling/types.d.ts | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts index e8971b26b..025ca76ee 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest" -import type { Fertilizer, FertilizerApplication, Cultivation } from "@svenvw/fdm-core" +import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" import { calculateFertilizerApplicationFillingForManure } from "./dierlijke-mest-gebruiksnorm" import type { NL2025NormsFillingInput } from "./types" diff --git a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts index 65b7c6678..f6af73022 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts @@ -1,7 +1,6 @@ import Decimal from "decimal.js" import { table11Mestcodes } from "./table-11-mestcodes" import type { NormFilling, NL2025NormsFillingInput } from "./types" -import type { Fertilizer, FertilizerApplication } from "@svenvw/fdm-core" /** * Calculates the nitrogen usage from animal manure for a list of fertilizer applications. diff --git a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts index 005a65c41..a7630ed1b 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest" -import type { Fertilizer, FertilizerApplication, Cultivation } from "@svenvw/fdm-core" +import type { Fertilizer, FertilizerApplication} from "@svenvw/fdm-core" import { calculateFertilizerApplicationFillingForPhosphate } from "./fosfaatgebruiksnorm" import type { NL2025NormsFillingInput } from "./types" diff --git a/fdm-calculator/src/norms/nl/2025/filling/input.test.ts b/fdm-calculator/src/norms/nl/2025/filling/input.test.ts index a28ae0e7d..ed34e5021 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/input.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/input.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest" +import { describe, it, expect, vi, beforeEach} from "vitest" import { collectInputForFertilizerApplicationFilling } from "./input" import type { FdmType, diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 95ffe7028..86054911c 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -1,5 +1,5 @@ import type { fdmSchema } from "@svenvw/fdm-core" -import { RegionKey } from "../types" +import type { RegionKey } from "../types" export type NormFilling = { normFilling: number From 7b44f22b8275a2c4372479ace0f1efd4e690a1a3 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:36:41 +0200 Subject: [PATCH 067/243] chore: restructure files --- fdm-calculator/src/index.ts | 6 +++--- fdm-calculator/src/norms/farm.test.ts | 2 +- fdm-calculator/src/norms/farm.ts | 2 +- fdm-calculator/src/norms/index.test.ts | 8 ++++---- fdm-calculator/src/norms/index.ts | 8 ++++---- .../2025/filling/stikstofgebruiksnorm.test.ts | 4 ++-- .../nl/2025/filling/stikstofgebruiksnorm.ts | 18 ++++++++++++++---- .../src/norms/nl/2025/filling/types.d.ts | 2 +- .../dierlijke-mest-gebruiksnorm.test.ts | 0 .../{ => value}/dierlijke-mest-gebruiksnorm.ts | 4 ++-- .../{ => value}/fosfaatgebruiksnorm-data.ts | 0 .../{ => value}/fosfaatgebruiksnorm.test.ts | 0 .../nl/2025/{ => value}/fosfaatgebruiksnorm.ts | 0 .../nl/2025/{ => value}/hoofdteelt.test.ts | 0 .../norms/nl/2025/{ => value}/hoofdteelt.ts | 0 .../norms/nl/2025/{ => value}/input.test.ts | 0 .../src/norms/nl/2025/{ => value}/input.ts | 0 .../{ => value}/stikstofgebruiksnorm-data.ts | 0 .../{ => value}/stikstofgebruiksnorm.test.ts | 0 .../2025/{ => value}/stikstofgebruiksnorm.ts | 4 ++-- .../src/norms/nl/2025/{ => value}/types.d.ts | 0 21 files changed, 34 insertions(+), 24 deletions(-) rename fdm-calculator/src/norms/nl/2025/{ => value}/dierlijke-mest-gebruiksnorm.test.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/dierlijke-mest-gebruiksnorm.ts (98%) rename fdm-calculator/src/norms/nl/2025/{ => value}/fosfaatgebruiksnorm-data.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/fosfaatgebruiksnorm.test.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/fosfaatgebruiksnorm.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/hoofdteelt.test.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/hoofdteelt.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/input.test.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/input.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/stikstofgebruiksnorm-data.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/stikstofgebruiksnorm.test.ts (100%) rename fdm-calculator/src/norms/nl/2025/{ => value}/stikstofgebruiksnorm.ts (99%) rename fdm-calculator/src/norms/nl/2025/{ => value}/types.d.ts (100%) diff --git a/fdm-calculator/src/index.ts b/fdm-calculator/src/index.ts index 0d0eaa3d6..9c5ef4534 100644 --- a/fdm-calculator/src/index.ts +++ b/fdm-calculator/src/index.ts @@ -27,12 +27,12 @@ export type { AggregatedNormsToFarmLevel } from "./norms/farm" export { isFieldInGWGBGebied, isFieldInNatura2000Gebied, -} from "./norms/nl/2025/dierlijke-mest-gebruiksnorm" +} from "./norms/nl/2025/value/dierlijke-mest-gebruiksnorm" export { getRegion, isFieldInNVGebied, -} from "./norms/nl/2025/stikstofgebruiksnorm" +} from "./norms/nl/2025/value/stikstofgebruiksnorm" export type { GebruiksnormResult, NL2025NormsInput, -} from "./norms/nl/2025/types.d" +} from "./norms/nl/2025/value/types" diff --git a/fdm-calculator/src/norms/farm.test.ts b/fdm-calculator/src/norms/farm.test.ts index 1e0f83a95..326a93478 100644 --- a/fdm-calculator/src/norms/farm.test.ts +++ b/fdm-calculator/src/norms/farm.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest" import { aggregateNormsToFarmLevel } from "./farm" -import type { GebruiksnormResult } from "./nl/2025/types" +import type { GebruiksnormResult } from "./nl/2025/value/types" describe("aggregateNormsToFarmLevel", () => { it("should correctly aggregate norms from multiple fields", () => { diff --git a/fdm-calculator/src/norms/farm.ts b/fdm-calculator/src/norms/farm.ts index 3890b0c10..3692ef5ef 100644 --- a/fdm-calculator/src/norms/farm.ts +++ b/fdm-calculator/src/norms/farm.ts @@ -1,5 +1,5 @@ import { Decimal } from "decimal.js" -import type { GebruiksnormResult } from "./nl/2025/types" +import type { GebruiksnormResult } from "./nl/2025/value/types" /** * Represents the input structure for the `aggregateNormsToFarmLevel` function. diff --git a/fdm-calculator/src/norms/index.test.ts b/fdm-calculator/src/norms/index.test.ts index fa93d8245..d26e44b3d 100644 --- a/fdm-calculator/src/norms/index.test.ts +++ b/fdm-calculator/src/norms/index.test.ts @@ -4,10 +4,10 @@ import { createFunctionsForFertilizerApplicationFilling, createFunctionsForNorms, } from "./index" -import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" -import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" -import { collectNL2025InputForNorms } from "./nl/2025/input" -import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" +import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/value/dierlijke-mest-gebruiksnorm" +import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/value/fosfaatgebruiksnorm" +import { collectNL2025InputForNorms } from "./nl/2025/value/input" +import { getNL2025StikstofGebruiksNorm } from "./nl/2025/value/stikstofgebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index 74dfc3393..fee1158b8 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -1,12 +1,12 @@ import { aggregateNormsToFarmLevel } from "./farm" -import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/dierlijke-mest-gebruiksnorm" +import { getNL2025DierlijkeMestGebruiksNorm } from "./nl/2025/value/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForManure } from "./nl/2025/filling/dierlijke-mest-gebruiksnorm" import { calculateFertilizerApplicationFillingForPhosphate } from "./nl/2025/filling/fosfaatgebruiksnorm" import { collectInputForFertilizerApplicationFilling } from "./nl/2025/filling/input" import { calculateFertilizerApplicationFillingForNitrogen } from "./nl/2025/filling/stikstofgebruiksnorm" -import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/fosfaatgebruiksnorm" -import { collectNL2025InputForNorms } from "./nl/2025/input" -import { getNL2025StikstofGebruiksNorm } from "./nl/2025/stikstofgebruiksnorm" +import { getNL2025FosfaatGebruiksNorm } from "./nl/2025/value/fosfaatgebruiksnorm" +import { collectNL2025InputForNorms } from "./nl/2025/value/input" +import { getNL2025StikstofGebruiksNorm } from "./nl/2025/value/stikstofgebruiksnorm" export function createFunctionsForNorms(b_region: "NL", year: "2025") { if (b_region === "NL") { diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts index 11cccbfbd..ef58da9b1 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.test.ts @@ -4,13 +4,13 @@ import { isBouwland, getWorkingCoefficient, } from "./stikstofgebruiksnorm" -import { getRegion } from "../stikstofgebruiksnorm" +import { getRegion } from "../value/stikstofgebruiksnorm" import type { Fertilizer, FertilizerApplication, Cultivation, } from "@svenvw/fdm-core" -import type { RegionKey } from "../types" +import type { RegionKey } from "../value/types" import type { NL2025NormsFillingInput } from "./types" // Mock getRegion diff --git a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts index 0f7c4b258..4700b73d5 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts @@ -1,9 +1,13 @@ import type { Cultivation } from "@svenvw/fdm-core" -import type { NormFilling, WorkingCoefficientDetails, NL2025NormsFillingInput } from "./types" +import type { + NormFilling, + WorkingCoefficientDetails, + NL2025NormsFillingInput, +} from "./types" import { table11Mestcodes } from "./table-11-mestcodes" import { table9 } from "./table-9" -import { getRegion } from "../stikstofgebruiksnorm" -import type { RegionKey } from "../types" +import { getRegion } from "../value/stikstofgebruiksnorm" +import type { RegionKey } from "../value/types" import Decimal from "decimal.js" /** @@ -18,7 +22,13 @@ import Decimal from "decimal.js" export async function calculateFertilizerApplicationFillingForNitrogen( input: NL2025NormsFillingInput, ): Promise { - const { applications, fertilizers, b_centroid, has_grazining_intention, cultivations } = input; + const { + applications, + fertilizers, + b_centroid, + has_grazining_intention, + cultivations, + } = input const applicationFillings: NormFilling["applicationFilling"] = [] let totalNormFilling = new Decimal(0) diff --git a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts index 86054911c..2af89c4c2 100644 --- a/fdm-calculator/src/norms/nl/2025/filling/types.d.ts +++ b/fdm-calculator/src/norms/nl/2025/filling/types.d.ts @@ -1,5 +1,5 @@ import type { fdmSchema } from "@svenvw/fdm-core" -import type { RegionKey } from "../types" +import type { RegionKey } from "../value/types" export type NormFilling = { normFilling: number diff --git a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.test.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts rename to fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.test.ts diff --git a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.ts similarity index 98% rename from fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts rename to fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.ts index c6046ec16..c668d026d 100644 --- a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.ts @@ -1,6 +1,6 @@ import type { Field } from "@svenvw/fdm-core" -import { getGeoTiffValue } from "../../../shared/geotiff" -import { getFdmPublicDataUrl } from "../../../shared/public-data-url" +import { getGeoTiffValue } from "../../../../shared/geotiff" +import { getFdmPublicDataUrl } from "../../../../shared/public-data-url" import { isFieldInNVGebied } from "./stikstofgebruiksnorm" import type { DierlijkeMestGebruiksnormResult, diff --git a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm-data.ts b/fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm-data.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm-data.ts rename to fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm-data.ts diff --git a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.test.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts rename to fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.test.ts diff --git a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts rename to fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.ts diff --git a/fdm-calculator/src/norms/nl/2025/hoofdteelt.test.ts b/fdm-calculator/src/norms/nl/2025/value/hoofdteelt.test.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/hoofdteelt.test.ts rename to fdm-calculator/src/norms/nl/2025/value/hoofdteelt.test.ts diff --git a/fdm-calculator/src/norms/nl/2025/hoofdteelt.ts b/fdm-calculator/src/norms/nl/2025/value/hoofdteelt.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/hoofdteelt.ts rename to fdm-calculator/src/norms/nl/2025/value/hoofdteelt.ts diff --git a/fdm-calculator/src/norms/nl/2025/input.test.ts b/fdm-calculator/src/norms/nl/2025/value/input.test.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/input.test.ts rename to fdm-calculator/src/norms/nl/2025/value/input.test.ts diff --git a/fdm-calculator/src/norms/nl/2025/input.ts b/fdm-calculator/src/norms/nl/2025/value/input.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/input.ts rename to fdm-calculator/src/norms/nl/2025/value/input.ts diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts b/fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm-data.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm-data.ts rename to fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm-data.ts diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.test.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts rename to fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.test.ts diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts similarity index 99% rename from fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts rename to fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts index 4c3a8e7ea..4b351c056 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts @@ -1,7 +1,7 @@ import type { Field } from "@svenvw/fdm-core" import Decimal from "decimal.js" -import { getGeoTiffValue } from "../../../shared/geotiff" -import { getFdmPublicDataUrl } from "../../../shared/public-data-url" +import { getGeoTiffValue } from "../../../../shared/geotiff" +import { getFdmPublicDataUrl } from "../../../../shared/public-data-url" import { determineNL2025Hoofdteelt } from "./hoofdteelt" import { nitrogenStandardsData } from "./stikstofgebruiksnorm-data" import type { diff --git a/fdm-calculator/src/norms/nl/2025/types.d.ts b/fdm-calculator/src/norms/nl/2025/value/types.d.ts similarity index 100% rename from fdm-calculator/src/norms/nl/2025/types.d.ts rename to fdm-calculator/src/norms/nl/2025/value/types.d.ts From b5640fee80c9a937c7445a91a54a1942336129b2 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:37:52 +0200 Subject: [PATCH 068/243] chore: remove db migration for easier git merge --- fdm-core/src/db/migrations/0015_new_stick.sql | 31 - .../src/db/migrations/meta/0015_snapshot.json | 3376 ----------------- fdm-core/src/db/migrations/meta/_journal.json | 227 +- 3 files changed, 110 insertions(+), 3524 deletions(-) delete mode 100644 fdm-core/src/db/migrations/0015_new_stick.sql delete mode 100644 fdm-core/src/db/migrations/meta/0015_snapshot.json diff --git a/fdm-core/src/db/migrations/0015_new_stick.sql b/fdm-core/src/db/migrations/0015_new_stick.sql deleted file mode 100644 index f9cafee14..000000000 --- a/fdm-core/src/db/migrations/0015_new_stick.sql +++ /dev/null @@ -1,31 +0,0 @@ -CREATE TYPE "fdm"."p_type_rvo" AS ENUM('10', '11', '12', '13', '14', '17', '18', '19', '23', '30', '31', '32', '33', '35', '39', '40', '41', '42', '43', '46', '50', '56', '60', '61', '75', '76', '80', '81', '90', '91', '92', '25', '26', '27', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '120');--> statement-breakpoint -CREATE TABLE "fdm"."intending_grazing" ( - "b_id_farm" text NOT NULL, - "b_grazing_intention" boolean, - "b_grazing_intention_year" integer NOT NULL, - "created" timestamp with time zone DEFAULT now() NOT NULL, - "updated" timestamp with time zone, - CONSTRAINT "intending_grazing_b_id_farm_b_grazing_intention_year_pk" PRIMARY KEY("b_id_farm","b_grazing_intention_year") -); ---> statement-breakpoint -CREATE TABLE "fdm"."organic_certifications" ( - "b_id_organic" text PRIMARY KEY NOT NULL, - "b_organic_traces" text, - "b_organic_skal" text, - "b_organic_issued" timestamp with time zone, - "b_organic_expires" timestamp with time zone, - "created" timestamp with time zone DEFAULT now() NOT NULL, - "updated" timestamp with time zone -); ---> statement-breakpoint -CREATE TABLE "fdm"."organic_certifications_holding" ( - "b_id_farm" text NOT NULL, - "b_id_organic" text NOT NULL, - "created" timestamp with time zone DEFAULT now() NOT NULL, - "updated" timestamp with time zone -); ---> statement-breakpoint -ALTER TABLE "fdm"."fertilizers_catalogue" ADD COLUMN "p_type_rvo" "fdm"."p_type_rvo";--> statement-breakpoint -ALTER TABLE "fdm"."intending_grazing" ADD CONSTRAINT "intending_grazing_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk" FOREIGN KEY ("b_id_organic") REFERENCES "fdm"."organic_certifications"("b_id_organic") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json deleted file mode 100644 index 120c1390e..000000000 --- a/fdm-core/src/db/migrations/meta/0015_snapshot.json +++ /dev/null @@ -1,3376 +0,0 @@ -{ - "id": "ce358cf4-6c4f-4551-87de-35e01db3ed67", - "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", - "version": "7", - "dialect": "postgresql", - "tables": { - "fdm.cultivation_catalogue_selecting": { - "name": "cultivation_catalogue_selecting", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_source": { - "name": "b_lu_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { - "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "cultivation_catalogue_selecting", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_ending": { - "name": "cultivation_ending", - "schema": "fdm", - "columns": { - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_end": { - "name": "b_lu_end", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "m_cropresidue": { - "name": "m_cropresidue", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_ending_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_ending", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_harvesting": { - "name": "cultivation_harvesting", - "schema": "fdm", - "columns": { - "b_id_harvesting": { - "name": "b_id_harvesting", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_harvest_date": { - "name": "b_lu_harvest_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { - "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", - "tableFrom": "cultivation_harvesting", - "tableTo": "harvestables", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable" - ], - "columnsTo": [ - "b_id_harvestable" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_harvesting", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivation_starting": { - "name": "cultivation_starting", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_start": { - "name": "b_lu_start", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_sowing_amount": { - "name": "b_sowing_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_sowing_method": { - "name": "b_sowing_method", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "cultivation_starting_b_id_fields_b_id_fk": { - "name": "cultivation_starting_b_id_fields_b_id_fk", - "tableFrom": "cultivation_starting", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "cultivation_starting_b_lu_cultivations_b_lu_fk": { - "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", - "tableFrom": "cultivation_starting", - "tableTo": "cultivations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu" - ], - "columnsTo": [ - "b_lu" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivations": { - "name": "cultivations", - "schema": "fdm", - "columns": { - "b_lu": { - "name": "b_lu", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_catalogue": { - "name": "b_lu_catalogue", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_variety": { - "name": "b_lu_variety", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_lu_idx": { - "name": "b_lu_idx", - "columns": [ - { - "expression": "b_lu", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { - "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", - "tableFrom": "cultivations", - "tableTo": "cultivations_catalogue", - "schemaTo": "fdm", - "columnsFrom": [ - "b_lu_catalogue" - ], - "columnsTo": [ - "b_lu_catalogue" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.cultivations_catalogue": { - "name": "cultivations_catalogue", - "schema": "fdm", - "columns": { - "b_lu_catalogue": { - "name": "b_lu_catalogue", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_source": { - "name": "b_lu_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_name": { - "name": "b_lu_name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_lu_name_en": { - "name": "b_lu_name_en", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_harvestable": { - "name": "b_lu_harvestable", - "type": "b_lu_harvestable", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": true - }, - "b_lu_hcat3": { - "name": "b_lu_hcat3", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_hcat3_name": { - "name": "b_lu_hcat3_name", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_lu_croprotation": { - "name": "b_lu_croprotation", - "type": "b_lu_croprotation", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "b_lu_yield": { - "name": "b_lu_yield", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_hi": { - "name": "b_lu_hi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_harvestable": { - "name": "b_lu_n_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_residue": { - "name": "b_lu_n_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_n_fixation": { - "name": "b_n_fixation", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_rest_oravib": { - "name": "b_lu_rest_oravib", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "b_lu_variety_options": { - "name": "b_lu_variety_options", - "type": "text[]", - "primaryKey": false, - "notNull": false - }, - "hash": { - "name": "hash", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_lu_catalogue_idx": { - "name": "b_lu_catalogue_idx", - "columns": [ - { - "expression": "b_lu_catalogue", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.derogation_applying": { - "name": "derogation_applying", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_derogation": { - "name": "b_id_derogation", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "derogation_applying_b_id_farm_farms_b_id_farm_fk": { - "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "derogation_applying", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { - "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", - "tableFrom": "derogation_applying", - "tableTo": "derogations", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_derogation" - ], - "columnsTo": [ - "b_id_derogation" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.derogations": { - "name": "derogations", - "schema": "fdm", - "columns": { - "b_id_derogation": { - "name": "b_id_derogation", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_derogation_year": { - "name": "b_derogation_year", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.farms": { - "name": "farms", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_name_farm": { - "name": "b_name_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_businessid_farm": { - "name": "b_businessid_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_address_farm": { - "name": "b_address_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_postalcode_farm": { - "name": "b_postalcode_farm", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_farm_idx": { - "name": "b_id_farm_idx", - "columns": [ - { - "expression": "b_id_farm", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_acquiring": { - "name": "fertilizer_acquiring", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_acquiring_amount": { - "name": "p_acquiring_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_acquiring_date": { - "name": "p_acquiring_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { - "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "fertilizer_acquiring", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_acquiring", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_applying": { - "name": "fertilizer_applying", - "schema": "fdm", - "columns": { - "p_app_id": { - "name": "p_app_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_app_amount": { - "name": "p_app_amount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_app_method": { - "name": "p_app_method", - "type": "p_app_method", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "p_app_date": { - "name": "p_app_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_app_idx": { - "name": "p_app_idx", - "columns": [ - { - "expression": "p_app_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "fertilizer_applying_b_id_fields_b_id_fk": { - "name": "fertilizer_applying_b_id_fields_b_id_fk", - "tableFrom": "fertilizer_applying", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_applying_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_applying", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_catalogue_enabling": { - "name": "fertilizer_catalogue_enabling", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_source": { - "name": "p_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { - "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "fertilizer_catalogue_enabling", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizer_picking": { - "name": "fertilizer_picking", - "schema": "fdm", - "columns": { - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_id_catalogue": { - "name": "p_id_catalogue", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_picking_date": { - "name": "p_picking_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "fertilizer_picking_p_id_fertilizers_p_id_fk": { - "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", - "tableFrom": "fertilizer_picking", - "tableTo": "fertilizers", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id" - ], - "columnsTo": [ - "p_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { - "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", - "tableFrom": "fertilizer_picking", - "tableTo": "fertilizers_catalogue", - "schemaTo": "fdm", - "columnsFrom": [ - "p_id_catalogue" - ], - "columnsTo": [ - "p_id_catalogue" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizers": { - "name": "fertilizers", - "schema": "fdm", - "columns": { - "p_id": { - "name": "p_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_id_idx": { - "name": "p_id_idx", - "columns": [ - { - "expression": "p_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fertilizers_catalogue": { - "name": "fertilizers_catalogue", - "schema": "fdm", - "columns": { - "p_id_catalogue": { - "name": "p_id_catalogue", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "p_source": { - "name": "p_source", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_name_nl": { - "name": "p_name_nl", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "p_name_en": { - "name": "p_name_en", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "p_description": { - "name": "p_description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "p_app_method_options": { - "name": "p_app_method_options", - "type": "p_app_method[]", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "p_dm": { - "name": "p_dm", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_density": { - "name": "p_density", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_om": { - "name": "p_om", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_a": { - "name": "p_a", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_hc": { - "name": "p_hc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_eom": { - "name": "p_eom", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_eoc": { - "name": "p_eoc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_rt": { - "name": "p_c_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_of": { - "name": "p_c_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_if": { - "name": "p_c_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_c_fr": { - "name": "p_c_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cn_of": { - "name": "p_cn_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_rt": { - "name": "p_n_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_if": { - "name": "p_n_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_of": { - "name": "p_n_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_n_wc": { - "name": "p_n_wc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_no3_rt": { - "name": "p_no3_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_nh4_rt": { - "name": "p_nh4_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_p_rt": { - "name": "p_p_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_k_rt": { - "name": "p_k_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mg_rt": { - "name": "p_mg_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ca_rt": { - "name": "p_ca_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ne": { - "name": "p_ne", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_s_rt": { - "name": "p_s_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_s_wc": { - "name": "p_s_wc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cu_rt": { - "name": "p_cu_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_zn_rt": { - "name": "p_zn_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_na_rt": { - "name": "p_na_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_si_rt": { - "name": "p_si_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_b_rt": { - "name": "p_b_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mn_rt": { - "name": "p_mn_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ni_rt": { - "name": "p_ni_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_fe_rt": { - "name": "p_fe_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_mo_rt": { - "name": "p_mo_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_co_rt": { - "name": "p_co_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_as_rt": { - "name": "p_as_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cd_rt": { - "name": "p_cd_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cr_rt": { - "name": "p_cr_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cr_vi": { - "name": "p_cr_vi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_pb_rt": { - "name": "p_pb_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_hg_rt": { - "name": "p_hg_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_cl_rt": { - "name": "p_cl_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_ef_nh3": { - "name": "p_ef_nh3", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "p_type_manure": { - "name": "p_type_manure", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "p_type_mineral": { - "name": "p_type_mineral", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "p_type_compost": { - "name": "p_type_compost", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "p_type_rvo": { - "name": "p_type_rvo", - "type": "p_type_rvo", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "hash": { - "name": "hash", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "p_id_catalogue_idx": { - "name": "p_id_catalogue_idx", - "columns": [ - { - "expression": "p_id_catalogue", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.field_acquiring": { - "name": "field_acquiring", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_start": { - "name": "b_start", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_acquiring_method": { - "name": "b_acquiring_method", - "type": "b_acquiring_method", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": true, - "default": "'unknown'" - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "field_acquiring_b_id_fields_b_id_fk": { - "name": "field_acquiring_b_id_fields_b_id_fk", - "tableFrom": "field_acquiring", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "field_acquiring_b_id_farm_farms_b_id_farm_fk": { - "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "field_acquiring", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.field_discarding": { - "name": "field_discarding", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_end": { - "name": "b_end", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "field_discarding_b_id_fields_b_id_fk": { - "name": "field_discarding_b_id_fields_b_id_fk", - "tableFrom": "field_discarding", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.fields": { - "name": "fields", - "schema": "fdm", - "columns": { - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_name": { - "name": "b_name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_geometry": { - "name": "b_geometry", - "type": "geometry(Polygon,4326)", - "primaryKey": false, - "notNull": false - }, - "b_id_source": { - "name": "b_id_source", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_idx": { - "name": "b_id_idx", - "columns": [ - { - "expression": "b_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - }, - "b_geom_idx": { - "name": "b_geom_idx", - "columns": [ - { - "expression": "b_geometry", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "gist", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestable_analyses": { - "name": "harvestable_analyses", - "schema": "fdm", - "columns": { - "b_id_harvestable_analysis": { - "name": "b_id_harvestable_analysis", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_lu_yield": { - "name": "b_lu_yield", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_harvestable": { - "name": "b_lu_n_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_n_residue": { - "name": "b_lu_n_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_p_harvestable": { - "name": "b_lu_p_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_p_residue": { - "name": "b_lu_p_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_k_harvestable": { - "name": "b_lu_k_harvestable", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_lu_k_residue": { - "name": "b_lu_k_residue", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_harvestable_analyses_idx": { - "name": "b_id_harvestable_analyses_idx", - "columns": [ - { - "expression": "b_id_harvestable_analysis", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestable_sampling": { - "name": "harvestable_sampling", - "schema": "fdm", - "columns": { - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_harvestable_analysis": { - "name": "b_id_harvestable_analysis", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_sampling_date": { - "name": "b_sampling_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { - "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", - "tableFrom": "harvestable_sampling", - "tableTo": "harvestables", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable" - ], - "columnsTo": [ - "b_id_harvestable" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { - "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", - "tableFrom": "harvestable_sampling", - "tableTo": "harvestable_analyses", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_harvestable_analysis" - ], - "columnsTo": [ - "b_id_harvestable_analysis" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.harvestables": { - "name": "harvestables", - "schema": "fdm", - "columns": { - "b_id_harvestable": { - "name": "b_id_harvestable", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "b_id_harvestable_idx": { - "name": "b_id_harvestable_idx", - "columns": [ - { - "expression": "b_id_harvestable", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.intending_grazing": { - "name": "intending_grazing", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_grazing_intention": { - "name": "b_grazing_intention", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "b_grazing_intention_year": { - "name": "b_grazing_intention_year", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "intending_grazing_b_id_farm_farms_b_id_farm_fk": { - "name": "intending_grazing_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "intending_grazing", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "intending_grazing_b_id_farm_b_grazing_intention_year_pk": { - "name": "intending_grazing_b_id_farm_b_grazing_intention_year_pk", - "columns": [ - "b_id_farm", - "b_grazing_intention_year" - ] - } - }, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.organic_certifications": { - "name": "organic_certifications", - "schema": "fdm", - "columns": { - "b_id_organic": { - "name": "b_id_organic", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_organic_traces": { - "name": "b_organic_traces", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_organic_skal": { - "name": "b_organic_skal", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "b_organic_issued": { - "name": "b_organic_issued", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_organic_expires": { - "name": "b_organic_expires", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.organic_certifications_holding": { - "name": "organic_certifications_holding", - "schema": "fdm", - "columns": { - "b_id_farm": { - "name": "b_id_farm", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "b_id_organic": { - "name": "b_id_organic", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk": { - "name": "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk", - "tableFrom": "organic_certifications_holding", - "tableTo": "farms", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_farm" - ], - "columnsTo": [ - "b_id_farm" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk": { - "name": "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk", - "tableFrom": "organic_certifications_holding", - "tableTo": "organic_certifications", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id_organic" - ], - "columnsTo": [ - "b_id_organic" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.soil_analysis": { - "name": "soil_analysis", - "schema": "fdm", - "columns": { - "a_id": { - "name": "a_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "a_date": { - "name": "a_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "a_source": { - "name": "a_source", - "type": "a_source", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false, - "default": "'other'" - }, - "a_al_ox": { - "name": "a_al_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_c_of": { - "name": "a_c_of", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ca_co": { - "name": "a_ca_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ca_co_po": { - "name": "a_ca_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_caco3_if": { - "name": "a_caco3_if", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cec_co": { - "name": "a_cec_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_clay_mi": { - "name": "a_clay_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cn_fr": { - "name": "a_cn_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_com_fr": { - "name": "a_com_fr", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_cu_cc": { - "name": "a_cu_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_density_sa": { - "name": "a_density_sa", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_fe_ox": { - "name": "a_fe_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_cc": { - "name": "a_k_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_co": { - "name": "a_k_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_k_co_po": { - "name": "a_k_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_cc": { - "name": "a_mg_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_co": { - "name": "a_mg_co", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_mg_co_po": { - "name": "a_mg_co_po", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_n_pmn": { - "name": "a_n_pmn", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_n_rt": { - "name": "a_n_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_nh4_cc": { - "name": "a_nh4_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_nmin_cc": { - "name": "a_nmin_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_no3_cc": { - "name": "a_no3_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_al": { - "name": "a_p_al", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_cc": { - "name": "a_p_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_ox": { - "name": "a_p_ox", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_rt": { - "name": "a_p_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_sg": { - "name": "a_p_sg", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_p_wa": { - "name": "a_p_wa", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_ph_cc": { - "name": "a_ph_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_s_rt": { - "name": "a_s_rt", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_sand_mi": { - "name": "a_sand_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_silt_mi": { - "name": "a_silt_mi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_som_loi": { - "name": "a_som_loi", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "a_zn_cc": { - "name": "a_zn_cc", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_gwl_class": { - "name": "b_gwl_class", - "type": "b_gwl_class", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "b_soiltype_agr": { - "name": "b_soiltype_agr", - "type": "b_soiltype_agr", - "typeSchema": "fdm", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm.soil_sampling": { - "name": "soil_sampling", - "schema": "fdm", - "columns": { - "b_id_sampling": { - "name": "b_id_sampling", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "b_id": { - "name": "b_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "a_id": { - "name": "a_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "a_depth_upper": { - "name": "a_depth_upper", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "a_depth_lower": { - "name": "a_depth_lower", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "b_sampling_date": { - "name": "b_sampling_date", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - }, - "b_sampling_geometry": { - "name": "b_sampling_geometry", - "type": "geometry(MultiPoint,4326)", - "primaryKey": false, - "notNull": false - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated": { - "name": "updated", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "soil_sampling_b_id_fields_b_id_fk": { - "name": "soil_sampling_b_id_fields_b_id_fk", - "tableFrom": "soil_sampling", - "tableTo": "fields", - "schemaTo": "fdm", - "columnsFrom": [ - "b_id" - ], - "columnsTo": [ - "b_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "soil_sampling_a_id_soil_analysis_a_id_fk": { - "name": "soil_sampling_a_id_soil_analysis_a_id_fk", - "tableFrom": "soil_sampling", - "tableTo": "soil_analysis", - "schemaTo": "fdm", - "columnsFrom": [ - "a_id" - ], - "columnsTo": [ - "a_id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.account": { - "name": "account", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "account_id": { - "name": "account_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "access_token_expires_at": { - "name": "access_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "refresh_token_expires_at": { - "name": "refresh_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "scope": { - "name": "scope", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "account_user_id_user_id_fk": { - "name": "account_user_id_user_id_fk", - "tableFrom": "account", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.invitation": { - "name": "invitation", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "organization_id": { - "name": "organization_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "inviter_id": { - "name": "inviter_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "invitation_organization_id_organization_id_fk": { - "name": "invitation_organization_id_organization_id_fk", - "tableFrom": "invitation", - "tableTo": "organization", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "organization_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "invitation_inviter_id_user_id_fk": { - "name": "invitation_inviter_id_user_id_fk", - "tableFrom": "invitation", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "inviter_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.member": { - "name": "member", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "organization_id": { - "name": "organization_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "member_organization_id_organization_id_fk": { - "name": "member_organization_id_organization_id_fk", - "tableFrom": "member", - "tableTo": "organization", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "organization_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "member_user_id_user_id_fk": { - "name": "member_user_id_user_id_fk", - "tableFrom": "member", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.organization": { - "name": "organization", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "logo": { - "name": "logo", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "metadata": { - "name": "metadata", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "organization_slug_unique": { - "name": "organization_slug_unique", - "nullsNotDistinct": false, - "columns": [ - "slug" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.rate_limit": { - "name": "rate_limit", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "key": { - "name": "key", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "count": { - "name": "count", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "last_request": { - "name": "last_request", - "type": "bigint", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.session": { - "name": "session", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "active_organization_id": { - "name": "active_organization_id", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "schemaTo": "fdm-authn", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "session_token_unique": { - "name": "session_token_unique", - "nullsNotDistinct": false, - "columns": [ - "token" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.user": { - "name": "user", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email_verified": { - "name": "email_verified", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "image": { - "name": "image", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "display_username": { - "name": "display_username", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "firstname": { - "name": "firstname", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "surname": { - "name": "surname", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "lang": { - "name": "lang", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "farm_active": { - "name": "farm_active", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_email_unique": { - "name": "user_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - }, - "user_username_unique": { - "name": "user_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authn.verification": { - "name": "verification", - "schema": "fdm-authn", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "identifier": { - "name": "identifier", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authz.audit": { - "name": "audit", - "schema": "fdm-authz", - "columns": { - "audit_id": { - "name": "audit_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "audit_timestamp": { - "name": "audit_timestamp", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "audit_origin": { - "name": "audit_origin", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "principal_id": { - "name": "principal_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "target_resource": { - "name": "target_resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "target_resource_id": { - "name": "target_resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "granting_resource": { - "name": "granting_resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "granting_resource_id": { - "name": "granting_resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "action": { - "name": "action", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "allowed": { - "name": "allowed", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "duration": { - "name": "duration", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "fdm-authz.role": { - "name": "role", - "schema": "fdm-authz", - "columns": { - "role_id": { - "name": "role_id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "resource": { - "name": "resource", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "principal_id": { - "name": "principal_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "role": { - "name": "role", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created": { - "name": "created", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted": { - "name": "deleted", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "role_idx": { - "name": "role_idx", - "columns": [ - { - "expression": "resource", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "resource_id", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "principal_id", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "role", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "deleted", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": false, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - } - }, - "enums": { - "fdm.b_acquiring_method": { - "name": "b_acquiring_method", - "schema": "fdm", - "values": [ - "nl_01", - "nl_02", - "nl_03", - "nl_04", - "nl_07", - "nl_09", - "nl_10", - "nl_11", - "nl_12", - "nl_13", - "nl_61", - "nl_63", - "unknown" - ] - }, - "fdm.p_app_method": { - "name": "p_app_method", - "schema": "fdm", - "values": [ - "slotted coulter", - "incorporation", - "incorporation 2 tracks", - "injection", - "shallow injection", - "spraying", - "broadcasting", - "spoke wheel", - "pocket placement", - "narrowband" - ] - }, - "fdm.b_gwl_class": { - "name": "b_gwl_class", - "schema": "fdm", - "values": [ - "I", - "Ia", - "Ic", - "II", - "IIa", - "IIb", - "IIc", - "III", - "IIIa", - "IIIb", - "IV", - "IVu", - "IVc", - "V", - "Va", - "Vao", - "Vad", - "Vb", - "Vbo", - "Vbd", - "sV", - "sVb", - "VI", - "VIo", - "VId", - "VII", - "VIIo", - "VIId", - "VIII", - "VIIIo", - "VIIId" - ] - }, - "fdm.b_lu_harvestable": { - "name": "b_lu_harvestable", - "schema": "fdm", - "values": [ - "none", - "once", - "multiple" - ] - }, - "fdm.b_lu_croprotation": { - "name": "b_lu_croprotation", - "schema": "fdm", - "values": [ - "other", - "clover", - "nature", - "potato", - "grass", - "rapeseed", - "starch", - "maize", - "cereal", - "sugarbeet", - "alfalfa", - "catchcrop" - ] - }, - "fdm.a_source": { - "name": "a_source", - "schema": "fdm", - "values": [ - "nl-rva-l122", - "nl-rva-l136", - "nl-rva-l264", - "nl-rva-l320", - "nl-rva-l335", - "nl-rva-l610", - "nl-rva-l648", - "nl-rva-l697", - "nl-other-nmi", - "other" - ] - }, - "fdm.b_soiltype_agr": { - "name": "b_soiltype_agr", - "schema": "fdm", - "values": [ - "moerige_klei", - "rivierklei", - "dekzand", - "zeeklei", - "dalgrond", - "veen", - "loess", - "duinzand", - "maasklei" - ] - }, - "fdm.p_type_rvo": { - "name": "p_type_rvo", - "schema": "fdm", - "values": [ - "10", - "11", - "12", - "13", - "14", - "17", - "18", - "19", - "23", - "30", - "31", - "32", - "33", - "35", - "39", - "40", - "41", - "42", - "43", - "46", - "50", - "56", - "60", - "61", - "75", - "76", - "80", - "81", - "90", - "91", - "92", - "25", - "26", - "27", - "95", - "96", - "97", - "98", - "99", - "100", - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - "110", - "111", - "112", - "113", - "114", - "115", - "116", - "117", - "120" - ] - } - }, - "schemas": { - "fdm": "fdm", - "fdm-authn": "fdm-authn", - "fdm-authz": "fdm-authz" - }, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index eaf890b40..4ab6e6e09 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -1,118 +1,111 @@ { - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1731414293847, - "tag": "0000_v0", - "breakpoints": true - }, - { - "idx": 1, - "version": "7", - "when": 1741267610502, - "tag": "0001_v0-15-0", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1743420907290, - "tag": "0002_v0-18-0", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1744205441260, - "tag": "0003_v0-20-0-1", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1745410821339, - "tag": "0004_v0-20-0-2", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1748353081475, - "tag": "0005_v0-20-0-3", - "breakpoints": true - }, - { - "idx": 6, - "version": "7", - "when": 1748353926519, - "tag": "0006_v0-20-0-4", - "breakpoints": true - }, - { - "idx": 7, - "version": "7", - "when": 1750146397071, - "tag": "0007_v0-21-0-1", - "breakpoints": true - }, - { - "idx": 8, - "version": "7", - "when": 1750751079210, - "tag": "0008_v0-21-0-2", - "breakpoints": true - }, - { - "idx": 9, - "version": "7", - "when": 1752056714510, - "tag": "0009_v0-22-0-1", - "breakpoints": true - }, - { - "idx": 10, - "version": "7", - "when": 1753084974762, - "tag": "0010_v0-22-0-2", - "breakpoints": true - }, - { - "idx": 11, - "version": "7", - "when": 1754396961710, - "tag": "0011_v0-22-1-1", - "breakpoints": true - }, - { - "idx": 12, - "version": "7", - "when": 1754661913554, - "tag": "0012_v0-24-0-1", - "breakpoints": true - }, - { - "idx": 13, - "version": "7", - "when": 1755074095394, - "tag": "0013_v0-24-0-2", - "breakpoints": true - }, - { - "idx": 14, - "version": "7", - "when": 1760450273146, - "tag": "0014_smart_malice", - "breakpoints": true - }, - { - "idx": 15, - "version": "7", - "when": 1760528792955, - "tag": "0015_new_stick", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731414293847, + "tag": "0000_v0", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1741267610502, + "tag": "0001_v0-15-0", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1743420907290, + "tag": "0002_v0-18-0", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1744205441260, + "tag": "0003_v0-20-0-1", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1745410821339, + "tag": "0004_v0-20-0-2", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1748353081475, + "tag": "0005_v0-20-0-3", + "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1748353926519, + "tag": "0006_v0-20-0-4", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1750146397071, + "tag": "0007_v0-21-0-1", + "breakpoints": true + }, + { + "idx": 8, + "version": "7", + "when": 1750751079210, + "tag": "0008_v0-21-0-2", + "breakpoints": true + }, + { + "idx": 9, + "version": "7", + "when": 1752056714510, + "tag": "0009_v0-22-0-1", + "breakpoints": true + }, + { + "idx": 10, + "version": "7", + "when": 1753084974762, + "tag": "0010_v0-22-0-2", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1754396961710, + "tag": "0011_v0-22-1-1", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1754661913554, + "tag": "0012_v0-24-0-1", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1755074095394, + "tag": "0013_v0-24-0-2", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1760450273146, + "tag": "0014_smart_malice", + "breakpoints": true + } + ] +} From 6ad6146b84aaf09d461b805741b93918757e3d01 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:40:00 +0200 Subject: [PATCH 069/243] chore: create db migration --- .../migrations/0016_burly_lenny_balinger.sql | 31 + .../src/db/migrations/meta/0016_snapshot.json | 3397 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 9 +- 3 files changed, 3436 insertions(+), 1 deletion(-) create mode 100644 fdm-core/src/db/migrations/0016_burly_lenny_balinger.sql create mode 100644 fdm-core/src/db/migrations/meta/0016_snapshot.json diff --git a/fdm-core/src/db/migrations/0016_burly_lenny_balinger.sql b/fdm-core/src/db/migrations/0016_burly_lenny_balinger.sql new file mode 100644 index 000000000..f9cafee14 --- /dev/null +++ b/fdm-core/src/db/migrations/0016_burly_lenny_balinger.sql @@ -0,0 +1,31 @@ +CREATE TYPE "fdm"."p_type_rvo" AS ENUM('10', '11', '12', '13', '14', '17', '18', '19', '23', '30', '31', '32', '33', '35', '39', '40', '41', '42', '43', '46', '50', '56', '60', '61', '75', '76', '80', '81', '90', '91', '92', '25', '26', '27', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '120');--> statement-breakpoint +CREATE TABLE "fdm"."intending_grazing" ( + "b_id_farm" text NOT NULL, + "b_grazing_intention" boolean, + "b_grazing_intention_year" integer NOT NULL, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone, + CONSTRAINT "intending_grazing_b_id_farm_b_grazing_intention_year_pk" PRIMARY KEY("b_id_farm","b_grazing_intention_year") +); +--> statement-breakpoint +CREATE TABLE "fdm"."organic_certifications" ( + "b_id_organic" text PRIMARY KEY NOT NULL, + "b_organic_traces" text, + "b_organic_skal" text, + "b_organic_issued" timestamp with time zone, + "b_organic_expires" timestamp with time zone, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone +); +--> statement-breakpoint +CREATE TABLE "fdm"."organic_certifications_holding" ( + "b_id_farm" text NOT NULL, + "b_id_organic" text NOT NULL, + "created" timestamp with time zone DEFAULT now() NOT NULL, + "updated" timestamp with time zone +); +--> statement-breakpoint +ALTER TABLE "fdm"."fertilizers_catalogue" ADD COLUMN "p_type_rvo" "fdm"."p_type_rvo";--> statement-breakpoint +ALTER TABLE "fdm"."intending_grazing" ADD CONSTRAINT "intending_grazing_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk" FOREIGN KEY ("b_id_farm") REFERENCES "fdm"."farms"("b_id_farm") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "fdm"."organic_certifications_holding" ADD CONSTRAINT "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk" FOREIGN KEY ("b_id_organic") REFERENCES "fdm"."organic_certifications"("b_id_organic") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/0016_snapshot.json b/fdm-core/src/db/migrations/meta/0016_snapshot.json new file mode 100644 index 000000000..e8dc2530f --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0016_snapshot.json @@ -0,0 +1,3397 @@ +{ + "id": "11582248-020a-482b-94e7-4cad07114e8c", + "prevId": "60e262a4-309d-4384-ae3d-130a6e208f05", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "b_lu_start_default": { + "name": "b_lu_start_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_date_harvest_default": { + "name": "b_date_harvest_default", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "b_lu_start_default_format": { + "name": "b_lu_start_default_format", + "value": "b_lu_start_default IS NULL OR b_lu_start_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + }, + "b_date_harvest_default_format": { + "name": "b_date_harvest_default_format", + "value": "b_date_harvest_default IS NULL OR b_date_harvest_default ~ '^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'" + } + }, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_rvo": { + "name": "p_type_rvo", + "type": "p_type_rvo", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.intending_grazing": { + "name": "intending_grazing", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_grazing_intention": { + "name": "b_grazing_intention", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_grazing_intention_year": { + "name": "b_grazing_intention_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "intending_grazing_b_id_farm_farms_b_id_farm_fk": { + "name": "intending_grazing_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "intending_grazing", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "intending_grazing_b_id_farm_b_grazing_intention_year_pk": { + "name": "intending_grazing_b_id_farm_b_grazing_intention_year_pk", + "columns": [ + "b_id_farm", + "b_grazing_intention_year" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.organic_certifications": { + "name": "organic_certifications", + "schema": "fdm", + "columns": { + "b_id_organic": { + "name": "b_id_organic", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_organic_traces": { + "name": "b_organic_traces", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_organic_skal": { + "name": "b_organic_skal", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_organic_issued": { + "name": "b_organic_issued", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_organic_expires": { + "name": "b_organic_expires", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.organic_certifications_holding": { + "name": "organic_certifications_holding", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_organic": { + "name": "b_id_organic", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk": { + "name": "organic_certifications_holding_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "organic_certifications_holding", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk": { + "name": "organic_certifications_holding_b_id_organic_organic_certifications_b_id_organic_fk", + "tableFrom": "organic_certifications_holding", + "tableTo": "organic_certifications", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_organic" + ], + "columnsTo": [ + "b_id_organic" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.b_acquiring_method": { + "name": "b_acquiring_method", + "schema": "fdm", + "values": [ + "nl_01", + "nl_02", + "nl_03", + "nl_04", + "nl_07", + "nl_09", + "nl_10", + "nl_11", + "nl_12", + "nl_13", + "nl_61", + "nl_63", + "unknown" + ] + }, + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + }, + "fdm.p_type_rvo": { + "name": "p_type_rvo", + "schema": "fdm", + "values": [ + "10", + "11", + "12", + "13", + "14", + "17", + "18", + "19", + "23", + "30", + "31", + "32", + "33", + "35", + "39", + "40", + "41", + "42", + "43", + "46", + "50", + "56", + "60", + "61", + "75", + "76", + "80", + "81", + "90", + "91", + "92", + "25", + "26", + "27", + "95", + "96", + "97", + "98", + "99", + "100", + "101", + "102", + "103", + "104", + "105", + "106", + "107", + "108", + "109", + "110", + "111", + "112", + "113", + "114", + "115", + "116", + "117", + "120" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index c2f0fed8b..203d26de3 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -113,6 +113,13 @@ "when": 1760621691069, "tag": "0015_flippant_spyke", "breakpoints": true + }, + { + "idx": 16, + "version": "7", + "when": 1760711980118, + "tag": "0016_burly_lenny_balinger", + "breakpoints": true } ] -} +} \ No newline at end of file From e7553bbd22cc14ec66c1d23f20df399af33cf95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Fri, 17 Oct 2025 16:58:51 +0200 Subject: [PATCH 070/243] Add calculation caching functionality to fdm-core --- fdm-core/drizzle.config.ts | 1 + fdm-core/package.json | 2 + fdm-core/src/calculator.test.ts | 153 + fdm-core/src/calculator.ts | 136 + .../db/migrations/0015_far_blue_shield.sql | 20 + .../src/db/migrations/meta/0015_snapshot.json | 3222 +++++++++++++++++ fdm-core/src/db/migrations/meta/_journal.json | 7 + fdm-core/src/db/schema-calculator.ts | 47 + fdm-core/src/db/schema.ts | 5 +- fdm-core/src/index.ts | 6 + pnpm-lock.yaml | 17 + 11 files changed, 3615 insertions(+), 1 deletion(-) create mode 100644 fdm-core/src/calculator.test.ts create mode 100644 fdm-core/src/calculator.ts create mode 100644 fdm-core/src/db/migrations/0015_far_blue_shield.sql create mode 100644 fdm-core/src/db/migrations/meta/0015_snapshot.json create mode 100644 fdm-core/src/db/schema-calculator.ts diff --git a/fdm-core/drizzle.config.ts b/fdm-core/drizzle.config.ts index 34142997b..8b0e491fd 100644 --- a/fdm-core/drizzle.config.ts +++ b/fdm-core/drizzle.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ "./src/db/schema.ts", "./src/db/schema-authn.ts", "./src/db/schema-authz.ts", + "./src/db/schema-calculator.ts", ], out: "./src/db/migrations", migrations: { diff --git a/fdm-core/package.json b/fdm-core/package.json index fc3fe5085..f548cfc6d 100644 --- a/fdm-core/package.json +++ b/fdm-core/package.json @@ -52,6 +52,7 @@ "@rollup/plugin-typescript": "catalog:", "@svenvw/fdm-data": "workspace:^0.17.1", "@types/node": "^24.7.2", + "@types/object-hash": "^3.0.6", "@vitest/coverage-v8": "catalog:", "drizzle-kit": "catalog:", "fs-extra": "^11.3.2", @@ -70,6 +71,7 @@ "better-auth": "catalog:", "drizzle-orm": "catalog:", "nanoid": "^5.1.6", + "object-hash": "^3.0.0", "postgres": "^3.4.7", "unique-username-generator": "^1.5.1" }, diff --git a/fdm-core/src/calculator.test.ts b/fdm-core/src/calculator.test.ts new file mode 100644 index 000000000..9612a548a --- /dev/null +++ b/fdm-core/src/calculator.test.ts @@ -0,0 +1,153 @@ +import { and, eq } from "drizzle-orm" +import type { drizzle } from "drizzle-orm/postgres-js" +import { beforeEach, describe, expect, inject, it } from "vitest" +import { + getCalculationInputHash, + setCachedCalculation, + withCalculationCache, +} from "./calculator" +import { calculationCache, calculationErrors } from "./db/schema-calculator" +import { createFdmServer, type FdmServerType } from "./fdm-server" + +describe("withCalculationCache", () => { + let fdm: FdmServerType + + beforeEach(async () => { + const host = inject("host") + const port = inject("port") + const user = inject("user") + const password = inject("password") + const database = inject("database") + fdm = createFdmServer(host, port, user, password, database) + }) + + it("should calculate if no cached result is present", async () => { + async function calculate() { + return "correct result" + } + + const getCalculation = withCalculationCache( + "calculation-1", + "1.0.0", + calculate, + ) + + await setCachedCalculation( + fdm, + "calculation-1", + "1.0.0", + { a: "other value" }, + "wrong result", + ) + + await expect(getCalculation(fdm, { a: "my value" })).resolves.toBe( + "correct result", + ) + }) + + it("should record errors", async () => { + async function calculate() { + throw new Error("error occurred") + } + + const getCalculation = withCalculationCache( + "test-throwing-calculation", + "1.0.0", + calculate, + ) + + // Delete leftovers from previous run + await fdm + .delete(calculationCache) + .where( + eq( + calculationCache.calculation_type, + "test-throwing-calculation", + ), + ) + await fdm + .delete(calculationErrors) + .where( + eq( + calculationErrors.calculation_type, + "test-throwing-calculation", + ), + ) + + await expect(getCalculation(fdm, {})).rejects.toThrow("error occurred") + + expect( + fdm + .select() + .from(calculationCache) + .where( + eq( + calculationCache.calculation_type, + "test-throwing-calculation", + ), + ), + ).resolves.toHaveLength(0) + + expect( + fdm + .select() + .from(calculationErrors) + .where( + and( + eq( + calculationErrors.calculation_type, + "test-throwing-calculation", + ), + eq(calculationErrors.error_message, "error occurred"), + ), + ), + ).resolves.toHaveLength(1) + }) + + it("should not calculate cached result is present for the same input", async () => { + // Delete leftovers from previous run + await fdm + .delete(calculationCache) + .where( + eq( + calculationCache.calculation_type, + "test-calculation-cached", + ), + ) + + async function calculate() { + throw new Error("Calculation shouldn't be redone.") + } + + const getCalculation = withCalculationCache( + "test-calculation-cached", + "1.0.0", + calculate, + ) + + await setCachedCalculation( + fdm, + "test-calculation-cached", + "1.0.0", + { a: "same value" }, + "correct result", + ) + + expect(getCalculation(fdm, { a: "same value" })).resolves.toBe( + "correct result", + ) + + // There shouldn't be a duplicate cached result + expect( + fdm + .select() + .from(calculationCache) + .where( + eq( + calculationCache.input_hash, + getCalculationInputHash("1.0.0", { a: "same value" }), + ), + ), + ).resolves.toHaveLength(1) + }) +}) diff --git a/fdm-core/src/calculator.ts b/fdm-core/src/calculator.ts new file mode 100644 index 000000000..37b7eba5f --- /dev/null +++ b/fdm-core/src/calculator.ts @@ -0,0 +1,136 @@ +import { and, eq } from "drizzle-orm" +import hash from "object-hash" +import { + calculationCache as calculationCacheTable, + calculationErrors as calculationErrorsTable, +} from "./db/schema-calculator" +import type { FdmType } from "./fdm" + +export function getCalculationInputHash( + calculator_version: string, + inputs: T_Input, +) { + return hash([calculator_version, inputs]) +} + +/** + * Get the cached calculation + * + * @param fdm fdm instance + * @param calculation_type key to use to indentify the type of calculation + * @param input_hash + * @returns + */ +export async function getCachedCalculation( + fdm: FdmType, + calculation_type: string, + calculator_version: string, + inputs: T_Input, +): Promise { + const result = await fdm + .select({ + calculation_type: calculationCacheTable.calculation_type, + calculator_version: calculationCacheTable.calculator_version, + result: calculationCacheTable.result, + created_at: calculationCacheTable.created_at, + }) + .from(calculationCacheTable) + .where( + and( + eq(calculationCacheTable.calculation_type, calculation_type), + eq( + calculationCacheTable.input_hash, + getCalculationInputHash(calculator_version, inputs), + ), + ), + ) + return result?.length ? (result[0].result as T_Output) : null +} + +export async function setCachedCalculation( + fdm: FdmType, + calculation_type: string, + calculator_version: string, + inputs: T_Input, + result: T_Output, +) { + await fdm.insert(calculationCacheTable).values({ + calculation_type: calculation_type, + calculator_version: calculator_version, + inputs: inputs, + input_hash: getCalculationInputHash(calculator_version, inputs), + result: result, + }) +} + +export async function setCalculationError( + fdm: FdmType, + calculation_type: string, + calculator_version: string, + inputs: T_Input, + error_message: string, + stack_trace: string | undefined, +) { + return fdm.insert(calculationErrorsTable).values({ + calculation_type: calculation_type, + calculator_version: calculator_version, + inputs: inputs, + error_message: error_message, + stack_trace: stack_trace ?? null, + }) +} + +/** + * Decorator that can add cache functionality to a calculation function + * + * Make sure to provide calculation_type same as the name of `calculationFunction` if possible + * + * @param calculation_type key to use to indentify the type of calculation + * @param calculator_version key tied to the version of the current calculation function + * @param calculationFunction function to compute in case there is no cached result + * @returns a new function that takes an fdm instance and inputs and tries to retrieve results from cache when available + */ +export function withCalculationCache( + calculation_type: string, + calculator_version: string, + calculationFunction: (inputs: T_Input) => T_Output | Promise, +) { + return async (fdm: FdmType, inputs: T_Input) => { + // Database entries are tagged with the calculationFunction version + // therefore one can be sure that the stored type matches T_Output + const cachedResult: T_Output | null = await getCachedCalculation( + fdm, + calculation_type, + calculator_version, + inputs, + ) + + if (cachedResult) { + return cachedResult + } + + try { + const result = await calculationFunction(inputs) + await setCachedCalculation( + fdm, + calculation_type, + calculator_version, + inputs, + result, + ) + + return result + } catch (e: any) { + await setCalculationError( + fdm, + calculation_type, + calculator_version, + inputs, + e.message, + e.stack, + ) + + throw e + } + } +} diff --git a/fdm-core/src/db/migrations/0015_far_blue_shield.sql b/fdm-core/src/db/migrations/0015_far_blue_shield.sql new file mode 100644 index 000000000..afadf1941 --- /dev/null +++ b/fdm-core/src/db/migrations/0015_far_blue_shield.sql @@ -0,0 +1,20 @@ +CREATE SCHEMA "fdm-calculator"; +--> statement-breakpoint +CREATE TABLE "fdm-calculator"."calculation_cache" ( + "calculation_type" text NOT NULL, + "input_hash" text NOT NULL, + "calculator_version" text, + "inputs" json, + "result" json, + "created_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "fdm-calculator"."calculation_errors" ( + "id" serial PRIMARY KEY NOT NULL, + "calculation_type" text, + "calculator_version" text, + "inputs" json, + "error_message" text, + "stack_trace" text, + "created_at" timestamp with time zone DEFAULT now() NOT NULL +); diff --git a/fdm-core/src/db/migrations/meta/0015_snapshot.json b/fdm-core/src/db/migrations/meta/0015_snapshot.json new file mode 100644 index 000000000..a6116c9a9 --- /dev/null +++ b/fdm-core/src/db/migrations/meta/0015_snapshot.json @@ -0,0 +1,3222 @@ +{ + "id": "07574cff-3871-45d6-97d9-1d3f42f4ac20", + "prevId": "45dcb87d-89c8-4cf7-a504-0db74ba68640", + "version": "7", + "dialect": "postgresql", + "tables": { + "fdm.cultivation_catalogue_selecting": { + "name": "cultivation_catalogue_selecting", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk": { + "name": "cultivation_catalogue_selecting_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "cultivation_catalogue_selecting", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_ending": { + "name": "cultivation_ending", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_end": { + "name": "b_lu_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "m_cropresidue": { + "name": "m_cropresidue", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_ending_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_ending_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_ending", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_harvesting": { + "name": "cultivation_harvesting", + "schema": "fdm", + "columns": { + "b_id_harvesting": { + "name": "b_id_harvesting", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_harvest_date": { + "name": "b_lu_harvest_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "cultivation_harvesting_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_harvesting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_harvesting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_harvesting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivation_starting": { + "name": "cultivation_starting", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_start": { + "name": "b_lu_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sowing_amount": { + "name": "b_sowing_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sowing_method": { + "name": "b_sowing_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "cultivation_starting_b_id_fields_b_id_fk": { + "name": "cultivation_starting_b_id_fields_b_id_fk", + "tableFrom": "cultivation_starting", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cultivation_starting_b_lu_cultivations_b_lu_fk": { + "name": "cultivation_starting_b_lu_cultivations_b_lu_fk", + "tableFrom": "cultivation_starting", + "tableTo": "cultivations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu" + ], + "columnsTo": [ + "b_lu" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations": { + "name": "cultivations", + "schema": "fdm", + "columns": { + "b_lu": { + "name": "b_lu", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_variety": { + "name": "b_lu_variety", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_idx": { + "name": "b_lu_idx", + "columns": [ + { + "expression": "b_lu", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk": { + "name": "cultivations_b_lu_catalogue_cultivations_catalogue_b_lu_catalogue_fk", + "tableFrom": "cultivations", + "tableTo": "cultivations_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "b_lu_catalogue" + ], + "columnsTo": [ + "b_lu_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.cultivations_catalogue": { + "name": "cultivations_catalogue", + "schema": "fdm", + "columns": { + "b_lu_catalogue": { + "name": "b_lu_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_source": { + "name": "b_lu_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name": { + "name": "b_lu_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_lu_name_en": { + "name": "b_lu_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_harvestable": { + "name": "b_lu_harvestable", + "type": "b_lu_harvestable", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true + }, + "b_lu_hcat3": { + "name": "b_lu_hcat3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_hcat3_name": { + "name": "b_lu_hcat3_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_lu_croprotation": { + "name": "b_lu_croprotation", + "type": "b_lu_croprotation", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_hi": { + "name": "b_lu_hi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_n_fixation": { + "name": "b_n_fixation", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_rest_oravib": { + "name": "b_lu_rest_oravib", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "b_lu_variety_options": { + "name": "b_lu_variety_options", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_lu_catalogue_idx": { + "name": "b_lu_catalogue_idx", + "columns": [ + { + "expression": "b_lu_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogation_applying": { + "name": "derogation_applying", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "derogation_applying_b_id_farm_farms_b_id_farm_fk": { + "name": "derogation_applying_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "derogation_applying", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk": { + "name": "derogation_applying_b_id_derogation_derogations_b_id_derogation_fk", + "tableFrom": "derogation_applying", + "tableTo": "derogations", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_derogation" + ], + "columnsTo": [ + "b_id_derogation" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.derogations": { + "name": "derogations", + "schema": "fdm", + "columns": { + "b_id_derogation": { + "name": "b_id_derogation", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_derogation_year": { + "name": "b_derogation_year", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.farms": { + "name": "farms", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name_farm": { + "name": "b_name_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_businessid_farm": { + "name": "b_businessid_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_address_farm": { + "name": "b_address_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "b_postalcode_farm": { + "name": "b_postalcode_farm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_farm_idx": { + "name": "b_id_farm_idx", + "columns": [ + { + "expression": "b_id_farm", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_acquiring": { + "name": "fertilizer_acquiring", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_acquiring_amount": { + "name": "p_acquiring_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_acquiring_date": { + "name": "p_acquiring_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_acquiring_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_acquiring_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_acquiring", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_applying": { + "name": "fertilizer_applying", + "schema": "fdm", + "columns": { + "p_app_id": { + "name": "p_app_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_app_amount": { + "name": "p_app_amount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_app_method": { + "name": "p_app_method", + "type": "p_app_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_app_date": { + "name": "p_app_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_app_idx": { + "name": "p_app_idx", + "columns": [ + { + "expression": "p_app_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fertilizer_applying_b_id_fields_b_id_fk": { + "name": "fertilizer_applying_b_id_fields_b_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_applying_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_applying_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_applying", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_catalogue_enabling": { + "name": "fertilizer_catalogue_enabling", + "schema": "fdm", + "columns": { + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk": { + "name": "fertilizer_catalogue_enabling_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "fertilizer_catalogue_enabling", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizer_picking": { + "name": "fertilizer_picking", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_picking_date": { + "name": "p_picking_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "fertilizer_picking_p_id_fertilizers_p_id_fk": { + "name": "fertilizer_picking_p_id_fertilizers_p_id_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id" + ], + "columnsTo": [ + "p_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk": { + "name": "fertilizer_picking_p_id_catalogue_fertilizers_catalogue_p_id_catalogue_fk", + "tableFrom": "fertilizer_picking", + "tableTo": "fertilizers_catalogue", + "schemaTo": "fdm", + "columnsFrom": [ + "p_id_catalogue" + ], + "columnsTo": [ + "p_id_catalogue" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers": { + "name": "fertilizers", + "schema": "fdm", + "columns": { + "p_id": { + "name": "p_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_idx": { + "name": "p_id_idx", + "columns": [ + { + "expression": "p_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fertilizers_catalogue": { + "name": "fertilizers_catalogue", + "schema": "fdm", + "columns": { + "p_id_catalogue": { + "name": "p_id_catalogue", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "p_source": { + "name": "p_source", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_nl": { + "name": "p_name_nl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "p_name_en": { + "name": "p_name_en", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_description": { + "name": "p_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "p_app_method_options": { + "name": "p_app_method_options", + "type": "p_app_method[]", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "p_dm": { + "name": "p_dm", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_density": { + "name": "p_density", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_om": { + "name": "p_om", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_a": { + "name": "p_a", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hc": { + "name": "p_hc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eom": { + "name": "p_eom", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_eoc": { + "name": "p_eoc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_rt": { + "name": "p_c_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_of": { + "name": "p_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_if": { + "name": "p_c_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_c_fr": { + "name": "p_c_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cn_of": { + "name": "p_cn_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_rt": { + "name": "p_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_if": { + "name": "p_n_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_of": { + "name": "p_n_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_n_wc": { + "name": "p_n_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_no3_rt": { + "name": "p_no3_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_nh4_rt": { + "name": "p_nh4_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_p_rt": { + "name": "p_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_k_rt": { + "name": "p_k_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mg_rt": { + "name": "p_mg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ca_rt": { + "name": "p_ca_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ne": { + "name": "p_ne", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_rt": { + "name": "p_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_s_wc": { + "name": "p_s_wc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cu_rt": { + "name": "p_cu_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_zn_rt": { + "name": "p_zn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_na_rt": { + "name": "p_na_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_si_rt": { + "name": "p_si_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_b_rt": { + "name": "p_b_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mn_rt": { + "name": "p_mn_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ni_rt": { + "name": "p_ni_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_fe_rt": { + "name": "p_fe_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_mo_rt": { + "name": "p_mo_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_co_rt": { + "name": "p_co_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_as_rt": { + "name": "p_as_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cd_rt": { + "name": "p_cd_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_rt": { + "name": "p_cr_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cr_vi": { + "name": "p_cr_vi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_pb_rt": { + "name": "p_pb_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_hg_rt": { + "name": "p_hg_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_cl_rt": { + "name": "p_cl_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_ef_nh3": { + "name": "p_ef_nh3", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "p_type_manure": { + "name": "p_type_manure", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_mineral": { + "name": "p_type_mineral", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "p_type_compost": { + "name": "p_type_compost", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "p_id_catalogue_idx": { + "name": "p_id_catalogue_idx", + "columns": [ + { + "expression": "p_id_catalogue", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_acquiring": { + "name": "field_acquiring", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_farm": { + "name": "b_id_farm", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_start": { + "name": "b_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_acquiring_method": { + "name": "b_acquiring_method", + "type": "b_acquiring_method", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_acquiring_b_id_fields_b_id_fk": { + "name": "field_acquiring_b_id_fields_b_id_fk", + "tableFrom": "field_acquiring", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "field_acquiring_b_id_farm_farms_b_id_farm_fk": { + "name": "field_acquiring_b_id_farm_farms_b_id_farm_fk", + "tableFrom": "field_acquiring", + "tableTo": "farms", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_farm" + ], + "columnsTo": [ + "b_id_farm" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.field_discarding": { + "name": "field_discarding", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_end": { + "name": "b_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "field_discarding_b_id_fields_b_id_fk": { + "name": "field_discarding_b_id_fields_b_id_fk", + "tableFrom": "field_discarding", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.fields": { + "name": "fields", + "schema": "fdm", + "columns": { + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_name": { + "name": "b_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_geometry": { + "name": "b_geometry", + "type": "geometry(Polygon,4326)", + "primaryKey": false, + "notNull": false + }, + "b_id_source": { + "name": "b_id_source", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_idx": { + "name": "b_id_idx", + "columns": [ + { + "expression": "b_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "b_geom_idx": { + "name": "b_geom_idx", + "columns": [ + { + "expression": "b_geometry", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gist", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_analyses": { + "name": "harvestable_analyses", + "schema": "fdm", + "columns": { + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_lu_yield": { + "name": "b_lu_yield", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_harvestable": { + "name": "b_lu_n_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_n_residue": { + "name": "b_lu_n_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_harvestable": { + "name": "b_lu_p_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_p_residue": { + "name": "b_lu_p_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_harvestable": { + "name": "b_lu_k_harvestable", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_lu_k_residue": { + "name": "b_lu_k_residue", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_analyses_idx": { + "name": "b_id_harvestable_analyses_idx", + "columns": [ + { + "expression": "b_id_harvestable_analysis", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestable_sampling": { + "name": "harvestable_sampling", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_id_harvestable_analysis": { + "name": "b_id_harvestable_analysis", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk": { + "name": "harvestable_sampling_b_id_harvestable_harvestables_b_id_harvestable_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestables", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable" + ], + "columnsTo": [ + "b_id_harvestable" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk": { + "name": "harvestable_sampling_b_id_harvestable_analysis_harvestable_analyses_b_id_harvestable_analysis_fk", + "tableFrom": "harvestable_sampling", + "tableTo": "harvestable_analyses", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id_harvestable_analysis" + ], + "columnsTo": [ + "b_id_harvestable_analysis" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.harvestables": { + "name": "harvestables", + "schema": "fdm", + "columns": { + "b_id_harvestable": { + "name": "b_id_harvestable", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "b_id_harvestable_idx": { + "name": "b_id_harvestable_idx", + "columns": [ + { + "expression": "b_id_harvestable", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_analysis": { + "name": "soil_analysis", + "schema": "fdm", + "columns": { + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "a_date": { + "name": "a_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "a_source": { + "name": "a_source", + "type": "a_source", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false, + "default": "'other'" + }, + "a_al_ox": { + "name": "a_al_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_c_of": { + "name": "a_c_of", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co": { + "name": "a_ca_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ca_co_po": { + "name": "a_ca_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_caco3_if": { + "name": "a_caco3_if", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cec_co": { + "name": "a_cec_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_clay_mi": { + "name": "a_clay_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cn_fr": { + "name": "a_cn_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_com_fr": { + "name": "a_com_fr", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_cu_cc": { + "name": "a_cu_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_density_sa": { + "name": "a_density_sa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_fe_ox": { + "name": "a_fe_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_cc": { + "name": "a_k_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co": { + "name": "a_k_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_k_co_po": { + "name": "a_k_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_cc": { + "name": "a_mg_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co": { + "name": "a_mg_co", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_mg_co_po": { + "name": "a_mg_co_po", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_pmn": { + "name": "a_n_pmn", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_n_rt": { + "name": "a_n_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nh4_cc": { + "name": "a_nh4_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_nmin_cc": { + "name": "a_nmin_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_no3_cc": { + "name": "a_no3_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_al": { + "name": "a_p_al", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_cc": { + "name": "a_p_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_ox": { + "name": "a_p_ox", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_rt": { + "name": "a_p_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_sg": { + "name": "a_p_sg", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_p_wa": { + "name": "a_p_wa", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_ph_cc": { + "name": "a_ph_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_s_rt": { + "name": "a_s_rt", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_sand_mi": { + "name": "a_sand_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_silt_mi": { + "name": "a_silt_mi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_som_loi": { + "name": "a_som_loi", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "a_zn_cc": { + "name": "a_zn_cc", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_gwl_class": { + "name": "b_gwl_class", + "type": "b_gwl_class", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "b_soiltype_agr": { + "name": "b_soiltype_agr", + "type": "b_soiltype_agr", + "typeSchema": "fdm", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm.soil_sampling": { + "name": "soil_sampling", + "schema": "fdm", + "columns": { + "b_id_sampling": { + "name": "b_id_sampling", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "b_id": { + "name": "b_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_id": { + "name": "a_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "a_depth_upper": { + "name": "a_depth_upper", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "a_depth_lower": { + "name": "a_depth_lower", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "b_sampling_date": { + "name": "b_sampling_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "b_sampling_geometry": { + "name": "b_sampling_geometry", + "type": "geometry(MultiPoint,4326)", + "primaryKey": false, + "notNull": false + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated": { + "name": "updated", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "soil_sampling_b_id_fields_b_id_fk": { + "name": "soil_sampling_b_id_fields_b_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "fields", + "schemaTo": "fdm", + "columnsFrom": [ + "b_id" + ], + "columnsTo": [ + "b_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "soil_sampling_a_id_soil_analysis_a_id_fk": { + "name": "soil_sampling_a_id_soil_analysis_a_id_fk", + "tableFrom": "soil_sampling", + "tableTo": "soil_analysis", + "schemaTo": "fdm", + "columnsFrom": [ + "a_id" + ], + "columnsTo": [ + "a_id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.account": { + "name": "account", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.invitation": { + "name": "invitation", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.member": { + "name": "member", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.organization": { + "name": "organization", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.rate_limit": { + "name": "rate_limit", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "bigint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.session": { + "name": "session", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "schemaTo": "fdm-authn", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.user": { + "name": "user", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "display_username": { + "name": "display_username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "firstname": { + "name": "firstname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "surname": { + "name": "surname", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lang": { + "name": "lang", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "farm_active": { + "name": "farm_active", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_username_unique": { + "name": "user_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authn.verification": { + "name": "verification", + "schema": "fdm-authn", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.audit": { + "name": "audit", + "schema": "fdm-authz", + "columns": { + "audit_id": { + "name": "audit_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "audit_timestamp": { + "name": "audit_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "audit_origin": { + "name": "audit_origin", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource": { + "name": "target_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_resource_id": { + "name": "target_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource": { + "name": "granting_resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "granting_resource_id": { + "name": "granting_resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allowed": { + "name": "allowed", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-authz.role": { + "name": "role", + "schema": "fdm-authz", + "columns": { + "role_id": { + "name": "role_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "resource": { + "name": "resource", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "principal_id": { + "name": "principal_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created": { + "name": "created", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted": { + "name": "deleted", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "role_idx": { + "name": "role_idx", + "columns": [ + { + "expression": "resource", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "principal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-calculator.calculation_cache": { + "name": "calculation_cache", + "schema": "fdm-calculator", + "columns": { + "calculation_type": { + "name": "calculation_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "input_hash": { + "name": "input_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "calculator_version": { + "name": "calculator_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "inputs": { + "name": "inputs", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "result": { + "name": "result", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "fdm-calculator.calculation_errors": { + "name": "calculation_errors", + "schema": "fdm-calculator", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "calculation_type": { + "name": "calculation_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "calculator_version": { + "name": "calculator_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "inputs": { + "name": "inputs", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stack_trace": { + "name": "stack_trace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "fdm.b_acquiring_method": { + "name": "b_acquiring_method", + "schema": "fdm", + "values": [ + "nl_01", + "nl_02", + "nl_03", + "nl_04", + "nl_07", + "nl_09", + "nl_10", + "nl_11", + "nl_12", + "nl_13", + "nl_61", + "nl_63", + "unknown" + ] + }, + "fdm.p_app_method": { + "name": "p_app_method", + "schema": "fdm", + "values": [ + "slotted coulter", + "incorporation", + "incorporation 2 tracks", + "injection", + "shallow injection", + "spraying", + "broadcasting", + "spoke wheel", + "pocket placement", + "narrowband" + ] + }, + "fdm.b_gwl_class": { + "name": "b_gwl_class", + "schema": "fdm", + "values": [ + "I", + "Ia", + "Ic", + "II", + "IIa", + "IIb", + "IIc", + "III", + "IIIa", + "IIIb", + "IV", + "IVu", + "IVc", + "V", + "Va", + "Vao", + "Vad", + "Vb", + "Vbo", + "Vbd", + "sV", + "sVb", + "VI", + "VIo", + "VId", + "VII", + "VIIo", + "VIId", + "VIII", + "VIIIo", + "VIIId" + ] + }, + "fdm.b_lu_harvestable": { + "name": "b_lu_harvestable", + "schema": "fdm", + "values": [ + "none", + "once", + "multiple" + ] + }, + "fdm.b_lu_croprotation": { + "name": "b_lu_croprotation", + "schema": "fdm", + "values": [ + "other", + "clover", + "nature", + "potato", + "grass", + "rapeseed", + "starch", + "maize", + "cereal", + "sugarbeet", + "alfalfa", + "catchcrop" + ] + }, + "fdm.a_source": { + "name": "a_source", + "schema": "fdm", + "values": [ + "nl-rva-l122", + "nl-rva-l136", + "nl-rva-l264", + "nl-rva-l320", + "nl-rva-l335", + "nl-rva-l610", + "nl-rva-l648", + "nl-rva-l697", + "nl-other-nmi", + "other" + ] + }, + "fdm.b_soiltype_agr": { + "name": "b_soiltype_agr", + "schema": "fdm", + "values": [ + "moerige_klei", + "rivierklei", + "dekzand", + "zeeklei", + "dalgrond", + "veen", + "loess", + "duinzand", + "maasklei" + ] + } + }, + "schemas": { + "fdm": "fdm", + "fdm-authn": "fdm-authn", + "fdm-authz": "fdm-authz", + "fdm-calculator": "fdm-calculator" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/fdm-core/src/db/migrations/meta/_journal.json b/fdm-core/src/db/migrations/meta/_journal.json index 1d8df0db1..6eef2c754 100644 --- a/fdm-core/src/db/migrations/meta/_journal.json +++ b/fdm-core/src/db/migrations/meta/_journal.json @@ -106,6 +106,13 @@ "when": 1760450273146, "tag": "0014_smart_malice", "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1760712120837, + "tag": "0015_far_blue_shield", + "breakpoints": true } ] } \ No newline at end of file diff --git a/fdm-core/src/db/schema-calculator.ts b/fdm-core/src/db/schema-calculator.ts new file mode 100644 index 000000000..80e08adb6 --- /dev/null +++ b/fdm-core/src/db/schema-calculator.ts @@ -0,0 +1,47 @@ +import { + json, + pgSchema, + primaryKey, + serial, + text, + timestamp, +} from "drizzle-orm/pg-core" + +export const fdmCalculatorSchema = pgSchema("fdm-calculator") +export type fdmSchemaAuthNTypeSelect = typeof fdmCalculatorSchema.table + +export const calculationCache = fdmCalculatorSchema.table( + "calculation_cache", + { + calculation_type: text().notNull(), + input_hash: text().notNull(), + calculator_version: text(), + inputs: json(), + result: json(), + created_at: timestamp({ withTimezone: true }).notNull().defaultNow(), + }, + (table) => { + return [ + { + pk: primaryKey({ + columns: [table.calculation_type, table.input_hash], + }), + }, + ] + }, +) + +export const calculationErrors = fdmCalculatorSchema.table( + "calculation_errors", + { + id: serial().primaryKey(), + calculation_type: text(), + calculator_version: text(), + inputs: json(), + error_message: text(), + stack_trace: text(), + created_at: timestamp({ withTimezone: true }).notNull().defaultNow(), + }, +) + +export type CalculationCacheTypeSelect = typeof calculationCache.$inferSelect diff --git a/fdm-core/src/db/schema.ts b/fdm-core/src/db/schema.ts index 336b3bd59..456dcb38a 100644 --- a/fdm-core/src/db/schema.ts +++ b/fdm-core/src/db/schema.ts @@ -37,7 +37,10 @@ export type farmsTypeInsert = typeof farms.$inferInsert export const acquiringMethodOptions = [ { value: "nl_01", label: "Eigendom" }, { value: "nl_02", label: "Reguliere pacht" }, - { value: "nl_03", label: "In gebruik van een terreinbeherende organisatie" }, + { + value: "nl_03", + label: "In gebruik van een terreinbeherende organisatie", + }, { value: "nl_04", label: "Tijdelijk gebruik in het kader van landinrichting", diff --git a/fdm-core/src/index.ts b/fdm-core/src/index.ts index 3f8138505..13bcc5090 100644 --- a/fdm-core/src/index.ts +++ b/fdm-core/src/index.ts @@ -23,6 +23,12 @@ export { } from "./authentication" export type { FdmAuth } from "./authentication.d" export type { PrincipalId } from "./authorization.d" +export { + getCachedCalculation, + setCachedCalculation, + setCalculationError, + withCalculationCache, +} from "./calculator" export { disableCultivationCatalogue, disableFertilizerCatalogue, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a959257b..fac243b96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -405,6 +405,9 @@ importers: nanoid: specifier: ^5.1.6 version: 5.1.6 + object-hash: + specifier: ^3.0.0 + version: 3.0.0 postgres: specifier: ^3.4.7 version: 3.4.7 @@ -430,6 +433,9 @@ importers: '@types/node': specifier: ^24.7.2 version: 24.7.2 + '@types/object-hash': + specifier: ^3.0.6 + version: 3.0.6 '@vitest/coverage-v8': specifier: 'catalog:' version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) @@ -4896,6 +4902,9 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/object-hash@3.0.6': + resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} + '@types/pbf@3.0.5': resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} @@ -8271,6 +8280,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -16944,6 +16957,8 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/object-hash@3.0.6': {} + '@types/pbf@3.0.5': {} '@types/pg-pool@2.0.6': @@ -20761,6 +20776,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} From 6cdbb9303748f52f944357a4f8cbd2e0fad8655a Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:59:47 +0200 Subject: [PATCH 071/243] feat: add function to aggregate norm filling to farm level --- fdm-calculator/src/norms/farm.test.ts | 257 ++++++++++++++++---------- fdm-calculator/src/norms/farm.ts | 121 +++++++++++- 2 files changed, 282 insertions(+), 96 deletions(-) diff --git a/fdm-calculator/src/norms/farm.test.ts b/fdm-calculator/src/norms/farm.test.ts index 326a93478..8822c4bdc 100644 --- a/fdm-calculator/src/norms/farm.test.ts +++ b/fdm-calculator/src/norms/farm.test.ts @@ -1,146 +1,213 @@ import { describe, expect, it } from "vitest" -import { aggregateNormsToFarmLevel } from "./farm" -import type { GebruiksnormResult } from "./nl/2025/value/types" +import { + aggregateNormsToFarmLevel, + aggregateNormFillingsToFarmLevel, +} from "./farm" +import type { + InputAggregateNormsToFarmLevel, + InputAggregateNormFillingsToFarmLevel, +} from "./farm" describe("aggregateNormsToFarmLevel", () => { - it("should correctly aggregate norms from multiple fields", () => { - const fieldData = [ + it("should correctly aggregate norm values to farm level", () => { + const fieldData: InputAggregateNormsToFarmLevel = [ { b_id: "field1", - b_area: 10, + b_area: 10, // hectares norms: { - manure: { - normValue: 100, - normSource: "Source A", - } as GebruiksnormResult, - nitrogen: { - normValue: 150, - normSource: "Source B", - } as GebruiksnormResult, - phosphate: { - normValue: 50, - normSource: "Source C", - } as GebruiksnormResult, + manure: { normValue: 100, normSource: "Source A" }, // kg N/ha + nitrogen: { normValue: 150, normSource: "Source B" }, // kg N/ha + phosphate: { normValue: 50, normSource: "Source C" }, // kg P2O5/ha }, }, { b_id: "field2", - b_area: 5, + b_area: 5, // hectares norms: { - manure: { - normValue: 90, - normSource: "Source A", - } as GebruiksnormResult, - nitrogen: { - normValue: 140, - normSource: "Source B", - } as GebruiksnormResult, - phosphate: { - normValue: 45, - normSource: "Source C", - } as GebruiksnormResult, + manure: { normValue: 90, normSource: "Source A" }, // kg N/ha + nitrogen: { normValue: 140, normSource: "Source B" }, // kg N/ha + phosphate: { normValue: 45, normSource: "Source C" }, // kg P2O5/ha }, }, ] - const result = aggregateNormsToFarmLevel(fieldData) + const aggregatedNorms = aggregateNormsToFarmLevel(fieldData) - expect(result.manure).toBe(1450) - expect(result.nitrogen).toBe(2200) - expect(result.phosphate).toBe(725) + expect(aggregatedNorms).toEqual({ + manure: 1450, // (100 * 10) + (90 * 5) + nitrogen: 2200, // (150 * 10) + (140 * 5) + phosphate: 725, // (50 * 10) + (45 * 5) + }) }) - it("should handle an empty array of fields", () => { - const result = aggregateNormsToFarmLevel([]) - expect(result.manure).toBe(0) - expect(result.nitrogen).toBe(0) - expect(result.phosphate).toBe(0) + it("should handle empty input array", () => { + const fieldData: InputAggregateNormsToFarmLevel = [] + const aggregatedNorms = aggregateNormsToFarmLevel(fieldData) + expect(aggregatedNorms).toEqual({ + manure: 0, + nitrogen: 0, + phosphate: 0, + }) }) it("should handle fields with zero area", () => { - const fieldData = [ + const fieldData: InputAggregateNormsToFarmLevel = [ { b_id: "field1", - b_area: 0, + b_area: 0, // hectares norms: { - manure: { - normValue: 100, - normSource: "Source A", - } as GebruiksnormResult, - nitrogen: { - normValue: 150, - normSource: "Source B", - } as GebruiksnormResult, - phosphate: { - normValue: 50, - normSource: "Source C", - } as GebruiksnormResult, + manure: { normValue: 100, normSource: "Source A" }, + nitrogen: { normValue: 150, normSource: "Source B" }, + phosphate: { normValue: 50, normSource: "Source C" }, }, }, ] - - const result = aggregateNormsToFarmLevel(fieldData) - - expect(result.manure).toBe(0) - expect(result.nitrogen).toBe(0) - expect(result.phosphate).toBe(0) + const aggregatedNorms = aggregateNormsToFarmLevel(fieldData) + expect(aggregatedNorms).toEqual({ + manure: 0, + nitrogen: 0, + phosphate: 0, + }) }) +}) - it("should handle fields with zero norm values", () => { - const fieldData = [ +describe("aggregateNormFillingsToFarmLevel", () => { + it("should correctly aggregate norm filling values to farm level", () => { + const fieldData: InputAggregateNormFillingsToFarmLevel = [ { b_id: "field1", - b_area: 10, - norms: { + b_area: 10, // hectares + normFillings: { manure: { - normValue: 0, - normSource: "Source A", - } as GebruiksnormResult, + normFilling: 10, + applicationFilling: [ + { p_app_id: "app1", normFilling: 5 }, + { p_app_id: "app2", normFilling: 5 }, + ], + }, nitrogen: { - normValue: 0, - normSource: "Source B", - } as GebruiksnormResult, + normFilling: 20, + applicationFilling: [ + { p_app_id: "app1", normFilling: 10 }, + { p_app_id: "app2", normFilling: 10 }, + ], + }, phosphate: { - normValue: 0, - normSource: "Source C", - } as GebruiksnormResult, + normFilling: 5, + applicationFilling: [ + { p_app_id: "app1", normFilling: 2 }, + { p_app_id: "app2", normFilling: 3 }, + ], + }, + }, + }, + { + b_id: "field2", + b_area: 5, // hectares + normFillings: { + manure: { + normFilling: 8, + applicationFilling: [ + { p_app_id: "app3", normFilling: 4 }, + { p_app_id: "app4", normFilling: 4 }, + ], + }, + nitrogen: { + normFilling: 15, + applicationFilling: [ + { p_app_id: "app3", normFilling: 7 }, + { p_app_id: "app4", normFilling: 8 }, + ], + }, + phosphate: { + normFilling: 3, + applicationFilling: [ + { p_app_id: "app3", normFilling: 1 }, + { p_app_id: "app4", normFilling: 2 }, + ], + }, }, }, ] - const result = aggregateNormsToFarmLevel(fieldData) + const aggregatedFillings = aggregateNormFillingsToFarmLevel(fieldData) + + expect(aggregatedFillings.manure.normFilling).toBe(140) // (10 * 10) + (8 * 5) + expect(aggregatedFillings.nitrogen.normFilling).toBe(275) // (20 * 10) + (15 * 5) + expect(aggregatedFillings.phosphate.normFilling).toBe(65) // (5 * 10) + (3 * 5) + + // Check application fillings + expect(aggregatedFillings.manure.applicationFilling).toEqual([ + { p_app_id: "app1", normFilling: 50 }, // 5 * 10 + { p_app_id: "app2", normFilling: 50 }, // 5 * 10 + { p_app_id: "app3", normFilling: 20 }, // 4 * 5 + { p_app_id: "app4", normFilling: 20 }, // 4 * 5 + ]) + expect(aggregatedFillings.nitrogen.applicationFilling).toEqual([ + { p_app_id: "app1", normFilling: 100 }, // 10 * 10 + { p_app_id: "app2", normFilling: 100 }, // 10 * 10 + { p_app_id: "app3", normFilling: 35 }, // 7 * 5 + { p_app_id: "app4", normFilling: 40 }, // 8 * 5 + ]) + expect(aggregatedFillings.phosphate.applicationFilling).toEqual([ + { p_app_id: "app1", normFilling: 20 }, // 2 * 10 + { p_app_id: "app2", normFilling: 30 }, // 3 * 10 + { p_app_id: "app3", normFilling: 5 }, // 1 * 5 + { p_app_id: "app4", normFilling: 10 }, // 2 * 5 + ]) + }) - expect(result.manure).toBe(0) - expect(result.nitrogen).toBe(0) - expect(result.phosphate).toBe(0) + it("should handle empty input array for norm fillings", () => { + const fieldData: InputAggregateNormFillingsToFarmLevel = [] + const aggregatedFillings = aggregateNormFillingsToFarmLevel(fieldData) + expect(aggregatedFillings).toEqual({ + manure: { normFilling: 0, applicationFilling: [] }, + nitrogen: { normFilling: 0, applicationFilling: [] }, + phosphate: { normFilling: 0, applicationFilling: [] }, + }) }) - it("should handle floating point numbers for area and norm values", () => { - const fieldData = [ + it("should handle fields with zero area for norm fillings", () => { + const fieldData: InputAggregateNormFillingsToFarmLevel = [ { b_id: "field1", - b_area: 10.5, - norms: { + b_area: 0, // hectares + normFillings: { manure: { - normValue: 100.5, - normSource: "Source A", - } as GebruiksnormResult, + normFilling: 10, + applicationFilling: [ + { p_app_id: "app1", normFilling: 5 }, + ], + }, nitrogen: { - normValue: 150.5, - normSource: "Source B", - } as GebruiksnormResult, + normFilling: 20, + applicationFilling: [ + { p_app_id: "app1", normFilling: 10 }, + ], + }, phosphate: { - normValue: 50.5, - normSource: "Source C", - } as GebruiksnormResult, + normFilling: 5, + applicationFilling: [ + { p_app_id: "app1", normFilling: 2 }, + ], + }, }, }, ] - - const result = aggregateNormsToFarmLevel(fieldData) - - expect(result.manure).toBe(1055) // 10.5 * 100.5 = 1055.25 - expect(result.nitrogen).toBe(1580) // 10.5 * 150.5 = 1580.25 - expect(result.phosphate).toBe(530) // 10.5 * 50.5 = 530.25 + const aggregatedFillings = aggregateNormFillingsToFarmLevel(fieldData) + expect(aggregatedFillings).toEqual({ + manure: { + normFilling: 0, + applicationFilling: [{ p_app_id: "app1", normFilling: 0 }], + }, + nitrogen: { + normFilling: 0, + applicationFilling: [{ p_app_id: "app1", normFilling: 0 }], + }, + phosphate: { + normFilling: 0, + applicationFilling: [{ p_app_id: "app1", normFilling: 0 }], + }, + }) }) }) diff --git a/fdm-calculator/src/norms/farm.ts b/fdm-calculator/src/norms/farm.ts index 3692ef5ef..dbe5af8bf 100644 --- a/fdm-calculator/src/norms/farm.ts +++ b/fdm-calculator/src/norms/farm.ts @@ -1,11 +1,12 @@ import { Decimal } from "decimal.js" import type { GebruiksnormResult } from "./nl/2025/value/types" +import type { NormFilling } from "./nl/2025/filling/types" /** * Represents the input structure for the `aggregateNormsToFarmLevel` function. * It is an array of objects, where each object contains information for a single field. */ -type InputAggregateNormsToFarmLevel = { +export type InputAggregateNormsToFarmLevel = { /** * The unique identifier of the field. */ @@ -110,3 +111,121 @@ export function aggregateNormsToFarmLevel( phosphate: totalPhosphate.toDecimalPlaces(0).toNumber(), } } + +/** + * Represents the input structure for the `aggregateNormFillingsToFarmLevel` function. + * It is an array of objects, where each object contains information for a single field. + */ +export type InputAggregateNormFillingsToFarmLevel = { + /** + * The unique identifier of the field. + */ + b_id: string + /** + * The area of the field in hectares. + */ + b_area: number + /** + * The calculated norm fillings for manure, nitrogen, and phosphate for this field. + */ + normFillings: { + manure: NormFilling + nitrogen: NormFilling + phosphate: NormFilling + } +}[] + +/** + * Represents the aggregated output of the `aggregateNormFillingsToFarmLevel` function. + * The results are expressed as total amounts for the farm, not per hectare. + */ +export type AggregatedNormFillingsToFarmLevel = { + /** + * Total manure norm filling in kg N for the entire farm. + */ + manure: NormFilling + /** + * Total nitrogen norm filling in kg N for the entire farm. + */ + nitrogen: NormFilling + /** + * Total phosphate norm filling in kg P2O5 for the entire farm. + */ + phosphate: NormFilling +} + +/** + * Aggregates the norm filling values from individual fields to the farm level. + * This function takes the output per field of the norm filling calculation, + * multiplies each norm filling by the field's area, and sums these values + * across all fields to provide total norm fillings for the farm. + * + * The result are three objects (manure, nitrogen, phosphate) each containing + * the total normFilling and combined applicationFillings, expressed as totals, not per hectare. + * + * @param input An array of field data, each containing field ID, area, and calculated norm fillings. + * @returns An object containing the total aggregated norm fillings for manure, nitrogen, and phosphate for the farm. + */ +export function aggregateNormFillingsToFarmLevel( + input: InputAggregateNormFillingsToFarmLevel, +): AggregatedNormFillingsToFarmLevel { + let totalManureFilling = new Decimal(0) + let totalNitrogenFilling = new Decimal(0) + let totalPhosphateFilling = new Decimal(0) + + let allManureApplicationFillings: NormFilling["applicationFilling"] = [] + let allNitrogenApplicationFillings: NormFilling["applicationFilling"] = [] + let allPhosphateApplicationFillings: NormFilling["applicationFilling"] = [] + + for (const field of input) { + const area = new Decimal(field.b_area) + + // Aggregate manure filling + totalManureFilling = totalManureFilling.plus( + new Decimal(field.normFillings.manure.normFilling).times(area), + ) + allManureApplicationFillings = allManureApplicationFillings.concat( + field.normFillings.manure.applicationFilling.map((app) => ({ + ...app, + normFilling: new Decimal(app.normFilling).times(area).toNumber(), + })), + ) + + // Aggregate nitrogen filling + totalNitrogenFilling = totalNitrogenFilling.plus( + new Decimal(field.normFillings.nitrogen.normFilling).times(area), + ) + allNitrogenApplicationFillings = allNitrogenApplicationFillings.concat( + field.normFillings.nitrogen.applicationFilling.map((app) => ({ + ...app, + normFilling: new Decimal(app.normFilling).times(area).toNumber(), + })), + ) + + // Aggregate phosphate filling + totalPhosphateFilling = totalPhosphateFilling.plus( + new Decimal(field.normFillings.phosphate.normFilling).times(area), + ) + allPhosphateApplicationFillings = allPhosphateApplicationFillings.concat( + field.normFillings.phosphate.applicationFilling.map((app) => ({ + ...app, + normFilling: new Decimal(app.normFilling).times(area).toNumber(), + })), + ) + } + + return { + manure: { + normFilling: totalManureFilling.toDecimalPlaces(0).toNumber(), + applicationFilling: allManureApplicationFillings, + }, + nitrogen: { + normFilling: totalNitrogenFilling.toDecimalPlaces(0).toNumber(), + applicationFilling: allNitrogenApplicationFillings, + }, + phosphate: { + normFilling: totalPhosphateFilling.toDecimalPlaces(0).toNumber(), + applicationFilling: allPhosphateApplicationFillings, + }, + } +} From 136c0947f564ccda3ea27e86aa4abfc555c9547f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Sun, 19 Oct 2025 17:22:57 +0200 Subject: [PATCH 072/243] Add caching to norm calculations --- .../farm.$b_id_farm.$calendar.norms.tsx | 15 +++++-- fdm-calculator/rollup.config.js | 11 +++++ .../2025/dierlijke-mest-gebruiksnorm.test.ts | 18 ++++---- .../nl/2025/dierlijke-mest-gebruiksnorm.ts | 11 ++++- .../norms/nl/2025/fosfaatgebruiksnorm.test.ts | 8 ++-- .../src/norms/nl/2025/fosfaatgebruiksnorm.ts | 10 ++++- .../nl/2025/stikstofgebruiksnorm.test.ts | 44 +++++++++---------- .../src/norms/nl/2025/stikstofgebruiksnorm.ts | 11 ++++- fdm-calculator/src/package.ts | 3 ++ 9 files changed, 88 insertions(+), 43 deletions(-) create mode 100644 fdm-calculator/src/package.ts diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.norms.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.norms.tsx index fd3f464de..9a409a367 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.norms.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.norms.tsx @@ -135,9 +135,18 @@ export async function loader({ request, params }: LoaderFunctionArgs) { // Calculate the norms const [normManure, normPhosphate, normNitrogen] = await Promise.all([ - functionsForms.calculateNormForManure(input), - functionsForms.calculateNormForPhosphate(input), - functionsForms.calculateNormForNitrogen(input), + functionsForms.calculateNormForManure( + fdm, + input, + ), + functionsForms.calculateNormForPhosphate( + fdm, + input, + ), + functionsForms.calculateNormForNitrogen( + fdm, + input, + ), ]) return { diff --git a/fdm-calculator/rollup.config.js b/fdm-calculator/rollup.config.js index c5702b1e2..69b78bfe3 100644 --- a/fdm-calculator/rollup.config.js +++ b/fdm-calculator/rollup.config.js @@ -3,6 +3,7 @@ import resolve from "@rollup/plugin-node-resolve" import terser from "@rollup/plugin-terser" import typescript from "@rollup/plugin-typescript" import { defineConfig } from "rollup" +import packageJson from "./package.json" with { type: "json" } export default defineConfig({ input: "src/index.ts", // Your entry point @@ -29,6 +30,16 @@ export default defineConfig({ } : false, }), // Minifies the output + { + renderChunk: (code) => { + return { + code: code.replace( + "fdm-calculator:{FDM_CALCULATOR_VERSION}", + `fdm-calculator:${packageJson.version}`, + ), + } + }, + }, // Modifies bundled package.ts to contain the actual package version ], external: ["@svenvw/fdm-core", "geotiff"], }) diff --git a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts index 29fe14606..db02e28d6 100644 --- a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.test.ts @@ -1,11 +1,11 @@ import { describe, expect, it } from "vitest" import { - getNL2025DierlijkeMestGebruiksNorm, + calculateNL2025DierlijkeMestGebruiksNorm, isFieldInDerogatieVrijeZone, } from "./dierlijke-mest-gebruiksnorm" import type { NL2025NormsInput } from "./types" -describe("getNL2025DierlijkeMestGebruiksNorm", () => { +describe("calculateNL2025DierlijkeMestGebruiksNorm", () => { it("should return the default norm value", async () => { const mockInput: NL2025NormsInput = { farm: { is_derogatie_bedrijf: false }, @@ -16,7 +16,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toBe("Standaard - geen derogatie") }) @@ -31,7 +31,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(200) expect(result.normSource).toBe("Derogatie") }) @@ -46,7 +46,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(190) expect(result.normSource).toBe("Derogatie - NV Gebied") }) @@ -61,7 +61,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toBe("Standaard - geen derogatie") }) @@ -76,7 +76,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toBe( "Derogatie - Grondwaterbeschermingsgebied", @@ -93,7 +93,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(190) expect(result.normSource).toBe("Derogatie - NV Gebied") }) @@ -108,7 +108,7 @@ describe("getNL2025DierlijkeMestGebruiksNorm", () => { cultivations: [], soilAnalysis: { a_p_cc: 0, a_p_al: 0 }, } - const result = await getNL2025DierlijkeMestGebruiksNorm(mockInput) + const result = await calculateNL2025DierlijkeMestGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toBe("Derogatie - Natura2000 Gebied") }) diff --git a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts index c6046ec16..b83234dc9 100644 --- a/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/dierlijke-mest-gebruiksnorm.ts @@ -1,4 +1,5 @@ -import type { Field } from "@svenvw/fdm-core" +import { type Field, withCalculationCache } from "@svenvw/fdm-core" +import pkg from "../../../package" import { getGeoTiffValue } from "../../../shared/geotiff" import { getFdmPublicDataUrl } from "../../../shared/public-data-url" import { isFieldInNVGebied } from "./stikstofgebruiksnorm" @@ -146,7 +147,7 @@ export async function isFieldInDerogatieVrijeZone( * @see {@link https://www.rvo.nl/onderwerpen/mest/derogatie | RVO Derogatie (official page)} * @see {@link https://www.rvo.nl/onderwerpen/mest/met-nutrienten-verontreinigde-gebieden-nv-gebieden | RVO Met nutriënten verontreinigde gebieden (NV-gebieden) (official page)} */ -export async function getNL2025DierlijkeMestGebruiksNorm( +export async function calculateNL2025DierlijkeMestGebruiksNorm( input: NL2025NormsInput, ): Promise { const is_derogatie_bedrijf = input.farm.is_derogatie_bedrijf || false @@ -191,3 +192,9 @@ export async function getNL2025DierlijkeMestGebruiksNorm( return { normValue, normSource } } + +export const getNL2025DierlijkeMestGebruiksNorm = withCalculationCache( + "calculateNL2025DierlijkeMestGebruiksNorm", + pkg.calculatorVersion, + calculateNL2025DierlijkeMestGebruiksNorm, +) diff --git a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts index d230c9bf2..c131dc9bd 100644 --- a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest" -import { getNL2025FosfaatGebruiksNorm } from "./fosfaatgebruiksnorm" +import { calculateNL2025FosfaatGebruiksNorm } from "./fosfaatgebruiksnorm" import type { NL2025NormsInput, NL2025NormsInputForCultivation } from "./types" -describe("getNL2025FosfaatGebruiksNorm", () => { +describe("calculateNL2025FosfaatGebruiksNorm", () => { it("should return the correct norm for grasland", async () => { const mockInput: NL2025NormsInput = { farm: { is_derogatie_bedrijf: false }, @@ -17,7 +17,7 @@ describe("getNL2025FosfaatGebruiksNorm", () => { ] as NL2025NormsInputForCultivation[], soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025FosfaatGebruiksNorm(mockInput) + const result = await calculateNL2025FosfaatGebruiksNorm(mockInput) expect(result.normValue).toBe(120) expect(result.normSource).toContain("Grasland") }) @@ -36,7 +36,7 @@ describe("getNL2025FosfaatGebruiksNorm", () => { ] as NL2025NormsInputForCultivation[], soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025FosfaatGebruiksNorm(mockInput) + const result = await calculateNL2025FosfaatGebruiksNorm(mockInput) expect(result.normValue).toBe(120) expect(result.normSource).toContain("Bouwland") }) diff --git a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts index 09eeb32aa..3c328d26b 100644 --- a/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/fosfaatgebruiksnorm.ts @@ -1,4 +1,6 @@ +import { withCalculationCache } from "@svenvw/fdm-core" import Decimal from "decimal.js" +import pkg from "../../../package" import { fosfaatNormsData } from "./fosfaatgebruiksnorm-data" import { determineNL2025Hoofdteelt } from "./hoofdteelt" import type { @@ -135,7 +137,7 @@ function getFosfaatKlasse( * @see {@link https://www.rvo.nl/onderwerpen/mest/gebruiken-en-uitrijden/fosfaat-landbouwgrond | RVO Fosfaat landbouwgrond (official page)} * @see {@link https://www.rvo.nl/onderwerpen/mest/gebruiken-en-uitrijden/fosfaat-landbouwgrond/differentiatie | RVO Fosfaatdifferentiatie (official page, including tables for 2025)} */ -export async function getNL2025FosfaatGebruiksNorm( +export async function calculateNL2025FosfaatGebruiksNorm( input: NL2025NormsInput, ): Promise { const cultivations = input.cultivations @@ -171,3 +173,9 @@ export async function getNL2025FosfaatGebruiksNorm( return { normValue, normSource } } + +export const getNL2025FosfaatGebruiksNorm = withCalculationCache( + "calculateNL2025FosfaatGebruiksNorm", + pkg.calculatorVersion, + calculateNL2025FosfaatGebruiksNorm, +) diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts index 8c6d13366..07f6c9f77 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts +++ b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.test.ts @@ -1,7 +1,7 @@ import type { Field } from "@svenvw/fdm-core" import { describe, expect, it } from "vitest" import { - getNL2025StikstofGebruiksNorm, + calculateNL2025StikstofGebruiksNorm, getRegion, isFieldInNVGebied, } from "./stikstofgebruiksnorm" @@ -34,7 +34,7 @@ describe("stikstofgebruiksnorm helpers", () => { }) }) -describe("getNL2025StikstofGebruiksNorm", () => { +describe("calculateNL2025StikstofGebruiksNorm", () => { it("should return the correct norm for grasland", async () => { const mockInput: NL2025NormsInput = { farm: { is_derogatie_bedrijf: false }, @@ -52,7 +52,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(345) expect(result.normSource).toEqual("Grasland.") }) @@ -75,7 +75,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(140) expect(result.normSource).toEqual( "Akkerbouwgewas, pootaardappelen (hoge norm).", @@ -99,7 +99,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Grasland in zand_nwc is 200 in nv-gebied. With winterteelt, korting should be 0. expect(result.normValue).toBe(200) @@ -130,7 +130,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in zand_nwc is 108. With vanggewas sown <= Oct 1st, korting should be 0. expect(result.normValue).toBe(108) expect(result.normSource).toEqual( @@ -160,7 +160,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in zand_nwc in nv-gebied is 108. With vanggewas sown Oct 2-14, korting should be 5. expect(result.normValue).toBe(103) // 108 - 5 expect(result.normSource).toEqual( @@ -190,7 +190,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in zand_nwc in nv-gebied is 108. With vanggewas sown Oct 15-31, korting should be 10. expect(result.normValue).toBe(98) // 108 - 10 expect(result.normSource).toEqual( @@ -220,7 +220,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in zand_nwc in nv-gebied is 108. With vanggewas sown Nov 1st+, korting should be 20. expect(result.normValue).toBe(88) // 108 - 20 expect(result.normSource).toEqual( @@ -250,7 +250,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in zand_nwc in nv-gebied is 108. With no exception, korting should be 20. expect(result.normValue).toBe(88) // 108 - 20 expect(result.normSource).toEqual( @@ -280,7 +280,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) // The base norm for Vruchtgewassen in klei is 135. Korting should not apply in non-sandy/loess regions. expect(result.normValue).toBe(135) expect(result.normSource).toEqual( @@ -305,7 +305,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(30) expect(result.normSource).toEqual( "Akkerbouwgewassen, Gras voor industriële verwerking (inzaai in september en eerste jaar).", @@ -334,7 +334,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(310) expect(result.normSource).toEqual( "Akkerbouwgewassen, Gras voor industriële verwerking (inzaai voor 15 mei en volgende jaren).", @@ -358,7 +358,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(165) expect(result.normSource).toEqual( "Akkerbouwgewassen, Graszaad, Engels raaigras (1e jaars).", @@ -387,7 +387,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(200) expect(result.normSource).toEqual( "Akkerbouwgewassen, Graszaad, Engels raaigras (overjarig).", @@ -411,7 +411,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(85) expect(result.normSource).toEqual( "Akkerbouwgewassen, Roodzwenkgras (1e jaars).", @@ -440,7 +440,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(115) expect(result.normSource).toEqual( "Akkerbouwgewassen, Roodzwenkgras (overjarig).", @@ -464,7 +464,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toEqual( "Akkerbouwgewassen, Ui overig, zaaiui of winterui. (1e jaars).", @@ -488,7 +488,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(170) expect(result.normSource).toEqual( "Akkerbouwgewassen, Ui overig, zaaiui of winterui. (2e jaars).", @@ -512,7 +512,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(260) expect(result.normSource).toEqual("Bladgewassen, Spinazie (1e teelt).") }) @@ -534,7 +534,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(180) expect(result.normSource).toEqual( "Bladgewassen, Slasoorten (1e teelt).", @@ -558,7 +558,7 @@ describe("getNL2025StikstofGebruiksNorm", () => { soilAnalysis: { a_p_al: 20, a_p_cc: 0.9 }, } - const result = await getNL2025StikstofGebruiksNorm(mockInput) + const result = await calculateNL2025StikstofGebruiksNorm(mockInput) expect(result.normValue).toBe(180) expect(result.normSource).toEqual( "Bladgewassen, Andijvie eerste teelt volgteelt (1e teelt).", diff --git a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts index 6025078b0..201d7e38d 100644 --- a/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts +++ b/fdm-calculator/src/norms/nl/2025/stikstofgebruiksnorm.ts @@ -1,5 +1,6 @@ -import type { Field } from "@svenvw/fdm-core" +import { type Field, withCalculationCache } from "@svenvw/fdm-core" import Decimal from "decimal.js" +import pkg from "../../../package" import { getGeoTiffValue } from "../../../shared/geotiff" import { getFdmPublicDataUrl } from "../../../shared/public-data-url" import { determineNL2025Hoofdteelt } from "./hoofdteelt" @@ -523,7 +524,7 @@ function calculateKorting( * @see {@link https://www.rvo.nl/sites/default/files/2024-12/Tabel-2-Stikstof-landbouwgrond-2025_0.pdf | RVO Tabel 2 Stikstof landbouwgrond 2025} - Official document for nitrogen norms. * @see {@link https://www.rvo.nl/onderwerpen/mest/gebruiken-en-uitrijden/stikstof-en-fosfaat/gebruiksnormen-stikstof | RVO Gebruiksnormen stikstof (official page)} - General information on nitrogen and phosphate norms. */ -export async function getNL2025StikstofGebruiksNorm( +export async function calculateNL2025StikstofGebruiksNorm( input: NL2025NormsInput, ): Promise { const is_derogatie_bedrijf = input.farm.is_derogatie_bedrijf @@ -634,3 +635,9 @@ export async function getNL2025StikstofGebruiksNorm( normSource: `${selectedStandard.cultivation_rvo_table2}${subTypeText}${kortingDescription}`, } } + +export const getNL2025StikstofGebruiksNorm = withCalculationCache( + "calculateNL2025StikstofGebruiksNorm", + pkg.calculatorVersion, + calculateNL2025StikstofGebruiksNorm, +) diff --git a/fdm-calculator/src/package.ts b/fdm-calculator/src/package.ts new file mode 100644 index 000000000..bebc4d04d --- /dev/null +++ b/fdm-calculator/src/package.ts @@ -0,0 +1,3 @@ +export default { + calculatorVersion: "fdm-calculator:{FDM_CALCULATOR_VERSION}", +} From df994c37ca030a434ac86c09c1ea94d6b31bec0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Sun, 19 Oct 2025 17:41:06 +0200 Subject: [PATCH 073/243] Add caching to nitrogen balance calculations --- ...rm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx | 4 ++-- ...m.$b_id_farm.$calendar.balance.nitrogen._index.tsx | 8 +++++--- fdm-calculator/src/balance/nitrogen/index.ts | 11 +++++++++-- fdm-calculator/src/index.ts | 5 ++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx index 9f4856ee7..23386a378 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen.$b_id.tsx @@ -1,6 +1,6 @@ import { - calculateNitrogenBalance, collectInputForNitrogenBalance, + getNitrogenBalance, } from "@svenvw/fdm-calculator" import { getFarm, getField } from "@svenvw/fdm-core" import { @@ -98,7 +98,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { timeframe, b_id, ).then(async (input) => { - const nitrogenBalanceResult = await calculateNitrogenBalance(input) + const nitrogenBalanceResult = await getNitrogenBalance(fdm, input) let fieldResult = nitrogenBalanceResult.fields.find( (field: { b_id: string }) => field.b_id === b_id, ) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx index 58042bd83..94ef0fd97 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.balance.nitrogen._index.tsx @@ -1,6 +1,6 @@ import { - calculateNitrogenBalance, collectInputForNitrogenBalance, + getNitrogenBalance, type NitrogenBalanceFieldResultNumeric, } from "@svenvw/fdm-calculator" import { getFarm, getFields } from "@svenvw/fdm-core" @@ -94,8 +94,10 @@ export async function loader({ request, params }: LoaderFunctionArgs) { timeframe, ) - const nitrogenBalanceResult = - await calculateNitrogenBalance(nitrogenBalanceInput) + const nitrogenBalanceResult = await getNitrogenBalance( + fdm, + nitrogenBalanceInput, + ) if (nitrogenBalanceResult.hasErrors) { reportError( diff --git a/fdm-calculator/src/balance/nitrogen/index.ts b/fdm-calculator/src/balance/nitrogen/index.ts index 851f2a6f2..486b5dfb4 100644 --- a/fdm-calculator/src/balance/nitrogen/index.ts +++ b/fdm-calculator/src/balance/nitrogen/index.ts @@ -1,4 +1,4 @@ -import type { fdmSchema } from "@svenvw/fdm-core" +import { type fdmSchema, withCalculationCache } from "@svenvw/fdm-core" import Decimal from "decimal.js" import { calculateBulkDensity, @@ -6,6 +6,7 @@ import { calculateOrganicCarbon, calculateOrganicMatter, } from "../../conversions/soil" +import pkg from "../../package" import { getFdmPublicDataUrl } from "../../shared/public-data-url" import { calculateNitrogenEmission } from "./emission" import { calculateNitrogenRemoval } from "./removal" @@ -18,8 +19,8 @@ import type { FieldInput, NitrogenBalance, NitrogenBalanceField, - NitrogenBalanceFieldResult, NitrogenBalanceFieldNumeric, + NitrogenBalanceFieldResult, NitrogenBalanceInput, NitrogenBalanceNumeric, SoilAnalysisPicked, @@ -118,6 +119,12 @@ export async function calculateNitrogenBalance( return convertNitrogenBalanceToNumeric(farmWithBalanceDecimal) } +export const getNitrogenBalance = withCalculationCache( + "calculateNitrogenBalance", + pkg.calculatorVersion, + calculateNitrogenBalance, +) + /** * Calculates the nitrogen balance for a single field, considering nitrogen supply, removal, and emission. * diff --git a/fdm-calculator/src/index.ts b/fdm-calculator/src/index.ts index 3231374eb..7b7c1a17b 100644 --- a/fdm-calculator/src/index.ts +++ b/fdm-calculator/src/index.ts @@ -1,4 +1,7 @@ -export { calculateNitrogenBalance } from "./balance/nitrogen/index" +export { + calculateNitrogenBalance, + getNitrogenBalance, +} from "./balance/nitrogen/index" export { collectInputForNitrogenBalance } from "./balance/nitrogen/input" export type { FieldInput, From 1a76b1c40782288bc0a44f4c94f27d331d62e008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Sun, 19 Oct 2025 18:14:49 +0200 Subject: [PATCH 074/243] Add caching to the NMI API nutrient advice integration --- ...d_farm.$calendar.nutrient_advice.$b_id.tsx | 50 +++++++++++++------ fdm-calculator/src/index.ts | 2 + 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.nutrient_advice.$b_id.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.nutrient_advice.$b_id.tsx index ef0605278..f842dce60 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.nutrient_advice.$b_id.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.nutrient_advice.$b_id.tsx @@ -5,6 +5,7 @@ import { getFertilizerApplications, getFertilizers, getField, + withCalculationCache, } from "@svenvw/fdm-core" import { Suspense, use } from "react" import { @@ -28,6 +29,7 @@ import { getCalendar, getTimeframe } from "~/lib/calendar" import { clientConfig } from "~/lib/config" import { handleLoaderError } from "~/lib/error" import { fdm } from "~/lib/fdm.server" +import { fdmCalculator } from "@svenvw/fdm-calculator" // Meta export const meta: MetaFunction = () => { @@ -107,29 +109,45 @@ export async function loader({ request, params }: LoaderFunctionArgs) { throw handleLoaderError("missing: cultivations") } - const [ - resolvedCurrentSoilData, - resolvedFertilizerApplications, - resolvedFertilizers, - ] = await Promise.all([ + const inputs = await Promise.all([ currentSoilData, fertilizerApplications, fertilizers, ]) - // For now take the first cultivation - const b_lu_catalogue = cultivations[0].b_lu_catalogue + const [_, resolvedFertilizerApplications, resolvedFertilizers] = + inputs - const doses = calculateDose({ - applications: resolvedFertilizerApplications, - fertilizers: resolvedFertilizers, - }) + const getCalculation = withCalculationCache( + "fieldNutrientAdviceAsyncData", + fdmCalculator.calculatorVersion, + async ([ + resolvedCurrentSoilData, + resolvedFertilizerApplications, + resolvedFertilizers, + ]: typeof inputs) => { + // For now take the first cultivation + const b_lu_catalogue = cultivations[0].b_lu_catalogue + + const doses = calculateDose({ + applications: resolvedFertilizerApplications, + fertilizers: resolvedFertilizers, + }) + + // Request nutrient advice + const nutrientAdvice = await getNutrientAdvice( + b_lu_catalogue, + field.b_centroid, + resolvedCurrentSoilData, + ) - // Request nutrient advice - const nutrientAdvice = await getNutrientAdvice( - b_lu_catalogue, - field.b_centroid, - resolvedCurrentSoilData, + return [doses, nutrientAdvice] + }, + ) + + const [doses, nutrientAdvice] = await getCalculation( + fdm, + inputs, ) return { diff --git a/fdm-calculator/src/index.ts b/fdm-calculator/src/index.ts index 7b7c1a17b..ea9c3ac8a 100644 --- a/fdm-calculator/src/index.ts +++ b/fdm-calculator/src/index.ts @@ -1,3 +1,5 @@ +import pkg from "./package" +export const fdmCalculator = pkg export { calculateNitrogenBalance, getNitrogenBalance, From 776160eba7da45ece0bae9fd90050574c7d2398d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Sun, 19 Oct 2025 18:21:59 +0200 Subject: [PATCH 075/243] Add changeset --- .changeset/shaggy-bars-rule.md | 7 +++++++ .changeset/whole-lies-jog.md | 5 +++++ 2 files changed, 12 insertions(+) create mode 100644 .changeset/shaggy-bars-rule.md create mode 100644 .changeset/whole-lies-jog.md diff --git a/.changeset/shaggy-bars-rule.md b/.changeset/shaggy-bars-rule.md new file mode 100644 index 000000000..88425d689 --- /dev/null +++ b/.changeset/shaggy-bars-rule.md @@ -0,0 +1,7 @@ +--- +"@svenvw/fdm-calculator": minor +"@svenvw/fdm-core": minor +"@svenvw/fdm-app": minor +--- + +Added caching of calculations for usage norms and nitrogen balance. diff --git a/.changeset/whole-lies-jog.md b/.changeset/whole-lies-jog.md new file mode 100644 index 000000000..f058ae365 --- /dev/null +++ b/.changeset/whole-lies-jog.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-app": minor +--- + +Added caching for the NMI api responses for nutrient advice. From 06259b90ec609aaaa877dbd34fe73ba809bb0eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Sun, 19 Oct 2025 19:17:01 +0200 Subject: [PATCH 076/243] Resolve some nitpicks --- fdm-calculator/rollup.config.js | 22 +++++++++++++++++++--- fdm-core/src/calculator.ts | 1 + fdm-core/src/db/schema-calculator.ts | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/fdm-calculator/rollup.config.js b/fdm-calculator/rollup.config.js index 69b78bfe3..dbf0aabff 100644 --- a/fdm-calculator/rollup.config.js +++ b/fdm-calculator/rollup.config.js @@ -31,12 +31,28 @@ export default defineConfig({ : false, }), // Minifies the output { - renderChunk: (code) => { + renderChunk: (code, map) => { + const replacement = `"fdm-calculator:${packageJson.version}"` + + const placeholder = `"fdm-calculator:{FDM_CALCULATOR_VERSION}"` + const occurrences = code.match(new RegExp(placeholder.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'), "g")) || [] + + if (occurrences.length === 0) { + console.warn(`⚠️ Version placeholder "${placeholder}" not found in bundle`) + } else if (occurrences.length > 1) { + console.warn(`⚠️ Version placeholder "${placeholder}" appears ${occurrences.length} times`) + } + + if (replacement.length > placeholder.length) { + console.warn("⚠️ Replacement fdm-calculator version string ended up longer than the placeholder in package.ts. Source map will be broken.") + } + return { code: code.replace( - "fdm-calculator:{FDM_CALCULATOR_VERSION}", - `fdm-calculator:${packageJson.version}`, + placeholder, + replacement.padEnd(placeholder.length, " "), // Pad to not break the source map ), + map, } }, }, // Modifies bundled package.ts to contain the actual package version diff --git a/fdm-core/src/calculator.ts b/fdm-core/src/calculator.ts index 37b7eba5f..636ea4771 100644 --- a/fdm-core/src/calculator.ts +++ b/fdm-core/src/calculator.ts @@ -44,6 +44,7 @@ export async function getCachedCalculation( ), ), ) + .limit(1) return result?.length ? (result[0].result as T_Output) : null } diff --git a/fdm-core/src/db/schema-calculator.ts b/fdm-core/src/db/schema-calculator.ts index 80e08adb6..862b41ec6 100644 --- a/fdm-core/src/db/schema-calculator.ts +++ b/fdm-core/src/db/schema-calculator.ts @@ -8,7 +8,7 @@ import { } from "drizzle-orm/pg-core" export const fdmCalculatorSchema = pgSchema("fdm-calculator") -export type fdmSchemaAuthNTypeSelect = typeof fdmCalculatorSchema.table +export type fdmSchemaCalculatorTypeSelect = typeof fdmCalculatorSchema.table export const calculationCache = fdmCalculatorSchema.table( "calculation_cache", From 638c49219e73f8724a8d22db309763b7127f7572 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:27:29 +0200 Subject: [PATCH 077/243] fix: type --- fdm-core/src/grazing_intention.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-core/src/grazing_intention.ts b/fdm-core/src/grazing_intention.ts index a3bb8745a..a1c05c702 100644 --- a/fdm-core/src/grazing_intention.ts +++ b/fdm-core/src/grazing_intention.ts @@ -154,7 +154,7 @@ export async function getGrazingIntention( fdm: FdmType, principal_id: PrincipalId, b_id_farm: schema.farmsTypeSelect["b_id_farm"], - b_grazing_intention_year: number, + b_grazing_intention_year: schema.intendingGrazingTypeSelect["b_grazing_intention_year"], ): Promise { try { await checkPermission( From eb0315526d05872c2d37bb16484ed1fc7b4b749b Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:48:17 +0200 Subject: [PATCH 078/243] chore: remove outdated comment --- fdm-calculator/src/norms/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/fdm-calculator/src/norms/index.ts b/fdm-calculator/src/norms/index.ts index fee1158b8..8e2b21922 100644 --- a/fdm-calculator/src/norms/index.ts +++ b/fdm-calculator/src/norms/index.ts @@ -30,7 +30,6 @@ export function createFunctionsForFertilizerApplicationFilling( ) { if (b_region === "NL") { if (year === "2025") { - // TODO: Implement fertilizer application filling functions for NL 2025 return { collectInputForFertilizerApplicationFilling: collectInputForFertilizerApplicationFilling, From 472ae454485458a0461bc7bec0e03723dc56378c Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:48:43 +0200 Subject: [PATCH 079/243] feat: make aggregateNormFillingsToFarmLevel available --- fdm-calculator/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdm-calculator/src/index.ts b/fdm-calculator/src/index.ts index 2a23e8101..4e95b7a87 100644 --- a/fdm-calculator/src/index.ts +++ b/fdm-calculator/src/index.ts @@ -4,7 +4,7 @@ export type { FieldInput, NitrogenBalanceInput, NitrogenBalanceNumeric, - NitrogenBalanceFieldNumeric, + NitrogenBalanceFieldNumeric, NitrogenBalanceFieldResultNumeric, NitrogenEmissionAmmoniaFertilizersNumeric, NitrogenEmissionAmmoniaNumeric, @@ -24,7 +24,7 @@ export { createFunctionsForFertilizerApplicationFilling, createFunctionsForNorms, } from "./norms" -export type { AggregatedNormsToFarmLevel } from "./norms/farm" +export type { AggregatedNormsToFarmLevel, aggregateNormFillingsToFarmLevel } from "./norms/farm" export { isFieldInGWGBGebied, isFieldInNatura2000Gebied, From 8b2bf8cbd6225439cd8da76914c494b0f0c5f4a3 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:48:55 +0200 Subject: [PATCH 080/243] chore: add changeset --- .changeset/vast-paws-begin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/vast-paws-begin.md diff --git a/.changeset/vast-paws-begin.md b/.changeset/vast-paws-begin.md new file mode 100644 index 000000000..e935b24b7 --- /dev/null +++ b/.changeset/vast-paws-begin.md @@ -0,0 +1,5 @@ +--- +"@svenvw/fdm-calculator": minor +--- + +Add functions to calculate the norm filling by fertilizer application for NL 2025 From ed417fab94026902c79674c267531e53c500a37f Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:15:49 +0200 Subject: [PATCH 081/243] feat: make isValidTracesNumber and isValidSkalNumber available --- fdm-core/src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdm-core/src/index.ts b/fdm-core/src/index.ts index f2edb48cf..28618c99a 100644 --- a/fdm-core/src/index.ts +++ b/fdm-core/src/index.ts @@ -157,6 +157,8 @@ export { listOrganicCertifications, getOrganicCertification, removeOrganicCertification, + isValidSkalNumber, + isValidTracesNumber, } from "./organic" export type { OrganicCertification } from "./organic.d" export { From 675b8f083a86e4ab303c8f0eb8b592635af760f2 Mon Sep 17 00:00:00 2001 From: Sven Verweij <37927107+SvenVw@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:18:15 +0200 Subject: [PATCH 082/243] chore: add and update shadcn components --- fdm-app/app/components/ui/empty.tsx | 104 ++++++++++ fdm-app/app/components/ui/field.tsx | 242 ++++++++++++++++++++++++ fdm-app/app/components/ui/label.tsx | 34 ++-- fdm-app/app/components/ui/separator.tsx | 29 ++- fdm-app/package.json | 2 + pnpm-lock.yaml | 6 + 6 files changed, 384 insertions(+), 33 deletions(-) create mode 100644 fdm-app/app/components/ui/empty.tsx create mode 100644 fdm-app/app/components/ui/field.tsx diff --git a/fdm-app/app/components/ui/empty.tsx b/fdm-app/app/components/ui/empty.tsx new file mode 100644 index 000000000..424c1cbf2 --- /dev/null +++ b/fdm-app/app/components/ui/empty.tsx @@ -0,0 +1,104 @@ +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "~/lib/utils" + +function Empty({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +const emptyMediaVariants = cva( + "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-transparent", + icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function EmptyMedia({ + className, + variant = "default", + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
    + ) +} + +function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) { + return ( +
    a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4", + className + )} + {...props} + /> + ) +} + +function EmptyContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +export { + Empty, + EmptyHeader, + EmptyTitle, + EmptyDescription, + EmptyContent, + EmptyMedia, +} diff --git a/fdm-app/app/components/ui/field.tsx b/fdm-app/app/components/ui/field.tsx new file mode 100644 index 000000000..17bdba03d --- /dev/null +++ b/fdm-app/app/components/ui/field.tsx @@ -0,0 +1,242 @@ +import { useMemo } from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "~/lib/utils" +import { Label } from "~/components/ui/label" +import { Separator } from "~/components/ui/separator" + +function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { + return ( +
    [data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", + className + )} + {...props} + /> + ) +} + +function FieldLegend({ + className, + variant = "legend", + ...props +}: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { + return ( + + ) +} + +function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    [data-slot=field-group]]:gap-4", + className + )} + {...props} + /> + ) +} + +const fieldVariants = cva( + "group/field data-[invalid=true]:text-destructive flex w-full gap-3", + { + variants: { + orientation: { + vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"], + horizontal: [ + "flex-row items-center", + "[&>[data-slot=field-label]]:flex-auto", + "has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px has-[>[data-slot=field-content]]:items-start", + ], + responsive: [ + "@md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto flex-col [&>*]:w-full [&>.sr-only]:w-auto", + "@md/field-group:[&>[data-slot=field-label]]:flex-auto", + "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + }, + }, + defaultVariants: { + orientation: "vertical", + }, + } +) + +function Field({ + className, + orientation = "vertical", + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
    + ) +} + +function FieldContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +function FieldLabel({ + className, + ...props +}: React.ComponentProps) { + return ( +