diff --git a/.env.example b/.env.example index 4e8efb2dfb..9923f8542a 100644 --- a/.env.example +++ b/.env.example @@ -6,10 +6,12 @@ API_PORT=7002 API_URL_EXT=http://localhost:${API_PORT} +# JWT_SECRET must be at least 32 characters JWT_SECRET=👻 SESSION_SECRET=👻 +# Google Cloud OAuth 2.0 Client ID GOOGLE_CLIENT_ID=👻 GOOGLE_CLIENT_SECRET=👻 @@ -49,9 +51,9 @@ MINIO_ADMIN_PORT=9001 # PostgreSQL PG_PORT=7001 -PG_DATABASE=👻 +PG_DATABASE=planxdb +PG_USERNAME=dbuser PG_PASSWORD=👻 -PG_USERNAME=👻 # PG user with permission to sync content between environments PRODUCTION_PG_URL_FOR_USER_GITHUB_ACTIONS=👻 diff --git a/README.md b/README.md index 975dba3547..fddfd4c0e5 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,14 @@ planx-new is a monorepo containing our full application stack. Here's a quick su 1. Download and install the following dependencies if you don't have them already: - [Docker](https://docs.docker.com/get-docker/) -- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) +- [Docker Compose](https://docs.docker.com/compose/install/) - [PNPM](https://github.com/pnpm/pnpm) `npm install -g pnpm@8.6.6` - [Node](https://nodejs.org/en/download) `pnpm env use --global 18.16.1` +- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) -1. Clone this repository. +**If you're an OSL developer:** + +1. Clone this repository 2. Setup your AWS CLI client with SSO - [detailed guide here](https://github.com/theopensystemslab/planx-new/blob/main/doc/how-to/how-to-setup-aws-sso-credentials.md) @@ -48,6 +51,30 @@ planx-new is a monorepo containing our full application stack. Here's a quick su 9. Open `http://localhost:3000` and login with your Google email address +**If you're not a member of OSL, follow these steps:** + +1. Fork or clone this repository + +2. Copy all `.example` env files into their respective directories and replace 👻 with a string like "SECRET" or longer where noted + +3. Setup free OAuth Client ID credentails in the [Google Cloud APIs console](https://console.cloud.google.com/apis/credentials) + - Application type = "Web application" + - Authorised JavaScript origins = "http://localhost:3000" + - Authorised redirect URIs = "http://localhost:7002/auth/google/callback" + - Update the `GOOGLE_CLIENT_ID` & `GOOGLE_CLIENT_SECRET` env vars with your new credentials + +4. Run `pnpm start` from the project root to set up docker containers for the application's backend (postgres, sharedb, api and hasura server processes). Please note you will not be able to run commands that sync seed data from production. + +5. Move into the hasura directory `cd ../hasura.planx.uk` and install dependencies `pnpm i`. + +6. Open [Hasura's](https://hasura.io/) web console (`cd hasura.planx.uk` then `pnpm start`) and add your Google email address to the `users` table. You'll also likely want to create an initial `team`. This will eventually allow you to authenticate into the application as an admin. + +7. Follow steps 7-9 above to start the editor and login ! + +At this point you'll be running the full Planx application locally in a docker container. See our Github Actions pull request workflow as an example of how to deploy via docker to a virtual linux server, or explore the `infrastructure` directory for how to deploy via Pulumi infrastructure-as-code to AWS. + +We'd love to hear what you're building on Planx, don't hesitate to get in touch with questions. + ### Docker The root of the project has several scripts set up to help you manage your docker containers: @@ -111,3 +138,4 @@ There are a few dependent packages that are closely related to this project: - https://github.com/theopensystemslab/planx-core - https://github.com/theopensystemslab/map + - https://github.com/theopensystemslab/digital-planning-data-schemas diff --git a/api.planx.uk/admin/session/bops.test.ts b/api.planx.uk/admin/session/bops.test.ts index 825ff8ce6e..5665ae9c09 100644 --- a/api.planx.uk/admin/session/bops.test.ts +++ b/api.planx.uk/admin/session/bops.test.ts @@ -6,9 +6,7 @@ import { expectedPayload } from "../../tests/mocks/bopsMocks"; const endpoint = (strings: TemplateStringsArray) => `/admin/session/${strings[0]}/bops`; -const mockGenerateBOPSPayload = jest.fn().mockResolvedValue({ - exportData: expectedPayload, -}); +const mockGenerateBOPSPayload = jest.fn().mockResolvedValue(expectedPayload); jest.mock("@opensystemslab/planx-core", () => { return { diff --git a/api.planx.uk/admin/session/bops.ts b/api.planx.uk/admin/session/bops.ts index 56d2e78f8f..09a44a43c2 100644 --- a/api.planx.uk/admin/session/bops.ts +++ b/api.planx.uk/admin/session/bops.ts @@ -20,7 +20,7 @@ export const getBOPSPayload = async ( next: NextFunction, ) => { try { - const { exportData } = await $api.export.bopsPayload(req.params.sessionId); + const exportData = await $api.export.bopsPayload(req.params.sessionId); res.set("content-type", "application/json"); return res.send(exportData); } catch (error) { diff --git a/api.planx.uk/admin/session/csv.test.ts b/api.planx.uk/admin/session/csv.test.ts index a493fb410d..a40152a272 100644 --- a/api.planx.uk/admin/session/csv.test.ts +++ b/api.planx.uk/admin/session/csv.test.ts @@ -5,16 +5,13 @@ import { authHeader } from "../../tests/mockJWT"; const endpoint = (strings: TemplateStringsArray) => `/admin/session/${strings[0]}/csv`; -const mockGenerateCSVData = jest.fn().mockResolvedValue({ - responses: [ - { - question: "Is this a test?", - responses: [{ value: "Yes" }], - metadata: {}, - }, - ], - redactedResponses: [], -}); +const mockGenerateCSVData = jest.fn().mockResolvedValue([ + { + question: "Is this a test?", + responses: [{ value: "Yes" }], + metadata: {}, + }, +]); jest.mock("@opensystemslab/planx-core", () => { return { CoreDomainClient: jest.fn().mockImplementation(() => ({ diff --git a/api.planx.uk/admin/session/csv.ts b/api.planx.uk/admin/session/csv.ts index 06d0bb00be..c0c3f2f1c0 100644 --- a/api.planx.uk/admin/session/csv.ts +++ b/api.planx.uk/admin/session/csv.ts @@ -1,6 +1,6 @@ import { stringify } from "csv-stringify"; import { NextFunction, Request, Response } from "express"; -import { getClient } from "../../client"; +import { $api } from "../../client"; /** * @swagger @@ -26,8 +26,7 @@ export async function getCSVData( next: NextFunction, ) { try { - const $client = getClient(); - const { responses } = await $client.export.csvData(req.params.sessionId); + const responses = await $api.export.csvData(req.params.sessionId); if (req.query?.download) { stringify(responses, { @@ -70,8 +69,7 @@ export async function getRedactedCSVData( next: NextFunction, ) { try { - const $client = getClient(); - const { redactedResponses } = await $client.export.csvData( + const redactedResponses = await $api.export.csvDataRedacted( req.params.sessionId, ); diff --git a/api.planx.uk/admin/session/digitalPlanningData.test.ts b/api.planx.uk/admin/session/digitalPlanningData.test.ts new file mode 100644 index 0000000000..254a0ab8c8 --- /dev/null +++ b/api.planx.uk/admin/session/digitalPlanningData.test.ts @@ -0,0 +1,53 @@ +import supertest from "supertest"; +import app from "../../server"; +import { authHeader } from "../../tests/mockJWT"; +import { expectedPlanningPermissionPayload } from "../../tests/mocks/digitalPlanningDataMocks"; + +const endpoint = (strings: TemplateStringsArray) => + `/admin/session/${strings[0]}/digital-planning-application`; + +const mockGenerateDigitalPlanningApplicationPayload = jest + .fn() + .mockResolvedValue(expectedPlanningPermissionPayload); + +jest.mock("@opensystemslab/planx-core", () => { + return { + CoreDomainClient: jest.fn().mockImplementation(() => ({ + export: { + digitalPlanningDataPayload: () => + mockGenerateDigitalPlanningApplicationPayload(), + }, + })), + }; +}); + +describe("Digital Planning Application payload admin endpoint", () => { + it("requires a user to be logged in", async () => { + await supertest(app) + .get(endpoint`123`) + .expect(401) + .then((res) => + expect(res.body).toEqual({ + error: "No authorization token was found", + }), + ); + }); + + it("requires a user to have the 'platformAdmin' role", async () => { + await supertest(app) + .get(endpoint`123`) + .set(authHeader({ role: "teamEditor" })) + .expect(403); + }); + + it("returns a valid JSON payload", async () => { + await supertest(app) + .get(endpoint`123`) + .set(authHeader({ role: "platformAdmin" })) + .expect(200) + .expect("content-type", "application/json; charset=utf-8") + .then((res) => + expect(res.body).toEqual(expectedPlanningPermissionPayload), + ); + }); +}); diff --git a/api.planx.uk/admin/session/digitalPlanningData.ts b/api.planx.uk/admin/session/digitalPlanningData.ts new file mode 100644 index 0000000000..76929647ba --- /dev/null +++ b/api.planx.uk/admin/session/digitalPlanningData.ts @@ -0,0 +1,35 @@ +import { NextFunction, Request, Response } from "express"; +import { $api } from "../../client"; + +/** + * @swagger + * /admin/session/{sessionId}/digital-planning-application: + * get: + * summary: Generates a Digital Planning Application payload + * description: Generates a Digital Planning Application payload and validates it against the Digital Planning Data JSON Schema + * tags: + * - admin + * parameters: + * - $ref: '#/components/parameters/sessionId' + * security: + * - bearerAuth: [] + */ +export const getDigitalPlanningApplicationPayload = async ( + req: Request, + res: Response, + next: NextFunction, +) => { + try { + const data = await $api.export.digitalPlanningDataPayload( + req.params.sessionId, + ); + res.set("content-type", "application/json"); + return res.send(data); + } catch (error) { + return next({ + message: + "Failed to make Digital Planning Application payload: " + + (error as Error).message, + }); + } +}; diff --git a/api.planx.uk/admin/session/html.ts b/api.planx.uk/admin/session/html.ts index 52560d79da..493bd58dd5 100644 --- a/api.planx.uk/admin/session/html.ts +++ b/api.planx.uk/admin/session/html.ts @@ -1,5 +1,5 @@ import { generateApplicationHTML } from "@opensystemslab/planx-core"; -import { getClient } from "../../client"; +import { $api } from "../../client"; import type { RequestHandler } from "express"; import type { PlanXExportData } from "@opensystemslab/planx-core/types"; @@ -20,11 +20,10 @@ type HTMLExportHandler = RequestHandler<{ sessionId: string }, string>; */ export const getHTMLExport: HTMLExportHandler = async (req, res, next) => { try { - const $client = getClient(); - const session = await $client.session.find(req.params.sessionId); + const session = await $api.session.find(req.params.sessionId); if (!session) throw Error(`Unable to find session ${req.params.sessionId}`); - const { responses } = await $client.export.csvData(req.params.sessionId); + const responses = await $api.export.csvData(req.params.sessionId); const boundingBox = session.data.passport.data["property.boundary.site.buffered"]; @@ -61,11 +60,10 @@ export const getRedactedHTMLExport: HTMLExportHandler = async ( next, ) => { try { - const $client = getClient(); - const session = await $client.session.find(req.params.sessionId); + const session = await $api.session.find(req.params.sessionId); if (!session) throw Error(`Unable to find session ${req.params.sessionId}`); - const { redactedResponses } = await $client.export.csvData( + const redactedResponses = await $api.export.csvDataRedacted( req.params.sessionId, ); const boundingBox = diff --git a/api.planx.uk/admin/session/oneAppXML.test.ts b/api.planx.uk/admin/session/oneAppXML.test.ts index 8a67e626b2..4b8dc3bfe3 100644 --- a/api.planx.uk/admin/session/oneAppXML.test.ts +++ b/api.planx.uk/admin/session/oneAppXML.test.ts @@ -12,7 +12,9 @@ const mockGenerateOneAppXML = jest jest.mock("../../client", () => { return { $api: { - generateOneAppXML: () => mockGenerateOneAppXML(), + export: { + oneAppPayload: () => mockGenerateOneAppXML(), + }, }, }; }); diff --git a/api.planx.uk/admin/session/oneAppXML.ts b/api.planx.uk/admin/session/oneAppXML.ts index d1c1e51fb8..7b1ef90601 100644 --- a/api.planx.uk/admin/session/oneAppXML.ts +++ b/api.planx.uk/admin/session/oneAppXML.ts @@ -20,7 +20,7 @@ export const getOneAppXML = async ( next: NextFunction, ) => { try { - const xml = await $api.generateOneAppXML(req.params.sessionId); + const xml = await $api.export.oneAppPayload(req.params.sessionId); res.set("content-type", "text/xml"); return res.send(xml); } catch (error) { diff --git a/api.planx.uk/inviteToPay/createPaymentSendEvents.ts b/api.planx.uk/inviteToPay/createPaymentSendEvents.ts index 8a6bee74b9..75f1245ed5 100644 --- a/api.planx.uk/inviteToPay/createPaymentSendEvents.ts +++ b/api.planx.uk/inviteToPay/createPaymentSendEvents.ts @@ -40,7 +40,7 @@ const createPaymentSendEvents = async ( const now = new Date(); const combinedResponse: CombinedResponse = {}; - const session = await $api.getSessionById(payload.sessionId); + const session = await $api.session.find(payload.sessionId); if (!session) { return next({ status: 400, diff --git a/api.planx.uk/inviteToPay/inviteToPay.ts b/api.planx.uk/inviteToPay/inviteToPay.ts index 8d781ca6d5..6dfa87267e 100644 --- a/api.planx.uk/inviteToPay/inviteToPay.ts +++ b/api.planx.uk/inviteToPay/inviteToPay.ts @@ -39,7 +39,7 @@ export async function inviteToPay( } // lock session before creating a payment request - const locked = await $api.lockSession(sessionId); + const locked = await $api.session.lock(sessionId); if (locked === null) { return next( new ServerError({ @@ -63,7 +63,7 @@ export async function inviteToPay( let paymentRequest: PaymentRequest | undefined; try { - paymentRequest = await $api.createPaymentRequest({ + paymentRequest = await $api.paymentRequest.create({ sessionId, applicantName, payeeName, @@ -72,7 +72,7 @@ export async function inviteToPay( }); } catch (e: unknown) { // revert the session lock on failure - await $api.unlockSession(sessionId); + await $api.session.unlock(sessionId); return next( new ServerError({ message: diff --git a/api.planx.uk/package.json b/api.planx.uk/package.json index a8d81c4717..cb4db427f9 100644 --- a/api.planx.uk/package.json +++ b/api.planx.uk/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@airbrake/node": "^2.1.8", - "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#d92224b", + "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#c2d6f35", "@types/isomorphic-fetch": "^0.0.36", "adm-zip": "^0.5.10", "aws-sdk": "^2.1467.0", diff --git a/api.planx.uk/pnpm-lock.yaml b/api.planx.uk/pnpm-lock.yaml index 7948276e87..e2ed371839 100644 --- a/api.planx.uk/pnpm-lock.yaml +++ b/api.planx.uk/pnpm-lock.yaml @@ -9,8 +9,8 @@ dependencies: specifier: ^2.1.8 version: 2.1.8 '@opensystemslab/planx-core': - specifier: git+https://github.com/theopensystemslab/planx-core#d92224b - version: github.com/theopensystemslab/planx-core/d92224b + specifier: git+https://github.com/theopensystemslab/planx-core#c2d6f35 + version: github.com/theopensystemslab/planx-core/c2d6f35 '@types/isomorphic-fetch': specifier: ^0.0.36 version: 0.0.36 @@ -335,6 +335,14 @@ packages: '@babel/highlight': 7.22.10 chalk: 2.4.2 + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} @@ -352,7 +360,7 @@ packages: '@babel/helpers': 7.22.10 '@babel/parser': 7.22.10 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.10 convert-source-map: 1.9.0 debug: 4.3.4 @@ -373,6 +381,16 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -411,6 +429,11 @@ packages: - supports-color dev: true + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -424,11 +447,19 @@ packages: '@babel/types': 7.22.10 dev: true + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: true /@babel/helper-member-expression-to-functions@7.22.5: @@ -454,7 +485,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.10 transitivePeerDependencies: - supports-color @@ -494,7 +525,7 @@ packages: '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.10 transitivePeerDependencies: - supports-color @@ -518,13 +549,18 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: true /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -539,7 +575,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.10 transitivePeerDependencies: - supports-color @@ -553,6 +589,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} @@ -561,12 +606,12 @@ packages: '@babel/types': 7.22.10 dev: true - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): @@ -743,59 +788,50 @@ packages: - supports-color dev: true - /@babel/runtime@7.22.15: - resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.13.11 dev: false - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.14.0 dev: false - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true - /@babel/traverse@7.22.10: - resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.10 '@babel/types': 7.22.10 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color dev: true - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -810,6 +846,15 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@bcherny/json-schema-ref-parser@10.0.5-fork: resolution: {integrity: sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==} engines: {node: '>= 16'} @@ -844,7 +889,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -891,7 +936,7 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -928,7 +973,7 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(react@18.2.0) @@ -1169,13 +1214,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1209,8 +1254,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + /@eslint/js@8.51.0: + resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -1624,8 +1669,8 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: false - /@mui/base@5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==} + /@mui/base@5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -1639,10 +1684,10 @@ packages: react-dom: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.0.0 prop-types: 15.8.1 @@ -1650,12 +1695,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.11: - resolution: {integrity: sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==} + /@mui/core-downloads-tracker@5.14.13: + resolution: {integrity: sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==} dev: false - /@mui/material@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==} + /@mui/material@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1675,15 +1720,15 @@ packages: react-dom: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/base': 5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.11 - '@mui/system': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) - '@types/react-transition-group': 4.4.6 + '@mui/base': 5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.13 + '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) + '@types/react-transition-group': 4.4.7 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -1693,8 +1738,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.11(react@18.2.0): - resolution: {integrity: sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==} + /@mui/private-theming@5.14.13(react@18.2.0): + resolution: {integrity: sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -1705,14 +1750,14 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(react@18.2.0) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.13(react@18.2.0) prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==} + /@mui/styled-engine@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -1726,7 +1771,7 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) @@ -1735,8 +1780,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==} + /@mui/system@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1753,30 +1798,30 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/private-theming': 5.14.11(react@18.2.0) - '@mui/styled-engine': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/private-theming': 5.14.13(react@18.2.0) + '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/types@7.2.4: - resolution: {integrity: sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==} + /@mui/types@7.2.6: + resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: - '@types/react': '*' + '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dev: false - /@mui/utils@5.14.11(react@18.2.0): - resolution: {integrity: sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==} + /@mui/utils@5.14.13(react@18.2.0): + resolution: {integrity: sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -1787,8 +1832,8 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/prop-types': 15.7.5 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.8 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 @@ -1862,7 +1907,7 @@ packages: /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.22.10 '@babel/types': 7.22.10 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 @@ -2118,8 +2163,8 @@ packages: resolution: {integrity: sha512-GSCjjH6mDS8jgpT22rEOkZVqZcYj7i9AHJu4ntpvoohEpa0mLAKP/Kz3POMKqABaFsS4TyNHOeoyWpzycddcoQ==} dev: false - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.8: + resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} dev: false /@types/qs@6.9.7: @@ -2128,8 +2173,8 @@ packages: /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - /@types/react-transition-group@4.4.6: - resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} + /@types/react-transition-group@4.4.7: + resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} dependencies: '@types/react': 18.2.14 dev: false @@ -2137,7 +2182,7 @@ packages: /@types/react@18.2.14: resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==} dependencies: - '@types/prop-types': 15.7.5 + '@types/prop-types': 15.7.8 '@types/scheduler': 0.16.3 csstype: 3.1.2 dev: false @@ -2679,7 +2724,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 resolve: 1.22.2 dev: false @@ -3489,7 +3534,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 csstype: 3.1.2 dev: false @@ -3758,15 +3803,15 @@ packages: - supports-color dev: true - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + /eslint@8.51.0: + resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 + '@eslint/js': 8.51.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -4117,8 +4162,8 @@ packages: punycode: 1.4.1 dev: false - /fast-xml-parser@4.3.1: - resolution: {integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA==} + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true dependencies: strnum: 1.0.5 @@ -6778,7 +6823,7 @@ packages: react-dom: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -7741,8 +7786,8 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@4.3.3: - resolution: {integrity: sha512-bxhiFii6BBv6UiSDq7uKTMyADT9unXEl3ydGefndVLxFeB44LRbT4K7OJGDYSyDrKnklCC1Pre68qT2wbUl2Aw==} + /type-fest@4.4.0: + resolution: {integrity: sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw==} engines: {node: '>=16'} dev: false @@ -8103,8 +8148,12 @@ packages: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} dev: false - github.com/theopensystemslab/planx-core/d92224b: - resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/d92224b} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + github.com/theopensystemslab/planx-core/c2d6f35: + resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/c2d6f35} name: '@opensystemslab/planx-core' version: 1.0.0 prepare: true @@ -8112,14 +8161,14 @@ packages: dependencies: '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/material': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@types/geojson': 7946.0.11 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) copyfiles: 2.4.1 docx: 8.2.3 - eslint: 8.50.0 - fast-xml-parser: 4.3.1 + eslint: 8.51.0 + fast-xml-parser: 4.3.2 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-schema-to-typescript: 13.1.1 @@ -8138,9 +8187,9 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) striptags: 3.2.0 - type-fest: 4.3.3 + type-fest: 4.4.0 uuid: 9.0.1 - zod: 3.22.3 + zod: 3.22.4 transitivePeerDependencies: - '@types/react' - encoding diff --git a/api.planx.uk/send/bops.ts b/api.planx.uk/send/bops.ts index b0e07058f4..80d1edebb1 100644 --- a/api.planx.uk/send/bops.ts +++ b/api.planx.uk/send/bops.ts @@ -70,7 +70,7 @@ const sendToBOPS = async (req: Request, res: Response, next: NextFunction) => { ); } const target = `${bopsSubmissionURL}/api/v1/planning_applications`; - const { exportData } = await $api.export.bopsPayload(payload?.sessionId); + const exportData = await $api.export.bopsPayload(payload?.sessionId); try { const bopsResponse = await axios({ diff --git a/api.planx.uk/send/email.test.ts b/api.planx.uk/send/email.test.ts index 12cb25ab54..398f6d8889 100644 --- a/api.planx.uk/send/email.test.ts +++ b/api.planx.uk/send/email.test.ts @@ -2,16 +2,13 @@ import supertest from "supertest"; import { queryMock } from "../tests/graphqlQueryMock"; import app from "../server"; -const mockGenerateCSVData = jest.fn().mockResolvedValue({ - responses: [ - { - question: "Is this a test?", - responses: [{ value: "Yes" }], - metadata: {}, - }, - ], - redactedResponses: [], -}); +const mockGenerateCSVData = jest.fn().mockResolvedValue([ + { + question: "Is this a test?", + responses: [{ value: "Yes" }], + metadata: {}, + }, +]); jest.mock("@opensystemslab/planx-core", () => { return { Passport: jest.fn().mockImplementation(() => ({ diff --git a/api.planx.uk/send/exportZip.test.ts b/api.planx.uk/send/exportZip.test.ts index 39ce06e6b2..2ecb05da89 100644 --- a/api.planx.uk/send/exportZip.test.ts +++ b/api.planx.uk/send/exportZip.test.ts @@ -58,7 +58,6 @@ const mockGenerateOneAppXML = jest jest.mock("../client", () => { return { $api: { - generateOneAppXML: () => mockGenerateOneAppXML(), getDocumentTemplateNamesForSession: jest .fn() .mockResolvedValue(["X", "Y"]), @@ -66,16 +65,15 @@ jest.mock("../client", () => { find: () => mockGetSessionById(), }, export: { - csvData: jest.fn().mockResolvedValue({ - responses: [ - { - question: "Test", - responses: [{ value: "Answer" }], - metadata: {}, - }, - ], - redactedResponses: [], - }), + csvData: jest.fn().mockResolvedValue([ + { + question: "Test", + responses: [{ value: "Answer" }], + metadata: {}, + }, + ]), + csvDataRedacted: jest.fn().mockResolvedValue([]), + oneAppPayload: () => mockGenerateOneAppXML(), }, }, }; diff --git a/api.planx.uk/send/exportZip.ts b/api.planx.uk/send/exportZip.ts index 9c2e6ffbe6..c342e43ff8 100644 --- a/api.planx.uk/send/exportZip.ts +++ b/api.planx.uk/send/exportZip.ts @@ -39,7 +39,7 @@ export async function buildSubmissionExportZip({ // add OneApp XML to the zip if (includeOneAppXML) { try { - const xml = await $api.generateOneAppXML(sessionId); + const xml = await $api.export.oneAppPayload(sessionId); const xmlStream = str(xml.trim()); await zip.addStream({ name: "proposal.xml", // must be named "proposal.xml" to be processed by Uniform @@ -65,7 +65,8 @@ export async function buildSubmissionExportZip({ } // generate csv data - const { responses, redactedResponses } = await $api.export.csvData(sessionId); + const responses = await $api.export.csvData(sessionId); + const redactedResponses = await $api.export.csvDataRedacted(sessionId); // write csv to the zip try { diff --git a/api.planx.uk/send/uniform.ts b/api.planx.uk/send/uniform.ts index 4140a14146..3fad3a611f 100644 --- a/api.planx.uk/send/uniform.ts +++ b/api.planx.uk/send/uniform.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { AxiosRequestConfig, isAxiosError } from "axios"; import { NextFunction, Request, Response } from "express"; import { Buffer } from "node:buffer"; import FormData from "form-data"; @@ -157,9 +157,12 @@ export async function sendToUniform( application: applicationAuditRecord, }); } catch (error) { + const errorMessage = isAxiosError(error) + ? JSON.stringify(error.toJSON()) + : (error as Error).message; return next({ error, - message: `Failed to send to Uniform (${localAuthority}): ${error}`, + message: `Failed to send to Uniform (${localAuthority}): ${errorMessage}`, }); } } @@ -219,7 +222,13 @@ async function authenticate({ const response = await axios.request(authConfig); if (!response.data.access_token) { - throw Error("Failed to authenticate to Uniform"); + throw Error("Failed to authenticate to Uniform - no access token returned"); + } + + if (!response.data["organisation-name"] || response.data["organisation-id"]) { + throw Error( + "Failed to authenticate to Uniform - no organisation details returned", + ); } const uniformAuthResponse: UniformAuthResponse = { @@ -373,7 +382,7 @@ const createUniformApplicationAuditRecord = async ({ localAuthority: string; submissionDetails: UniformSubmissionResponse; }): Promise => { - const xml = await $api.generateOneAppXML(payload?.sessionId); + const xml = await $api.export.oneAppPayload(payload?.sessionId); const application: Record< "insert_uniform_applications_one", diff --git a/api.planx.uk/server.ts b/api.planx.uk/server.ts index e6d5910e9f..afbc99655a 100644 --- a/api.planx.uk/server.ts +++ b/api.planx.uk/server.ts @@ -40,7 +40,6 @@ import { } from "./modules/auth/middleware"; import airbrake from "./airbrake"; -import { adminGraphQLClient as adminClient } from "./hasura"; import { sendEmailLimiter, apiLimiter } from "./rateLimit"; import { privateDownloadController, @@ -73,6 +72,8 @@ import webhookRoutes from "./modules/webhooks/routes"; import analyticsRoutes from "./modules/analytics/routes"; import { useSwaggerDocs } from "./docs"; import { Role } from "@opensystemslab/planx-core/types"; +import { getDigitalPlanningApplicationPayload } from "./admin/session/digitalPlanningData"; +import { $public } from "./client"; const router = express.Router(); @@ -213,6 +214,10 @@ app.get("/admin/session/:sessionId/html", getHTMLExport); app.get("/admin/session/:sessionId/html-redacted", getRedactedHTMLExport); app.get("/admin/session/:sessionId/zip", generateZip); app.get("/admin/session/:sessionId/summary", getSessionSummary); +app.get( + "/admin/session/:sessionId/digital-planning-application", + getDigitalPlanningApplicationPayload, +); app.post("/flows/:flowId/copy", useTeamEditorAuth, copyFlow); @@ -279,13 +284,21 @@ app.get( copyPortalAsFlow, ); -// unauthenticated because accessing flow schema only, no user data +interface FlowSchema { + node: string; + type: string; + text: string; + planx_variable: string; +} + app.get("/flows/:flowId/download-schema", async (req, res, next) => { try { - const schema = await adminClient.request( + const { flowSchema } = await $public.client.request<{ + flowSchema: FlowSchema[]; + }>( gql` query ($flow_id: String!) { - get_flow_schema(args: { published_flow_id: $flow_id }) { + flowSchema: get_flow_schema(args: { published_flow_id: $flow_id }) { node type text @@ -296,7 +309,7 @@ app.get("/flows/:flowId/download-schema", async (req, res, next) => { { flow_id: req.params.flowId }, ); - if (schema.get_flow_schema.length < 1) { + if (!flowSchema.length) { next({ status: 404, message: @@ -304,7 +317,7 @@ app.get("/flows/:flowId/download-schema", async (req, res, next) => { }); } else { // build a CSV and stream it - stringify(schema.get_flow_schema, { header: true }).pipe(res); + stringify(flowSchema, { header: true }).pipe(res); res.header("Content-type", "text/csv"); res.attachment(`${req.params.flowId}.csv`); diff --git a/api.planx.uk/tests/mocks/digitalPlanningDataMocks.ts b/api.planx.uk/tests/mocks/digitalPlanningDataMocks.ts new file mode 100644 index 0000000000..6265025838 --- /dev/null +++ b/api.planx.uk/tests/mocks/digitalPlanningDataMocks.ts @@ -0,0 +1,1713 @@ +export const expectedPlanningPermissionPayload = { + data: { + application: { + type: { + value: "pp.full.householder", + description: "Planning Permission - Full householder", + }, + fee: { + calculated: 206, + payable: 206, + exemption: { + disability: true, + resubmission: true, + }, + reduction: { + sports: true, + parishCouncil: true, + alternative: true, + }, + reference: { + govPay: "sandbox-ref-456", + }, + }, + declaration: { + accurate: true, + connection: { + value: "none", + }, + }, + }, + user: { + role: "proxy", + }, + applicant: { + type: "individual", + contact: { + name: { + first: "David", + last: "Bowie", + }, + email: "ziggy@example.com", + phone: { + primary: "Not provided by agent", + }, + company: {}, + }, + address: { + sameAsSiteAddress: true, + }, + siteContact: { + role: "proxy", + }, + interest: "owner.sole", + ownership: { + certificate: "a", + }, + agent: { + contact: { + name: { + first: "Ziggy", + last: "Stardust", + }, + email: "ziggy@example.com", + phone: { + primary: "01100 0110 0011", + }, + company: {}, + }, + address: { + line1: "40 Stansfield Road", + line2: "Brixton", + town: "London", + county: "Greater London", + postcode: "SW9 9RZ", + country: "UK", + }, + }, + }, + property: { + address: { + latitude: 51.4656522, + longitude: -0.1185926, + x: 530787, + y: 175754, + title: "40, STANSFIELD ROAD, LONDON", + singleLine: "40, STANSFIELD ROAD, LONDON, SW9 9RZ", + source: "Ordnance Survey", + uprn: "100021892955", + usrn: "21901294", + pao: "40", + street: "STANSFIELD ROAD", + town: "LONDON", + postcode: "SW9 9RZ", + }, + boundary: { + site: { + type: "Feature", + geometry: { + type: "Polygon", + coordinates: [ + [ + [-0.1186569035053321, 51.465703531871384], + [-0.1185938715934822, 51.465724418998775], + [-0.1184195280075143, 51.46552473766957], + [-0.11848390102387167, 51.4655038504508], + [-0.1186569035053321, 51.465703531871384], + ], + ], + }, + properties: null, + }, + area: { + hectares: 0.012592, + squareMetres: 125.92, + }, + }, + constraints: { + planning: [ + { + value: "tpo", + description: "Tree Preservation Order (TPO) or zone", + overlaps: false, + }, + { + value: "listed", + description: "Listed Building", + overlaps: false, + }, + { + value: "article4", + description: "Article 4 Direction area", + overlaps: false, + }, + { + value: "monument", + description: "Site of a Scheduled Monument", + overlaps: false, + }, + { + value: "designated", + description: "Designated land", + overlaps: false, + }, + { + value: "nature.SAC", + description: "Special Area of Conservation (SAC)", + overlaps: false, + }, + { + value: "nature.ASNW", + description: "Ancient Semi-Natural Woodland (ASNW)", + overlaps: false, + }, + { + value: "nature.SSSI", + description: "Site of Special Scientific Interest (SSSI)", + overlaps: false, + }, + { + value: "locallyListed", + description: "Locally Listed Building", + overlaps: false, + }, + { + value: "designated.SPA", + description: "Special Protection Area (SPA)", + overlaps: false, + }, + { + value: "designated.WHS", + description: "UNESCO World Heritage Site or buffer zone", + overlaps: false, + }, + { + value: "registeredPark", + description: "Historic Park or Garden", + overlaps: false, + }, + { + value: "designated.AONB", + description: "Area of Outstanding Natural Beauty (AONB)", + overlaps: false, + }, + { + value: "article4.caz", + description: "Central Activities Zone (CAZ)", + overlaps: false, + }, + { + value: "designated.nationalPark", + description: "National Park", + overlaps: false, + }, + { + value: "designated.conservationArea", + description: "Conservation Area", + overlaps: false, + }, + { + value: "designated.nationalPark.broads", + description: "National Park - Broads", + overlaps: false, + }, + { + value: "road.classified", + description: "Classified Road", + overlaps: false, + }, + ], + }, + localAuthorityDistrict: ["Lambeth"], + region: "London", + type: { + value: "residential.dwelling.house.terrace", + description: "Terrace", + }, + }, + proposal: { + projectType: [ + { + value: "extend.roof.dormer", + description: "Add a roof dormer", + }, + ], + description: + "Roof extension to the rear of the property, incorporating starship launchpad.", + boundary: { + site: { + type: "Feature", + geometry: { + type: "Polygon", + coordinates: [ + [ + [-0.1186569035053321, 51.465703531871384], + [-0.1185938715934822, 51.465724418998775], + [-0.1184195280075143, 51.46552473766957], + [-0.11848390102387167, 51.4655038504508], + [-0.1186569035053321, 51.465703531871384], + ], + ], + }, + properties: null, + }, + area: { + hectares: 0.012592, + squareMetres: 125.92, + }, + }, + date: { + start: "2024-05-01", + completion: "2024-05-02", + }, + details: { + extend: { + area: { + squareMetres: 45, + }, + }, + vehicleParking: { + type: [ + { + value: "cars.offStreet.residents", + description: "Off-street parking for residents only", + }, + { + value: "bicycles.offStreet", + description: "Off-street parking for bicycles", + }, + ], + cars: { + count: { + existing: 1, + proposed: 1, + }, + offStreet: { + count: { + existing: 0, + proposed: 0, + }, + club: { + count: { + existing: 0, + proposed: 0, + }, + }, + disabled: { + count: { + existing: 0, + proposed: 0, + }, + }, + other: { + count: { + existing: 0, + proposed: 0, + }, + }, + residents: { + count: { + existing: 1, + proposed: 1, + }, + }, + }, + onStreet: { + count: { + existing: 0, + proposed: 0, + }, + club: { + count: { + existing: 0, + proposed: 0, + }, + }, + disabled: { + count: { + existing: 0, + proposed: 0, + }, + }, + other: { + count: { + existing: 0, + proposed: 0, + }, + }, + residents: { + count: { + existing: 0, + proposed: 0, + }, + }, + }, + }, + vans: { + count: { + existing: 0, + proposed: 0, + }, + offStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + onStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + }, + motorcycles: { + count: { + existing: 0, + proposed: 0, + }, + offStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + onStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + }, + bicycles: { + count: { + existing: 2, + proposed: 2, + }, + offStreet: { + count: { + existing: 2, + proposed: 2, + }, + }, + onStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + }, + buses: { + count: { + existing: 0, + proposed: 0, + }, + offStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + onStreet: { + count: { + existing: 0, + proposed: 0, + }, + }, + }, + }, + }, + }, + }, + result: [], + responses: [ + { + question: "Is the property in Lambeth?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "The property", + }, + }, + { + question: "What type of property is it?", + responses: [ + { + value: "House", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "The property", + }, + }, + { + question: "What type of house it is?", + responses: [ + { + value: "Terrace", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "The property", + }, + }, + { + question: "Is the property in a flood zone?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "The property", + }, + }, + { + question: "What type of property is it?", + responses: [ + { + value: "House", + metadata: { + flags: ["Listed building consent / Not required"], + }, + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "List the changes involved in the project", + responses: [ + { + value: "Add a roof extension", + metadata: { + flags: ["Listed building consent / Not required"], + }, + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "Have works already started?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "Is the property in a flood zone?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "What type of changes does the project involve?", + responses: [ + { + value: "Extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "Is the project to add an outbuilding?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "How much new floor area is being added to the house?", + responses: [ + { + value: "Less than 100m²", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: + "How much exactly is the internal floor area of the property increasing by?", + responses: [ + { + value: "45", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: + "Does the project involve creating any new bedrooms or bathrooms?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the wall materials of the existing house", + responses: [ + { + value: "London stock brick", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the wall materials of the new extension", + responses: [ + { + value: "Metallic cladding, reflective. Multiple colours.", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the material of the roof of the existing house", + responses: [ + { + value: "Grey slate", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the material for the new roof of the extension", + responses: [ + { + value: "Zinc panels", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the window materials of the existing house", + responses: [ + { + value: "Wooden sash windows, painted white", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the window materials of the extension", + responses: [ + { + value: "Brushed steel.", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the door materials of the existing house", + responses: [ + { + value: "Wood, painted.", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Describe the door materials of the extension", + responses: [ + { + value: "No door present", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: + "Are there any trees that could fall within the property or the areas affected by the project (the previously drawn outline)?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "Does the project involve any of these?", + responses: [ + { + value: "No, none of these", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "Is the property in Greater London?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "Does the site include more than one property?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Do you know the title number of the property?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: + "Does the property have an Energy Performance Certificate (EPC)?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "What type of application is this?", + responses: [ + { + value: "Planning permission for a home", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "When will the works start?", + responses: [ + { + value: "2024-05-01", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "When will the works be completed?", + responses: [ + { + value: "2024-05-02", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Does the site include parking spaces for any of these?", + responses: [ + { + value: "Cars", + }, + { + value: "Bicycles", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Total number of car parking spaces before", + responses: [ + { + value: "1", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "Total number of car parking spaces after", + responses: [ + { + value: "1", + }, + ], + metadata: { + sectionName: "About the project", + }, + }, + { + question: "What types of car parking space are present?", + responses: [ + { + value: "Off-street parking for residents only", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Off-street, residents-only car spaces before", + responses: [ + { + value: "1", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Off-street, residents-only car spaces after", + responses: [ + { + value: "1", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "What type of bicycle parking is there?", + responses: [ + { + value: "Off-street cycle parking", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Off-street bicycle spaces before", + responses: [ + { + value: "2", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Off-street bicycle spaces after", + responses: [ + { + value: "2", + }, + ], + metadata: { + policyRefs: [ + { + text: "Greater London Authority Act 1999", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Is the property on designated land?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "Does the property include any of these?", + responses: [ + { + value: "None of these", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) 2015 (as amended)", + }, + ], + sectionName: "About the project", + }, + }, + { + question: "Heritage Statement needed?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "Is the property in a flood zone?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About the project", + }, + }, + { + question: "What type of application is it?", + responses: [ + { + value: "Apply for planning permission", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About you", + }, + }, + { + question: "Your contact details", + responses: [ + { + value: "Mx Ziggy Stardust 01100 0110 0011 ziggy@example.com", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Is this a test?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Are you applying on behalf of someone else?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Which of these best describes you?", + responses: [ + { + value: "Friend or relative", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Your contact address", + responses: [ + { + value: + "40 Stansfield Road, Brixton, London, Greater London, SW9 9RZ, UK", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Which of these best describes the applicant?", + responses: [ + { + value: "Private individual", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Applicant's title", + responses: [ + { + value: "Mr", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Do you want to provide an email address for the applicant?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Do you want to provide a telephone number for the applicant?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: + "Is the applicant's contact address the same as the property address?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Which of these best describes you?", + responses: [ + { + value: "Friend or relative", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About you", + }, + }, + { + question: + "We may need to visit your site to assess your application. If we do, who should we contact to arrange the visit?", + responses: [ + { + value: "Me", + }, + ], + metadata: { + sectionName: "About you", + }, + }, + { + question: "Which of these best describes you?", + responses: [ + { + value: "Friend or relative acting on the applicant's behalf", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About you", + }, + }, + { + question: + "Which of these best describes the applicant's interest in the land?", + responses: [ + { + value: "Sole owner", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Development Management Procedure) (England) Order 2015", + }, + ], + sectionName: "About you", + }, + }, + { + question: + "Did you get any pre-application advice from the council before making this application?", + responses: [ + { + value: "No", + }, + ], + metadata: { + sectionName: "About this application", + }, + }, + { + question: "What type of planning application are you making?", + responses: [ + { + value: "Full planning permission", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "Is the property a home?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "What types of changes does the application relate to?", + responses: [ + { + value: "Extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "What type of extension is it?", + responses: [ + { + value: "Roof extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "List the changes involved in the roof extension", + responses: [ + { + value: "Add dormer", + }, + ], + metadata: { + sectionName: "About this application", + }, + }, + { + question: + "Is the purpose of the project to support the needs of a disabled resident?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012, Regulation 14UK Statutory Instruments 2012 No. 2920 Regulation 4, Equalities Act 2010, Section 6 Children Act 1989, Part 3", + }, + ], + sectionName: "About this application", + }, + }, + { + question: "Is it a prior approval application?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "Is the property a home?", + responses: [ + { + value: "Yes", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "What works does the project involve?", + responses: [ + { + value: "Extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "Is this application a resubmission?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012, Regulation 9", + }, + ], + sectionName: "About this application", + }, + }, + { + question: "Does the application qualify for a disability exemption?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "Does the application qualify for a resubmission exemption?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "Is the site a sports field?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012 Chapter 2, Paragraph 3", + }, + ], + sectionName: "About this application", + }, + }, + { + question: + "Is the application being made by (or on behalf of) a parish or community council?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012 - Regulation 11", + }, + ], + sectionName: "About this application", + }, + }, + { + question: + "Are you also submitting another proposal for the same site today?", + responses: [ + { + value: "No", + }, + ], + metadata: { + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012 Chapter 2, Paragraph 10", + }, + ], + sectionName: "About this application", + }, + }, + { + question: + "Does the application qualify for the sports club fee reduction?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: + "Does the application qualify for the parish council reduction?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012 - Regulation 11", + }, + ], + sectionName: "About this application", + }, + }, + { + question: + "Does the application qualify for the alternative application reduction?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Town and Country Planning (Fees for Applications, Deemed Applications, Requests and Site Visits) (England) Regulations 2012 Chapter 2, Paragraph 10", + }, + ], + sectionName: "About this application", + }, + }, + { + question: "What type of application is it?", + responses: [ + { + value: "Full planning permission", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "What does the project involve?", + responses: [ + { + value: "Extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "About this application", + }, + }, + { + question: "How much new floor area is being created?", + responses: [ + { + value: "Less than 100m²", + metadata: { + flags: ["Community infrastructure levy / Not liable"], + }, + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Community Infrastructure Levy Regulations 2010, Regulation 42", + }, + ], + sectionName: "About this application", + }, + }, + { + question: "Is this a householder planning application?", + responses: [ + { + value: "Yes", + metadata: { + flags: ["Community infrastructure levy / Not liable"], + }, + }, + ], + metadata: { + autoAnswered: true, + policyRefs: [ + { + text: "The Community Infrastructure Levy Regulations 2010, Regulation 42", + }, + ], + sectionName: "About this application", + }, + }, + { + question: "Have the works already started?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Upload drawings", + }, + }, + { + question: "What changes does the project involve?", + responses: [ + { + value: "Extension", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Upload drawings", + }, + }, + { + question: "Is the project to add an outbuilding?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Upload drawings", + }, + }, + { + question: "Which Local Planning authority is it?", + responses: [ + { + value: "Lambeth", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Check", + }, + }, + { + question: "Connections with London Borough of Lambeth", + responses: [ + { + value: "None of the above apply to me", + }, + ], + metadata: { + sectionName: "Check", + }, + }, + { + question: "I confirm that:", + responses: [ + { + value: + "The information contained in this application is truthful, accurate and complete, to the best of my knowledge", + }, + ], + metadata: { + sectionName: "Check", + }, + }, + { + question: "Does the application qualify for a disability exemption?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Pay and send", + }, + }, + { + question: "Does the application qualify for a resubmission exemption?", + responses: [ + { + value: "No", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Pay and send", + }, + }, + { + question: "Which Local Planning authority is it?", + responses: [ + { + value: "Lambeth", + }, + ], + metadata: { + autoAnswered: true, + sectionName: "Pay and send", + }, + }, + ], + files: [ + { + name: "https://api.editor.planx.dev/file/private/vg0av01p/RoofPlan.pdf", + type: [ + { + value: "property.drawing.roofPlan", + description: "Roof plan - existing", + }, + { + value: "proposal.drawing.roofPlan", + description: "Roof plan - proposed", + }, + ], + }, + { + name: "https://api.editor.planx.dev/file/private/ka97yl2c/Site%20plan.pdf", + type: [ + { + value: "property.drawing.sitePlan", + description: "Site plan - existing", + }, + { + value: "proposal.drawing.sitePlan", + description: "Site plan - proposed", + }, + ], + }, + { + name: "https://api.editor.planx.dev/file/private/osprppqo/Elevations.pdf", + type: [ + { + value: "property.drawing.elevation", + description: "Elevation plan - existing", + }, + { + value: "proposal.drawing.elevation", + description: "Elevation plan - proposed", + }, + ], + }, + { + name: "https://api.editor.planx.dev/file/private/cri3ziaj/Plan.pdf", + type: [ + { + value: "property.drawing.floorPlan", + description: "Floor plan - existing", + }, + { + value: "proposal.drawing.floorPlan", + description: "Floor plan - proposed", + }, + ], + }, + ], + metadata: { + service: { + flowId: "01e38c5d-e701-4e44-acdc-4d6b5cc3b854", + name: "Apply for planning permission", + owner: "Lambeth", + url: "https://www.editor.planx.dev/lambeth/apply-for-planning-permission/preview", + }, + session: { + source: "PlanX", + id: "81bcaa0f-baf5-4573-ba0a-ea868c573faf", + createdAt: "2023-10-01 00:00:00", + submittedAt: "2023-10-02 00:00:00", + }, + schema: { + url: "https://theopensystemslab.github.io/digital-planning-data-schemas/v0.0.1/schema.json", + }, + }, +}; diff --git a/doc/how-to/how-to-setup-custom-subdomains.md b/doc/how-to/how-to-setup-custom-subdomains.md index e501129655..52e50c18b4 100644 --- a/doc/how-to/how-to-setup-custom-subdomains.md +++ b/doc/how-to/how-to-setup-custom-subdomains.md @@ -33,8 +33,8 @@ This guide will walk through the process of setting a custom domain for a new te 4. **PlanX** - Format certificates if provided with PKCS #12 ```shell - openssl pkcs12 -nocerts -nodes -in -out council.key - openssl pkcs12 -nokeys -in -out council.cert + openssl pkcs12 -nocerts -nodes -in -out council.key [ -password pass: ] + openssl pkcs12 -nokeys -in -out council.cert [ -password pass: ] ``` The `.cert` file might contain the certificate chain inside it, so please separate the first certificate in the file (the certificate body) from the rest of the certificates in the file (the certificate chain). diff --git a/e2e/tests/api-driven/package.json b/e2e/tests/api-driven/package.json index 5d607b6297..b9a344bcb8 100644 --- a/e2e/tests/api-driven/package.json +++ b/e2e/tests/api-driven/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@cucumber/cucumber": "^9.3.0", - "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#d92224b", + "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#c2d6f35", "axios": "^1.4.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", diff --git a/e2e/tests/api-driven/pnpm-lock.yaml b/e2e/tests/api-driven/pnpm-lock.yaml index 88e4c5bfa6..a3b2a2f2bc 100644 --- a/e2e/tests/api-driven/pnpm-lock.yaml +++ b/e2e/tests/api-driven/pnpm-lock.yaml @@ -9,8 +9,8 @@ dependencies: specifier: ^9.3.0 version: 9.3.0 '@opensystemslab/planx-core': - specifier: git+https://github.com/theopensystemslab/planx-core#d92224b - version: github.com/theopensystemslab/planx-core/d92224b + specifier: git+https://github.com/theopensystemslab/planx-core#c2d6f35 + version: github.com/theopensystemslab/planx-core/c2d6f35 axios: specifier: ^1.4.0 version: 1.4.0 @@ -87,18 +87,18 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/runtime@7.22.15: - resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.13.11 dev: false - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.14.0 dev: false /@babel/types@7.22.5: @@ -271,7 +271,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -316,7 +316,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -351,7 +351,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(react@18.2.0) @@ -381,13 +381,13 @@ packages: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-visitor-keys: 3.4.3 dev: false @@ -413,8 +413,8 @@ packages: - supports-color dev: false - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + /@eslint/js@8.51.0: + resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -494,8 +494,8 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: false - /@mui/base@5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==} + /@mui/base@5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -505,10 +505,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.0.0 prop-types: 15.8.1 @@ -516,12 +516,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.11: - resolution: {integrity: sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==} + /@mui/core-downloads-tracker@5.14.13: + resolution: {integrity: sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==} dev: false - /@mui/material@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==} + /@mui/material@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -537,15 +537,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/base': 5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.11 - '@mui/system': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) - '@types/react-transition-group': 4.4.6 + '@mui/base': 5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.13 + '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) + '@types/react-transition-group': 4.4.7 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -555,8 +555,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.11(react@18.2.0): - resolution: {integrity: sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==} + /@mui/private-theming@5.14.13(react@18.2.0): + resolution: {integrity: sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -565,14 +565,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(react@18.2.0) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.13(react@18.2.0) prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==} + /@mui/styled-engine@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -584,7 +584,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) @@ -593,8 +593,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==} + /@mui/system@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -609,30 +609,30 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/private-theming': 5.14.11(react@18.2.0) - '@mui/styled-engine': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/private-theming': 5.14.13(react@18.2.0) + '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/types@7.2.4: - resolution: {integrity: sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==} + /@mui/types@7.2.6: + resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: - '@types/react': '*' + '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dev: false - /@mui/utils@5.14.11(react@18.2.0): - resolution: {integrity: sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==} + /@mui/utils@5.14.13(react@18.2.0): + resolution: {integrity: sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -641,8 +641,8 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/prop-types': 15.7.5 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.8 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 @@ -737,12 +737,12 @@ packages: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: false - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.8: + resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} dev: false - /@types/react-transition-group@4.4.6: - resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} + /@types/react-transition-group@4.4.7: + resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} dependencies: '@types/react': 18.2.18 dev: false @@ -750,7 +750,7 @@ packages: /@types/react@18.2.18: resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} dependencies: - '@types/prop-types': 15.7.5 + '@types/prop-types': 15.7.8 '@types/scheduler': 0.16.3 csstype: 3.1.2 dev: false @@ -881,7 +881,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 resolve: 1.22.2 dev: false @@ -1138,7 +1138,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 csstype: 3.1.2 dev: false @@ -1236,15 +1236,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + /eslint@8.51.0: + resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 + '@eslint/js': 8.51.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -1345,8 +1345,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: false - /fast-xml-parser@4.3.1: - resolution: {integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA==} + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true dependencies: strnum: 1.0.5 @@ -2170,7 +2170,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -2531,8 +2531,8 @@ packages: engines: {node: '>=10'} dev: false - /type-fest@4.3.3: - resolution: {integrity: sha512-bxhiFii6BBv6UiSDq7uKTMyADT9unXEl3ydGefndVLxFeB44LRbT4K7OJGDYSyDrKnklCC1Pre68qT2wbUl2Aw==} + /type-fest@4.4.0: + resolution: {integrity: sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw==} engines: {node: '>=16'} dev: false @@ -2711,12 +2711,12 @@ packages: toposort: 2.0.2 dev: false - /zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/theopensystemslab/planx-core/d92224b: - resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/d92224b} + github.com/theopensystemslab/planx-core/c2d6f35: + resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/c2d6f35} name: '@opensystemslab/planx-core' version: 1.0.0 prepare: true @@ -2724,14 +2724,14 @@ packages: dependencies: '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/material': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@types/geojson': 7946.0.11 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) copyfiles: 2.4.1 docx: 8.2.3 - eslint: 8.50.0 - fast-xml-parser: 4.3.1 + eslint: 8.51.0 + fast-xml-parser: 4.3.2 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-schema-to-typescript: 13.1.1 @@ -2750,9 +2750,9 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) striptags: 3.2.0 - type-fest: 4.3.3 + type-fest: 4.4.0 uuid: 9.0.1 - zod: 3.22.3 + zod: 3.22.4 transitivePeerDependencies: - '@types/react' - encoding diff --git a/e2e/tests/api-driven/src/invite-to-pay/mocks/server-mocks.yaml b/e2e/tests/api-driven/src/invite-to-pay/mocks/server-mocks.yaml index 2b19d122f7..a1419013a9 100644 --- a/e2e/tests/api-driven/src/invite-to-pay/mocks/server-mocks.yaml +++ b/e2e/tests/api-driven/src/invite-to-pay/mocks/server-mocks.yaml @@ -22,7 +22,7 @@ body: > { "access_token": "TEST_TOKEN", - "organisataion-name": "MOCKED", + "organisation-name": "MOCKED", "organisation-id": "MOCKED" } diff --git a/e2e/tests/api-driven/src/permissions/helpers.ts b/e2e/tests/api-driven/src/permissions/helpers.ts index 0f6d829a28..c191c0cfd9 100644 --- a/e2e/tests/api-driven/src/permissions/helpers.ts +++ b/e2e/tests/api-driven/src/permissions/helpers.ts @@ -58,6 +58,8 @@ export const setup = async () => { return world; }; +export type GQLQueryResult = unknown[] | Record<"returning", unknown[]> | null; + export const performGQLQuery = async ({ world, action, @@ -66,7 +68,7 @@ export const performGQLQuery = async ({ const query = queries[table][action]; const variables = buildVariables(query, world); const client = (await getClient(world.activeUserEmail)).client; - const { result } = await client.request>( + const { result } = await client.request>( query, variables, ); diff --git a/e2e/tests/api-driven/src/permissions/steps.ts b/e2e/tests/api-driven/src/permissions/steps.ts index d0dc8e175c..31d84c5880 100644 --- a/e2e/tests/api-driven/src/permissions/steps.ts +++ b/e2e/tests/api-driven/src/permissions/steps.ts @@ -3,6 +3,7 @@ import { strict as assert } from "node:assert"; import { getUser } from "../globalHelpers"; import { Action, + GQLQueryResult, Table, addUserToTeam, cleanup, @@ -28,7 +29,7 @@ export class CustomWorld extends World { activeUserEmail!: string; error?: Error = undefined; - result: unknown[] | Record<"returning", unknown[]> | null = null; + result: GQLQueryResult = null; } Before("@team-admin-permissions", async function () { diff --git a/e2e/tests/ui-driven/package.json b/e2e/tests/ui-driven/package.json index 65fcf76221..105b72501f 100644 --- a/e2e/tests/ui-driven/package.json +++ b/e2e/tests/ui-driven/package.json @@ -8,7 +8,7 @@ "postinstall": "./install-dependencies.sh" }, "dependencies": { - "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#d92224b", + "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#c2d6f35", "axios": "^1.4.0", "dotenv": "^16.3.1", "eslint": "^8.44.0", diff --git a/e2e/tests/ui-driven/pnpm-lock.yaml b/e2e/tests/ui-driven/pnpm-lock.yaml index cf65f35302..c252e37c2e 100644 --- a/e2e/tests/ui-driven/pnpm-lock.yaml +++ b/e2e/tests/ui-driven/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@opensystemslab/planx-core': - specifier: git+https://github.com/theopensystemslab/planx-core#d92224b - version: github.com/theopensystemslab/planx-core/d92224b + specifier: git+https://github.com/theopensystemslab/planx-core#c2d6f35 + version: github.com/theopensystemslab/planx-core/c2d6f35 axios: specifier: ^1.4.0 version: 1.4.0 @@ -87,8 +87,8 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/runtime@7.22.15: - resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -117,7 +117,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -162,7 +162,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -197,7 +197,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(react@18.2.0) @@ -236,13 +236,13 @@ packages: eslint: 8.47.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-visitor-keys: 3.4.3 dev: false @@ -270,8 +270,8 @@ packages: resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + /@eslint/js@8.51.0: + resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -343,8 +343,8 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: false - /@mui/base@5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==} + /@mui/base@5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -354,10 +354,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.0.0 prop-types: 15.8.1 @@ -365,12 +365,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.11: - resolution: {integrity: sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==} + /@mui/core-downloads-tracker@5.14.13: + resolution: {integrity: sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==} dev: false - /@mui/material@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==} + /@mui/material@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -386,15 +386,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/base': 5.0.0-beta.17(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.11 - '@mui/system': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) - '@types/react-transition-group': 4.4.6 + '@mui/base': 5.0.0-beta.19(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.13 + '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) + '@types/react-transition-group': 4.4.7 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -404,8 +404,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.11(react@18.2.0): - resolution: {integrity: sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==} + /@mui/private-theming@5.14.13(react@18.2.0): + resolution: {integrity: sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -414,14 +414,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(react@18.2.0) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.13(react@18.2.0) prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==} + /@mui/styled-engine@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -433,7 +433,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) @@ -442,8 +442,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==} + /@mui/system@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -458,30 +458,30 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/private-theming': 5.14.11(react@18.2.0) - '@mui/styled-engine': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4 - '@mui/utils': 5.14.11(react@18.2.0) + '@mui/private-theming': 5.14.13(react@18.2.0) + '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6 + '@mui/utils': 5.14.13(react@18.2.0) clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/types@7.2.4: - resolution: {integrity: sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==} + /@mui/types@7.2.6: + resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: - '@types/react': '*' + '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dev: false - /@mui/utils@5.14.11(react@18.2.0): - resolution: {integrity: sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==} + /@mui/utils@5.14.13(react@18.2.0): + resolution: {integrity: sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -490,8 +490,8 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/prop-types': 15.7.5 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.8 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 @@ -568,12 +568,12 @@ packages: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: false - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.8: + resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} dev: false - /@types/react-transition-group@4.4.6: - resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} + /@types/react-transition-group@4.4.7: + resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} dependencies: '@types/react': 18.2.20 dev: false @@ -581,7 +581,7 @@ packages: /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} dependencies: - '@types/prop-types': 15.7.5 + '@types/prop-types': 15.7.8 '@types/scheduler': 0.16.3 csstype: 3.1.2 dev: false @@ -717,7 +717,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 resolve: 1.22.4 dev: false @@ -1003,7 +1003,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 csstype: 3.1.2 dev: false @@ -1152,15 +1152,15 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + /eslint@8.51.0: + resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 + '@eslint/js': 8.51.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -1269,8 +1269,8 @@ packages: punycode: 1.4.1 dev: false - /fast-xml-parser@4.3.1: - resolution: {integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA==} + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true dependencies: strnum: 1.0.5 @@ -2023,7 +2023,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -2336,8 +2336,8 @@ packages: engines: {node: '>=12.20'} dev: false - /type-fest@4.3.3: - resolution: {integrity: sha512-bxhiFii6BBv6UiSDq7uKTMyADT9unXEl3ydGefndVLxFeB44LRbT4K7OJGDYSyDrKnklCC1Pre68qT2wbUl2Aw==} + /type-fest@4.4.0: + resolution: {integrity: sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw==} engines: {node: '>=16'} dev: false @@ -2487,12 +2487,12 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/theopensystemslab/planx-core/d92224b: - resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/d92224b} + github.com/theopensystemslab/planx-core/c2d6f35: + resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/c2d6f35} name: '@opensystemslab/planx-core' version: 1.0.0 prepare: true @@ -2500,14 +2500,14 @@ packages: dependencies: '@emotion/react': 11.11.1(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(react@18.2.0) - '@mui/material': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@types/geojson': 7946.0.11 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) copyfiles: 2.4.1 docx: 8.2.3 - eslint: 8.50.0 - fast-xml-parser: 4.3.1 + eslint: 8.51.0 + fast-xml-parser: 4.3.2 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-schema-to-typescript: 13.1.1 @@ -2526,9 +2526,9 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) striptags: 3.2.0 - type-fest: 4.3.3 + type-fest: 4.4.0 uuid: 9.0.1 - zod: 3.22.3 + zod: 3.22.4 transitivePeerDependencies: - '@types/react' - encoding diff --git a/e2e/tests/ui-driven/src/context.ts b/e2e/tests/ui-driven/src/context.ts index 788230a062..88972b80dd 100644 --- a/e2e/tests/ui-driven/src/context.ts +++ b/e2e/tests/ui-driven/src/context.ts @@ -15,7 +15,7 @@ export interface Context { team: { id?: number; name: string; - slug?: string; + slug: string; logo: string; primaryColor: string; homepage: string; @@ -50,13 +50,13 @@ export const contextDefaults: Context = { export async function setUpTestContext( initialContext: Context, ): Promise { - const core = getCoreDomainClient(); + const $admin = getCoreDomainClient(); const context: Context = { ...initialContext }; if (context.user) { - context.user.id = await core.createUser(context.user); + context.user.id = await $admin.user.create(context.user); } if (context.team) { - context.team.id = await core.createTeam({ + context.team.id = await $admin.team.create({ slug: context.team.slug, name: context.team.name, logo: context.team.logo, @@ -71,12 +71,12 @@ export async function setUpTestContext( context.team?.id && context.user?.id ) { - context.flow.id = await core.createFlow({ + context.flow.id = await $admin.flow.create({ slug: context.flow.slug, teamId: context.team.id, data: context.flow!.data!, }); - context.flow.publishedId = await core.publishFlow({ + context.flow.publishedId = await $admin.flow.publish({ flow: { id: context.flow.id, data: context.flow!.data!, diff --git a/editor.planx.uk/.env b/editor.planx.uk/.env index bfc257b33f..033982c6fe 100644 --- a/editor.planx.uk/.env +++ b/editor.planx.uk/.env @@ -1,5 +1,6 @@ # Used in local development and testing, overwritten in .env.production # This file does not (and should not) contain secrets - all values here are publicly exposed +# If you're working off a fork of Planx, please replace the AIRBRAKE and FEEDBACK_FISH values with a mock value like "SECRET" REACT_APP_AIRBRAKE_PROJECT_ID=329753 REACT_APP_AIRBRAKE_PROJECT_KEY=388fe6f4cc0d6644c923500d5672a5b6 diff --git a/editor.planx.uk/package.json b/editor.planx.uk/package.json index 7424e59526..a6bc59d031 100644 --- a/editor.planx.uk/package.json +++ b/editor.planx.uk/package.json @@ -14,7 +14,7 @@ "@mui/styles": "^5.14.5", "@mui/utils": "^5.14.5", "@opensystemslab/map": "^0.7.5", - "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#d92224b", + "@opensystemslab/planx-core": "git+https://github.com/theopensystemslab/planx-core#c2d6f35", "@tiptap/core": "^2.0.3", "@tiptap/extension-bold": "^2.0.3", "@tiptap/extension-bubble-menu": "^2.1.6", diff --git a/editor.planx.uk/pnpm-lock.yaml b/editor.planx.uk/pnpm-lock.yaml index d9cb4b60e1..c5e7b2aaca 100644 --- a/editor.planx.uk/pnpm-lock.yaml +++ b/editor.planx.uk/pnpm-lock.yaml @@ -46,8 +46,8 @@ dependencies: specifier: ^0.7.5 version: 0.7.5 '@opensystemslab/planx-core': - specifier: git+https://github.com/theopensystemslab/planx-core#d92224b - version: git/github.com+theopensystemslab/planx-core/d92224b(@types/react@18.2.20) + specifier: git+https://github.com/theopensystemslab/planx-core#c2d6f35 + version: github.com/theopensystemslab/planx-core/c2d6f35(@types/react@18.2.20) '@tiptap/core': specifier: ^2.0.3 version: 2.0.3(@tiptap/pm@2.0.3) @@ -571,6 +571,13 @@ packages: default-browser-id: 3.0.0 dev: true + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -597,7 +604,7 @@ packages: '@babel/helpers': 7.22.6 '@babel/parser': 7.22.7 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.5 '@nicolo-ribaudo/semver-v6': 6.3.3 convert-source-map: 1.9.0 @@ -619,8 +626,8 @@ packages: '@babel/helpers': 7.22.6 '@babel/parser': 7.22.7 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -646,7 +653,7 @@ packages: resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -655,7 +662,16 @@ packages: resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -664,13 +680,13 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8): resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==} @@ -733,7 +749,7 @@ packages: dependencies: '@babel/core': 7.22.8 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -751,7 +767,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -768,7 +784,7 @@ packages: dependencies: '@babel/core': 7.22.8 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 @@ -788,7 +804,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 @@ -855,28 +871,31 @@ packages: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} @@ -894,20 +913,20 @@ packages: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -918,11 +937,11 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.8): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} @@ -955,7 +974,7 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} @@ -969,9 +988,9 @@ packages: dependencies: '@babel/core': 7.22.8 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color dev: true @@ -984,9 +1003,9 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -1017,12 +1036,12 @@ packages: resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -1030,19 +1049,19 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} @@ -1070,8 +1089,8 @@ packages: dependencies: '@babel/helper-function-name': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -1080,16 +1099,24 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 @@ -1098,7 +1125,14 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.8): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} @@ -1701,7 +1735,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.8 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.8) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.8) @@ -1716,7 +1750,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) @@ -1849,7 +1883,7 @@ packages: '@babel/core': 7.22.8 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.8) - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 @@ -1869,7 +1903,7 @@ packages: '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.9) - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 @@ -2250,7 +2284,7 @@ packages: '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 transitivePeerDependencies: - supports-color dev: true @@ -2265,7 +2299,7 @@ packages: '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 transitivePeerDependencies: - supports-color @@ -3180,7 +3214,7 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 babel-plugin-polyfill-corejs2: 0.4.4(@babel/core@7.22.9) babel-plugin-polyfill-corejs3: 0.8.2(@babel/core@7.22.9) babel-plugin-polyfill-regenerator: 0.5.1(@babel/core@7.22.9) @@ -3223,7 +3257,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.8) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.8) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 esutils: 2.0.3 dev: true @@ -3236,7 +3270,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 esutils: 2.0.3 /@babel/preset-react@7.22.5(@babel/core@7.22.8): @@ -3317,6 +3351,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 + dev: true /@babel/runtime@7.22.6: resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} @@ -3324,26 +3359,40 @@ packages: dependencies: regenerator-runtime: 0.13.11 + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.5 '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.7 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -3818,7 +3867,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -3854,7 +3903,7 @@ packages: peerDependencies: react: '>=16.3.0' dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/cache': 10.0.29 '@emotion/css': 10.0.27 '@emotion/serialize': 0.11.16 @@ -3954,7 +4003,7 @@ packages: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/core': 10.3.1(react@18.2.0) '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 @@ -4443,13 +4492,13 @@ packages: eslint: 8.44.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-visitor-keys: 3.4.3 dev: false @@ -4499,8 +4548,8 @@ packages: resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + /@eslint/js@8.51.0: + resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -5039,8 +5088,8 @@ packages: '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.9) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 '@linaria/logger': 4.0.0 babel-merge: 3.0.0(@babel/core@7.22.9) transitivePeerDependencies: @@ -5096,13 +5145,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@material-ui/styles': 4.11.5(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@material-ui/system': 4.12.2(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@material-ui/types': 5.1.0(@types/react@18.2.20) '@material-ui/utils': 4.11.3(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.20 - '@types/react-transition-group': 4.4.6 + '@types/react-transition-group': 4.4.7 clsx: 1.2.1 hoist-non-react-statics: 3.3.2 popper.js: 1.16.1-lts @@ -5125,7 +5174,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/hash': 0.8.0 '@material-ui/types': 5.1.0(@types/react@18.2.20) '@material-ui/utils': 4.11.3(react-dom@18.2.0)(react@18.2.0) @@ -5157,7 +5206,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@material-ui/utils': 4.11.3(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.20 csstype: 2.6.21 @@ -5184,7 +5233,7 @@ packages: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5212,10 +5261,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/is-prop-valid': 1.2.1 - '@mui/types': 7.2.4(@types/react@18.2.20) - '@mui/utils': 5.14.10(@types/react@18.2.20)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.20) + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@popperjs/core': 2.11.8 '@types/react': 18.2.20 clsx: 2.0.0 @@ -5225,8 +5274,8 @@ packages: react-is: 18.2.0 dev: false - /@mui/base@5.0.0-beta.17(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==} + /@mui/base@5.0.0-beta.19(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-maNBgAscddyPNzFZQUJDF/puxM27Li+NqSBsr/lAP8TLns2VvWS2SoL3OKFOIoRnAMKGY/Ic6Aot6gCYeQnssA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -5236,10 +5285,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.4(@types/react@18.2.20) - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.20) + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@popperjs/core': 2.11.8 '@types/react': 18.2.20 clsx: 2.0.0 @@ -5248,8 +5297,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.14.11: - resolution: {integrity: sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==} + /@mui/core-downloads-tracker@5.14.13: + resolution: {integrity: sha512-3ZUbzcH4yloLKlV6Y+S0Edn2wef9t+EGHSfEkwVCn8E0ULdshifEFgfEroKRegQifDIwcKS/ofccxuZ8njTAYg==} dev: false /@mui/core-downloads-tracker@5.14.5: @@ -5273,8 +5322,8 @@ packages: react: 18.2.0 dev: false - /@mui/material@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==} + /@mui/material@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iPEFwhoVG789UVsXX4gqd1eJUlcLW1oceqwJYQN8Z4MpcAKfL9Lv3fda65AwG7pQ5lf+d7IbHzm4m48SWZxI2g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -5290,16 +5339,16 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) - '@mui/base': 5.0.0-beta.17(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.14.11 - '@mui/system': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react@18.2.0) - '@mui/types': 7.2.4(@types/react@18.2.20) - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) + '@mui/base': 5.0.0-beta.19(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.14.13 + '@mui/system': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.20) + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@types/react': 18.2.20 - '@types/react-transition-group': 4.4.6 + '@types/react-transition-group': 4.4.7 clsx: 2.0.0 csstype: 3.1.2 prop-types: 15.8.1 @@ -5345,25 +5394,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/private-theming@5.14.10(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /@mui/private-theming@5.14.11(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==} + /@mui/private-theming@5.14.13(@types/react@18.2.20)(react@18.2.0): + resolution: {integrity: sha512-5EFqk4tqiSwPguj4NW/6bUf4u1qoUWXy9lrKfNh9H6oAohM+Ijv/7qSxFjnxPGBctj469/Sc5aKAR35ILBKZLQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -5372,8 +5404,8 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@types/react': 18.2.20 prop-types: 15.8.1 react: 18.2.0 @@ -5389,37 +5421,15 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) + '@babel/runtime': 7.23.2 + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@types/react': 18.2.20 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.14.10(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - dependencies: - '@babel/runtime': 7.22.15 - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) - csstype: 3.1.2 - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /@mui/styled-engine@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==} + /@mui/styled-engine@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-1ff/egFQl26hiwcUtCMKAkp4Sgqpm3qIewmXq+GN27fb44lDIACquehMFBuadOjceOFmbIXbayzbA46ZyqFYzA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -5431,7 +5441,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) @@ -5471,8 +5481,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==} + /@mui/system@5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react@18.2.0): + resolution: {integrity: sha512-+5+Dx50lG4csbx2sGjrKLozXQJeCpJ4dIBZolyFLkZ+XphD1keQWouLUvJkPQ3MSglLLKuD37pp52YjMncZMEQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -5487,13 +5497,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) - '@mui/private-theming': 5.14.11(@types/react@18.2.20)(react@18.2.0) - '@mui/styled-engine': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4(@types/react@18.2.20) - '@mui/utils': 5.14.11(@types/react@18.2.20)(react@18.2.0) + '@mui/private-theming': 5.14.13(@types/react@18.2.20)(react@18.2.0) + '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.20) + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@types/react': 18.2.20 clsx: 2.0.0 csstype: 3.1.2 @@ -5517,13 +5527,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) - '@mui/private-theming': 5.14.10(@types/react@18.2.20)(react@18.2.0) - '@mui/styled-engine': 5.14.10(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/types': 7.2.4(@types/react@18.2.20) - '@mui/utils': 5.14.10(@types/react@18.2.20)(react@18.2.0) + '@mui/private-theming': 5.14.13(@types/react@18.2.20)(react@18.2.0) + '@mui/styled-engine': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.6(@types/react@18.2.20) + '@mui/utils': 5.14.13(@types/react@18.2.20)(react@18.2.0) '@types/react': 18.2.20 clsx: 2.0.0 csstype: 3.1.2 @@ -5542,26 +5552,19 @@ packages: '@types/react': 18.2.20 dev: false - /@mui/utils@5.14.10(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q==} - engines: {node: '>=12.0.0'} + /@mui/types@7.2.6(@types/react@18.2.20): + resolution: {integrity: sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/prop-types': 15.7.5 '@types/react': 18.2.20 - prop-types: 15.8.1 - react: 18.2.0 - react-is: 18.2.0 dev: false - /@mui/utils@5.14.11(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==} + /@mui/utils@5.14.13(@types/react@18.2.20)(react@18.2.0): + resolution: {integrity: sha512-2AFpyXWw7uDCIqRu7eU2i/EplZtks5LAMzQvIhC79sPV9IhOZU2qwOWVnPtdctRXiQJOAaXulg+A37pfhEueQw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -5570,8 +5573,8 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/prop-types': 15.7.5 + '@babel/runtime': 7.23.2 + '@types/prop-types': 15.7.8 '@types/react': 18.2.20 prop-types: 15.8.1 react: 18.2.0 @@ -5875,13 +5878,13 @@ packages: /@remirror/core-constants@2.0.1: resolution: {integrity: sha512-ZR4aihtnnT9lMbhh5DEbsriJRlukRXmLZe7HmM+6ufJNNUDoazc75UX26xbgQlNUqgAqMcUdGFAnPc1JwgAdLQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dev: false /@remirror/core-helpers@2.0.3: resolution: {integrity: sha512-LqIPF4stGG69l9qu/FFicv9d9B+YaItzgDMC5A0CEvDQfKkGD3BfabLmfpnuWbsc06oKGdTduilgWcALLZoYLg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@linaria/core': 4.2.9 '@remirror/core-constants': 2.0.1 '@remirror/types': 1.0.1 @@ -6496,7 +6499,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.1.1 '@storybook/core-common': 7.1.1 @@ -6572,7 +6575,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@storybook/csf': 0.1.1 '@storybook/csf-tools': 7.1.1 '@storybook/node-logger': 7.1.1 @@ -6736,8 +6739,8 @@ packages: dependencies: '@babel/generator': 7.22.9 '@babel/parser': 7.22.7 - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 '@storybook/csf': 0.1.1 '@storybook/types': 7.1.1 fs-extra: 11.1.1 @@ -7252,7 +7255,7 @@ packages: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@svgr/plugin-jsx@5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} @@ -7786,7 +7789,7 @@ packages: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.20.1 @@ -7794,18 +7797,18 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@types/babel__traverse@7.20.1: resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -8077,6 +8080,10 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/prop-types@15.7.8: + resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} + dev: false + /@types/q@1.5.5: resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} @@ -8142,6 +8149,12 @@ packages: resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} dependencies: '@types/react': 18.2.20 + dev: false + + /@types/react-transition-group@4.4.7: + resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} + dependencies: + '@types/react': 18.2.20 /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} @@ -9154,7 +9167,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.1 '@types/babel__traverse': 7.20.1 dev: true @@ -9164,14 +9177,14 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@types/babel__core': 7.20.1 '@types/babel__traverse': 7.20.1 /babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 cosmiconfig: 6.0.0 resolve: 1.22.2 dev: true @@ -9180,7 +9193,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 cosmiconfig: 7.1.0 resolve: 1.22.2 @@ -9367,7 +9380,7 @@ packages: '@babel/preset-env': 7.22.7(@babel/core@7.22.9) '@babel/preset-react': 7.22.5(@babel/core@7.22.9) '@babel/preset-typescript': 7.23.0(@babel/core@7.22.9) - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -9690,7 +9703,7 @@ packages: engines: {node: '>=10.0.0'} requiresBuild: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@types/raf': 3.4.0 core-js: 3.31.1 raf: 3.4.1 @@ -10407,7 +10420,7 @@ packages: /css-vendor@2.0.8: resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 is-in-browser: 1.1.3 /css-what@3.4.2: @@ -10845,7 +10858,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 csstype: 3.1.2 /dom-serializer@0.2.2: @@ -11804,15 +11817,15 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + /eslint@8.51.0: + resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 + '@eslint/js': 8.51.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -11895,8 +11908,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -12126,8 +12139,8 @@ packages: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} dev: false - /fast-xml-parser@4.3.1: - resolution: {integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA==} + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true dependencies: strnum: 1.0.5 @@ -12926,7 +12939,7 @@ packages: /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.1 @@ -14188,8 +14201,8 @@ packages: '@babel/core': 7.22.9 '@babel/generator': 7.22.9 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) - '@babel/traverse': 7.22.8 - '@babel/types': 7.22.5 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.1 @@ -14551,7 +14564,7 @@ packages: /jspdf@2.5.1: resolution: {integrity: sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 atob: 2.1.2 btoa: 1.2.1 fflate: 0.4.8 @@ -14565,53 +14578,53 @@ packages: /jss-plugin-camel-case@10.10.0: resolution: {integrity: sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 hyphenate-style-name: 1.0.4 jss: 10.10.0 /jss-plugin-default-unit@10.10.0: resolution: {integrity: sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 jss: 10.10.0 /jss-plugin-global@10.10.0: resolution: {integrity: sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 jss: 10.10.0 /jss-plugin-nested@10.10.0: resolution: {integrity: sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 jss: 10.10.0 tiny-warning: 1.0.3 /jss-plugin-props-sort@10.10.0: resolution: {integrity: sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 jss: 10.10.0 /jss-plugin-rule-value-function@10.10.0: resolution: {integrity: sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 jss: 10.10.0 tiny-warning: 1.0.3 /jss-plugin-vendor-prefixer@10.10.0: resolution: {integrity: sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 css-vendor: 2.0.8 jss: 10.10.0 /jss@10.10.0: resolution: {integrity: sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 csstype: 3.1.2 is-in-browser: 1.1.3 tiny-warning: 1.0.3 @@ -17179,7 +17192,7 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.30.2 dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@remirror/core-constants': 2.0.1 '@remirror/core-helpers': 2.0.3 escape-string-regexp: 4.0.0 @@ -17521,7 +17534,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/generator': 7.22.9 - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -17603,7 +17616,7 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 @@ -17723,7 +17736,7 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@types/react-redux': 7.1.25 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -17875,7 +17888,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -18030,7 +18043,7 @@ packages: /redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dev: false /regenerate-unicode-properties@10.1.0: @@ -18055,7 +18068,7 @@ packages: /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -18340,7 +18353,7 @@ packages: /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 dev: false /run-parallel@1.2.0: @@ -19850,8 +19863,8 @@ packages: engines: {node: '>=16'} dev: false - /type-fest@4.3.3: - resolution: {integrity: sha512-bxhiFii6BBv6UiSDq7uKTMyADT9unXEl3ydGefndVLxFeB44LRbT4K7OJGDYSyDrKnklCC1Pre68qT2wbUl2Aw==} + /type-fest@4.4.0: + resolution: {integrity: sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw==} engines: {node: '>=16'} dev: false @@ -20576,7 +20589,7 @@ packages: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.22.9 '@babel/preset-env': 7.22.7(@babel/core@7.22.9) - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.2 '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.9)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) @@ -20909,6 +20922,10 @@ packages: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} dev: false + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + /zustand@4.3.9(immer@9.0.21)(react@18.2.0): resolution: {integrity: sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==} engines: {node: '>=12.7.0'} @@ -20926,9 +20943,9 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - git/github.com+theopensystemslab/planx-core/d92224b(@types/react@18.2.20): - resolution: {commit: d92224b, repo: git@github.com:theopensystemslab/planx-core.git, type: git} - id: git@github.com+theopensystemslab/planx-core/d92224b + github.com/theopensystemslab/planx-core/c2d6f35(@types/react@18.2.20): + resolution: {tarball: https://codeload.github.com/theopensystemslab/planx-core/tar.gz/c2d6f35} + id: github.com/theopensystemslab/planx-core/c2d6f35 name: '@opensystemslab/planx-core' version: 1.0.0 prepare: true @@ -20936,14 +20953,14 @@ packages: dependencies: '@emotion/react': 11.11.1(@types/react@18.2.20)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.20)(react@18.2.0) - '@mui/material': 5.14.11(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.14.13(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@types/geojson': 7946.0.11 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) copyfiles: 2.4.1 docx: 8.2.3 - eslint: 8.50.0 - fast-xml-parser: 4.3.1 + eslint: 8.51.0 + fast-xml-parser: 4.3.2 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-schema-to-typescript: 13.1.1 @@ -20962,9 +20979,9 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) striptags: 3.2.0 - type-fest: 4.3.3 + type-fest: 4.4.0 uuid: 9.0.1 - zod: 3.22.3 + zod: 3.22.4 transitivePeerDependencies: - '@types/react' - encoding diff --git a/editor.planx.uk/src/@planx/components/Checklist/Public.tsx b/editor.planx.uk/src/@planx/components/Checklist/Public.tsx index e583700818..f944eac47d 100644 --- a/editor.planx.uk/src/@planx/components/Checklist/Public.tsx +++ b/editor.planx.uk/src/@planx/components/Checklist/Public.tsx @@ -41,7 +41,7 @@ function getFlatOptions({ return options; } if (groupedOptions) { - return groupedOptions.flatMap((group: any) => group.children); + return groupedOptions.flatMap((group) => group.children); } return []; } @@ -142,9 +142,9 @@ const ChecklistComponent: React.FC = ({ {options ? ( - options.map((option: any) => + options.map((option) => layout === ChecklistLayout.Basic ? ( - + = ({ isExpanded ? "-expanded" : "" }`} > - {group.children.map((option: any) => ( + {group.children.map((option) => ( = (props) => { policyRef={props.policyRef} howMeasured={props.howMeasured} /> - + ); }; diff --git a/editor.planx.uk/src/@planx/components/Notice/Public.tsx b/editor.planx.uk/src/@planx/components/Notice/Public.tsx index a6ce0f753a..4fd28a55ee 100644 --- a/editor.planx.uk/src/@planx/components/Notice/Public.tsx +++ b/editor.planx.uk/src/@planx/components/Notice/Public.tsx @@ -9,6 +9,7 @@ import Card from "@planx/components/shared/Preview/Card"; import { contentFlowSpacing } from "@planx/components/shared/Preview/Card"; import QuestionHeader from "@planx/components/shared/Preview/QuestionHeader"; import { PublicProps } from "@planx/components/ui"; +import { useAnalyticsTracking } from "pages/FlowEditor/lib/analyticsProvider"; import React from "react"; import { getContrastTextColor } from "styleUtils"; import { FONT_WEIGHT_SEMI_BOLD } from "theme"; @@ -75,6 +76,13 @@ const NoticeComponent: React.FC = (props) => { ? () => props.handleSubmit?.() : undefined; + const { trackResetFlow } = useAnalyticsTracking(); + + const handleNoticeResetClick = () => { + trackResetFlow(); + props.resetPreview && props.resetPreview(); + }; + return ( <> @@ -105,7 +113,7 @@ const NoticeComponent: React.FC = (props) => { variant="contained" size="large" type="submit" - onClick={props.resetPreview} + onClick={handleNoticeResetClick} sx={contentFlowSpacing} > Back to start diff --git a/editor.planx.uk/src/@planx/components/shared/index.ts b/editor.planx.uk/src/@planx/components/shared/index.ts index 2c5bda3cfd..364bc753bd 100644 --- a/editor.planx.uk/src/@planx/components/shared/index.ts +++ b/editor.planx.uk/src/@planx/components/shared/index.ts @@ -19,12 +19,12 @@ export const parseMoreInformation = ( }); export interface Option { - id?: string; + id: string; data: { description?: string; flag?: string; img?: string; - text?: string; + text: string; val?: string; }; } diff --git a/editor.planx.uk/src/components/Header.tsx b/editor.planx.uk/src/components/Header.tsx index d8ea18c2c9..6b1b62f9a0 100644 --- a/editor.planx.uk/src/components/Header.tsx +++ b/editor.planx.uk/src/components/Header.tsx @@ -316,12 +316,15 @@ const PublicToolbar: React.FC<{ theme.breakpoints.up("md"), ); + const { trackResetFlow } = useAnalyticsTracking(); + const handleRestart = async () => { if ( confirm( "Are you sure you want to restart? This will delete your previous answers", ) ) { + trackResetFlow(); if (path === ApplicationPath.SingleSession) { clearLocalFlow(id); window.location.reload(); diff --git a/editor.planx.uk/src/pages/FlowEditor/lib/analyticsProvider.tsx b/editor.planx.uk/src/pages/FlowEditor/lib/analyticsProvider.tsx index 3aef3a108f..f2ba6ed71f 100644 --- a/editor.planx.uk/src/pages/FlowEditor/lib/analyticsProvider.tsx +++ b/editor.planx.uk/src/pages/FlowEditor/lib/analyticsProvider.tsx @@ -1,5 +1,9 @@ import { gql } from "@apollo/client"; -import { DEFAULT_FLAG_CATEGORY } from "@opensystemslab/planx-core/types"; +import { + DEFAULT_FLAG_CATEGORY, + Flag, + FlagSet, +} from "@opensystemslab/planx-core/types"; import { TYPES } from "@planx/components/types"; import { publicClient } from "lib/graphql"; import React, { createContext, useContext, useEffect, useState } from "react"; @@ -7,10 +11,19 @@ import React, { createContext, useContext, useEffect, useState } from "react"; import { Store, useStore } from "./store"; export type AnalyticsType = "init" | "resume"; -type AnalyticsLogDirection = AnalyticsType | "forwards" | "backwards"; +type AnalyticsLogDirection = AnalyticsType | "forwards" | "backwards" | "reset"; export type HelpClickMetadata = Record; -export type SelectedUrlsMetadata = Record<'selectedUrls', string[]>; +export type SelectedUrlsMetadata = Record<"selectedUrls", string[]>; + +type NodeMetadata = { + flagset?: FlagSet; + displayText?: { + heading?: string; + description?: string; + }; + flag?: Flag; +}; let lastAnalyticsLogId: number | undefined = undefined; @@ -18,11 +31,13 @@ const analyticsContext = createContext<{ createAnalytics: (type: AnalyticsType) => Promise; trackHelpClick: (metadata?: HelpClickMetadata) => Promise; trackNextStepsLinkClick: (metadata?: SelectedUrlsMetadata) => Promise; + trackResetFlow: () => Promise; node: Store.node | null; }>({ createAnalytics: () => Promise.resolve(), trackHelpClick: () => Promise.resolve(), trackNextStepsLinkClick: () => Promise.resolve(), + trackResetFlow: () => Promise.resolve(), node: null, }); const { Provider } = analyticsContext; @@ -104,6 +119,7 @@ export const AnalyticsProvider: React.FC<{ children: React.ReactNode }> = ({ createAnalytics, trackHelpClick, trackNextStepsLinkClick, + trackResetFlow, node, }} > @@ -117,7 +133,31 @@ export const AnalyticsProvider: React.FC<{ children: React.ReactNode }> = ({ node?.type === TYPES.Content ? getContentTitle(node) : node?.data?.title ?? node?.data?.text ?? node?.data?.flagSet; + // On component transition create the new analytics log + const result = await insertNewAnalyticsLog( + direction, + analyticsId, + metadata, + node_title, + ); + const id = result?.data.insert_analytics_logs_one?.id; + const newLogCreatedAt = result?.data.insert_analytics_logs_one?.created_at; + + // On successful create of a new log update the previous log with the next_log_created_at + // This allows us to estimate how long a user spend on a card + if (lastAnalyticsLogId && newLogCreatedAt) { + updateLastLogWithNextLogCreatedAt(lastAnalyticsLogId, newLogCreatedAt); + } + lastAnalyticsLogId = id; + } + + async function insertNewAnalyticsLog( + direction: AnalyticsLogDirection, + analyticsId: number, + metadata: NodeMetadata, + node_title: string, + ) { const result = await publicClient.mutate({ mutation: gql` mutation InsertNewAnalyticsLog( @@ -138,6 +178,7 @@ export const AnalyticsProvider: React.FC<{ children: React.ReactNode }> = ({ } ) { id + created_at } } `, @@ -149,8 +190,32 @@ export const AnalyticsProvider: React.FC<{ children: React.ReactNode }> = ({ node_title: node_title, }, }); - const id = result?.data.insert_analytics_logs_one?.id; - lastAnalyticsLogId = id; + return result; + } + + async function updateLastLogWithNextLogCreatedAt( + lastAnalyticsLogId: number, + newLogCreatedAt: Date, + ) { + await publicClient.mutate({ + mutation: gql` + mutation UpdateNextLogCreatedAt( + $id: bigint! + $next_log_created_at: timestamptz + ) { + update_analytics_logs_by_pk( + pk_columns: { id: $id } + _set: { next_log_created_at: $next_log_created_at } + ) { + id + } + } + `, + variables: { + id: lastAnalyticsLogId, + next_log_created_at: newLogCreatedAt, + }, + }); } async function trackHelpClick(metadata?: HelpClickMetadata) { @@ -199,6 +264,27 @@ export const AnalyticsProvider: React.FC<{ children: React.ReactNode }> = ({ } } + async function trackResetFlow() { + if (shouldTrackAnalytics && lastAnalyticsLogId) { + await publicClient.mutate({ + mutation: gql` + mutation UpdateHasResetFlow($id: bigint!, $flow_direction: String) { + update_analytics_logs_by_pk( + pk_columns: { id: $id } + _set: { flow_direction: $flow_direction } + ) { + id + } + } + `, + variables: { + id: lastAnalyticsLogId, + flow_direction: "reset", + }, + }); + } + } + async function createAnalytics(type: AnalyticsType) { if (shouldTrackAnalytics) { const response = await publicClient.mutate({ diff --git a/editor.planx.uk/src/pages/Preview/StatusPage.tsx b/editor.planx.uk/src/pages/Preview/StatusPage.tsx index 898fb0a494..9f80b4003c 100644 --- a/editor.planx.uk/src/pages/Preview/StatusPage.tsx +++ b/editor.planx.uk/src/pages/Preview/StatusPage.tsx @@ -96,7 +96,9 @@ const StatusPage: React.FC = ({ onClick={removeSessionIdSearchParam} sx={contentFlowSpacing} > - Start new application + + Start new application + )} diff --git a/editor.planx.uk/src/ui/InputLabel.tsx b/editor.planx.uk/src/ui/InputLabel.tsx index 1cff695688..0ee71532dc 100644 --- a/editor.planx.uk/src/ui/InputLabel.tsx +++ b/editor.planx.uk/src/ui/InputLabel.tsx @@ -6,9 +6,6 @@ import React, { ReactNode } from "react"; const Root = styled("label")(() => ({ display: "block", width: "100%", - "& > :not(:first-child)": { - width: "100%", - }, })); export default function InputLabel(props: { diff --git a/editor.planx.uk/src/ui/NextStepsList.tsx b/editor.planx.uk/src/ui/NextStepsList.tsx index e7feb561f1..5d8bf5b3a8 100644 --- a/editor.planx.uk/src/ui/NextStepsList.tsx +++ b/editor.planx.uk/src/ui/NextStepsList.tsx @@ -80,7 +80,11 @@ function LinkStep(props: ListItemProps) { href={props.url} target="_blank" rel="noopener" - onClick={() => props.handleSelectingUrl && props.url && props.handleSelectingUrl(props.url)} + onClick={() => + props.handleSelectingUrl && + props.url && + props.handleSelectingUrl(props.url) + } > @@ -119,19 +123,19 @@ const Step = ({ title, description, url }: ListItemProps) => ( function NextStepsList(props: NextStepsListProps) { const [selectedUrls, setSelectedUrls] = useState([]); - const { trackNextStepsLinkClick } = useAnalyticsTracking() + const { trackNextStepsLinkClick } = useAnalyticsTracking(); const handleSelectingUrl = (newUrl: string) => { - setSelectedUrls(prevSelectedUrls => [...prevSelectedUrls, newUrl]); - trackNextStepsLinkClick({'selectedUrls': [...selectedUrls, newUrl]}) - } + setSelectedUrls((prevSelectedUrls) => [...prevSelectedUrls, newUrl]); + trackNextStepsLinkClick({ selectedUrls: [...selectedUrls, newUrl] }); + }; return ( {props.steps?.map((step, i) => ( {step.url ? ( - + ) : ( )} diff --git a/hasura.planx.uk/metadata/tables.yaml b/hasura.planx.uk/metadata/tables.yaml index 5b5f621381..f4d1793f57 100644 --- a/hasura.planx.uk/metadata/tables.yaml +++ b/hasura.planx.uk/metadata/tables.yaml @@ -38,14 +38,17 @@ permission: columns: - analytics_id + - created_at - id filter: {} update_permissions: - role: public permission: columns: + - flow_direction - has_clicked_help - metadata + - next_log_created_at filter: {} check: null - table: diff --git a/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/down.sql b/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/down.sql new file mode 100644 index 0000000000..1bcde2b08b --- /dev/null +++ b/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/down.sql @@ -0,0 +1 @@ +alter table "public"."analytics_logs" drop column "next_log_created_at"; diff --git a/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/up.sql b/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/up.sql new file mode 100644 index 0000000000..128ae327d5 --- /dev/null +++ b/hasura.planx.uk/migrations/1697540635734_alter_table_public_analytics_logs_add_column_next_log_created_at/up.sql @@ -0,0 +1,2 @@ +alter table "public"."analytics_logs" add column "next_log_created_at" timestamp with time zone + null; diff --git a/hasura.planx.uk/tests/pnpm-lock.yaml b/hasura.planx.uk/tests/pnpm-lock.yaml index 951da664c9..075b3a1fcc 100644 --- a/hasura.planx.uk/tests/pnpm-lock.yaml +++ b/hasura.planx.uk/tests/pnpm-lock.yaml @@ -34,6 +34,14 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: false + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: false + /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -58,7 +66,7 @@ packages: '@babel/helpers': 7.22.6 '@babel/parser': 7.22.7 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.5 '@nicolo-ribaudo/semver-v6': 6.3.3 convert-source-map: 1.9.0 @@ -79,6 +87,16 @@ packages: jsesc: 2.5.2 dev: false + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: false + /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8): resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==} engines: {node: '>=6.9.0'} @@ -93,24 +111,29 @@ packages: lru-cache: 5.1.1 dev: false + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: false /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: false /@babel/helper-module-imports@7.22.5: @@ -130,7 +153,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color @@ -152,7 +175,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: false /@babel/helper-string-parser@7.22.5: @@ -160,6 +183,11 @@ packages: engines: {node: '>=6.9.0'} dev: false + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -175,12 +203,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/traverse': 7.22.8 + '@babel/traverse': 7.23.2 '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: false + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -198,6 +235,14 @@ packages: '@babel/types': 7.22.5 dev: false + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: false + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.8): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -327,6 +372,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: false + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -336,18 +390,18 @@ packages: '@babel/types': 7.22.5 dev: false - /@babel/traverse@7.22.8: - resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.7 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.7 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -363,6 +417,15 @@ packages: to-fast-properties: 2.0.0 dev: false + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: false diff --git a/infrastructure/application/Pulumi.production.yaml b/infrastructure/application/Pulumi.production.yaml index d8a9787720..7d3b2ea301 100644 --- a/infrastructure/application/Pulumi.production.yaml +++ b/infrastructure/application/Pulumi.production.yaml @@ -37,11 +37,9 @@ config: application:slack-webhook-url: secure: AAABANpjl5NnZcSFTUB3iHS4qsQuSgHGkki0yYn/LEB9Oq6kqg/RFSvwl6toXoLjgKRwhcguba8Qyp/gA+nCSMyFu7i36QVFiTRjPFsoQ9esTEo/zGqyNf2tCL/AFd+oE2/WLo1TSq7/Qt7hVm49 application:ssl-bucks-cert: - secure: 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 - application:ssl-bucks-chain: - secure: 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 + secure: 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 application:ssl-bucks-key: - secure: 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 + secure: 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 application:ssl-doncaster-cert: secure: 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 application:ssl-doncaster-key: diff --git a/infrastructure/application/index.ts b/infrastructure/application/index.ts index 6b23995a7b..b29e8a1710 100644 --- a/infrastructure/application/index.ts +++ b/infrastructure/application/index.ts @@ -285,7 +285,7 @@ export = async () => { context: "../../api.planx.uk", target: "production", }), - memory: 2048 /*MB*/, + memory: 4096 /*MB*/, portMappings: [apiListenerHttp], environment: [ { name: "NODE_ENV", value: env }, diff --git a/scripts/seed-database/write/users.sql b/scripts/seed-database/write/users.sql index d814f880fc..adcd172074 100644 --- a/scripts/seed-database/write/users.sql +++ b/scripts/seed-database/write/users.sql @@ -11,6 +11,11 @@ CREATE TEMPORARY TABLE sync_users ( \copy sync_users FROM '/tmp/users.csv' WITH (FORMAT csv, DELIMITER ';'); +-- Do not automatically generate team_member records for the templates team +-- We manually truncate and replace the team_members table in another step +ALTER TABLE + users DISABLE TRIGGER grant_new_user_template_team_access; + INSERT INTO users ( id, first_name, @@ -27,4 +32,7 @@ SELECT FROM sync_users ON CONFLICT (id) DO NOTHING; +ALTER TABLE + users ENABLE TRIGGER grant_new_user_template_team_access; + SELECT setval('users_id_seq', max(id)) FROM users;