diff --git a/app/deps.ts b/app/deps.ts index 5e02d4d53e134f19b2892816e1d1ba184f01726a..339c7690bc7ff1a0be5909311f52c0ab38397344 100644 --- a/app/deps.ts +++ b/app/deps.ts @@ -1,6 +1,6 @@ -export { serve } from "https://deno.land/std@0.156.0/http/server.ts"; export { createSchema, createYoga } from "npm:graphql-yoga@5.1.1"; export { useResponseCache } from "npm:@graphql-yoga/plugin-response-cache@1.0.0"; export { GraphQLError } from "npm:graphql@16.8.1"; export * as turf from "https://esm.sh/@turf/turf@6.5.0"; export { Client, type QueryObjectResult } from "https://deno.land/x/postgres/mod.ts"; +export { deadline, DeadlineError } from "https://deno.land/std/async/mod.ts"; diff --git a/app/server.ts b/app/server.ts index fd74a629dfe3f3655eda08fadab8dee96d08988f..ed0a47cf634d434dfea9f8f7b539faaae1d7a1b4 100644 --- a/app/server.ts +++ b/app/server.ts @@ -9,10 +9,10 @@ import { TrackEngagementViewParameters, TrackEngagementViewResponse, } from "./types.ts"; -import { createSchema, createYoga, serve, useResponseCache } from "./deps.ts"; +import { createSchema, createYoga, deadline, DeadlineError, useResponseCache } from "./deps.ts"; import { fetchCategories, fetchEngagementOpportunities, trackEngagementView } from "./voltastics.ts"; import { logger } from "./logging.ts"; -import { VolunteeringDB, VolunteeringDBConfig } from "./volunteering_db.ts"; +import { PostgresVolunteeringDB, VolunteeringDB, VolunteeringDBConfig } from "./volunteering_db.ts"; import { GeoAPIClient } from "./geo_api_client.ts"; import { Client } from "https://deno.land/x/postgres@v0.19.3/client.ts"; @@ -167,7 +167,7 @@ export interface ServerConfig { geoAPIEndpointUrl: string; } -export const createGraphQLServer = (config: ServerConfig): GraphQLServer => { +export const createGraphQLServer = (config: ServerConfig, volunteeringDB: VolunteeringDB): GraphQLServer => { const plugins = config.cacheEnabled ? [ useResponseCache({ @@ -182,6 +182,36 @@ export const createGraphQLServer = (config: ServerConfig): GraphQLServer => { }), ] : []; + const resolvers = createResolvers(config, volunteeringDB); + return createYoga({ + schema: createSchema({ resolvers, typeDefs }), + graphiql: true, + plugins, + }); +}; + +// deno-lint-ignore no-explicit-any +export type GraphQLServer = any; + +const isDbConnectionAlive = async (client: Client): Promise<Response> => { + const timeout = 10_000; + try { + const resultP = client.queryObject<{ db_connection_is_alive: boolean }>`SELECT true as db_connection_is_alive`; + const result = await deadline(resultP, timeout); + const alive = result.rowCount && result.rowCount > 0 && result.rows[0].db_connection_is_alive || false; + return new Response(`${alive}`); + } catch (e) { + if (e instanceof DeadlineError) { + console.error(`Liveness check timed out after ${timeout} ms`); + return new Response(null, { status: 503 }); + } else { + console.error("Liveness check failed, reason: ", e); + return new Response(null, { status: 500 }); + } + } +}; + +export const startServer = (config: ServerConfig): Deno.HttpServer<Deno.NetAddr> => { const client = new Client({ hostname: config.volunteeringDB.hostname, port: config.volunteeringDB.port, @@ -201,26 +231,21 @@ export const createGraphQLServer = (config: ServerConfig): GraphQLServer => { }, }); const geoAPIClient = new GeoAPIClient(config.geoAPIEndpointUrl); - const volunteeringDB = new VolunteeringDB( + const volunteeringDB = new PostgresVolunteeringDB( client, config.imageProxyBaseUrl, geoAPIClient, ); - const resolvers = createResolvers(config, volunteeringDB); - return createYoga({ - schema: createSchema({ resolvers, typeDefs }), - graphiql: true, - plugins, - }); -}; - -// deno-lint-ignore no-explicit-any -export type GraphQLServer = any; - -export const startServer = (config: ServerConfig): Promise<void> => { - const graphQLServer: GraphQLServer = createGraphQLServer(config); - return serve(graphQLServer.handleRequest, { + const graphQLServer: GraphQLServer = createGraphQLServer(config, volunteeringDB); + return Deno.serve({ port: config.port, + hostname: "0.0.0.0", + handler: (req: Request) => { + const url = new URL(req.url); + console.debug(url.pathname); + if (url.pathname.startsWith("/liveness")) return isDbConnectionAlive(client); + else return graphQLServer.handleRequest(req); + }, onListen({ port, hostname }) { logger.info( `Server started at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${port}/graphql`, diff --git a/app/voltastics_test.ts b/app/voltastics_test.ts index 7ed991ecdf2f8df4a253ece456f163cc45c3567a..4ee4ae5f80b04e1cab201ed0a0a5ada7a035e664 100644 --- a/app/voltastics_test.ts +++ b/app/voltastics_test.ts @@ -11,7 +11,14 @@ import { } from "./dev_deps.ts"; import { processGqlRequest, stubFetch } from "./common_test.ts"; -import { CategoriesResponse, EngagementsResponse } from "./types.ts"; +import { + CategoriesResponse, + EngagementParameters, + EngagementRecommendationsParameters, + EngagementResponse, + EngagementsResponse, + FilteredEngagementsParameters, +} from "./types.ts"; import { createGraphQLServer, GraphQLServer, ServerConfig, VoltasticsConfig } from "./server.ts"; import { @@ -22,6 +29,7 @@ import { Munich, } from "./voltastics_test_data.ts"; import { fetchCategories, fetchEngagementOpportunities } from "./voltastics.ts"; +import { VolunteeringDB } from "./volunteering_db.ts"; const emptyResponse = { success: true, @@ -135,6 +143,18 @@ const noCacheServerConfig = { geoAPIEndpointUrl: "fakeUrl", }; +const fakeVolunteeringDB = new (class implements VolunteeringDB { + public engagementById(_params: EngagementParameters): Promise<EngagementResponse> { + return Promise.reject(new Error("should not have been called")); + } + findRecommendations(_params: EngagementRecommendationsParameters): Promise<EngagementsResponse> { + return Promise.reject(new Error("should not have been called")); + } + filterEngagements(_params: FilteredEngagementsParameters): Promise<EngagementsResponse> { + return Promise.reject(new Error("should not have been called")); + } +})(); + describe("voltastics", () => { let fetchStub: Stub; @@ -196,7 +216,7 @@ describe("voltastics", () => { it("correctly parses engagement list", async () => { fetchStub = stubFetch(validEngagementsResponse); - const graphQLServer = createGraphQLServer(noCacheServerConfig); + const graphQLServer = createGraphQLServer(noCacheServerConfig, fakeVolunteeringDB); const result = await queryEngagementOpportunities(graphQLServer); @@ -224,7 +244,7 @@ describe("voltastics", () => { it("correctly parses category list", async () => { fetchStub = stubFetch(apiCategoriesResponse); - const graphQLServer = createGraphQLServer(noCacheServerConfig); + const graphQLServer = createGraphQLServer(noCacheServerConfig, fakeVolunteeringDB); const result = await queryCategories(graphQLServer); diff --git a/app/volunteering_db.ts b/app/volunteering_db.ts index 6891fca9a31c831e1ee4e47facb45859c73dc01b..0544f68e242ef515f942a7f4a0ac0aea60c5db1b 100644 --- a/app/volunteering_db.ts +++ b/app/volunteering_db.ts @@ -293,7 +293,13 @@ const extractTotalResultCount = ( const ERROR_CODE_NOT_FOUND = "NOT_FOUND"; -export class VolunteeringDB { +export interface VolunteeringDB { + engagementById(params: EngagementParameters): Promise<EngagementResponse>; + findRecommendations(params: EngagementRecommendationsParameters): Promise<EngagementsResponse>; + filterEngagements(params: FilteredEngagementsParameters): Promise<EngagementsResponse>; +} + +export class PostgresVolunteeringDB implements VolunteeringDB { private client: Client; private readonly imageProxyBaseUrl: string; private geoAPIClient: GeoAPIClient; diff --git a/app/volunteering_db_test.ts b/app/volunteering_db_test.ts index a75b7bc4cf1348f4ec8ba0d06f86361bd6b0f507..7aad07da1b1f08249076594dc7f5d273c1de05a2 100644 --- a/app/volunteering_db_test.ts +++ b/app/volunteering_db_test.ts @@ -9,7 +9,7 @@ import { Stub, stub, } from "./dev_deps.ts"; -import { exportedForTesting, VolunteeringDB, VolunteeringDBRow } from "./volunteering_db.ts"; +import { exportedForTesting, PostgresVolunteeringDB, VolunteeringDB, VolunteeringDBRow } from "./volunteering_db.ts"; import { Client, GraphQLError } from "./deps.ts"; import { GeoAPIClient } from "./geo_api_client.ts"; @@ -58,7 +58,7 @@ const withMockedDependencies = (queryObjectResult: VolunteeringDBRow[] = []) => "resolveGeometry", returnsNext([Promise.resolve(testGeometry)]), ); - const volunteeringDB = new VolunteeringDB( + const volunteeringDB = new PostgresVolunteeringDB( mockClient, "mock-image-proxy-base-url", mockedGeoApiClient, diff --git a/deno.json b/deno.json index 31f7928cca9237bcc5a6a611695c53e83b627d92..9a2211ac36358f48238fa62fe239096a5834e681 100644 --- a/deno.json +++ b/deno.json @@ -13,7 +13,7 @@ "docker": "docker build -t volunteering-api . && docker run -it --init -p 8004:8004 volunteering-api", "coverage": "deno test --coverage=coverage && deno coverage coverage", "pre-commit": { - "cmd": "vr lint && vr fmt:check && deno test", + "cmd": "vr fmt && vr lint && vr test", "gitHook": "pre-commit" } } diff --git a/deno.lock b/deno.lock index 7d0c01c3a34bc40b1dafb22afd4398cc0849a44c..fa5e40111d6cdfe2a7f08d05f0f0e6f559be70ae 100644 --- a/deno.lock +++ b/deno.lock @@ -12,14 +12,14 @@ "integrity": "sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig==", "dependencies": { "@envelop/types": "@envelop/types@3.0.2", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@envelop/core@5.0.0": { - "integrity": "sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==", + "@envelop/core@5.0.2": { + "integrity": "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw==", "dependencies": { "@envelop/types": "@envelop/types@5.0.0", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@envelop/response-cache@4.0.3_@envelop+core@3.0.6_graphql@16.8.1": { @@ -30,19 +30,19 @@ "fast-json-stable-stringify": "fast-json-stable-stringify@2.1.0", "graphql": "graphql@16.8.1", "lru-cache": "lru-cache@6.0.0", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@envelop/types@3.0.2": { "integrity": "sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@envelop/types@5.0.0": { "integrity": "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@envelop/validation-cache@5.1.3_@envelop+core@3.0.6_graphql@16.8.1": { @@ -52,7 +52,7 @@ "graphql": "graphql@16.8.1", "hash-it": "hash-it@6.0.0", "lru-cache": "lru-cache@6.0.0", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-tools/executor@0.0.18_graphql@16.8.1": { @@ -62,18 +62,18 @@ "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1", "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.4", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2", + "tslib": "tslib@2.7.0", "value-or-promise": "value-or-promise@1.0.12" } }, - "@graphql-tools/executor@1.2.0_graphql@16.8.1": { - "integrity": "sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==", + "@graphql-tools/executor@1.3.1_graphql@16.8.1": { + "integrity": "sha512-tgJDdGf9SCAm64ofEMZdv925u6/J+eTmv36TGNLxgP2DpCJsZ6gnJ4A+0D28EazDXqJIvMiPd+3d+o3cCRCAnQ==", "dependencies": { - "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1", + "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1", "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1", - "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5", + "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2", + "tslib": "tslib@2.7.0", "value-or-promise": "value-or-promise@1.0.12" } }, @@ -82,24 +82,24 @@ "dependencies": { "@graphql-tools/utils": "@graphql-tools/utils@9.2.1_graphql@16.8.1", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@graphql-tools/merge@9.0.1_graphql@16.8.1": { - "integrity": "sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==", + "@graphql-tools/merge@9.0.7_graphql@16.8.1": { + "integrity": "sha512-lbTrIuXIbUSmSumHkPRY1QX0Z8JEtmRhnIrkH7vkfeEmf0kNn/nCWvJwqokm5U7L+a+DA1wlRM4slIlbfXjJBA==", "dependencies": { - "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1", + "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@graphql-tools/schema@10.0.2_graphql@16.8.1": { - "integrity": "sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==", + "@graphql-tools/schema@10.0.6_graphql@16.8.1": { + "integrity": "sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==", "dependencies": { - "@graphql-tools/merge": "@graphql-tools/merge@9.0.1_graphql@16.8.1", - "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1", + "@graphql-tools/merge": "@graphql-tools/merge@9.0.7_graphql@16.8.1", + "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2", + "tslib": "tslib@2.7.0", "value-or-promise": "value-or-promise@1.0.12" } }, @@ -109,25 +109,25 @@ "@graphql-tools/merge": "@graphql-tools/merge@8.4.2_graphql@16.8.1", "@graphql-tools/utils": "@graphql-tools/utils@9.2.1_graphql@16.8.1", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2", + "tslib": "tslib@2.7.0", "value-or-promise": "value-or-promise@1.0.12" } }, - "@graphql-tools/utils@10.0.13_graphql@16.8.1": { - "integrity": "sha512-fMILwGr5Dm2zefNItjQ6C2rauigklv69LIwppccICuGTnGaOp3DspLt/6Lxj72cbg5d9z60Sr+Egco3CJKLsNg==", + "@graphql-tools/utils@10.5.4_graphql@16.8.1": { + "integrity": "sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==", "dependencies": { "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1", - "cross-inspect": "cross-inspect@1.0.0", + "cross-inspect": "cross-inspect@1.0.1", "dset": "dset@3.1.3", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-tools/utils@8.13.1_graphql@16.8.1": { "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", "dependencies": { "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-tools/utils@9.2.1_graphql@16.8.1": { @@ -135,7 +135,7 @@ "dependencies": { "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1", "graphql": "graphql@16.8.1", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1": { @@ -147,13 +147,13 @@ "@graphql-yoga/logger@0.0.1": { "integrity": "sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-yoga/logger@2.0.0": { "integrity": "sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@graphql-yoga/plugin-response-cache@1.0.0_graphql@16.8.1_graphql-yoga@3.9.1__graphql@16.8.1__@envelop+core@3.0.6": { @@ -168,68 +168,68 @@ "integrity": "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==", "dependencies": { "@graphql-yoga/typed-event-target": "@graphql-yoga/typed-event-target@1.0.0", - "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5", + "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6", "@whatwg-node/events": "@whatwg-node/events@0.0.2", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@graphql-yoga/subscription@5.0.0": { - "integrity": "sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==", + "@graphql-yoga/subscription@5.0.1": { + "integrity": "sha512-1wCB1DfAnaLzS+IdoOzELGGnx1ODEg9nzQXFh4u2j02vAnne6d+v4A7HIH9EqzVdPLoAaMKXCZUUdKs+j3z1fg==", "dependencies": { "@graphql-yoga/typed-event-target": "@graphql-yoga/typed-event-target@3.0.0", - "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5", - "@whatwg-node/events": "@whatwg-node/events@0.1.1", - "tslib": "tslib@2.6.2" + "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6", + "@whatwg-node/events": "@whatwg-node/events@0.1.2", + "tslib": "tslib@2.7.0" } }, "@graphql-yoga/typed-event-target@1.0.0": { "integrity": "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==", "dependencies": { - "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5", - "tslib": "tslib@2.6.2" + "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6", + "tslib": "tslib@2.7.0" } }, "@graphql-yoga/typed-event-target@3.0.0": { "integrity": "sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==", "dependencies": { - "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5", - "tslib": "tslib@2.6.2" + "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6", + "tslib": "tslib@2.7.0" } }, "@kamilkisiela/fast-url-parser@1.1.4": { "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==", "dependencies": {} }, - "@peculiar/asn1-schema@2.3.8": { - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "@peculiar/asn1-schema@2.3.13": { + "integrity": "sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==", "dependencies": { "asn1js": "asn1js@3.0.5", "pvtsutils": "pvtsutils@1.3.5", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@peculiar/json-schema@1.1.12": { "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@peculiar/webcrypto@1.4.5": { - "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", + "@peculiar/webcrypto@1.5.0": { + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", "dependencies": { - "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.8", + "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.13", "@peculiar/json-schema": "@peculiar/json-schema@1.1.12", "pvtsutils": "pvtsutils@1.3.5", - "tslib": "tslib@2.6.2", - "webcrypto-core": "webcrypto-core@1.7.8" + "tslib": "tslib@2.7.0", + "webcrypto-core": "webcrypto-core@1.8.0" } }, "@repeaterjs/repeater@3.0.4": { "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", "dependencies": {} }, - "@repeaterjs/repeater@3.0.5": { - "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==", + "@repeaterjs/repeater@3.0.6": { + "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", "dependencies": {} }, "@types/node@18.16.19": { @@ -244,24 +244,26 @@ "integrity": "sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==", "dependencies": {} }, - "@whatwg-node/events@0.1.1": { - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "dependencies": {} + "@whatwg-node/events@0.1.2": { + "integrity": "sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==", + "dependencies": { + "tslib": "tslib@2.7.0" + } }, "@whatwg-node/fetch@0.8.8": { "integrity": "sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==", "dependencies": { - "@peculiar/webcrypto": "@peculiar/webcrypto@1.4.5", + "@peculiar/webcrypto": "@peculiar/webcrypto@1.5.0", "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.3.6", "busboy": "busboy@1.6.0", "urlpattern-polyfill": "urlpattern-polyfill@8.0.2", - "web-streams-polyfill": "web-streams-polyfill@3.3.2" + "web-streams-polyfill": "web-streams-polyfill@3.3.3" } }, - "@whatwg-node/fetch@0.9.16": { - "integrity": "sha512-mqasZiUNquRe3ea9+aCAuo81BR6vq5opUKprPilIHTnrg8a21Z1T1OrI+KiMFX8OmwO5HUJe/vro47lpj2JPWQ==", + "@whatwg-node/fetch@0.9.21": { + "integrity": "sha512-Wt0jPb+04JjobK0pAAN7mEHxVHcGA9HoP3OyCsZtyAecNQeADXCZ1MihFwVwjsgaRYuGVmNlsCmLxlG6mor8Gw==", "dependencies": { - "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.5.6", + "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.5.26", "urlpattern-polyfill": "urlpattern-polyfill@10.0.0" } }, @@ -272,31 +274,30 @@ "busboy": "busboy@1.6.0", "fast-querystring": "fast-querystring@1.1.2", "fast-url-parser": "fast-url-parser@1.1.3", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@whatwg-node/node-fetch@0.5.6": { - "integrity": "sha512-cmAsGMHoI0S3AHi3CmD3ma1Q234ZI2JNmXyDyM9rLtbXejBKxU3ZWdhS+mzRIAyUxZCMGlFW1tHmROv0MDdxpw==", + "@whatwg-node/node-fetch@0.5.26": { + "integrity": "sha512-4jXDeZ4IH4bylZ6wu14VEx0aDXXhrN4TC279v9rPmn08g4EYekcYf8wdcOOnS9STjDkb6x77/6xBUTqxGgjr8g==", "dependencies": { "@kamilkisiela/fast-url-parser": "@kamilkisiela/fast-url-parser@1.1.4", - "@whatwg-node/events": "@whatwg-node/events@0.1.1", "busboy": "busboy@1.6.0", "fast-querystring": "fast-querystring@1.1.2", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "@whatwg-node/server@0.7.7": { "integrity": "sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==", "dependencies": { "@whatwg-node/fetch": "@whatwg-node/fetch@0.8.8", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, - "@whatwg-node/server@0.9.25": { - "integrity": "sha512-DlPqPPcfyzh4/9Lz1fl4c5bZsGp/1wCh7B+cK8FE1bWoW7tlZkVguvGn/XnYPKthGzEIwo/fLdHwevH44z+eeg==", + "@whatwg-node/server@0.9.49": { + "integrity": "sha512-3KzLXw80gWnTsQ746G/LFdCThTPfDodjQs4PnmoNuPa6XUOl4HWq8TlJpxtmnEEB+y+UYLal+3VQ68dtYlbUDQ==", "dependencies": { - "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.16", - "tslib": "tslib@2.6.2" + "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.21", + "tslib": "tslib@2.7.0" } }, "asn1js@3.0.5": { @@ -304,7 +305,7 @@ "dependencies": { "pvtsutils": "pvtsutils@1.3.5", "pvutils": "pvutils@1.1.3", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "busboy@1.6.0": { @@ -313,10 +314,10 @@ "streamsearch": "streamsearch@1.1.0" } }, - "cross-inspect@1.0.0": { - "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", + "cross-inspect@1.0.1": { + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "dset@3.1.3": { @@ -358,24 +359,24 @@ "dset": "dset@3.1.3", "graphql": "graphql@16.8.1", "lru-cache": "lru-cache@7.18.3", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "graphql-yoga@5.1.1_graphql@16.8.1": { "integrity": "sha512-oak5nVKTHpqJgpA1aT3cJPOlCidrW7l6nbc5L6w07VdFul16ielGI2ZnQDAXO+qQih09/4WspD5x0SsSZH+hkg==", "dependencies": { - "@envelop/core": "@envelop/core@5.0.0", - "@graphql-tools/executor": "@graphql-tools/executor@1.2.0_graphql@16.8.1", - "@graphql-tools/schema": "@graphql-tools/schema@10.0.2_graphql@16.8.1", - "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1", + "@envelop/core": "@envelop/core@5.0.2", + "@graphql-tools/executor": "@graphql-tools/executor@1.3.1_graphql@16.8.1", + "@graphql-tools/schema": "@graphql-tools/schema@10.0.6_graphql@16.8.1", + "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1", "@graphql-yoga/logger": "@graphql-yoga/logger@2.0.0", - "@graphql-yoga/subscription": "@graphql-yoga/subscription@5.0.0", - "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.16", - "@whatwg-node/server": "@whatwg-node/server@0.9.25", + "@graphql-yoga/subscription": "@graphql-yoga/subscription@5.0.1", + "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.21", + "@whatwg-node/server": "@whatwg-node/server@0.9.49", "dset": "dset@3.1.3", "graphql": "graphql@16.8.1", - "lru-cache": "lru-cache@10.2.0", - "tslib": "tslib@2.6.2" + "lru-cache": "lru-cache@10.4.3", + "tslib": "tslib@2.7.0" } }, "graphql@16.8.1": { @@ -386,8 +387,8 @@ "integrity": "sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==", "dependencies": {} }, - "lru-cache@10.2.0": { - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dependencies": {} }, "lru-cache@6.0.0": { @@ -407,7 +408,7 @@ "pvtsutils@1.3.5": { "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", "dependencies": { - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "pvutils@1.1.3": { @@ -418,8 +419,8 @@ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "dependencies": {} }, - "tslib@2.6.2": { - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "tslib@2.7.0": { + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "dependencies": {} }, "urlpattern-polyfill@10.0.0": { @@ -434,18 +435,18 @@ "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", "dependencies": {} }, - "web-streams-polyfill@3.3.2": { - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "web-streams-polyfill@3.3.3": { + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dependencies": {} }, - "webcrypto-core@1.7.8": { - "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", + "webcrypto-core@1.8.0": { + "integrity": "sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==", "dependencies": { - "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.8", + "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.13", "@peculiar/json-schema": "@peculiar/json-schema@1.1.12", "asn1js": "asn1js@3.0.5", "pvtsutils": "pvtsutils@1.3.5", - "tslib": "tslib@2.6.2" + "tslib": "tslib@2.7.0" } }, "yallist@4.0.0": { @@ -455,6 +456,7 @@ } }, "redirects": { + "https://deno.land/std/async/mod.ts": "https://deno.land/std@0.224.0/async/mod.ts", "https://deno.land/x/postgres/mod.ts": "https://deno.land/x/postgres@v0.19.3/mod.ts" }, "remote": { @@ -475,7 +477,6 @@ "https://deno.land/std@0.156.0/async/pool.ts": "ef9eb97b388543acbf0ac32647121e4dbe629236899586c4d4311a8770fbb239", "https://deno.land/std@0.156.0/async/tee.ts": "d27680d911816fcb3d231e16d690e7588079e66a9b2e5ce8cc354db94fdce95f", "https://deno.land/std@0.156.0/http/server.ts": "c1bce1cbf4060055f622d5c3f0e406fd553e5dca111ca836d28c6268f170ebeb", - "https://deno.land/std@0.170.0/encoding/base64.ts": "8605e018e49211efc767686f6f687827d7f5fd5217163e981d8d693105640d7a", "https://deno.land/std@0.214.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", "https://deno.land/std@0.214.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", "https://deno.land/std@0.214.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", @@ -576,8 +577,18 @@ "https://deno.land/std@0.214.0/path/windows/separator.ts": "e51c5522140eff4f8402617c5c68a201fdfa3a1a8b28dc23587cff931b665e43", "https://deno.land/std@0.214.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484", "https://deno.land/std@0.214.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", - "https://deno.land/x/cliffy@v0.25.7/ansi/ansi_escapes.ts": "885f61f343223f27b8ec69cc138a54bea30542924eacd0f290cd84edcf691387", - "https://deno.land/x/cliffy@v0.25.7/ansi/deps.ts": "0f35cb7e91868ce81561f6a77426ea8bc55dc15e13f84c7352f211023af79053", + "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", + "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", + "https://deno.land/std@0.224.0/async/_util.ts": "3e94e674c974c5c9277f6b3ba2d4e8403c320ba5cebb891f50afa3af4b8e0ac9", + "https://deno.land/std@0.224.0/async/abortable.ts": "ea6ddb98c1c6f066d5b26c8fd030e2d5afa54571182674aa07929c39dfa8c5b2", + "https://deno.land/std@0.224.0/async/deadline.ts": "008929d69b1efdd11b1fa55784bb4882add6adf8722868b26e87f68e35efc573", + "https://deno.land/std@0.224.0/async/debounce.ts": "e7bcccb17b6fe34646ac5d37c2a6d3830ca049e7e3534d2aace4001596f42eff", + "https://deno.land/std@0.224.0/async/delay.ts": "f90dd685b97c2f142b8069082993e437b1602b8e2561134827eeb7c12b95c499", + "https://deno.land/std@0.224.0/async/mod.ts": "ae2b6869ad7563f825e037e02c263507da4a55563b4a0bcd9079d2c3eb2670a2", + "https://deno.land/std@0.224.0/async/mux_async_iterator.ts": "8d960e951c7bf6cb682522c2ebf5bd3e738b27c6a7ac9500ab64d27054930972", + "https://deno.land/std@0.224.0/async/pool.ts": "2b972e3643444b73f6a8bcdd19799a2d0821b28a45fbe47fd333223eb84327f0", + "https://deno.land/std@0.224.0/async/retry.ts": "29025b09259c22123c599b8c957aeff2755854272954776dc9a5846c72ea4cfe", + "https://deno.land/std@0.224.0/async/tee.ts": "34373c58950b7ac5950632dc8c9908076abeefcc9032d6299fff92194c284fbd", "https://deno.land/x/postgres@v0.19.3/client.ts": "d141c65c20484c545a1119c9af7a52dcc24f75c1a5633de2b9617b0f4b2ed5c1", "https://deno.land/x/postgres@v0.19.3/client/error.ts": "05b0e35d65caf0ba21f7f6fab28c0811da83cd8b4897995a2f411c2c83391036", "https://deno.land/x/postgres@v0.19.3/connection/auth.ts": "db15c1659742ef4d2791b32834950278dc7a40cb931f8e434e6569298e58df51", @@ -602,154 +613,6 @@ "https://deno.land/x/postgres@v0.19.3/utils/deferred.ts": "5420531adb6c3ea29ca8aac57b9b59bd3e4b9a938a4996bbd0947a858f611080", "https://deno.land/x/postgres@v0.19.3/utils/utils.ts": "ca47193ea03ff5b585e487a06f106d367e509263a960b787197ce0c03113a738", "https://esm.sh/@turf/turf@6.5.0": "1b89eb65070928dd870eb2317386f35192ccc1145242946ba7725432eb5fe547", - "https://esm.sh/@turf/turf@6.5.0?pin=v129": "7f21ae610c2aec13c5be97bf136d4a181fdf28b24388af159d06bcf875f1c077", - "https://esm.sh/v129/@turf/along@6.5.0/denonext/along.mjs": "44414b0849204c9af40fa921158b10bae68b342ee8211d29fdbb79ad5b254f7b", - "https://esm.sh/v129/@turf/angle@6.5.0/denonext/angle.mjs": "c9b09724eedf7bea2a4f250cf6ab7f19873b5c5c1e34ccf678f810128711eaee", - "https://esm.sh/v129/@turf/area@6.5.0/denonext/area.mjs": "403cd9e934e2943d3415cd8edd93bd3da80869ab5af66b8d7057d90082842066", - "https://esm.sh/v129/@turf/bbox-clip@6.5.0/denonext/bbox-clip.mjs": "545a95113194f7d5d2ea98812d2b2eebbf67ed598269a4b0dd2d6e362d10b6a6", - "https://esm.sh/v129/@turf/bbox-polygon@6.5.0/denonext/bbox-polygon.mjs": "77fd123ae75b6b5e567e3eebec40fbbfdc4ce107c8fee6b07b1c8142e1dfcb81", - "https://esm.sh/v129/@turf/bbox@6.5.0/denonext/bbox.mjs": "6542931c9150d0ed060e00838ccdebe91ed40a66b529325df547ca63ce261bd5", - "https://esm.sh/v129/@turf/bearing@6.5.0/denonext/bearing.mjs": "d675a86d42facf1bde45b298c695a23afdaa6dbaa5ed7a06c7455e6727f33b17", - "https://esm.sh/v129/@turf/bezier-spline@6.5.0/denonext/bezier-spline.mjs": "635b13a77e535398c7eb845eec9d066b8751f3778cdfdaa7cbe7cac7054a247b", - "https://esm.sh/v129/@turf/boolean-clockwise@6.5.0/denonext/boolean-clockwise.mjs": "f7b70463a9f9c67617b9f4a5dbaba847bcdecc5ea91e8613f3dbc318e6d9278c", - "https://esm.sh/v129/@turf/boolean-contains@6.5.0/denonext/boolean-contains.mjs": "6c22ccc6a770d80faa1a4d2a52da81d6a480ac4a81b11c388409a0b2cb7d0afd", - "https://esm.sh/v129/@turf/boolean-crosses@6.5.0/denonext/boolean-crosses.mjs": "3bde85b4a96aa38c8d16be59f2bd3d9aee6666dcdc1878eb804cbdbc48dadb1d", - "https://esm.sh/v129/@turf/boolean-disjoint@6.5.0/denonext/boolean-disjoint.mjs": "fc4f8c5c3b2d013b088141791b2167e95d47fe10395bfbfe614f5f5e0d726202", - "https://esm.sh/v129/@turf/boolean-equal@6.5.0/denonext/boolean-equal.mjs": "9df7a9ceceb5a5056280d04c4560680b2b82b3f27e7d839a6bf7183c80a47ecb", - "https://esm.sh/v129/@turf/boolean-intersects@6.5.0/denonext/boolean-intersects.mjs": "9a9799ada0099a5f04e2302f83c8c8b48bd6289ea7fb7d302fb06804ae09bec3", - "https://esm.sh/v129/@turf/boolean-overlap@6.5.0/denonext/boolean-overlap.mjs": "8622709d7184a3f886a301ba8a553beb02f77dbc40ee622b731ad0acedbac70e", - "https://esm.sh/v129/@turf/boolean-parallel@6.5.0/denonext/boolean-parallel.mjs": "7f94e3751b6639762d87a0fafc6ee2d3b7d49d3b64a2167907d8c4ad871226db", - "https://esm.sh/v129/@turf/boolean-point-in-polygon@6.5.0/denonext/boolean-point-in-polygon.mjs": "e7b8e0a4e83fcdffba4f90ccdb032ce764e4bd9e3f698aafbb3d9d1a0e93ef4f", - "https://esm.sh/v129/@turf/boolean-point-on-line@6.5.0/denonext/boolean-point-on-line.mjs": "6c940922cedf1f6c00722312a79cf278be54d75179314a1593ad1d87ab4b0f94", - "https://esm.sh/v129/@turf/boolean-within@6.5.0/denonext/boolean-within.mjs": "b6c11e7a2bda52a8d91c0e561c4c5f11fc64c8bbb0f877a5f729f80752a04b3e", - "https://esm.sh/v129/@turf/buffer@6.5.0/denonext/buffer.mjs": "568d6a67715899f792e3bf48703bec13fb2e99b0a3569a5cebd2d1b359a44e93", - "https://esm.sh/v129/@turf/center-mean@6.5.0/denonext/center-mean.mjs": "f0dc4e039337e88283f6e6fe18d947c852168107e3bce46a2be2c9fc479cd109", - "https://esm.sh/v129/@turf/center-median@6.5.0/denonext/center-median.mjs": "14c886ec35a2ac54371a3c51cb88f8292a00c817980da19d53ba4c5f87fd28fe", - "https://esm.sh/v129/@turf/center-of-mass@6.5.0/denonext/center-of-mass.mjs": "cde4b7ff17ca1bf109b24177d467ccd8e7449d8b76b6c9d8614bf4e69177be2f", - "https://esm.sh/v129/@turf/center@6.5.0/denonext/center.mjs": "a80050a48a9d3c872d5187dd861f55590c244c08a301279cfa4d45a3e1ed2185", - "https://esm.sh/v129/@turf/centroid@6.5.0/denonext/centroid.mjs": "23ae0d310225330464fbba9c636c6aad2d06980850552e197325870eb3affc37", - "https://esm.sh/v129/@turf/circle@6.5.0/denonext/circle.mjs": "c03ed4041e91321d01aa7c0633debac471e1c39d708de83680e95260808610b0", - "https://esm.sh/v129/@turf/clean-coords@6.5.0/denonext/clean-coords.mjs": "fa19c67ef4671ed8cf6948b98b43d9399d3b02e661733dc7dd05c98c51b6811b", - "https://esm.sh/v129/@turf/clone@6.5.0/denonext/clone.mjs": "f9dcf99c95e00476bb006f9ac2aaa5ebaa3c2360002869c1dbae9ba708a08071", - "https://esm.sh/v129/@turf/clusters-dbscan@6.5.0/denonext/clusters-dbscan.mjs": "03ad688734c7b5e0dff9b67a77b239a80e61b70861606178e37392165a44af2d", - "https://esm.sh/v129/@turf/clusters-kmeans@6.5.0/denonext/clusters-kmeans.mjs": "a7e825bb00ae84f6fff65093ba530188e37d903d3f4e94a0ce7ea54a78dc0461", - "https://esm.sh/v129/@turf/clusters@6.5.0/denonext/clusters.mjs": "ac41f3f572813ecd7d945e9ebebe9b6e76531c541f90edc201563ee06c2cf87e", - "https://esm.sh/v129/@turf/collect@6.5.0/denonext/collect.mjs": "cf4efee3268bf5b6c004ca5a749a5ec0d003483ee89e544e026b49e9eb4d40b1", - "https://esm.sh/v129/@turf/combine@6.5.0/denonext/combine.mjs": "dccfdb227ef2cd7df996f32f142e6bc19f9d1171fb478030ce836a512e216c0a", - "https://esm.sh/v129/@turf/concave@6.5.0/denonext/concave.mjs": "19da00579571e61504fd6dd31ea1df58f3824b3d0dea24403eb5855741450efc", - "https://esm.sh/v129/@turf/convex@6.5.0/denonext/convex.mjs": "2400dda4ae59660e4615e548674cbbaa8b5b6d3ebb44caae642a9c74b5b97809", - "https://esm.sh/v129/@turf/destination@6.5.0/denonext/destination.mjs": "f0c17b8bef1cb915750aa9fd4e04a29357244e9e1fde9147098e43853a89094e", - "https://esm.sh/v129/@turf/difference@6.5.0/denonext/difference.mjs": "015601f93aae5c3e79b55aa27b57cfbf74ddbfff5413864dd02c6c62e6346ebb", - "https://esm.sh/v129/@turf/dissolve@6.5.0/denonext/dissolve.mjs": "f6241adb4b61cd2bb7ba90399b71da5230c1db8321803bbb55f3a9aa2137b4ef", - "https://esm.sh/v129/@turf/distance-weight@6.5.0/denonext/distance-weight.mjs": "4820ca7173a7122885a62e7fa3c82ea04a3e6f6f8061a6a24de83c2646e9c84f", - "https://esm.sh/v129/@turf/distance@6.5.0/denonext/distance.mjs": "64638e5bcee0dfa28af53c8ba1615282eb555328a8773184a98b5bc8bf097475", - "https://esm.sh/v129/@turf/ellipse@6.5.0/denonext/ellipse.mjs": "127266a576d672f6663262ad58dc8d0280a37497448473d5856ab62b663573c0", - "https://esm.sh/v129/@turf/envelope@6.5.0/denonext/envelope.mjs": "87b5da57a3cb92cacd1baff8cd81bc7f28f603cb05c836f4a350aa07f76b111d", - "https://esm.sh/v129/@turf/explode@6.5.0/denonext/explode.mjs": "f2addac95236611695042fb6c57350ad915b8e329df7a1b499e86ff8b0da48f8", - "https://esm.sh/v129/@turf/flatten@6.5.0/denonext/flatten.mjs": "78fe2fafca48cf1e5de83092653393bcdb5df0adb656fc4533be2b63d5aff641", - "https://esm.sh/v129/@turf/flip@6.5.0/denonext/flip.mjs": "057d9c921cbc25e20e38f5322687bfd49ad28e2151f1f93a6c4bdd42a6527552", - "https://esm.sh/v129/@turf/great-circle@6.5.0/denonext/great-circle.mjs": "aafe10d6d804e6cf4de0999840b4344eec81fc30dc5d757d01024db0acae868c", - "https://esm.sh/v129/@turf/helpers@6.5.0/denonext/helpers.mjs": "3fdabda7695d541fd0715ed5930ff747f9b2149c917b4530665ac8cc0c769d5c", - "https://esm.sh/v129/@turf/hex-grid@6.5.0/denonext/hex-grid.mjs": "0e075fe14fcdf13e2fbeaaf910aeb7ff51885edd3c6a94e7d8855067d2009760", - "https://esm.sh/v129/@turf/interpolate@6.5.0/denonext/interpolate.mjs": "2b5f9e25a6ad170b7da27c4365ab3319f31c3a92a28fd96cbf48bd142bc497c9", - "https://esm.sh/v129/@turf/intersect@6.5.0/denonext/intersect.mjs": "577e7471fb711a7e8840f2c36a91cc28591d97ba27c904e73e225398febd090b", - "https://esm.sh/v129/@turf/invariant@6.5.0/denonext/invariant.mjs": "b95db9d9a995a94ada069b4c6e62da04b90eeda521300fd5f6959176640d6f09", - "https://esm.sh/v129/@turf/isobands@6.5.0/denonext/isobands.mjs": "c288f0582d22545e5181fd5d67b65abf3b20452e782ef4903320fbe6931871e1", - "https://esm.sh/v129/@turf/isolines@6.5.0/denonext/isolines.mjs": "bcc99c57d1598e84a16ef5925fe2726e44e500fe777878a8f6dac79849ed4ded", - "https://esm.sh/v129/@turf/kinks@6.5.0/denonext/kinks.mjs": "370c66f62a1ab9be45b2ca08e5fcd535e197b7d8aac1bcc1e6d1968e4411f162", - "https://esm.sh/v129/@turf/length@6.5.0/denonext/length.mjs": "3ae387f3f62ac526cb7c0dfa96fd2d8f5e7f3db888aed12ed697461e6ff35ed2", - "https://esm.sh/v129/@turf/line-arc@6.5.0/denonext/line-arc.mjs": "67500316840fc25529104bcc3a3c89785755e5265d33c692d24868f902166936", - "https://esm.sh/v129/@turf/line-chunk@6.5.0/denonext/line-chunk.mjs": "2dc3ab5661734aa020be8edf4cd6c1cbabe35d883613bb446a3159ac7ff22139", - "https://esm.sh/v129/@turf/line-intersect@6.5.0/denonext/line-intersect.mjs": "93fe77c2406b0ef81a455a89e9b21ad1ccd4a311782c894d65c19c88f60747b7", - "https://esm.sh/v129/@turf/line-offset@6.5.0/denonext/line-offset.mjs": "d4e15ae69b65e1809062970fa710b93e2da385e6f6b7b5209a63ddc41ff2da55", - "https://esm.sh/v129/@turf/line-overlap@6.5.0/denonext/line-overlap.mjs": "d2f10cfa6fa7acc580a91c6bb2587293573b9a204f465b1ff91ed68f77760315", - "https://esm.sh/v129/@turf/line-segment@6.5.0/denonext/line-segment.mjs": "84036250318905cc4c7916c2a879a966c71aca2659aaf794e14a0d724030f425", - "https://esm.sh/v129/@turf/line-slice-along@6.5.0/denonext/line-slice-along.mjs": "58469549cb2dca8d00645667174fe033e47c437b0b1bfda74cbd2f1c2c58c1c1", - "https://esm.sh/v129/@turf/line-slice@6.5.0/denonext/line-slice.mjs": "3b492f5dc0c19419eef3f3b2a7c51fc33f0362aeec06ed6376d9ac67ce32506b", - "https://esm.sh/v129/@turf/line-split@6.5.0/denonext/line-split.mjs": "06e0e52b4ff7d74bc0c0fc0c21bdbe5410dace9765d8806786f52728f44603b8", - "https://esm.sh/v129/@turf/line-to-polygon@6.5.0/denonext/line-to-polygon.mjs": "99e53e7af0eb7515aab9de5d61a952547075b85f465043032cebbdb0f908cddd", - "https://esm.sh/v129/@turf/mask@6.5.0/denonext/mask.mjs": "c997ffa17373ac7c353e55cb2938f1825e855a3af2290c81c9b3762189972d02", - "https://esm.sh/v129/@turf/meta@6.5.0/denonext/meta.mjs": "c952de931f49cf1a123bbb0361a3d7646f2da96facd984e1fd01a39b6bb6d338", - "https://esm.sh/v129/@turf/midpoint@6.5.0/denonext/midpoint.mjs": "4b699b9bcbfd67d67beab4fa2bfe6e048ad8ec719af3dd8136e08f04d1936a9f", - "https://esm.sh/v129/@turf/moran-index@6.5.0/denonext/moran-index.mjs": "0e11787d4dba15fce94ecf711f4d4f5af68919bb957a89735704079c451361d6", - "https://esm.sh/v129/@turf/nearest-point-on-line@6.5.0/denonext/nearest-point-on-line.mjs": "c531dae2b4da8be9c530cbeac63fd07d19e2d11f7586a992414b6b8e132543c4", - "https://esm.sh/v129/@turf/nearest-point-to-line@6.5.0/denonext/nearest-point-to-line.mjs": "db7162ca6ed4d900e41ce3792aa25c74673f06f475259558bc839527142c3869", - "https://esm.sh/v129/@turf/nearest-point@6.5.0/denonext/nearest-point.mjs": "eda341fd2d8145dcf7c659d38bdb3c39cd436ab738d25a9bbc4eaf8c8b5f8dd6", - "https://esm.sh/v129/@turf/planepoint@6.5.0/denonext/planepoint.mjs": "1e63bb4297acafe776666d000f39c59be3681f6d579429aa8287504f7e9af207", - "https://esm.sh/v129/@turf/point-grid@6.5.0/denonext/point-grid.mjs": "2e77e6ac87757311c856b91b5d3ded5715f710c0cbec0e9747c51980dea072d5", - "https://esm.sh/v129/@turf/point-on-feature@6.5.0/denonext/point-on-feature.mjs": "f7562baf344c5eddfa83aeab61a1c109ca9149084e35f184f111b0f8c5737c35", - "https://esm.sh/v129/@turf/point-to-line-distance@6.5.0/denonext/point-to-line-distance.mjs": "5dd083ac1bbcf3cfca2fc35931d3fdd8fb9630982c873caeb28463274b9e4aed", - "https://esm.sh/v129/@turf/points-within-polygon@6.5.0/denonext/points-within-polygon.mjs": "b83a1b2f1e1ac67c5ba63a37fbf767af28f877532bdee3cc7f35f69af1ca0fa1", - "https://esm.sh/v129/@turf/polygon-smooth@6.5.0/denonext/polygon-smooth.mjs": "8d8181536d096c3e0a73b8b87b3baa889cdd3ec59e7679d0c44022595781b8f9", - "https://esm.sh/v129/@turf/polygon-tangents@6.5.0/denonext/polygon-tangents.mjs": "074621c2528ace81daf21332647c15fd21ff0787692c571d19314d6cb37059ad", - "https://esm.sh/v129/@turf/polygon-to-line@6.5.0/denonext/polygon-to-line.mjs": "6eab9436703a8a7082eea9bc16767bbdb3bb9b56d8de4b6a03c6b2a7dd4f1083", - "https://esm.sh/v129/@turf/polygonize@6.5.0/denonext/polygonize.mjs": "c001bb5bf1133e44397a2723c1bf11705c08c6d3ac4b0dee5ee75289cfc96a1d", - "https://esm.sh/v129/@turf/projection@6.5.0/denonext/projection.mjs": "774d67079ac20c177a4ee0596b336a133a97b923b43892293603bc4e431e31d7", - "https://esm.sh/v129/@turf/random@6.5.0/denonext/random.mjs": "31037b7d83d420fc49dab383c7b44a1e102ef65e9d3559307c1c2734741c79a6", - "https://esm.sh/v129/@turf/rectangle-grid@6.5.0/denonext/rectangle-grid.mjs": "1229f5e52208e91ac521e1d6864053226bcc55ec550896d18ed1677db6bd01a1", - "https://esm.sh/v129/@turf/rewind@6.5.0/denonext/rewind.mjs": "b396dcc12c12d38f12decf0e46de65f8f61d8f4050ffbdb39903c99d6d5c299d", - "https://esm.sh/v129/@turf/rhumb-bearing@6.5.0/denonext/rhumb-bearing.mjs": "c56524a4bfba12013cee26c1f5df1450140bc8d1b329aa358f4614dded2f210d", - "https://esm.sh/v129/@turf/rhumb-destination@6.5.0/denonext/rhumb-destination.mjs": "673561a3934415c366848b007bc8758f74184bdd77a08a30f6f75cf106e6970b", - "https://esm.sh/v129/@turf/rhumb-distance@6.5.0/denonext/rhumb-distance.mjs": "c6150adf0b77ddf572d18736bd9a4d1c6a1ea1cc29a3e0ed2e366a1b38c5e5dc", - "https://esm.sh/v129/@turf/sample@6.5.0/denonext/sample.mjs": "44bd79393b4311aaed9e28fb480e88ee9e3ecb9322f7ef79ff3bdb793c517264", - "https://esm.sh/v129/@turf/sector@6.5.0/denonext/sector.mjs": "4fe647c990e9a21c87f1cf49d79d49a8bd748beeec5166bdfbc66cd2f1a65ff8", - "https://esm.sh/v129/@turf/shortest-path@6.5.0/denonext/shortest-path.mjs": "234f71e103b6739250ac9c74f2801b34ae52d512cb3952d1ef840e4547cbea44", - "https://esm.sh/v129/@turf/simplify@6.5.0/denonext/simplify.mjs": "12d1210caec54f0d4c787e182543e2d2afd83703a6f885138081f9775c6f1a64", - "https://esm.sh/v129/@turf/square-grid@6.5.0/denonext/square-grid.mjs": "e1ac9f165fac9ff76a365dc7c17f8d57d6952d6c7a7b7247a5bb0009b08db679", - "https://esm.sh/v129/@turf/square@6.5.0/denonext/square.mjs": "a3d4569fb8ec0da99e7c9f0a5d0b12afa8ad7fcc1c1aa442f6ed7137b6852148", - "https://esm.sh/v129/@turf/standard-deviational-ellipse@6.5.0/denonext/standard-deviational-ellipse.mjs": "49eebd6815ed06d045c9701ebfafcd7628cfd40f874e1b8e5bb038f3c28416dd", - "https://esm.sh/v129/@turf/tag@6.5.0/denonext/tag.mjs": "ebcb5f1d9133b7ff0237592207704f8937fafb4733272d2e5bee6824c4e7fa40", - "https://esm.sh/v129/@turf/tesselate@6.5.0/denonext/tesselate.mjs": "b76e7111eae4dcc190e9105e974eab693b269c14822a34543729faa05dae1931", - "https://esm.sh/v129/@turf/tin@6.5.0/denonext/tin.mjs": "4410275f2b9eedaa66b1b94618d73aca682e60102cfc62c51b945666ac1a93f2", - "https://esm.sh/v129/@turf/transform-rotate@6.5.0/denonext/transform-rotate.mjs": "3f7a0374168366b022fc4a97b56f5b04d2beab3dbe54da53e6595ace2d59ec4f", - "https://esm.sh/v129/@turf/transform-scale@6.5.0/denonext/transform-scale.mjs": "1ad5eb86b9f7deb9a826152b4b11b54b40a5bfc02e302e4dee800a1fa69fc9f0", - "https://esm.sh/v129/@turf/transform-translate@6.5.0/denonext/transform-translate.mjs": "1067833dbd2293ac94941c6c34d82e7d6643e42408b85e154142cdfaf3fefaea", - "https://esm.sh/v129/@turf/triangle-grid@6.5.0/denonext/triangle-grid.mjs": "7d05363d8011e7a00dfdc4ed0d7c242c3f73c31b0a4c47b49b123b6e0f23a32d", - "https://esm.sh/v129/@turf/truncate@6.5.0/denonext/truncate.mjs": "7e829c8670e4d677e27c7e69004c141e5ce34b2d8c8a2e7f57fc953fee3f369f", - "https://esm.sh/v129/@turf/turf@6.5.0/denonext/turf.mjs": "e4ce111932cc95c818ae47af1e5d294868374af479124acf691a6c6625e94af7", - "https://esm.sh/v129/@turf/union@6.5.0/denonext/union.mjs": "a1a4c4d90a16c4debf159f411d1290ff3dc86748d367631dd085c66f96a9ac92", - "https://esm.sh/v129/@turf/unkink-polygon@6.5.0/denonext/unkink-polygon.mjs": "a23d0a2f1ad0c4edc26ef23969a728340656249e42d6b2714234a54489ab450f", - "https://esm.sh/v129/@turf/voronoi@6.5.0/denonext/voronoi.mjs": "8d738d7b304d4950787980f64531a70a2625b1486733a1e1ebd2a529155ce68e", - "https://esm.sh/v129/call-bind@1.0.2/denonext/call-bind.mjs": "42034a5e30e96e84ae767d59b41cb2342e43ee23b21d2d48a2629cd5f0541928", - "https://esm.sh/v129/call-bind@1.0.2/denonext/callBound.js": "62d697155528545fdb7473bc0033e6a9fe314f52dffd4aeda3618075874d1a31", - "https://esm.sh/v129/concaveman@1.2.1/denonext/concaveman.mjs": "4b3ae6c4cf95fae00cd4f0582386882c7f4713e3b60775ad640a14526b7c859b", - "https://esm.sh/v129/d3-array@1.2.4/denonext/d3-array.mjs": "ee413c9d8dc04471c774e641ca8d616a00e4452c62d3126011ddb8e2e3fdf97d", - "https://esm.sh/v129/d3-geo@1.7.1/denonext/d3-geo.mjs": "930c1a0d229ad046751c0a062107f4480cd85b2616e5e35c2a30a9bbb628a132", - "https://esm.sh/v129/d3-voronoi@1.1.2/denonext/d3-voronoi.mjs": "ced9affdd5f2d08f534856e4ebd1b6cef85d0bbf352a57a96758cd5e520932b3", - "https://esm.sh/v129/deep-equal@1.1.1/denonext/deep-equal.mjs": "3a360e6c89682ba33e59163727631ee91b8ff665e89ea33357e8802db3305cb1", - "https://esm.sh/v129/define-properties@1.2.0/denonext/define-properties.mjs": "2cfbf67fd79fc6b2005f385376e8f642af050f73286813dcc91c691f239306d0", - "https://esm.sh/v129/density-clustering@1.3.0/denonext/density-clustering.mjs": "e78d979f0ad641b6a8acecd76cc23a14a981a5878048cfa06f89e29274da7868", - "https://esm.sh/v129/earcut@2.2.4/denonext/earcut.mjs": "e119e9d83d550927aed5f7e2dbbf173436feed9553b2ae6113cf71b3e9e9180c", - "https://esm.sh/v129/function-bind@1.1.1/denonext/function-bind.mjs": "331f5d2a5830a67a767be946331716b1b9db05125891100a16e24114dba8ef87", - "https://esm.sh/v129/functions-have-names@1.2.3/denonext/functions-have-names.mjs": "c35b1012e1b731a55763a9da124a4be8c64a66e11cfb6837ccd17f8dace84de2", - "https://esm.sh/v129/geojson-equality@0.1.6/denonext/geojson-equality.mjs": "3bb6f72db6f73617c3b4901ad985bd3efefb5da96747e260c557d4629e9b1ec6", - "https://esm.sh/v129/geojson-rbush@3.2.0/denonext/geojson-rbush.mjs": "1f5ad12d678891f511951ac8616e1d8a8c743341aeaefc6dc83388de1815dbd1", - "https://esm.sh/v129/get-intrinsic@1.2.1/denonext/get-intrinsic.mjs": "2ca59cc159364c8916b80ad4a53d4f6e6f9670463c75629bb399e651511c65db", - "https://esm.sh/v129/has-property-descriptors@1.0.0/denonext/has-property-descriptors.mjs": "022ed691c4191f0a5ac50aaf416cb66d3b12a749f9793fe8964d3e3ff6bd58ec", - "https://esm.sh/v129/has-proto@1.0.1/denonext/has-proto.mjs": "443f9773e464b39534dbecaee040e5de8384e8efaeea7a6d3e333df4069d1f85", - "https://esm.sh/v129/has-symbols@1.0.3/denonext/has-symbols.mjs": "452727b5dbec94d538c5e8e062ed82bee701c3b752eb21e6189978e92292b7c6", - "https://esm.sh/v129/has-symbols@1.0.3/denonext/shams.js": "c2cefbc68690dfe7e9590c7720b1ff22d5b09251e936019d27e1b8d319c8fa9d", - "https://esm.sh/v129/has-tostringtag@1.0.0/denonext/shams.js": "11a0e4da09f747f03cc0f154700541d1b4ddd41db789a785ab40283e73e18394", - "https://esm.sh/v129/has@1.0.3/denonext/has.mjs": "d4107cf41c308ef1f7325986a947fd5d663179faaca6c8781971fccf1259e236", - "https://esm.sh/v129/is-arguments@1.1.1/denonext/is-arguments.mjs": "5e4deb2c366d57358e71b9aa27633d01751c679ef36c82a0c7d20c5c5894538c", - "https://esm.sh/v129/is-date-object@1.0.5/denonext/is-date-object.mjs": "0bb7269aca92d4bb9db1af11fdfc5f86c5215ea7d1c518e83a8d592d6e00c2f0", - "https://esm.sh/v129/is-regex@1.1.4/denonext/is-regex.mjs": "5a3fad5f885852f371ba3f9c5b0714f228aa39cd5cc11556452d44f69c2b9716", - "https://esm.sh/v129/object-is@1.1.5/denonext/object-is.mjs": "46ba00df36481ec575a6de76216ef3cc350ccdcdfbb3a44f9cb6373b30243d2b", - "https://esm.sh/v129/object-keys@1.1.1/denonext/object-keys.mjs": "9b1c41ea017ff80bc11f70885530199fbca620a7ac9b5b2bef20c8fb9829a4de", - "https://esm.sh/v129/point-in-polygon@1.1.0/denonext/point-in-polygon.mjs": "a123e6c7dbc3be3746b5b1f47e87e659ad6f26bcd02fff7611d5e4b83c9c324c", - "https://esm.sh/v129/polygon-clipping@0.15.3/denonext/polygon-clipping.mjs": "a96de0c21d577b7497c5063b961acd0fa3a4642d2592865cf18c1fdc87249e2c", - "https://esm.sh/v129/quickselect@1.1.1/denonext/quickselect.mjs": "9c5b4f3f1de466e3e6ebf9ca4dd281a01b91ed259e449088dc26ad0e034fcaf1", - "https://esm.sh/v129/quickselect@2.0.0/denonext/quickselect.mjs": "e03ef0934526ae4bdadb9f90f89e766294739f11ea62a7b2afc2e53069e8619b", - "https://esm.sh/v129/rbush@2.0.2/denonext/rbush.mjs": "df5e7d0b81145bd1afe368ca5b74d4c0e00d3ecbc2d6ee96f3e9a23ed2c1abfe", - "https://esm.sh/v129/rbush@3.0.1/denonext/rbush.mjs": "e3251aea1d308b6aa0237acc8278624ef437900e15510a6d78b2be69faac5516", - "https://esm.sh/v129/regexp.prototype.flags@1.5.0/denonext/regexp.prototype.flags.mjs": "488c2f56012b3f52fe47b7d6356dfc6f8fde44871ba0fe0760ab6e80f506dc92", - "https://esm.sh/v129/robust-predicates@2.0.4/denonext/umd/orient2d.min.js": "890b58754301e6c6931cf93ce6c66eec71babae0d34e30d0d24e5037772102aa", - "https://esm.sh/v129/skmeans@0.9.7/denonext/skmeans.mjs": "496ed2a88b6cf00e67de70aa6d01ab0e9dcb532b2db275f52fc45881553461e9", - "https://esm.sh/v129/splaytree@3.1.2/denonext/splaytree.mjs": "0bb044d03031466d8c51fa8f7d54783659e486588665323b33a5120aecd3ba9d", - "https://esm.sh/v129/tinyqueue@2.0.3/denonext/tinyqueue.mjs": "923c24576a6f8f7a152117f311f83b97b6f5e4cc925312e6cc6a15a290b8ecea", - "https://esm.sh/v129/topojson-client@3.1.0/denonext/topojson-client.mjs": "be4dd835dee50439be15521a32978e851181d3a8b8b61b1c040a5981d04dab6f", - "https://esm.sh/v129/topojson-server@3.0.1/denonext/topojson-server.mjs": "7290cfe0abbf0b77b94224971d136370c25919c3dc6a7b36c49b552e1a4ed473", - "https://esm.sh/v129/turf-jsts@1.2.3/denonext/turf-jsts.mjs": "2239465c9e5f3efc2d45a3349206ee320f7c54f1e6a85145fee4e91735757995", "https://esm.sh/v135/@turf/along@6.5.0/denonext/along.mjs": "c0b37a23533598d200708d3f036820ac40979b430b5f0bc28611a7348e2a7c94", "https://esm.sh/v135/@turf/angle@6.5.0/denonext/angle.mjs": "347a7b8ad0bd322092d0625bc59e19df1fa066f78f51182c22d070eb705a0e20", "https://esm.sh/v135/@turf/area@6.5.0/denonext/area.mjs": "d18a1d9118c7c82103587b5d305dce399992190fe3bb40c9bd7b1333b4044cbd", diff --git a/terraform/environments/deployment.tf b/terraform/environments/deployment.tf index 0b4f8cf0873f106697768043e0c20ff5ff172810..00cc1e712dd31727eb0532e48a639df3d98e5298 100644 --- a/terraform/environments/deployment.tf +++ b/terraform/environments/deployment.tf @@ -54,6 +54,13 @@ resource "google_cloud_run_service" "volunteering_api" { ports { container_port = 8004 } + liveness_probe { + http_get { + path = "/liveness" + } + timeout_seconds = 10 + period_seconds = 60 + } env { name = "ENVIRONMENT" value = local.environment