From 880c53aceaef3dca5d3bd859bea3c7b17b7b3275 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Fri, 4 Nov 2022 10:56:16 +0100 Subject: [PATCH 01/50] refactor: Deprecation --- app/configurator/config-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/configurator/config-types.ts b/app/configurator/config-types.ts index bec7d1e67..adf78d7f7 100644 --- a/app/configurator/config-types.ts +++ b/app/configurator/config-types.ts @@ -1,6 +1,6 @@ /* eslint-disable no-redeclare */ import { fold } from "fp-ts/lib/Either"; -import { pipe } from "fp-ts/lib/pipeable"; +import { pipe } from "fp-ts/lib/function"; import * as t from "io-ts"; import { DataCubeMetadata } from "@/graphql/types"; From 7a87e2ef39e3ec71a1dff11914a3845b8a9af6c0 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Wed, 2 Nov 2022 16:10:18 +0100 Subject: [PATCH 02/50] refactor: Remove unused --- app/pages/api/cube-view-test.ts | 52 --------------------------------- app/rdf/queries.ts | 27 +---------------- 2 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 app/pages/api/cube-view-test.ts diff --git a/app/pages/api/cube-view-test.ts b/app/pages/api/cube-view-test.ts deleted file mode 100644 index ece9ee738..000000000 --- a/app/pages/api/cube-view-test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { NextApiRequest, NextApiResponse } from "next"; -import ParsingClient from "sparql-http-client/ParsingClient"; - -import { DEFAULT_DATA_SOURCE } from "@/domain/datasource"; - -import { getCubeDimensions, getCubes } from "../../rdf/queries"; -/** - * Endpoint to write configuration to. - */ -const route = async (req: NextApiRequest, res: NextApiResponse) => { - const { method } = req; - - switch (method) { - case "GET": - try { - const locale = "de"; - const result = await getCubes({ - locale, - includeDrafts: true, - sourceUrl: DEFAULT_DATA_SOURCE.url, - }); - - const sparqlClient = new ParsingClient({ - endpointUrl: DEFAULT_DATA_SOURCE.url, - }); - - const cubesWithDimensions = await Promise.all( - result.map(async ({ cube, locale, data }) => { - return { - ...data, - dimensions: ( - await getCubeDimensions({ cube, locale, sparqlClient }) - ).map(({ data }) => data), - }; - }) - ); - - // TODO: Make this 201 and set final URI as Location header - res.status(200).json(cubesWithDimensions); - } catch (e) { - console.error(e); - res.status(500).json({ message: "Something went wrong!" }); - } - - break; - default: - res.setHeader("Allow", ["GET"]); - res.status(405).end(`Method ${method} Not Allowed`); - } -}; - -export default route; diff --git a/app/rdf/queries.ts b/app/rdf/queries.ts index 1d6ae67af..80aa8e558 100644 --- a/app/rdf/queries.ts +++ b/app/rdf/queries.ts @@ -12,8 +12,7 @@ import { Literal, NamedNode } from "rdf-js"; import { ParsingClient } from "sparql-http-client/ParsingClient"; import { PromiseValue, truthy } from "@/domain/types"; -import { createSource, pragmas } from "@/rdf/create-source"; -import { makeCubeFilters } from "@/rdf/cube-filters"; +import { pragmas } from "@/rdf/create-source"; import { Filters } from "../configurator"; import { @@ -23,7 +22,6 @@ import { parseObservationValue, shouldValuesBeLoadedForResolvedDimension, } from "../domain/data"; -import { DataCubeSearchFilter } from "../graphql/query-hooks"; import { ResolvedDataCube, ResolvedDimension } from "../graphql/shared-types"; import * as ns from "./namespace"; @@ -103,29 +101,6 @@ const getLatestCube = async (cube: Cube): Promise => { return cube; }; -export const getCubes = async ({ - includeDrafts, - sourceUrl, - locale, - filters, -}: { - includeDrafts: boolean; - sourceUrl: string; - locale: string; - filters?: DataCubeSearchFilter[]; -}): Promise => { - const source = createSource({ endpointUrl: sourceUrl }); - - const cubesFilters = makeCubeFilters({ includeDrafts, filters }); - - const cubes = await source.cubes({ - noShape: true, - filters: cubesFilters, - }); - - return cubes.map((cube) => parseCube({ cube, locale })); -}; - export const getResolvedCube = async ({ cube, locale, From 3dd5d268202ae9e3c1a561c75665ab24a4ec1517 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 1 Nov 2022 16:08:46 +0100 Subject: [PATCH 03/50] fix: Use syntax recognized by both yarn and npm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f350bbaa..7ad0e42dd 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "eslint": "^7.29.0", "eslint-config-next": "^11.0.1", "eslint-plugin-unused-imports": "^2.0.0", - "eslint-plugin-visualize-admin": "link:./eslint/visualize-admin", + "eslint-plugin-visualize-admin": "file:./eslint/visualize-admin", "fs-extra": "^10.0.0", "import-move-codemod": "^0.0.3", "prettier": "^2.1.2", From ed5454dbc9089f465b7abd42f4d010ee20bdbaaf Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Fri, 4 Nov 2022 11:02:31 +0100 Subject: [PATCH 04/50] fix: Allow undefined value for prop in no-large-sx rule --- eslint/visualize-admin/no-large-sx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint/visualize-admin/no-large-sx.js b/eslint/visualize-admin/no-large-sx.js index 9115a709e..4c8ef56bc 100644 --- a/eslint/visualize-admin/no-large-sx.js +++ b/eslint/visualize-admin/no-large-sx.js @@ -29,7 +29,7 @@ module.exports = { const value = node.value; // Count of literal properties excluding ignored properties - if (value.type === "JSXExpressionContainer") { + if (value && value.type === "JSXExpressionContainer") { const props = (value.expression.properties && value.expression.properties.filter( From cf25b0dcc692dbb8f90759a1ba90416571e9dd92 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Fri, 28 Oct 2022 10:13:15 +0200 Subject: [PATCH 05/50] docs: Add keycloak documentation --- README.md | 39 +++++++++++++++++++++ keycloak-visualize-client-dev.json | 56 ++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 keycloak-visualize-client-dev.json diff --git a/README.md b/README.md index 54fa986c1..7546c871b 100644 --- a/README.md +++ b/README.md @@ -144,3 +144,42 @@ Those charts configurations are kept in the repository. At the moment, the screenshots are made from charts using data from int.lindas.admin.ch as for some functionalities, we do not yet have production data. + +## Authentication + +Authentication by eIAM through a Keycloak instance. +We use Next-auth to integrate our application with Keycloak. +See https://next-auth.js.org/providers/keycloak for documentation. + +### Locally + +The easiest way is to run Keycloak via Docker. + +``` +docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:19.0.3 start-dev +``` + +⚠️ After creating the container via the above command, if you stop it, restart the container via the docker UI so that you re-use the +same storage, otherwise you'll have to reconfigure Keycloak. + +To configure Keycloak: + +- Access the [Keycloak admin][keycloak-admin] +- Create client application + - Via import: [Keycloak][keycloak-admin] > Clients > Import client + - Use the exported client `keycloak-visualize-client-dev.json` + - Manually: [Keycloak][keycloak-admin] > Clients > Create client + - id: "visualize" + - Choose OpenIDConnect + - In next slide, toggle "Client Authentication" on + - Configure redirect URI on client + - Root URL: `http://localhost:3000` + - Redirect URI: `/api/auth/callback/keycloak` +- Create a user + - Set a password to the user (in Credentials tab) +- Set environment variables in `.env.local` + - KEYCLOAK_ID: "visualize" + - KEYCLOAK_SECRET: From [Keycloak][keycloak-admin] > Clients > visualize > Credentials > Client secret + - KEYCLOAK_ISSUER: http://localhost:8080/realms/master + +[keycloak-admin]: http://localhost:8080/admin/master/console/#/ diff --git a/keycloak-visualize-client-dev.json b/keycloak-visualize-client-dev.json new file mode 100644 index 000000000..849926185 --- /dev/null +++ b/keycloak-visualize-client-dev.json @@ -0,0 +1,56 @@ +{ + "clientId": "visualize", + "name": "Visualize", + "description": "", + "rootUrl": "http://localhost:3000", + "adminUrl": "", + "baseUrl": "", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "aWlV1E9vcTg4xL9uV7EQkjdRw1jrthu0", + "redirectUris": [ + "/api/auth/callback/keycloak" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": true, + "protocol": "openid-connect", + "attributes": { + "oidc.ciba.grant.enabled": "false", + "client.secret.creation.time": "1666946287", + "backchannel.logout.session.required": "true", + "display.on.consent.screen": "false", + "oauth2.device.authorization.grant.enabled": "false", + "backchannel.logout.revoke.offline.tokens": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "defaultClientScopes": [ + "web-origins", + "acr", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ], + "access": { + "view": true, + "configure": true, + "manage": true + } +} \ No newline at end of file From 604548bbb3c52c669a5144ee1a011c55d7168b28 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Wed, 7 Sep 2022 16:54:29 +0200 Subject: [PATCH 06/50] feat: Add scaffold for auth - Add Keycloak auth provider using next-auth + Remove unused cypress --- app/domain/env.ts | 3 + app/package.json | 4 + app/pages/_app.tsx | 40 +- app/pages/api/auth/[...nextauth].ts | 43 + app/typings/next-auth.ts | 18 + package.json | 3 - yarn.lock | 2087 ++++++--------------------- 7 files changed, 565 insertions(+), 1633 deletions(-) create mode 100644 app/pages/api/auth/[...nextauth].ts create mode 100644 app/typings/next-auth.ts diff --git a/app/domain/env.ts b/app/domain/env.ts index 11874dca4..d004832e9 100644 --- a/app/domain/env.ts +++ b/app/domain/env.ts @@ -50,6 +50,9 @@ export const GA_TRACKING_ID = */ export const DATABASE_URL = process.env.DATABASE_URL; +export const KEYCLOAK_ID = process.env.KEYCLOAK_ID; +export const KEYCLOAK_SECRET = process.env.KEYCLOAK_SECRET; +export const KEYCLOAK_ISSUER = process.env.KEYCLOAK_ISSUER; /** * Variables set at **BUILD TIME** through `NEXT_PUBLIC_*` variables. Available on the client and server. diff --git a/app/package.json b/app/package.json index 6a6e0539e..23040c09d 100644 --- a/app/package.json +++ b/app/package.json @@ -41,6 +41,7 @@ "@tpluscode/rdf-ns-builders": "2.0.1", "@tpluscode/rdf-string": "^0.2.26", "@tpluscode/sparql-builder": "^0.3.24", + "@types/dotenv": "^8.2.0", "@types/react-inspector": "^4.0.2", "@types/topojson-client": "^3.0.0", "@urql/devtools": "^2.0.3", @@ -58,6 +59,8 @@ "d3-time-format": "3.0.0", "dataloader": "^2.0.0", "date-fns": "^2.28.0", + "dotenv": "^16.0.3", + "dotenv-cli": "^6.0.0", "exceljs": "^4.3.0", "file-saver": "^2.0.2", "flexsearch": "^0.6.32", @@ -82,6 +85,7 @@ "micro-cors": "^0.1.1", "mitt": "^3.0.0", "nanoid": "^3.1.12", + "next-auth": "^4.10.3", "nprogress": "^0.2.0", "pg": "^8.3.3", "pg-connection-string": "^2.3.0", diff --git a/app/pages/_app.tsx b/app/pages/_app.tsx index c00341edf..f80d05f9a 100644 --- a/app/pages/_app.tsx +++ b/app/pages/_app.tsx @@ -2,6 +2,7 @@ import { I18nProvider } from "@lingui/react"; // Used for color-picker component. Must include here because of next.js constraints about global CSS imports import "core-js/features/array/flat-map"; import { CssBaseline, ThemeProvider } from "@mui/material"; +import { SessionProvider } from "next-auth/react"; import { AppProps } from "next/app"; import Head from "next/head"; import { useRouter } from "next/router"; @@ -25,7 +26,10 @@ const pageLaunchedWithDebug = (process.env.NODE_ENV === "development" || new URL(window.location.toString()).searchParams?.get("debug") === "true"); -export default function App({ Component, pageProps }: AppProps) { +export default function App({ + Component, + pageProps: { session, ...pageProps }, +}: AppProps) { const { events: routerEvents, asPath, locale: routerLocale } = useRouter(); useNProgress(); @@ -80,22 +84,24 @@ export default function App({ Component, pageProps }: AppProps) { ))} - - - - - - - {shouldShowDebug ? : null} - - - - - - - - - + + + + + + + + {shouldShowDebug ? : null} + + + + + + + + + + ); } diff --git a/app/pages/api/auth/[...nextauth].ts b/app/pages/api/auth/[...nextauth].ts new file mode 100644 index 000000000..2f633a6bc --- /dev/null +++ b/app/pages/api/auth/[...nextauth].ts @@ -0,0 +1,43 @@ +import NextAuth, { NextAuthOptions } from "next-auth"; +import KeycloakProvider from "next-auth/providers/keycloak"; + +import { KEYCLOAK_ID, KEYCLOAK_SECRET, KEYCLOAK_ISSUER } from "@/domain/env"; +import { truthy } from "@/domain/types"; + +import type { NextApiRequest, NextApiResponse } from "next"; + +const providers = [ + KEYCLOAK_ID && KEYCLOAK_SECRET + ? KeycloakProvider({ + clientId: KEYCLOAK_ID as string, + clientSecret: KEYCLOAK_SECRET as string, + issuer: KEYCLOAK_ISSUER as string, + }) + : null, +].filter(truthy); + +const nextAuthConfig = { + // Configure one or more authentication providers + providers, + callbacks: { + session: async ({ session, token }) => { + if (session.user && token.sub) { + session.user.id = token.sub; + } + return session; + }, + /** Necessary otherwise we cannot sign out */ + jwt: async ({ token }) => { + return token; + }, + }, +} as NextAuthOptions; + +export default async function auth(req: NextApiRequest, res: NextApiResponse) { + try { + await NextAuth(req, res, nextAuthConfig); + } catch (e) { + console.error(e); + throw e; + } +} diff --git a/app/typings/next-auth.ts b/app/typings/next-auth.ts new file mode 100644 index 000000000..ee94aaf73 --- /dev/null +++ b/app/typings/next-auth.ts @@ -0,0 +1,18 @@ +/* eslint-disable */ +// @ts-ignore It's necessary to import the module even if it's not used +import NextAuth from "next-auth"; +/* eslint-enable */ + +declare module "next-auth" { + /** + * Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context + */ + interface Session { + user: { + /** The user's id (comes from the "sub" property of the JWT token). */ + id: string; + /** The user's name (comes from the "sub" property of the JWT token). */ + name: string; + }; + } +} diff --git a/package.json b/package.json index 7ad0e42dd..9986128e4 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,6 @@ "@typescript-eslint/utils": "^5.35.1", "babel-core": "^7.0.0-bridge.0", "babel-plugin-macros": "^3.0.0", - "cypress": "7", - "cypress-network-idle": "^1.4.1", - "cypress-plugin-snapshots": "^1.4.4", "eslint": "^7.29.0", "eslint-config-next": "^11.0.1", "eslint-plugin-unused-imports": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index a19d1f319..e38e5cce2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -104,7 +104,7 @@ "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" @@ -133,7 +133,29 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== -"@babel/core@7.12.9", "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.14.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.7.7": +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.7.7": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== @@ -163,21 +185,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" - integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== - dependencies: - "@babel/types" "^7.19.0" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.12.5", "@babel/generator@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.1.tgz#ef32ecd426222624cbd94871a7024639cf61a9fa" + integrity sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.0" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -309,6 +322,20 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + "@babel/helper-module-transforms@^7.14.5": version "7.15.8" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz" @@ -323,34 +350,6 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helper-module-transforms@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" - integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.19.4" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" - "@babel/helper-optimise-call-expression@^7.14.5", "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" @@ -390,13 +389,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - "@babel/helper-simple-access@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" @@ -435,11 +427,16 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" @@ -450,11 +447,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" @@ -465,14 +457,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.12.5": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" + integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.0" "@babel/helpers@^7.19.4": version "7.19.4" @@ -483,7 +475,16 @@ "@babel/traverse" "^7.19.4" "@babel/types" "^7.19.4" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== @@ -492,19 +493,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" +"@babel/parser@7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== -"@babel/parser@7.12.16", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.13", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.0", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4", "@babel/parser@^7.19.6", "@babel/parser@^7.7.2": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" - integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.4", "@babel/parser@^7.19.6", "@babel/parser@^7.20.1", "@babel/parser@^7.7.2": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.1.tgz#3e045a92f7b4623cafc2425eddcb8cf2e54f9cc5" + integrity sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw== "@babel/plugin-proposal-class-properties@^7.0.0": version "7.14.5" @@ -832,6 +829,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.16.3": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": version "7.17.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" @@ -844,6 +848,15 @@ resolved "https://registry.npmjs.org/@babel/standalone/-/standalone-7.14.6.tgz" integrity sha512-oAoSp82jhJFnXKybKTOj5QF04XxiDRyiiqrFToiU1udlBXuZoADlPmmnOcuqBrZxSNNUjzJIVK8vt838Qoqjxg== +"@babel/template@^7.12.7", "@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" @@ -853,15 +866,6 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - "@babel/traverse@7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz" @@ -892,35 +896,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.0.tgz#eb9c561c7360005c592cc645abafe0c3c4548eed" - integrity sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA== +"@babel/traverse@^7.12.9", "@babel/traverse@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" + integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" + "@babel/generator" "^7.20.1" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.0" - "@babel/types" "^7.19.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.1" + "@babel/types" "^7.20.0" debug "^4.1.0" globals "^11.1.0" @@ -981,6 +969,15 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@babel/types@^7.12.7", "@babel/types@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479" + integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@babel/types@^7.16.7": version "7.17.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" @@ -1015,15 +1012,6 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - "@babel/types@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" @@ -1068,40 +1056,6 @@ lodash "^4.17.19" tabtab "^3.0.2" -"@cypress/request@^2.88.5": - version "2.88.5" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz" - integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - "@date-io/core@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.13.1.tgz#f041765aff5c55fbc7e37fdd75fc1792733426d6" @@ -1404,7 +1358,7 @@ "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -1889,7 +1843,7 @@ "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -1898,7 +1852,7 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@iarna/toml@^2.2.5": @@ -2102,326 +2056,6 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jimp/bmp@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.10.3.tgz" - integrity sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - bmp-js "^0.1.0" - core-js "^3.4.1" - -"@jimp/core@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/core/-/core-0.10.3.tgz" - integrity sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - any-base "^1.1.0" - buffer "^5.2.0" - core-js "^3.4.1" - exif-parser "^0.1.12" - file-type "^9.0.0" - load-bmfont "^1.3.1" - mkdirp "^0.5.1" - phin "^2.9.1" - pixelmatch "^4.0.2" - tinycolor2 "^1.4.1" - -"@jimp/custom@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/custom/-/custom-0.10.3.tgz" - integrity sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/core" "^0.10.3" - core-js "^3.4.1" - -"@jimp/gif@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/gif/-/gif-0.10.3.tgz" - integrity sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - omggif "^1.0.9" - -"@jimp/jpeg@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.10.3.tgz" - integrity sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - jpeg-js "^0.3.4" - -"@jimp/plugin-blit@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz" - integrity sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-blur@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz" - integrity sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-circle@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz" - integrity sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-color@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.10.3.tgz" - integrity sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - tinycolor2 "^1.4.1" - -"@jimp/plugin-contain@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz" - integrity sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-cover@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz" - integrity sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-crop@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz" - integrity sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-displace@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz" - integrity sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-dither@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz" - integrity sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-fisheye@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz" - integrity sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-flip@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz" - integrity sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-gaussian@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz" - integrity sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-invert@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz" - integrity sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-mask@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz" - integrity sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-normalize@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz" - integrity sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-print@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.10.3.tgz" - integrity sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - load-bmfont "^1.4.0" - -"@jimp/plugin-resize@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz" - integrity sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-rotate@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz" - integrity sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-scale@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz" - integrity sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-shadow@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz" - integrity sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugin-threshold@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz" - integrity sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - -"@jimp/plugins@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.10.3.tgz" - integrity sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/plugin-blit" "^0.10.3" - "@jimp/plugin-blur" "^0.10.3" - "@jimp/plugin-circle" "^0.10.3" - "@jimp/plugin-color" "^0.10.3" - "@jimp/plugin-contain" "^0.10.3" - "@jimp/plugin-cover" "^0.10.3" - "@jimp/plugin-crop" "^0.10.3" - "@jimp/plugin-displace" "^0.10.3" - "@jimp/plugin-dither" "^0.10.3" - "@jimp/plugin-fisheye" "^0.10.3" - "@jimp/plugin-flip" "^0.10.3" - "@jimp/plugin-gaussian" "^0.10.3" - "@jimp/plugin-invert" "^0.10.3" - "@jimp/plugin-mask" "^0.10.3" - "@jimp/plugin-normalize" "^0.10.3" - "@jimp/plugin-print" "^0.10.3" - "@jimp/plugin-resize" "^0.10.3" - "@jimp/plugin-rotate" "^0.10.3" - "@jimp/plugin-scale" "^0.10.3" - "@jimp/plugin-shadow" "^0.10.3" - "@jimp/plugin-threshold" "^0.10.3" - core-js "^3.4.1" - timm "^1.6.1" - -"@jimp/png@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/png/-/png-0.10.3.tgz" - integrity sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.10.3" - core-js "^3.4.1" - pngjs "^3.3.3" - -"@jimp/tiff@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.10.3.tgz" - integrity sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g== - dependencies: - "@babel/runtime" "^7.7.2" - core-js "^3.4.1" - utif "^2.0.1" - -"@jimp/types@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/types/-/types-0.10.3.tgz" - integrity sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/bmp" "^0.10.3" - "@jimp/gif" "^0.10.3" - "@jimp/jpeg" "^0.10.3" - "@jimp/png" "^0.10.3" - "@jimp/tiff" "^0.10.3" - core-js "^3.4.1" - timm "^1.6.1" - -"@jimp/utils@^0.10.3": - version "0.10.3" - resolved "https://registry.npmjs.org/@jimp/utils/-/utils-0.10.3.tgz" - integrity sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w== - dependencies: - "@babel/runtime" "^7.7.2" - core-js "^3.4.1" - regenerator-runtime "^0.13.3" - "@josephg/resolvable@^1.0.0": version "1.0.1" resolved "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz" @@ -3220,6 +2854,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@panva/hkdf@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6" + integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA== + "@playwright-testing-library/test@^4.5.0": version "4.5.0" resolved "https://registry.yarnpkg.com/@playwright-testing-library/test/-/test-4.5.0.tgz#62f5c21f1eb1bbb7a08e9bf1f73302844c1bd791" @@ -3319,6 +2958,23 @@ resolved "https://registry.npmjs.org/@preconstruct/next/-/next-3.0.0.tgz" integrity sha512-G90cyJX9w4Zr3Bt/j2fURgDhsJb5+agqf4YUgrvDe3Dyvbbssy9a6d0tzLH0ehfa2Osxw/EEhQb+W4X+v/x06A== +"@prisma/client@^4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.5.0.tgz#f708549bee3da396d5741d846b4e4306b120210c" + integrity sha512-B2cV0OPI1smhdYUxsJoLYQLoMlLH06MUxgFUWQnHodGMX98VRVXKmQE/9OcrTNkqtke5RC+YU24Szxd04tZA2g== + dependencies: + "@prisma/engines-version" "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452" + +"@prisma/engines-version@4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452": + version "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452.tgz#5b7fae294ee9bd9790d0e7b7a0b0912e4222ac08" + integrity sha512-o7LyVx8PPJBLrEzLl6lpxxk2D5VnlM4Fwmrbq0NoT6pr5aa1OuHD9ZG+WJY6TlR/iD9bhmo2LNcxddCMr5Rv2A== + +"@prisma/engines@4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.5.0.tgz#82df347a893a5ae2a67707d44772ba181f4b9328" + integrity sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g== + "@probe.gl/env@3.5.0", "@probe.gl/env@^3.5.0": version "3.5.0" resolved "https://registry.npmjs.org/@probe.gl/env/-/env-3.5.0.tgz" @@ -4213,6 +3869,13 @@ "@types/d3-transition" "*" "@types/d3-zoom" "*" +"@types/dotenv@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/dotenv/-/dotenv-8.2.0.tgz#5cd64710c3c98e82d9d15844375a33bf1b45d053" + integrity sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw== + dependencies: + dotenv "*" + "@types/engine.io@*": version "3.1.5" resolved "https://registry.npmjs.org/@types/engine.io/-/engine.io-3.1.5.tgz" @@ -4525,16 +4188,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24" integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A== -"@types/node@^14.14.31", "@types/node@^14.14.9": - version "14.17.3" - resolved "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz" - integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== - "@types/node@^14.14.37": version "14.18.26" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.26.tgz#239e19f8b4ea1a9eb710528061c1d733dc561996" integrity sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA== +"@types/node@^14.14.9": + version "14.17.3" + resolved "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz" + integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz" @@ -4740,16 +4403,6 @@ "@types/mime" "^1" "@types/node" "*" -"@types/sinonjs__fake-timers@^6.0.2": - version "6.0.2" - resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz" - integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - "@types/socket.io-parser@*": version "3.0.0" resolved "https://registry.npmjs.org/@types/socket.io-parser/-/socket.io-parser-3.0.0.tgz" @@ -4856,13 +4509,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== - dependencies: - "@types/node" "*" - "@types/zen-observable@^0.8.0": version "0.8.2" resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz" @@ -5113,11 +4759,6 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== -abbrev@1: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abort-controller@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -5140,14 +4781,6 @@ accept@^3.0.2: boom "7.x.x" hoek "6.x.x" -accepts@~1.3.4: - version "1.3.7" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" @@ -5157,9 +4790,9 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" @@ -5186,11 +4819,6 @@ acorn@^8.2.4: resolved "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== -after@0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/after/-/after-0.8.2.tgz" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -5198,17 +4826,9 @@ agent-base@6: dependencies: debug "4" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -5217,9 +4837,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz" - integrity sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -5239,16 +4859,16 @@ ansi-align@^3.0.1: string-width "^4.1.0" ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -5270,12 +4890,7 @@ ansi-regex@^4.1.0: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-regex@^5.0.1: +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -5292,14 +4907,14 @@ ansi-styles@^2.2.1: ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" @@ -5314,11 +4929,6 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.1.tgz#63cd61c72283a71cb30bd881dbb60adada74bc70" integrity sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg== -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - any-observable@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz" @@ -5495,11 +5105,6 @@ apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: ts-invariant "^0.4.0" tslib "^1.10.0" -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - archiver-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" @@ -5609,11 +5214,6 @@ array.prototype.flatmap@^1.2.4: es-abstract "^1.18.0-next.1" function-bind "^1.1.1" -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - arrify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" @@ -5634,18 +5234,6 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assert@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" @@ -5681,7 +5269,7 @@ ast-types@0.13.2: astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-retry@^1.2.1: @@ -5716,16 +5304,6 @@ available-typed-arrays@^1.0.2: resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz" integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - axe-core@^4.0.2: version "4.2.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz" @@ -5906,7 +5484,7 @@ babel-preset-jest@^27.2.0: babel-plugin-jest-hoist "^27.2.0" babel-preset-current-node-syntax "^1.0.0" -backo2@1.0.2, backo2@^1.0.2: +backo2@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= @@ -5923,24 +5501,14 @@ balanced-match@^0.4.2: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - bcp-47@^1.0.7: version "1.0.8" resolved "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz" @@ -5950,13 +5518,6 @@ bcp-47@^1.0.7: is-alphanumerical "^1.0.0" is-decimal "^1.0.0" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - big-integer@^1.6.17: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" @@ -6005,17 +5566,7 @@ bl@~0.8.1: dependencies: readable-stream "~1.0.26" -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -bluebird@3.7.2, bluebird@^3.7.2: +bluebird@3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -6025,11 +5576,6 @@ bluebird@~3.4.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= -bmp-js@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz" - integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" @@ -6073,7 +5619,7 @@ boxen@^7.0.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -6212,7 +5758,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= @@ -6222,11 +5768,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz" - integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= - buffer-es6@^4.9.2: version "4.9.3" resolved "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz" @@ -6269,7 +5810,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.0, buffer@^5.5.0, buffer@^5.7.0: +buffer@^5.5.0, buffer@^5.7.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -6348,11 +5889,6 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" @@ -6363,7 +5899,7 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@4.1.2, camel-case@^4.1.2: @@ -6429,11 +5965,6 @@ cartocolor@^4.0.2: dependencies: colorbrewer "1.0.0" -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - catalog@^4.0.1-canary.2: version "4.0.1-canary.2" resolved "https://registry.npmjs.org/catalog/-/catalog-4.0.1-canary.2.tgz" @@ -6502,7 +6033,15 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -6579,7 +6118,7 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -check-more-types@2.24.0, check-more-types@^2.24.0: +check-more-types@2.24.0: version "2.24.0" resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= @@ -6662,11 +6201,6 @@ classnames@^2.3.1: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -6703,16 +6237,6 @@ cli-spinners@^2.6.1: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== -cli-table3@~0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz" - integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== - dependencies: - object-assign "^4.1.0" - string-width "^4.2.0" - optionalDependencies: - colors "^1.1.2" - cli-table@^0.3.1: version "0.3.6" resolved "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz" @@ -6728,14 +6252,6 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - cli-width@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" @@ -6847,22 +6363,22 @@ collect-v8-coverage@^1.0.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" @@ -6900,12 +6416,7 @@ colors@1.0.3: resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2: - version "1.4.0" - resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -6972,26 +6483,11 @@ commondir@^1.0.1: resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - compress-commons@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" @@ -7004,8 +6500,8 @@ compress-commons@^4.1.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.4.4, concat-stream@^1.6.0: version "1.6.2" @@ -7091,26 +6587,21 @@ convict@^6.2.3: lodash.clonedeep "^4.5.0" yargs-parser "^20.2.7" -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-js-pure@^3.10.2, core-js-pure@^3.14.0: version "3.14.0" resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz" integrity sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g== -core-js@^3.15.1, core-js@^3.4.1, core-js@^3.6.5: +core-js@^3.15.1, core-js@^3.6.5: version "3.15.1" resolved "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz" integrity sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -7244,7 +6735,7 @@ cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6: dependencies: node-fetch "2.6.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -7396,79 +6887,6 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== -cypress-network-idle@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cypress-network-idle/-/cypress-network-idle-1.4.1.tgz#cc7dee61a2d53e30057aa5a8d3cc82901f28796b" - integrity sha512-KJxqnR0FwTQO6a3X1gkPQjnb7rDGh+cXWSXReyIJOIlak0fDcS2JDEGjxowTtUPi7kH6FAQkN/SiQKixnXLeqg== - -cypress-plugin-snapshots@^1.4.4: - version "1.4.4" - resolved "https://registry.npmjs.org/cypress-plugin-snapshots/-/cypress-plugin-snapshots-1.4.4.tgz" - integrity sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ== - dependencies: - diff2html "^2.7.0" - fs-extra "^7.0.1" - image-size "^0.7.2" - jimp "^0.10.3" - js-base64 "^2.5.1" - lodash "^4.17.13" - pixelmatch "^4.0.2" - pngjs "^3.3.3" - prettier "^1.16.4" - rimraf "^2.6.3" - sanitize-filename "^1.6.1" - socket.io "^2.2.0" - socket.io-client "^2.2.0" - source-map-support "^0.5.10" - unidiff "1.0.2" - -cypress@7: - version "7.7.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-7.7.0.tgz#0839ae28e5520536f9667d6c9ae81496b3836e64" - integrity sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ== - dependencies: - "@cypress/request" "^2.88.5" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "^6.0.2" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.0" - commander "^5.1.0" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.2" - enquirer "^2.3.6" - eventemitter2 "^6.4.3" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.5" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - ramda "~0.27.1" - request-progress "^3.0.0" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - url "^0.11.0" - yauzl "^2.10.0" - d3-array@2, d3-array@^2.3.0, d3-array@^2.5.0, d3-array@^2.8.0: version "2.12.1" resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" @@ -7723,13 +7141,6 @@ damerau-levenshtein@^1.0.6: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz" integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - dashify@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz" @@ -7769,11 +7180,6 @@ date-fns@^2.28.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -dayjs@^1.10.4: - version "1.10.5" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz" - integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g== - dayjs@^1.8.34: version "1.11.0" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805" @@ -7791,7 +7197,7 @@ debug@2, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1: +debug@4, debug@^4.1.0, debug@^4.3.1, debug@~4.3.1: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -7805,34 +7211,20 @@ debug@4.3.1: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.3.2, debug@^4.3.4: +debug@^4.0.1, debug@^4.1.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@~4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz" @@ -7882,12 +7274,7 @@ deep-extend@^0.6.0, deep-extend@~0.6.0: resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -8005,21 +7392,6 @@ diff-sequences@^27.0.6: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== -diff2html@^2.7.0: - version "2.12.2" - resolved "https://registry.npmjs.org/diff2html/-/diff2html-2.12.2.tgz" - integrity sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g== - dependencies: - diff "^4.0.1" - hogan.js "^3.0.2" - merge "^1.2.1" - whatwg-fetch "^3.0.0" - -diff@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz" - integrity sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= - diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" @@ -8050,7 +7422,7 @@ doctrine@^2.1.0: doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" @@ -8088,11 +7460,6 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - domain-browser@4.19.0: version "4.19.0" resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz" @@ -8143,6 +7510,26 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dotenv-cli@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-6.0.0.tgz#8a30cbc59d0a8aaa166b2fee0a9a55e23a1223ab" + integrity sha512-qXlCOi3UMDhCWFKe0yq5sg3X+pJAz+RQDiFN38AMSbUrnY3uZshSfDJUAge951OS7J9gwLZGfsBlWRSOYz/TRg== + dependencies: + cross-spawn "^7.0.3" + dotenv "^16.0.0" + dotenv-expand "^8.0.1" + minimist "^1.2.5" + +dotenv-expand@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e" + integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg== + +dotenv@*, dotenv@^16.0.0, dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + dotenv@^8.2.0: version "8.6.0" resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" @@ -8185,14 +7572,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ecdsa-sig-formatter@1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" @@ -8245,7 +7624,7 @@ emittery@^0.8.1: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.0.0, emoji-regex@^9.2.2: @@ -8277,46 +7656,6 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~3.5.0: - version "3.5.2" - resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz" - integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.6.2" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz" - integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.4.2" - enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -8410,8 +7749,8 @@ escape-goat@^4.0.0: escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -8420,7 +7759,7 @@ escape-string-regexp@^2.0.0: escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: @@ -8545,9 +7884,8 @@ eslint-plugin-unused-imports@^2.0.0: dependencies: eslint-rule-composer "^0.3.0" -"eslint-plugin-visualize-admin@link:./eslint/visualize-admin": +"eslint-plugin-visualize-admin@file:./eslint/visualize-admin": version "0.0.0" - uid "" eslint-rule-composer@^0.3.0: version "0.3.0" @@ -8556,7 +7894,7 @@ eslint-rule-composer@^0.3.0: eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -8564,7 +7902,7 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" @@ -8578,12 +7916,12 @@ eslint-utils@^3.0.0: eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: @@ -8593,7 +7931,7 @@ eslint-visitor-keys@^3.3.0: eslint@^7.29.0: version "7.32.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -8639,7 +7977,7 @@ eslint@^7.29.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -8653,27 +7991,27 @@ esprima@^4.0.0, esprima@^4.0.1: esquery@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^0.6.1: version "0.6.1" @@ -8692,7 +8030,7 @@ estree-walker@^2.0.1: esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@1.8.1: @@ -8718,11 +8056,6 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter2@^6.4.3: - version "6.4.4" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz" - integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== - eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" @@ -8756,21 +8089,6 @@ exceljs@*, exceljs@^4.3.0: unzipper "^0.10.11" uuid "^8.3.0" -execa@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -8786,18 +8104,6 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -exif-parser@^0.1.12: - version "0.1.12" - resolved "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz" - integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= - exit-on-epipe@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" @@ -8825,7 +8131,7 @@ expect@^27.3.0: jest-message-util "^27.3.0" jest-regex-util "^27.0.6" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -8837,33 +8143,12 @@ external-editor@^3.0.3: dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-files@9.0.0, extract-files@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz" - integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + tmp "^0.0.33" -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +extract-files@9.0.0, extract-files@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz" + integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== fast-csv@^4.3.1: version "4.3.6" @@ -8880,7 +8165,7 @@ fast-deep-equal@^2.0.1: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1, fast-glob@^3.2.4: @@ -8959,13 +8244,6 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - figures@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" @@ -8981,7 +8259,7 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0, figures@^3.2.0: +figures@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -8990,7 +8268,7 @@ figures@^3.0.0, figures@^3.2.0: file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -9000,11 +8278,6 @@ file-saver@^2.0.2: resolved "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== -file-type@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz" - integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -9073,7 +8346,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -9085,9 +8358,9 @@ flatbuffers@1.12.0: integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flexsearch@^0.6.32: version "0.6.32" @@ -9116,11 +8389,6 @@ foreach@^2.0.5, foreach@~2.0.1: resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - form-data-encoder@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.3.tgz#682cd821a8423605093992ff895e6b2ed5a9d429" @@ -9144,15 +8412,6 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - fp-ts@^2.8.2: version "2.10.5" resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-2.10.5.tgz" @@ -9207,16 +8466,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -9228,8 +8478,8 @@ fs-extra@^9.0.1, fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" @@ -9253,8 +8503,8 @@ function-bind@^1.1.1: functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== fuzzaldrin-plus@^0.6.0: version "0.6.0" @@ -9273,7 +8523,7 @@ fwd-stream@^1.0.4: dependencies: readable-stream "~1.0.26-4" -gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -9321,7 +8571,7 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -9333,20 +8583,6 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" @@ -9391,7 +8627,7 @@ glob-parent@^2.0.0: glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" @@ -9401,7 +8637,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.7, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@7.1.7, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6: version "7.1.7" resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -9425,6 +8661,18 @@ glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-agent@^2.1.12: version "2.2.0" resolved "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz" @@ -9445,23 +8693,15 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.9.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz" - integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -9687,19 +8927,6 @@ hammerjs@^2.0.8: resolved "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz" integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" @@ -9717,26 +8944,14 @@ has-bigints@^1.0.1: resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1, has-symbols@^1.0.2: @@ -9883,14 +9098,6 @@ hoek@6.x.x: resolved "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz" integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ== -hogan.js@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz" - integrity sha1-TNnhq9QpQUbnZ55B14mHMrAse/0= - dependencies: - mkdirp "0.3.0" - nopt "1.0.10" - hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" @@ -9966,15 +9173,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http2-wrapper@^2.1.10: version "2.1.11" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.1.11.tgz#d7c980c7ffb85be3859b6a96c800b2951ae257ef" @@ -9996,11 +9194,6 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -10054,7 +9247,7 @@ ignore-walk@^3.0.3: ignore@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4: @@ -10074,7 +9267,7 @@ image-size@1.0.0: dependencies: queue "6.0.2" -image-size@^0.7.2, image-size@^0.7.4: +image-size@^0.7.4: version "0.7.5" resolved "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz" integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== @@ -10096,7 +9289,7 @@ immutable@~3.7.6: import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -10133,8 +9326,8 @@ import-move-codemod@^0.0.3: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^3.0.0: version "3.2.0" @@ -10146,15 +9339,15 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexof@0.0.1, indexof@~0.0.1: +indexof@~0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -10355,6 +9548,13 @@ is-core-module@^2.8.1: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz" @@ -10385,8 +9585,8 @@ is-extglob@^1.0.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -10402,14 +9602,9 @@ is-fullwidth-code-point@^2.0.0: is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" @@ -10420,7 +9615,7 @@ is-generator-function@^1.0.7: resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz" integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== -is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -10434,7 +9629,7 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -10458,7 +9653,7 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3: resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= -is-installed-globally@^0.4.0, is-installed-globally@~0.4.0: +is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== @@ -10623,7 +9818,7 @@ is-typed-array@^1.1.3: foreach "^2.0.5" has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -10687,11 +9882,6 @@ isarray@0.0.1: resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -10704,8 +9894,8 @@ isbuffer@~0.0.0: isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic-fetch@^3.0.0: version "3.0.0" @@ -10728,11 +9918,6 @@ isomorphic-ws@4.0.1: resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - istanbul-lib-coverage@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" @@ -11240,18 +10425,6 @@ jest@^27.3.0: import-local "^3.0.2" jest-cli "^27.3.0" -jimp@^0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/jimp/-/jimp-0.10.3.tgz" - integrity sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/custom" "^0.10.3" - "@jimp/plugins" "^0.10.3" - "@jimp/types" "^0.10.3" - core-js "^3.4.1" - regenerator-runtime "^0.13.3" - joi@^17.3.0: version "17.4.0" resolved "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz" @@ -11263,19 +10436,14 @@ joi@^17.3.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -jpeg-js@^0.3.4: - version "0.3.7" - resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz" - integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== - -js-base64@^2.5.1: - version "2.6.4" - resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +jose@^4.1.4, jose@^4.3.7: + version "4.9.2" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.9.2.tgz#268994df4443b9c191de0b001c2e3796ac6cf368" + integrity sha512-EqKvu2PqJCD3Jrg3PvcYZVS7D21qMVLSYMDAFcOdGUEOpJSLNtJO7NjLANvu3SYHVl6pdP2ff7ve6EZW2nX7Nw== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1, js-yaml@^3.9.1: @@ -11293,11 +10461,6 @@ js-yaml@^4.0.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsdom@^16.6.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -11363,23 +10526,18 @@ json-parse-even-better-errors@^2.3.0: json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: version "1.0.1" @@ -11388,7 +10546,7 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -11425,13 +10583,6 @@ json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -11476,16 +10627,6 @@ jsonwebtoken@^8.5.1: ms "^2.1.1" semver "^5.6.0" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - jss-plugin-camel-case@^10.8.2: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7" @@ -11651,7 +10792,7 @@ latest-version@^7.0.0: dependencies: package-json "^8.1.0" -lazy-ass@1.6.0, lazy-ass@^1.6.0: +lazy-ass@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= @@ -11755,7 +10896,7 @@ leven@^3.1.0: levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -11815,19 +10956,6 @@ listr-verbose-renderer@^0.5.0: date-fns "^1.27.2" figures "^2.0.0" -listr2@^3.8.3: - version "3.10.0" - resolved "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz" - integrity sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw== - dependencies: - cli-truncate "^2.1.0" - colorette "^1.2.2" - log-update "^4.0.0" - p-map "^4.0.0" - rxjs "^6.6.7" - through "^2.3.8" - wrap-ansi "^7.0.0" - listr@^0.14.3: version "0.14.3" resolved "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz" @@ -11843,20 +10971,6 @@ listr@^0.14.3: p-map "^2.0.0" rxjs "^6.3.3" -load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.1" - resolved "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz" - integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - phin "^2.9.1" - xhr "^2.0.1" - xtend "^4.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" @@ -11922,8 +11036,8 @@ lodash.camelcase@^4.3.0: lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.defaults@^4.2.0: version "4.2.0" @@ -12012,10 +11126,10 @@ lodash.memoize@4.x: lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.once@^4.0.0, lodash.once@^4.1.1: +lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= @@ -12027,8 +11141,8 @@ lodash.sortby@^4.7.0: lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash.union@^4.6.0: version "4.6.0" @@ -12040,7 +11154,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.21, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.0: +lodash@4.17.21, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12077,16 +11191,6 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - loglevel@^1.6.7: version "1.7.1" resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz" @@ -12147,7 +11251,7 @@ lowercase-keys@^3.0.0: lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" @@ -12363,11 +11467,6 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - meros@1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz" @@ -12422,18 +11521,13 @@ mime-db@1.48.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12: version "2.1.31" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz" integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: mime-db "1.48.0" -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.3.1: version "2.5.2" resolved "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz" @@ -12464,13 +11558,6 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -12486,13 +11573,20 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" @@ -12530,11 +11624,6 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" - integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= - "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" @@ -12566,7 +11655,7 @@ ms@2.0.0: ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@^2.1.1, ms@^2.1.2: @@ -12621,13 +11710,23 @@ native-url@0.3.4: natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-auth@^4.10.3: + version "4.10.3" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.10.3.tgz#0a952dd5004fd2ac2ba414c990922cf9b33951a3" + integrity sha512-7zc4aXYc/EEln7Pkcsn21V1IevaTZsMLJwapfbnKA4+JY0+jFzWbt5p/ljugesGIrN4VOZhpZIw50EaFZyghJQ== + dependencies: + "@babel/runtime" "^7.16.3" + "@panva/hkdf" "^1.0.1" + cookie "^0.4.1" + jose "^4.3.7" + oauth "^0.9.15" + openid-client "^5.1.0" + preact "^10.6.3" + preact-render-to-string "^5.1.19" + uuid "^8.3.2" next@^11.1.3: version "11.1.3" @@ -12794,13 +11893,6 @@ nodeify-fetch@^2.2.0: readable-error "^1.0.0" readable-stream "^3.5.0" -nopt@1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" @@ -12855,7 +11947,7 @@ npm-packlist@^2.1.2: npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" -npm-run-path@^4.0.0, npm-run-path@^4.0.1: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -12889,16 +11981,21 @@ nwsapi@^2.2.0: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +oauth@^0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-hash@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + object-inspect@^1.10.3, object-inspect@^1.9.0: version "1.10.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz" @@ -12988,10 +12085,10 @@ octal@^1.0.0: resolved "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz" integrity sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws= -omggif@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" - integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== +oidc-token-hash@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" + integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -13019,6 +12116,16 @@ opener@^1.5.2: resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +openid-client@^5.1.0: + version "5.1.9" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.1.9.tgz#6887e75ad3fa8d0c78d0ed693a5ea107d39b54de" + integrity sha512-o/11Xos2fRPpK1zQrPfSIhIusFrAkqGSPwkD0UlUB+CCuRzd7zrrBJwIjgnVv3VUSif9ZGXh2d3GSJNH2Koh5g== + dependencies: + jose "^4.1.4" + lru-cache "^6.0.0" + object-hash "^2.0.1" + oidc-token-hash "^5.0.1" + optimism@^0.16.0: version "0.16.1" resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" @@ -13041,7 +12148,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -13091,11 +12198,6 @@ os-tmpdir@~1.0.2: resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" - integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" @@ -13160,13 +12262,6 @@ p-map@^2.0.0: resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" @@ -13209,7 +12304,7 @@ pad-left@^2.1.0: dependencies: repeat-string "^1.5.4" -pako@^1.0.5, pako@~1.0.2, pako@~1.0.5: +pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -13229,7 +12324,7 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" @@ -13245,24 +12340,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-bmfont-ascii@^1.0.3: - version "1.0.6" - resolved "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz" - integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= - -parse-bmfont-binary@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz" - integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= - -parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz" - integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== - dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" - parse-entities@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" @@ -13294,11 +12371,6 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -13322,16 +12394,6 @@ parse5@6.0.1, parse5@^6.0.0: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" @@ -13370,8 +12432,8 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -13438,11 +12500,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" @@ -13499,11 +12556,6 @@ pgpass@1.x: dependencies: split2 "^3.1.1" -phin@^2.9.1: - version "2.9.3" - resolved "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz" - integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" @@ -13514,11 +12566,6 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2, picomatc resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pify@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" @@ -13531,13 +12578,6 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" -pixelmatch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz" - integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= - dependencies: - pngjs "^3.0.0" - pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" @@ -13596,11 +12636,6 @@ plurals-cldr@^1.0.4: resolved "https://registry.npmjs.org/plurals-cldr/-/plurals-cldr-1.0.4.tgz" integrity sha512-4nLXqtel7fsCgzi8dvRZvUjfL8SXpP982sKg7b2TgpnR8rDnes06iuQ83trQ/+XdtyMIQkBBbKzX6x97eLfsJQ== -pngjs@^3.0.0, pngjs@^3.3.3: - version "3.4.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" @@ -13667,6 +12702,18 @@ potpack@^1.0.2: resolved "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz" integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== +preact-render-to-string@^5.1.19: + version "5.2.3" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz#23d17376182af720b1060d5a4099843c7fe92fe4" + integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA== + dependencies: + pretty-format "^3.8.0" + +preact@^10.6.3: + version "10.10.6" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.10.6.tgz#1fe62aecf93974b64e6a42e09ba1f00f93207d14" + integrity sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog== + prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -13687,7 +12734,7 @@ prebuild-install@^7.1.1: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: @@ -13700,21 +12747,11 @@ prepend-http@^2.0.0: resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@^1.16.4: - version "1.19.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - prettier@^2.1.2: version "2.3.1" resolved "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz" integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== -pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" @@ -13735,11 +12772,23 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.3.0: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + printj@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== +prisma@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.5.0.tgz#361ae3f4476d0821b97645e5da42975a7c2943bb" + integrity sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew== + dependencies: + "@prisma/engines" "4.5.0" + prismjs@^1.14.0: version "1.25.0" resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz" @@ -13777,7 +12826,7 @@ process@0.11.10, process@^0.11.10: progress@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise-the-world@^1.0.1: @@ -13859,7 +12908,7 @@ pseudolocale@^1.1.0: dependencies: commander "*" -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.8.0" resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -13896,7 +12945,7 @@ punycode@^1.2.4: punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== pupa@^3.1.0: @@ -13918,11 +12967,6 @@ qs@^6.10.1: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - query-string@^4.2.2: version "4.3.4" resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" @@ -13990,7 +13034,7 @@ ramda@^0.25.0: resolved "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz" integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== -ramda@^0.27.1, ramda@~0.27.1: +ramda@^0.27.1: version "0.27.1" resolved "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz" integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== @@ -14418,7 +13462,7 @@ redux@^4.0.0, redux@^4.0.4: dependencies: "@babel/runtime" "^7.9.2" -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== @@ -14433,7 +13477,7 @@ regexp.prototype.flags@^1.3.1: regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== registry-auth-token@^4.0.0: @@ -14567,13 +13611,6 @@ replaceall@^0.1.6: resolved "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz" integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" - integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= - dependencies: - throttleit "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -14581,7 +13618,7 @@ require-directory@^2.1.1: require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: @@ -14613,7 +13650,7 @@ resolve-from@5.0.0, resolve-from@^5.0.0: resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-protobuf-schema@^2.1.0: @@ -14645,6 +13682,15 @@ resolve@^1.12.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz" @@ -14706,7 +13752,7 @@ rifm@^0.12.1: resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.12.1.tgz#8fa77f45b7f1cda2a0068787ac821f0593967ac4" integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg== -rimraf@2, rimraf@^2.6.3: +rimraf@2: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -14815,7 +13861,7 @@ rw@1: resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.3, rxjs@^6.6.7: +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.3: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -14832,19 +13878,12 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-filename@^1.6.1: - version "1.6.3" - resolved "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz" - integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== - dependencies: - truncate-utf8-bytes "^1.0.0" - -sax@>=0.6.0, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -14889,12 +13928,12 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" -"semver@2 || 3 || 4 || 5", semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -14906,6 +13945,13 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -15007,14 +14053,14 @@ sharp@^0.30.7: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.7.2: @@ -15091,18 +14137,9 @@ slice-ansi@0.0.4: resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -15117,28 +14154,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== - -socket.io-client@2.4.0, socket.io-client@^2.2.0: - version "2.4.0" - resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - socket.io-parser@*: version "4.0.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz" @@ -15148,37 +14163,7 @@ socket.io-parser@*: component-emitter "~1.3.0" debug "~4.3.1" -socket.io-parser@~3.3.0: - version "3.3.2" - resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz" - integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== - dependencies: - component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.1" - resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz" - integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" - -socket.io@^2.2.0: - version "2.4.1" - resolved "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz" - integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== - dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" - -source-map-support@^0.5.10, source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.19: +source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -15314,8 +14299,8 @@ sprintf-js@^1.1.2: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sql-template-strings@^2.2.2: version "2.2.2" @@ -15327,21 +14312,6 @@ srcset@^2.0.0: resolved "https://registry.npmjs.org/srcset/-/srcset-2.0.1.tgz" integrity sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ== -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - stable@^0.1.8: version "0.1.8" resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" @@ -15492,7 +14462,7 @@ string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0: version "4.2.2" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== @@ -15501,6 +14471,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -15559,7 +14538,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@6.0.0, strip-ansi@^6.0.0: +strip-ansi@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== @@ -15587,6 +14566,13 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -15618,7 +14604,7 @@ strip-indent@^3.0.0: strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: @@ -15695,19 +14681,19 @@ supports-color@^2.0.0: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -15792,16 +14778,15 @@ table-layout@^1.0.1: wordwrapjs "^4.0.0" table@^6.0.9: - version "6.7.1" - resolved "https://registry.npmjs.org/table/-/table-6.7.1.tgz" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" - lodash.clonedeep "^4.5.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tabtab@^3.0.2: version "3.0.2" @@ -15869,8 +14854,8 @@ text-encoding-utf-8@^1.0.2: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== texture-compressor@^1.0.2: version "1.0.2" @@ -15885,11 +14870,6 @@ throat@^6.0.1: resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= - through2@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz" @@ -15898,7 +14878,7 @@ through2@^3.0.1: inherits "^2.0.4" readable-stream "2 || 3" -through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -15910,11 +14890,6 @@ timers-browserify@2.0.12, timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -timm@^1.6.1: - version "1.7.1" - resolved "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz" - integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== - tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz" @@ -15925,11 +14900,6 @@ tiny-warning@^1.0.2, tiny-warning@^1.0.3: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== - tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz" @@ -15949,7 +14919,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.0, tmp@^0.2.1, tmp@~0.2.1: +tmp@^0.2.0, tmp@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -15961,11 +14931,6 @@ tmpl@1.0.x: resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" @@ -16021,14 +14986,6 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" @@ -16073,13 +15030,6 @@ trough@^1.0.0: resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== -truncate-utf8-bytes@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" - integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= - dependencies: - utf8-byte-length "^1.0.1" - ts-invariant@^0.4.0: version "0.4.4" resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz" @@ -16194,14 +15144,9 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" @@ -16230,7 +15175,7 @@ type-fest@^0.13.1: type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: @@ -16328,13 +15273,6 @@ unherit@^1.0.4: inherits "^2.0.0" xtend "^4.0.0" -unidiff@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unidiff/-/unidiff-1.0.2.tgz" - integrity sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg== - dependencies: - diff "^2.2.2" - unified@9.2.0: version "9.2.0" resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" @@ -16412,7 +15350,7 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -16444,11 +15382,6 @@ untildify@^3.0.3: resolved "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - unzipper@^0.10.11: version "0.10.11" resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" @@ -16509,7 +15442,7 @@ upper-case@^2.0.2: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -16564,18 +15497,6 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" - integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= - -utif@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz" - integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== - dependencies: - pako "^1.0.5" - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -16628,12 +15549,12 @@ util@^0.11.0: dependencies: inherits "2.0.3" -uuid@^3.1.0, uuid@^3.3.2: +uuid@^3.1.0: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.0: +uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -16675,15 +15596,6 @@ vary@^1: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" @@ -16835,7 +15747,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.0.0, whatwg-fetch@^3.4.1: +whatwg-fetch@^3.4.1: version "3.6.2" resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== @@ -16902,7 +15814,7 @@ which-typed-array@^1.1.2: which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" @@ -16969,8 +15881,8 @@ wrap-ansi@^8.0.1: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" @@ -16997,59 +15909,21 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== -ws@~7.4.2: - version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== -xhr@^2.0.1: - version "2.6.0" - resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz" - integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= - -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlhttprequest-ssl@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz" - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== - xss@^1.0.8: version "1.0.9" resolved "https://registry.npmjs.org/xss/-/xss-1.0.9.tgz" @@ -17100,7 +15974,7 @@ y18n@^5.0.5: yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml-ast-parser@^0.0.43: @@ -17174,19 +16048,6 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" From 39d0726f8ae1b57ead677f70d44648b757caee68 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Wed, 7 Sep 2022 16:54:29 +0200 Subject: [PATCH 07/50] feat: Use Prisma - Use Prisma server side to fetch models - Date coming from the DB are already parsed, we use superjson to pass them to the client - Migrations are done with Prisma --- app/db/client.ts | 5 + app/db/config.ts | 89 ++++++++-------- app/db/serialize.ts | 26 +++++ app/package.json | 3 + app/pages/embed/[chartId].tsx | 2 +- app/pages/v/[chartId].tsx | 19 ++-- app/prisma/schema.prisma | 29 +++++ db-migrations/00001-table-setup.sql | 9 -- package.json | 4 +- scripts/db-migrate.js | 42 -------- yarn.lock | 159 ++++++++-------------------- 11 files changed, 165 insertions(+), 222 deletions(-) create mode 100644 app/db/client.ts create mode 100644 app/db/serialize.ts create mode 100644 app/prisma/schema.prisma delete mode 100644 db-migrations/00001-table-setup.sql delete mode 100755 scripts/db-migrate.js diff --git a/app/db/client.ts b/app/db/client.ts new file mode 100644 index 000000000..b5bf6ce85 --- /dev/null +++ b/app/db/client.ts @@ -0,0 +1,5 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +export default prisma; diff --git a/app/db/config.ts b/app/db/config.ts index 168ad96d1..fdd185abc 100644 --- a/app/db/config.ts +++ b/app/db/config.ts @@ -1,28 +1,31 @@ +/** + * Server side methods to connect to the database + */ + +import { Prisma, Config, User } from "@prisma/client"; + import { migrateChartConfig } from "@/utils/chart-config/versioning"; import { createChartId } from "../utils/create-chart-id"; -import { pool } from "./pg-pool"; +import prisma from "./client"; /** * Store data in the DB. - * Do not try to use on client-side! Use /api/config instead. * * @param data Data to be stored as configuration */ export const createConfig = async ( - data: $Unexpressable + data: Prisma.ConfigCreateInput["data"] ): Promise<{ key: string }> => { - const result = await pool.query<{ key: string }>( - `INSERT INTO config(key, data) VALUES ($1, $2) RETURNING key`, - [createChartId(), data] - ); + const result = await prisma.config.create({ + data: { + key: createChartId(), + data: data, + }, + }); - if (result.rows.length < 1) { - throw Error("No result after insert!"); - } - - return result.rows[0]; + return result; }; const migrateDataSet = (dataSet: string): string => { @@ -33,51 +36,47 @@ const migrateDataSet = (dataSet: string): string => { return dataSet; }; +type ChartJsonConfig = { + dataSet: string; + chartConfig: Prisma.JsonObject; +}; + +const parseDbConfig = (conf: Config) => { + const data = conf.data as ChartJsonConfig; + return { + ...conf, + data: { + ...data, + dataSet: migrateDataSet(data.dataSet as string), + chartConfig: migrateChartConfig(data.chartConfig), + }, + }; +}; + /** * Get data from DB. - * Do not try to use on client-side! Use /api/config instead. * * @param key Get data from DB with this key */ -export const getConfig = async ( - key: string -): Promise => { - const result = await pool.query<{ key: string; data: $Unexpressable }>( - `SELECT key, data FROM config WHERE key = $1 LIMIT 1`, - [key] - ); +export const getConfig = async (key: string) => { + const config = await prisma.config.findFirst({ + where: { + key: key, + }, + }); - const config = result.rows[0]; - - if (config && config.data) { - return { - ...config, - data: { - ...config.data, - dataSet: migrateDataSet(config.data.dataSet), - chartConfig: migrateChartConfig(config.data.chartConfig), - }, - }; + if (!config) { + return; } - return config; + return parseDbConfig(config); }; /** * Get all keys from DB. - * Do not try to use on client-side! Use /api/config instead. - * - * @param key Get data from DB with this key */ -export const getAllConfigs = async (): Promise< - { - key: string; - data: $Unexpressable; - }[] -> => { - const result = await pool.query<{ key: string; data: $Unexpressable }>( - `SELECT key,data FROM config ORDER BY created_at DESC` - ); +export const getAllConfigs = async () => { + const configs = await prisma.config.findMany(); + return configs.map((c) => parseDbConfig(c)); - return result.rows; }; diff --git a/app/db/serialize.ts b/app/db/serialize.ts new file mode 100644 index 000000000..94ce212ff --- /dev/null +++ b/app/db/serialize.ts @@ -0,0 +1,26 @@ +import SuperJSON from "superjson"; +import { SuperJSONResult } from "superjson/dist/types"; + +export type Serialized

= P & { + _superjson?: ReturnType["meta"]; +}; + +export const serializeProps = (props: T) => { + const { json, meta } = SuperJSON.serialize(props); + const sprops = json; + if (meta) { + // @ts-ignore + sprops._superjson = meta; + } + return sprops as Serialized; +}; + +type Deserialized = T extends Serialized ? S : never; + +export const deserializeProps = >(sprops: T) => { + const { _superjson, ...props } = sprops; + return SuperJSON.deserialize({ + json: props, + meta: _superjson, + } as unknown as SuperJSONResult) as Deserialized; +}; diff --git a/app/package.json b/app/package.json index 23040c09d..b1d3e7d86 100644 --- a/app/package.json +++ b/app/package.json @@ -36,6 +36,7 @@ "@next/bundle-analyzer": "^11.0.1", "@next/mdx": "^11.0.1", "@preconstruct/next": "^3.0.0", + "@prisma/client": "^4.5.0", "@rdfjs/namespace": "^1.1.0", "@reach/auto-id": "^0.15.0", "@tpluscode/rdf-ns-builders": "2.0.1", @@ -90,6 +91,7 @@ "pg": "^8.3.3", "pg-connection-string": "^2.3.0", "postgres-migrations": "^5.2.0", + "prisma": "^4.5.0", "qs": "^6.10.1", "rdf-cube-view-query": "^1.11.1", "rdf-ext": "^1.3.2", @@ -102,6 +104,7 @@ "react-window": "^1.8.6", "simple-statistics": "^7.6.0", "sparql-http-client": "^2.4.1", + "superjson": "^1.11.0", "topojson-client": "^3.1.0", "topojson-server": "^3.0.1", "urql": "^2.0.5", diff --git a/app/pages/embed/[chartId].tsx b/app/pages/embed/[chartId].tsx index b78ec284c..2efd242a9 100644 --- a/app/pages/embed/[chartId].tsx +++ b/app/pages/embed/[chartId].tsx @@ -14,7 +14,7 @@ type PageProps = status: "found"; config: { key: string; - data: Config; + data: Omit; }; }; diff --git a/app/pages/v/[chartId].tsx b/app/pages/v/[chartId].tsx index 34f093fbb..ea9053422 100644 --- a/app/pages/v/[chartId].tsx +++ b/app/pages/v/[chartId].tsx @@ -14,6 +14,7 @@ import { ContentLayout } from "@/components/layout"; import { PublishActions } from "@/components/publish-actions"; import { Config } from "@/configurator"; import { getConfig } from "@/db/config"; +import { deserializeProps, Serialized, serializeProps } from "@/db/serialize"; import { useLocale } from "@/locales/use-locale"; type PageProps = @@ -24,7 +25,7 @@ type PageProps = status: "found"; config: { key: string; - data: Config; + data: Omit; }; }; @@ -36,7 +37,7 @@ export const getServerSideProps: GetServerSideProps = async ({ if (config && config.data) { // TODO validate configuration - return { props: { status: "found", config } }; + return { props: serializeProps({ status: "found", config }) }; } res.statusCode = 404; @@ -44,12 +45,13 @@ export const getServerSideProps: GetServerSideProps = async ({ return { props: { status: "notfound" } }; }; -const VisualizationPage = (props: PageProps) => { +const VisualizationPage = (props: Serialized) => { const locale = useLocale(); const { query, replace } = useRouter(); // Keep initial value of publishSuccess const [publishSuccess] = useState(() => !!query.publishSuccess); + const { status } = deserializeProps(props); useEffect(() => { // Remove publishSuccess from URL so that when reloading of sharing the link @@ -60,17 +62,14 @@ const VisualizationPage = (props: PageProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - if (props.status === "notfound") { - // TODO: display 404 message + if (status === "notfound") { return ; } const { - config: { - key, - data: { dataSet, dataSource, meta, chartConfig }, - }, - } = props; + key, + data: { dataSet, dataSource, meta, chartConfig }, + } = (props as Exclude).config; return ( <> diff --git a/app/prisma/schema.prisma b/app/prisma/schema.prisma new file mode 100644 index 000000000..75e50036c --- /dev/null +++ b/app/prisma/schema.prisma @@ -0,0 +1,29 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Config { + id Int @id @default(autoincrement()) + key String @unique @db.Char(12) + data Json + created_at DateTime @default(now()) @db.Timestamp(6) + + user User? @relation(fields: [user_id], references: [id]) + user_id Int? + + @@map("config") +} + +model OldMigrations { + id Int @id + name String @unique @db.VarChar(100) + hash String @db.VarChar(40) + executed_at DateTime? @default(now()) @db.Timestamp(6) + + @@map("migrations") +} diff --git a/db-migrations/00001-table-setup.sql b/db-migrations/00001-table-setup.sql deleted file mode 100644 index 68b24953a..000000000 --- a/db-migrations/00001-table-setup.sql +++ /dev/null @@ -1,9 +0,0 @@ - -DROP TABLE IF EXISTS config; - -CREATE TABLE config ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, - key character(12) UNIQUE NOT NULL, - data jsonb, - created_at timestamp NOT NULL DEFAULT NOW() -); \ No newline at end of file diff --git a/package.json b/package.json index 9986128e4..a7305d39f 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "dev": "preconstruct dev && NODE_OPTIONS=\"--inspect\" next ./app", "dev:mitmproxy": "preconstruct dev && HTTP_PROXY=http://localhost:8080 NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE='' NO_PROXY='localhost,127.0.0.1' next ./app", "dev:rollup": "rollup -c rollup.config.js --watch", - "db:migrate:dev": "DATABASE_URL=postgres://postgres:password@localhost:5432/visualization_tool scripts/db-migrate.js", - "db:migrate": "scripts/db-migrate.js", + "db:migrate:dev": "DATABASE_URL=postgres://postgres:password@localhost:5432/visualization_tool prisma db push", + "db:migrate": "prisma db push", "build": "yarn graphql:codegen && lingui compile && rollup -c rollup.config.js && next build ./app", "build:npm": "yarn graphql:codegen && lingui compile && BABEL_ENV=NPM_PACKAGE preconstruct build", "start": "yarn db:migrate && GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE='' NO_PROXY='localhost,127.0.0.1' next start ./app -p $PORT", diff --git a/scripts/db-migrate.js b/scripts/db-migrate.js deleted file mode 100755 index 28c99b7d6..000000000 --- a/scripts/db-migrate.js +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env node -const parseConnectionString = require("pg-connection-string").parse; -const { createDb, migrate } = require("postgres-migrations"); -const path = require("path"); - -if (!process.env.DATABASE_URL) { - console.log("No DATABASE_URL env var specified. Skipping DB migrations."); - process.exit(0); -} - -const pgConfig = parseConnectionString(process.env.DATABASE_URL); -pgConfig.port = +pgConfig.port; - -const run = async () => { - try { - console.log("[ db-migrate ] Starting DB migration ..."); - - await createDb(pgConfig.database, pgConfig); - } catch { - // Ignore DB creation errors. If it does not already exist, the following step will fail with a proper error. - } - - try { - await migrate(pgConfig, path.resolve(__dirname, "..", "db-migrations")); - - console.log("[ db-migrate ] DB migration complete!"); - } catch (e) { - // Just log without stack trace - console.log( - "[ db-migrate ] DB migration failed. Please check your DATABASE_URL and if Postgres is running." - ); - console.error(e.message); - process.exit(1); - } -}; - -run().catch((e) => { - console.log("[ db-migrate ] Something unexpected happened"); - - console.error(e); - process.exit(1); -}); diff --git a/yarn.lock b/yarn.lock index e38e5cce2..b9a8a000f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -133,29 +133,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.7.7": +"@babel/core@7.12.9", "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.14.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.7.7": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== @@ -185,15 +163,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.5", "@babel/generator@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.1.tgz#ef32ecd426222624cbd94871a7024639cf61a9fa" - integrity sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg== - dependencies: - "@babel/types" "^7.20.0" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/generator@^7.19.4": version "7.19.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.5.tgz#da3f4b301c8086717eee9cab14da91b1fa5dcca7" @@ -322,20 +291,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" - integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.19.4" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" - "@babel/helper-module-transforms@^7.14.5": version "7.15.8" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz" @@ -350,6 +305,20 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + "@babel/helper-optimise-call-expression@^7.14.5", "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" @@ -457,15 +426,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.12.5": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" - integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.0" - "@babel/helpers@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" @@ -493,12 +453,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" - integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.4", "@babel/parser@^7.19.6", "@babel/parser@^7.20.1", "@babel/parser@^7.7.2": +"@babel/parser@7.12.16", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.13", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.4", "@babel/parser@^7.19.6", "@babel/parser@^7.7.2": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.1.tgz#3e045a92f7b4623cafc2425eddcb8cf2e54f9cc5" integrity sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw== @@ -848,15 +803,6 @@ resolved "https://registry.npmjs.org/@babel/standalone/-/standalone-7.14.6.tgz" integrity sha512-oAoSp82jhJFnXKybKTOj5QF04XxiDRyiiqrFToiU1udlBXuZoADlPmmnOcuqBrZxSNNUjzJIVK8vt838Qoqjxg== -"@babel/template@^7.12.7", "@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" @@ -866,6 +812,15 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + "@babel/traverse@7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz" @@ -896,22 +851,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" - integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.1" - "@babel/types" "^7.20.0" - debug "^4.1.0" - globals "^11.1.0" - "@babel/traverse@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.4.tgz#f117820e18b1e59448a6c1fa9d0ff08f7ac459a8" @@ -969,15 +908,6 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.12.7", "@babel/types@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479" - integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - "@babel/types@^7.16.7": version "7.17.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" @@ -6592,6 +6522,13 @@ cookie@^0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +copy-anything@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.2.tgz#7189171ff5e1893b2287e8bf574b8cd448ed50b1" + integrity sha512-CzATjGXzUQ0EvuvgOCI6A4BGOo2bcVx8B+eC2nF862iv9fopnPQwlrbACakNCHRIJbCSBj+J/9JeDf60k64MkA== + dependencies: + is-what "^4.1.6" + core-js-pure@^3.10.2, core-js-pure@^3.14.0: version "3.14.0" resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz" @@ -8523,7 +8460,7 @@ fwd-stream@^1.0.4: dependencies: readable-stream "~1.0.26-4" -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -9548,13 +9485,6 @@ is-core-module@^2.8.1: dependencies: has "^1.0.3" -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz" @@ -9847,6 +9777,11 @@ is-upper-case@^2.0.2: dependencies: tslib "^2.0.3" +is-what@^4.1.6: + version "4.1.7" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.7.tgz#c41dc1d2d2d6a9285c624c2505f61849c8b1f9cc" + integrity sha512-DBVOQNiPKnGMxRMLIYSwERAS5MVY1B7xYiGnpgctsOFvVDz9f9PFXXxMcTOHuoqYp4NK9qFYQaIC1NRRxLMpBQ== + is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" @@ -13682,15 +13617,6 @@ resolve@^1.12.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz" @@ -13928,7 +13854,7 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -14674,6 +14600,13 @@ supercluster@^7.1.4: dependencies: kdbush "^3.0.0" +superjson@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-1.11.0.tgz#f6e2ae0d8fbac61c3fca09ab6739ac9678414d1b" + integrity sha512-6PfAg1FKhqkwWvPb2uXhH4MkMttdc17eJ91+Aoz4s1XUEDZFmLfFx/xVA3wgkPxAGy5dpozgGdK6V/n20Wj9yg== + dependencies: + copy-anything "^3.0.2" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" From 7e616cf4c675d5dd2e48496e45a56f8f7833c190 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Wed, 7 Sep 2022 16:54:29 +0200 Subject: [PATCH 08/50] feat: Ensures authenticated user exists on our side - Add a User database model - When a JWT token is received, we make sure we have a user in our database matching the "sub" field --- app/db/user.ts | 41 +++++++++++++++++++++++++++++ app/pages/api/auth/[...nextauth].ts | 11 ++++++-- app/prisma/schema.prisma | 13 +++++++-- app/typings/next-auth.ts | 6 +++-- 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 app/db/user.ts diff --git a/app/db/user.ts b/app/db/user.ts new file mode 100644 index 000000000..461472c90 --- /dev/null +++ b/app/db/user.ts @@ -0,0 +1,41 @@ +import prisma from "./client"; + +/** + * Ensures an authenticated user has an account + * on our side. + * + * - Uses the "sub" field from the JWT token to ensure + * uniqueness. + * - Updates the user name with what is found in the JWT token + */ +export const ensureUserFromSub = async ( + sub: string, + name: string | undefined | null +) => { + const user = await prisma.user.findFirst({ + where: { + sub, + }, + }); + if (user) { + if (user.name !== name) { + console.log(`Updating user name from auth provider info`); + await prisma.user.update({ + where: { + id: user.id, + }, + data: { + name: name, + }, + }); + } + return user; + } else { + const newUser = await prisma.user.create({ + data: { + sub: sub, + }, + }); + return newUser; + } +}; diff --git a/app/pages/api/auth/[...nextauth].ts b/app/pages/api/auth/[...nextauth].ts index 2f633a6bc..7531131c5 100644 --- a/app/pages/api/auth/[...nextauth].ts +++ b/app/pages/api/auth/[...nextauth].ts @@ -1,6 +1,7 @@ import NextAuth, { NextAuthOptions } from "next-auth"; import KeycloakProvider from "next-auth/providers/keycloak"; +import { ensureUserFromSub } from "@/db/user"; import { KEYCLOAK_ID, KEYCLOAK_SECRET, KEYCLOAK_ISSUER } from "@/domain/env"; import { truthy } from "@/domain/types"; @@ -20,9 +21,15 @@ const nextAuthConfig = { // Configure one or more authentication providers providers, callbacks: { + /** + * When the is logged in, ensures it creates on our side and save its id + * on the session. + */ session: async ({ session, token }) => { if (session.user && token.sub) { - session.user.id = token.sub; + session.user.sub = token.sub; + const user = await ensureUserFromSub(token.sub, token.name); + session.user.id = user.id; } return session; }, @@ -35,7 +42,7 @@ const nextAuthConfig = { export default async function auth(req: NextApiRequest, res: NextApiResponse) { try { - await NextAuth(req, res, nextAuthConfig); + await NextAuth(req, res, nextAuthOptions); } catch (e) { console.error(e); throw e; diff --git a/app/prisma/schema.prisma b/app/prisma/schema.prisma index 75e50036c..beedfd0f7 100644 --- a/app/prisma/schema.prisma +++ b/app/prisma/schema.prisma @@ -13,12 +13,21 @@ model Config { data Json created_at DateTime @default(now()) @db.Timestamp(6) - user User? @relation(fields: [user_id], references: [id]) - user_id Int? + user User? @relation(fields: [user_id], references: [id]) + user_id Int? @@map("config") } +model User { + id Int @id @default(autoincrement()) + sub String? @unique @db.VarChar(64) + name String? @db.VarChar(100) + Config Config[] @relation() + + @@map("users") +} + model OldMigrations { id Int @id name String @unique @db.VarChar(100) diff --git a/app/typings/next-auth.ts b/app/typings/next-auth.ts index ee94aaf73..c9d4b590c 100644 --- a/app/typings/next-auth.ts +++ b/app/typings/next-auth.ts @@ -9,10 +9,12 @@ declare module "next-auth" { */ interface Session { user: { + /** The user's id (from our database). */ + id: number; /** The user's id (comes from the "sub" property of the JWT token). */ - id: string; + sub: string; /** The user's name (comes from the "sub" property of the JWT token). */ - name: string; + name?: string | null; }; } } From 67ec123673373a29b02240338df38b1be890ecd4 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Wed, 7 Sep 2022 16:54:29 +0200 Subject: [PATCH 09/50] feat: Add login menu (not activated if Keycloak not configured) --- app/components/header.tsx | 3 ++ app/components/login-menu.tsx | 72 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 app/components/login-menu.tsx diff --git a/app/components/header.tsx b/app/components/header.tsx index d7786908c..ff3f00621 100644 --- a/app/components/header.tsx +++ b/app/components/header.tsx @@ -16,6 +16,8 @@ import Flex from "@/components/flex"; import { LanguageMenu } from "@/components/language-menu"; import { SOURCE_OPTIONS } from "@/domain/datasource/constants"; +import LoginMenu from "./login-menu"; + const DEFAULT_HEADER_PROGRESS = 100; export const useHeaderProgressContext = () => { @@ -137,6 +139,7 @@ const MetadataMenu = ({ contentId }: { contentId?: string }) => { }} > + ); }; diff --git a/app/components/login-menu.tsx b/app/components/login-menu.tsx new file mode 100644 index 000000000..d2b4a904f --- /dev/null +++ b/app/components/login-menu.tsx @@ -0,0 +1,72 @@ +import { Typography, Button, Box } from "@mui/material"; +import { getProviders, signIn, signOut, useSession } from "next-auth/react"; +import Link from "next/link"; +import { useEffect, useState } from "react"; + +import { Awaited } from "@/domain/types"; + +type Providers = Awaited>; + +const useProviders = () => { + const [state, setState] = useState({ + status: "loading", + data: undefined as Providers | undefined, + }); + useEffect(() => { + const run = async () => { + const providers = await getProviders(); + setState({ status: "loaded", data: providers }); + }; + run(); + }, []); + return state; +}; + +function LoginMenu() { + const { data: session, status: sessionStatus } = useSession(); + const { data: providers, status: providersStatus } = useProviders(); + if (sessionStatus === "loading" || providersStatus === "loading") { + return null; + } + if (!providers || !Object.keys(providers).length) { + return null; + } + return ( + + {session ? ( + <> + + Signed in as {session.user?.name}{" "} + {session.user?.id} + {" - "} + + + + ) : ( + <> + + Not signed in + {" - "} + + + + )} + + ); +} + +export default LoginMenu; From 703e0bb653515cc1b33b69d17da905266567a346 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Fri, 4 Nov 2022 11:00:28 +0100 Subject: [PATCH 10/50] feat: Attach created chart to user --- app/db/config.ts | 5 ++++- app/pages/api/auth/[...nextauth].ts | 3 +-- app/pages/api/config.ts | 10 +++++++--- app/pages/api/session.ts | 10 ++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 app/pages/api/session.ts diff --git a/app/db/config.ts b/app/db/config.ts index fdd185abc..7b6e8879b 100644 --- a/app/db/config.ts +++ b/app/db/config.ts @@ -12,16 +12,19 @@ import prisma from "./client"; /** * Store data in the DB. + * If the user is logged, the chart is linked to the user. * * @param data Data to be stored as configuration */ export const createConfig = async ( - data: Prisma.ConfigCreateInput["data"] + data: Prisma.ConfigCreateInput["data"], + userId?: User["id"] | undefined ): Promise<{ key: string }> => { const result = await prisma.config.create({ data: { key: createChartId(), data: data, + user_id: userId, }, }); diff --git a/app/pages/api/auth/[...nextauth].ts b/app/pages/api/auth/[...nextauth].ts index 7531131c5..154cd2d0d 100644 --- a/app/pages/api/auth/[...nextauth].ts +++ b/app/pages/api/auth/[...nextauth].ts @@ -17,8 +17,7 @@ const providers = [ : null, ].filter(truthy); -const nextAuthConfig = { - // Configure one or more authentication providers +export const nextAuthOptions = { providers, callbacks: { /** diff --git a/app/pages/api/config.ts b/app/pages/api/config.ts index 040d7bc58..d3cccef9a 100644 --- a/app/pages/api/config.ts +++ b/app/pages/api/config.ts @@ -1,6 +1,8 @@ import { NextApiRequest, NextApiResponse } from "next"; -import { createConfig } from "../../db/config"; +import { createConfig } from "@/db/config"; + +import { getServerSideSession } from "./session"; /** * Endpoint to write configuration to. @@ -11,7 +13,9 @@ const route = async (req: NextApiRequest, res: NextApiResponse) => { switch (method) { case "POST": try { - const result = await createConfig(req.body); + const session = await getServerSideSession(req, res); + const userId = session?.user?.id; + const result = await createConfig(req.body, userId); // TODO: Make this 201 and set final URI as Location header res.status(200).json(result); @@ -27,4 +31,4 @@ const route = async (req: NextApiRequest, res: NextApiResponse) => { } }; -export default route +export default route; diff --git a/app/pages/api/session.ts b/app/pages/api/session.ts new file mode 100644 index 000000000..e1e1d7eae --- /dev/null +++ b/app/pages/api/session.ts @@ -0,0 +1,10 @@ +import { unstable_getServerSession } from "next-auth"; + +import { nextAuthOptions } from "@/pages/api/auth/[...nextauth]"; + +export const getServerSideSession = ( + req: Parameters[0], + res: Parameters[1] +) => { + return unstable_getServerSession(req, res, nextAuthOptions); +}; From 898cce0f2dd5097d3acf44af0f88135e16a0df99 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Thu, 3 Nov 2022 13:37:27 +0100 Subject: [PATCH 11/50] feat: Add profile page listing user charts - Use superjson to serialize server-side props containing dates --- app/db/config.ts | 25 ++++++++--- app/db/user.ts | 8 ++++ app/pages/profile.tsx | 99 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 app/pages/profile.tsx diff --git a/app/db/config.ts b/app/db/config.ts index 7b6e8879b..ee45b9dd5 100644 --- a/app/db/config.ts +++ b/app/db/config.ts @@ -4,6 +4,7 @@ import { Prisma, Config, User } from "@prisma/client"; +import { Config as ConfigType } from "@/configurator"; import { migrateChartConfig } from "@/utils/chart-config/versioning"; import { createChartId } from "../utils/create-chart-id"; @@ -46,13 +47,14 @@ type ChartJsonConfig = { const parseDbConfig = (conf: Config) => { const data = conf.data as ChartJsonConfig; + const migratedData = { + ...data, + dataSet: migrateDataSet(data.dataSet as string), + chartConfig: migrateChartConfig(data.chartConfig), + } as unknown as Omit; return { ...conf, - data: { - ...data, - dataSet: migrateDataSet(data.dataSet as string), - chartConfig: migrateChartConfig(data.chartConfig), - }, + data: migratedData, }; }; @@ -81,5 +83,18 @@ export const getConfig = async (key: string) => { export const getAllConfigs = async () => { const configs = await prisma.config.findMany(); return configs.map((c) => parseDbConfig(c)); +}; +/** + * Get config from a user. + */ +export const getUserConfigs = async (userId: number) => { + const configs = await prisma.config.findMany({ + where: { + user_id: userId, + }, + }); + return configs.map((c) => parseDbConfig(c)); }; + +export type ParsedConfig = ReturnType; diff --git a/app/db/user.ts b/app/db/user.ts index 461472c90..efa8f2fb9 100644 --- a/app/db/user.ts +++ b/app/db/user.ts @@ -1,5 +1,13 @@ import prisma from "./client"; +export const findBySub = async (sub: string) => { + return prisma.user.findFirstOrThrow({ + where: { + sub, + }, + }); +}; + /** * Ensures an authenticated user has an account * on our side. diff --git a/app/pages/profile.tsx b/app/pages/profile.tsx new file mode 100644 index 000000000..4306fc8c8 --- /dev/null +++ b/app/pages/profile.tsx @@ -0,0 +1,99 @@ +import { + Typography, + Table, + TableBody, + TableRow, + TableCell, + TableHead, + Box, +} from "@mui/material"; +import { User } from "@prisma/client"; +import { GetServerSideProps } from "next"; +import Link from "next/link"; + +import { AppLayout } from "@/components/layout"; +import { + PanelLayout, + PanelMiddleWrapper, +} from "@/configurator/components/layout"; +import { getUserConfigs, ParsedConfig } from "@/db/config"; +import { deserializeProps, serializeProps, Serialized } from "@/db/serialize"; +import { findBySub } from "@/db/user"; + +import { getServerSideSession } from "./api/session"; + +type PageProps = { + user: User; + userConfigs: ParsedConfig[]; +}; + +export const getServerSideProps: GetServerSideProps = async ( + context +) => { + const session = await getServerSideSession(context.req, context.res); + const userSub = session?.user.sub; + if (userSub) { + const user = await findBySub(userSub); + const userConfigs = await getUserConfigs(user.id); + return { + props: serializeProps({ + user, + userConfigs, + }), + }; + } else { + return { + redirect: { + destination: "/", + permanent: false, + }, + }; + } +}; + +const ProfilePage = (props: Serialized) => { + const { user, userConfigs } = deserializeProps(props); + + return ( + + + + + Hello {user.name} 👋 + + Charts + + {userConfigs.length > 0 ? ( + + + Type + Title + Link + + + {userConfigs.map((uc) => { + return ( + + {uc.data.chartConfig.chartType} + {uc.data.meta.title.en} + + See chart + + + ); + })} + +
+ ) : ( + + No charts yet, create one. + + )} +
+
+
+
+ ); +}; + +export default ProfilePage; From 40d7ce65a72383119e0b62b0d61731727cb09df7 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Mon, 7 Nov 2022 09:48:11 +0100 Subject: [PATCH 12/50] feat: Bypass database migration if DATABASE_URL not set We do no have DATABASE_URL for preview deployments --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7305d39f..f9aadb40d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dev:mitmproxy": "preconstruct dev && HTTP_PROXY=http://localhost:8080 NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE='' NO_PROXY='localhost,127.0.0.1' next ./app", "dev:rollup": "rollup -c rollup.config.js --watch", "db:migrate:dev": "DATABASE_URL=postgres://postgres:password@localhost:5432/visualization_tool prisma db push", - "db:migrate": "prisma db push", + "db:migrate": "[ -z \"$DATABASE_URL\" ] && echo 'Bypassing database migration, DATABASE_URL not set' || prisma db push", "build": "yarn graphql:codegen && lingui compile && rollup -c rollup.config.js && next build ./app", "build:npm": "yarn graphql:codegen && lingui compile && BABEL_ENV=NPM_PACKAGE preconstruct build", "start": "yarn db:migrate && GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE='' NO_PROXY='localhost,127.0.0.1' next start ./app -p $PORT", From cda44e4e611354224873ec1f869475308c91aeb3 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Mon, 7 Nov 2022 09:14:57 +0100 Subject: [PATCH 13/50] chore: Review comments --- README.md | 2 +- app/db/config.ts | 6 ++++-- app/db/serialize.ts | 3 +-- app/pages/api/auth/[...nextauth].ts | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7546c871b..2f00bb554 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ same storage, otherwise you'll have to reconfigure Keycloak. To configure Keycloak: -- Access the [Keycloak admin][keycloak-admin] +- Access the [Keycloak admin][keycloak-admin] (login, password: "admin", "admin") - Create client application - Via import: [Keycloak][keycloak-admin] > Clients > Import client - Use the exported client `keycloak-visualize-client-dev.json` diff --git a/app/db/config.ts b/app/db/config.ts index ee45b9dd5..e9980e6f3 100644 --- a/app/db/config.ts +++ b/app/db/config.ts @@ -11,6 +11,8 @@ import { createChartId } from "../utils/create-chart-id"; import prisma from "./client"; +type PublishedConfig = Omit; + /** * Store data in the DB. * If the user is logged, the chart is linked to the user. @@ -49,9 +51,9 @@ const parseDbConfig = (conf: Config) => { const data = conf.data as ChartJsonConfig; const migratedData = { ...data, - dataSet: migrateDataSet(data.dataSet as string), + dataSet: migrateDataSet(data.dataSet), chartConfig: migrateChartConfig(data.chartConfig), - } as unknown as Omit; + } as PublishedConfig; return { ...conf, data: migratedData, diff --git a/app/db/serialize.ts b/app/db/serialize.ts index 94ce212ff..a8e0e0752 100644 --- a/app/db/serialize.ts +++ b/app/db/serialize.ts @@ -6,8 +6,7 @@ export type Serialized

= P & { }; export const serializeProps = (props: T) => { - const { json, meta } = SuperJSON.serialize(props); - const sprops = json; + const { json: sprops, meta } = SuperJSON.serialize(props); if (meta) { // @ts-ignore sprops._superjson = meta; diff --git a/app/pages/api/auth/[...nextauth].ts b/app/pages/api/auth/[...nextauth].ts index 154cd2d0d..6fdeece80 100644 --- a/app/pages/api/auth/[...nextauth].ts +++ b/app/pages/api/auth/[...nextauth].ts @@ -21,7 +21,7 @@ export const nextAuthOptions = { providers, callbacks: { /** - * When the is logged in, ensures it creates on our side and save its id + * When the user is logged in, ensures it creates on our side and save its id * on the session. */ session: async ({ session, token }) => { From e5bffc7c787218c279975fe125733358d59883a7 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Mon, 7 Nov 2022 16:28:01 +0100 Subject: [PATCH 14/50] Revert "fix: Use syntax recognized by both yarn and npm" This reverts commit 3dd5d268202ae9e3c1a561c75665ab24a4ec1517. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9aadb40d..5bd2abe16 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "eslint": "^7.29.0", "eslint-config-next": "^11.0.1", "eslint-plugin-unused-imports": "^2.0.0", - "eslint-plugin-visualize-admin": "file:./eslint/visualize-admin", + "eslint-plugin-visualize-admin": "link:./eslint/visualize-admin", "fs-extra": "^10.0.0", "import-move-codemod": "^0.0.3", "prettier": "^2.1.2", From 345fc0a85882d4bdfb5c058a5f7d6a1a7f5d9b76 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 08:23:59 +0100 Subject: [PATCH 15/50] chore: Update yarn.lock --- yarn.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index b9a8a000f..e92c94e20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7821,8 +7821,9 @@ eslint-plugin-unused-imports@^2.0.0: dependencies: eslint-rule-composer "^0.3.0" -"eslint-plugin-visualize-admin@file:./eslint/visualize-admin": +"eslint-plugin-visualize-admin@link:./eslint/visualize-admin": version "0.0.0" + uid "" eslint-rule-composer@^0.3.0: version "0.3.0" From 516eec1330a01750ef9fb52db2dfa86d8df6c2c8 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 08:52:02 +0100 Subject: [PATCH 16/50] fix: Ability to build docker image Seems like the postinstall hook from Prisma is not called automatically in Docker, we have to generate the client manually --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 82ce42f98..8bae035a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,6 +26,7 @@ ENV PORT 3000 COPY ./ ./ +RUN yarn prisma generate RUN yarn build # Install only prod dependencies and start app From b924e72177ac604a71d57a997ce25d76c8ffe1e6 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Mon, 7 Nov 2022 16:22:24 +0100 Subject: [PATCH 17/50] feat: Remove right panel and flatter style --- app/components/chart-panel.tsx | 6 +- app/components/chart-selection-tabs.tsx | 27 +++--- app/configurator/components/configurator.tsx | 98 ++++++++++++++++++-- app/configurator/components/drawer.tsx | 11 +++ app/configurator/components/filters.tsx | 16 +--- app/configurator/components/layout.tsx | 7 +- app/themes/federal.tsx | 13 +-- 7 files changed, 131 insertions(+), 47 deletions(-) create mode 100644 app/configurator/components/drawer.tsx diff --git a/app/components/chart-panel.tsx b/app/components/chart-panel.tsx index edaf89d91..7f2ab2ff6 100644 --- a/app/components/chart-panel.tsx +++ b/app/components/chart-panel.tsx @@ -53,12 +53,10 @@ const useChartPanelInnerStyles = makeStyles( root: { flexDirection: "column", backgroundColor: theme.palette.grey[100], - boxShadow: theme.shadows[6], - borderRadius: 12, - borderTopLeftRadius: ({ showTabs }) => (showTabs ? 0 : 12), + border: "1px solid", + borderColor: theme.palette.divider, // TODO: Handle properly when chart composition is implemented (enable when // ChartSelectionTabs becomes scrollable) - borderTopRightRadius: 12, overflow: "hidden", width: "auto", }, diff --git a/app/components/chart-selection-tabs.tsx b/app/components/chart-selection-tabs.tsx index 4cb3f654d..09c822650 100644 --- a/app/components/chart-selection-tabs.tsx +++ b/app/components/chart-selection-tabs.tsx @@ -1,4 +1,4 @@ -import { Box, Popover, Tab, Tabs, Theme } from "@mui/material"; +import { Box, Popover, Tab, Tabs, Theme, Button } from "@mui/material"; import { makeStyles } from "@mui/styles"; import React, { createContext, @@ -159,16 +159,21 @@ const TabsInner = ({ onActionButtonClick?: (e: React.MouseEvent) => void; }) => { return ( - - {/* TODO: Generate dynamically when chart composition is implemented */} - - } - /> - + + + {/* TODO: Generate dynamically when chart composition is implemented */} + + } + /> + + + ); }; diff --git a/app/configurator/components/configurator.tsx b/app/configurator/components/configurator.tsx index 82a06d75c..dc49d03c2 100644 --- a/app/configurator/components/configurator.tsx +++ b/app/configurator/components/configurator.tsx @@ -1,3 +1,6 @@ +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import { useRouter } from "next/router"; import React from "react"; import { ChartPanelConfigurator } from "@/components/chart-panel"; @@ -7,19 +10,77 @@ import { ChartAnnotationsSelector } from "@/configurator/components/chart-annota import { ChartAnnotator } from "@/configurator/components/chart-annotator"; import { ChartConfigurator } from "@/configurator/components/chart-configurator"; import { ChartOptionsSelector } from "@/configurator/components/chart-options-selector"; +import { ConfiguratorDrawer } from "@/configurator/components/drawer"; import { - PanelHeader, PanelLayout, PanelLeftWrapper, PanelMiddleWrapper, PanelRightWrapper, } from "@/configurator/components/layout"; import { SelectDatasetStep } from "@/configurator/components/select-dataset-step"; -import { Stepper } from "@/configurator/components/stepper"; import { ChartConfiguratorTable } from "@/configurator/table/table-chart-configurator"; +import SvgIcChevronLeft from "@/icons/components/IcChevronLeft"; +import useEvent from "@/utils/use-event"; + +const BackContainer = ({ children }: { children: React.ReactNode }) => { + return ( + + {children} + + ); +}; + +const BackButton = ({ + children, + onClick, +}: { children: React.ReactNode } & ButtonProps) => { + return ( + + ); +}; const ConfigureChartStep = () => { - const [state] = useConfiguratorState(); + const [state, dispatch] = useConfiguratorState(); + + const handleClosePanel = useEvent(() => { + dispatch({ + type: "ACTIVE_FIELD_CHANGED", + value: undefined, + }); + }); + + const router = useRouter(); + + const handlePrevious = useEvent(() => { + if (state.state !== "CONFIGURING_CHART") { + return; + } + router.push( + { + pathname: `/browse/dataset/${encodeURIComponent(state.dataSet)}`, + }, + undefined, + { shallow: true } + ); + }); if (state.state !== "CONFIGURING_CHART") { return null; @@ -35,6 +96,9 @@ const ConfigureChartStep = () => { flexDirection: "column", }} > + + Back to datasets + {state.chartConfig.chartType === "table" ? ( ) : ( @@ -49,9 +113,28 @@ const ConfigureChartStep = () => { /> - - - + +

+ + + + +
+ ); }; @@ -112,9 +195,6 @@ export const Configurator = () => { ) : ( - - - {state.state === "CONFIGURING_CHART" ? : null} {state.state === "DESCRIBING_CHART" ? : null} {state.state === "PUBLISHING" ? : null} diff --git a/app/configurator/components/drawer.tsx b/app/configurator/components/drawer.tsx new file mode 100644 index 000000000..6c5e47831 --- /dev/null +++ b/app/configurator/components/drawer.tsx @@ -0,0 +1,11 @@ +import { Drawer as MuiDrawer } from "@mui/material"; +import { styled } from "@mui/material/styles"; + +export const ConfiguratorDrawer = styled(MuiDrawer)(({ theme }) => ({ + "& > .MuiPaper-root": { + top: 95.5, + bottom: 0, + height: "auto", + borderLeft: `1px ${theme.palette.divider} solid`, + }, +})); diff --git a/app/configurator/components/filters.tsx b/app/configurator/components/filters.tsx index ffb109b92..cf08e2119 100644 --- a/app/configurator/components/filters.tsx +++ b/app/configurator/components/filters.tsx @@ -11,7 +11,6 @@ import { AutocompleteProps, Autocomplete, Divider, - Drawer as MuiDrawer, Theme, IconButton, Tooltip, @@ -43,6 +42,7 @@ import { useDimensionSelection, useMultiFilterContext, } from "@/configurator"; +import { ConfiguratorDrawer } from "@/configurator/components/drawer"; import { MultiFilterFieldColorPicker, SingleFilterField, @@ -76,16 +76,6 @@ import { ConfiguratorState, GenericSegmentField } from "../config-types"; import { ControlSectionSkeleton } from "./chart-controls/section"; -const Drawer = styled(MuiDrawer)(({ theme }) => ({ - "& > .MuiPaper-root": { - top: 152, - bottom: 0, - height: "auto", - borderLeft: `1px ${theme.palette.divider} solid`, - borderTop: `1px ${theme.palette.divider} solid`, - }, -})); - const useStyles = makeStyles((theme: Theme) => { return { autocompleteMenuContent: { @@ -511,7 +501,7 @@ const MultiFilterContent = ({ ); })} - + - + ); }; diff --git a/app/configurator/components/layout.tsx b/app/configurator/components/layout.tsx index 6939930f6..6ce78d88f 100644 --- a/app/configurator/components/layout.tsx +++ b/app/configurator/components/layout.tsx @@ -31,12 +31,11 @@ const useStyles = makeStyles((theme: Theme) => ({ width: "100%", height: "calc(100vh - 96px)", display: "grid", - gridTemplateColumns: - "minmax(12rem, 20rem) minmax(22rem, 1fr) minmax(12rem, 20rem)", + gridTemplateColumns: "minmax(12rem, 20rem) minmax(22rem, 1fr)", gridTemplateRows: "auto minmax(0, 1fr)", gridTemplateAreas: ` - "header header header" - "left middle right"`, + "header header" + "left middle"`, marginLeft: "auto", marginRight: "auto", }, diff --git a/app/themes/federal.tsx b/app/themes/federal.tsx index 70cb81150..da5396ef9 100644 --- a/app/themes/federal.tsx +++ b/app/themes/federal.tsx @@ -734,6 +734,9 @@ theme.components = { display: "none", }, }, + flexContainer: { + height: 60, + }, }, }, MuiTab: { @@ -741,19 +744,17 @@ theme.components = { root: { justifyContent: "center", alignItems: "center", - height: 49, + height: "100%", paddingTop: 0, paddingRight: 24, paddingBottom: 0, paddingLeft: 24, - backgroundColor: theme.palette.grey[100], color: theme.palette.grey[900], - borderTopLeftRadius: 12, - borderTopRightRadius: 12, - boxShadow: shadows[6], + border: "1px solid", + borderBottomWidth: 0, + borderColor: theme.palette.divider, "&.Mui-selected": { - height: 50, color: theme.palette.primary.main, }, }, From 116ee912a258e2ab3a99f5f05b51dbcfda85fcd8 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Mon, 7 Nov 2022 16:27:31 +0100 Subject: [PATCH 18/50] fix: Do not show user id in Login Menu --- app/components/login-menu.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/login-menu.tsx b/app/components/login-menu.tsx index d2b4a904f..79860e2ca 100644 --- a/app/components/login-menu.tsx +++ b/app/components/login-menu.tsx @@ -37,7 +37,6 @@ function LoginMenu() { <> Signed in as {session.user?.name}{" "} - {session.user?.id} {" - "} + ); }; -const DescribeChartStep = () => { - const [state] = useConfiguratorState(); - - if (state.state !== "DESCRIBING_CHART") { - return null; - } - return ( - <> - - - - - - - - - - - - - ); -}; const PublishStep = () => { const [state] = useConfiguratorState(); @@ -196,7 +175,6 @@ export const Configurator = () => { ) : ( {state.state === "CONFIGURING_CHART" ? : null} - {state.state === "DESCRIBING_CHART" ? : null} {state.state === "PUBLISHING" ? : null} ); diff --git a/app/configurator/interactive-filters/interactive-filters-configurator.tsx b/app/configurator/interactive-filters/interactive-filters-configurator.tsx index 39c6f84b1..0606adde2 100644 --- a/app/configurator/interactive-filters/interactive-filters-configurator.tsx +++ b/app/configurator/interactive-filters/interactive-filters-configurator.tsx @@ -12,9 +12,9 @@ import { SectionTitle, } from "@/configurator/components/chart-controls/section"; import { flag } from "@/configurator/components/flag"; -import { ConfiguratorStateDescribingChart } from "@/configurator/config-types"; +import { ConfiguratorStateConfiguringChart } from "@/configurator/config-types"; import { - isDescribing, + isConfiguring, useConfiguratorState, } from "@/configurator/configurator-state"; import { isTemporalDimension } from "@/domain/data"; @@ -34,7 +34,7 @@ export type InteractiveFilterType = export const InteractiveFiltersConfigurator = ({ state: { dataSet, dataSource, chartConfig }, }: { - state: ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => { const { chartType, fields, filters } = chartConfig; const locale = useLocale(); @@ -142,7 +142,7 @@ const InteractiveFilterTabField = ({ icon: string; label: ReactNode; }) => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const onClick = useCallback(() => { dispatch({ From 92cd06fc159baaada55099dc844a8cd0d3248da3 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 09:43:25 +0100 Subject: [PATCH 20/50] refactor: Extract TitleAndDescription --- .../components/chart-annotator.tsx | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/app/configurator/components/chart-annotator.tsx b/app/configurator/components/chart-annotator.tsx index 4345bd189..115216ff4 100644 --- a/app/configurator/components/chart-annotator.tsx +++ b/app/configurator/components/chart-annotator.tsx @@ -12,6 +12,28 @@ import { InteractiveFiltersConfigurator } from "@/configurator/interactive-filte import { ConfiguratorStateConfiguringChart } from "../config-types"; +export const TitleAndDescriptionConfigurator = () => { + return ( + + + Annotate + + + + + + + ); +}; + export const ChartAnnotator = ({ state, }: { @@ -20,24 +42,7 @@ export const ChartAnnotator = ({ return ( <> {/* Title & Description */} - - - Annotate - - - - - - - + {/* Filters */} {state.chartConfig.chartType !== "table" && ( From 9f9dd110f3aa1b54ea78914a643a6d5454a7f97e Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 09:43:56 +0100 Subject: [PATCH 21/50] feat: Show interactive filters in the left panel --- app/configurator/components/configurator.tsx | 17 ++++++++++++++--- .../interactive-filters-config-options.tsx | 14 +++++++------- .../interactive-filters-config-state.tsx | 10 +++++----- .../interactive-filters-configurator.tsx | 11 +++++++++++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/app/configurator/components/configurator.tsx b/app/configurator/components/configurator.tsx index 47ecce451..96c14f021 100644 --- a/app/configurator/components/configurator.tsx +++ b/app/configurator/components/configurator.tsx @@ -19,6 +19,9 @@ import { ChartConfiguratorTable } from "@/configurator/table/table-chart-configu import SvgIcChevronLeft from "@/icons/components/IcChevronLeft"; import useEvent from "@/utils/use-event"; +import { InteractiveFiltersOptions } from "../interactive-filters/interactive-filters-config-options"; +import { isInteractiveFilterType } from "../interactive-filters/interactive-filters-configurator"; + import { ChartAnnotator } from "./chart-annotator"; import { ChartOptionsSelector } from "./chart-options-selector"; @@ -57,6 +60,10 @@ const BackButton = ({ ); }; +const isAnnotationField = (field: string | undefined) => { + return field === "title" || field === "description"; +}; + const ConfigureChartStep = () => { const [state, dispatch] = useConfiguratorState(); @@ -135,15 +142,19 @@ const ConfigureChartStep = () => { Back to main - - + {isAnnotationField(state.activeField) ? ( + + ) : isInteractiveFilterType(state.activeField) ? ( + + ) : ( + + )} ); }; - const PublishStep = () => { const [state] = useConfiguratorState(); diff --git a/app/configurator/interactive-filters/interactive-filters-config-options.tsx b/app/configurator/interactive-filters/interactive-filters-config-options.tsx index 1cf048137..6ed3a4d23 100644 --- a/app/configurator/interactive-filters/interactive-filters-config-options.tsx +++ b/app/configurator/interactive-filters/interactive-filters-config-options.tsx @@ -19,9 +19,9 @@ import { SectionTitle, } from "@/configurator/components/chart-controls/section"; import { parseDate } from "@/configurator/components/ui-helpers"; -import { ConfiguratorStateDescribingChart } from "@/configurator/config-types"; +import { ConfiguratorStateConfiguringChart } from "@/configurator/config-types"; import { - isDescribing, + isConfiguring, useConfiguratorState, } from "@/configurator/configurator-state"; import { EditorBrush } from "@/configurator/interactive-filters/editor-time-brush"; @@ -50,7 +50,7 @@ import { getTimeSliderFilterDimensions } from "./helpers"; export const InteractiveFiltersOptions = ({ state, }: { - state: ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => { const { chartConfig, dataSet, dataSource } = state; const activeField = state.activeField as InteractiveFilterType; @@ -166,7 +166,7 @@ const InteractiveTimeRangeFilterToggle = ({ const InteractiveTimeRangeFilterOptions = ({ state, }: { - state: ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => { const locale = useLocale(); const formatDateAuto = useFormatFullDateAuto(); @@ -245,7 +245,7 @@ const InteractiveTimeRangeFilterOptions = ({ const InteractiveTimeSliderFilterOptions = ({ state: { chartConfig, dataSet, dataSource }, }: { - state: ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => { const locale = useLocale(); const [{ data }] = useDataCubeMetadataWithComponentValuesQuery({ @@ -345,7 +345,7 @@ const InteractiveDataFiltersToggle = ({ const InteractiveDataFilterOptions = ({ state: { chartConfig, dataSet, dataSource }, }: { - state: ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => { const locale = useLocale(); const [{ data }] = useDataCubeMetadataWithComponentValuesQuery({ @@ -408,7 +408,7 @@ const InteractiveDataFilterOptionsCheckbox = ({ label: string; disabled: boolean; }) => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const onChange = useCallback<(e: ChangeEvent) => void>( (e) => { diff --git a/app/configurator/interactive-filters/interactive-filters-config-state.tsx b/app/configurator/interactive-filters/interactive-filters-config-state.tsx index e56380f3a..9a0d2a1af 100644 --- a/app/configurator/interactive-filters/interactive-filters-config-state.tsx +++ b/app/configurator/interactive-filters/interactive-filters-config-state.tsx @@ -5,7 +5,7 @@ import { ChangeEvent, useCallback } from "react"; import { InteractiveFiltersConfig } from "@/configurator/config-types"; import { - isDescribing, + isConfiguring, useConfiguratorState, } from "@/configurator/configurator-state"; import { DimensionMetadataFragment } from "@/graphql/query-hooks"; @@ -14,7 +14,7 @@ import useEvent from "@/utils/use-event"; import { FIELD_VALUE_NONE } from "../constants"; export const useInteractiveLegendFiltersToggle = () => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const onChange = useEvent((e: ChangeEvent) => { const newConfig = produce( state.chartConfig.interactiveFiltersConfig, @@ -51,7 +51,7 @@ export const useInteractiveTimeRangeFiltersToggle = ({ }: { timeExtent: [string, string]; }) => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const { chartConfig } = state; const onChange = useCallback<(e: ChangeEvent) => void>( @@ -116,7 +116,7 @@ export const updateInteractiveTimeRangeFilter = produce( ); export const useInteractiveTimeSliderFiltersSelect = () => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const { chartConfig } = state; const onChange = useCallback<(e: SelectChangeEvent) => void>( @@ -155,7 +155,7 @@ export const useInteractiveDataFiltersToggle = ({ }: { dimensions: DimensionMetadataFragment[]; }) => { - const [state, dispatch] = useConfiguratorState(isDescribing); + const [state, dispatch] = useConfiguratorState(isConfiguring); const { chartConfig } = state; const onChange = useCallback<(e: ChangeEvent) => void>( diff --git a/app/configurator/interactive-filters/interactive-filters-configurator.tsx b/app/configurator/interactive-filters/interactive-filters-configurator.tsx index 0606adde2..431c73699 100644 --- a/app/configurator/interactive-filters/interactive-filters-configurator.tsx +++ b/app/configurator/interactive-filters/interactive-filters-configurator.tsx @@ -31,6 +31,17 @@ export type InteractiveFilterType = | "timeSlider" | "dataFilters"; +export const isInteractiveFilterType = ( + field: string | undefined +): field is InteractiveFilterType => { + return ( + field === "legend" || + field === "timeRange" || + field === "timeSlider" || + field === "dataFilters" + ); +}; + export const InteractiveFiltersConfigurator = ({ state: { dataSet, dataSource, chartConfig }, }: { From ea84a819743c473c9111c12cacf1df1a70bac0cc Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 09:43:32 +0100 Subject: [PATCH 22/50] feat: Add collapse to ControlSection --- .../components/chart-annotations-selector.tsx | 3 +- .../components/chart-configurator.tsx | 3 - .../components/chart-controls/section.tsx | 188 ++++++++++++------ .../components/use-disclosure.tsx | 4 +- .../interactive-filters-config-options.tsx | 8 +- 5 files changed, 136 insertions(+), 70 deletions(-) diff --git a/app/configurator/components/chart-annotations-selector.tsx b/app/configurator/components/chart-annotations-selector.tsx index 0c36adba7..d8c50a83b 100644 --- a/app/configurator/components/chart-annotations-selector.tsx +++ b/app/configurator/components/chart-annotations-selector.tsx @@ -49,7 +49,6 @@ export const ChartAnnotationsSelector = ({ const orderedLocales = [locale, ...locales.filter((l) => l !== locale)]; if (activeField) { - console.log({ activeField }) return ( ) : ( - + {getFieldLabel(activeField)} diff --git a/app/configurator/components/chart-configurator.tsx b/app/configurator/components/chart-configurator.tsx index 1bc9c7274..562cd56c3 100644 --- a/app/configurator/components/chart-configurator.tsx +++ b/app/configurator/components/chart-configurator.tsx @@ -438,9 +438,6 @@ const useStyles = makeStyles< fetching: boolean; } >((theme) => ({ - filterSection: { - flexGrow: 1, - }, loadingIndicator: { color: theme.palette.grey[700], display: "inline-block", diff --git a/app/configurator/components/chart-controls/section.tsx b/app/configurator/components/chart-controls/section.tsx index a2933b6c8..4242c36ca 100644 --- a/app/configurator/components/chart-controls/section.tsx +++ b/app/configurator/components/chart-controls/section.tsx @@ -1,6 +1,8 @@ import { Box, BoxProps, + Collapse, + IconButton, Skeleton, Theme, Typography, @@ -8,48 +10,112 @@ import { } from "@mui/material"; import { makeStyles } from "@mui/styles"; import clsx from "clsx"; -import { ElementType, forwardRef, HTMLProps, ReactNode } from "react"; +import { + ElementType, + forwardRef, + HTMLProps, + ReactNode, + useContext, + useMemo, +} from "react"; +import React from "react"; import { Icon, IconName } from "@/icons"; -import { useTheme } from "@/themes"; +import SvgIcAdd from "@/icons/components/IcAdd"; +import SvgIcMinus from "@/icons/components/IcMinus"; + +import useDisclosure from "../use-disclosure"; + +const useControlSectionStyles = makeStyles( + (theme) => ({ + controlSection: { + borderTopColor: theme.palette.grey[500], + borderTopWidth: "1px", + borderTopStyle: "solid", + overflowX: "hidden", + overflowY: "auto", + flexShrink: 0, + backgroundColor: ({ isHighlighted }) => + isHighlighted ? "primaryLight" : "grey.100", + "&:first-of-type": { + borderTopWidth: 0, + }, + }, + }) +); -const useControlSectionStyles = makeStyles((theme) => ({ - controlSection: { - borderTopColor: theme.palette.grey[500], - borderTopWidth: "1px", - borderTopStyle: "solid", - overflowX: "hidden", - overflowY: "auto", - flexShrink: 0, - "&:first-of-type": { - borderTopWidth: 0, +const useSectionTitleStyles = makeStyles< + Theme, + { + disabled?: boolean; + color?: string; + sectionOpen: boolean; + } +>((theme) => ({ + root: { + display: "flex", + alignItems: "center", + width: "100%", + padding: theme.spacing(4), + paddingBottom: ({ sectionOpen }) => + sectionOpen ? theme.spacing(2) : theme.spacing(4), + transition: "padding-bottom 300ms ease", + border: "none", + justifyContent: "flex-start", + }, + text: { + "& > svg:first-of-type": { + marginRight: theme.spacing(2), }, + flexGrow: 1, + display: "flex", + alignItems: "center", + color: ({ disabled, color }) => + disabled ? "grey.600" : color ?? "grey.800", + }, + icon: { + justifySelf: "flex-end", + display: "inline-block", + marginRight: theme.spacing(-1), }, })); +const ControlSectionContext = React.createContext({ + open: () => {}, + isOpen: false, + close: () => {}, + setOpen: (_v: boolean | ((oldV: boolean) => boolean)) => {}, + disableCollapse: false as boolean | undefined, +}); + export const ControlSection = forwardRef< HTMLDivElement, { children: ReactNode; isHighlighted?: boolean; sx?: BoxProps["sx"]; + disableCollapse?: boolean; } & Omit, "ref"> ->(({ role, children, isHighlighted, sx, ...props }, ref) => { - const classes = useControlSectionStyles(); +>(({ role, children, isHighlighted, sx, disableCollapse, ...props }, ref) => { + const classes = useControlSectionStyles({ isHighlighted }); + const disclosure = useDisclosure(true); + const ctx = useMemo( + () => ({ ...disclosure, disableCollapse }), + [disableCollapse, disclosure] + ); return ( - - {children} - + + + {children} + + ); }); @@ -91,20 +157,25 @@ export const ControlSectionContent = ({ ...props }: ControlSectionContentProps) => { const classes = useControlSectionContentStyles({ gap, px }); + const disclosure = useControlSectionContext(); return ( - - {children} - + + + {children} + + ); }; +const useControlSectionContext = () => useContext(ControlSectionContext); + export const SectionTitle = ({ color, iconName, @@ -120,29 +191,28 @@ export const SectionTitle = ({ children: ReactNode; sx?: TypographyProps["sx"]; }) => { - const theme = useTheme(); + const { setOpen, isOpen, disableCollapse } = useControlSectionContext(); + const classes = useSectionTitleStyles({ + disabled, + color, + sectionOpen: isOpen, + }); return ( - svg:first-of-type": { - marginRight: theme.spacing(2), - }, - ...sx, - }} - > - {iconName ? : null} - {children} - +
+ + {iconName ? : null} + {children} + + {disableCollapse ? null : ( + setOpen((v) => !v)} + > + {isOpen ? : } + + )} +
); }; diff --git a/app/configurator/components/use-disclosure.tsx b/app/configurator/components/use-disclosure.tsx index c02ca5c18..21e8b74b1 100644 --- a/app/configurator/components/use-disclosure.tsx +++ b/app/configurator/components/use-disclosure.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from "react"; -const useDisclosure = () => { - const [isOpen, setOpen] = useState(false); +const useDisclosure = (initialState?: boolean) => { + const [isOpen, setOpen] = useState(initialState || false); const open = useCallback(() => setOpen(true), []); const close = useCallback(() => setOpen(false), []); return { diff --git a/app/configurator/interactive-filters/interactive-filters-config-options.tsx b/app/configurator/interactive-filters/interactive-filters-config-options.tsx index 6ed3a4d23..b93813a69 100644 --- a/app/configurator/interactive-filters/interactive-filters-config-options.tsx +++ b/app/configurator/interactive-filters/interactive-filters-config-options.tsx @@ -82,7 +82,7 @@ export const InteractiveFiltersOptions = ({ const component = allComponents.find((d) => d.iri === componentIri); return ( - + {component?.label} d.iri === componentIri); return ( - + {component?.label} @@ -110,7 +110,7 @@ export const InteractiveFiltersOptions = ({ ); } else if (activeField === "timeSlider") { return ( - + Time slider @@ -123,7 +123,7 @@ export const InteractiveFiltersOptions = ({ ); } else if (activeField === "dataFilters") { return ( - + Data filters From 8e978c367c579e8ea0a3a19466c6f7502dae9f73 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 10:17:19 +0100 Subject: [PATCH 23/50] feat: Add warn icon when no title or description --- .../components/chart-annotator.tsx | 31 ++++++++++++++++++- .../components/chart-controls/section.tsx | 3 ++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/configurator/components/chart-annotator.tsx b/app/configurator/components/chart-annotator.tsx index 115216ff4..349344cc3 100644 --- a/app/configurator/components/chart-annotator.tsx +++ b/app/configurator/components/chart-annotator.tsx @@ -1,4 +1,5 @@ import { Trans } from "@lingui/macro"; +import { Tooltip, Typography } from "@mui/material"; import * as React from "react"; import { @@ -9,13 +10,41 @@ import { import { AnnotatorTabField } from "@/configurator/components/field"; import { getFieldLabel } from "@/configurator/components/field-i18n"; import { InteractiveFiltersConfigurator } from "@/configurator/interactive-filters/interactive-filters-configurator"; +import SvgIcWarning from "@/icons/components/IcWarning"; +import { useConfiguratorState } from "@/src"; import { ConfiguratorStateConfiguringChart } from "../config-types"; +import { isConfiguring } from "../configurator-state"; + +const WarnTitleDescription = () => { + const [state] = useConfiguratorState(isConfiguring); + const hasSomeTitleOrDescription = React.useMemo(() => { + const { title, description } = state.meta; + return ( + Object.values(title).some((x) => x != "") || + Object.values(description).some((x) => x != "") + ); + }, [state.meta]); + return hasSomeTitleOrDescription ? null : ( + + Your chart has no title or description. + + } + > + + + + + ); +}; export const TitleAndDescriptionConfigurator = () => { return ( - + }> Annotate diff --git a/app/configurator/components/chart-controls/section.tsx b/app/configurator/components/chart-controls/section.tsx index 4242c36ca..be8522370 100644 --- a/app/configurator/components/chart-controls/section.tsx +++ b/app/configurator/components/chart-controls/section.tsx @@ -183,6 +183,7 @@ export const SectionTitle = ({ disabled, children, sx, + right, }: { color?: string; iconName?: IconName; @@ -190,6 +191,7 @@ export const SectionTitle = ({ disabled?: boolean; children: ReactNode; sx?: TypographyProps["sx"]; + right?: React.ReactNode; }) => { const { setOpen, isOpen, disableCollapse } = useControlSectionContext(); const classes = useSectionTitleStyles({ @@ -203,6 +205,7 @@ export const SectionTitle = ({ {iconName ? : null} {children} + {right} {disableCollapse ? null : ( Date: Tue, 8 Nov 2022 10:17:45 +0100 Subject: [PATCH 24/50] feat: Remove shadows according to new design --- app/configurator/components/layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/configurator/components/layout.tsx b/app/configurator/components/layout.tsx index 6ce78d88f..fd07c8560 100644 --- a/app/configurator/components/layout.tsx +++ b/app/configurator/components/layout.tsx @@ -8,7 +8,7 @@ const useStyles = makeStyles((theme: Theme) => ({ overflowX: "hidden", overflowY: "auto", backgroundColor: theme.palette.grey[100], - boxShadow: theme.shadows[5], + boxShadow: "none", borderRightColor: theme.palette.grey[500], borderRightWidth: "1px", borderRightStyle: "solid", From b210c1181cfde6d4090d4b9a7fa2b8b60f0697e0 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 10:25:33 +0100 Subject: [PATCH 25/50] refactor: Extract Title and Description options --- .../components/chart-annotations-selector.tsx | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/app/configurator/components/chart-annotations-selector.tsx b/app/configurator/components/chart-annotations-selector.tsx index d8c50a83b..89f5a33cc 100644 --- a/app/configurator/components/chart-annotations-selector.tsx +++ b/app/configurator/components/chart-annotations-selector.tsx @@ -17,6 +17,46 @@ import { useLocale } from "@/locales/use-locale"; import { ConfiguratorStateConfiguringChart } from "../config-types"; +const TitleAndDescriptionOptions = ({ + state, +}: { + state: ConfiguratorStateConfiguringChart; +}) => { + const { activeField, meta } = state; + + const locale = useLocale(); + // Reorder locales so the input field for + // the current locale is on top + const orderedLocales = [locale, ...locales.filter((l) => l !== locale)]; + + if (!activeField) { + return null; + } + + return ( + + + {getFieldLabel(activeField)} + + + {orderedLocales.map((d) => ( + + + + ))} + + + ); +}; + export const ChartAnnotationsSelector = ({ state, }: { @@ -29,7 +69,6 @@ export const ChartAnnotationsSelector = ({ panelRef.current.focus(); } }, [activeField]); - const locale = useLocale(); const isInteractiveFilterField = useMemo(() => { switch (activeField as InteractiveFilterType) { @@ -44,10 +83,6 @@ export const ChartAnnotationsSelector = ({ } }, [activeField]); - // Reorder locales so the input field for - // the current locale is on top - const orderedLocales = [locale, ...locales.filter((l) => l !== locale)]; - if (activeField) { return ( ) : ( - - - {getFieldLabel(activeField)} - - - {orderedLocales.map((d) => ( - - - - ))} - - + )} ); From 96976affacad74a376ecb78c2707d19a95066382 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 11:25:06 +0100 Subject: [PATCH 26/50] fix: Control sections show their border top, to have a separation with back button --- app/configurator/components/chart-controls/section.tsx | 3 --- app/configurator/components/configurator.tsx | 2 -- 2 files changed, 5 deletions(-) diff --git a/app/configurator/components/chart-controls/section.tsx b/app/configurator/components/chart-controls/section.tsx index be8522370..1a8580601 100644 --- a/app/configurator/components/chart-controls/section.tsx +++ b/app/configurator/components/chart-controls/section.tsx @@ -37,9 +37,6 @@ const useControlSectionStyles = makeStyles( flexShrink: 0, backgroundColor: ({ isHighlighted }) => isHighlighted ? "primaryLight" : "grey.100", - "&:first-of-type": { - borderTopWidth: 0, - }, }, }) ); diff --git a/app/configurator/components/configurator.tsx b/app/configurator/components/configurator.tsx index 96c14f021..4548c9a8b 100644 --- a/app/configurator/components/configurator.tsx +++ b/app/configurator/components/configurator.tsx @@ -29,8 +29,6 @@ const BackContainer = ({ children }: { children: React.ReactNode }) => { return ( Date: Tue, 8 Nov 2022 11:25:38 +0100 Subject: [PATCH 27/50] feat: Clicking on title & description brings title/description --- app/components/chart-preview.tsx | 40 ++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/app/components/chart-preview.tsx b/app/components/chart-preview.tsx index 26413a5c4..8c2bba25b 100644 --- a/app/components/chart-preview.tsx +++ b/app/components/chart-preview.tsx @@ -1,5 +1,6 @@ import { Trans } from "@lingui/macro"; -import { Box, Typography } from "@mui/material"; +import { Box, Theme, Typography } from "@mui/material"; +import { makeStyles } from "@mui/styles"; import Head from "next/head"; import * as React from "react"; @@ -39,6 +40,23 @@ export const ChartPreview = ({ ); }; +const useStyles = makeStyles({ + title: { + marginBottom: 2, + cursor: "pointer", + "&:hover": { + textDecoration: "underline", + }, + }, + description: { + marginBottom: 2, + cursor: "pointer", + "&:hover": { + textDecoration: "underline", + }, + }, +}); + export const ChartPreviewInner = ({ dataSetIri, dataSource, @@ -46,9 +64,9 @@ export const ChartPreviewInner = ({ dataSetIri: string; dataSource: DataSource; }) => { - const [state] = useConfiguratorState(); + const [state, dispatch] = useConfiguratorState(); const locale = useLocale(); - + const classes = useStyles(); const [{ data: metaData }] = useDataCubeMetadataQuery({ variables: { iri: dataSetIri, @@ -98,9 +116,15 @@ export const ChartPreviewInner = ({ + dispatch({ + type: "ACTIVE_FIELD_CHANGED", + value: "title", + }) + } > {state.meta.title[locale] === "" ? ( [ Title ] @@ -118,11 +142,17 @@ export const ChartPreviewInner = ({ + dispatch({ + type: "ACTIVE_FIELD_CHANGED", + value: "description", + }) + } > {state.meta.description[locale] === "" ? ( [ Description ] From 1228afcc35ee6a8e3b9329d8e9ab9ccebcb4067f Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 11:48:38 +0100 Subject: [PATCH 28/50] feat: Improve gutterBottom for section titles and rename collapse property --- .../components/chart-annotations-selector.tsx | 2 +- .../components/chart-annotator.tsx | 8 ++- .../components/chart-configurator.tsx | 12 ++--- .../components/chart-controls/section.tsx | 52 +++++++++++-------- .../interactive-filters-config-options.tsx | 8 +-- .../interactive-filters-configurator.tsx | 6 ++- .../table/table-chart-configurator.tsx | 4 +- 7 files changed, 55 insertions(+), 37 deletions(-) diff --git a/app/configurator/components/chart-annotations-selector.tsx b/app/configurator/components/chart-annotations-selector.tsx index 89f5a33cc..3152f9fd2 100644 --- a/app/configurator/components/chart-annotations-selector.tsx +++ b/app/configurator/components/chart-annotations-selector.tsx @@ -34,7 +34,7 @@ const TitleAndDescriptionOptions = ({ } return ( - + {getFieldLabel(activeField)} diff --git a/app/configurator/components/chart-annotator.tsx b/app/configurator/components/chart-annotator.tsx index 349344cc3..48bc9aa2e 100644 --- a/app/configurator/components/chart-annotator.tsx +++ b/app/configurator/components/chart-annotator.tsx @@ -43,8 +43,12 @@ const WarnTitleDescription = () => { export const TitleAndDescriptionConfigurator = () => { return ( - - }> + + } + > Annotate diff --git a/app/configurator/components/chart-configurator.tsx b/app/configurator/components/chart-configurator.tsx index 562cd56c3..7d0d4b50e 100644 --- a/app/configurator/components/chart-configurator.tsx +++ b/app/configurator/components/chart-configurator.tsx @@ -536,16 +536,16 @@ export const ChartConfigurator = ({ return ( <> - - + + Chart Type - - + + Chart Options {filterDimensions.length === 0 && addableDimensions.length === 0 ? null : ( - - + + Filters{" "} {fetching ? ( ((theme) => ({ root: { @@ -54,11 +55,20 @@ const useSectionTitleStyles = makeStyles< alignItems: "center", width: "100%", padding: theme.spacing(4), - paddingBottom: ({ sectionOpen }) => - sectionOpen ? theme.spacing(2) : theme.spacing(4), + paddingBottom: theme.spacing(4), + marginBottom: ({ gutterBottom }) => (gutterBottom ? 0 : -theme.spacing(2)), transition: "padding-bottom 300ms ease", border: "none", justifyContent: "flex-start", + "&:hover": { + cursor: ({ collapse }) => (collapse ? "pointer" : "initial"), + backgroundColor: ({ collapse }) => + collapse ? theme.palette.grey[200] : "transparent", + + "& $icon": { + color: theme.palette.grey[900], + }, + }, }, text: { "& > svg:first-of-type": { @@ -72,8 +82,7 @@ const useSectionTitleStyles = makeStyles< }, icon: { justifySelf: "flex-end", - display: "inline-block", - marginRight: theme.spacing(-1), + color: theme.palette.grey[600], }, })); @@ -82,7 +91,7 @@ const ControlSectionContext = React.createContext({ isOpen: false, close: () => {}, setOpen: (_v: boolean | ((oldV: boolean) => boolean)) => {}, - disableCollapse: false as boolean | undefined, + collapse: true as boolean | undefined, }); export const ControlSection = forwardRef< @@ -91,14 +100,14 @@ export const ControlSection = forwardRef< children: ReactNode; isHighlighted?: boolean; sx?: BoxProps["sx"]; - disableCollapse?: boolean; + collapse?: boolean; } & Omit, "ref"> ->(({ role, children, isHighlighted, sx, disableCollapse, ...props }, ref) => { +>(({ role, children, isHighlighted, sx, collapse = false, ...props }, ref) => { const classes = useControlSectionStyles({ isHighlighted }); const disclosure = useDisclosure(true); const ctx = useMemo( - () => ({ ...disclosure, disableCollapse }), - [disableCollapse, disclosure] + () => ({ ...disclosure, collapse }), + [collapse, disclosure] ); return ( @@ -181,6 +190,7 @@ export const SectionTitle = ({ children, sx, right, + gutterBottom = true, }: { color?: string; iconName?: IconName; @@ -189,29 +199,29 @@ export const SectionTitle = ({ children: ReactNode; sx?: TypographyProps["sx"]; right?: React.ReactNode; + gutterBottom?: boolean; }) => { - const { setOpen, isOpen, disableCollapse } = useControlSectionContext(); + const { setOpen, isOpen, collapse } = useControlSectionContext(); const classes = useSectionTitleStyles({ disabled, color, sectionOpen: isOpen, + gutterBottom, + collapse, }); return ( -
+
setOpen((v) => !v) : undefined} + > {iconName ? : null} {children} {right} - {disableCollapse ? null : ( - setOpen((v) => !v)} - > - {isOpen ? : } - - )} + + {collapse ? isOpen ? : : null} +
); }; diff --git a/app/configurator/interactive-filters/interactive-filters-config-options.tsx b/app/configurator/interactive-filters/interactive-filters-config-options.tsx index b93813a69..6ed3a4d23 100644 --- a/app/configurator/interactive-filters/interactive-filters-config-options.tsx +++ b/app/configurator/interactive-filters/interactive-filters-config-options.tsx @@ -82,7 +82,7 @@ export const InteractiveFiltersOptions = ({ const component = allComponents.find((d) => d.iri === componentIri); return ( - + {component?.label} d.iri === componentIri); return ( - + {component?.label} @@ -110,7 +110,7 @@ export const InteractiveFiltersOptions = ({ ); } else if (activeField === "timeSlider") { return ( - + Time slider @@ -123,7 +123,7 @@ export const InteractiveFiltersOptions = ({ ); } else if (activeField === "dataFilters") { return ( - + Data filters diff --git a/app/configurator/interactive-filters/interactive-filters-configurator.tsx b/app/configurator/interactive-filters/interactive-filters-configurator.tsx index 431c73699..08fa60a9f 100644 --- a/app/configurator/interactive-filters/interactive-filters-configurator.tsx +++ b/app/configurator/interactive-filters/interactive-filters-configurator.tsx @@ -89,8 +89,12 @@ export const InteractiveFiltersConfigurator = ({ - + Interactive Filters diff --git a/app/configurator/table/table-chart-configurator.tsx b/app/configurator/table/table-chart-configurator.tsx index 5bca6892d..81e5a535c 100644 --- a/app/configurator/table/table-chart-configurator.tsx +++ b/app/configurator/table/table-chart-configurator.tsx @@ -118,8 +118,8 @@ export const ChartConfiguratorTable = ({ return ( <> - - + + Chart Type From 06cfd04898e1097c04118cad979a239918fcda3e Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 11:48:59 +0100 Subject: [PATCH 29/50] fix: Can change description/title in configuring step --- app/configurator/configurator-state.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/configurator/configurator-state.tsx b/app/configurator/configurator-state.tsx index 422e431e3..e8b426268 100644 --- a/app/configurator/configurator-state.tsx +++ b/app/configurator/configurator-state.tsx @@ -1231,7 +1231,7 @@ const reducer: Reducer = ( return draft; case "CHART_DESCRIPTION_CHANGED": - if (draft.state === "DESCRIBING_CHART") { + if (draft.state === "CONFIGURING_CHART") { setWith(draft, `meta.${action.value.path}`, action.value.value, Object); } return draft; From bb84b2f05edefd7debebaa0e235e512fafcf7e23 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 11:49:19 +0100 Subject: [PATCH 30/50] fix: Ability to click on page while configurator drawer is opened --- app/configurator/components/drawer.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/configurator/components/drawer.tsx b/app/configurator/components/drawer.tsx index 6c5e47831..8f0fa45fb 100644 --- a/app/configurator/components/drawer.tsx +++ b/app/configurator/components/drawer.tsx @@ -2,6 +2,9 @@ import { Drawer as MuiDrawer } from "@mui/material"; import { styled } from "@mui/material/styles"; export const ConfiguratorDrawer = styled(MuiDrawer)(({ theme }) => ({ + "&": { + position: "static", + }, "& > .MuiPaper-root": { top: 95.5, bottom: 0, From a97319ce79ccabd5b584f6a9d4dfc58a354dc960 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 11:49:35 +0100 Subject: [PATCH 31/50] fix: Styling for drawer --- app/configurator/components/drawer.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/configurator/components/drawer.tsx b/app/configurator/components/drawer.tsx index 8f0fa45fb..6bccf30cd 100644 --- a/app/configurator/components/drawer.tsx +++ b/app/configurator/components/drawer.tsx @@ -6,9 +6,11 @@ export const ConfiguratorDrawer = styled(MuiDrawer)(({ theme }) => ({ position: "static", }, "& > .MuiPaper-root": { - top: 95.5, + top: 96, bottom: 0, height: "auto", borderLeft: `1px ${theme.palette.divider} solid`, + borderRight: `1px ${theme.palette.divider} solid`, + boxShadow: "none", }, })); From 2a2fd6e64ac6c1acc0ad0ea4c08019f81e82bf8b Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:06:11 +0100 Subject: [PATCH 32/50] feat: Add correct gutterBottom + collapse to table chart configurator --- .../chart-controls/drag-and-drop-tab.tsx | 4 +-- .../table/table-chart-configurator.tsx | 7 ++--- .../table/table-chart-sorting-options.tsx | 27 ++++++++++--------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/configurator/components/chart-controls/drag-and-drop-tab.tsx b/app/configurator/components/chart-controls/drag-and-drop-tab.tsx index 12dbf9892..84522893c 100644 --- a/app/configurator/components/chart-controls/drag-and-drop-tab.tsx +++ b/app/configurator/components/chart-controls/drag-and-drop-tab.tsx @@ -56,8 +56,8 @@ export const TabDropZone = ({ {({ innerRef, placeholder }, { isDraggingOver }) => { return ( - - {title} + + {title} - - + + + Table Options ((theme) => ({ borderTopStyle: "solid", borderTopWidth: 1, }, + sortingItemBox: { + "&:first-of-type $sortingItemContainer": { + borderTopWidth: 0, + }, + }, selectWrapper: { color: theme.palette.grey[800], lineHeight: "1rem", @@ -80,6 +85,14 @@ const useStyles = makeStyles((theme) => ({ color: theme.palette.secondary.main, }, }, + icon: { + width: 24, + height: 24, + position: "absolute", + top: "50%", + right: 2, + marginTop: -12, + }, })); const TableSortingOptionItem = ({ @@ -325,17 +338,6 @@ const ChangeTableSortingOption = ({ ); }; -const useTableSortingOptionsStyles = makeStyles({ - icon: { - width: 24, - height: 24, - position: "absolute", - top: "50%", - right: 2, - marginTop: -12, - }, -}); - export const TableSortingOptions = ({ state, dataSetMetadata, @@ -345,7 +347,7 @@ export const TableSortingOptions = ({ }) => { const [, dispatch] = useConfiguratorState(); const { activeField, chartConfig } = state; - const classes = useTableSortingOptionsStyles(); + const classes = useStyles(); const onDragEnd = useCallback( ({ source, destination }) => { @@ -407,6 +409,7 @@ export const TableSortingOptions = ({ position: "relative", boxShadow: isDragging ? "tooltip" : undefined, }} + className={classes.sortingItemBox} style={{ ...draggableProps.style, }} From 9ac95f5e921de605396faced5bb3f464c2d7d370 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:16:01 +0100 Subject: [PATCH 33/50] feat: Use control section skeleton for interactive filters --- .../components/chart-controls/section.tsx | 18 ++++++++++++---- .../interactive-filters-configurator.tsx | 21 +++++++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/app/configurator/components/chart-controls/section.tsx b/app/configurator/components/chart-controls/section.tsx index 55459c601..8c53c7a70 100644 --- a/app/configurator/components/chart-controls/section.tsx +++ b/app/configurator/components/chart-controls/section.tsx @@ -15,6 +15,7 @@ import { HTMLProps, ReactNode, useContext, + useEffect, useMemo, } from "react"; import React from "react"; @@ -109,6 +110,11 @@ export const ControlSection = forwardRef< () => ({ ...disclosure, collapse }), [collapse, disclosure] ); + useEffect(() => { + if (isHighlighted) { + disclosure.setOpen(true); + } + }, [disclosure, isHighlighted]); return ( ["sx"]; + showTitle?: boolean; }) => ( - - - {" "} + {showTitle ? ( + + + + ) : null} ); } else { - return ; + return ( + + + + Interactive Filters + + + + + + ); } }; From a8bc8d8028a82c5eda16bf09643555d6d5d586ff Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:30:13 +0100 Subject: [PATCH 34/50] feat: Use correct icon for chart annotator --- app/configurator/components/chart-annotator.tsx | 8 ++++---- app/icons/components/IcExclamation.tsx | 16 ++++++++++++++++ app/icons/svg/ic_exclamation.svg | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 app/icons/components/IcExclamation.tsx create mode 100644 app/icons/svg/ic_exclamation.svg diff --git a/app/configurator/components/chart-annotator.tsx b/app/configurator/components/chart-annotator.tsx index 48bc9aa2e..97f0ffbfd 100644 --- a/app/configurator/components/chart-annotator.tsx +++ b/app/configurator/components/chart-annotator.tsx @@ -10,7 +10,7 @@ import { import { AnnotatorTabField } from "@/configurator/components/field"; import { getFieldLabel } from "@/configurator/components/field-i18n"; import { InteractiveFiltersConfigurator } from "@/configurator/interactive-filters/interactive-filters-configurator"; -import SvgIcWarning from "@/icons/components/IcWarning"; +import SvgIcExclamation from "@/icons/components/IcExclamation"; import { useConfiguratorState } from "@/src"; import { ConfiguratorStateConfiguringChart } from "../config-types"; @@ -30,12 +30,12 @@ const WarnTitleDescription = () => { arrow title={ - Your chart has no title or description. + Please add a title or description. } > - - + + ); diff --git a/app/icons/components/IcExclamation.tsx b/app/icons/components/IcExclamation.tsx new file mode 100644 index 000000000..6b6a05b7f --- /dev/null +++ b/app/icons/components/IcExclamation.tsx @@ -0,0 +1,16 @@ +import * as React from "react"; + +function SvgIcExclamation(props: React.SVGProps) { + return ( + + + + ); +} + +export default SvgIcExclamation; + diff --git a/app/icons/svg/ic_exclamation.svg b/app/icons/svg/ic_exclamation.svg new file mode 100644 index 000000000..9a91a3615 --- /dev/null +++ b/app/icons/svg/ic_exclamation.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 8791afa40c89ed1fafbe14269945c7bcd4eb3f13 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:16:14 +0100 Subject: [PATCH 35/50] feat: Use translated string for Back to preview and Checkout to publishing --- app/components/chart-selection-tabs.tsx | 5 +++-- app/configurator/components/configurator.tsx | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/components/chart-selection-tabs.tsx b/app/components/chart-selection-tabs.tsx index 09c822650..acc013600 100644 --- a/app/components/chart-selection-tabs.tsx +++ b/app/components/chart-selection-tabs.tsx @@ -1,3 +1,4 @@ +import { Trans } from "@lingui/macro"; import { Box, Popover, Tab, Tabs, Theme, Button } from "@mui/material"; import { makeStyles } from "@mui/styles"; import React, { @@ -159,7 +160,7 @@ const TabsInner = ({ onActionButtonClick?: (e: React.MouseEvent) => void; }) => { return ( - + {/* TODO: Generate dynamically when chart composition is implemented */} ); diff --git a/app/configurator/components/configurator.tsx b/app/configurator/components/configurator.tsx index 4548c9a8b..28ccaf564 100644 --- a/app/configurator/components/configurator.tsx +++ b/app/configurator/components/configurator.tsx @@ -1,3 +1,4 @@ +import { Trans } from "@lingui/macro"; import Box from "@mui/material/Box"; import Button, { ButtonProps } from "@mui/material/Button"; import { useRouter } from "next/router"; @@ -102,7 +103,9 @@ const ConfigureChartStep = () => { }} > - Back to datasets + + Back to preview + {state.chartConfig.chartType === "table" ? ( From 1413cf0c75943c79d4a81c60ec82714f6c738529 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:40:29 +0100 Subject: [PATCH 36/50] feat: Remove unused stepper --- app/configurator/components/stepper.tsx | 233 ------------------------ app/docs/steps.docs.tsx | 67 ------- app/pages/docs/index.tsx | 6 - 3 files changed, 306 deletions(-) delete mode 100644 app/configurator/components/stepper.tsx delete mode 100644 app/docs/steps.docs.tsx diff --git a/app/configurator/components/stepper.tsx b/app/configurator/components/stepper.tsx deleted file mode 100644 index eefc256d8..000000000 --- a/app/configurator/components/stepper.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { Trans } from "@lingui/macro"; -import { Button, Theme, Typography } from "@mui/material"; -import { makeStyles } from "@mui/styles"; -import { useRouter } from "next/router"; -import React, { ReactNode, useEffect } from "react"; - -import Flex from "@/components/flex"; -import { useHeaderProgress } from "@/components/header"; -import { - canTransitionToNextStep, - canTransitionToPreviousStep, - useConfiguratorState, -} from "@/configurator"; -import { useDataCubeMetadataWithComponentValuesQuery } from "@/graphql/query-hooks"; -import SvgIcChevronLeft from "@/icons/components/IcChevronLeft"; -import SvgIcChevronRight from "@/icons/components/IcChevronRight"; -import { useLocale } from "@/src"; -import useEvent from "@/utils/use-event"; - -export type StepStatus = "past" | "current" | "future"; - -const steps = ["CONFIGURING_CHART", "DESCRIBING_CHART"] as const; -type StepState = typeof steps[number]; - -const useStyles = makeStyles((theme: Theme) => ({ - root: { - alignItems: "center", - position: "relative", - - backgroundColor: theme.palette.grey[100], - borderBottomWidth: "1px", - borderBottomStyle: "solid", - borderBottomColor: theme.palette.grey[500], - overflow: "hidden", - }, - container: { - width: "100%", - justifyContent: "center", - alignItems: "center", - padding: `0 ${theme.spacing(2)}`, - minHeight: 56, - }, -})); - -export const StepperDumb = ({ - goPrevious, - goNext, - state, - data, -}: { - goPrevious: () => void; - goNext: () => void; - state: ReturnType[0]; - data: ReturnType< - typeof useDataCubeMetadataWithComponentValuesQuery - >[0]["data"]; -}) => { - const classes = useStyles(); - const nextDisabled = - !canTransitionToNextStep(state, data?.dataCubeByIri) || - state.state === "PUBLISHING"; - const previousDisabled = - !canTransitionToPreviousStep(state) || state.state === "PUBLISHING"; - - const previousLabel = Back; - const nextLabel = - state.state === "DESCRIBING_CHART" || state.state === "PUBLISHING" ? ( - Publish this visualization - ) : ( - Next - ); - - const currentStepIndex = steps.indexOf(state.state as $IntentionalAny); - const { value: progress, setValue: setProgress } = useHeaderProgress(); - useEffect(() => { - const run = async () => { - if ( - (currentStepIndex === 0 || currentStepIndex === -1) && - progress === 100 - ) { - setProgress(0); - await new Promise((resolve) => setTimeout(resolve, 100)); - } - setProgress( - Math.round(((currentStepIndex + 1) / (steps.length + 1)) * 100) - ); - }; - run(); - return () => { - setProgress(100); - }; - }, [currentStepIndex, setProgress, progress]); - - return ( - - {/* Stepper container */} - - - - - - - - - - - - - - ); -}; - -export const Stepper = ({ dataSetIri }: { dataSetIri?: string }) => { - const [state, dispatch] = useConfiguratorState(); - const locale = useLocale(); - const [{ data }] = useDataCubeMetadataWithComponentValuesQuery({ - variables: { - iri: dataSetIri ?? "", - sourceType: state.dataSource.type, - sourceUrl: state.dataSource.url, - locale, - }, - pause: !dataSetIri, - }); - const goNext = useEvent(() => { - if (data?.dataCubeByIri) { - dispatch({ - type: "STEP_NEXT", - dataSetMetadata: data?.dataCubeByIri, - }); - } - }); - - const router = useRouter(); - - const goPrevious = useEvent(() => { - if (state.state === "CONFIGURING_CHART") { - router.push( - { - pathname: `/browse/dataset/${encodeURIComponent(state.dataSet)}`, - }, - undefined, - { shallow: true } - ); - } else { - dispatch({ - type: "STEP_PREVIOUS", - }); - } - }); - - return ( - - ); -}; - -export const CallToAction = ({ - stepState, -}: { - stepState: StepState | undefined; -}) => { - switch (stepState) { - case "CONFIGURING_CHART": - return ( - - Customize your visualization by using the filter and color - segmentation options in the sidebars. - - } - /> - ); - case "DESCRIBING_CHART": - return ( - - Before publishing, add a title and description to your chart, and - choose which elements should be interactive. - - } - /> - ); - } - - return null; -}; - -const CallToActionText = ({ label }: { label: ReactNode }) => { - return ( - - {label} - - ); -}; diff --git a/app/docs/steps.docs.tsx b/app/docs/steps.docs.tsx deleted file mode 100644 index b72bb93b7..000000000 --- a/app/docs/steps.docs.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { markdown, ReactSpecimen } from "catalog"; - -import { HeaderBorder, HeaderProgressProvider } from "@/components/header"; -import { - ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, -} from "@/configurator"; -import { StepperDumb } from "@/configurator/components/stepper"; -import { DataCubeMetadataWithComponentValuesQuery } from "@/graphql/query-hooks"; - -const mockData = { - __typename: "Query", - dataCubeByIri: { dimensions: [{}] }, -} as DataCubeMetadataWithComponentValuesQuery; - -export default () => markdown` -> The "stepper" is used to guide users through the steps of creating a visualization. - - -Configuring step - -${( - - - - {}} - goNext={() => {}} - data={mockData} - state={ - { state: "CONFIGURING_CHART" } as ConfiguratorStateConfiguringChart - } - /> - - -)} - -Describing step - - ${( - - - - {}} - goNext={() => {}} - data={mockData} - state={ - { state: "DESCRIBING_CHART" } as ConfiguratorStateDescribingChart - } - /> - - - )} - - - ## How to use - -~~~ -import { Step } from "../components/step"; - - - Primary Step - -~~~ - -`; diff --git a/app/pages/docs/index.tsx b/app/pages/docs/index.tsx index 9ecc7c363..5f4096d6f 100644 --- a/app/pages/docs/index.tsx +++ b/app/pages/docs/index.tsx @@ -181,12 +181,6 @@ const pages: ConfigPageOrGroup[] = [ title: "Publish actions", content: require("@/docs/publish-actions.docs"), }, - - { - path: "/components/steps", - title: "Stepper", - content: require("@/docs/steps.docs"), - }, { path: "/components/table", title: "Preview Table", From 65968b0d2b9e84e367f855553f15e7120a9d3a03 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:40:56 +0100 Subject: [PATCH 37/50] feat: Add chevron right to publish chart --- app/components/chart-selection-tabs.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/components/chart-selection-tabs.tsx b/app/components/chart-selection-tabs.tsx index acc013600..77b5baa8c 100644 --- a/app/components/chart-selection-tabs.tsx +++ b/app/components/chart-selection-tabs.tsx @@ -20,6 +20,7 @@ import { import { ChartTypeSelector } from "@/configurator/components/chart-type-selector"; import { getIconName } from "@/configurator/components/ui-helpers"; import { Icon, IconName } from "@/icons"; +import SvgIcChevronRight from "@/icons/components/IcChevronRight"; import useEvent from "@/utils/use-event"; import Flex from "./flex"; @@ -171,8 +172,12 @@ const TabsInner = ({ } /> - ); From 2788e6665b7140f3e725d9de2a8628da54f3e54d Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:41:08 +0100 Subject: [PATCH 38/50] feat: Remove describing chart step --- app/components/chart-panel.tsx | 5 +- app/components/chart-preview.tsx | 1 - app/components/chart-selection-tabs.tsx | 5 +- .../components/chart-configurator.tsx | 6 +-- .../components/chart-type-selector.tsx | 6 +-- .../components/empty-right-panel.tsx | 13 +---- app/configurator/config-form.tsx | 2 +- app/configurator/config-types.ts | 10 ---- app/configurator/configurator-state.tsx | 50 +++---------------- .../interactive-filters/editor-time-brush.tsx | 10 ++-- 10 files changed, 21 insertions(+), 87 deletions(-) diff --git a/app/components/chart-panel.tsx b/app/components/chart-panel.tsx index 7f2ab2ff6..ac8d087eb 100644 --- a/app/components/chart-panel.tsx +++ b/app/components/chart-panel.tsx @@ -6,7 +6,6 @@ import Flex from "@/components/flex"; import { ChartType, ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, ConfiguratorStatePublishing, } from "@/configurator"; import { useConfiguratorState } from "@/src"; @@ -18,9 +17,7 @@ type ChartPanelProps = { children: ReactNode } & BoxProps; export const ChartPanelConfigurator = (props: ChartPanelProps) => { // This type of chart panel can only appear for below steps. const [state] = useConfiguratorState() as unknown as [ - | ConfiguratorStateConfiguringChart - | ConfiguratorStateDescribingChart - | ConfiguratorStatePublishing + ConfiguratorStateConfiguringChart | ConfiguratorStatePublishing ]; return ( diff --git a/app/components/chart-preview.tsx b/app/components/chart-preview.tsx index 8c2bba25b..c241ebafe 100644 --- a/app/components/chart-preview.tsx +++ b/app/components/chart-preview.tsx @@ -109,7 +109,6 @@ export const ChartPreviewInner = ({ )} {(state.state === "CONFIGURING_CHART" || - state.state === "DESCRIBING_CHART" || state.state === "PUBLISHING") && ( <> <> diff --git a/app/components/chart-selection-tabs.tsx b/app/components/chart-selection-tabs.tsx index 77b5baa8c..4e92cb179 100644 --- a/app/components/chart-selection-tabs.tsx +++ b/app/components/chart-selection-tabs.tsx @@ -13,7 +13,6 @@ import React, { import { ChartType, ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, ConfiguratorStatePublishing, useConfiguratorState, } from "@/configurator"; @@ -97,9 +96,7 @@ const useStyles = makeStyles((theme) => ({ const TabsEditable = ({ chartType }: { chartType: ChartType }) => { const [configuratorState] = useConfiguratorState() as unknown as [ - | ConfiguratorStateConfiguringChart - | ConfiguratorStateDescribingChart - | ConfiguratorStatePublishing + ConfiguratorStateConfiguringChart | ConfiguratorStatePublishing ]; const [tabsState, setTabsState] = useTabsState(); const [popoverAnchorEl, setPopoverAnchorEl] = useState( diff --git a/app/configurator/components/chart-configurator.tsx b/app/configurator/components/chart-configurator.tsx index 7d0d4b50e..ae17cc7ab 100644 --- a/app/configurator/components/chart-configurator.tsx +++ b/app/configurator/components/chart-configurator.tsx @@ -27,7 +27,6 @@ import { chartConfigOptionsUISpec } from "@/charts/chart-config-ui-options"; import { ChartConfig, ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, ConfiguratorStatePublishing, isMapConfig, OptionGroup, @@ -189,10 +188,7 @@ const orderedIsEqual = ( const useEnsurePossibleFilters = ({ state, }: { - state: - | ConfiguratorStateConfiguringChart - | ConfiguratorStateDescribingChart - | ConfiguratorStatePublishing; + state: ConfiguratorStateConfiguringChart | ConfiguratorStatePublishing; }) => { const [, dispatch] = useConfiguratorState(); const [fetching, setFetching] = useState(false); diff --git a/app/configurator/components/chart-type-selector.tsx b/app/configurator/components/chart-type-selector.tsx index 62405ef8d..6b3146b70 100644 --- a/app/configurator/components/chart-type-selector.tsx +++ b/app/configurator/components/chart-type-selector.tsx @@ -18,7 +18,6 @@ import { useLocale } from "@/locales/use-locale"; import { ChartType, ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, ConfiguratorStatePublishing, } from "../config-types"; @@ -104,10 +103,7 @@ export const ChartTypeSelector = ({ sx, ...props }: { - state: - | ConfiguratorStateConfiguringChart - | ConfiguratorStateDescribingChart - | ConfiguratorStatePublishing; + state: ConfiguratorStateConfiguringChart | ConfiguratorStatePublishing; showHelp?: boolean; sx?: BoxProps["sx"]; } & BoxProps) => { diff --git a/app/configurator/components/empty-right-panel.tsx b/app/configurator/components/empty-right-panel.tsx index 4e9d0ea94..60436d727 100644 --- a/app/configurator/components/empty-right-panel.tsx +++ b/app/configurator/components/empty-right-panel.tsx @@ -2,15 +2,12 @@ import { Trans } from "@lingui/macro"; import { Typography } from "@mui/material"; import { ReactNode } from "react"; -import { - ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, -} from "@/configurator"; +import { ConfiguratorStateConfiguringChart } from "@/configurator"; export const EmptyRightPanel = ({ state, }: { - state: ConfiguratorStateConfiguringChart | ConfiguratorStateDescribingChart; + state: ConfiguratorStateConfiguringChart; }) => ( {getRightPanelHint(state.state)} @@ -26,12 +23,6 @@ const getRightPanelHint = (state: string): ReactNode => { its options. ); - case "DESCRIBING_CHART": - return ( - - Select an annotation field in the left panel. - - ); default: return "blabla"; } diff --git a/app/configurator/config-form.tsx b/app/configurator/config-form.tsx index a116b33a1..9eaf0baaa 100644 --- a/app/configurator/config-form.tsx +++ b/app/configurator/config-form.tsx @@ -376,7 +376,7 @@ export const useChartType = (): { }); const value = - state.state === "CONFIGURING_CHART" || state.state === "DESCRIBING_CHART" + state.state === "CONFIGURING_CHART" ? get(state, "chartConfig.chartType") : ""; diff --git a/app/configurator/config-types.ts b/app/configurator/config-types.ts index adf78d7f7..e464a2af7 100644 --- a/app/configurator/config-types.ts +++ b/app/configurator/config-types.ts @@ -832,12 +832,6 @@ const ConfiguratorStateConfiguringChart = t.intersection([ }), Config, ]); -const ConfiguratorStateDescribingChart = t.intersection([ - t.type({ - state: t.literal("DESCRIBING_CHART"), - }), - Config, -]); const ConfiguratorStatePublishing = t.intersection([ t.type({ state: t.literal("PUBLISHING"), @@ -851,9 +845,6 @@ export type ConfiguratorStateSelectingDataSet = t.TypeOf< export type ConfiguratorStateConfiguringChart = t.TypeOf< typeof ConfiguratorStateConfiguringChart >; -export type ConfiguratorStateDescribingChart = t.TypeOf< - typeof ConfiguratorStateDescribingChart ->; export type ConfiguratorStatePublishing = t.TypeOf< typeof ConfiguratorStatePublishing >; @@ -861,7 +852,6 @@ const ConfiguratorState = t.union([ ConfiguratorStateInitial, ConfiguratorStateSelectingDataSet, ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, ConfiguratorStatePublishing, ]); diff --git a/app/configurator/configurator-state.tsx b/app/configurator/configurator-state.tsx index e8b426268..71fa73bcb 100644 --- a/app/configurator/configurator-state.tsx +++ b/app/configurator/configurator-state.tsx @@ -32,7 +32,6 @@ import { DEFAULT_FIXED_COLOR_FIELD } from "@/charts/map/constants"; import { mapValueIrisToColor } from "@/configurator/components/ui-helpers"; import { ConfiguratorStateConfiguringChart, - ConfiguratorStateDescribingChart, DataSource, GenericField, ImputationType, @@ -295,7 +294,7 @@ const emptyState: ConfiguratorStateSelectingDataSet = { }; const getCachedCubeMetadataWithComponentValues = ( - draft: ConfiguratorStateConfiguringChart | ConfiguratorStateDescribingChart, + draft: ConfiguratorStateConfiguringChart, locale: Locale ) => { const query = client.readQuery< @@ -576,17 +575,12 @@ const transitionStepNext = ( } break; case "CONFIGURING_CHART": - return { - ...draft, - activeField: undefined, - state: "DESCRIBING_CHART", - }; - case "DESCRIBING_CHART": return { ...draft, activeField: undefined, state: "PUBLISHING", }; + case "INITIAL": case "PUBLISHING": break; @@ -612,8 +606,6 @@ export const canTransitionToNextStep = ( case "SELECTING_DATASET": return state.dataSet !== undefined; case "CONFIGURING_CHART": - case "DESCRIBING_CHART": - // These are all interchangeable in terms of validity return true; } @@ -628,10 +620,8 @@ const getPreviousState = ( return state; case "CONFIGURING_CHART": return "SELECTING_DATASET"; - case "DESCRIBING_CHART": - return "CONFIGURING_CHART"; case "PUBLISHING": - return "DESCRIBING_CHART"; + return "CONFIGURING_CHART"; default: return "SELECTING_DATASET"; } @@ -662,12 +652,6 @@ const transitionStepPrevious = ( activeField: undefined, state: stepTo, }; - case "DESCRIBING_CHART": - return { - ...draft, - activeField: undefined, - state: stepTo, - }; default: return draft; } @@ -1066,10 +1050,7 @@ export const handleInteractiveFilterChanged = ( { type: "INTERACTIVE_FILTER_CHANGED" } > ) => { - if ( - draft.state === "CONFIGURING_CHART" || - draft.state === "DESCRIBING_CHART" - ) { + if (draft.state === "CONFIGURING_CHART") { setWith( draft, "chartConfig.interactiveFiltersConfig", @@ -1084,10 +1065,7 @@ export const handleInteractiveFilterChanged = ( export const handleInteractiveFilterTimeSliderReset = ( draft: ConfiguratorState ) => { - if ( - draft.state === "CONFIGURING_CHART" || - draft.state === "DESCRIBING_CHART" - ) { + if (draft.state === "CONFIGURING_CHART") { if (draft.chartConfig.interactiveFiltersConfig) { draft.chartConfig.interactiveFiltersConfig.timeSlider.componentIri = ""; } @@ -1115,10 +1093,7 @@ const reducer: Reducer = ( draft.dataSource = action.value; return draft; case "CHART_TYPE_CHANGED": - if ( - draft.state === "CONFIGURING_CHART" || - draft.state === "DESCRIBING_CHART" - ) { + if (draft.state === "CONFIGURING_CHART") { const { locale, chartType } = action.value; const metadata = getCachedCubeMetadataWithComponentValues( draft, @@ -1145,11 +1120,9 @@ const reducer: Reducer = ( return draft; case "ACTIVE_FIELD_CHANGED": - if ( - draft.state === "CONFIGURING_CHART" || - draft.state === "DESCRIBING_CHART" - ) + if (draft.state === "CONFIGURING_CHART") { draft.activeField = action.value; + } return draft; case "CHART_FIELD_CHANGED": @@ -1568,7 +1541,6 @@ const ConfiguratorStateProviderInternal = ({ try { switch (state.state) { case "CONFIGURING_CHART": - case "DESCRIBING_CHART": if (chartId === "new") { const newChartId = createChartId(); window.localStorage.setItem( @@ -1724,9 +1696,3 @@ export const isConfiguring = ( ): s is ConfiguratorStateConfiguringChart => { return s.state === "CONFIGURING_CHART"; }; - -export const isDescribing = ( - s: ConfiguratorState -): s is ConfiguratorStateDescribingChart => { - return s.state === "DESCRIBING_CHART"; -}; diff --git a/app/configurator/interactive-filters/editor-time-brush.tsx b/app/configurator/interactive-filters/editor-time-brush.tsx index 1ffdbdfe1..d2c2ceb36 100644 --- a/app/configurator/interactive-filters/editor-time-brush.tsx +++ b/app/configurator/interactive-filters/editor-time-brush.tsx @@ -6,8 +6,10 @@ import React, { useCallback, useEffect, useRef } from "react"; import Flex from "@/components/flex"; import { Label } from "@/components/form"; import { parseDate } from "@/configurator/components/ui-helpers"; -import { ConfiguratorStateDescribingChart } from "@/configurator/config-types"; -import { useConfiguratorState } from "@/configurator/configurator-state"; +import { + isConfiguring, + useConfiguratorState, +} from "@/configurator/configurator-state"; import { updateInteractiveTimeRangeFilter } from "@/configurator/interactive-filters/interactive-filters-config-state"; import { useFormatFullDateAuto } from "@/formatters"; import { useTheme } from "@/themes"; @@ -42,8 +44,8 @@ export const EditorBrush = ({ // FIXME: make component responsive (currently triggers infinite loop) const brushWidth = 267; //width - MARGINS.left - MARGINS.right; - const [state, dispatch] = useConfiguratorState(); - const { chartConfig } = state as ConfiguratorStateDescribingChart; + const [state, dispatch] = useConfiguratorState(isConfiguring); + const { chartConfig } = state; const timeScale = scaleTime().domain(timeExtent).range([0, brushWidth]); From ea34643802709b306000d387963f9ba20719e080 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:46:43 +0100 Subject: [PATCH 39/50] feat: Publish button send STEP_NEXT --- app/components/chart-selection-tabs.tsx | 46 ++++++++++++++++++++----- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/app/components/chart-selection-tabs.tsx b/app/components/chart-selection-tabs.tsx index 4e92cb179..f183e13aa 100644 --- a/app/components/chart-selection-tabs.tsx +++ b/app/components/chart-selection-tabs.tsx @@ -18,8 +18,9 @@ import { } from "@/configurator"; import { ChartTypeSelector } from "@/configurator/components/chart-type-selector"; import { getIconName } from "@/configurator/components/ui-helpers"; +import { useDataCubeMetadataWithComponentValuesQuery } from "@/graphql/query-hooks"; import { Icon, IconName } from "@/icons"; -import SvgIcChevronRight from "@/icons/components/IcChevronRight"; +import { useLocale } from "@/src"; import useEvent from "@/utils/use-event"; import Flex from "./flex"; @@ -148,6 +149,41 @@ const TabsFixed = ({ chartType }: { chartType: ChartType }) => { return ; }; +const PublishChartButton = () => { + const [state, dispatch] = useConfiguratorState(); + const { dataSet: dataSetIri } = state as + | ConfiguratorStatePublishing + | ConfiguratorStateConfiguringChart; + const locale = useLocale(); + const [{ data }] = useDataCubeMetadataWithComponentValuesQuery({ + variables: { + iri: dataSetIri ?? "", + sourceType: state.dataSource.type, + sourceUrl: state.dataSource.url, + locale, + }, + pause: !dataSetIri, + }); + const goNext = useEvent(() => { + if (data?.dataCubeByIri) { + dispatch({ + type: "STEP_NEXT", + dataSetMetadata: data?.dataCubeByIri, + }); + } + }); + + return ( + + ); +}; + const TabsInner = ({ chartType, editable, @@ -169,13 +205,7 @@ const TabsInner = ({ } /> - + ); }; From 97af247b8f2215456acefc2b6fb934eb8df105e0 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 12:54:13 +0100 Subject: [PATCH 40/50] fix: Keep a singleton Prisma across hot reloads --- app/db/client.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/db/client.ts b/app/db/client.ts index b5bf6ce85..202d3a562 100644 --- a/app/db/client.ts +++ b/app/db/client.ts @@ -1,5 +1,24 @@ import { PrismaClient } from "@prisma/client"; -const prisma = new PrismaClient(); +/** + * Global Prisma client + * + * Only one instance of Prisma is kept across hot reloads to prevent + * "FATAL: sorry, too many clients already" error. + * @see https://github.com/prisma/prisma/issues/1983 + */ +let prisma: PrismaClient; + +const g = global as unknown as { prisma: PrismaClient | undefined }; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(); +} else { + if (!g.prisma) { + g.prisma = new PrismaClient(); + } + + prisma = g.prisma; +} export default prisma; From 174a6181580214450ec53ab651cb7da02d082acc Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 13:05:39 +0100 Subject: [PATCH 41/50] feat: Update messages --- app/locales/de/messages.po | 196 ++++++++++++++++++----------------- app/locales/en/messages.po | 196 ++++++++++++++++++----------------- app/locales/fr/messages.po | 205 ++++++++++++++++++------------------- app/locales/it/messages.po | 198 +++++++++++++++++------------------ 4 files changed, 405 insertions(+), 390 deletions(-) diff --git a/app/locales/de/messages.po b/app/locales/de/messages.po index ead13fa5d..3614456b5 100644 --- a/app/locales/de/messages.po +++ b/app/locales/de/messages.po @@ -13,60 +13,60 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: app/configurator/components/chart-configurator.tsx:647 +#: app/configurator/components/chart-configurator.tsx:648 msgid "Add filter" msgstr "Filter hinzufügen" -#: app/configurator/components/chart-configurator.tsx:620 +#: app/configurator/components/chart-configurator.tsx:621 msgid "Drag filters to reorganize" msgstr "Ziehen Sie die Filter per Drag & Drop, um sie neu zu organisieren" -#: app/configurator/components/chart-configurator.tsx:617 +#: app/configurator/components/chart-configurator.tsx:618 msgid "Move filter down" msgstr "Filter nach unten verschieben" -#: app/configurator/components/chart-configurator.tsx:614 +#: app/configurator/components/chart-configurator.tsx:615 msgid "Move filter up" msgstr "Filter nach oben verschieben" -#: app/configurator/components/dataset-browse.tsx:1037 -#: app/configurator/components/filters.tsx:730 +#: app/configurator/components/dataset-browse.tsx:1043 +#: app/configurator/components/filters.tsx:719 msgid "No results" msgstr "Kein Ergebnis" -#: app/components/chart-preview.tsx:128 +#: app/components/chart-preview.tsx:157 msgid "annotation.add.description" msgstr "[ Ohne Beschreibung ]" -#: app/components/chart-preview.tsx:106 +#: app/components/chart-preview.tsx:129 msgid "annotation.add.title" msgstr "[ Ohne Titel ]" -#: app/configurator/components/dataset-browse.tsx:968 +#: app/configurator/components/dataset-browse.tsx:974 msgid "browse-panel.organizations" msgstr "Organisationen" -#: app/configurator/components/dataset-browse.tsx:950 +#: app/configurator/components/dataset-browse.tsx:956 msgid "browse-panel.themes" msgstr "Kategorien" -#: app/configurator/components/dataset-preview.tsx:128 +#: app/configurator/components/dataset-preview.tsx:139 msgid "browse.dataset.create-visualization" msgstr "Visualisierung von diesem Datensatz erstellen" -#: app/configurator/components/select-dataset-step.tsx:284 +#: app/configurator/components/select-dataset-step.tsx:295 msgid "browse.datasets.all-datasets" msgstr "Alle Datensätze" -#: app/configurator/components/select-dataset-step.tsx:217 +#: app/configurator/components/select-dataset-step.tsx:189 msgid "browse.datasets.description" msgstr "Erkunden Sie die vom LINDAS Linked Data Service bereitgestellten Datensätze, indem Sie entweder nach Kategorien oder Organisationen filtern oder direkt nach bestimmten Stichworten suchen. Klicken Sie auf einen Datensatz, um detailliertere Informationen zu erhalten und Ihre eigenen Visualisierungen zu erstellen." #: app/configurator/components/stepper.tsx:65 -msgid "button.back" -msgstr "Zurück" +#~ msgid "button.back" +#~ msgstr "Zurück" -#: app/pages/v/[chartId].tsx:167 +#: app/pages/v/[chartId].tsx:166 msgid "button.copy.visualization" msgstr "Diese Visualisierung kopieren und editieren" @@ -103,15 +103,15 @@ msgstr "Kopieren" msgid "button.hint.copied" msgstr "Kopiert!" -#: app/pages/v/[chartId].tsx:152 +#: app/pages/v/[chartId].tsx:151 msgid "button.new.visualization" msgstr "Neue Visualisierung erstellen" #: app/configurator/components/stepper.tsx:70 -msgid "button.next" -msgstr "Weiter" +#~ msgid "button.next" +#~ msgstr "Weiter" -#: app/configurator/components/stepper.tsx:68 +#: app/components/chart-selection-tabs.tsx:182 msgid "button.publish" msgstr "Diese Visualisierung veröffentlichen" @@ -123,7 +123,7 @@ msgstr "Teilen" msgid "chart.map.layers.area" msgstr "Flächen" -#: app/configurator/components/chart-configurator.tsx:696 +#: app/configurator/components/chart-configurator.tsx:697 #: app/configurator/components/chart-options-selector.tsx:989 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" @@ -183,7 +183,7 @@ msgstr "Fett" msgid "columnStyle.textStyle.regular" msgstr "Normal" -#: app/configurator/interactive-filters/editor-time-brush.tsx:168 +#: app/configurator/interactive-filters/editor-time-brush.tsx:170 msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Standardeinstellung" @@ -319,33 +319,33 @@ msgstr "Beschreibung hinzufügen" msgid "controls.dimensionvalue.none" msgstr "Kein Filter" -#: app/configurator/components/filters.tsx:480 +#: app/configurator/components/filters.tsx:469 msgid "controls.filter.nb-elements" msgstr "{0} von {1}" -#: app/configurator/components/filters.tsx:414 -#: app/configurator/components/filters.tsx:658 +#: app/configurator/components/filters.tsx:403 +#: app/configurator/components/filters.tsx:647 msgid "controls.filter.select.all" msgstr "Alle auswählen" -#: app/configurator/components/filters.tsx:421 -#: app/configurator/components/filters.tsx:656 +#: app/configurator/components/filters.tsx:410 +#: app/configurator/components/filters.tsx:645 msgid "controls.filter.select.none" msgstr "Alle abwählen" -#: app/configurator/components/filters.tsx:431 +#: app/configurator/components/filters.tsx:420 msgid "controls.filters.select.filters" msgstr "Filter" -#: app/configurator/components/filters.tsx:461 +#: app/configurator/components/filters.tsx:450 msgid "controls.filters.select.refresh-colors" msgstr "Farben auffrischen" -#: app/configurator/components/filters.tsx:445 +#: app/configurator/components/filters.tsx:434 msgid "controls.filters.select.reset-colors" msgstr "Farben zurücksetzen" -#: app/configurator/components/filters.tsx:438 +#: app/configurator/components/filters.tsx:427 msgid "controls.filters.select.selected-filters" msgstr "Ausgewählte Filter" @@ -365,13 +365,13 @@ msgstr "Ziehen Sie Spalten hierher, um Gruppen zu erstellen." #~ msgid "controls.hierarchy.select" #~ msgstr "Hierarchie-Ebene auswählen" -#: app/configurator/components/empty-right-panel.tsx:24 +#: app/configurator/components/empty-right-panel.tsx:21 msgid "controls.hint.configuring.chart" msgstr "Bitte eine Designoption oder Datendimension auswählen, um diese zu bearbeiten." #: app/configurator/components/empty-right-panel.tsx:31 -msgid "controls.hint.describing.chart" -msgstr "Bitte ein Beschreibungsfeld auswählen, um dieses zu bearbeiten." +#~ msgid "controls.hint.describing.chart" +#~ msgstr "Bitte ein Beschreibungsfeld auswählen, um dieses zu bearbeiten." #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" @@ -393,34 +393,34 @@ msgstr "-" msgid "controls.imputation.type.zeros" msgstr "Nullen" -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:137 msgid "controls.interactive.filters.dataFilter" msgstr "Datenfilter" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:104 -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:97 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:115 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 msgid "controls.interactive.filters.timeSlider" msgstr "Zeitschieber" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:327 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:375 msgid "controls.interactiveFilters.dataFilters.toggledataFilters" msgstr "Datenfilter anzeigen" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:77 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:89 msgid "controls.interactiveFilters.legend.toggleInteractiveLegend" msgstr "Filterbare Legende anzeigen" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:222 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:233 msgid "controls.interactiveFilters.time.noTimeDimension" msgstr "Keine Zeitdimension verfügbar!" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:197 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:208 msgid "controls.interactiveFilters.time.toggleTimeFilter" msgstr "Zeitfilter anzeigen" #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:263 -msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" -msgstr "Zeitschieber anzeigen" +#~ msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" +#~ msgstr "Zeitschieber anzeigen" #: app/configurator/components/field-i18n.ts:135 msgid "controls.language.english" @@ -447,6 +447,14 @@ msgstr "Italienisch" msgid "controls.measure" msgstr "Messwert" +#: app/configurator/components/configurator.tsx:107 +msgid "controls.nav.back-to-preview" +msgstr "" + +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:292 +msgid "controls.none" +msgstr "" + #: app/configurator/components/chart-controls/control-tab.tsx:312 msgid "controls.option.isActive" msgstr "Ein" @@ -471,11 +479,11 @@ msgstr "Suche zurücksetzen" msgid "controls.section.additional-information" msgstr "Zusätzliche Informationen" -#: app/configurator/components/chart-configurator.tsx:549 +#: app/configurator/components/chart-configurator.tsx:545 msgid "controls.section.chart.options" msgstr "Diagramm-Einstellungen" -#: app/configurator/table/table-chart-configurator.tsx:164 +#: app/configurator/table/table-chart-configurator.tsx:165 msgid "controls.section.columns" msgstr "Spalten" @@ -483,11 +491,11 @@ msgstr "Spalten" msgid "controls.section.columnstyle" msgstr "Spaltenstil" -#: app/configurator/components/chart-configurator.tsx:567 +#: app/configurator/components/chart-configurator.tsx:563 msgid "controls.section.data.filters" msgstr "Filter" -#: app/configurator/components/chart-annotator.tsx:24 +#: app/configurator/components/chart-annotator.tsx:52 msgid "controls.section.description" msgstr "Titel & Beschreibung" @@ -500,7 +508,7 @@ msgstr "Titel & Beschreibung" msgid "controls.section.filter" msgstr "Filter" -#: app/configurator/table/table-chart-configurator.tsx:155 +#: app/configurator/table/table-chart-configurator.tsx:156 msgid "controls.section.groups" msgstr "Gruppierungen" @@ -512,11 +520,12 @@ msgstr "Fehlende Werte" msgid "controls.section.imputation.explanation" msgstr "Für diesen Diagrammtyp sollten fehlenden Werten Ersatzwerte zugewiesen werden. Entscheiden Sie sich für die Imputationslogik oder wechseln Sie zu einem anderen Diagrammtyp." -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:78 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:98 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:157 msgid "controls.section.interactive.filters" msgstr "Interaktive Filter hinzufügen" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:128 msgid "controls.section.interactiveFilters.dataFilters" msgstr "Datenfilter" @@ -532,16 +541,20 @@ msgstr "Sortieren" msgid "controls.section.tableSettings" msgstr "Tabelleneinstellungen" -#: app/configurator/table/table-chart-sorting-options.tsx:384 +#: app/configurator/table/table-chart-sorting-options.tsx:386 msgid "controls.section.tableSorting" msgstr "Tabellensortierung" -#: app/configurator/table/table-chart-configurator.tsx:130 +#: app/configurator/table/table-chart-configurator.tsx:131 msgid "controls.section.tableoptions" msgstr "Tabellenoptionen" -#: app/configurator/components/chart-configurator.tsx:541 -#: app/configurator/components/chart-type-selector.tsx:135 +#: app/configurator/components/chart-annotator.tsx:32 +msgid "controls.section.title.warning" +msgstr "Fügen Sie einen Titel oder eine Beschreibung hinzu" + +#: app/configurator/components/chart-configurator.tsx:537 +#: app/configurator/components/chart-type-selector.tsx:131 #: app/configurator/table/table-chart-configurator.tsx:123 msgid "controls.select.chart.type" msgstr "Diagrammtyp" @@ -583,6 +596,7 @@ msgid "controls.select.columnStyle.textStyle" msgstr "Schriftstil" #: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Dimension auswählen" @@ -599,15 +613,15 @@ msgstr "Messwert auswählen" #~ msgid "controls.select.optional" #~ msgstr "optional" -#: app/configurator/components/filters.tsx:712 +#: app/configurator/components/filters.tsx:701 msgid "controls.set-filters" msgstr "Ausgewählte Filter" -#: app/configurator/components/filters.tsx:719 +#: app/configurator/components/filters.tsx:708 msgid "controls.set-filters-caption" msgstr "Für beste Ergebnisse wählen Sie nicht mehr als 7 Werte für die Visualisierung aus" -#: app/configurator/components/filters.tsx:751 +#: app/configurator/components/filters.tsx:740 msgid "controls.set-values-apply" msgstr "Filter anwenden" @@ -615,13 +629,13 @@ msgstr "Filter anwenden" msgid "controls.size" msgstr "Grösse" -#: app/configurator/table/table-chart-sorting-options.tsx:251 +#: app/configurator/table/table-chart-sorting-options.tsx:264 msgid "controls.sorting.addDimension" msgstr "Dimension hinzufügen" #: app/configurator/components/chart-options-selector.tsx:509 msgid "controls.sorting.byAuto" -msgstr "" +msgstr "Auto" #: app/configurator/components/chart-options-selector.tsx:503 #: app/configurator/components/chart-options-selector.tsx:513 @@ -670,20 +684,20 @@ msgstr "Grösste zuerst" msgid "controls.sorting.byTotalSize.largestTop" msgstr "Kleinste unten" -#: app/configurator/table/table-chart-sorting-options.tsx:161 +#: app/configurator/table/table-chart-sorting-options.tsx:174 msgid "controls.sorting.removeOption" msgstr "Sortierung entfernen" -#: app/configurator/table/table-chart-sorting-options.tsx:213 +#: app/configurator/table/table-chart-sorting-options.tsx:226 msgid "controls.sorting.selectDimension" msgstr "Wählen Sie eine Dimension aus …" #: app/configurator/components/field-i18n.ts:43 -#: app/configurator/table/table-chart-sorting-options.tsx:322 +#: app/configurator/table/table-chart-sorting-options.tsx:335 msgid "controls.sorting.sortBy" msgstr "Sortieren nach" -#: app/configurator/components/chart-type-selector.tsx:140 +#: app/configurator/components/chart-type-selector.tsx:136 msgid "controls.switch.chart.type" msgstr "Wechseln Sie zu einem anderen Diagrammtyp unter Beibehaltung der meisten Filtereinstellungen" @@ -695,11 +709,11 @@ msgstr "Gruppieren" msgid "controls.table.column.hide" msgstr "Spalte ausblenden" -#: app/configurator/table/table-chart-configurator.tsx:142 +#: app/configurator/table/table-chart-configurator.tsx:143 msgid "controls.table.settings" msgstr "Einstellungen" -#: app/configurator/table/table-chart-configurator.tsx:148 +#: app/configurator/table/table-chart-configurator.tsx:149 msgid "controls.table.sorting" msgstr "Sortierung" @@ -731,7 +745,7 @@ msgstr "Datenquelle" msgid "data.source.notTrusted" msgstr "Dieses Diagramm verwendet keine vertrauenswürdige Datenquelle." -#: app/configurator/components/select-dataset-step.tsx:179 +#: app/configurator/components/select-dataset-step.tsx:221 msgid "dataset-preview.back-to-results" msgstr "Zurück zu den Datensätzen" @@ -751,7 +765,7 @@ msgstr "Neuestes Update" msgid "dataset.hasImputedValues" msgstr "Einige Daten in diesem Datensatz fehlen und wurden interpoliert, um die Lücken zu füllen." -#: app/configurator/components/dataset-browse.tsx:427 +#: app/configurator/components/dataset-browse.tsx:447 msgid "dataset.includeDrafts" msgstr "Entwürfe einschließen" @@ -768,7 +782,7 @@ msgid "dataset.metadata.furtherinformation" msgstr "Weitere Informationen" #: app/components/chart-footnotes.tsx:200 -#: app/configurator/components/dataset-metadata.tsx:118 +#: app/configurator/components/dataset-metadata.tsx:114 msgid "dataset.metadata.learnmore" msgstr "Erfahren Sie mehr über diesen Datensatz" @@ -780,21 +794,21 @@ msgstr "Quelle" msgid "dataset.metadata.version" msgstr "Version" -#: app/configurator/components/dataset-browse.tsx:351 +#: app/configurator/components/dataset-browse.tsx:404 msgid "dataset.order.newest" msgstr "Neueste" -#: app/configurator/components/dataset-browse.tsx:343 +#: app/configurator/components/dataset-browse.tsx:396 msgid "dataset.order.relevance" msgstr "Relevanz" -#: app/configurator/components/dataset-browse.tsx:347 +#: app/configurator/components/dataset-browse.tsx:400 msgid "dataset.order.title" msgstr "Titel" -#: app/components/chart-preview.tsx:85 +#: app/components/chart-preview.tsx:103 #: app/components/chart-published.tsx:126 -#: app/configurator/components/dataset-preview.tsx:109 +#: app/configurator/components/dataset-preview.tsx:120 msgid "dataset.publicationStatus.draft.warning" msgstr "Achtung, dieser Datensatz ist im Entwurfs-Stadium.<0/><1>Diese Grafik nicht für Berichte verwenden." @@ -802,27 +816,27 @@ msgstr "Achtung, dieser Datensatz ist im Entwurfs-Stadium.<0/><1>Diese Grafik ni msgid "dataset.publicationStatus.expires.warning" msgstr "Achtung, dieser Datensatz ist abgelaufen.<0/><1>Diese Grafik nicht für Berichte verwenden." -#: app/configurator/components/dataset-browse.tsx:415 +#: app/configurator/components/dataset-browse.tsx:435 msgid "dataset.results" msgstr "{0, plural, zero {Keine Datensätze} one {# Datensatz} other {# Datensätze}}" -#: app/configurator/components/dataset-browse.tsx:355 +#: app/configurator/components/dataset-browse.tsx:328 msgid "dataset.search.label" msgstr "Suchen" #: app/configurator/components/dataset-browse.tsx:360 -msgid "dataset.search.placeholder" -msgstr "" +#~ msgid "dataset.search.placeholder" +#~ msgstr "" -#: app/configurator/components/dataset-browse.tsx:446 +#: app/configurator/components/dataset-browse.tsx:459 msgid "dataset.sortby" msgstr "Sortieren nach" -#: app/configurator/components/dataset-browse.tsx:1152 +#: app/configurator/components/dataset-browse.tsx:1157 msgid "dataset.tag.draft" msgstr "Entwurf" -#: app/configurator/components/dataset-preview.tsx:171 +#: app/configurator/components/dataset-preview.tsx:182 msgid "datatable.showing.first.rows" msgstr "Die ersten 10 Zeilen werden angezeigt" @@ -862,7 +876,7 @@ msgstr "Es gab ein Problem beim Laden der Koordinaten aus den geografischen Dime msgid "hint.coordinatesloadingerror.title" msgstr "Koordinaten-Ladefehler" -#: app/pages/v/[chartId].tsx:129 +#: app/pages/v/[chartId].tsx:128 msgid "hint.create.your.own.chart" msgstr "Kopieren Sie diese Visualisierung oder erstellen Sie eine neue Visualisierung mit Swiss Open Government Data." @@ -878,7 +892,7 @@ msgstr "Weitere Informationen finden Sie auf der Statusseite" msgid "hint.dataloadingerror.title" msgstr "Daten-Ladefehler" -#: app/pages/v/[chartId].tsx:123 +#: app/pages/v/[chartId].tsx:122 msgid "hint.how.to.share" msgstr "Sie können diese Visualisierung teilen oder sie einbetten. Zudem können Sie eine neue Visualisierung erstellen oder die gezeigte Visualisierung kopieren." @@ -886,7 +900,7 @@ msgstr "Sie können diese Visualisierung teilen oder sie einbetten. Zudem könne msgid "hint.loading.data" msgstr "Lade Daten …" -#: app/configurator/components/chart-type-selector.tsx:153 +#: app/configurator/components/chart-type-selector.tsx:149 msgid "hint.no.visualization.with.dataset" msgstr "Mit dem ausgewählten Datensatz kann keine Visualisierung erstellt werden." @@ -918,8 +932,8 @@ msgstr "Filter ausblenden" msgid "interactive.data.filters.show" msgstr "Filter anzeigen" -#: app/components/header.tsx:188 -#: app/components/header.tsx:207 +#: app/components/header.tsx:201 +#: app/components/header.tsx:220 msgid "logo.swiss.confederation" msgstr "Logo der Schweizerischen Eidgenossenschaft" @@ -979,18 +993,12 @@ msgstr "Hier ist eine Visualisierung, die ich mit visualize.admin.ch erstellt ha msgid "publication.share.mail.subject" msgstr "visualize.admin.ch" -#: app/configurator/components/filters.tsx:632 +#: app/configurator/components/dataset-browse.tsx:333 +#: app/configurator/components/dataset-browse.tsx:369 +#: app/configurator/components/filters.tsx:621 msgid "select.controls.filters.search" msgstr "Suche" -#: app/configurator/components/stepper.tsx:209 -msgid "step.annotate" -msgstr "Bevor Sie Veröffentlichen, fügen Sie Ihrem Diagramm einen Titel und eine Beschreibung hinzu, und wählen Sie, welche Elemente interaktiv sein sollen." - -#: app/configurator/components/stepper.tsx:198 -msgid "step.visualize" -msgstr "Passen Sie Ihre Visualisierung an, indem Sie die Filter- und Farbsegmentierungsoptionen in den Seitenleisten verwenden." - #: app/configurator/components/chart-controls/drag-and-drop-tab.tsx:101 msgid "table.column.no" msgstr "Spalte {0}" diff --git a/app/locales/en/messages.po b/app/locales/en/messages.po index 15fe31cc3..80d4ad8c0 100644 --- a/app/locales/en/messages.po +++ b/app/locales/en/messages.po @@ -13,60 +13,60 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: app/configurator/components/chart-configurator.tsx:647 +#: app/configurator/components/chart-configurator.tsx:648 msgid "Add filter" msgstr "Add filter" -#: app/configurator/components/chart-configurator.tsx:620 +#: app/configurator/components/chart-configurator.tsx:621 msgid "Drag filters to reorganize" msgstr "Drag filters to reorganize" -#: app/configurator/components/chart-configurator.tsx:617 +#: app/configurator/components/chart-configurator.tsx:618 msgid "Move filter down" msgstr "Move filter down" -#: app/configurator/components/chart-configurator.tsx:614 +#: app/configurator/components/chart-configurator.tsx:615 msgid "Move filter up" msgstr "Move filter up" -#: app/configurator/components/dataset-browse.tsx:1037 -#: app/configurator/components/filters.tsx:730 +#: app/configurator/components/dataset-browse.tsx:1043 +#: app/configurator/components/filters.tsx:719 msgid "No results" msgstr "No results" -#: app/components/chart-preview.tsx:128 +#: app/components/chart-preview.tsx:157 msgid "annotation.add.description" msgstr "[ No Description ]" -#: app/components/chart-preview.tsx:106 +#: app/components/chart-preview.tsx:129 msgid "annotation.add.title" msgstr "[ No Title ]" -#: app/configurator/components/dataset-browse.tsx:968 +#: app/configurator/components/dataset-browse.tsx:974 msgid "browse-panel.organizations" msgstr "Organizations" -#: app/configurator/components/dataset-browse.tsx:950 +#: app/configurator/components/dataset-browse.tsx:956 msgid "browse-panel.themes" msgstr "Categories" -#: app/configurator/components/dataset-preview.tsx:128 +#: app/configurator/components/dataset-preview.tsx:139 msgid "browse.dataset.create-visualization" msgstr "Start a visualization" -#: app/configurator/components/select-dataset-step.tsx:284 +#: app/configurator/components/select-dataset-step.tsx:295 msgid "browse.datasets.all-datasets" msgstr "All datasets" -#: app/configurator/components/select-dataset-step.tsx:217 +#: app/configurator/components/select-dataset-step.tsx:189 msgid "browse.datasets.description" msgstr "Explore datasets provided by the LINDAS Linked Data Service by either filtering by categories or organisations or search directly for specific keywords. Click on a dataset to see more detailed information and start creating your own visualizations." #: app/configurator/components/stepper.tsx:65 -msgid "button.back" -msgstr "Back" +#~ msgid "button.back" +#~ msgstr "Back" -#: app/pages/v/[chartId].tsx:167 +#: app/pages/v/[chartId].tsx:166 msgid "button.copy.visualization" msgstr "Copy and edit this visualization" @@ -103,15 +103,15 @@ msgstr "Click to copy" msgid "button.hint.copied" msgstr "Copied!" -#: app/pages/v/[chartId].tsx:152 +#: app/pages/v/[chartId].tsx:151 msgid "button.new.visualization" msgstr "Create New Visualization" #: app/configurator/components/stepper.tsx:70 -msgid "button.next" -msgstr "Next" +#~ msgid "button.next" +#~ msgstr "Next" -#: app/configurator/components/stepper.tsx:68 +#: app/components/chart-selection-tabs.tsx:182 msgid "button.publish" msgstr "Publish this visualization" @@ -143,7 +143,7 @@ msgstr "Areas" #~ msgid "chart.map.layers.area.discretization.quantize" #~ msgstr "Quantize (equal intervals)" -#: app/configurator/components/chart-configurator.tsx:696 +#: app/configurator/components/chart-configurator.tsx:697 #: app/configurator/components/chart-options-selector.tsx:989 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" @@ -203,7 +203,7 @@ msgstr "Bold" msgid "columnStyle.textStyle.regular" msgstr "Regular" -#: app/configurator/interactive-filters/editor-time-brush.tsx:168 +#: app/configurator/interactive-filters/editor-time-brush.tsx:170 msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Default Settings" @@ -339,33 +339,33 @@ msgstr "Description" msgid "controls.dimensionvalue.none" msgstr "No Filter" -#: app/configurator/components/filters.tsx:480 +#: app/configurator/components/filters.tsx:469 msgid "controls.filter.nb-elements" msgstr "{0} of {1}" -#: app/configurator/components/filters.tsx:414 -#: app/configurator/components/filters.tsx:658 +#: app/configurator/components/filters.tsx:403 +#: app/configurator/components/filters.tsx:647 msgid "controls.filter.select.all" msgstr "Select all" -#: app/configurator/components/filters.tsx:421 -#: app/configurator/components/filters.tsx:656 +#: app/configurator/components/filters.tsx:410 +#: app/configurator/components/filters.tsx:645 msgid "controls.filter.select.none" msgstr "Select none" -#: app/configurator/components/filters.tsx:431 +#: app/configurator/components/filters.tsx:420 msgid "controls.filters.select.filters" msgstr "Filters" -#: app/configurator/components/filters.tsx:461 +#: app/configurator/components/filters.tsx:450 msgid "controls.filters.select.refresh-colors" msgstr "Refresh colors" -#: app/configurator/components/filters.tsx:445 +#: app/configurator/components/filters.tsx:434 msgid "controls.filters.select.reset-colors" msgstr "Reset colors" -#: app/configurator/components/filters.tsx:438 +#: app/configurator/components/filters.tsx:427 msgid "controls.filters.select.selected-filters" msgstr "Selected filters" @@ -385,13 +385,13 @@ msgstr "Drag and drop columns here to make groups." #~ msgid "controls.hierarchy.select" #~ msgstr "Select a hierarchy level" -#: app/configurator/components/empty-right-panel.tsx:24 +#: app/configurator/components/empty-right-panel.tsx:21 msgid "controls.hint.configuring.chart" msgstr "Select a design element or a data dimension to modify its options." #: app/configurator/components/empty-right-panel.tsx:31 -msgid "controls.hint.describing.chart" -msgstr "Select an annotation field to modify its content." +#~ msgid "controls.hint.describing.chart" +#~ msgstr "Select an annotation field to modify its content." #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" @@ -413,34 +413,34 @@ msgstr "-" msgid "controls.imputation.type.zeros" msgstr "Zeros" -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:137 msgid "controls.interactive.filters.dataFilter" msgstr "Data Filters" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:104 -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:97 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:115 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 msgid "controls.interactive.filters.timeSlider" msgstr "Time slider" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:327 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:375 msgid "controls.interactiveFilters.dataFilters.toggledataFilters" msgstr "Show data filters" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:77 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:89 msgid "controls.interactiveFilters.legend.toggleInteractiveLegend" msgstr "Show legend filter" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:222 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:233 msgid "controls.interactiveFilters.time.noTimeDimension" msgstr "There is no time dimension!" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:197 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:208 msgid "controls.interactiveFilters.time.toggleTimeFilter" msgstr "Show time filter" #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:263 -msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" -msgstr "Show time slider" +#~ msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" +#~ msgstr "Show time slider" #: app/configurator/components/field-i18n.ts:135 msgid "controls.language.english" @@ -467,9 +467,13 @@ msgstr "Italian" msgid "controls.measure" msgstr "Measure" -#: app/configurator/components/field.tsx:817 -#~ msgid "controls.none" -#~ msgstr "None" +#: app/configurator/components/configurator.tsx:107 +msgid "controls.nav.back-to-preview" +msgstr "Back to preview" + +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:292 +msgid "controls.none" +msgstr "None" #: app/configurator/components/chart-controls/control-tab.tsx:312 msgid "controls.option.isActive" @@ -491,11 +495,11 @@ msgstr "Clear search field" msgid "controls.section.additional-information" msgstr "Additional information" -#: app/configurator/components/chart-configurator.tsx:549 +#: app/configurator/components/chart-configurator.tsx:545 msgid "controls.section.chart.options" msgstr "Chart Options" -#: app/configurator/table/table-chart-configurator.tsx:164 +#: app/configurator/table/table-chart-configurator.tsx:165 msgid "controls.section.columns" msgstr "Columns" @@ -503,11 +507,11 @@ msgstr "Columns" msgid "controls.section.columnstyle" msgstr "Column Style" -#: app/configurator/components/chart-configurator.tsx:567 +#: app/configurator/components/chart-configurator.tsx:563 msgid "controls.section.data.filters" msgstr "Filters" -#: app/configurator/components/chart-annotator.tsx:24 +#: app/configurator/components/chart-annotator.tsx:52 msgid "controls.section.description" msgstr "Title & Description" @@ -520,7 +524,7 @@ msgstr "Title & Description" msgid "controls.section.filter" msgstr "Filter" -#: app/configurator/table/table-chart-configurator.tsx:155 +#: app/configurator/table/table-chart-configurator.tsx:156 msgid "controls.section.groups" msgstr "Groups" @@ -532,11 +536,12 @@ msgstr "Missing values" msgid "controls.section.imputation.explanation" msgstr "For this chart type, replacement values should be assigned to missing values. Decide on the imputation logic or switch to another chart type." -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:78 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:98 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:157 msgid "controls.section.interactive.filters" msgstr "Interactive Filters" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:128 msgid "controls.section.interactiveFilters.dataFilters" msgstr "Data Filters" @@ -552,16 +557,20 @@ msgstr "Sort" msgid "controls.section.tableSettings" msgstr "Table Settings" -#: app/configurator/table/table-chart-sorting-options.tsx:384 +#: app/configurator/table/table-chart-sorting-options.tsx:386 msgid "controls.section.tableSorting" msgstr "Table Sorting" -#: app/configurator/table/table-chart-configurator.tsx:130 +#: app/configurator/table/table-chart-configurator.tsx:131 msgid "controls.section.tableoptions" msgstr "Table Options" -#: app/configurator/components/chart-configurator.tsx:541 -#: app/configurator/components/chart-type-selector.tsx:135 +#: app/configurator/components/chart-annotator.tsx:32 +msgid "controls.section.title.warning" +msgstr "Please add a title or description." + +#: app/configurator/components/chart-configurator.tsx:537 +#: app/configurator/components/chart-type-selector.tsx:131 #: app/configurator/table/table-chart-configurator.tsx:123 msgid "controls.select.chart.type" msgstr "Chart Type" @@ -603,6 +612,7 @@ msgid "controls.select.columnStyle.textStyle" msgstr "Text Style" #: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Select a dimension" @@ -619,15 +629,15 @@ msgstr "Select a measure" #~ msgid "controls.select.optional" #~ msgstr "optional" -#: app/configurator/components/filters.tsx:712 +#: app/configurator/components/filters.tsx:701 msgid "controls.set-filters" msgstr "Set filters" -#: app/configurator/components/filters.tsx:719 +#: app/configurator/components/filters.tsx:708 msgid "controls.set-filters-caption" msgstr "For best results, do not select more than 7 values in the visualization." -#: app/configurator/components/filters.tsx:751 +#: app/configurator/components/filters.tsx:740 msgid "controls.set-values-apply" msgstr "Apply filters" @@ -635,7 +645,7 @@ msgstr "Apply filters" msgid "controls.size" msgstr "Size" -#: app/configurator/table/table-chart-sorting-options.tsx:251 +#: app/configurator/table/table-chart-sorting-options.tsx:264 msgid "controls.sorting.addDimension" msgstr "Add dimension" @@ -690,20 +700,20 @@ msgstr "Largest first" msgid "controls.sorting.byTotalSize.largestTop" msgstr "Descending" -#: app/configurator/table/table-chart-sorting-options.tsx:161 +#: app/configurator/table/table-chart-sorting-options.tsx:174 msgid "controls.sorting.removeOption" msgstr "Remove sorting dimension" -#: app/configurator/table/table-chart-sorting-options.tsx:213 +#: app/configurator/table/table-chart-sorting-options.tsx:226 msgid "controls.sorting.selectDimension" msgstr "Select a dimension …" #: app/configurator/components/field-i18n.ts:43 -#: app/configurator/table/table-chart-sorting-options.tsx:322 +#: app/configurator/table/table-chart-sorting-options.tsx:335 msgid "controls.sorting.sortBy" msgstr "Sort by" -#: app/configurator/components/chart-type-selector.tsx:140 +#: app/configurator/components/chart-type-selector.tsx:136 msgid "controls.switch.chart.type" msgstr "Switch to another chart type while maintaining most filter settings." @@ -715,11 +725,11 @@ msgstr "Use as group" msgid "controls.table.column.hide" msgstr "Hide column" -#: app/configurator/table/table-chart-configurator.tsx:142 +#: app/configurator/table/table-chart-configurator.tsx:143 msgid "controls.table.settings" msgstr "Settings" -#: app/configurator/table/table-chart-configurator.tsx:148 +#: app/configurator/table/table-chart-configurator.tsx:149 msgid "controls.table.sorting" msgstr "Sorting" @@ -751,7 +761,7 @@ msgstr "Data source" msgid "data.source.notTrusted" msgstr "This chart is not using a trusted data source." -#: app/configurator/components/select-dataset-step.tsx:179 +#: app/configurator/components/select-dataset-step.tsx:221 msgid "dataset-preview.back-to-results" msgstr "Back to the datasets" @@ -771,7 +781,7 @@ msgstr "Latest update" msgid "dataset.hasImputedValues" msgstr "Some data in this dataset is missing and has been interpolated to fill the gaps." -#: app/configurator/components/dataset-browse.tsx:427 +#: app/configurator/components/dataset-browse.tsx:447 msgid "dataset.includeDrafts" msgstr "Include draft datasets" @@ -792,7 +802,7 @@ msgid "dataset.metadata.furtherinformation" msgstr "Further information" #: app/components/chart-footnotes.tsx:200 -#: app/configurator/components/dataset-metadata.tsx:118 +#: app/configurator/components/dataset-metadata.tsx:114 msgid "dataset.metadata.learnmore" msgstr "Learn more about the dataset" @@ -804,21 +814,21 @@ msgstr "Source" msgid "dataset.metadata.version" msgstr "Version" -#: app/configurator/components/dataset-browse.tsx:351 +#: app/configurator/components/dataset-browse.tsx:404 msgid "dataset.order.newest" msgstr "Newest" -#: app/configurator/components/dataset-browse.tsx:343 +#: app/configurator/components/dataset-browse.tsx:396 msgid "dataset.order.relevance" msgstr "Relevance" -#: app/configurator/components/dataset-browse.tsx:347 +#: app/configurator/components/dataset-browse.tsx:400 msgid "dataset.order.title" msgstr "Title" -#: app/components/chart-preview.tsx:85 +#: app/components/chart-preview.tsx:103 #: app/components/chart-published.tsx:126 -#: app/configurator/components/dataset-preview.tsx:109 +#: app/configurator/components/dataset-preview.tsx:120 msgid "dataset.publicationStatus.draft.warning" msgstr "Careful, this dataset is only a draft.<0/><1>Don't use for reporting!" @@ -826,27 +836,27 @@ msgstr "Careful, this dataset is only a draft.<0/><1>Don't use for reporting!<1>Don't use for reporting!" -#: app/configurator/components/dataset-browse.tsx:415 +#: app/configurator/components/dataset-browse.tsx:435 msgid "dataset.results" msgstr "{0, plural, zero {No datasets} one {# dataset} other {# datasets}}" -#: app/configurator/components/dataset-browse.tsx:355 +#: app/configurator/components/dataset-browse.tsx:328 msgid "dataset.search.label" msgstr "Search datasets" #: app/configurator/components/dataset-browse.tsx:360 -msgid "dataset.search.placeholder" -msgstr "Name, description, organization, theme, keyword" +#~ msgid "dataset.search.placeholder" +#~ msgstr "Name, description, organization, theme, keyword" -#: app/configurator/components/dataset-browse.tsx:446 +#: app/configurator/components/dataset-browse.tsx:459 msgid "dataset.sortby" msgstr "Sort by" -#: app/configurator/components/dataset-browse.tsx:1152 +#: app/configurator/components/dataset-browse.tsx:1157 msgid "dataset.tag.draft" msgstr "Draft" -#: app/configurator/components/dataset-preview.tsx:171 +#: app/configurator/components/dataset-preview.tsx:182 msgid "datatable.showing.first.rows" msgstr "Showing first 10 rows" @@ -886,7 +896,7 @@ msgstr "There was a problem with loading the coordinates from geographical dimen msgid "hint.coordinatesloadingerror.title" msgstr "Coordinates loading error" -#: app/pages/v/[chartId].tsx:129 +#: app/pages/v/[chartId].tsx:128 msgid "hint.create.your.own.chart" msgstr "Copy this visualization or make a new visualization using Swiss Open Government Data." @@ -902,7 +912,7 @@ msgstr "Check the status page for more information" msgid "hint.dataloadingerror.title" msgstr "Data loading error" -#: app/pages/v/[chartId].tsx:123 +#: app/pages/v/[chartId].tsx:122 msgid "hint.how.to.share" msgstr "You can share this visualization by copying the URL or by embedding it on your own website. You can also create a new visualization from scratch or start by copying the visualization above." @@ -910,7 +920,7 @@ msgstr "You can share this visualization by copying the URL or by embedding it o msgid "hint.loading.data" msgstr "Loading data..." -#: app/configurator/components/chart-type-selector.tsx:153 +#: app/configurator/components/chart-type-selector.tsx:149 msgid "hint.no.visualization.with.dataset" msgstr "No visualization can be created with the selected dataset." @@ -942,8 +952,8 @@ msgstr "Hide Filters" msgid "interactive.data.filters.show" msgstr "Show Filters" -#: app/components/header.tsx:188 -#: app/components/header.tsx:207 +#: app/components/header.tsx:201 +#: app/components/header.tsx:220 msgid "logo.swiss.confederation" msgstr "Logo of the Swiss Confederation" @@ -1003,18 +1013,12 @@ msgstr "Here is a visualization I created using visualize.admin.ch" msgid "publication.share.mail.subject" msgstr "visualize.admin.ch" -#: app/configurator/components/filters.tsx:632 +#: app/configurator/components/dataset-browse.tsx:333 +#: app/configurator/components/dataset-browse.tsx:369 +#: app/configurator/components/filters.tsx:621 msgid "select.controls.filters.search" msgstr "Search" -#: app/configurator/components/stepper.tsx:209 -msgid "step.annotate" -msgstr "Before publishing, add a title and description to your chart, and choose which elements should be interactive." - -#: app/configurator/components/stepper.tsx:198 -msgid "step.visualize" -msgstr "Customize your visualization by using the filter and color segmentation options in the sidebars." - #: app/configurator/components/chart-controls/drag-and-drop-tab.tsx:101 msgid "table.column.no" msgstr "Column {0}" diff --git a/app/locales/fr/messages.po b/app/locales/fr/messages.po index 19cfca61c..344ddfdc0 100644 --- a/app/locales/fr/messages.po +++ b/app/locales/fr/messages.po @@ -13,60 +13,60 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: app/configurator/components/chart-configurator.tsx:647 +#: app/configurator/components/chart-configurator.tsx:648 msgid "Add filter" msgstr "Ajouter un filtre" -#: app/configurator/components/chart-configurator.tsx:620 +#: app/configurator/components/chart-configurator.tsx:621 msgid "Drag filters to reorganize" msgstr "Faites glisser les filtres pour les réorganiser" -#: app/configurator/components/chart-configurator.tsx:617 +#: app/configurator/components/chart-configurator.tsx:618 msgid "Move filter down" msgstr "Déplacer le filtre vers le bas" -#: app/configurator/components/chart-configurator.tsx:614 +#: app/configurator/components/chart-configurator.tsx:615 msgid "Move filter up" msgstr "Déplacer le filtre vers le haut" -#: app/configurator/components/dataset-browse.tsx:1037 -#: app/configurator/components/filters.tsx:730 +#: app/configurator/components/dataset-browse.tsx:1043 +#: app/configurator/components/filters.tsx:719 msgid "No results" msgstr "Aucun résultat" -#: app/components/chart-preview.tsx:128 +#: app/components/chart-preview.tsx:157 msgid "annotation.add.description" msgstr "[ Pas de description ]" -#: app/components/chart-preview.tsx:106 +#: app/components/chart-preview.tsx:129 msgid "annotation.add.title" msgstr "[ Pas de titre ]" -#: app/configurator/components/dataset-browse.tsx:968 +#: app/configurator/components/dataset-browse.tsx:974 msgid "browse-panel.organizations" msgstr "Organisations" -#: app/configurator/components/dataset-browse.tsx:950 +#: app/configurator/components/dataset-browse.tsx:956 msgid "browse-panel.themes" msgstr "Catégories" -#: app/configurator/components/dataset-preview.tsx:128 +#: app/configurator/components/dataset-preview.tsx:139 msgid "browse.dataset.create-visualization" msgstr "Démarrer une visualisation" -#: app/configurator/components/select-dataset-step.tsx:284 +#: app/configurator/components/select-dataset-step.tsx:295 msgid "browse.datasets.all-datasets" msgstr "Tous les jeux de données" -#: app/configurator/components/select-dataset-step.tsx:217 +#: app/configurator/components/select-dataset-step.tsx:189 msgid "browse.datasets.description" msgstr "Explorez les jeux de données liés fournis par LINDAS, en filtrant par catégories ou organisations, ou en recherchant par mots-clés. Cliquez sur un ensemble de données pour afficher des informations plus détaillées et commencer à créer vos propres visualisations. " #: app/configurator/components/stepper.tsx:65 -msgid "button.back" -msgstr "Précédent" +#~ msgid "button.back" +#~ msgstr "Précédent" -#: app/pages/v/[chartId].tsx:167 +#: app/pages/v/[chartId].tsx:166 msgid "button.copy.visualization" msgstr "Copier et éditer cette visualisation" @@ -103,15 +103,15 @@ msgstr "Cliquer pour copier" msgid "button.hint.copied" msgstr "Copié!" -#: app/pages/v/[chartId].tsx:152 +#: app/pages/v/[chartId].tsx:151 msgid "button.new.visualization" msgstr "Créer une nouvelle visualisation" #: app/configurator/components/stepper.tsx:70 -msgid "button.next" -msgstr "Suivant" +#~ msgid "button.next" +#~ msgstr "Suivant" -#: app/configurator/components/stepper.tsx:68 +#: app/components/chart-selection-tabs.tsx:182 msgid "button.publish" msgstr "Publier cette visualisation" @@ -143,7 +143,7 @@ msgstr "Zones" #~ msgid "chart.map.layers.area.discretization.quantize" #~ msgstr "Intervalles égaux" -#: app/configurator/components/chart-configurator.tsx:696 +#: app/configurator/components/chart-configurator.tsx:697 #: app/configurator/components/chart-options-selector.tsx:989 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" @@ -203,7 +203,7 @@ msgstr "Gras" msgid "columnStyle.textStyle.regular" msgstr "Normal" -#: app/configurator/interactive-filters/editor-time-brush.tsx:168 +#: app/configurator/interactive-filters/editor-time-brush.tsx:170 msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Paramètres d'origine" @@ -267,7 +267,7 @@ msgstr "Couleurs" #: app/configurator/components/chart-controls/color-ramp.tsx:155 msgid "controls.color.palette.diverging" -msgstr "" +msgstr "Divergent" #: app/configurator/components/chart-controls/color-palette.tsx:261 msgid "controls.color.palette.reset" @@ -339,33 +339,33 @@ msgstr "Description" msgid "controls.dimensionvalue.none" msgstr "Aucune filtre" -#: app/configurator/components/filters.tsx:480 +#: app/configurator/components/filters.tsx:469 msgid "controls.filter.nb-elements" msgstr "{0} sur {1}" -#: app/configurator/components/filters.tsx:414 -#: app/configurator/components/filters.tsx:658 +#: app/configurator/components/filters.tsx:403 +#: app/configurator/components/filters.tsx:647 msgid "controls.filter.select.all" msgstr "Tout sélectionner" -#: app/configurator/components/filters.tsx:421 -#: app/configurator/components/filters.tsx:656 +#: app/configurator/components/filters.tsx:410 +#: app/configurator/components/filters.tsx:645 msgid "controls.filter.select.none" msgstr "Tout déselectionner" -#: app/configurator/components/filters.tsx:431 +#: app/configurator/components/filters.tsx:420 msgid "controls.filters.select.filters" msgstr "Filtres" -#: app/configurator/components/filters.tsx:461 +#: app/configurator/components/filters.tsx:450 msgid "controls.filters.select.refresh-colors" msgstr "Renouveller les couleurs" -#: app/configurator/components/filters.tsx:445 +#: app/configurator/components/filters.tsx:434 msgid "controls.filters.select.reset-colors" msgstr "Réinitialiser les couleurs" -#: app/configurator/components/filters.tsx:438 +#: app/configurator/components/filters.tsx:427 msgid "controls.filters.select.selected-filters" msgstr "Filtres sélectionnés" @@ -385,13 +385,13 @@ msgstr "Glisser-déposer des colonnes ici pour créer des groupes." #~ msgid "controls.hierarchy.select" #~ msgstr "Sélectionner le niveau hiérarchique" -#: app/configurator/components/empty-right-panel.tsx:24 +#: app/configurator/components/empty-right-panel.tsx:21 msgid "controls.hint.configuring.chart" msgstr "Sélectionnez un élément de design ou une dimension du jeu de données pour modifier leurs options." #: app/configurator/components/empty-right-panel.tsx:31 -msgid "controls.hint.describing.chart" -msgstr "Sélectionnez une des annotations proposées pour la modifier." +#~ msgid "controls.hint.describing.chart" +#~ msgstr "Sélectionnez une des annotations proposées pour la modifier." #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" @@ -413,34 +413,34 @@ msgstr "-" msgid "controls.imputation.type.zeros" msgstr "Zéros" -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:137 msgid "controls.interactive.filters.dataFilter" msgstr "Filtres de données" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:104 -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:97 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:115 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 msgid "controls.interactive.filters.timeSlider" msgstr "Curseur temporel" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:327 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:375 msgid "controls.interactiveFilters.dataFilters.toggledataFilters" msgstr "Afficher les filtres de données" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:77 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:89 msgid "controls.interactiveFilters.legend.toggleInteractiveLegend" msgstr "Afficher la légende filtrante" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:222 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:233 msgid "controls.interactiveFilters.time.noTimeDimension" msgstr "Il n'y a pas de dimension temporelle!" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:197 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:208 msgid "controls.interactiveFilters.time.toggleTimeFilter" msgstr "Afficher le filtre temporel" #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:263 -msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" -msgstr "Afficher le curseur de temps" +#~ msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" +#~ msgstr "Afficher le curseur de temps" #: app/configurator/components/field-i18n.ts:135 msgid "controls.language.english" @@ -458,18 +458,17 @@ msgstr "Allemand" msgid "controls.language.italian" msgstr "Italien" -#: app/configurator/map/map-chart-options.tsx:209 -#: app/configurator/map/map-chart-options.tsx:414 -#~ msgid "controls.location" -#~ msgstr "Localisation" - #: app/configurator/components/field-i18n.ts:9 msgid "controls.measure" msgstr "Variable mesurée" -#: app/configurator/components/field.tsx:817 -#~ msgid "controls.none" -#~ msgstr "Aucun" +#: app/configurator/components/configurator.tsx:107 +msgid "controls.nav.back-to-preview" +msgstr "Retour à l'aperçu" + +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:292 +msgid "controls.none" +msgstr "Aucun" #: app/configurator/components/chart-controls/control-tab.tsx:312 msgid "controls.option.isActive" @@ -491,11 +490,11 @@ msgstr "Effacer la recherche" msgid "controls.section.additional-information" msgstr "Informations supplémentaires" -#: app/configurator/components/chart-configurator.tsx:549 +#: app/configurator/components/chart-configurator.tsx:545 msgid "controls.section.chart.options" msgstr "Paramètres graphiques" -#: app/configurator/table/table-chart-configurator.tsx:164 +#: app/configurator/table/table-chart-configurator.tsx:165 msgid "controls.section.columns" msgstr "Colonnes" @@ -503,11 +502,11 @@ msgstr "Colonnes" msgid "controls.section.columnstyle" msgstr "Style de la colonne" -#: app/configurator/components/chart-configurator.tsx:567 +#: app/configurator/components/chart-configurator.tsx:563 msgid "controls.section.data.filters" msgstr "Filtres" -#: app/configurator/components/chart-annotator.tsx:24 +#: app/configurator/components/chart-annotator.tsx:52 msgid "controls.section.description" msgstr "Titre & description" @@ -520,7 +519,7 @@ msgstr "Titre & description" msgid "controls.section.filter" msgstr "Filtre" -#: app/configurator/table/table-chart-configurator.tsx:155 +#: app/configurator/table/table-chart-configurator.tsx:156 msgid "controls.section.groups" msgstr "Groupes" @@ -532,11 +531,12 @@ msgstr "Valeurs manquantes" msgid "controls.section.imputation.explanation" msgstr "En raison du type de graphique sélectionné, les valeurs manquantes doivent être remplies. Décidez de la logique d'imputation ou choisissez un autre type de graphique." -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:78 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:98 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:157 msgid "controls.section.interactive.filters" msgstr "Filtres interactifs" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:128 msgid "controls.section.interactiveFilters.dataFilters" msgstr "Filtres de données" @@ -552,16 +552,20 @@ msgstr "Trier" msgid "controls.section.tableSettings" msgstr "Paramètres du tableau" -#: app/configurator/table/table-chart-sorting-options.tsx:384 +#: app/configurator/table/table-chart-sorting-options.tsx:386 msgid "controls.section.tableSorting" msgstr "Tri du tableau" -#: app/configurator/table/table-chart-configurator.tsx:130 +#: app/configurator/table/table-chart-configurator.tsx:131 msgid "controls.section.tableoptions" msgstr "Options du tableau" -#: app/configurator/components/chart-configurator.tsx:541 -#: app/configurator/components/chart-type-selector.tsx:135 +#: app/configurator/components/chart-annotator.tsx:32 +msgid "controls.section.title.warning" +msgstr "Ajoutez un titre ou une description" + +#: app/configurator/components/chart-configurator.tsx:537 +#: app/configurator/components/chart-type-selector.tsx:131 #: app/configurator/table/table-chart-configurator.tsx:123 msgid "controls.select.chart.type" msgstr "Type de graphique" @@ -603,6 +607,7 @@ msgid "controls.select.columnStyle.textStyle" msgstr "Style du texte" #: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Sélectionner une dimension" @@ -619,15 +624,15 @@ msgstr "Sélectionner une variable" #~ msgid "controls.select.optional" #~ msgstr "optionnel" -#: app/configurator/components/filters.tsx:712 +#: app/configurator/components/filters.tsx:701 msgid "controls.set-filters" msgstr "Appliquer les filtres" -#: app/configurator/components/filters.tsx:719 +#: app/configurator/components/filters.tsx:708 msgid "controls.set-filters-caption" msgstr "Pour de meilleurs résultats, ne sélectionnez pas plus de 7 valeurs dans la visualisation." -#: app/configurator/components/filters.tsx:751 +#: app/configurator/components/filters.tsx:740 msgid "controls.set-values-apply" msgstr "Appliquer les filtres" @@ -635,13 +640,13 @@ msgstr "Appliquer les filtres" msgid "controls.size" msgstr "Taille" -#: app/configurator/table/table-chart-sorting-options.tsx:251 +#: app/configurator/table/table-chart-sorting-options.tsx:264 msgid "controls.sorting.addDimension" msgstr "Ajouter une dimension" #: app/configurator/components/chart-options-selector.tsx:509 msgid "controls.sorting.byAuto" -msgstr "" +msgstr "Auto" #: app/configurator/components/chart-options-selector.tsx:503 #: app/configurator/components/chart-options-selector.tsx:513 @@ -690,20 +695,20 @@ msgstr "Décroissant" msgid "controls.sorting.byTotalSize.largestTop" msgstr "Décroissant de haut en bas" -#: app/configurator/table/table-chart-sorting-options.tsx:161 +#: app/configurator/table/table-chart-sorting-options.tsx:174 msgid "controls.sorting.removeOption" msgstr "Supprimer la dimension de tri" -#: app/configurator/table/table-chart-sorting-options.tsx:213 +#: app/configurator/table/table-chart-sorting-options.tsx:226 msgid "controls.sorting.selectDimension" msgstr "Sélectionner une dimension…" #: app/configurator/components/field-i18n.ts:43 -#: app/configurator/table/table-chart-sorting-options.tsx:322 +#: app/configurator/table/table-chart-sorting-options.tsx:335 msgid "controls.sorting.sortBy" msgstr "Trier par" -#: app/configurator/components/chart-type-selector.tsx:140 +#: app/configurator/components/chart-type-selector.tsx:136 msgid "controls.switch.chart.type" msgstr "Passer à une autre visualisation tout en conservant la plupart des filtres" @@ -715,11 +720,11 @@ msgstr "Grouper selon cette colonne" msgid "controls.table.column.hide" msgstr "Masquer la colonne" -#: app/configurator/table/table-chart-configurator.tsx:142 +#: app/configurator/table/table-chart-configurator.tsx:143 msgid "controls.table.settings" msgstr "Paramètres" -#: app/configurator/table/table-chart-configurator.tsx:148 +#: app/configurator/table/table-chart-configurator.tsx:149 msgid "controls.table.sorting" msgstr "Tri" @@ -751,7 +756,7 @@ msgstr "Source des données" msgid "data.source.notTrusted" msgstr "Ce graphique n'utilise pas une source de données fiable." -#: app/configurator/components/select-dataset-step.tsx:179 +#: app/configurator/components/select-dataset-step.tsx:221 msgid "dataset-preview.back-to-results" msgstr "Revenir aux jeux de données" @@ -771,7 +776,7 @@ msgstr "Mise à jour" msgid "dataset.hasImputedValues" msgstr "Certaines données de cet ensemble de données sont manquantes et ont été interpolées pour combler les lacunes." -#: app/configurator/components/dataset-browse.tsx:427 +#: app/configurator/components/dataset-browse.tsx:447 msgid "dataset.includeDrafts" msgstr "Inclure les brouillons" @@ -788,7 +793,7 @@ msgid "dataset.metadata.furtherinformation" msgstr "Informations complémentaires" #: app/components/chart-footnotes.tsx:200 -#: app/configurator/components/dataset-metadata.tsx:118 +#: app/configurator/components/dataset-metadata.tsx:114 msgid "dataset.metadata.learnmore" msgstr "En savoir plus sur le jeu de données" @@ -800,21 +805,21 @@ msgstr "Source" msgid "dataset.metadata.version" msgstr "Version" -#: app/configurator/components/dataset-browse.tsx:351 +#: app/configurator/components/dataset-browse.tsx:404 msgid "dataset.order.newest" msgstr "Plus récent en premier" -#: app/configurator/components/dataset-browse.tsx:343 +#: app/configurator/components/dataset-browse.tsx:396 msgid "dataset.order.relevance" msgstr "Pertinence" -#: app/configurator/components/dataset-browse.tsx:347 +#: app/configurator/components/dataset-browse.tsx:400 msgid "dataset.order.title" msgstr "Titre" -#: app/components/chart-preview.tsx:85 +#: app/components/chart-preview.tsx:103 #: app/components/chart-published.tsx:126 -#: app/configurator/components/dataset-preview.tsx:109 +#: app/configurator/components/dataset-preview.tsx:120 msgid "dataset.publicationStatus.draft.warning" msgstr "Attention, ce jeu de données est à l'état d'ébauche.<0/><1>Ne l'utilisez pas pour une publication!" @@ -822,27 +827,27 @@ msgstr "Attention, ce jeu de données est à l'état d'ébauche.<0/><1>Ne l'util msgid "dataset.publicationStatus.expires.warning" msgstr "Attention, ce jeu de données est expiré.<0/><1>Ne l'utilisez pas pour une publication!" -#: app/configurator/components/dataset-browse.tsx:415 +#: app/configurator/components/dataset-browse.tsx:435 msgid "dataset.results" msgstr "{0, plural, zero {Aucun jeu de données} one {# jeu de données} other {# jeux de données}}" -#: app/configurator/components/dataset-browse.tsx:355 +#: app/configurator/components/dataset-browse.tsx:328 msgid "dataset.search.label" msgstr "Chercher" #: app/configurator/components/dataset-browse.tsx:360 -msgid "dataset.search.placeholder" -msgstr "Nom, description, organisation, catégorie, mots clés..." +#~ msgid "dataset.search.placeholder" +#~ msgstr "Nom, description, organisation, catégorie, mots clés..." -#: app/configurator/components/dataset-browse.tsx:446 +#: app/configurator/components/dataset-browse.tsx:459 msgid "dataset.sortby" msgstr "Trier par" -#: app/configurator/components/dataset-browse.tsx:1152 +#: app/configurator/components/dataset-browse.tsx:1157 msgid "dataset.tag.draft" msgstr "Brouillon" -#: app/configurator/components/dataset-preview.tsx:171 +#: app/configurator/components/dataset-preview.tsx:182 msgid "datatable.showing.first.rows" msgstr "Seules les 10 premières lignes sont affichées" @@ -882,7 +887,7 @@ msgstr "Les données géographiques n’ont pas pu être chargées, merci de ré msgid "hint.coordinatesloadingerror.title" msgstr "Erreur de chargement des coordonnées" -#: app/pages/v/[chartId].tsx:129 +#: app/pages/v/[chartId].tsx:128 msgid "hint.create.your.own.chart" msgstr "Copiez cette visualisation ou créez une nouvelle visualisation à partir des données ouvertes de l’administration publique suisse." @@ -898,7 +903,7 @@ msgstr "Consultez la page de statut pour plus d'informations" msgid "hint.dataloadingerror.title" msgstr "Problème de téléchargement des données" -#: app/pages/v/[chartId].tsx:123 +#: app/pages/v/[chartId].tsx:122 msgid "hint.how.to.share" msgstr "Vous pouvez partager cette visualisation en copiant l'URL ou en l'intégrant sur votre site Web. Vous pouvez également créer une toute nouvelle visualisation, ou bien copier et modifier la visualisation ci-dessus." @@ -906,7 +911,7 @@ msgstr "Vous pouvez partager cette visualisation en copiant l'URL ou en l'intég msgid "hint.loading.data" msgstr "Chargement des données..." -#: app/configurator/components/chart-type-selector.tsx:153 +#: app/configurator/components/chart-type-selector.tsx:149 msgid "hint.no.visualization.with.dataset" msgstr "Aucune visualisation ne peut être créée avec le jeu de données sélectionné." @@ -938,8 +943,8 @@ msgstr "Masquer les filtres" msgid "interactive.data.filters.show" msgstr "Afficher les filtres" -#: app/components/header.tsx:188 -#: app/components/header.tsx:207 +#: app/components/header.tsx:201 +#: app/components/header.tsx:220 msgid "logo.swiss.confederation" msgstr "Logo de la Confédération Suisse" @@ -999,18 +1004,12 @@ msgstr "Voici une visualisation que j'ai créée sur visualize.admin.ch" msgid "publication.share.mail.subject" msgstr "visualize.admin.ch" -#: app/configurator/components/filters.tsx:632 +#: app/configurator/components/dataset-browse.tsx:333 +#: app/configurator/components/dataset-browse.tsx:369 +#: app/configurator/components/filters.tsx:621 msgid "select.controls.filters.search" msgstr "Chercher" -#: app/configurator/components/stepper.tsx:209 -msgid "step.annotate" -msgstr "Avant de publier, ajoutez un titre et une description à votre tableau et choisissez quels éléments doivent être interactifs." - -#: app/configurator/components/stepper.tsx:198 -msgid "step.visualize" -msgstr "Personnalisez votre visualisation en utilisant les options de filtrage et de segmentation des couleurs dans les barres latérales." - #: app/configurator/components/chart-controls/drag-and-drop-tab.tsx:101 msgid "table.column.no" msgstr "Colonne {0}" diff --git a/app/locales/it/messages.po b/app/locales/it/messages.po index 0d02c1b0e..7f7ecbd79 100644 --- a/app/locales/it/messages.po +++ b/app/locales/it/messages.po @@ -13,60 +13,60 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: app/configurator/components/chart-configurator.tsx:647 +#: app/configurator/components/chart-configurator.tsx:648 msgid "Add filter" msgstr "Aggiungi filtro" -#: app/configurator/components/chart-configurator.tsx:620 +#: app/configurator/components/chart-configurator.tsx:621 msgid "Drag filters to reorganize" msgstr "Trascina i filtri per riorganizzarli" -#: app/configurator/components/chart-configurator.tsx:617 +#: app/configurator/components/chart-configurator.tsx:618 msgid "Move filter down" msgstr "Sposta il filtro in basso" -#: app/configurator/components/chart-configurator.tsx:614 +#: app/configurator/components/chart-configurator.tsx:615 msgid "Move filter up" msgstr "Sposta il filtro in alto" -#: app/configurator/components/dataset-browse.tsx:1037 -#: app/configurator/components/filters.tsx:730 +#: app/configurator/components/dataset-browse.tsx:1043 +#: app/configurator/components/filters.tsx:719 msgid "No results" msgstr "Nessun risultato" -#: app/components/chart-preview.tsx:128 +#: app/components/chart-preview.tsx:157 msgid "annotation.add.description" msgstr "[ Nessuna descrizione ]" -#: app/components/chart-preview.tsx:106 +#: app/components/chart-preview.tsx:129 msgid "annotation.add.title" msgstr "[ Nessun titolo ]" -#: app/configurator/components/dataset-browse.tsx:968 +#: app/configurator/components/dataset-browse.tsx:974 msgid "browse-panel.organizations" msgstr "Organizzazioni" -#: app/configurator/components/dataset-browse.tsx:950 +#: app/configurator/components/dataset-browse.tsx:956 msgid "browse-panel.themes" msgstr "Categorie" -#: app/configurator/components/dataset-preview.tsx:128 +#: app/configurator/components/dataset-preview.tsx:139 msgid "browse.dataset.create-visualization" msgstr "Iniziare una visualizzazione" -#: app/configurator/components/select-dataset-step.tsx:284 +#: app/configurator/components/select-dataset-step.tsx:295 msgid "browse.datasets.all-datasets" msgstr "Tutti i set di dati" -#: app/configurator/components/select-dataset-step.tsx:217 +#: app/configurator/components/select-dataset-step.tsx:189 msgid "browse.datasets.description" msgstr "Esplora i set di dati forniti dal LINDAS Linked Data Service filtrando per categorie o organizzazioni oppure cercando direttamente per parole chiave specifiche. Clicca su un set di dati per vedere informazioni più dettagliate e iniziare a creare le tue visualizzazioni." #: app/configurator/components/stepper.tsx:65 -msgid "button.back" -msgstr "Torna indietro" +#~ msgid "button.back" +#~ msgstr "Torna indietro" -#: app/pages/v/[chartId].tsx:167 +#: app/pages/v/[chartId].tsx:166 msgid "button.copy.visualization" msgstr "Copia e modifica questa visualizzazione" @@ -103,15 +103,15 @@ msgstr "Clicca per copiare" msgid "button.hint.copied" msgstr "Copiato!" -#: app/pages/v/[chartId].tsx:152 +#: app/pages/v/[chartId].tsx:151 msgid "button.new.visualization" msgstr "Crea una nuova visualizzazione" #: app/configurator/components/stepper.tsx:70 -msgid "button.next" -msgstr "Successivo" +#~ msgid "button.next" +#~ msgstr "Successivo" -#: app/configurator/components/stepper.tsx:68 +#: app/components/chart-selection-tabs.tsx:182 msgid "button.publish" msgstr "Pubblica questa visualizzazione" @@ -143,7 +143,7 @@ msgstr "Aree" #~ msgid "chart.map.layers.area.discretization.quantize" #~ msgstr "Intervalli uguali" -#: app/configurator/components/chart-configurator.tsx:696 +#: app/configurator/components/chart-configurator.tsx:697 #: app/configurator/components/chart-options-selector.tsx:989 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" @@ -203,7 +203,7 @@ msgstr "Grassetto" msgid "columnStyle.textStyle.regular" msgstr "Regular" -#: app/configurator/interactive-filters/editor-time-brush.tsx:168 +#: app/configurator/interactive-filters/editor-time-brush.tsx:170 msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Impostazioni predefinite" @@ -267,7 +267,7 @@ msgstr "Palette di colori" #: app/configurator/components/chart-controls/color-ramp.tsx:155 msgid "controls.color.palette.diverging" -msgstr "" +msgstr "Divergente" #: app/configurator/components/chart-controls/color-palette.tsx:261 msgid "controls.color.palette.reset" @@ -339,33 +339,33 @@ msgstr "Descrizione" msgid "controls.dimensionvalue.none" msgstr "Nessun filtro" -#: app/configurator/components/filters.tsx:480 +#: app/configurator/components/filters.tsx:469 msgid "controls.filter.nb-elements" msgstr "{0} di {1}" -#: app/configurator/components/filters.tsx:414 -#: app/configurator/components/filters.tsx:658 +#: app/configurator/components/filters.tsx:403 +#: app/configurator/components/filters.tsx:647 msgid "controls.filter.select.all" msgstr "Seleziona tutti" -#: app/configurator/components/filters.tsx:421 -#: app/configurator/components/filters.tsx:656 +#: app/configurator/components/filters.tsx:410 +#: app/configurator/components/filters.tsx:645 msgid "controls.filter.select.none" msgstr "Deseleziona tutto" -#: app/configurator/components/filters.tsx:431 +#: app/configurator/components/filters.tsx:420 msgid "controls.filters.select.filters" msgstr "Filtri" -#: app/configurator/components/filters.tsx:461 +#: app/configurator/components/filters.tsx:450 msgid "controls.filters.select.refresh-colors" msgstr "Aggiorna i colori" -#: app/configurator/components/filters.tsx:445 +#: app/configurator/components/filters.tsx:434 msgid "controls.filters.select.reset-colors" msgstr "Reimpostare i colori" -#: app/configurator/components/filters.tsx:438 +#: app/configurator/components/filters.tsx:427 msgid "controls.filters.select.selected-filters" msgstr "Filtri selezionati" @@ -385,13 +385,13 @@ msgstr "Trascina qui le colonne per creare gruppi." #~ msgid "controls.hierarchy.select" #~ msgstr "Selezionare un livello gerarchico" -#: app/configurator/components/empty-right-panel.tsx:24 +#: app/configurator/components/empty-right-panel.tsx:21 msgid "controls.hint.configuring.chart" msgstr "Seleziona un elemento di design o una dimensione dei dati per modificarne le opzioni." #: app/configurator/components/empty-right-panel.tsx:31 -msgid "controls.hint.describing.chart" -msgstr "Seleziona una delle annotazioni proposte per modificarla." +#~ msgid "controls.hint.describing.chart" +#~ msgstr "Seleziona una delle annotazioni proposte per modificarla." #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" @@ -413,34 +413,34 @@ msgstr "-" msgid "controls.imputation.type.zeros" msgstr "Zeri" -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:137 msgid "controls.interactive.filters.dataFilter" msgstr "Filtri di dati" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:104 -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:97 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:115 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:117 msgid "controls.interactive.filters.timeSlider" msgstr "Cursore del tempo" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:327 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:375 msgid "controls.interactiveFilters.dataFilters.toggledataFilters" msgstr "Mostra i filtri di dati" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:77 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:89 msgid "controls.interactiveFilters.legend.toggleInteractiveLegend" msgstr "Mostra la legenda filtrante" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:222 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:233 msgid "controls.interactiveFilters.time.noTimeDimension" msgstr "Nessuna dimensione temporale disponibile!" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:197 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:208 msgid "controls.interactiveFilters.time.toggleTimeFilter" msgstr "Mostra i filtri temporali" #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:263 -msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" -msgstr "Mostra il cursore del tempo" +#~ msgid "controls.interactiveFilters.time.toggleTimeSliderFilter" +#~ msgstr "Mostra il cursore del tempo" #: app/configurator/components/field-i18n.ts:135 msgid "controls.language.english" @@ -467,9 +467,13 @@ msgstr "Italiano" msgid "controls.measure" msgstr "Misura" -#: app/configurator/components/field.tsx:817 -#~ msgid "controls.none" -#~ msgstr "Nessuno" +#: app/configurator/components/configurator.tsx:107 +msgid "controls.nav.back-to-preview" +msgstr "Torna all'anteprima" + +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:292 +msgid "controls.none" +msgstr "Nessuno" #: app/configurator/components/chart-controls/control-tab.tsx:312 msgid "controls.option.isActive" @@ -491,11 +495,11 @@ msgstr "Cancella la ricerca" msgid "controls.section.additional-information" msgstr "Informazioni aggiuntive" -#: app/configurator/components/chart-configurator.tsx:549 +#: app/configurator/components/chart-configurator.tsx:545 msgid "controls.section.chart.options" msgstr "Opzioni del grafico" -#: app/configurator/table/table-chart-configurator.tsx:164 +#: app/configurator/table/table-chart-configurator.tsx:165 msgid "controls.section.columns" msgstr "Colonne" @@ -503,11 +507,11 @@ msgstr "Colonne" msgid "controls.section.columnstyle" msgstr "Stile della colonna" -#: app/configurator/components/chart-configurator.tsx:567 +#: app/configurator/components/chart-configurator.tsx:563 msgid "controls.section.data.filters" msgstr "Filtri" -#: app/configurator/components/chart-annotator.tsx:24 +#: app/configurator/components/chart-annotator.tsx:52 msgid "controls.section.description" msgstr "Titolo e descrizione" @@ -520,7 +524,7 @@ msgstr "Titolo e descrizione" msgid "controls.section.filter" msgstr "Filtro" -#: app/configurator/table/table-chart-configurator.tsx:155 +#: app/configurator/table/table-chart-configurator.tsx:156 msgid "controls.section.groups" msgstr "Gruppi" @@ -532,11 +536,12 @@ msgstr "Valori mancanti" msgid "controls.section.imputation.explanation" msgstr "Per questo tipo di grafico, i valori di sostituzione devono essere assegnati ai valori mancanti. Decidi la logica di imputazione o passa a un altro tipo di grafico." -#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:78 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:98 +#: app/configurator/interactive-filters/interactive-filters-configurator.tsx:157 msgid "controls.section.interactive.filters" msgstr "Filtri interattivi" -#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:117 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:128 msgid "controls.section.interactiveFilters.dataFilters" msgstr "Filtri di dati" @@ -552,16 +557,20 @@ msgstr "Ordina" msgid "controls.section.tableSettings" msgstr "Impostazioni della tabella" -#: app/configurator/table/table-chart-sorting-options.tsx:384 +#: app/configurator/table/table-chart-sorting-options.tsx:386 msgid "controls.section.tableSorting" msgstr "Ordinamento della tabella" -#: app/configurator/table/table-chart-configurator.tsx:130 +#: app/configurator/table/table-chart-configurator.tsx:131 msgid "controls.section.tableoptions" msgstr "Opzioni della tabella" -#: app/configurator/components/chart-configurator.tsx:541 -#: app/configurator/components/chart-type-selector.tsx:135 +#: app/configurator/components/chart-annotator.tsx:32 +msgid "controls.section.title.warning" +msgstr "Aggiungi un titolo o una descrizione" + +#: app/configurator/components/chart-configurator.tsx:537 +#: app/configurator/components/chart-type-selector.tsx:131 #: app/configurator/table/table-chart-configurator.tsx:123 msgid "controls.select.chart.type" msgstr "Tipo di grafico" @@ -603,6 +612,7 @@ msgid "controls.select.columnStyle.textStyle" msgstr "Stile del testo" #: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Seleziona una dimensione" @@ -619,15 +629,15 @@ msgstr "Seleziona una misura" #~ msgid "controls.select.optional" #~ msgstr "facoltativo" -#: app/configurator/components/filters.tsx:712 +#: app/configurator/components/filters.tsx:701 msgid "controls.set-filters" msgstr "Filtrer" -#: app/configurator/components/filters.tsx:719 +#: app/configurator/components/filters.tsx:708 msgid "controls.set-filters-caption" msgstr "Pour de meilleurs résultats, ne sélectionnez pas plus de 7 valeurs dans la visualisation" -#: app/configurator/components/filters.tsx:751 +#: app/configurator/components/filters.tsx:740 msgid "controls.set-values-apply" msgstr "Appliquer les filtres" @@ -635,7 +645,7 @@ msgstr "Appliquer les filtres" msgid "controls.size" msgstr "Grandezza" -#: app/configurator/table/table-chart-sorting-options.tsx:251 +#: app/configurator/table/table-chart-sorting-options.tsx:264 msgid "controls.sorting.addDimension" msgstr "Aggiungi una dimensione" @@ -690,20 +700,20 @@ msgstr "Il più grande per primo" msgid "controls.sorting.byTotalSize.largestTop" msgstr "Il più grande sopra" -#: app/configurator/table/table-chart-sorting-options.tsx:161 +#: app/configurator/table/table-chart-sorting-options.tsx:174 msgid "controls.sorting.removeOption" msgstr "Rimuovi l'ordinamento" -#: app/configurator/table/table-chart-sorting-options.tsx:213 +#: app/configurator/table/table-chart-sorting-options.tsx:226 msgid "controls.sorting.selectDimension" msgstr "Seleziona una dimensione ..." #: app/configurator/components/field-i18n.ts:43 -#: app/configurator/table/table-chart-sorting-options.tsx:322 +#: app/configurator/table/table-chart-sorting-options.tsx:335 msgid "controls.sorting.sortBy" msgstr "Ordina per" -#: app/configurator/components/chart-type-selector.tsx:140 +#: app/configurator/components/chart-type-selector.tsx:136 msgid "controls.switch.chart.type" msgstr "Passa a un altro tipo di grafico mantenendo la maggior parte delle impostazioni dei filtri" @@ -715,11 +725,11 @@ msgstr "Raggruppa secondo questa colonna" msgid "controls.table.column.hide" msgstr "Nascondi la colonna" -#: app/configurator/table/table-chart-configurator.tsx:142 +#: app/configurator/table/table-chart-configurator.tsx:143 msgid "controls.table.settings" msgstr "Opzioni" -#: app/configurator/table/table-chart-configurator.tsx:148 +#: app/configurator/table/table-chart-configurator.tsx:149 msgid "controls.table.sorting" msgstr "Ordinamento" @@ -751,7 +761,7 @@ msgstr "Fonte di dati" msgid "data.source.notTrusted" msgstr "Questo grafico non utilizza una fonte di dati affidabile." -#: app/configurator/components/select-dataset-step.tsx:179 +#: app/configurator/components/select-dataset-step.tsx:221 msgid "dataset-preview.back-to-results" msgstr "Torna ai set di dati" @@ -771,7 +781,7 @@ msgstr "Ultimo aggiornamento" msgid "dataset.hasImputedValues" msgstr "In questo set di dati mancano alcuni dati. Questi sono stati interpolati per colmare le lacune.." -#: app/configurator/components/dataset-browse.tsx:427 +#: app/configurator/components/dataset-browse.tsx:447 msgid "dataset.includeDrafts" msgstr "Includere le bozze" @@ -788,7 +798,7 @@ msgid "dataset.metadata.furtherinformation" msgstr "Addizionali informazioni" #: app/components/chart-footnotes.tsx:200 -#: app/configurator/components/dataset-metadata.tsx:118 +#: app/configurator/components/dataset-metadata.tsx:114 msgid "dataset.metadata.learnmore" msgstr "Ulteriori informazioni sul set di dati" @@ -800,21 +810,21 @@ msgstr "Fonte" msgid "dataset.metadata.version" msgstr "versione" -#: app/configurator/components/dataset-browse.tsx:351 +#: app/configurator/components/dataset-browse.tsx:404 msgid "dataset.order.newest" msgstr "Più recente" -#: app/configurator/components/dataset-browse.tsx:343 +#: app/configurator/components/dataset-browse.tsx:396 msgid "dataset.order.relevance" msgstr "Rilevanza" -#: app/configurator/components/dataset-browse.tsx:347 +#: app/configurator/components/dataset-browse.tsx:400 msgid "dataset.order.title" msgstr "Titolo" -#: app/components/chart-preview.tsx:85 +#: app/components/chart-preview.tsx:103 #: app/components/chart-published.tsx:126 -#: app/configurator/components/dataset-preview.tsx:109 +#: app/configurator/components/dataset-preview.tsx:120 msgid "dataset.publicationStatus.draft.warning" msgstr "Attenzione, questo set di dati è una bozza.<0/><1>Non utilizzare questo grafico per un rapporto!" @@ -822,27 +832,27 @@ msgstr "Attenzione, questo set di dati è una bozza.<0/><1>Non utilizzare questo msgid "dataset.publicationStatus.expires.warning" msgstr "Attenzione, questo set di dati è scaduto.<0/><1>Non utilizzare questo grafico per un rapporto!" -#: app/configurator/components/dataset-browse.tsx:415 +#: app/configurator/components/dataset-browse.tsx:435 msgid "dataset.results" msgstr "{0, plural, zero {Nessun set di dati} one {# set di dati} other {# set di dati}}" -#: app/configurator/components/dataset-browse.tsx:355 +#: app/configurator/components/dataset-browse.tsx:328 msgid "dataset.search.label" msgstr "Cerca" #: app/configurator/components/dataset-browse.tsx:360 -msgid "dataset.search.placeholder" -msgstr "" +#~ msgid "dataset.search.placeholder" +#~ msgstr "" -#: app/configurator/components/dataset-browse.tsx:446 +#: app/configurator/components/dataset-browse.tsx:459 msgid "dataset.sortby" msgstr "Ordina per" -#: app/configurator/components/dataset-browse.tsx:1152 +#: app/configurator/components/dataset-browse.tsx:1157 msgid "dataset.tag.draft" msgstr "Bozza" -#: app/configurator/components/dataset-preview.tsx:171 +#: app/configurator/components/dataset-preview.tsx:182 msgid "datatable.showing.first.rows" msgstr "Sono mostrate soltanto le prime 10 righe" @@ -882,7 +892,7 @@ msgstr "C'è stato un problema con il caricamento delle coordinate dalle dimensi msgid "hint.coordinatesloadingerror.title" msgstr "Errore di caricamento delle coordinate" -#: app/pages/v/[chartId].tsx:129 +#: app/pages/v/[chartId].tsx:128 msgid "hint.create.your.own.chart" msgstr "Copia questa visualizzazione o crea una nuova visualizzazione usando «dati aperti» dell’amministrazione pubblica svizzera" @@ -898,7 +908,7 @@ msgstr "Controlla la pagina di stato per ulteriori informazioni”" msgid "hint.dataloadingerror.title" msgstr "Problema di caricamento dei dati" -#: app/pages/v/[chartId].tsx:123 +#: app/pages/v/[chartId].tsx:122 msgid "hint.how.to.share" msgstr "È possibile condividere questa visualizzazione copiando l'URL o incorporandola nel vostro sito Web. Puoi anche creare una nuova visualizzazione partendo da zero oppure copiando e modificando la visualizzazione sopra." @@ -906,7 +916,7 @@ msgstr "È possibile condividere questa visualizzazione copiando l'URL o incorpo msgid "hint.loading.data" msgstr "Caricamento dei dati..." -#: app/configurator/components/chart-type-selector.tsx:153 +#: app/configurator/components/chart-type-selector.tsx:149 msgid "hint.no.visualization.with.dataset" msgstr "Nessuna visualizzazione può essere creata con il dataset selezionato." @@ -938,8 +948,8 @@ msgstr "Nascondi i filtri" msgid "interactive.data.filters.show" msgstr "Mostra i filtri" -#: app/components/header.tsx:188 -#: app/components/header.tsx:207 +#: app/components/header.tsx:201 +#: app/components/header.tsx:220 msgid "logo.swiss.confederation" msgstr "Logo della Confederazione svizzera" @@ -999,18 +1009,12 @@ msgstr "Ecco una visualizzazione che ho creato usando visualize.admin.ch" msgid "publication.share.mail.subject" msgstr "visualize.admin.ch" -#: app/configurator/components/filters.tsx:632 +#: app/configurator/components/dataset-browse.tsx:333 +#: app/configurator/components/dataset-browse.tsx:369 +#: app/configurator/components/filters.tsx:621 msgid "select.controls.filters.search" msgstr "Cerca" -#: app/configurator/components/stepper.tsx:209 -msgid "step.annotate" -msgstr "Prima di pubblicare, aggiungere un titolo e una descrizione al tuo grafico e scegliere quali elementi possono essere interattivi." - -#: app/configurator/components/stepper.tsx:198 -msgid "step.visualize" -msgstr "Personalizza la tua visualizzazione utilizzando le opzioni di segmentazione del filtro e del colore, nelle barre laterali." - #: app/configurator/components/chart-controls/drag-and-drop-tab.tsx:101 msgid "table.column.no" msgstr "Colonna {0}" From 916dcb7de6cf383dc00949a8546b5c5d674d7345 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 13:11:04 +0100 Subject: [PATCH 42/50] feat: Put login links below language menu --- app/components/language-menu.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/language-menu.tsx b/app/components/language-menu.tsx index 1f1db8ecc..4d7413b0f 100644 --- a/app/components/language-menu.tsx +++ b/app/components/language-menu.tsx @@ -43,7 +43,6 @@ export const LanguageMenu = ({ contentId }: { contentId?: string }) => { ml: [0, "auto"], width: ["100%", "auto"], backgroundColor: ["grey.300", "transparent"], - order: [1, 2], justifyContent: "flex-end", }} > From 038ef2bd10be57b33944f6af04ac2840a3eaa15c Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 13:11:16 +0100 Subject: [PATCH 43/50] refactor: Remove unused --- app/configurator/components/chart-annotations-selector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/configurator/components/chart-annotations-selector.tsx b/app/configurator/components/chart-annotations-selector.tsx index 3152f9fd2..6675aa156 100644 --- a/app/configurator/components/chart-annotations-selector.tsx +++ b/app/configurator/components/chart-annotations-selector.tsx @@ -62,7 +62,7 @@ export const ChartAnnotationsSelector = ({ }: { state: ConfiguratorStateConfiguringChart; }) => { - const { activeField, meta } = state; + const { activeField } = state; const panelRef = useRef(null); useEffect(() => { if (panelRef && panelRef.current) { From 314328420284532651e7ea9533c3edcaa790811c Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 13:38:25 +0100 Subject: [PATCH 44/50] feat: Add right icon to field controls --- .../components/chart-controls/control-tab.tsx | 9 +++++++++ .../components/chart-controls/section.tsx | 12 +++++++++--- app/configurator/components/field.tsx | 15 ++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/configurator/components/chart-controls/control-tab.tsx b/app/configurator/components/chart-controls/control-tab.tsx index 34699de53..ee303793b 100644 --- a/app/configurator/components/chart-controls/control-tab.tsx +++ b/app/configurator/components/chart-controls/control-tab.tsx @@ -16,11 +16,13 @@ export const ControlTab = ({ onClick, checked, labelId, + rightIcon, }: { component?: DimensionMetadataFragment; value: string; onClick: (x: string) => void; labelId: string; + rightIcon?: React.ReactNode; } & FieldProps) => { return ( @@ -95,12 +98,14 @@ export const AnnotatorTab = ({ onClick, icon, label, + rightIcon, }: { disabled?: boolean; onClick: (x: string) => void; value: string; icon: IconName; label: ReactNode; + rightIcon?: ReactNode; } & FieldProps) => { return ( @@ -238,6 +244,7 @@ export const ControlTabButtonInner = ({ upperLabel, lowerLabel, checked, + rightIcon, optional = false, isActive = false, showIsActive = false, @@ -250,6 +257,7 @@ export const ControlTabButtonInner = ({ // On / Off indicator isActive?: boolean; showIsActive?: boolean; + rightIcon?: React.ReactNode; }) => { const classes = useStyles(); return ( @@ -312,6 +320,7 @@ export const ControlTabButtonInner = ({ On ) : null} + {rightIcon} ); }; diff --git a/app/configurator/components/chart-controls/section.tsx b/app/configurator/components/chart-controls/section.tsx index 8c53c7a70..fc5bb77d7 100644 --- a/app/configurator/components/chart-controls/section.tsx +++ b/app/configurator/components/chart-controls/section.tsx @@ -67,7 +67,7 @@ const useSectionTitleStyles = makeStyles< collapse ? theme.palette.grey[200] : "transparent", "& $icon": { - color: theme.palette.grey[900], + color: theme.palette.grey[600], }, }, }, @@ -83,7 +83,7 @@ const useSectionTitleStyles = makeStyles< }, icon: { justifySelf: "flex-end", - color: theme.palette.grey[600], + color: theme.palette.grey[500], }, })); @@ -226,7 +226,13 @@ export const SectionTitle = ({ {right} - {collapse ? isOpen ? : : null} + {collapse ? ( + isOpen ? ( + + ) : ( + + ) + ) : null}
); diff --git a/app/configurator/components/field.tsx b/app/configurator/components/field.tsx index 968dc0aa6..5737e625c 100644 --- a/app/configurator/components/field.tsx +++ b/app/configurator/components/field.tsx @@ -52,9 +52,21 @@ import { truthy } from "@/domain/types"; import { useTimeFormatLocale } from "@/formatters"; import { DimensionMetadataFragment, TimeUnit } from "@/graphql/query-hooks"; import { IconName } from "@/icons"; +import SvgIcEdit from "@/icons/components/IcEdit"; import { useLocale } from "@/locales/use-locale"; import { getPalette } from "@/palettes"; +const useFieldEditIconStyles = makeStyles((theme) => ({ + root: { + color: theme.palette.primary.main, + }, +})); + +const FieldEditIcon = () => { + const classes = useFieldEditIconStyles(); + return ; +}; + const useStyles = makeStyles((theme) => ({ loadingIndicator: { color: theme.palette.grey[700], @@ -84,6 +96,7 @@ export const ControlTabField = ({ labelId={labelId} checked={field.checked} onClick={field.onClick} + rightIcon={} /> ); }; @@ -444,13 +457,13 @@ export const AnnotatorTabField = ({ const fieldProps = useActiveFieldField({ value, }); - return ( } /> ); }; From b0fef1a14ea850e478bf9723d603c7353be994cd Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 14:02:15 +0100 Subject: [PATCH 45/50] feat: Add warning on annotator fields --- .../components/chart-annotator.tsx | 28 +++++++---- .../components/chart-controls/control-tab.tsx | 48 +++++++++++++------ app/configurator/components/field.tsx | 34 ++++++++++--- .../table/table-chart-configurator.tsx | 4 +- app/locales/de/messages.po | 18 +++++-- app/locales/en/messages.po | 18 +++++-- app/locales/fr/messages.po | 20 +++++--- app/locales/it/messages.po | 18 +++++-- 8 files changed, 133 insertions(+), 55 deletions(-) diff --git a/app/configurator/components/chart-annotator.tsx b/app/configurator/components/chart-annotator.tsx index 97f0ffbfd..e41336785 100644 --- a/app/configurator/components/chart-annotator.tsx +++ b/app/configurator/components/chart-annotator.tsx @@ -11,20 +11,18 @@ import { AnnotatorTabField } from "@/configurator/components/field"; import { getFieldLabel } from "@/configurator/components/field-i18n"; import { InteractiveFiltersConfigurator } from "@/configurator/interactive-filters/interactive-filters-configurator"; import SvgIcExclamation from "@/icons/components/IcExclamation"; -import { useConfiguratorState } from "@/src"; +import { useConfiguratorState, useLocale } from "@/src"; import { ConfiguratorStateConfiguringChart } from "../config-types"; import { isConfiguring } from "../configurator-state"; const WarnTitleDescription = () => { const [state] = useConfiguratorState(isConfiguring); + const locale = useLocale(); const hasSomeTitleOrDescription = React.useMemo(() => { const { title, description } = state.meta; - return ( - Object.values(title).some((x) => x != "") || - Object.values(description).some((x) => x != "") - ); - }, [state.meta]); + return title[locale] !== "" && description[locale] !== ""; + }, [state.meta, locale]); return hasSomeTitleOrDescription ? null : ( { + emptyValueWarning={ + + Please add a title + + } + mainLabel={getFieldLabel("title")} + /> + emptyValueWarning={ + + Please add a description + + } + mainLabel={getFieldLabel("description")} + />
); diff --git a/app/configurator/components/chart-controls/control-tab.tsx b/app/configurator/components/chart-controls/control-tab.tsx index ee303793b..09ec7557e 100644 --- a/app/configurator/components/chart-controls/control-tab.tsx +++ b/app/configurator/components/chart-controls/control-tab.tsx @@ -40,7 +40,7 @@ export const ControlTab = ({ void; + value: string; + icon: IconName; + mainLabel: ReactNode; + upperLabel?: ReactNode; + lowerLabel?: ReactNode; + rightIcon?: ReactNode; +} & FieldProps; + export const AnnotatorTab = ({ value, checked, onClick, icon, - label, + upperLabel, + mainLabel, + lowerLabel, rightIcon, -}: { - disabled?: boolean; - onClick: (x: string) => void; - value: string; - icon: IconName; - label: ReactNode; - rightIcon?: ReactNode; -} & FieldProps) => { +}: AnnotatorTabProps) => { return ( @@ -166,7 +174,7 @@ export const DraggableTab = ({ @@ -242,6 +250,7 @@ export const ControlTabButton = ({ export const ControlTabButtonInner = ({ iconName, upperLabel, + mainLabel, lowerLabel, checked, rightIcon, @@ -251,7 +260,8 @@ export const ControlTabButtonInner = ({ }: { iconName: IconName; upperLabel?: string | ReactNode; - lowerLabel: string | ReactNode; + mainLabel: string | ReactNode; + lowerLabel?: string | ReactNode; checked?: boolean; optional?: boolean; // On / Off indicator @@ -307,8 +317,16 @@ export const ControlTabButtonInner = ({ textAlign: "left", }} > - {lowerLabel} + {mainLabel}
+ {lowerLabel && ( + + {lowerLabel} + + )} {showIsActive && isActive === false ? ( diff --git a/app/configurator/components/field.tsx b/app/configurator/components/field.tsx index 5737e625c..38f067eb2 100644 --- a/app/configurator/components/field.tsx +++ b/app/configurator/components/field.tsx @@ -1,9 +1,15 @@ import { t } from "@lingui/macro"; -import { CircularProgress, Theme } from "@mui/material"; +import { CircularProgress, Theme, Typography } from "@mui/material"; import { makeStyles } from "@mui/styles"; import { extent, timeFormat, TimeLocaleObject, timeParse } from "d3"; import get from "lodash/get"; -import { ChangeEvent, ReactNode, useCallback, useMemo, useState } from "react"; +import React, { + ChangeEvent, + ReactNode, + useCallback, + useMemo, + useState, +} from "react"; import Flex from "@/components/flex"; import { @@ -19,6 +25,7 @@ import { import { ColorPickerMenu } from "@/configurator/components/chart-controls/color-picker"; import { AnnotatorTab, + AnnotatorTabProps, ControlTab, OnOffControlTab, } from "@/configurator/components/chart-controls/control-tab"; @@ -51,7 +58,6 @@ import { FIELD_VALUE_NONE } from "@/configurator/constants"; import { truthy } from "@/domain/types"; import { useTimeFormatLocale } from "@/formatters"; import { DimensionMetadataFragment, TimeUnit } from "@/graphql/query-hooks"; -import { IconName } from "@/icons"; import SvgIcEdit from "@/icons/components/IcEdit"; import { useLocale } from "@/locales/use-locale"; import { getPalette } from "@/palettes"; @@ -447,19 +453,33 @@ export const TimeInput = ({ export const AnnotatorTabField = ({ value, + emptyValueWarning, ...tabProps }: { value: string; - disabled?: boolean; - icon: IconName; - label: ReactNode; -}) => { + emptyValueWarning?: React.ReactNode; +} & Omit) => { const fieldProps = useActiveFieldField({ value, }); + + const [state] = useConfiguratorState(isConfiguring); + const locale = useLocale(); + const hasText = useMemo(() => { + const key = value as "title" | "description"; + return state.meta[key][locale] !== ""; + }, [state.meta, value, locale]); + return ( + {emptyValueWarning} +
+ ) + } value={`${fieldProps.value}`} checked={fieldProps.checked} onClick={fieldProps.onClick} diff --git a/app/configurator/table/table-chart-configurator.tsx b/app/configurator/table/table-chart-configurator.tsx index 6d369848a..804e6c49b 100644 --- a/app/configurator/table/table-chart-configurator.tsx +++ b/app/configurator/table/table-chart-configurator.tsx @@ -140,13 +140,13 @@ export const ChartConfiguratorTable = ({ key={"settings"} value={"table-settings"} icon="settings" - label={Settings} + mainLabel={Settings} /> Sorting
} + mainLabel={Sorting} />
diff --git a/app/locales/de/messages.po b/app/locales/de/messages.po index 3614456b5..f6016ea59 100644 --- a/app/locales/de/messages.po +++ b/app/locales/de/messages.po @@ -187,6 +187,14 @@ msgstr "Normal" msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Standardeinstellung" +#: app/configurator/components/chart-annotator.tsx:67 +msgid "controls.annotator.add-description-warning" +msgstr "Fügen Sie eine Beschreibung hinzu" + +#: app/configurator/components/chart-annotator.tsx:57 +msgid "controls.annotator.add-title-warning" +msgstr "Füge einen Titel hinzu" + #: app/configurator/components/field-i18n.ts:5 msgid "controls.axis.horizontal" msgstr "Horizontale Achse" @@ -232,7 +240,7 @@ msgstr "Tabelle" msgid "controls.color" msgstr "Farbe" -#: app/configurator/components/chart-controls/control-tab.tsx:45 +#: app/configurator/components/chart-controls/control-tab.tsx:47 msgid "controls.color.add" msgstr "Hinzufügen …" @@ -455,11 +463,11 @@ msgstr "" msgid "controls.none" msgstr "" -#: app/configurator/components/chart-controls/control-tab.tsx:312 +#: app/configurator/components/chart-controls/control-tab.tsx:338 msgid "controls.option.isActive" msgstr "Ein" -#: app/configurator/components/chart-controls/control-tab.tsx:308 +#: app/configurator/components/chart-controls/control-tab.tsx:334 msgid "controls.option.isNotActive" msgstr "Aus" @@ -495,7 +503,7 @@ msgstr "Spaltenstil" msgid "controls.section.data.filters" msgstr "Filter" -#: app/configurator/components/chart-annotator.tsx:52 +#: app/configurator/components/chart-annotator.tsx:50 msgid "controls.section.description" msgstr "Titel & Beschreibung" @@ -549,7 +557,7 @@ msgstr "Tabellensortierung" msgid "controls.section.tableoptions" msgstr "Tabellenoptionen" -#: app/configurator/components/chart-annotator.tsx:32 +#: app/configurator/components/chart-annotator.tsx:30 msgid "controls.section.title.warning" msgstr "Fügen Sie einen Titel oder eine Beschreibung hinzu" diff --git a/app/locales/en/messages.po b/app/locales/en/messages.po index 80d4ad8c0..a419e2113 100644 --- a/app/locales/en/messages.po +++ b/app/locales/en/messages.po @@ -207,6 +207,14 @@ msgstr "Regular" msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Default Settings" +#: app/configurator/components/chart-annotator.tsx:67 +msgid "controls.annotator.add-description-warning" +msgstr "Please add a description" + +#: app/configurator/components/chart-annotator.tsx:57 +msgid "controls.annotator.add-title-warning" +msgstr "Please add a title" + #: app/configurator/components/field-i18n.ts:5 msgid "controls.axis.horizontal" msgstr "Horizontal Axis" @@ -252,7 +260,7 @@ msgstr "Table" msgid "controls.color" msgstr "Color" -#: app/configurator/components/chart-controls/control-tab.tsx:45 +#: app/configurator/components/chart-controls/control-tab.tsx:47 msgid "controls.color.add" msgstr "Add ..." @@ -475,11 +483,11 @@ msgstr "Back to preview" msgid "controls.none" msgstr "None" -#: app/configurator/components/chart-controls/control-tab.tsx:312 +#: app/configurator/components/chart-controls/control-tab.tsx:338 msgid "controls.option.isActive" msgstr "On" -#: app/configurator/components/chart-controls/control-tab.tsx:308 +#: app/configurator/components/chart-controls/control-tab.tsx:334 msgid "controls.option.isNotActive" msgstr "Off" @@ -511,7 +519,7 @@ msgstr "Column Style" msgid "controls.section.data.filters" msgstr "Filters" -#: app/configurator/components/chart-annotator.tsx:52 +#: app/configurator/components/chart-annotator.tsx:50 msgid "controls.section.description" msgstr "Title & Description" @@ -565,7 +573,7 @@ msgstr "Table Sorting" msgid "controls.section.tableoptions" msgstr "Table Options" -#: app/configurator/components/chart-annotator.tsx:32 +#: app/configurator/components/chart-annotator.tsx:30 msgid "controls.section.title.warning" msgstr "Please add a title or description." diff --git a/app/locales/fr/messages.po b/app/locales/fr/messages.po index 344ddfdc0..ff0d3de22 100644 --- a/app/locales/fr/messages.po +++ b/app/locales/fr/messages.po @@ -207,6 +207,14 @@ msgstr "Normal" msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Paramètres d'origine" +#: app/configurator/components/chart-annotator.tsx:67 +msgid "controls.annotator.add-description-warning" +msgstr "Ajoutez une description au graphique" + +#: app/configurator/components/chart-annotator.tsx:57 +msgid "controls.annotator.add-title-warning" +msgstr "Ajoutez un titre au graphique" + #: app/configurator/components/field-i18n.ts:5 msgid "controls.axis.horizontal" msgstr "Axe horizontal" @@ -252,7 +260,7 @@ msgstr "Tableau" msgid "controls.color" msgstr "Couleur" -#: app/configurator/components/chart-controls/control-tab.tsx:45 +#: app/configurator/components/chart-controls/control-tab.tsx:47 msgid "controls.color.add" msgstr "Ajouter…" @@ -470,11 +478,11 @@ msgstr "Retour à l'aperçu" msgid "controls.none" msgstr "Aucun" -#: app/configurator/components/chart-controls/control-tab.tsx:312 +#: app/configurator/components/chart-controls/control-tab.tsx:338 msgid "controls.option.isActive" msgstr "Actif" -#: app/configurator/components/chart-controls/control-tab.tsx:308 +#: app/configurator/components/chart-controls/control-tab.tsx:334 msgid "controls.option.isNotActive" msgstr "Inactif" @@ -506,7 +514,7 @@ msgstr "Style de la colonne" msgid "controls.section.data.filters" msgstr "Filtres" -#: app/configurator/components/chart-annotator.tsx:52 +#: app/configurator/components/chart-annotator.tsx:50 msgid "controls.section.description" msgstr "Titre & description" @@ -560,9 +568,9 @@ msgstr "Tri du tableau" msgid "controls.section.tableoptions" msgstr "Options du tableau" -#: app/configurator/components/chart-annotator.tsx:32 +#: app/configurator/components/chart-annotator.tsx:30 msgid "controls.section.title.warning" -msgstr "Ajoutez un titre ou une description" +msgstr "Ajoutez un titre et une description" #: app/configurator/components/chart-configurator.tsx:537 #: app/configurator/components/chart-type-selector.tsx:131 diff --git a/app/locales/it/messages.po b/app/locales/it/messages.po index 7f7ecbd79..1e2f8152d 100644 --- a/app/locales/it/messages.po +++ b/app/locales/it/messages.po @@ -207,6 +207,14 @@ msgstr "Regular" msgid "controls..interactiveFilters.time.defaultSettings" msgstr "Impostazioni predefinite" +#: app/configurator/components/chart-annotator.tsx:67 +msgid "controls.annotator.add-description-warning" +msgstr "Aggiungi una descrizione" + +#: app/configurator/components/chart-annotator.tsx:57 +msgid "controls.annotator.add-title-warning" +msgstr "Aggiungi un titolo" + #: app/configurator/components/field-i18n.ts:5 msgid "controls.axis.horizontal" msgstr "Asse orizzontale" @@ -252,7 +260,7 @@ msgstr "Tabella" msgid "controls.color" msgstr "Colore" -#: app/configurator/components/chart-controls/control-tab.tsx:45 +#: app/configurator/components/chart-controls/control-tab.tsx:47 msgid "controls.color.add" msgstr "Aggiungi ..." @@ -475,11 +483,11 @@ msgstr "Torna all'anteprima" msgid "controls.none" msgstr "Nessuno" -#: app/configurator/components/chart-controls/control-tab.tsx:312 +#: app/configurator/components/chart-controls/control-tab.tsx:338 msgid "controls.option.isActive" msgstr "Attivo" -#: app/configurator/components/chart-controls/control-tab.tsx:308 +#: app/configurator/components/chart-controls/control-tab.tsx:334 msgid "controls.option.isNotActive" msgstr "Inattivo" @@ -511,7 +519,7 @@ msgstr "Stile della colonna" msgid "controls.section.data.filters" msgstr "Filtri" -#: app/configurator/components/chart-annotator.tsx:52 +#: app/configurator/components/chart-annotator.tsx:50 msgid "controls.section.description" msgstr "Titolo e descrizione" @@ -565,7 +573,7 @@ msgstr "Ordinamento della tabella" msgid "controls.section.tableoptions" msgstr "Opzioni della tabella" -#: app/configurator/components/chart-annotator.tsx:32 +#: app/configurator/components/chart-annotator.tsx:30 msgid "controls.section.title.warning" msgstr "Aggiungi un titolo o una descrizione" From 0962364d6b7e52f658b95d1e2068528d30ec3c54 Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 14:42:31 +0100 Subject: [PATCH 46/50] refactor: Remove unused EmptyRightPanel --- .../components/chart-annotations-selector.tsx | 3 +- .../components/chart-options-selector.tsx | 5 +- .../components/empty-right-panel.tsx | 29 ------ app/locales/de/messages.po | 88 ++++++++----------- app/locales/en/messages.po | 88 ++++++++----------- app/locales/fr/messages.po | 88 ++++++++----------- app/locales/it/messages.po | 88 ++++++++----------- 7 files changed, 146 insertions(+), 243 deletions(-) delete mode 100644 app/configurator/components/empty-right-panel.tsx diff --git a/app/configurator/components/chart-annotations-selector.tsx b/app/configurator/components/chart-annotations-selector.tsx index 6675aa156..fbc9801f9 100644 --- a/app/configurator/components/chart-annotations-selector.tsx +++ b/app/configurator/components/chart-annotations-selector.tsx @@ -6,7 +6,6 @@ import { ControlSectionContent, SectionTitle, } from "@/configurator/components/chart-controls/section"; -import { EmptyRightPanel } from "@/configurator/components/empty-right-panel"; import { MetaInputField } from "@/configurator/components/field"; import { getFieldLabel } from "@/configurator/components/field-i18n"; import { getIconName } from "@/configurator/components/ui-helpers"; @@ -101,6 +100,6 @@ export const ChartAnnotationsSelector = ({
); } else { - return ; + return null; } }; diff --git a/app/configurator/components/chart-options-selector.tsx b/app/configurator/components/chart-options-selector.tsx index 141406f11..02127bcdf 100644 --- a/app/configurator/components/chart-options-selector.tsx +++ b/app/configurator/components/chart-options-selector.tsx @@ -39,7 +39,6 @@ import { ControlSectionSkeleton, SectionTitle, } from "@/configurator/components/chart-controls/section"; -import { EmptyRightPanel } from "@/configurator/components/empty-right-panel"; import { ChartFieldField, ChartOptionCheckboxField, @@ -137,9 +136,7 @@ export const ChartOptionsSelector = ({ imputationNeeded={imputationNeeded} /> ) - ) : ( - - )} + ) : null} ); } else { diff --git a/app/configurator/components/empty-right-panel.tsx b/app/configurator/components/empty-right-panel.tsx deleted file mode 100644 index 60436d727..000000000 --- a/app/configurator/components/empty-right-panel.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Trans } from "@lingui/macro"; -import { Typography } from "@mui/material"; -import { ReactNode } from "react"; - -import { ConfiguratorStateConfiguringChart } from "@/configurator"; - -export const EmptyRightPanel = ({ - state, -}: { - state: ConfiguratorStateConfiguringChart; -}) => ( - - {getRightPanelHint(state.state)} - -); - -const getRightPanelHint = (state: string): ReactNode => { - switch (state) { - case "CONFIGURING_CHART": - return ( - - Select a chart element or a data dimension in the left panel to modify - its options. - - ); - default: - return "blabla"; - } -}; diff --git a/app/locales/de/messages.po b/app/locales/de/messages.po index f6016ea59..8bd06d711 100644 --- a/app/locales/de/messages.po +++ b/app/locales/de/messages.po @@ -124,16 +124,16 @@ msgid "chart.map.layers.area" msgstr "Flächen" #: app/configurator/components/chart-configurator.tsx:697 -#: app/configurator/components/chart-options-selector.tsx:989 +#: app/configurator/components/chart-options-selector.tsx:986 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" msgstr "Kartenanzeige" -#: app/configurator/components/chart-options-selector.tsx:993 +#: app/configurator/components/chart-options-selector.tsx:990 msgid "chart.map.layers.base.show" msgstr "Weltkarte anzeigen" -#: app/configurator/components/chart-options-selector.tsx:1001 +#: app/configurator/components/chart-options-selector.tsx:998 msgid "chart.map.layers.base.view.locked" msgstr "Gesperrte Ansicht" @@ -235,7 +235,7 @@ msgstr "Scatterplot" msgid "controls.chart.type.table" msgstr "Tabelle" -#: app/configurator/components/chart-options-selector.tsx:720 +#: app/configurator/components/chart-options-selector.tsx:717 #: app/configurator/components/field-i18n.ts:17 msgid "controls.color" msgstr "Farbe" @@ -244,7 +244,7 @@ msgstr "Farbe" msgid "controls.color.add" msgstr "Hinzufügen …" -#: app/configurator/components/chart-options-selector.tsx:749 +#: app/configurator/components/chart-options-selector.tsx:746 msgid "controls.color.opacity" msgstr "Transparenz" @@ -265,35 +265,35 @@ msgstr "Farbpalette zurücksetzen" msgid "controls.color.palette.sequential" msgstr "Sequentiell" -#: app/configurator/components/chart-options-selector.tsx:836 +#: app/configurator/components/chart-options-selector.tsx:833 msgid "controls.color.scale.discretization.jenks" msgstr "Jenks (Natural Breaks)" -#: app/configurator/components/chart-options-selector.tsx:829 +#: app/configurator/components/chart-options-selector.tsx:826 msgid "controls.color.scale.discretization.quantiles" msgstr "Quantile (gleiche Anzahl Werte)" -#: app/configurator/components/chart-options-selector.tsx:822 +#: app/configurator/components/chart-options-selector.tsx:819 msgid "controls.color.scale.discretization.quantize" msgstr "Quantisierung (gleiche Wertebereiche)" -#: app/configurator/components/chart-options-selector.tsx:814 +#: app/configurator/components/chart-options-selector.tsx:811 msgid "controls.color.scale.interpolation" msgstr "Interpolation" -#: app/configurator/components/chart-options-selector.tsx:846 +#: app/configurator/components/chart-options-selector.tsx:843 msgid "controls.color.scale.number.of.classes" msgstr "Anzahl Klassen" -#: app/configurator/components/chart-options-selector.tsx:786 +#: app/configurator/components/chart-options-selector.tsx:783 msgid "controls.color.scale.type.continuous" msgstr "Kontinuierlich" -#: app/configurator/components/chart-options-selector.tsx:797 +#: app/configurator/components/chart-options-selector.tsx:794 msgid "controls.color.scale.type.discrete" msgstr "Diskret" -#: app/configurator/components/chart-options-selector.tsx:739 +#: app/configurator/components/chart-options-selector.tsx:736 msgid "controls.color.select" msgstr "Farbe auswählen" @@ -365,38 +365,22 @@ msgstr "Zeitspanne" msgid "controls.groups.empty-help" msgstr "Ziehen Sie Spalten hierher, um Gruppen zu erstellen." -#: app/configurator/map/map-chart-options.tsx:204 -#~ msgid "controls.hierarchy" -#~ msgstr "Hierarchie-Ebene" - -#: app/configurator/map/map-chart-options.tsx:209 -#~ msgid "controls.hierarchy.select" -#~ msgstr "Hierarchie-Ebene auswählen" - -#: app/configurator/components/empty-right-panel.tsx:21 -msgid "controls.hint.configuring.chart" -msgstr "Bitte eine Designoption oder Datendimension auswählen, um diese zu bearbeiten." - -#: app/configurator/components/empty-right-panel.tsx:31 -#~ msgid "controls.hint.describing.chart" -#~ msgstr "Bitte ein Beschreibungsfeld auswählen, um dieses zu bearbeiten." - #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" msgstr "Imputationstyp" -#: app/configurator/components/chart-options-selector.tsx:881 +#: app/configurator/components/chart-options-selector.tsx:878 #: app/configurator/components/field-i18n.ts:99 msgid "controls.imputation.type.linear" msgstr "Lineare Interpolation" -#: app/configurator/components/chart-options-selector.tsx:874 -#: app/configurator/components/chart-options-selector.tsx:886 +#: app/configurator/components/chart-options-selector.tsx:871 +#: app/configurator/components/chart-options-selector.tsx:883 #: app/configurator/components/field-i18n.ts:91 msgid "controls.imputation.type.none" msgstr "-" -#: app/configurator/components/chart-options-selector.tsx:876 +#: app/configurator/components/chart-options-selector.tsx:873 #: app/configurator/components/field-i18n.ts:95 msgid "controls.imputation.type.zeros" msgstr "Nullen" @@ -475,7 +459,7 @@ msgstr "Aus" #~ msgid "controls.option.none" #~ msgstr "Keine" -#: app/configurator/components/chart-options-selector.tsx:779 +#: app/configurator/components/chart-options-selector.tsx:776 msgid "controls.scale.type" msgstr "Skalierungstyp" @@ -483,7 +467,7 @@ msgstr "Skalierungstyp" msgid "controls.search.clear" msgstr "Suche zurücksetzen" -#: app/configurator/components/chart-options-selector.tsx:356 +#: app/configurator/components/chart-options-selector.tsx:353 msgid "controls.section.additional-information" msgstr "Zusätzliche Informationen" @@ -507,8 +491,8 @@ msgstr "Filter" msgid "controls.section.description" msgstr "Titel & Beschreibung" -#: app/configurator/components/chart-options-selector.tsx:411 -#: app/configurator/components/chart-options-selector.tsx:415 +#: app/configurator/components/chart-options-selector.tsx:408 +#: app/configurator/components/chart-options-selector.tsx:412 #: app/configurator/table/table-chart-options.tsx:314 #: app/configurator/table/table-chart-options.tsx:318 #: app/configurator/table/table-chart-options.tsx:338 @@ -520,11 +504,11 @@ msgstr "Filter" msgid "controls.section.groups" msgstr "Gruppierungen" -#: app/configurator/components/chart-options-selector.tsx:915 +#: app/configurator/components/chart-options-selector.tsx:912 msgid "controls.section.imputation" msgstr "Fehlende Werte" -#: app/configurator/components/chart-options-selector.tsx:920 +#: app/configurator/components/chart-options-selector.tsx:917 msgid "controls.section.imputation.explanation" msgstr "Für diesen Diagrammtyp sollten fehlenden Werten Ersatzwerte zugewiesen werden. Entscheiden Sie sich für die Imputationslogik oder wechseln Sie zu einem anderen Diagrammtyp." @@ -537,11 +521,11 @@ msgstr "Interaktive Filter hinzufügen" msgid "controls.section.interactiveFilters.dataFilters" msgstr "Datenfilter" -#: app/configurator/components/chart-options-selector.tsx:365 +#: app/configurator/components/chart-options-selector.tsx:362 msgid "controls.section.show-standard-error" msgstr "Standardfehler anzeigen" -#: app/configurator/components/chart-options-selector.tsx:557 +#: app/configurator/components/chart-options-selector.tsx:554 msgid "controls.section.sorting" msgstr "Sortieren" @@ -567,7 +551,7 @@ msgstr "Fügen Sie einen Titel oder eine Beschreibung hinzu" msgid "controls.select.chart.type" msgstr "Diagrammtyp" -#: app/configurator/components/chart-options-selector.tsx:461 +#: app/configurator/components/chart-options-selector.tsx:458 msgid "controls.select.column.layout" msgstr "Spaltenstil" @@ -603,14 +587,14 @@ msgstr "Schriftfarbe" msgid "controls.select.columnStyle.textStyle" msgstr "Schriftstil" -#: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/components/chart-options-selector.tsx:217 #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Dimension auswählen" -#: app/configurator/components/chart-options-selector.tsx:221 -#: app/configurator/components/chart-options-selector.tsx:647 -#: app/configurator/components/chart-options-selector.tsx:725 +#: app/configurator/components/chart-options-selector.tsx:218 +#: app/configurator/components/chart-options-selector.tsx:644 +#: app/configurator/components/chart-options-selector.tsx:722 msgid "controls.select.measure" msgstr "Messwert auswählen" @@ -633,7 +617,7 @@ msgstr "Für beste Ergebnisse wählen Sie nicht mehr als 7 Werte für die Visual msgid "controls.set-values-apply" msgstr "Filter anwenden" -#: app/configurator/components/chart-options-selector.tsx:639 +#: app/configurator/components/chart-options-selector.tsx:636 msgid "controls.size" msgstr "Grösse" @@ -641,12 +625,12 @@ msgstr "Grösse" msgid "controls.sorting.addDimension" msgstr "Dimension hinzufügen" -#: app/configurator/components/chart-options-selector.tsx:509 +#: app/configurator/components/chart-options-selector.tsx:506 msgid "controls.sorting.byAuto" msgstr "Auto" -#: app/configurator/components/chart-options-selector.tsx:503 -#: app/configurator/components/chart-options-selector.tsx:513 +#: app/configurator/components/chart-options-selector.tsx:500 +#: app/configurator/components/chart-options-selector.tsx:510 msgid "controls.sorting.byDimensionLabel" msgstr "Name" @@ -660,7 +644,7 @@ msgstr "A → Z" msgid "controls.sorting.byDimensionLabel.descending" msgstr "Z → A" -#: app/configurator/components/chart-options-selector.tsx:505 +#: app/configurator/components/chart-options-selector.tsx:502 msgid "controls.sorting.byMeasure" msgstr "Messwert" @@ -672,7 +656,7 @@ msgstr "1 → 9" msgid "controls.sorting.byMeasure.descending" msgstr "9 → 1" -#: app/configurator/components/chart-options-selector.tsx:507 +#: app/configurator/components/chart-options-selector.tsx:504 msgid "controls.sorting.byTotalSize" msgstr "Gesamtgrösse" diff --git a/app/locales/en/messages.po b/app/locales/en/messages.po index a419e2113..89b732063 100644 --- a/app/locales/en/messages.po +++ b/app/locales/en/messages.po @@ -144,16 +144,16 @@ msgstr "Areas" #~ msgstr "Quantize (equal intervals)" #: app/configurator/components/chart-configurator.tsx:697 -#: app/configurator/components/chart-options-selector.tsx:989 +#: app/configurator/components/chart-options-selector.tsx:986 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" msgstr "Map Display" -#: app/configurator/components/chart-options-selector.tsx:993 +#: app/configurator/components/chart-options-selector.tsx:990 msgid "chart.map.layers.base.show" msgstr "Show Worldmap" -#: app/configurator/components/chart-options-selector.tsx:1001 +#: app/configurator/components/chart-options-selector.tsx:998 msgid "chart.map.layers.base.view.locked" msgstr "Locked view" @@ -255,7 +255,7 @@ msgstr "Scatterplot" msgid "controls.chart.type.table" msgstr "Table" -#: app/configurator/components/chart-options-selector.tsx:720 +#: app/configurator/components/chart-options-selector.tsx:717 #: app/configurator/components/field-i18n.ts:17 msgid "controls.color" msgstr "Color" @@ -264,7 +264,7 @@ msgstr "Color" msgid "controls.color.add" msgstr "Add ..." -#: app/configurator/components/chart-options-selector.tsx:749 +#: app/configurator/components/chart-options-selector.tsx:746 msgid "controls.color.opacity" msgstr "Opacity" @@ -285,35 +285,35 @@ msgstr "Reset color palette" msgid "controls.color.palette.sequential" msgstr "Sequential" -#: app/configurator/components/chart-options-selector.tsx:836 +#: app/configurator/components/chart-options-selector.tsx:833 msgid "controls.color.scale.discretization.jenks" msgstr "Jenks (natural breaks)" -#: app/configurator/components/chart-options-selector.tsx:829 +#: app/configurator/components/chart-options-selector.tsx:826 msgid "controls.color.scale.discretization.quantiles" msgstr "Quantiles (equal distribution of values)" -#: app/configurator/components/chart-options-selector.tsx:822 +#: app/configurator/components/chart-options-selector.tsx:819 msgid "controls.color.scale.discretization.quantize" msgstr "Quantize (equal intervals)" -#: app/configurator/components/chart-options-selector.tsx:814 +#: app/configurator/components/chart-options-selector.tsx:811 msgid "controls.color.scale.interpolation" msgstr "Interpolation" -#: app/configurator/components/chart-options-selector.tsx:846 +#: app/configurator/components/chart-options-selector.tsx:843 msgid "controls.color.scale.number.of.classes" msgstr "Number of classes" -#: app/configurator/components/chart-options-selector.tsx:786 +#: app/configurator/components/chart-options-selector.tsx:783 msgid "controls.color.scale.type.continuous" msgstr "Continuous" -#: app/configurator/components/chart-options-selector.tsx:797 +#: app/configurator/components/chart-options-selector.tsx:794 msgid "controls.color.scale.type.discrete" msgstr "Discrete" -#: app/configurator/components/chart-options-selector.tsx:739 +#: app/configurator/components/chart-options-selector.tsx:736 msgid "controls.color.select" msgstr "Select a color" @@ -385,38 +385,22 @@ msgstr "Time Range" msgid "controls.groups.empty-help" msgstr "Drag and drop columns here to make groups." -#: app/configurator/map/map-chart-options.tsx:204 -#~ msgid "controls.hierarchy" -#~ msgstr "Hierarchy level" - -#: app/configurator/map/map-chart-options.tsx:209 -#~ msgid "controls.hierarchy.select" -#~ msgstr "Select a hierarchy level" - -#: app/configurator/components/empty-right-panel.tsx:21 -msgid "controls.hint.configuring.chart" -msgstr "Select a design element or a data dimension to modify its options." - -#: app/configurator/components/empty-right-panel.tsx:31 -#~ msgid "controls.hint.describing.chart" -#~ msgstr "Select an annotation field to modify its content." - #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" msgstr "Imputation type" -#: app/configurator/components/chart-options-selector.tsx:881 +#: app/configurator/components/chart-options-selector.tsx:878 #: app/configurator/components/field-i18n.ts:99 msgid "controls.imputation.type.linear" msgstr "Linear interpolation" -#: app/configurator/components/chart-options-selector.tsx:874 -#: app/configurator/components/chart-options-selector.tsx:886 +#: app/configurator/components/chart-options-selector.tsx:871 +#: app/configurator/components/chart-options-selector.tsx:883 #: app/configurator/components/field-i18n.ts:91 msgid "controls.imputation.type.none" msgstr "-" -#: app/configurator/components/chart-options-selector.tsx:876 +#: app/configurator/components/chart-options-selector.tsx:873 #: app/configurator/components/field-i18n.ts:95 msgid "controls.imputation.type.zeros" msgstr "Zeros" @@ -491,7 +475,7 @@ msgstr "On" msgid "controls.option.isNotActive" msgstr "Off" -#: app/configurator/components/chart-options-selector.tsx:779 +#: app/configurator/components/chart-options-selector.tsx:776 msgid "controls.scale.type" msgstr "Scale type" @@ -499,7 +483,7 @@ msgstr "Scale type" msgid "controls.search.clear" msgstr "Clear search field" -#: app/configurator/components/chart-options-selector.tsx:356 +#: app/configurator/components/chart-options-selector.tsx:353 msgid "controls.section.additional-information" msgstr "Additional information" @@ -523,8 +507,8 @@ msgstr "Filters" msgid "controls.section.description" msgstr "Title & Description" -#: app/configurator/components/chart-options-selector.tsx:411 -#: app/configurator/components/chart-options-selector.tsx:415 +#: app/configurator/components/chart-options-selector.tsx:408 +#: app/configurator/components/chart-options-selector.tsx:412 #: app/configurator/table/table-chart-options.tsx:314 #: app/configurator/table/table-chart-options.tsx:318 #: app/configurator/table/table-chart-options.tsx:338 @@ -536,11 +520,11 @@ msgstr "Filter" msgid "controls.section.groups" msgstr "Groups" -#: app/configurator/components/chart-options-selector.tsx:915 +#: app/configurator/components/chart-options-selector.tsx:912 msgid "controls.section.imputation" msgstr "Missing values" -#: app/configurator/components/chart-options-selector.tsx:920 +#: app/configurator/components/chart-options-selector.tsx:917 msgid "controls.section.imputation.explanation" msgstr "For this chart type, replacement values should be assigned to missing values. Decide on the imputation logic or switch to another chart type." @@ -553,11 +537,11 @@ msgstr "Interactive Filters" msgid "controls.section.interactiveFilters.dataFilters" msgstr "Data Filters" -#: app/configurator/components/chart-options-selector.tsx:365 +#: app/configurator/components/chart-options-selector.tsx:362 msgid "controls.section.show-standard-error" msgstr "Show standard error" -#: app/configurator/components/chart-options-selector.tsx:557 +#: app/configurator/components/chart-options-selector.tsx:554 msgid "controls.section.sorting" msgstr "Sort" @@ -583,7 +567,7 @@ msgstr "Please add a title or description." msgid "controls.select.chart.type" msgstr "Chart Type" -#: app/configurator/components/chart-options-selector.tsx:461 +#: app/configurator/components/chart-options-selector.tsx:458 msgid "controls.select.column.layout" msgstr "Column layout" @@ -619,14 +603,14 @@ msgstr "Text Color" msgid "controls.select.columnStyle.textStyle" msgstr "Text Style" -#: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/components/chart-options-selector.tsx:217 #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Select a dimension" -#: app/configurator/components/chart-options-selector.tsx:221 -#: app/configurator/components/chart-options-selector.tsx:647 -#: app/configurator/components/chart-options-selector.tsx:725 +#: app/configurator/components/chart-options-selector.tsx:218 +#: app/configurator/components/chart-options-selector.tsx:644 +#: app/configurator/components/chart-options-selector.tsx:722 msgid "controls.select.measure" msgstr "Select a measure" @@ -649,7 +633,7 @@ msgstr "For best results, do not select more than 7 values in the visualization. msgid "controls.set-values-apply" msgstr "Apply filters" -#: app/configurator/components/chart-options-selector.tsx:639 +#: app/configurator/components/chart-options-selector.tsx:636 msgid "controls.size" msgstr "Size" @@ -657,12 +641,12 @@ msgstr "Size" msgid "controls.sorting.addDimension" msgstr "Add dimension" -#: app/configurator/components/chart-options-selector.tsx:509 +#: app/configurator/components/chart-options-selector.tsx:506 msgid "controls.sorting.byAuto" msgstr "Automatic" -#: app/configurator/components/chart-options-selector.tsx:503 -#: app/configurator/components/chart-options-selector.tsx:513 +#: app/configurator/components/chart-options-selector.tsx:500 +#: app/configurator/components/chart-options-selector.tsx:510 msgid "controls.sorting.byDimensionLabel" msgstr "Name" @@ -676,7 +660,7 @@ msgstr "A → Z" msgid "controls.sorting.byDimensionLabel.descending" msgstr "Z → A" -#: app/configurator/components/chart-options-selector.tsx:505 +#: app/configurator/components/chart-options-selector.tsx:502 msgid "controls.sorting.byMeasure" msgstr "Measure" @@ -688,7 +672,7 @@ msgstr "1 → 9" msgid "controls.sorting.byMeasure.descending" msgstr "9 → 1" -#: app/configurator/components/chart-options-selector.tsx:507 +#: app/configurator/components/chart-options-selector.tsx:504 msgid "controls.sorting.byTotalSize" msgstr "Total size" diff --git a/app/locales/fr/messages.po b/app/locales/fr/messages.po index ff0d3de22..5d852cef0 100644 --- a/app/locales/fr/messages.po +++ b/app/locales/fr/messages.po @@ -144,16 +144,16 @@ msgstr "Zones" #~ msgstr "Intervalles égaux" #: app/configurator/components/chart-configurator.tsx:697 -#: app/configurator/components/chart-options-selector.tsx:989 +#: app/configurator/components/chart-options-selector.tsx:986 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" msgstr "Affichage de la carte" -#: app/configurator/components/chart-options-selector.tsx:993 +#: app/configurator/components/chart-options-selector.tsx:990 msgid "chart.map.layers.base.show" msgstr "Afficher la carte du monde" -#: app/configurator/components/chart-options-selector.tsx:1001 +#: app/configurator/components/chart-options-selector.tsx:998 msgid "chart.map.layers.base.view.locked" msgstr "Carte verrouillée" @@ -255,7 +255,7 @@ msgstr "Nuage de points" msgid "controls.chart.type.table" msgstr "Tableau" -#: app/configurator/components/chart-options-selector.tsx:720 +#: app/configurator/components/chart-options-selector.tsx:717 #: app/configurator/components/field-i18n.ts:17 msgid "controls.color" msgstr "Couleur" @@ -264,7 +264,7 @@ msgstr "Couleur" msgid "controls.color.add" msgstr "Ajouter…" -#: app/configurator/components/chart-options-selector.tsx:749 +#: app/configurator/components/chart-options-selector.tsx:746 msgid "controls.color.opacity" msgstr "Transparence" @@ -285,35 +285,35 @@ msgstr "Réinitialiser la palette de couleurs" msgid "controls.color.palette.sequential" msgstr "Séquentielle" -#: app/configurator/components/chart-options-selector.tsx:836 +#: app/configurator/components/chart-options-selector.tsx:833 msgid "controls.color.scale.discretization.jenks" msgstr "Jenks (intervalles naturels)" -#: app/configurator/components/chart-options-selector.tsx:829 +#: app/configurator/components/chart-options-selector.tsx:826 msgid "controls.color.scale.discretization.quantiles" msgstr "Quantiles (distribution homogène des valeurs)" -#: app/configurator/components/chart-options-selector.tsx:822 +#: app/configurator/components/chart-options-selector.tsx:819 msgid "controls.color.scale.discretization.quantize" msgstr "Intervalles égaux" -#: app/configurator/components/chart-options-selector.tsx:814 +#: app/configurator/components/chart-options-selector.tsx:811 msgid "controls.color.scale.interpolation" msgstr "Interpolation" -#: app/configurator/components/chart-options-selector.tsx:846 +#: app/configurator/components/chart-options-selector.tsx:843 msgid "controls.color.scale.number.of.classes" msgstr "Nombre de classes" -#: app/configurator/components/chart-options-selector.tsx:786 +#: app/configurator/components/chart-options-selector.tsx:783 msgid "controls.color.scale.type.continuous" msgstr "Continue" -#: app/configurator/components/chart-options-selector.tsx:797 +#: app/configurator/components/chart-options-selector.tsx:794 msgid "controls.color.scale.type.discrete" msgstr "Discrète" -#: app/configurator/components/chart-options-selector.tsx:739 +#: app/configurator/components/chart-options-selector.tsx:736 msgid "controls.color.select" msgstr "Sélectionner une couleur" @@ -385,38 +385,22 @@ msgstr "Intervalle de temps" msgid "controls.groups.empty-help" msgstr "Glisser-déposer des colonnes ici pour créer des groupes." -#: app/configurator/map/map-chart-options.tsx:204 -#~ msgid "controls.hierarchy" -#~ msgstr "Niveau hiérarchique" - -#: app/configurator/map/map-chart-options.tsx:209 -#~ msgid "controls.hierarchy.select" -#~ msgstr "Sélectionner le niveau hiérarchique" - -#: app/configurator/components/empty-right-panel.tsx:21 -msgid "controls.hint.configuring.chart" -msgstr "Sélectionnez un élément de design ou une dimension du jeu de données pour modifier leurs options." - -#: app/configurator/components/empty-right-panel.tsx:31 -#~ msgid "controls.hint.describing.chart" -#~ msgstr "Sélectionnez une des annotations proposées pour la modifier." - #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" msgstr "Type d'imputation" -#: app/configurator/components/chart-options-selector.tsx:881 +#: app/configurator/components/chart-options-selector.tsx:878 #: app/configurator/components/field-i18n.ts:99 msgid "controls.imputation.type.linear" msgstr "Interpolation linéaire" -#: app/configurator/components/chart-options-selector.tsx:874 -#: app/configurator/components/chart-options-selector.tsx:886 +#: app/configurator/components/chart-options-selector.tsx:871 +#: app/configurator/components/chart-options-selector.tsx:883 #: app/configurator/components/field-i18n.ts:91 msgid "controls.imputation.type.none" msgstr "-" -#: app/configurator/components/chart-options-selector.tsx:876 +#: app/configurator/components/chart-options-selector.tsx:873 #: app/configurator/components/field-i18n.ts:95 msgid "controls.imputation.type.zeros" msgstr "Zéros" @@ -486,7 +470,7 @@ msgstr "Actif" msgid "controls.option.isNotActive" msgstr "Inactif" -#: app/configurator/components/chart-options-selector.tsx:779 +#: app/configurator/components/chart-options-selector.tsx:776 msgid "controls.scale.type" msgstr "Type d'échelle" @@ -494,7 +478,7 @@ msgstr "Type d'échelle" msgid "controls.search.clear" msgstr "Effacer la recherche" -#: app/configurator/components/chart-options-selector.tsx:356 +#: app/configurator/components/chart-options-selector.tsx:353 msgid "controls.section.additional-information" msgstr "Informations supplémentaires" @@ -518,8 +502,8 @@ msgstr "Filtres" msgid "controls.section.description" msgstr "Titre & description" -#: app/configurator/components/chart-options-selector.tsx:411 -#: app/configurator/components/chart-options-selector.tsx:415 +#: app/configurator/components/chart-options-selector.tsx:408 +#: app/configurator/components/chart-options-selector.tsx:412 #: app/configurator/table/table-chart-options.tsx:314 #: app/configurator/table/table-chart-options.tsx:318 #: app/configurator/table/table-chart-options.tsx:338 @@ -531,11 +515,11 @@ msgstr "Filtre" msgid "controls.section.groups" msgstr "Groupes" -#: app/configurator/components/chart-options-selector.tsx:915 +#: app/configurator/components/chart-options-selector.tsx:912 msgid "controls.section.imputation" msgstr "Valeurs manquantes" -#: app/configurator/components/chart-options-selector.tsx:920 +#: app/configurator/components/chart-options-selector.tsx:917 msgid "controls.section.imputation.explanation" msgstr "En raison du type de graphique sélectionné, les valeurs manquantes doivent être remplies. Décidez de la logique d'imputation ou choisissez un autre type de graphique." @@ -548,11 +532,11 @@ msgstr "Filtres interactifs" msgid "controls.section.interactiveFilters.dataFilters" msgstr "Filtres de données" -#: app/configurator/components/chart-options-selector.tsx:365 +#: app/configurator/components/chart-options-selector.tsx:362 msgid "controls.section.show-standard-error" msgstr "Afficher l'erreur type" -#: app/configurator/components/chart-options-selector.tsx:557 +#: app/configurator/components/chart-options-selector.tsx:554 msgid "controls.section.sorting" msgstr "Trier" @@ -578,7 +562,7 @@ msgstr "Ajoutez un titre et une description" msgid "controls.select.chart.type" msgstr "Type de graphique" -#: app/configurator/components/chart-options-selector.tsx:461 +#: app/configurator/components/chart-options-selector.tsx:458 msgid "controls.select.column.layout" msgstr "Mise en forme de la colonne" @@ -614,14 +598,14 @@ msgstr "Couleur du texte" msgid "controls.select.columnStyle.textStyle" msgstr "Style du texte" -#: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/components/chart-options-selector.tsx:217 #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Sélectionner une dimension" -#: app/configurator/components/chart-options-selector.tsx:221 -#: app/configurator/components/chart-options-selector.tsx:647 -#: app/configurator/components/chart-options-selector.tsx:725 +#: app/configurator/components/chart-options-selector.tsx:218 +#: app/configurator/components/chart-options-selector.tsx:644 +#: app/configurator/components/chart-options-selector.tsx:722 msgid "controls.select.measure" msgstr "Sélectionner une variable" @@ -644,7 +628,7 @@ msgstr "Pour de meilleurs résultats, ne sélectionnez pas plus de 7 valeurs dan msgid "controls.set-values-apply" msgstr "Appliquer les filtres" -#: app/configurator/components/chart-options-selector.tsx:639 +#: app/configurator/components/chart-options-selector.tsx:636 msgid "controls.size" msgstr "Taille" @@ -652,12 +636,12 @@ msgstr "Taille" msgid "controls.sorting.addDimension" msgstr "Ajouter une dimension" -#: app/configurator/components/chart-options-selector.tsx:509 +#: app/configurator/components/chart-options-selector.tsx:506 msgid "controls.sorting.byAuto" msgstr "Auto" -#: app/configurator/components/chart-options-selector.tsx:503 -#: app/configurator/components/chart-options-selector.tsx:513 +#: app/configurator/components/chart-options-selector.tsx:500 +#: app/configurator/components/chart-options-selector.tsx:510 msgid "controls.sorting.byDimensionLabel" msgstr "Nom" @@ -671,7 +655,7 @@ msgstr "A → Z" msgid "controls.sorting.byDimensionLabel.descending" msgstr "Z → A" -#: app/configurator/components/chart-options-selector.tsx:505 +#: app/configurator/components/chart-options-selector.tsx:502 msgid "controls.sorting.byMeasure" msgstr "Mesure" @@ -683,7 +667,7 @@ msgstr "1 → 9" msgid "controls.sorting.byMeasure.descending" msgstr "9 → 1" -#: app/configurator/components/chart-options-selector.tsx:507 +#: app/configurator/components/chart-options-selector.tsx:504 msgid "controls.sorting.byTotalSize" msgstr "Taille totale" diff --git a/app/locales/it/messages.po b/app/locales/it/messages.po index 1e2f8152d..0625c238a 100644 --- a/app/locales/it/messages.po +++ b/app/locales/it/messages.po @@ -144,16 +144,16 @@ msgstr "Aree" #~ msgstr "Intervalli uguali" #: app/configurator/components/chart-configurator.tsx:697 -#: app/configurator/components/chart-options-selector.tsx:989 +#: app/configurator/components/chart-options-selector.tsx:986 #: app/configurator/components/field-i18n.ts:31 msgid "chart.map.layers.base" msgstr "Visualizzazione della mappa" -#: app/configurator/components/chart-options-selector.tsx:993 +#: app/configurator/components/chart-options-selector.tsx:990 msgid "chart.map.layers.base.show" msgstr "Mostra mappa del mondo" -#: app/configurator/components/chart-options-selector.tsx:1001 +#: app/configurator/components/chart-options-selector.tsx:998 msgid "chart.map.layers.base.view.locked" msgstr "Vista bloccata" @@ -255,7 +255,7 @@ msgstr "Scatterplot" msgid "controls.chart.type.table" msgstr "Tabella" -#: app/configurator/components/chart-options-selector.tsx:720 +#: app/configurator/components/chart-options-selector.tsx:717 #: app/configurator/components/field-i18n.ts:17 msgid "controls.color" msgstr "Colore" @@ -264,7 +264,7 @@ msgstr "Colore" msgid "controls.color.add" msgstr "Aggiungi ..." -#: app/configurator/components/chart-options-selector.tsx:749 +#: app/configurator/components/chart-options-selector.tsx:746 msgid "controls.color.opacity" msgstr "Trasparenza" @@ -285,35 +285,35 @@ msgstr "Ripristina la tavolozza dei colori" msgid "controls.color.palette.sequential" msgstr "Sequenziale" -#: app/configurator/components/chart-options-selector.tsx:836 +#: app/configurator/components/chart-options-selector.tsx:833 msgid "controls.color.scale.discretization.jenks" msgstr "Jenks (interruzioni naturali)" -#: app/configurator/components/chart-options-selector.tsx:829 +#: app/configurator/components/chart-options-selector.tsx:826 msgid "controls.color.scale.discretization.quantiles" msgstr "Quantili (distribuzione omogenea dei valori)" -#: app/configurator/components/chart-options-selector.tsx:822 +#: app/configurator/components/chart-options-selector.tsx:819 msgid "controls.color.scale.discretization.quantize" msgstr "Intervalli uguali" -#: app/configurator/components/chart-options-selector.tsx:814 +#: app/configurator/components/chart-options-selector.tsx:811 msgid "controls.color.scale.interpolation" msgstr "Interpolazione" -#: app/configurator/components/chart-options-selector.tsx:846 +#: app/configurator/components/chart-options-selector.tsx:843 msgid "controls.color.scale.number.of.classes" msgstr "Numero di classi" -#: app/configurator/components/chart-options-selector.tsx:786 +#: app/configurator/components/chart-options-selector.tsx:783 msgid "controls.color.scale.type.continuous" msgstr "Continuo" -#: app/configurator/components/chart-options-selector.tsx:797 +#: app/configurator/components/chart-options-selector.tsx:794 msgid "controls.color.scale.type.discrete" msgstr "Discreto" -#: app/configurator/components/chart-options-selector.tsx:739 +#: app/configurator/components/chart-options-selector.tsx:736 msgid "controls.color.select" msgstr "Seleziona un colore" @@ -385,38 +385,22 @@ msgstr "intervallo di tempo" msgid "controls.groups.empty-help" msgstr "Trascina qui le colonne per creare gruppi." -#: app/configurator/map/map-chart-options.tsx:204 -#~ msgid "controls.hierarchy" -#~ msgstr "Livello gerarchico" - -#: app/configurator/map/map-chart-options.tsx:209 -#~ msgid "controls.hierarchy.select" -#~ msgstr "Selezionare un livello gerarchico" - -#: app/configurator/components/empty-right-panel.tsx:21 -msgid "controls.hint.configuring.chart" -msgstr "Seleziona un elemento di design o una dimensione dei dati per modificarne le opzioni." - -#: app/configurator/components/empty-right-panel.tsx:31 -#~ msgid "controls.hint.describing.chart" -#~ msgstr "Seleziona una delle annotazioni proposte per modificarla." - #: app/configurator/components/field-i18n.ts:87 msgid "controls.imputation" msgstr "Tipo di imputazione" -#: app/configurator/components/chart-options-selector.tsx:881 +#: app/configurator/components/chart-options-selector.tsx:878 #: app/configurator/components/field-i18n.ts:99 msgid "controls.imputation.type.linear" msgstr "Interpolazione lineare" -#: app/configurator/components/chart-options-selector.tsx:874 -#: app/configurator/components/chart-options-selector.tsx:886 +#: app/configurator/components/chart-options-selector.tsx:871 +#: app/configurator/components/chart-options-selector.tsx:883 #: app/configurator/components/field-i18n.ts:91 msgid "controls.imputation.type.none" msgstr "-" -#: app/configurator/components/chart-options-selector.tsx:876 +#: app/configurator/components/chart-options-selector.tsx:873 #: app/configurator/components/field-i18n.ts:95 msgid "controls.imputation.type.zeros" msgstr "Zeri" @@ -491,7 +475,7 @@ msgstr "Attivo" msgid "controls.option.isNotActive" msgstr "Inattivo" -#: app/configurator/components/chart-options-selector.tsx:779 +#: app/configurator/components/chart-options-selector.tsx:776 msgid "controls.scale.type" msgstr "Tipo di scala" @@ -499,7 +483,7 @@ msgstr "Tipo di scala" msgid "controls.search.clear" msgstr "Cancella la ricerca" -#: app/configurator/components/chart-options-selector.tsx:356 +#: app/configurator/components/chart-options-selector.tsx:353 msgid "controls.section.additional-information" msgstr "Informazioni aggiuntive" @@ -523,8 +507,8 @@ msgstr "Filtri" msgid "controls.section.description" msgstr "Titolo e descrizione" -#: app/configurator/components/chart-options-selector.tsx:411 -#: app/configurator/components/chart-options-selector.tsx:415 +#: app/configurator/components/chart-options-selector.tsx:408 +#: app/configurator/components/chart-options-selector.tsx:412 #: app/configurator/table/table-chart-options.tsx:314 #: app/configurator/table/table-chart-options.tsx:318 #: app/configurator/table/table-chart-options.tsx:338 @@ -536,11 +520,11 @@ msgstr "Filtro" msgid "controls.section.groups" msgstr "Gruppi" -#: app/configurator/components/chart-options-selector.tsx:915 +#: app/configurator/components/chart-options-selector.tsx:912 msgid "controls.section.imputation" msgstr "Valori mancanti" -#: app/configurator/components/chart-options-selector.tsx:920 +#: app/configurator/components/chart-options-selector.tsx:917 msgid "controls.section.imputation.explanation" msgstr "Per questo tipo di grafico, i valori di sostituzione devono essere assegnati ai valori mancanti. Decidi la logica di imputazione o passa a un altro tipo di grafico." @@ -553,11 +537,11 @@ msgstr "Filtri interattivi" msgid "controls.section.interactiveFilters.dataFilters" msgstr "Filtri di dati" -#: app/configurator/components/chart-options-selector.tsx:365 +#: app/configurator/components/chart-options-selector.tsx:362 msgid "controls.section.show-standard-error" msgstr "Mostra l'errore standard" -#: app/configurator/components/chart-options-selector.tsx:557 +#: app/configurator/components/chart-options-selector.tsx:554 msgid "controls.section.sorting" msgstr "Ordina" @@ -583,7 +567,7 @@ msgstr "Aggiungi un titolo o una descrizione" msgid "controls.select.chart.type" msgstr "Tipo di grafico" -#: app/configurator/components/chart-options-selector.tsx:461 +#: app/configurator/components/chart-options-selector.tsx:458 msgid "controls.select.column.layout" msgstr "Layout a colonne" @@ -619,14 +603,14 @@ msgstr "Colore del testo" msgid "controls.select.columnStyle.textStyle" msgstr "Stile del testo" -#: app/configurator/components/chart-options-selector.tsx:220 +#: app/configurator/components/chart-options-selector.tsx:217 #: app/configurator/interactive-filters/interactive-filters-config-options.tsx:310 msgid "controls.select.dimension" msgstr "Seleziona una dimensione" -#: app/configurator/components/chart-options-selector.tsx:221 -#: app/configurator/components/chart-options-selector.tsx:647 -#: app/configurator/components/chart-options-selector.tsx:725 +#: app/configurator/components/chart-options-selector.tsx:218 +#: app/configurator/components/chart-options-selector.tsx:644 +#: app/configurator/components/chart-options-selector.tsx:722 msgid "controls.select.measure" msgstr "Seleziona una misura" @@ -649,7 +633,7 @@ msgstr "Pour de meilleurs résultats, ne sélectionnez pas plus de 7 valeurs dan msgid "controls.set-values-apply" msgstr "Appliquer les filtres" -#: app/configurator/components/chart-options-selector.tsx:639 +#: app/configurator/components/chart-options-selector.tsx:636 msgid "controls.size" msgstr "Grandezza" @@ -657,12 +641,12 @@ msgstr "Grandezza" msgid "controls.sorting.addDimension" msgstr "Aggiungi una dimensione" -#: app/configurator/components/chart-options-selector.tsx:509 +#: app/configurator/components/chart-options-selector.tsx:506 msgid "controls.sorting.byAuto" msgstr "" -#: app/configurator/components/chart-options-selector.tsx:503 -#: app/configurator/components/chart-options-selector.tsx:513 +#: app/configurator/components/chart-options-selector.tsx:500 +#: app/configurator/components/chart-options-selector.tsx:510 msgid "controls.sorting.byDimensionLabel" msgstr "Nome" @@ -676,7 +660,7 @@ msgstr "A → Z" msgid "controls.sorting.byDimensionLabel.descending" msgstr "Z → A" -#: app/configurator/components/chart-options-selector.tsx:505 +#: app/configurator/components/chart-options-selector.tsx:502 msgid "controls.sorting.byMeasure" msgstr "Misura" @@ -688,7 +672,7 @@ msgstr "1 → 9" msgid "controls.sorting.byMeasure.descending" msgstr "9 → 1" -#: app/configurator/components/chart-options-selector.tsx:507 +#: app/configurator/components/chart-options-selector.tsx:504 msgid "controls.sorting.byTotalSize" msgstr "Grandezza totale" From 71f52713a31d8886428e8b30c90384e7118eddcf Mon Sep 17 00:00:00 2001 From: Patrick Browne Date: Tue, 8 Nov 2022 15:25:38 +0100 Subject: [PATCH 47/50] test: Use new data-testid for panel-drawer --- app/configurator/components/configurator.tsx | 2 +- e2e/actions.ts | 2 +- e2e/filter-position.spec.ts | 4 ++-- e2e/selectors.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/configurator/components/configurator.tsx b/app/configurator/components/configurator.tsx index 28ccaf564..fbf933842 100644 --- a/app/configurator/components/configurator.tsx +++ b/app/configurator/components/configurator.tsx @@ -130,7 +130,7 @@ const ConfigureChartStep = () => { hideBackdrop onClose={handleClosePanel} > -
+