diff --git a/demos/example-vite/CHANGELOG.md b/demos/example-vite/CHANGELOG.md new file mode 100644 index 00000000..8cbf1b84 --- /dev/null +++ b/demos/example-vite/CHANGELOG.md @@ -0,0 +1,30 @@ +# example-vite + +## 0.0.4 + +### Patch Changes + +- Updated dependencies [d20386c] + - @journeyapps/powersync-sdk-web@0.2.0 + +## 0.0.3 + +### Patch Changes + +- Updated dependencies [412937f] + - @journeyapps/powersync-sdk-web@0.1.3 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies [7fb9df2] +- Updated dependencies [7fb9df2] + - @journeyapps/powersync-sdk-web@0.1.2 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [0e17713] + - @journeyapps/powersync-sdk-web@0.1.1 diff --git a/demos/example-vite/README.md b/demos/example-vite/README.md new file mode 100644 index 00000000..3a4082a9 --- /dev/null +++ b/demos/example-vite/README.md @@ -0,0 +1,7 @@ +# PowerSync Vite bundling test + +To see it in action: + +1. Make sure to run `pnpm build:packages` in the root directory of this Git repo. +2. `pnpm start` +3. Open the localhost URL in the browser displayed in the terminal output. \ No newline at end of file diff --git a/demos/example-vite/package.json b/demos/example-vite/package.json new file mode 100644 index 00000000..087dedd7 --- /dev/null +++ b/demos/example-vite/package.json @@ -0,0 +1,18 @@ +{ + "name": "example-vite", + "private": true, + "version": "0.0.4", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "start": "pnpm build && pnpm preview" + }, + "dependencies": { + "@journeyapps/powersync-sdk-web": "workspace:*" + }, + "devDependencies": { + "vite": "^5.0.12" + } +} diff --git a/demos/example-vite/src/index.html b/demos/example-vite/src/index.html new file mode 100644 index 00000000..f197ffdc --- /dev/null +++ b/demos/example-vite/src/index.html @@ -0,0 +1,7 @@ + + + + + + Vite bundling test: Check the console to see it in action! + \ No newline at end of file diff --git a/demos/example-vite/src/index.js b/demos/example-vite/src/index.js new file mode 100644 index 00000000..f586c843 --- /dev/null +++ b/demos/example-vite/src/index.js @@ -0,0 +1,37 @@ +import { + Column, + ColumnType, + WASQLitePowerSyncDatabaseOpenFactory, + Schema, + Table +} from '@journeyapps/powersync-sdk-web'; + +export const AppSchema = new Schema([ + new Table({ name: 'customers', columns: [new Column({ name: 'name', type: ColumnType.TEXT })] }) +]); + +let PowerSync; + +const openDatabase = async () => { + PowerSync = new WASQLitePowerSyncDatabaseOpenFactory({ + schema: AppSchema, + dbFilename: 'test.sqlite', + flags: { + // This is disabled once CSR+SSR functionality is verified to be working correctly + disableSSRWarning: true + } + }).getInstance(); + + await PowerSync.init(); + + // Run local statements. + await PowerSync.execute('INSERT INTO customers(id, name) VALUES(uuid(), ?)', ['Fred']); + + const result = await PowerSync.getAll('SELECT * FROM customers'); + console.log('contents of customers: ', result); +}; + +document.addEventListener('DOMContentLoaded', (event) => { + console.log('hello'); + openDatabase(); +}); diff --git a/demos/example-vite/vite.config.ts b/demos/example-vite/vite.config.ts new file mode 100644 index 00000000..832d3ac0 --- /dev/null +++ b/demos/example-vite/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + root: 'src', + build: { + outDir: '../dist', + rollupOptions: { + input: 'src/index.html' + } + }, + worker: { + format: 'es' + } +}); diff --git a/demos/example-webpack/CHANGELOG.md b/demos/example-webpack/CHANGELOG.md new file mode 100644 index 00000000..d73ffc4d --- /dev/null +++ b/demos/example-webpack/CHANGELOG.md @@ -0,0 +1,30 @@ +# example-webpack + +## null + +### Patch Changes + +- Updated dependencies [d20386c] + - @journeyapps/powersync-sdk-web@0.2.0 + +## null + +### Patch Changes + +- Updated dependencies [412937f] + - @journeyapps/powersync-sdk-web@0.1.3 + +## null + +### Patch Changes + +- Updated dependencies [7fb9df2] +- Updated dependencies [7fb9df2] + - @journeyapps/powersync-sdk-web@0.1.2 + +## null + +### Patch Changes + +- Updated dependencies [0e17713] + - @journeyapps/powersync-sdk-web@0.1.1 diff --git a/demos/example-webpack/README.md b/demos/example-webpack/README.md new file mode 100644 index 00000000..42a53318 --- /dev/null +++ b/demos/example-webpack/README.md @@ -0,0 +1,7 @@ +# PowerSync Webpack bundling test + +To see it in action: + +1. Make sure to run `pnpm build:packages` in the root directory of this Git repo. +2. `pnpm start` +3. Open the localhost URL in the browser displayed in the terminal output. \ No newline at end of file diff --git a/demos/example-webpack/index.html b/demos/example-webpack/index.html new file mode 100644 index 00000000..9c683898 --- /dev/null +++ b/demos/example-webpack/index.html @@ -0,0 +1,5 @@ + + +Webpack bundling test: Check the console to see it in action! + + \ No newline at end of file diff --git a/demos/example-webpack/package.json b/demos/example-webpack/package.json new file mode 100644 index 00000000..cb8a246a --- /dev/null +++ b/demos/example-webpack/package.json @@ -0,0 +1,20 @@ +{ + "name": "example-webpack", + "private": true, + "version": null, + "scripts": { + "build": "webpack", + "serve": "serve ./dist", + "start": "pnpm build && pnpm serve" + }, + "dependencies": { + "@journeyapps/powersync-sdk-web": "workspace:*" + }, + "devDependencies": { + "webpack-cli": "^5.1.4", + "webpack": "^5.90.1", + "@types/webpack": "^5.28.5", + "serve": "^14.2.1", + "html-webpack-plugin": "^5.6.0" + } +} diff --git a/demos/example-webpack/src/index.js b/demos/example-webpack/src/index.js new file mode 100644 index 00000000..28327961 --- /dev/null +++ b/demos/example-webpack/src/index.js @@ -0,0 +1,36 @@ +import { + Column, + ColumnType, + WASQLitePowerSyncDatabaseOpenFactory, + Schema, + Table +} from '@journeyapps/powersync-sdk-web'; + +export const AppSchema = new Schema([ + new Table({ name: 'customers', columns: [new Column({ name: 'name', type: ColumnType.TEXT })] }) +]); + +let PowerSync; + +const openDatabase = async () => { + PowerSync = new WASQLitePowerSyncDatabaseOpenFactory({ + schema: AppSchema, + dbFilename: 'test.sqlite', + flags: { + // This is disabled once CSR+SSR functionality is verified to be working correctly + disableSSRWarning: true + } + }).getInstance(); + + await PowerSync.init(); + + // Run local statements. + await PowerSync.execute('INSERT INTO customers(id, name) VALUES(uuid(), ?)', ['Fred']); + + const result = await PowerSync.getAll('SELECT * FROM customers'); + console.log('contents of customers: ', result); +}; + +document.addEventListener('DOMContentLoaded', (event) => { + openDatabase(); +}); diff --git a/demos/example-webpack/webpack.config.js b/demos/example-webpack/webpack.config.js new file mode 100644 index 00000000..82f04e34 --- /dev/null +++ b/demos/example-webpack/webpack.config.js @@ -0,0 +1,23 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = { + entry: path.join(__dirname, 'src/index.js'), + output: { + filename: 'index.js', + path: path.join(__dirname, 'dist') + }, + devtool: 'source-map', + mode: 'development', + resolve: { + extensions: ['.js'] + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.join(__dirname, './index.html'), + inject: true, + title: 'Test', + filename: 'index.html' + }) + ] +}; diff --git a/demos/powersync-nextjs-demo/.env.local.template b/demos/powersync-nextjs-demo/.env.local.template new file mode 100644 index 00000000..63d2a5ae --- /dev/null +++ b/demos/powersync-nextjs-demo/.env.local.template @@ -0,0 +1,3 @@ +SUPABASE_URL= +SUPABASE_ANON_KEY= +POWERSYNC_URL= \ No newline at end of file diff --git a/demos/powersync-nextjs-demo/.eslintrc.json b/demos/powersync-nextjs-demo/.eslintrc.json new file mode 100644 index 00000000..bffb357a --- /dev/null +++ b/demos/powersync-nextjs-demo/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/demos/powersync-nextjs-demo/.gitignore b/demos/powersync-nextjs-demo/.gitignore new file mode 100644 index 00000000..0cc2f139 --- /dev/null +++ b/demos/powersync-nextjs-demo/.gitignore @@ -0,0 +1,47 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# ide +.idea +.fleet +.vscode + +# PWA +**/public/workbox-*.js +**/public/sw.js +**/public/swe-worker-* +**/public/worker-*.js +**/public/fallback-*.js diff --git a/demos/powersync-nextjs-demo/CHANGELOG.md b/demos/powersync-nextjs-demo/CHANGELOG.md new file mode 100644 index 00000000..90835c38 --- /dev/null +++ b/demos/powersync-nextjs-demo/CHANGELOG.md @@ -0,0 +1,61 @@ +# @journeyapps/powersync-nextjs-demo + +## 0.1.8 + +### Patch Changes + +- Updated dependencies [d20386c] + - @journeyapps/powersync-sdk-web@0.2.0 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies [412937f] + - @journeyapps/powersync-sdk-web@0.1.3 + +## 0.1.6 + +### Patch Changes + +- 7fb9df2: Autofocus inputs in creation dialogs for a better UX. +- Updated dependencies [7fb9df2] +- Updated dependencies [7fb9df2] + - @journeyapps/powersync-sdk-web@0.1.2 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies [0e17713] + - @journeyapps/powersync-sdk-web@0.1.1 + +## 0.1.4 + +### Patch Changes + +- 1fa25e6: Added uploading and downloading status indicator. +- Updated dependencies [1fa25e6] + - @journeyapps/powersync-sdk-web@0.1.0 + +## 0.1.3 + +### Patch Changes + +- 0bc3758: Added PWA support. Better initialization of client side PowerSync instance. +- Updated dependencies [0bc3758] + - @journeyapps/powersync-sdk-web@0.0.3 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies [5d9cbb9] + - @journeyapps/powersync-sdk-web@0.0.2 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies [af78f76] + - @journeyapps/powersync-sdk-web@0.0.1 diff --git a/demos/powersync-nextjs-demo/LICENSE b/demos/powersync-nextjs-demo/LICENSE new file mode 100644 index 00000000..1625c179 --- /dev/null +++ b/demos/powersync-nextjs-demo/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. \ No newline at end of file diff --git a/demos/powersync-nextjs-demo/README.md b/demos/powersync-nextjs-demo/README.md new file mode 100644 index 00000000..4ad8ae86 --- /dev/null +++ b/demos/powersync-nextjs-demo/README.md @@ -0,0 +1,74 @@ +# PowerSync + Supabase NextJS Demo: Todo List + +## Note: Beta Release + +This package is currently in a beta release. + +## Overview + +Demo app demonstrating use of the [PowerSync SDK for Web](https://www.npmjs.com/package/@journeyapps/powersync-sdk-web) together with Supabase. + +A step-by-step guide on Supabase<>PowerSync integration is available [here](https://docs.powersync.co/integration-guides/supabase). + +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + + +In your terminal, switch into the demo's directory: + +```bash +cd demos/powersync-nextjs-demo +``` + +Set up the Environment variables: Copy the `.env.local.template` file: + +```bash +cp .env.local.template .env.local +``` + +And then edit `.env.local` to insert your credentials for Supabase. + +Run the development server: + +```bash +pnpm watch +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Progressive Web App (PWA) +This demo is PWA compatible. PWA is not available in development (watch) mode. + +Build the production codebase + +```bash +pnpm build +``` + +Run the production server + +```bash +pnpm start +``` + +Open a browser on the served URL and install the PWA. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +Also check out [the PowerSync Web SDK GitHub repository](https://github.com/powersync-ja/powersync-web-sdk) - your feedback and contributions are welcome! + +To learn more about PowerSync, see the [PowerSync docs](https://docs.powersync.com). + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/demos/powersync-nextjs-demo/next.config.js b/demos/powersync-nextjs-demo/next.config.js new file mode 100644 index 00000000..6cf90749 --- /dev/null +++ b/demos/powersync-nextjs-demo/next.config.js @@ -0,0 +1,53 @@ +const { default: _withPWA } = require('@ducanh2912/next-pwa'); +const withPWA = _withPWA({ + dest: 'public', + cacheStartUrl: true, + dynamicStartUrl: true, + cacheOnFrontEndNav: true, + aggressiveFrontEndNavCaching: true, + swcMinify: true, + disable: process.env.NODE_ENV === 'development', + customWorkerSrc: 'service-worker', + extendDefaultRuntimeCaching: true, + workboxOptions: { + // These caching rules extend the default rules from `next-pwa` + runtimeCaching: [ + { + urlPattern: ({ request, url: { pathname }, sameOrigin }) => + '1' === request.headers.get('RSC') && sameOrigin && !pathname.startsWith('/api/'), + // Caching server-side rendering caused a lot of bugs, this app uses only client side rendering and navigation + handler: 'NetworkOnly', + options: { + cacheName: 'pages-rsc', + plugins: [] + } + }, + { + urlPattern: ({ url: { pathname }, sameOrigin }) => sameOrigin && pathname.startsWith('/views/'), + handler: 'NetworkFirst', + options: { + cacheName: 'views', + plugins: [ + { + cacheKeyWillBeUsed: ({ request, mode }) => { + const url = new URL(request.url || request); + if (url.pathname.includes('/todo-lists/edit')) { + // The page content is the same for any todo list. The todo is fetched dynamically + url.searchParams.delete('id'); + } + return url.href; + } + } + ] + } + } + ] + } +}); + +/** @type {import('next').NextConfig} */ +const nextConfig = withPWA({ + reactStrictMode: false +}); + +module.exports = nextConfig; diff --git a/demos/powersync-nextjs-demo/package.json b/demos/powersync-nextjs-demo/package.json new file mode 100644 index 00000000..45d3e1af --- /dev/null +++ b/demos/powersync-nextjs-demo/package.json @@ -0,0 +1,44 @@ +{ + "name": "@journeyapps/powersync-nextjs-demo", + "version": "0.1.8", + "private": true, + "scripts": { + "build": "next build", + "clean": "rm -rf .next", + "watch": "next dev", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@ducanh2912/next-pwa": "9.7.2", + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@fontsource/roboto": "^5.0.8", + "@journeyapps/powersync-react": "workspace:*", + "@journeyapps/powersync-sdk-web": "workspace:*", + "@journeyapps/wa-sqlite": "~0.1.1", + "@mui/icons-material": "^5.15.8", + "@mui/material": "^5.15.7", + "@mui/x-data-grid": "^6.19.3", + "@supabase/supabase-js": "^2.39.3", + "formik": "^2.4.5", + "js-logger": "^1.6.1", + "lodash": "^4.17.21", + "next": "14.1.0", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/lodash": "^4.14.202", + "@types/node": "^20.11.16", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "autoprefixer": "^10.4.17", + "babel-loader": "^9.1.3", + "eslint": "^8", + "eslint-config-next": "14.0.0", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/demos/powersync-nextjs-demo/postcss.config.js b/demos/powersync-nextjs-demo/postcss.config.js new file mode 100644 index 00000000..5cbc2c7d --- /dev/null +++ b/demos/powersync-nextjs-demo/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/demos/powersync-nextjs-demo/public/icons/icon-192x192.png b/demos/powersync-nextjs-demo/public/icons/icon-192x192.png new file mode 100644 index 00000000..3cd46ff8 Binary files /dev/null and b/demos/powersync-nextjs-demo/public/icons/icon-192x192.png differ diff --git a/demos/powersync-nextjs-demo/public/icons/icon-256x256.png b/demos/powersync-nextjs-demo/public/icons/icon-256x256.png new file mode 100644 index 00000000..4798983e Binary files /dev/null and b/demos/powersync-nextjs-demo/public/icons/icon-256x256.png differ diff --git a/demos/powersync-nextjs-demo/public/icons/icon-384x384.png b/demos/powersync-nextjs-demo/public/icons/icon-384x384.png new file mode 100644 index 00000000..bc1e64e8 Binary files /dev/null and b/demos/powersync-nextjs-demo/public/icons/icon-384x384.png differ diff --git a/demos/powersync-nextjs-demo/public/icons/icon-512x512.png b/demos/powersync-nextjs-demo/public/icons/icon-512x512.png new file mode 100644 index 00000000..c7d0a3a8 Binary files /dev/null and b/demos/powersync-nextjs-demo/public/icons/icon-512x512.png differ diff --git a/demos/powersync-nextjs-demo/public/icons/icon.png b/demos/powersync-nextjs-demo/public/icons/icon.png new file mode 100644 index 00000000..eab59883 Binary files /dev/null and b/demos/powersync-nextjs-demo/public/icons/icon.png differ diff --git a/demos/powersync-nextjs-demo/public/manifest.json b/demos/powersync-nextjs-demo/public/manifest.json new file mode 100644 index 00000000..205990a3 --- /dev/null +++ b/demos/powersync-nextjs-demo/public/manifest.json @@ -0,0 +1,31 @@ +{ + "theme_color": "#c44eff", + "background_color": "#c44eff", + "display": "standalone", + "scope": "/", + "start_url": "/", + "name": "PowerSync NextJS Demo", + "short_name": "PowerSync NextJS", + "icons": [ + { + "src": "/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icons/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/demos/powersync-nextjs-demo/public/next.svg b/demos/powersync-nextjs-demo/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/demos/powersync-nextjs-demo/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/powersync-nextjs-demo/public/powersync-logo.svg b/demos/powersync-nextjs-demo/public/powersync-logo.svg new file mode 100644 index 00000000..32c83dd1 --- /dev/null +++ b/demos/powersync-nextjs-demo/public/powersync-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/powersync-nextjs-demo/public/supabase-logo.png b/demos/powersync-nextjs-demo/public/supabase-logo.png new file mode 100644 index 00000000..ff8c18e1 Binary files /dev/null and b/demos/powersync-nextjs-demo/public/supabase-logo.png differ diff --git a/demos/powersync-nextjs-demo/public/vercel.svg b/demos/powersync-nextjs-demo/public/vercel.svg new file mode 100644 index 00000000..d2f84222 --- /dev/null +++ b/demos/powersync-nextjs-demo/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/powersync-nextjs-demo/src/app/api/supabase/route.ts b/demos/powersync-nextjs-demo/src/app/api/supabase/route.ts new file mode 100644 index 00000000..65003223 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/api/supabase/route.ts @@ -0,0 +1,20 @@ +import { SupabaseConfig } from '@/library/powersync/SupabaseConnector'; + +import { NextRequest, NextResponse } from 'next/server'; + +/** + * This route exposes Supabase credentials to the client. + */ +export async function GET(request: NextRequest): Promise> { + // TODO add any required auth logic if necessary to secure these variables + return NextResponse.json( + { + supabaseUrl: process.env.SUPABASE_URL!, + supabaseAnonKey: process.env.SUPABASE_ANON_KEY!, + powersyncUrl: process.env.POWERSYNC_URL! + }, + { + status: 200 + } + ); +} diff --git a/demos/powersync-nextjs-demo/src/app/auth/login/page.tsx b/demos/powersync-nextjs-demo/src/app/auth/login/page.tsx new file mode 100644 index 00000000..531f9346 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/auth/login/page.tsx @@ -0,0 +1,26 @@ +'use client'; +import React from 'react'; +import { useRouter } from 'next/navigation'; +import { LoginDetailsWidget } from '@/components/widgets/LoginDetailsWidget'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { DEFAULT_ENTRY_ROUTE } from '@/components/Routes'; + +export default function Login() { + const router = useRouter(); + const supabase = useSupabase(); + + return ( + { + if (!supabase) { + throw new Error('Supabase has not been initialized yet'); + } + await supabase.login(values.email, values.password); + router.push(DEFAULT_ENTRY_ROUTE); + }} + secondaryActions={[{ title: 'Register', onClick: () => router.push('/auth/register') }]} + /> + ); +} diff --git a/demos/powersync-nextjs-demo/src/app/auth/register/page.tsx b/demos/powersync-nextjs-demo/src/app/auth/register/page.tsx new file mode 100644 index 00000000..251e2829 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/auth/register/page.tsx @@ -0,0 +1,41 @@ +'use client'; +import React from 'react'; +import { useRouter } from 'next/navigation'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { LoginDetailsWidget } from '@/components/widgets/LoginDetailsWidget'; +import { DEFAULT_ENTRY_ROUTE } from '@/components/Routes'; + +export default function Register() { + const supabase = useSupabase(); + const router = useRouter(); + + return ( + { + if (!supabase) { + throw new Error('Supabase has not been initialized yet'); + } + const { + data: { session }, + error + } = await supabase.client.auth.signUp({ email, password }); + if (error) { + throw new Error(error.message); + } + + if (session) { + supabase.updateSession(session); + router.push(DEFAULT_ENTRY_ROUTE); + return; + } + + // TODO better dialog + alert('Registration successful, please login'); + router.back(); + }} + secondaryActions={[{ title: 'Back', onClick: () => router.back() }]} + /> + ); +} diff --git a/demos/powersync-nextjs-demo/src/app/favicon.ico b/demos/powersync-nextjs-demo/src/app/favicon.ico new file mode 100644 index 00000000..96be8f92 Binary files /dev/null and b/demos/powersync-nextjs-demo/src/app/favicon.ico differ diff --git a/demos/powersync-nextjs-demo/src/app/globals.css b/demos/powersync-nextjs-demo/src/app/globals.css new file mode 100644 index 00000000..f3e9026f --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/globals.css @@ -0,0 +1,20 @@ +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + min-height: 100vh; + margin: 0; + background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); +} diff --git a/demos/powersync-nextjs-demo/src/app/layout.tsx b/demos/powersync-nextjs-demo/src/app/layout.tsx new file mode 100644 index 00000000..cf5105aa --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/layout.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import type { Metadata } from 'next'; +import { Rubik } from 'next/font/google'; +import './globals.css'; +import { ThemeProviderContainer } from '@/components/providers/ThemeProviderContainer'; +import { DynamicSystemProvider } from '@/components/providers/DynamicSystemProvider'; + +const rubik = Rubik({ subsets: ['latin'], display: 'swap' }); + +export const metadata: Metadata = { + title: 'PowerSync Demo', + description: 'PowerSync Web SDK Demo' +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + ); +} diff --git a/demos/powersync-nextjs-demo/src/app/page.tsx b/demos/powersync-nextjs-demo/src/app/page.tsx new file mode 100644 index 00000000..2579d7b8 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/page.tsx @@ -0,0 +1,71 @@ +'use client'; +import React from 'react'; +import { CircularProgress, Grid, styled } from '@mui/material'; +import { useRouter } from 'next/navigation'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { DEFAULT_ENTRY_ROUTE } from '@/components/Routes'; + +export type LoginFormParams = { + email: string; + password: string; +}; + +/** + * This page shows a loading spinner until the _layout.tsx + * file detects a session and redirects either to the app or + * auth flow. + */ +export default function EntryPage() { + const router = useRouter(); + const connector = useSupabase(); + + const navigateToMainView = () => { + if (connector?.currentSession) { + router.push(DEFAULT_ENTRY_ROUTE); + } + }; + + React.useEffect(() => { + if (!connector) { + console.error(`No Supabase connector has been created yet.`); + return; + } + + if (!connector.ready) { + const l = connector.registerListener({ + initialized: () => { + /** + * Redirect if on the entry view + */ + if (connector.currentSession) { + router.push(DEFAULT_ENTRY_ROUTE); + } + } + }); + return () => l?.(); + } + + // There should be a session at this point. The auth guard will navigate to the login if not + navigateToMainView(); + }, []); + + return ( + + + + + + ); +} + +namespace S { + export const CenteredGrid = styled(Grid)` + display: flex; + justify-content: center; + align-items: center; + `; + + export const MainGrid = styled(CenteredGrid)` + min-height: 100vh; + `; +} diff --git a/demos/powersync-nextjs-demo/src/app/views/layout.tsx b/demos/powersync-nextjs-demo/src/app/views/layout.tsx new file mode 100644 index 00000000..f9a4db1d --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/views/layout.tsx @@ -0,0 +1,141 @@ +'use client'; +import React from 'react'; +import { + AppBar, + Box, + Divider, + Drawer, + IconButton, + List, + ListItem, + ListItemButton, + ListItemIcon, + ListItemText, + Toolbar, + Typography, + styled +} from '@mui/material'; +import Image from 'next/image'; +import MenuIcon from '@mui/icons-material/Menu'; +import WifiIcon from '@mui/icons-material/Wifi'; +import SignalWifiOffIcon from '@mui/icons-material/SignalWifiOff'; +import ChecklistRtlIcon from '@mui/icons-material/ChecklistRtl'; +import ExitToAppIcon from '@mui/icons-material/ExitToApp'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import NorthIcon from '@mui/icons-material/North'; +import SouthIcon from '@mui/icons-material/South'; + +import { usePowerSync } from '@journeyapps/powersync-react'; +import { useRouter } from 'next/navigation'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { NavigationPanelContext } from '@/components/navigation/NavigationPanelContext'; + +export default function ViewsLayout({ children }: { children: React.ReactNode }) { + const powerSync = usePowerSync(); + const router = useRouter(); + const supabase = useSupabase(); + + const [syncStatus, setSyncStatus] = React.useState(powerSync.currentStatus); + const [openDrawer, setOpenDrawer] = React.useState(false); + const [title, setTitle] = React.useState(''); + + const NAVIGATION_ITEMS = React.useMemo( + () => [ + { + path: '/views/sql-console', + title: 'SQL Console', + icon: () => + }, + { + path: '/views/todo-lists', + title: 'TODO Lists', + icon: () => + }, + { + path: '/auth/login', + title: 'Sign Out', + beforeNavigate: async () => { + await powerSync.disconnectAndClear(); + await supabase?.client.auth.signOut(); + }, + icon: () => + } + ], + [powerSync, supabase] + ); + + React.useEffect(() => { + const l = powerSync.registerListener({ + statusChanged: (status) => { + setSyncStatus(status); + } + }); + return () => l?.(); + }, [powerSync]); + + return ( + + + + setOpenDrawer(!openDrawer)} + > + + + + {title} + + + + {syncStatus?.connected ? : } + + + setOpenDrawer(false)}> + + + + {NAVIGATION_ITEMS.map((item) => ( + + { + await item.beforeNavigate?.(); + router.push(item.path); + setOpenDrawer(false); + }} + > + {item.icon()} + + + + ))} + + + + {children} + + + ); +} + +namespace S { + export const MainBox = styled(Box)` + flex-grow: 1; + `; + + export const TopBar = styled(AppBar)` + margin-bottom: 20px; + `; + + export const PowerSyncLogo = styled(Image)` + object-fit: contain; + padding: 20px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/app/views/sql-console/page.tsx b/demos/powersync-nextjs-demo/src/app/views/sql-console/page.tsx new file mode 100644 index 00000000..781ba465 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/views/sql-console/page.tsx @@ -0,0 +1,108 @@ +'use client'; +import _ from 'lodash'; +import React from 'react'; +import { usePowerSyncWatchedQuery } from '@journeyapps/powersync-react'; +import { Box, Button, Grid, TextField, styled } from '@mui/material'; +import { DataGrid } from '@mui/x-data-grid'; +import { NavigationPage } from '@/components/navigation/NavigationPage'; + +export type LoginFormParams = { + email: string; + password: string; +}; + +const DEFAULT_QUERY = 'SELECT * FROM lists'; + +export default function SQLConsolePage() { + const inputRef = React.useRef(); + const [query, setQuery] = React.useState(DEFAULT_QUERY); + const querySQLResult = usePowerSyncWatchedQuery(query); + + const queryDataGridResult = React.useMemo(() => { + const firstItem = querySQLResult?.[0]; + + return { + columns: firstItem + ? Object.keys(firstItem).map((field) => ({ + field, + flex: 1 + })) + : [], + rows: querySQLResult + }; + }, [querySQLResult]); + + return ( + + + + + { + const inputValue = inputRef.current?.value; + if (e.key == 'Enter' && inputValue) { + setQuery(inputValue); + } + }} + /> + + + + + + + {queryDataGridResult ? ( + + {queryDataGridResult.columns ? ( + ({ ...r, id: r.id ?? index })) ?? []} + columns={queryDataGridResult.columns} + initialState={{ + pagination: { + paginationModel: { + pageSize: 20 + } + } + }} + pageSizeOptions={[20]} + disableRowSelectionOnClick + /> + ) : null} + + ) : null} + + + ); +} + +namespace S { + export const MainContainer = styled(Box)` + padding: 20px; + `; + + export const QueryResultContainer = styled(Box)` + margin-top: 40px; + `; + + export const CenteredGrid = styled(Grid)` + display: flex; + justify-content: center; + align-items: center; + `; +} diff --git a/demos/powersync-nextjs-demo/src/app/views/todo-lists/edit/page.tsx b/demos/powersync-nextjs-demo/src/app/views/todo-lists/edit/page.tsx new file mode 100644 index 00000000..20048e6c --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/views/todo-lists/edit/page.tsx @@ -0,0 +1,164 @@ +'use client'; +import _ from 'lodash'; +import React, { Suspense } from 'react'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { LISTS_TABLE, TODOS_TABLE, TodoRecord } from '@/library/powersync/AppSchema'; +import { usePowerSync, usePowerSyncWatchedQuery } from '@journeyapps/powersync-react'; +import { + Box, + Button, + CircularProgress, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + List, + TextField, + Typography, + styled +} from '@mui/material'; +import Fab from '@mui/material/Fab'; +import AddIcon from '@mui/icons-material/Add'; +import { NavigationPage } from '@/components/navigation/NavigationPage'; +import { TodoItemWidget } from '@/components/widgets/TodoItemWidget'; +import { useSearchParams } from 'next/navigation'; + +/** + * useSearchParams causes the entire element to fall back to client side rendering + * This is exposed as a separate React component in order to suspend its render + * and allow the root page to render on the server. + */ +const TodoEditSection = () => { + const powerSync = usePowerSync(); + const supabase = useSupabase(); + const params = useSearchParams(); + const listID = (params.get('id') as string) || ''; + + const [listRecord] = usePowerSyncWatchedQuery<{ name: string }>(`SELECT name FROM ${LISTS_TABLE} WHERE id = ?`, [ + listID + ]); + + const todos = usePowerSyncWatchedQuery(`SELECT * FROM todos WHERE list_id=?`, [listID]); + + const [showPrompt, setShowPrompt] = React.useState(false); + const nameInputRef = React.createRef(); + + const toggleCompletion = async (record: TodoRecord, completed: boolean) => { + const updatedRecord = { ...record, completed: completed }; + if (completed) { + const userID = supabase?.currentSession?.user.id; + if (!userID) { + throw new Error(`Could not get user ID.`); + } + updatedRecord.completed_at = new Date().toISOString(); + updatedRecord.completed_by = userID; + } else { + updatedRecord.completed_at = undefined; + updatedRecord.completed_by = undefined; + } + await powerSync.execute( + `UPDATE ${TODOS_TABLE} + SET completed = ?, + completed_at = ?, + completed_by = ? + WHERE id = ?`, + [completed, updatedRecord.completed_at, updatedRecord.completed_by, record.id] + ); + }; + + const createNewTodo = async (description: string) => { + const userID = supabase?.currentSession?.user.id; + if (!userID) { + throw new Error(`Could not get user ID.`); + } + + await powerSync.execute( + `INSERT INTO + ${TODOS_TABLE} + (id, created_at, created_by, description, list_id) + VALUES + (uuid(), datetime(), ?, ?, ?)`, + [userID, description, listID!] + ); + }; + + const deleteTodo = async (id: string) => { + await powerSync.writeTransaction(async (tx) => { + await tx.execute(`DELETE FROM ${TODOS_TABLE} WHERE id = ?`, [id]); + }); + }; + + if (!listRecord) { + return ( + + No matching List found, please navigate back... + + ); + } + + return ( + + + setShowPrompt(true)}> + + + + + {todos.map((r) => ( + deleteTodo(r.id)} + isComplete={r.completed} + toggleCompletion={() => toggleCompletion(r, !r.completed)} + /> + ))} + + + {/* TODO use a dialog service in future, this is just a simple example app */} + setShowPrompt(false)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + {'Create Todo Item'} + + Enter a description for a new todo item + + + + + + + + + + ); +}; + +export default function TodoEditPage() { + return ( + + }> + + + + ); +} + +namespace S { + export const FloatingActionButton = styled(Fab)` + position: absolute; + bottom: 20px; + right: 20px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/app/views/todo-lists/page.tsx b/demos/powersync-nextjs-demo/src/app/views/todo-lists/page.tsx new file mode 100644 index 00000000..1d31ad87 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/app/views/todo-lists/page.tsx @@ -0,0 +1,131 @@ +'use client'; +import _ from 'lodash'; +import React from 'react'; +import { useSupabase } from '@/components/providers/SystemProvider'; +import { LISTS_TABLE, ListRecord, TODOS_TABLE } from '@/library/powersync/AppSchema'; +import { usePowerSync, usePowerSyncWatchedQuery } from '@journeyapps/powersync-react'; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + List, + TextField, + styled +} from '@mui/material'; +import Fab from '@mui/material/Fab'; +import AddIcon from '@mui/icons-material/Add'; +import { ListItemWidget } from '@/components/widgets/ListItemWidget'; +import { useRouter } from 'next/navigation'; +import { NavigationPage } from '@/components/navigation/NavigationPage'; + +const description = (total: number, completed: number = 0) => { + return `${total - completed} pending, ${completed} completed`; +}; + +export default function TodoListsPage() { + const powerSync = usePowerSync(); + const supabase = useSupabase(); + const router = useRouter(); + + const listRecords = usePowerSyncWatchedQuery(` + SELECT + ${LISTS_TABLE}.*, COUNT(${TODOS_TABLE}.id) AS total_tasks, SUM(CASE WHEN ${TODOS_TABLE}.completed = true THEN 1 ELSE 0 END) as completed_tasks + FROM + ${LISTS_TABLE} + LEFT JOIN ${TODOS_TABLE} + ON ${LISTS_TABLE}.id = ${TODOS_TABLE}.list_id + GROUP BY + ${LISTS_TABLE}.id; + `); + + const [showPrompt, setShowPrompt] = React.useState(false); + const nameInputRef = React.createRef(); + + const createNewList = async (name: string) => { + const session = await supabase?.client.auth.getSession(); + const userID = session?.data.session?.user?.id; + if (!userID) { + throw new Error(`Could not create new lists, no userID found`); + } + + const res = await powerSync.execute( + `INSERT INTO ${LISTS_TABLE} (id, created_at, name, owner_id) VALUES (uuid(), datetime(), ?, ?) RETURNING *`, + [name, userID] + ); + + const resultRecord = res.rows?.item(0); + if (!resultRecord) { + throw new Error('Could not create list'); + } + }; + + const deleteList = async (id: string) => { + await powerSync.writeTransaction(async (tx) => { + // Delete associated todos + await tx.execute(`DELETE FROM ${TODOS_TABLE} WHERE list_id = ?`, [id]); + // Delete list record + await tx.execute(`DELETE FROM ${LISTS_TABLE} WHERE id = ?`, [id]); + }); + }; + + return ( + + + setShowPrompt(true)}> + + + + + {listRecords.map((r) => ( + deleteList(r.id)} + onPress={() => { + router.push(`/views/todo-lists/edit?id=${r.id}`); + }} + /> + ))} + + + {/* TODO use a dialog service in future, this is just a simple example app */} + setShowPrompt(false)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + {'Create Todo List'} + + Enter a name for a new todo list + + + + + + + + + + ); +} + +namespace S { + export const FloatingActionButton = styled(Fab)` + position: absolute; + bottom: 20px; + right: 20px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/components/Routes.ts b/demos/powersync-nextjs-demo/src/components/Routes.ts new file mode 100644 index 00000000..7b4cc000 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/Routes.ts @@ -0,0 +1,4 @@ +/** + * Navigate to this route after authentication + */ +export const DEFAULT_ENTRY_ROUTE = '/views/todo-lists'; diff --git a/demos/powersync-nextjs-demo/src/components/navigation/NavigationPage.tsx b/demos/powersync-nextjs-demo/src/components/navigation/NavigationPage.tsx new file mode 100644 index 00000000..ac0cc307 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/navigation/NavigationPage.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { useNavigationPanel } from './NavigationPanelContext'; +import { Box, styled } from '@mui/material'; + +/** + * Wraps a component with automatic navigation panel title management + */ +export const NavigationPage: React.FC> = ({ title, children }) => { + const navigationPanel = useNavigationPanel(); + + React.useEffect(() => { + navigationPanel.setTitle(title); + + return () => navigationPanel.setTitle(''); + }, [title, navigationPanel]); + + return {children}; +}; + +namespace S { + export const Container = styled(Box)` + margin: 10px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/components/navigation/NavigationPanelContext.tsx b/demos/powersync-nextjs-demo/src/components/navigation/NavigationPanelContext.tsx new file mode 100644 index 00000000..2dbdbfc6 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/navigation/NavigationPanelContext.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +export type NavigationPanelController = { + setTitle: (title: string) => void; +}; + +export const NavigationPanelContext = React.createContext({ + setTitle: () => { + throw new Error(`No NavigationPanelContext has been provided`); + } +}); + +export const useNavigationPanel = () => React.useContext(NavigationPanelContext); diff --git a/demos/powersync-nextjs-demo/src/components/providers/DynamicSystemProvider.tsx b/demos/powersync-nextjs-demo/src/components/providers/DynamicSystemProvider.tsx new file mode 100644 index 00000000..fab797ff --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/providers/DynamicSystemProvider.tsx @@ -0,0 +1,8 @@ +import dynamic from 'next/dynamic'; + +/** + * Only use PowerSync in client side rendering + */ +export const DynamicSystemProvider = dynamic(() => import('./SystemProvider'), { + ssr: false +}); diff --git a/demos/powersync-nextjs-demo/src/components/providers/SystemProvider.tsx b/demos/powersync-nextjs-demo/src/components/providers/SystemProvider.tsx new file mode 100644 index 00000000..8066c020 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/providers/SystemProvider.tsx @@ -0,0 +1,65 @@ +'use client'; +import _ from 'lodash'; +import React, { Suspense } from 'react'; +import Logger from 'js-logger'; +import { PowerSyncContext } from '@journeyapps/powersync-react'; +import { WASQLitePowerSyncDatabaseOpenFactory } from '@journeyapps/powersync-sdk-web'; +import { AppSchema } from '@/library/powersync/AppSchema'; +import { SupabaseConnector } from '@/library/powersync/SupabaseConnector'; +import { useRouter } from 'next/navigation'; +import { CircularProgress } from '@mui/material'; + +const SupabaseContext = React.createContext(null); +export const useSupabase = () => React.useContext(SupabaseContext); + +export const SystemProvider = ({ children }: { children: React.ReactNode }) => { + const [connector] = React.useState(new SupabaseConnector()); + const [powerSync] = React.useState( + new WASQLitePowerSyncDatabaseOpenFactory({ + dbFilename: 'example.db', + schema: AppSchema, + flags: { + // This is disabled once CSR+SSR functionality is verified to be working correctly + disableSSRWarning: true + } + }).getInstance() + ); + + const router = useRouter(); + + React.useEffect(() => { + // Linting thinks this is a hook due to it's name + Logger.useDefaults(); // eslint-disable-line + Logger.setLevel(Logger.DEBUG); + + //@ts-ignore For console testing purposes + window._powersync = powerSync; + powerSync.init(); + + const l = connector.registerListener({ + initialized: () => { + if (!connector.currentSession) { + router.push('/auth/login'); + return; + } + }, + sessionStarted: () => { + powerSync.connect(connector); + } + }); + + connector.init(); + + return () => l?.(); + }, [powerSync, connector, router]); + + return ( + }> + + {children} + + + ); +}; + +export default SystemProvider; diff --git a/demos/powersync-nextjs-demo/src/components/providers/ThemeProviderContainer.tsx b/demos/powersync-nextjs-demo/src/components/providers/ThemeProviderContainer.tsx new file mode 100644 index 00000000..46310325 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/providers/ThemeProviderContainer.tsx @@ -0,0 +1,21 @@ +'use client'; +import React from 'react'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; + +export const ThemeProviderContainer: React.FC> = ({ children }) => { + const theme = React.useMemo(() => { + return createTheme({ + palette: { + mode: 'dark', + primary: { + main: '#c44eff' + } + }, + typography: { + fontFamily: 'Rubik, sans-serif' + } + }); + }, []); + + return {children}; +}; diff --git a/demos/powersync-nextjs-demo/src/components/widgets/ListItemWidget.tsx b/demos/powersync-nextjs-demo/src/components/widgets/ListItemWidget.tsx new file mode 100644 index 00000000..f61fa0f6 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/widgets/ListItemWidget.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { ListItem, IconButton, ListItemAvatar, Avatar, ListItemText, Box, Paper, styled } from '@mui/material'; + +import DeleteIcon from '@mui/icons-material/DeleteOutline'; +import RightIcon from '@mui/icons-material/ArrowRightAlt'; +import ListIcon from '@mui/icons-material/ListAltOutlined'; + +export type ListItemWidgetProps = { + title: string; + description: string; + onDelete: () => void; + onPress: () => void; +}; + +export const ListItemWidget: React.FC = (props) => { + return ( + + + { + props.onDelete(); + }} + > + + + { + props.onPress(); + }} + > + + + + } + > + + + + + + + + + ); +}; + +export namespace S { + export const MainPaper = styled(Paper)` + margin-bottom: 10px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/components/widgets/LoginDetailsWidget.tsx b/demos/powersync-nextjs-demo/src/components/widgets/LoginDetailsWidget.tsx new file mode 100644 index 00000000..ce691d6d --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/widgets/LoginDetailsWidget.tsx @@ -0,0 +1,167 @@ +'use client'; +import React from 'react'; +import { Box, Button, ButtonGroup, FormGroup, Paper, TextField, Typography, styled } from '@mui/material'; +import { Formik, FormikErrors } from 'formik'; +import Image from 'next/image'; + +export type LoginDetailsFormValues = { + email: string; + password: string; +}; + +export type LoginAction = { + title: string; + onClick: (values: LoginDetailsFormValues) => any; +}; + +export type LoginDetailsWidgetProps = { + title: string; + secondaryActions: LoginAction[]; + onSubmit: (values: LoginDetailsFormValues) => any; + submitTitle: string; +}; + +export const LoginDetailsWidget: React.FC = (props) => { + return ( + + + {props.title} + + + + + + initialValues={{ email: '', password: '' }} + validateOnChange={false} + validateOnBlur={false} + validate={(values) => { + const errors: FormikErrors = {}; + if (!values.email) { + errors.email = 'Required'; + } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.email)) { + errors.email = 'Invalid email address'; + } + + if (!values.password) { + errors.password = 'Required'; + } + return errors; + }} + onSubmit={async (values, { setSubmitting, setFieldError }) => { + try { + await props.onSubmit(values); + } catch (ex: any) { + console.error(ex); + setSubmitting(false); + setFieldError('password', ex.message); + } + }} + > + {({ values, errors, handleChange, handleBlur, isSubmitting, handleSubmit }) => ( +
+ + + + + + {props.secondaryActions.map((action) => { + return ( + + ); + })} + + +
+ )} + +
+
+ ); +}; + +namespace S { + export const MainContainer = styled(Box)` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; + `; + + export const LoginContainer = styled(Paper)` + width: 100%; + padding: 20px; + display: flex; + flex-grow: 1; + flex-direction: column; + justify-content: center; + + ${(props) => props.theme.breakpoints.up('sm')} { + flex-grow: 0; + max-width: 600px; + } + `; + + export const LoginHeader = styled(Typography)` + margin-bottom: 20px; + `; + + export const LogoBox = styled(Box)` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 40px; + `; + + export const Logo = styled(Image)` + // Next/Image requires this + width: auto; + height: auto; + margin-bottom: 10px; + `; + + export const ActionButtonGroup = styled(ButtonGroup)` + margin-top: 20px; + width: 100%; + display: flex; + justify-content: end; + `; + + export const TextInput = styled(TextField)` + margin-bottom: 20px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/components/widgets/TodoItemWidget.tsx b/demos/powersync-nextjs-demo/src/components/widgets/TodoItemWidget.tsx new file mode 100644 index 00000000..d52d3719 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/components/widgets/TodoItemWidget.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { ListItem, IconButton, ListItemAvatar, ListItemText, Box, styled, Paper } from '@mui/material'; + +import DeleteIcon from '@mui/icons-material/DeleteOutline'; +import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank'; +import CheckBoxIcon from '@mui/icons-material/CheckBox'; + +export type TodoItemWidgetProps = { + description: string; + isComplete: boolean; + onDelete: () => void; + toggleCompletion: () => void; +}; + +export const TodoItemWidget: React.FC = (props) => { + return ( + + + { + props.onDelete(); + }} + > + + + + } + > + + { + props.toggleCompletion(); + }} + > + {props.isComplete ? : } + + + + + + ); +}; + +namespace S { + export const MainPaper = styled(Paper)` + margin-bottom: 10px; + `; +} diff --git a/demos/powersync-nextjs-demo/src/library/powersync/AppSchema.ts b/demos/powersync-nextjs-demo/src/library/powersync/AppSchema.ts new file mode 100644 index 00000000..c8817f3e --- /dev/null +++ b/demos/powersync-nextjs-demo/src/library/powersync/AppSchema.ts @@ -0,0 +1,49 @@ +import { Column, ColumnType, Index, IndexedColumn, Schema, Table } from '@journeyapps/powersync-sdk-web'; + +// TODO look into template app composition + +export interface ListRecord { + id: string; + name: string; + created_at: string; + owner_id?: string; +} + +export interface TodoRecord { + id: string; + created_at: string; + completed: boolean; + description: string; + completed_at?: string; + + created_by: string; + completed_by?: string; + list_id: string; +} + +export const LISTS_TABLE = 'lists'; +export const TODOS_TABLE = 'todos'; + +export const AppSchema = new Schema([ + new Table({ + name: TODOS_TABLE, + columns: [ + new Column({ name: 'list_id', type: ColumnType.TEXT }), + new Column({ name: 'created_at', type: ColumnType.TEXT }), + new Column({ name: 'completed_at', type: ColumnType.TEXT }), + new Column({ name: 'description', type: ColumnType.TEXT }), + new Column({ name: 'completed', type: ColumnType.INTEGER }), + new Column({ name: 'created_by', type: ColumnType.TEXT }), + new Column({ name: 'completed_by', type: ColumnType.TEXT }) + ], + indexes: [new Index({ name: 'list', columns: [new IndexedColumn({ name: 'list_id' })] })] + }), + new Table({ + name: LISTS_TABLE, + columns: [ + new Column({ name: 'created_at', type: ColumnType.TEXT }), + new Column({ name: 'name', type: ColumnType.TEXT }), + new Column({ name: 'owner_id', type: ColumnType.TEXT }) + ] + }) +]); diff --git a/demos/powersync-nextjs-demo/src/library/powersync/SupabaseConnector.ts b/demos/powersync-nextjs-demo/src/library/powersync/SupabaseConnector.ts new file mode 100644 index 00000000..2254ce63 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/library/powersync/SupabaseConnector.ts @@ -0,0 +1,183 @@ +import { + AbstractPowerSyncDatabase, + BaseObserver, + CrudEntry, + PowerSyncBackendConnector, + UpdateType +} from '@journeyapps/powersync-sdk-web'; + +import { SupabaseClient, createClient, Session, PostgrestError } from '@supabase/supabase-js'; + +export type SupabaseConfig = { + supabaseUrl: string; + supabaseAnonKey: string; + powersyncUrl: string; +}; + +/// Postgres Response codes that we cannot recover from by retrying. +const FATAL_RESPONSE_CODES = [ + // Class 22 — Data Exception + // Examples include data type mismatch. + new RegExp('^22...$'), + // Class 23 — Integrity Constraint Violation. + // Examples include NOT NULL, FOREIGN KEY and UNIQUE violations. + new RegExp('^23...$'), + // INSUFFICIENT PRIVILEGE - typically a row-level security violation + new RegExp('^42501$') +]; + +export type SupabaseConnectorListener = { + initialized: () => void; + sessionStarted: (session: Session) => void; +}; + +export class SupabaseConnector extends BaseObserver implements PowerSyncBackendConnector { + private _client: SupabaseClient | null; + private _config: SupabaseConfig | null; + + ready: boolean; + + currentSession: Session | null; + + constructor() { + super(); + this._client = null; + this._config = null; + this.currentSession = null; + this.ready = false; + } + + get client(): SupabaseClient { + if (!this._client) { + throw new Error('Supabase client has not been initialized yet'); + } + return this._client; + } + + get config(): SupabaseConfig { + if (!this._config) { + throw new Error('Supabase client has not been initialized yet'); + } + return this._config; + } + + async init() { + if (this.ready) { + return; + } + + const credentialsResponse = await fetch('/api/supabase'); + // TODO Handle errors here if necessary + this._config = await credentialsResponse.json(); + this._client = createClient(this.config.supabaseUrl, this.config.supabaseAnonKey, { + auth: { + persistSession: true + } + }); + const sessionResponse = await this.client.auth.getSession(); + this.updateSession(sessionResponse.data.session); + + this.ready = true; + this.iterateListeners((cb) => cb.initialized?.()); + } + + async login(username: string, password: string) { + const { + data: { session }, + error + } = await this.client.auth.signInWithPassword({ + email: username, + password: password + }); + + if (error) { + throw error; + } + + this.updateSession(session); + } + + async fetchCredentials() { + const { + data: { session }, + error + } = await this.client.auth.getSession(); + + if (!session || error) { + throw new Error(`Could not fetch Supabase credentials: ${error}`); + } + + console.debug('session expires at', session.expires_at); + + return { + client: this.client, + endpoint: this.config.powersyncUrl, + token: session.access_token ?? '', + expiresAt: session.expires_at ? new Date(session.expires_at * 1000) : undefined + }; + } + + async uploadData(database: AbstractPowerSyncDatabase): Promise { + const transaction = await database.getNextCrudTransaction(); + + if (!transaction) { + return; + } + + let lastOp: CrudEntry | null = null; + try { + // Note: If transactional consistency is important, use database functions + // or edge functions to process the entire transaction in a single call. + for (let op of transaction.crud) { + lastOp = op; + const table = this.client.from(op.table); + let result: any; + switch (op.op) { + case UpdateType.PUT: + const record = { ...op.opData, id: op.id }; + result = await table.upsert(record); + break; + case UpdateType.PATCH: + result = await table.update(op.opData).eq('id', op.id); + break; + case UpdateType.DELETE: + result = await table.delete().eq('id', op.id); + break; + } + + if (result.error) { + console.error(result.error); + throw new Error(`Could not update Supabase. Received error: ${result.error.message}`); + } + } + + await transaction.complete(); + } catch (ex: any) { + console.debug(ex); + if (typeof ex.code == 'string' && FATAL_RESPONSE_CODES.some((regex) => regex.test(ex.code))) { + /** + * Instead of blocking the queue with these errors, + * discard the (rest of the) transaction. + * + * Note that these errors typically indicate a bug in the application. + * If protecting against data loss is important, save the failing records + * elsewhere instead of discarding, and/or notify the user. + */ + console.error(`Data upload error - discarding ${lastOp}`, ex); + await transaction.complete(); + } else { + // Error may be retryable - e.g. network error or temporary server error. + // Throwing an error here causes this call to be retried after a delay. + throw ex; + } + } + } + + updateSession(session: Session | null) { + this.currentSession = session; + if (!session) { + return; + } + this.iterateListeners((cb) => cb.sessionStarted?.(session)); + } +} diff --git a/demos/powersync-nextjs-demo/src/service-worker/index.ts b/demos/powersync-nextjs-demo/src/service-worker/index.ts new file mode 100644 index 00000000..a4601bf7 --- /dev/null +++ b/demos/powersync-nextjs-demo/src/service-worker/index.ts @@ -0,0 +1,23 @@ +/** + * This can contain custom Service worker logic use in addition to the + * autogenerated next-pwa worker logic. + */ + +/** + * This adds a test event handler which will clear all Cached + * resources. + * + * HOW TO TEST THIS? + * Run this in your browser console: + * window.navigator.serviceWorker.controller.postMessage({command: '_clear_all_caches'}) + * OR use next-pwa injected workbox object + * window.workbox.messageSW({command: '_clear_all_caches'}) + */ +self.addEventListener('message', (event) => { + if (event?.data.command == '_clear_all_caches') { + console.log('clearing caches'); + caches.keys().then(function (names) { + for (let name of names) caches.delete(name); + }); + } +}); diff --git a/demos/powersync-nextjs-demo/tailwind.config.js b/demos/powersync-nextjs-demo/tailwind.config.js new file mode 100644 index 00000000..c7e8a3d1 --- /dev/null +++ b/demos/powersync-nextjs-demo/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', // Note the addition of the `app` directory. + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + + // Or if using `src` directory: + './src/**/*.{js,ts,jsx,tsx,mdx}' + ], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/demos/powersync-nextjs-demo/tsconfig.json b/demos/powersync-nextjs-demo/tsconfig.json new file mode 100644 index 00000000..d6e07792 --- /dev/null +++ b/demos/powersync-nextjs-demo/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "es6", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"], + "references": [ + { + "path": "../../packages/powersync-sdk-web" + } + ] +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/.env.local.template b/demos/powersync-supabase-yjs-text-collab-demo/.env.local.template new file mode 100644 index 00000000..63d2a5ae --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/.env.local.template @@ -0,0 +1,3 @@ +SUPABASE_URL= +SUPABASE_ANON_KEY= +POWERSYNC_URL= \ No newline at end of file diff --git a/demos/powersync-supabase-yjs-text-collab-demo/.eslintrc.json b/demos/powersync-supabase-yjs-text-collab-demo/.eslintrc.json new file mode 100644 index 00000000..32d9e5e3 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" + } \ No newline at end of file diff --git a/demos/powersync-supabase-yjs-text-collab-demo/.gitignore b/demos/powersync-supabase-yjs-text-collab-demo/.gitignore new file mode 100644 index 00000000..ca7344dd --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +*.pem + +# debug +npm-debug.log* +yarn-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# ide +.idea +.fleet +.vscode + +# supabase +supabase/.branches/* +supabase/.temp/* \ No newline at end of file diff --git a/demos/powersync-supabase-yjs-text-collab-demo/CHANGELOG.md b/demos/powersync-supabase-yjs-text-collab-demo/CHANGELOG.md new file mode 100644 index 00000000..88d8865c --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/CHANGELOG.md @@ -0,0 +1,8 @@ +# @journeyapps/powersync-yjs-text-collab-demo + +## 0.0.2 + +### Patch Changes + +- Updated dependencies [d20386c] + - @journeyapps/powersync-sdk-web@0.2.0 diff --git a/demos/powersync-supabase-yjs-text-collab-demo/LICENSE b/demos/powersync-supabase-yjs-text-collab-demo/LICENSE new file mode 100644 index 00000000..1625c179 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. \ No newline at end of file diff --git a/demos/powersync-supabase-yjs-text-collab-demo/README.md b/demos/powersync-supabase-yjs-text-collab-demo/README.md new file mode 100644 index 00000000..e3a01c65 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/README.md @@ -0,0 +1,154 @@ +# PowerSync Yjs Document Collaboration Demo + +This is a simple CRDT text collaboration demo powered by [Yjs](https://github.com/yjs/yjs) and [Tiptap](https://tiptap.dev/) which uses [PowerSync](https://www.powersync.com/) as both the persistence and connection provider. This means that the Yjs CRDT data structures are stored in Postgres. Conflicts are automatically resolved using CRDTs. + +https://github.com/powersync-ja/powersync-web-sdk/assets/93317/fc0c2b2f-feb7-441b-895a-94893db46563 + +This demo is built using [Next.js](https://nextjs.org/) and the [PowerSync JS web SDK](https://docs.powersync.com/client-sdk-references/js-web). + + +## Setup Instructions + +### 1. Install dependencies + +In the repo directory, use [pnpm](https://pnpm.io/installation) to install dependencies: + +```bash +pnpm install +pnpm build:packages +``` + + +### 2. Create project on Supabase and set up Postgres + +This demo app uses Supabase as its Postgres database and backend: + +1. [Create a new project on the Supabase dashboard](https://supabase.com/dashboard/projects). +2. Go to the Supabase SQL Editor for your new project and execute the SQL statements in [`database.sql`](database.sql) to create the database schema, database functions, and publication needed for PowerSync. + + +### 3. Auth setup and Supabase edge functions + +For ease of demoing, this demo app uses anonymous authentication. The below instructions are derived from the [powersync-jwks-example README](https://github.com/powersync-ja/powersync-jwks-example): + +1. Install [Deno](https://deno.com/) and [Supabase CLI](https://supabase.com/docs/guides/cli/getting-started) if you don't have them already. +2. Clone the [powersync-jwks-example](https://github.com/powersync-ja/powersync-jwks-example) repo. +3. In the [powersync-jwks-example](https://github.com/powersync-ja/powersync-jwks-example) repo directory, run the script to generate a keypair: + +```bash +deno run generate-keys.ts +``` + +4. Then use `supabase secrets set` as shown in the terminal output to update the generated keys on Supabase (`POWERSYNC_PUBLIC_KEY` and `POWERSYNC_PRIVATE_KEY`). You will need the project ref of the Supabase project you created previously. +5. Switch back to the [powersync-supabase-yjs-text-collab-demo](https://github.com/powersync-ja/powersync-supabase-yjs-text-collab-demo) repo directory and deploy the `powersync-jwks` and `powersync-auth-anonymous` edge functions to Supabase: (Note that the Supabase CLI requires [Docker Desktop](https://docs.docker.com/desktop/) to be installed for this step) + + +```bash +supabase functions deploy --no-verify-jwt powersync-jwks +supabase functions deploy powersync-auth-anonymous +``` + + +### 4. Create new project on PowerSync and connect to Supabase/Postgres + +If you don't have a PowerSync account yet, [sign up here](https://accounts.journeyapps.com/portal/free-trial?powersync=true). + +Then, in the [PowerSync dashboard](https://powersync.journeyapps.com/), create a new PowerSync instance: +1. Right-click on 'PowerSync Project' in the project tree on the left and click "Create new instance" +2. Pick a name for the instance e.g. "Yjs Demo Test" and proceed. +3. In the "Edit Instance" dialog that follows, click on the "Connections" tab. +4. Click on the "+" button to create a new database connection. +5. Input the credentials from the project you created in Supabase. In the Supabase dashboard, under your project you can go to "Project Settings" and then "Database" and choose "URI" under "Connection string", untick the "Use connection pooling" option, and then copy & paste the connection string into the PowerSync dashboard "URI" field, and then enter your database password at the "Password" field. +6. Click the "Test connection" button and you should see "Connection success!" +7. Click on the "Credentials" tab of the "Edit Instance" dialog. +8. Tick the "Use Supabase Auth" checkbox +9. Enter the URL of your `powersync-jwks` edge function at the "JWKS URI" field. It should be in the format `https://.supabase.co/functions/v1/powersync-jwks`. If needed, you can find the URL in the Supabase dashboard by going to your project and then to "Edge Functions". +10. Click "Save" to save all the changes to your PowerSync instance. The instance will now be deployed — this may take a minute or two. + + +### 5. Set `POWERSYNC_URL` secret on Supabase + +1. Now that your PowerSync instance is created, you should see a URL for it on the right side of the PowerSync dashboard in the "Deploy logs" panel. Click the button next to the URL to copy it. +2. Use the copied value to set the `POWERSYNC_URL` secret to be used by your Supabase edge functions: (make sure there is no trailing slash at the end of the URL) + +`supabase secrets set POWERSYNC_URL=https://.powersync.journeyapps.com` + + +### 6. Create Sync Rules on PowerSync + +1. Open the [`sync-rules.yaml`](sync-rules.yaml) in this repo and copy the contents. +2. In the [PowerSync dashboard](https://powersync.journeyapps.com/), paste that into the 'sync-rules.yaml' editor panel. +3. Click the "Deploy sync rules" button and select your PowerSync instance from the drop-down list. + + +### 7. Set up local environment variables + +To set up the environment variables for the demo Next.js app: + +1. Copy the `.env.local.template` file to `.env.local`: + +```bash +cp .env.local.template .env.local +``` + +2. Edit `.env.local` and populate the relevant values: + - Set `SUPABASE_URL` to your Supabase project URL. You can find this by going to the main page for the project on the Supabase dashboard and then look for "Project URL" in the "Project API" panel. + - Set `SUPABASE_ANON_KEY` to your Supabase API key. This can be found right below the Project URL on the Supabase dashboard. + - Set `POWERSYNC_URL` to your PowerSync instance URL (this is the same URL from step 5) + + +### 8. Run the demo app + +In the repo directory, run the following to start the development server: + +```bash +pnpm watch +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to try out the demo. + +To try out the collaborative editing, copy and paste the URL of the page and open it in another browser (or another browser window). + +295090638-a55d5ee5-0da9-4ab6-a584-1741fb97de9f + + +### (Optional) Supabase edge function for merging document updates + +The more edits are made to a document, the longer the Yjs CRDT update history becomes. There is currently a [very basic edge function](supabase/functions/merge-document-updates/index.ts) available to merge updates into a single update row. + +You can deploy it using the following command: + +```bash +supabase functions deploy merge-document-updates +``` + +And invoke it using the Supabase CLI: + +```bash +curl -L -X POST 'https://.supabase.co/functions/v1/merge-document-updates' -H 'Authorization: Bearer [anon-key]' --data '{"document_id":"[document-id]"}' +``` +Replace `` with your Supabase project ref, `[anon-key]` with your Supabase API key, and `[document-id]` with the UUID of the document (found in the URL of the specific document you're editing the demo app). + + +Note that this is not a production-grade implementation of merging updates – the current implementation will have race conditions and is only a PoC for development/testing. + + +## Demo App Roadmap + +To-do +- [ ] Add user sessions. For ease of demoing, still allow anonymously signing in (perhaps using [this Supabase workaround](https://github.com/supabase/gotrue/issues/68)), but keep track of session data so that each user has a unique `user_id` which we can associate with edits to the document. +- [ ] Improve sync rules: Use a many-to-many relationship between users and documents, so that all documents and their updates are not synced to all users. Dependent on user sessions. +- [ ] Add suggested RLS rules for Supabase. Dependent on user sessions. +- [ ] Add live cursor support; allow user to set their name, prepopulate with auto-generated name if none set. Dependent on user sessions. +- [ ] Show PowerSync connection status; allow user to toggle offline/online for testing purposes +- [ ] Add button to the UI allowing the user to merge the Yjs edits i.e. `document_update` rows. Invoke `merge-document-updates` edge function in Supabase. +- [ ] Prepopulate sample text into newly created documents. +- [ ] Improve performance / rework inefficient parts of implementation: + - [ ] Optimize the 'seen updates' approach to filter the `SELECT` query for updates that have not yet been seen — perhaps based on `created_at` timestamp generated on the Postgres side. For the watch query — watch for certain tables instead of watching a query. This will allow querying `document_updates` with a dynamic parameter. + - [ ] Flush 'seen updates' when `document_updates` are merged. + +Done +- [x] Show number of edits (rows in `document_updates`) on the document +- [x] For ease of demoing, when the user hits the root page, either generate a new random document UUID and redirect the user to that document, or redirect to last viewed document ID if any (ID stored in local storage). +- [x] Add function to merge document updates; can be invoked if number of `document_updates` becomes too large (currently a row is created in `document_updates` for every edit/update from the Yjs document) + diff --git a/demos/powersync-supabase-yjs-text-collab-demo/database.sql b/demos/powersync-supabase-yjs-text-collab-demo/database.sql new file mode 100644 index 00000000..ecc41e43 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/database.sql @@ -0,0 +1,38 @@ + +-- tables +CREATE TABLE documents( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + title VARCHAR(255), + created_at timestamptz DEFAULT now() +); + +CREATE TABLE document_updates( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + created_at timestamptz DEFAULT now(), + document_id UUID, + update_data BYTEA +); + + +-- publication for powersync +DROP PUBLICATION IF EXISTS powersync; +CREATE PUBLICATION powersync FOR TABLE documents, document_updates; + + +-- database functions +CREATE OR REPLACE FUNCTION get_document_update_data(document_id uuid) RETURNS text as $$ + SELECT JSON_AGG(update_data) as updates FROM document_updates WHERE document_id=$1; +$$ LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION insert_document_updates(batch TEXT) +RETURNS VOID AS $$ +BEGIN + INSERT INTO document_updates (id, document_id, update_data) + SELECT + (elem->>'id')::UUID, + (elem->>'document_id')::UUID, + decode(elem->>'update_b64', 'base64') + FROM json_array_elements(batch::json) AS elem + ON CONFLICT (id) DO NOTHING; +END; +$$ LANGUAGE plpgsql; diff --git a/demos/powersync-supabase-yjs-text-collab-demo/next.config.js b/demos/powersync-supabase-yjs-text-collab-demo/next.config.js new file mode 100644 index 00000000..ec228a38 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/next.config.js @@ -0,0 +1,30 @@ +const withImages = require('next-images'); +const path = require('path'); + +module.exports = withImages({ + images: { + disableStaticImages: true + }, + webpack: (config, { isServer }) => { + if (isServer) { + return config; + } + return { + ...config, + module: { + ...config.module, + rules: [ + ...config.module.rules, + { + test: /\.css/, + use: ['style-loader', 'css-loader'] + }, + { + test: /\.scss/, + use: ['style-loader', 'css-loader', 'sass-loader'] + } + ] + } + }; + } +}); diff --git a/demos/powersync-supabase-yjs-text-collab-demo/package.json b/demos/powersync-supabase-yjs-text-collab-demo/package.json new file mode 100644 index 00000000..a26c3588 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/package.json @@ -0,0 +1,70 @@ +{ + "name": "@journeyapps/powersync-yjs-text-collab-demo", + "version": "0.0.2", + "private": true, + "scripts": { + "build": "next build", + "clean": "rm -rf .next", + "watch": "next dev", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@fontsource/roboto": "^5.0.8", + "@journeyapps/powersync-react": "workspace:*", + "@journeyapps/powersync-sdk-web": "workspace:*", + "@journeyapps/wa-sqlite": "~0.1.1", + "@lexical/react": "^0.11.1", + "@mui/icons-material": "^5.15.8", + "@mui/material": "^5.15.7", + "@mui/x-data-grid": "^6.19.3", + "@supabase/supabase-js": "^2.39.3", + "@tiptap/extension-collaboration": "2.2.2", + "@tiptap/extension-collaboration-cursor": "2.2.2", + "@tiptap/extension-highlight": "2.2.2", + "@tiptap/extension-task-item": "2.2.2", + "@tiptap/extension-task-list": "2.2.2", + "@tiptap/react": "2.2.2", + "@tiptap/starter-kit": "2.2.2", + "d3": "^7.8.5", + "fast-glob": "^3.3.2", + "formik": "^2.4.5", + "highlight.js": "^11.9.0", + "js-logger": "^1.6.1", + "lato-font": "^3.0.0", + "lexical": "^0.11.3", + "lib0": "^0.2.88", + "lodash": "^4.17.21", + "lowlight": "^2.9.0", + "next": "14.1.0", + "next-images": "1.8.5", + "react": "^18", + "react-dom": "^18", + "remixicon": "^2.5.0", + "shiki": "^0.10.0", + "simplify-js": "^1.2.4", + "uuid": "9.0.1", + "y-prosemirror": "1.0.20", + "yjs": "^13.6.11" + }, + "devDependencies": { + "@types/lodash": "^4.14.202", + "@types/node": "^20.11.16", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@types/uuid": "9.0.8", + "autoprefixer": "^10.4.17", + "babel-loader": "^9.1.3", + "css-loader": "^6.10.0", + "eslint": "^8", + "eslint-config-next": "14.0.0", + "postcss": "^8.4.35", + "sass": "^1.49.7", + "sass-loader": "^13.3.3", + "style-loader": "^3.3.4", + "supabase": "1.142.2", + "tailwindcss": "^3.4.1" + } +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/postcss.config.js b/demos/powersync-supabase-yjs-text-collab-demo/postcss.config.js new file mode 100644 index 00000000..5cbc2c7d --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/api/supabase/route.ts b/demos/powersync-supabase-yjs-text-collab-demo/src/app/api/supabase/route.ts new file mode 100644 index 00000000..6eeac5e0 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/api/supabase/route.ts @@ -0,0 +1,19 @@ +import { SupabaseConfig } from '@/library/powersync/SupabaseConnector'; + +import { NextRequest, NextResponse } from 'next/server'; + +/** + * This route exposes Supabase credentials to the client. + */ +export async function GET(request: NextRequest): Promise> { + return NextResponse.json( + { + supabaseUrl: process.env.SUPABASE_URL || '', + supabaseAnonKey: process.env.SUPABASE_ANON_KEY || '', + powersyncUrl: process.env.POWERSYNC_URL || '' + }, + { + status: 200 + } + ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/page.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/page.tsx new file mode 100644 index 00000000..4a81bba9 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/page.tsx @@ -0,0 +1,92 @@ +'use client'; + +import { usePowerSync, usePowerSyncWatchedQuery } from '@journeyapps/powersync-react'; +import { Box, Container, Typography } from '@mui/material'; +import { useEffect, useMemo, useState } from 'react'; + +import MenuBar from '@/components/widgets/MenuBar'; +import { PowerSyncYjsProvider } from '@/library/powersync/PowerSyncYjsProvider'; +import Collaboration from '@tiptap/extension-collaboration'; +import Highlight from '@tiptap/extension-highlight'; +import TaskItem from '@tiptap/extension-task-item'; +import TaskList from '@tiptap/extension-task-list'; +import { EditorContent, useEditor } from '@tiptap/react'; +import StarterKit from '@tiptap/starter-kit'; +import * as Y from 'yjs'; +import './tiptap-styles.scss'; + +export default function EditorPage({ params }: { params: { document_id: string } }) { + const powerSync = usePowerSync(); + const documentId = params.document_id; + + // cache the last edited document ID in local storage + if (window.localStorage.getItem('lastDocumentId') != documentId) { + window.localStorage.setItem('lastDocumentId', documentId); + } + + const [totalDocUpdates, setTotalDocUpdates] = useState(0); + + const ydoc = useMemo(() => { + return new Y.Doc(); + }, [params.document_id]); + + useEffect(() => { + const provider = new PowerSyncYjsProvider(ydoc, powerSync, documentId); + return () => { + provider.destroy(); + }; + }, [ydoc, powerSync]); + + // watch for total number of document updates changing to update the counter + const docUpdatesCount = usePowerSyncWatchedQuery( + 'SELECT COUNT(*) as total_updates FROM document_updates WHERE document_id=?', + [documentId] + ); + useMemo(() => { + if (docUpdatesCount.length > 0) setTotalDocUpdates(docUpdatesCount[0].total_updates); + }, [docUpdatesCount]); + + // tiptap editor setup + const editor = useEditor({ + extensions: [ + StarterKit.configure({ + history: false + }), + Highlight, + TaskList, + TaskItem, + Collaboration.configure({ + document: ydoc + }) + ] + }); + + return ( + + +

PowerSync Yjs CRDT Document Collaboration Demo

+

+ Edit text below and it will sync in to other users who have this page URL open in their browser. Conflicts are + automatically resolved using CRDTs. Powered by{' '} + + Yjs + {' '} + and{' '} + + Tiptap + + . +

+
+
+ {editor && } + +
+ + + {totalDocUpdates} total edit(s) in this document. + + +
+ ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/tiptap-styles.scss b/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/tiptap-styles.scss new file mode 100644 index 00000000..21bbabb2 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/editor/[document_id]/tiptap-styles.scss @@ -0,0 +1,207 @@ +/* Basic editor styles */ +.tiptap { + outline: 1px solid #eee; + border-radius: 1px; + margin: 0; + padding: 20px; + + > * + * { + margin-top: 0.75em; + } + + ul, + ol { + padding: 0 1rem; + } + + p{ + margin: 0; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.1; + } + + code { + background-color: rgba(#616161, 0.1); + color: #616161; + } + + pre { + background: #0d0d0d; + border-radius: 0.5rem; + color: #fff; + font-family: "JetBrainsMono", monospace; + padding: 0.75rem 1rem; + + code { + background: none; + color: inherit; + font-size: 0.8rem; + padding: 0; + } + } + + mark { + background-color: #faf594; + } + + img { + height: auto; + max-width: 100%; + } + + hr { + margin: 1rem 0; + } + + blockquote { + border-left: 2px solid rgba(#0d0d0d, 0.1); + padding-left: 1rem; + } + + hr { + border: none; + border-top: 2px solid rgba(#0d0d0d, 0.1); + margin: 2rem 0; + } + + ul[data-type="taskList"] { + list-style: none; + padding: 0; + + li { + align-items: center; + display: flex; + + > label { + flex: 0 0 auto; + margin-right: 0.5rem; + } + + > div { + flex: 1 1 auto; + } + } + } +} + +.editor { + background-color: #fff; + border: 3px solid #0d0d0d; + border-radius: 0.75rem; + color: #0d0d0d; + display: flex; + flex-direction: column; + max-height: 26rem; + + + &__header { + align-items: center; + background: #0d0d0d; + border-bottom: 3px solid #0d0d0d; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + display: flex; + flex: 0 0 auto; + flex-wrap: wrap; + padding: 0.25rem; + } + + &__content { + flex: 1 1 auto; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + } + + &__footer { + align-items: center; + border-top: 3px solid #0d0d0d; + color: #0d0d0d; + display: flex; + flex: 0 0 auto; + font-size: 12px; + flex-wrap: wrap; + font-weight: 600; + justify-content: space-between; + padding: 0.25rem 0.75rem; + white-space: nowrap; + } + + /* Some information about the status */ + &__status { + align-items: center; + border-radius: 5px; + display: flex; + + &::before { + background: rgba(#0d0d0d, 0.5); + border-radius: 50%; + content: " "; + display: inline-block; + flex: 0 0 auto; + height: 0.5rem; + margin-right: 0.5rem; + width: 0.5rem; + } + + &--connecting::before { + background: #616161; + } + + &--connected::before { + background: #b9f18d; + } + } + + &__name { + button { + background: none; + border: none; + border-radius: 0.4rem; + color: #0d0d0d; + font: inherit; + font-size: 12px; + font-weight: 600; + padding: 0.25rem 0.5rem; + + &:hover { + background-color: #0d0d0d; + color: #fff; + } + } + } +} + +/* Give a remote user a caret */ +.collaboration-cursor__caret { + border-left: 1px solid #0d0d0d; + border-right: 1px solid #0d0d0d; + margin-left: -1px; + margin-right: -1px; + pointer-events: none; + position: relative; + word-break: normal; +} + +/* Render the username above the caret */ +.collaboration-cursor__label { + border-radius: 3px 3px 3px 0; + color: #0d0d0d; + font-size: 12px; + font-style: normal; + font-weight: 600; + left: -1px; + line-height: normal; + padding: 0.1rem 0.3rem; + position: absolute; + top: -1.4em; + user-select: none; + white-space: nowrap; +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/favicon.ico b/demos/powersync-supabase-yjs-text-collab-demo/src/app/favicon.ico new file mode 100644 index 00000000..96be8f92 Binary files /dev/null and b/demos/powersync-supabase-yjs-text-collab-demo/src/app/favicon.ico differ diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/globals.scss b/demos/powersync-supabase-yjs-text-collab-demo/src/app/globals.scss new file mode 100644 index 00000000..f169a8d1 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/globals.scss @@ -0,0 +1,20 @@ +:root { + --foreground-rgb: 0, 0, 0; + --background-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + min-height: 100vh; + margin: 0; + background: var(--background-rgb); + font-family: Lato !important; + font-weight: 400 !important;; +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/layout.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/app/layout.tsx new file mode 100644 index 00000000..31189181 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/layout.tsx @@ -0,0 +1,26 @@ +'use client'; + +import React from 'react'; +import { CssBaseline } from '@mui/material'; + +import { ThemeProviderContainer } from '@/components/providers/ThemeProviderContainer'; +import { DynamicSystemProvider } from '@/components/providers/DynamicSystemProvider'; + +import './globals.scss'; +import 'lato-font'; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + PowerSync Yjs CRDT Text Collaboration Demo + + + + + {children} + + + + ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/page.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/app/page.tsx new file mode 100644 index 00000000..15cf6e38 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/page.tsx @@ -0,0 +1,72 @@ +'use client'; + +import React from 'react'; +import { CircularProgress, Grid, styled } from '@mui/material'; +import { useRouter } from 'next/navigation'; +import { useSupabase } from '@/components/providers/SystemProvider'; + +export default function EntryPage() { + const router = useRouter(); + const connector = useSupabase(); + + React.useEffect(() => { + if (!connector) { + console.error(`No Supabase connector has been created yet.`); + return; + } + + const redirectToDocument = async () => { + // see if there is a cached value of last document edited + let lastDocumentId: string | null = window.localStorage.getItem('lastDocumentId'); + if (lastDocumentId) { + router.push('/editor/' + lastDocumentId); + return; + } + // otherwise, create a new document + const { data, error } = await connector.client + .from('documents') + .insert({ + title: 'Test Document ' + (1000 + Math.floor(Math.random() * 8999)) + }) + .select() + .single(); + + // redirect user to the document + lastDocumentId = data.id; + window.localStorage.setItem('lastDocumentId', lastDocumentId || ''); + router.push('/editor/' + lastDocumentId); + }; + + if (!connector.ready) { + console.log('PowerSync<>Supabase connector not yet ready; registering listener'); + const listener = connector.registerListener({ + initialized: () => { + redirectToDocument(); + } + }); + return () => listener?.(); + } + + redirectToDocument(); + }, []); + + return ( + + + + + + ); +} + +namespace S { + export const CenteredGrid = styled(Grid)` + display: flex; + justify-content: center; + align-items: center; + `; + + export const MainGrid = styled(CenteredGrid)` + min-height: 100vh; + `; +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/app/sql-console/page.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/app/sql-console/page.tsx new file mode 100644 index 00000000..03eaca17 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/app/sql-console/page.tsx @@ -0,0 +1,100 @@ +'use client'; +import React from 'react'; +import { usePowerSyncWatchedQuery } from '@journeyapps/powersync-react'; +import { Box, Button, Grid, TextField, styled } from '@mui/material'; +import { DataGrid } from '@mui/x-data-grid'; + +const DEFAULT_QUERY = 'SELECT * FROM documents'; + +export default function SQLConsolePage() { + const inputRef = React.useRef(); + const [query, setQuery] = React.useState(DEFAULT_QUERY); + const querySQLResult = usePowerSyncWatchedQuery(query); + + const queryDataGridResult = React.useMemo(() => { + const firstItem = querySQLResult?.[0]; + + return { + columns: firstItem + ? Object.keys(firstItem).map((field) => ({ + field, + flex: 1 + })) + : [], + rows: querySQLResult + }; + }, [querySQLResult]); + + return ( + + + + { + const inputValue = inputRef.current?.value; + if (e.key == 'Enter' && inputValue) { + setQuery(inputValue); + } + }} + /> + + + + + + + {queryDataGridResult ? ( + + {queryDataGridResult.columns ? ( + ({ ...r, id: r.id ?? index })) ?? []} + columns={queryDataGridResult.columns} + initialState={{ + pagination: { + paginationModel: { + pageSize: 20 + } + } + }} + pageSizeOptions={[20]} + disableRowSelectionOnClick + /> + ) : null} + + ) : null} + + ); +} + +namespace S { + export const MainContainer = styled(Box)` + padding: 20px; + background-color: #000; + `; + + export const QueryResultContainer = styled(Box)` + margin-top: 40px; + `; + + export const CenteredGrid = styled(Grid)` + display: flex; + justify-content: center; + align-items: center; + `; +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/DynamicSystemProvider.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/DynamicSystemProvider.tsx new file mode 100644 index 00000000..fab797ff --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/DynamicSystemProvider.tsx @@ -0,0 +1,8 @@ +import dynamic from 'next/dynamic'; + +/** + * Only use PowerSync in client side rendering + */ +export const DynamicSystemProvider = dynamic(() => import('./SystemProvider'), { + ssr: false +}); diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/SystemProvider.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/SystemProvider.tsx new file mode 100644 index 00000000..6358015f --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/SystemProvider.tsx @@ -0,0 +1,57 @@ +'use client'; + +import _ from 'lodash'; +import React, { Suspense } from 'react'; +import Logger from 'js-logger'; +import { PowerSyncContext } from '@journeyapps/powersync-react'; +import { WASQLitePowerSyncDatabaseOpenFactory } from '@journeyapps/powersync-sdk-web'; +import { AppSchema } from '@/library/powersync/AppSchema'; +import { SupabaseConnector } from '@/library/powersync/SupabaseConnector'; +import { useRouter } from 'next/navigation'; +import { CircularProgress } from '@mui/material'; + +const SupabaseContext = React.createContext(null); +export const useSupabase = () => React.useContext(SupabaseContext); + +export const SystemProvider = ({ children }: { children: React.ReactNode }) => { + const [connector] = React.useState(new SupabaseConnector()); + const [powerSync] = React.useState( + new WASQLitePowerSyncDatabaseOpenFactory({ + dbFilename: 'powersync2.db', + schema: AppSchema, + flags: { + disableSSRWarning: true + } + }).getInstance() + ); + + const router = useRouter(); + + React.useEffect(() => { + // linting thinks this is a hook due to its name + Logger.useDefaults(); // eslint-disable-line + Logger.setLevel(Logger.DEBUG); + + powerSync.init(); + + const listener = connector.registerListener({ + initialized: () => { + powerSync.connect(connector); + } + }); + + connector.init(); + + return () => listener?.(); + }, [powerSync, connector, router]); + + return ( + }> + + {children} + + + ); +}; + +export default SystemProvider; diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/ThemeProviderContainer.tsx b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/ThemeProviderContainer.tsx new file mode 100644 index 00000000..46310325 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/providers/ThemeProviderContainer.tsx @@ -0,0 +1,21 @@ +'use client'; +import React from 'react'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; + +export const ThemeProviderContainer: React.FC> = ({ children }) => { + const theme = React.useMemo(() => { + return createTheme({ + palette: { + mode: 'dark', + primary: { + main: '#c44eff' + } + }, + typography: { + fontFamily: 'Rubik, sans-serif' + } + }); + }, []); + + return {children}; +}; diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.jsx b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.jsx new file mode 100644 index 00000000..edfb0fe3 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.jsx @@ -0,0 +1,135 @@ +import './MenuBar.scss'; + +import React, { Fragment } from 'react'; + +import MenuItem from './MenuItem.jsx'; + +export default function MenuBar({ editor }) { + const items = [ + { + icon: 'bold', + title: 'Bold', + action: () => editor.chain().focus().toggleBold().run(), + isActive: () => editor.isActive('bold') + }, + { + icon: 'italic', + title: 'Italic', + action: () => editor.chain().focus().toggleItalic().run(), + isActive: () => editor.isActive('italic') + }, + { + icon: 'strikethrough', + title: 'Strike', + action: () => editor.chain().focus().toggleStrike().run(), + isActive: () => editor.isActive('strike') + }, + { + icon: 'code-view', + title: 'Code', + action: () => editor.chain().focus().toggleCode().run(), + isActive: () => editor.isActive('code') + }, + { + icon: 'mark-pen-line', + title: 'Highlight', + action: () => editor.chain().focus().toggleHighlight().run(), + isActive: () => editor.isActive('highlight') + }, + { + type: 'divider' + }, + { + icon: 'h-1', + title: 'Heading 1', + action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), + isActive: () => editor.isActive('heading', { level: 1 }) + }, + { + icon: 'h-2', + title: 'Heading 2', + action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), + isActive: () => editor.isActive('heading', { level: 2 }) + }, + { + icon: 'paragraph', + title: 'Paragraph', + action: () => editor.chain().focus().setParagraph().run(), + isActive: () => editor.isActive('paragraph') + }, + { + icon: 'list-unordered', + title: 'Bullet List', + action: () => editor.chain().focus().toggleBulletList().run(), + isActive: () => editor.isActive('bulletList') + }, + { + icon: 'list-ordered', + title: 'Ordered List', + action: () => editor.chain().focus().toggleOrderedList().run(), + isActive: () => editor.isActive('orderedList') + }, + { + icon: 'list-check-2', + title: 'Task List', + action: () => editor.chain().focus().toggleTaskList().run(), + isActive: () => editor.isActive('taskList') + }, + { + icon: 'code-box-line', + title: 'Code Block', + action: () => editor.chain().focus().toggleCodeBlock().run(), + isActive: () => editor.isActive('codeBlock') + }, + { + type: 'divider' + }, + { + icon: 'double-quotes-l', + title: 'Blockquote', + action: () => editor.chain().focus().toggleBlockquote().run(), + isActive: () => editor.isActive('blockquote') + }, + { + icon: 'separator', + title: 'Horizontal Rule', + action: () => editor.chain().focus().setHorizontalRule().run() + }, + { + type: 'divider' + }, + { + icon: 'text-wrap', + title: 'Hard Break', + action: () => editor.chain().focus().setHardBreak().run() + }, + { + icon: 'format-clear', + title: 'Clear Format', + action: () => editor.chain().focus().clearNodes().unsetAllMarks().run() + }, + { + type: 'divider' + }, + { + icon: 'arrow-go-back-line', + title: 'Undo', + action: () => editor.chain().focus().undo().run() + }, + { + icon: 'arrow-go-forward-line', + title: 'Redo', + action: () => editor.chain().focus().redo().run() + } + ]; + + return ( +
+ {items.map((item, index) => ( + + {item.type === 'divider' ?
: } + + ))} +
+ ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.scss b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.scss new file mode 100644 index 00000000..9f0833d8 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuBar.scss @@ -0,0 +1,7 @@ +.divider { + background-color: rgba(#fff, 0.25); + height: 1.25rem; + margin-left: 0.5rem; + margin-right: 0.75rem; + width: 1px; +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.jsx b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.jsx new file mode 100644 index 00000000..ec22d3a7 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.jsx @@ -0,0 +1,14 @@ +import './MenuItem.scss'; + +import React from 'react'; +import remixiconUrl from 'remixicon/fonts/remixicon.symbol.svg'; + +export default function MenuItem({ icon, title, action, isActive = null }) { + return ( + + ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.scss b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.scss new file mode 100644 index 00000000..c2e2e184 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/components/widgets/MenuItem.scss @@ -0,0 +1,22 @@ +.menu-item { + background-color: transparent; + border: none; + border-radius: 0.4rem; + color: #fff; + cursor: pointer; + height: 1.75rem; + margin-right: 0.25rem; + padding: 0.25rem; + width: 1.75rem; + + svg { + fill: currentColor; + height: 100%; + width: 100%; + } + + &:hover, + &.is-active { + background-color: #303030; + } +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/library/binary-utils.js b/demos/powersync-supabase-yjs-text-collab-demo/src/library/binary-utils.js new file mode 100644 index 00000000..9d84cb15 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/library/binary-utils.js @@ -0,0 +1,33 @@ +export function b64ToUint8Array(base64) { + const asCharCode = (c) => c.charCodeAt(0); + return Uint8Array.from(atob(base64), asCharCode); +} + +export function Uint8ArrayTob64(uint8array) { + const output = []; + for (let i = 0, { length } = uint8array; i < length; i++) output.push(String.fromCharCode(uint8array[i])); + return btoa(output.join('')); +} + +export function Uint8ArrayToHex(uint8array) { + return '\\x' + uint8array.reduce((s, n) => s + n.toString(16).padStart(2, '0'), ''); +} + +export function b64ToHex(str) { + const raw = atob(str); + let result = '\\x'; + for (let i = 0; i < raw.length; i++) { + const hex = raw.charCodeAt(i).toString(16); + result += hex.length === 2 ? hex : '0' + hex; + } + return result; +} + +export function hexToUint8Array(hexString) { + return Uint8Array.from( + hexString + .replace('\\x', '') + .match(/.{1,2}/g) + .map((byte) => parseInt(byte, 16)) + ); +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/AppSchema.ts b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/AppSchema.ts new file mode 100644 index 00000000..7c7db76f --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/AppSchema.ts @@ -0,0 +1,20 @@ +import { Column, ColumnType, Index, IndexedColumn, Schema, Table } from '@journeyapps/powersync-sdk-web'; + +export const AppSchema = new Schema([ + new Table({ + name: 'documents', + columns: [ + new Column({ name: 'title', type: ColumnType.TEXT }), + new Column({ name: 'created_at', type: ColumnType.TEXT }) + ] + }), + new Table({ + name: 'document_updates', + columns: [ + new Column({ name: 'created_at', type: ColumnType.TEXT }), + new Column({ name: 'document_id', type: ColumnType.TEXT }), + new Column({ name: 'update_b64', type: ColumnType.TEXT }) + ], + indexes: [new Index({ name: 'by_document', columns: [new IndexedColumn({ name: 'document_id' })] })] + }) +]); diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/PowerSyncYjsProvider.ts b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/PowerSyncYjsProvider.ts new file mode 100644 index 00000000..d7297bb9 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/PowerSyncYjsProvider.ts @@ -0,0 +1,107 @@ +import * as Y from 'yjs'; + +import { b64ToUint8Array, Uint8ArrayTob64 } from '@/library/binary-utils'; +import { v4 as uuidv4 } from 'uuid'; +import { AbstractPowerSyncDatabase } from '@journeyapps/powersync-sdk-web'; +import { ObservableV2 } from 'lib0/observable'; + +export interface PowerSyncYjsEvents { + /** + * Triggered when document contents have been loaded from the database the first time. + * + * The document data may not have been synced from the PowerSync service at this point. + */ + synced: () => void; +} + +/** + * Configure bidirectional sync for a Yjs document with a PowerSync database. + * + * Updates are stored in the `document_updates` table in the database. + * + * @param ydoc + * @param db + * @param documentId + */ +export class PowerSyncYjsProvider extends ObservableV2 { + private seenDocUpdates = new Set(); + private abortController = new AbortController(); + + constructor( + public readonly doc: Y.Doc, + public readonly db: AbstractPowerSyncDatabase, + public readonly documentId: string + ) { + super(); + + const updates = db.watch('SELECT * FROM document_updates WHERE document_id = ?', [documentId], { + signal: this.abortController.signal + }); + + this._storeUpdate = this._storeUpdate.bind(this); + this.destroy = this.destroy.bind(this); + + let synced = false; + + const watchLoop = async () => { + for await (let results of updates) { + if (this.abortController.signal.aborted) { + break; + } + + // New data detected in the database + for (let update of results.rows!._array) { + // Ignore any updates we've already seen + if (!this.seenDocUpdates.has(update.id)) { + this.seenDocUpdates.add(update.id); + // apply the update from the database to the doc + const origin = this; + Y.applyUpdateV2(doc, b64ToUint8Array(update.update_b64), origin); + } + } + + if (!synced) { + synced = true; + this.emit('synced', []); + } + } + }; + watchLoop(); + + doc.on('updateV2', this._storeUpdate); + doc.on('destroy', this.destroy); + } + + private async _storeUpdate(update: Uint8Array, origin: any) { + if (origin === this) { + // update originated from the database / PowerSync - ignore + return; + } + // update originated from elsewhere - save to the database + const docUpdateId = uuidv4(); + this.seenDocUpdates.add(docUpdateId); + await this.db.execute('INSERT INTO document_updates(id, document_id, update_b64) VALUES(?, ?, ?)', [ + docUpdateId, + this.documentId, + Uint8ArrayTob64(update) + ]); + } + + /** + * Destroy this persistence provider, removing any attached event listeners. + */ + destroy() { + this.abortController.abort(); + this.doc.off('updateV2', this._storeUpdate); + this.doc.off('destroy', this.destroy); + } + + /** + * Delete data associated with this document from the database. + * + * Also call `destroy()` to remove any event listeners and prevent future updates to the database. + */ + async deleteData() { + await this.db.execute('DELETE FROM document_updates WHERE document_id = ?', [this.documentId]); + } +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/SupabaseConnector.ts b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/SupabaseConnector.ts new file mode 100644 index 00000000..e2b5efaa --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/src/library/powersync/SupabaseConnector.ts @@ -0,0 +1,177 @@ +import { + AbstractPowerSyncDatabase, + BaseObserver, + CrudEntry, + PowerSyncBackendConnector, + UpdateType +} from '@journeyapps/powersync-sdk-web'; + +import { + SupabaseClient, + createClient, + PostgrestError, + FunctionsHttpError, + FunctionsRelayError, + FunctionsFetchError +} from '@supabase/supabase-js'; + +export type SupabaseConfig = { + supabaseUrl: string; + supabaseAnonKey: string; + powersyncUrl: string; +}; + +/// Postgres Response codes that we cannot recover from by retrying. +const FATAL_RESPONSE_CODES = [ + // Class 22 — Data Exception + // Examples include data type mismatch. + new RegExp('^22...$'), + // Class 23 — Integrity Constraint Violation. + // Examples include NOT NULL, FOREIGN KEY and UNIQUE violations. + new RegExp('^23...$'), + // INSUFFICIENT PRIVILEGE - typically a row-level security violation + new RegExp('^42501$') +]; + +export type SupabaseConnectorListener = { + initialized: () => void; +}; + +export class SupabaseConnector extends BaseObserver implements PowerSyncBackendConnector { + private _client: SupabaseClient | null; + private _config: SupabaseConfig | null; + + ready: boolean; + + constructor() { + super(); + this._client = null; + this._config = null; + this.ready = false; + } + + get client(): SupabaseClient { + if (!this._client) { + throw new Error('Supabase client has not been initialized yet'); + } + return this._client; + } + + get config(): SupabaseConfig { + if (!this._config) { + throw new Error('Supabase client has not been initialized yet'); + } + return this._config; + } + + async init() { + if (this.ready) { + return; + } + const credentialsResponse = await fetch('/api/supabase'); + this._config = await credentialsResponse.json(); + this._client = createClient(this.config.supabaseUrl, this.config.supabaseAnonKey); + this.ready = true; + this.iterateListeners((cb) => cb.initialized?.()); + } + + async fetchCredentials() { + const { data, error } = await this.client.functions.invoke('powersync-auth-anonymous', { + method: 'GET' + }); + + if (error instanceof FunctionsHttpError) { + const errorMessage = await error.context.json(); + console.log('Supabase edge function returned an error', errorMessage); + } else if (error instanceof FunctionsRelayError) { + console.log('Supabase edge function: Relay error:', error.message); + } else if (error instanceof FunctionsFetchError) { + console.log('Supabase edge function: Fetch error:', error.message); + } + + return { + client: this.client, + endpoint: data.powersync_url, + token: data.token, + expiresAt: undefined + }; + } + + async uploadData(database: AbstractPowerSyncDatabase): Promise { + const batch = await database.getCrudBatch(200); + + if (!batch) { + return; + } + + let updateBatch: any[] = []; + + let lastOp: CrudEntry | null = null; + try { + // Note: If transactional consistency is important, use database functions + // or edge functions to process the entire transaction in a single call. + for (let op of batch.crud) { + lastOp = op; + const table = this.client.from(op.table); + let result: any; + let record: any; + if (op.op == UpdateType.PUT || op.op == UpdateType.PATCH) { + record = { ...op.opData }; + } + + if (op.op == UpdateType.PUT && op.table == 'document_updates') { + updateBatch.push({ + ...record, + id: op.id + }); + continue; + } + + switch (op.op) { + case UpdateType.PUT: + record.id = op.id; + result = await table.upsert(record); + break; + case UpdateType.PATCH: + result = await table.update(record).eq('id', op.id); + break; + case UpdateType.DELETE: + result = await table.delete().eq('id', op.id); + break; + } + + if (result.error) { + console.error(result.error); + throw new Error(`Could not update Supabase. Received error: ${result.error.message}`); + } + } + + if (updateBatch.length > 0) { + console.log('inserting batch of size', updateBatch.length); + const result = await this.client.rpc('insert_document_updates', { batch: JSON.stringify(updateBatch) }); + if (result.error) { + throw new Error(`Could not update Supabase. Received error: ${result.error.message}`); + } + } + + await batch.complete(); + } catch (ex: any) { + console.debug(ex); + if (typeof ex.code == 'string' && FATAL_RESPONSE_CODES.some((regex) => regex.test(ex.code))) { + /** + * Instead of blocking the queue with these errors, discard the (rest of the) transaction. + * + * Note that these errors typically indicate a bug in the application. + * If protecting against data loss is important, save the failing records + * elsewhere instead of discarding, and/or notify the user. + */ + console.error(`Data upload error - discarding ${lastOp}`, ex); + await batch.complete(); + } else { + // Error may be retryable - e.g. network error or temporary server error. + // Throwing an error here causes this call to be retried after a delay. + throw ex; + } + } + } +} diff --git a/demos/powersync-supabase-yjs-text-collab-demo/supabase/config.toml b/demos/powersync-supabase-yjs-text-collab-demo/supabase/config.toml new file mode 100644 index 00000000..eb0b7ab7 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/supabase/config.toml @@ -0,0 +1,149 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "powersync-supabase-yjs-text-collab-demo" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. public and storage are always included. +schemas = ["public", "storage", "graphql_public"] +# Extra schemas to add to the search_path of every request. public is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv6) +# ip_version = "IPv6" + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." + +# Use pre-defined map of phone number to OTP for testing. +[auth.sms.test_otp] +# 4152127777 = "123456" + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" +# Configures S3 bucket URL, eg. .s3-.amazonaws.com +s3_host = "env(S3_HOST)" +# Configures S3 bucket region, eg. us-east-1 +s3_region = "env(S3_REGION)" +# Configures AWS_ACCESS_KEY_ID for S3 bucket +s3_access_key = "env(S3_ACCESS_KEY)" +# Configures AWS_SECRET_ACCESS_KEY for S3 bucket +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/merge-document-updates/index.ts b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/merge-document-updates/index.ts new file mode 100644 index 00000000..5cf8378c --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/merge-document-updates/index.ts @@ -0,0 +1,83 @@ +import { createClient } from 'https://esm.sh/@supabase/supabase-js'; +import * as Y from 'npm:yjs'; + +Deno.serve(async (req) => { + const { document_id } = await req.json(); + const responseHeaders = { 'Content-Type': 'application/json' }; + + let hexToUint8Array = function (hexString) { + return Uint8Array.from( + hexString + .replace('\\x', '') + .match(/.{1,2}/g) + .map((byte) => parseInt(byte, 16)) + ); + }; + let Uint8ArrayToHex = function (uint8array) { + return '\\x' + uint8array.reduce((s, n) => s + n.toString(16).padStart(2, '0'), ''); + }; + + if (!document_id) { + return new Response(JSON.stringify({ error: 'Missing required parameter: document_id' }), { + headers: responseHeaders, + status: 404 + }); + } + + try { + const supabase = createClient(Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', { + global: { headers: { Authorization: req.headers.get('Authorization')! } } + }); + + // use database function that retrieves all document_updates for this document as json (defined in `database.sql` in the repo) + const supabaseRpc = await supabase.rpc('get_document_update_data', { document_id: document_id }); + if (supabaseRpc.error) { + throw new Error(supabaseRpc.error); + } + let docUpdatesHex = JSON.parse(supabaseRpc.data); + let docUpdatesCount = docUpdatesHex.length; + + // recreate the YDoc from all the document_updates rows + const ydoc = new Y.Doc(); + docUpdatesHex.forEach((element) => { + Y.applyUpdateV2(ydoc, hexToUint8Array(element)); + }); + + // encode the current state of the full YDoc into one update + const docState = Y.encodeStateAsUpdateV2(ydoc); + + // delete all existing updates + // TODO: this should be wrapped in a transaction + const supabaseDelete = await supabase.from('document_updates').delete().eq('document_id', document_id); + if (supabaseDelete.error) { + throw new Error(supabaseInsert.error); + } + // insert the new merged update as new single update for the document + const supabaseInsert = await supabase.from('document_updates').insert({ + document_id: document_id, + update_data: Uint8ArrayToHex(docState) + }); + if (supabaseInsert.error) { + throw new Error(supabaseInsert.error); + } + + return new Response( + JSON.stringify({ + success: docUpdatesCount + ' document_updates rows merged for document_id=' + document_id + }), + { + status: 200, + headers: responseHeaders + } + ); + } catch (err) { + return new Response( + JSON.stringify({ error: String(err?.message ?? err) }, { status: 500, headers: responseHeaders }) + ); + } +}); + +/* + To test in terminal: + curl -L -X POST 'https://.supabase.co/functions/v1/merge-document-updates' -H 'Authorization: Bearer [anon-key]' --data '{"document_id":"[document-id]"}' +*/ diff --git a/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-auth-anonymous/index.ts b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-auth-anonymous/index.ts new file mode 100644 index 00000000..f690e6b4 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-auth-anonymous/index.ts @@ -0,0 +1,48 @@ +import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'; +import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts'; +import * as base64 from 'https://deno.land/std@0.196.0/encoding/base64.ts'; + +const powerSyncPrivateKey = JSON.parse( + new TextDecoder().decode(base64.decode(Deno.env.get('POWERSYNC_PRIVATE_KEY')!)) +) as jose.JWK; + +const powerSyncKey = (await jose.importJWK(powerSyncPrivateKey)) as jose.KeyLike; + +const powerSyncUrl = Deno.env.get('POWERSYNC_URL')!; +const supabaseUrl = Deno.env.get('SUPABASE_URL')!; + +serve(async (req: Request) => { + let responseHeaders = { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type' + }; + try { + const token = await new jose.SignJWT({}) + .setProtectedHeader({ + alg: powerSyncPrivateKey.alg!, + kid: powerSyncPrivateKey.kid + }) + .setSubject('anonymous') + .setIssuedAt() + .setIssuer(supabaseUrl) + .setAudience(powerSyncUrl) + .setExpirationTime('5m') + .sign(powerSyncKey); + return new Response( + JSON.stringify({ + token: token, + powersync_url: powerSyncUrl! + }), + { + headers: responseHeaders, + status: 200 + } + ); + } catch (error) { + return new Response(JSON.stringify({ error: error.message }), { + headers: responseHeaders, + status: 500 + }); + } +}); diff --git a/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-jwks/index.ts b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-jwks/index.ts new file mode 100644 index 00000000..661e3a56 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/supabase/functions/powersync-jwks/index.ts @@ -0,0 +1,23 @@ +import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'; + +import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts'; +import * as base64 from 'https://deno.land/std@0.196.0/encoding/base64.ts'; + +const powerSyncPublicKey = JSON.parse( + new TextDecoder().decode(base64.decode(Deno.env.get('POWERSYNC_PUBLIC_KEY')!)) +) as jose.JWK; + +// This function serves the public key. +// PowerSync uses this to verify JWTs generated by the auth function. + +serve((_req) => { + return new Response( + JSON.stringify({ + keys: [ + powerSyncPublicKey + // Additional keys could be added here if desired + ] + }), + { headers: { 'Content-Type': 'application/json' } } + ); +}); diff --git a/demos/powersync-supabase-yjs-text-collab-demo/sync-rules.yaml b/demos/powersync-supabase-yjs-text-collab-demo/sync-rules.yaml new file mode 100644 index 00000000..dde31180 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/sync-rules.yaml @@ -0,0 +1,7 @@ +# Sync-rule docs: https://docs.powersync.co/usage/sync-rules +bucket_definitions: + global: + data: + - SELECT * FROM documents + - SELECT id, document_id, base64(update_data) as update_b64 FROM document_updates + \ No newline at end of file diff --git a/demos/powersync-supabase-yjs-text-collab-demo/tailwind.config.js b/demos/powersync-supabase-yjs-text-collab-demo/tailwind.config.js new file mode 100644 index 00000000..c7e8a3d1 --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', // Note the addition of the `app` directory. + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + + // Or if using `src` directory: + './src/**/*.{js,ts,jsx,tsx,mdx}' + ], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/demos/powersync-supabase-yjs-text-collab-demo/tsconfig.json b/demos/powersync-supabase-yjs-text-collab-demo/tsconfig.json new file mode 100644 index 00000000..6d2ae16a --- /dev/null +++ b/demos/powersync-supabase-yjs-text-collab-demo/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es6", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", "supabase/functions/**/*.ts"], + "references": [ + {"path": "../../packages/powersync-sdk-web"} + ] +} diff --git a/docs/.gitignore b/docs/.gitignore index 1bcb7bbb..b7725f88 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -21,5 +21,6 @@ docs/attachments-sdk/ docs/common-sdk/ docs/react-native-sdk/ docs/react-sdk/ +docs/web-sdk/ .env diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 9f1fb332..4cb0470c 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -69,7 +69,7 @@ const config: Config = { themeConfig: { image: process.env.META_LOGO_URL, navbar: { - title: 'PowerSync React Native SDK', + title: 'PowerSync JS SDKs', logo: { alt: 'PowerSync Logo', src: 'img/powersync-logo.png' diff --git a/docs/utils/packageMap.ts b/docs/utils/packageMap.ts index 123377d3..9b001f0a 100644 --- a/docs/utils/packageMap.ts +++ b/docs/utils/packageMap.ts @@ -2,7 +2,8 @@ enum Packages { ReactNativeSdk = 'react-native-sdk', ReactSdk = 'react-sdk', CommonSdk = 'common-sdk', - AttachmentsSdk = 'attachments-sdk' + AttachmentsSdk = 'attachments-sdk', + WebSdk = 'web-sdk' } interface Package { @@ -45,5 +46,12 @@ export const packageMap: PackageMap = { entryPoints: ['../packages/powersync-attachments/src/index.ts'], tsconfig: '../packages/powersync-attachments/tsconfig.json', id: Packages.AttachmentsSdk + }, + [Packages.WebSdk]: { + name: 'Web SDK', + dirName: Packages.WebSdk, + entryPoints: ['../packages/powersync-sdk-web/src/index.ts'], + tsconfig: '../packages/powersync-sdk-web/tsconfig.json', + id: Packages.WebSdk } }; diff --git a/packages/powersync-sdk-web/CHANGELOG.md b/packages/powersync-sdk-web/CHANGELOG.md new file mode 100644 index 00000000..390dfcad --- /dev/null +++ b/packages/powersync-sdk-web/CHANGELOG.md @@ -0,0 +1,55 @@ +# @journeyapps/powersync-sdk-web + +## 0.2.0 + +### Minor Changes + +- d20386c: Updated common SDK. Changes + +## 0.1.3 + +### Patch Changes + +- 412937f: Fixed watched queries not updating due to race condition when opening multiple WA-SQLite connections due to initiating multiple PowerSync instances simultaneously. + +## 0.1.2 + +### Patch Changes + +- 7fb9df2: Fix bug where opening multiple WA-SQLite instances would erase DB table change watches. +- 7fb9df2: Update common SDK dependency to v1.0.1: Improved connector CRUD uploads to be triggered whenever an internal CRUD operation change is triggered. Improved CRUD upload debouncing to rather use a throttled approach - executing multiple continuous write/CRUD operations will now trigger a connector upload at most (every) 1 second (by default). + +## 0.1.1 + +### Patch Changes + +- 0e17713: Added ignore directives for Vite to enable bundling the workers correctly. + +## 0.1.0 + +### Minor Changes + +- 1fa25e6: Added mock SSR implementation for sync stream client. + Added better worker and multiple tabs support. + Added support for Android (without multiple tab support). + Fixed race conditions in Safari by disabling Shared web workers (multiple tab support). + +## 0.0.3 + +### Patch Changes + +- 0bc3758: Improved Server Side Rendering support: Client now does not throw exceptions if used Server Side. DB calls will return empty results, allowing pages to be constructed server side and hydrated with data on the client side. + + Improved TypeScript typings from `@journeyapps/wa-sqlite`. + +## 0.0.2 + +### Patch Changes + +- 5d9cbb9: Update package readme + +## 0.0.1 + +### Patch Changes + +- af78f76: Initial Alpha version diff --git a/packages/powersync-sdk-web/LICENSE b/packages/powersync-sdk-web/LICENSE new file mode 100644 index 00000000..b7a84424 --- /dev/null +++ b/packages/powersync-sdk-web/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/powersync-sdk-web/README.md b/packages/powersync-sdk-web/README.md new file mode 100644 index 00000000..87efdc11 --- /dev/null +++ b/packages/powersync-sdk-web/README.md @@ -0,0 +1,137 @@ +# PowerSync SDK for Web + +[PowerSync](https://powersync.co) is a service and set of SDKs that keeps Postgres databases in sync with on-device SQLite databases. + +## Beta Release + +The web SDK package is currently in a Beta release. + +# Installation + +## Install Package + +```bash +npm install @journeyapps/powersync-sdk-web +``` + +## Install Peer Dependency: WA-SQLite + +This SDK currently requires `@journeyapps/wa-sqlite` as a peer dependency. + +Install it in your app with: + +```bash +npm install @journeyapps/wa-sqlite +``` + +## Logging + +This package uses [js-logger](https://www.npmjs.com/package/js-logger) for logging. + +Enable JS Logger with your logging interface of choice or use the default `console` + +```JavaScript +import Logger from 'js-logger'; + +// Log messages will be written to the window's console. +Logger.useDefaults(); +``` + +Enable verbose output in the developer tools for detailed logs. + +The WASQLite DB Adapter opens SQLite connections inside a shared webworker. This worker can be inspected in Chrome by accessing + +``` +chrome://inspect/#workers +``` + +# Getting Started + +See our [Docs](https://docs.powersync.co/usage/installation/client-side-setup) for detailed instructions. + +```JavaScript +import { + Column, + ColumnType, + WASQLitePowerSyncDatabaseOpenFactory, + Schema, + Table +} from '@journeyapps/powersync-sdk-web'; + +export const AppSchema = new Schema([ + new Table({ name: 'customers', columns: [new Column({ name: 'name', type: ColumnType.TEXT })] }) +]); + +let PowerSync; + +export const openDatabase = async () => { + PowerSync = new WASQLitePowerSyncDatabaseOpenFactory({ + schema: AppSchema, + dbFilename: 'test.sqlite', + flags: { + // This is disabled once CSR+SSR functionality is verified to be working correctly + disableSSRWarning: true, + }}).getInstance(); + + await PowerSync.init(); + + // Run local statements. + await PowerSync.execute('INSERT INTO customers(id, name) VALUES(uuid(), ?)', ['Fred']); +}; + +class Connector { + async fetchCredentials() { + // TODO logic to fetch a session + return { + endpoint: '[The PowerSync instance URL]', + token: 'An authentication token', + expiresAt: 'When the token expires', + }; + } + + async uploadData(database) { + // Upload local changes to backend, see docs for example + } +} + +export const connectPowerSync = async () => { + const connector = new Connector(); // Which was declared above + await PowerSync.connect(connector); +}; + +``` + +React hooks are available in the [@journeyapps/powersync-react](https://www.npmjs.com/package/@journeyapps/powersync-react) package + +## Multiple Tab Support + +Using PowerSync between multiple tabs is supported on some web browsers. Multiple tab support relies on shared web workers for DB and sync streaming operations. When enabled shared web workers named `shared-sync-[dbFileName]` and `shared-DB-worker-[dbFileName]` will be created. + +The shared database worker will ensure writes to the DB will instantly be available between tabs. + +The shared sync worker will co-ordinate for one active tab to connect to the PowerSync instance and share the latest sync state between tabs. + +Currently using the SDK in multiple tabs without enabling the `enableMultiTabs` flag will spawn a standard web worker per tab for DB operations. These workers are safe to operate on the DB concurrently, however changes from one tab may not update watches on other tabs. Only one tab can sync from the PowerSync instance at a time. The sync status will not be shared between tabs, only the oldest tab will connect and display the latest sync status. + +Multiple tab support is not currently available on Android or Safari. + +Support is enabled by default if available. This can be disabled as below: + +```Javascript +PowerSync = new WASQLitePowerSyncDatabaseOpenFactory({ + schema: AppSchema, + dbFilename: 'test.sqlite', + flags: { + // This is disabled once CSR+SSR functionality is verified to be working correctly + disableSSRWarning: true, + /** + * Multiple tab support is enabled by default if available. This can be disabled by + * setting this flag to false. + */ + enableMultiTabs: false + }}).getInstance(); +``` + +## Demo Apps + +See the [list of demo apps](https://github.com/powersync-ja/powersync-web-sdk/?tab=readme-ov-file#demos) in the repo README. diff --git a/packages/powersync-sdk-web/package.json b/packages/powersync-sdk-web/package.json new file mode 100644 index 00000000..6578a4f4 --- /dev/null +++ b/packages/powersync-sdk-web/package.json @@ -0,0 +1,51 @@ +{ + "name": "@journeyapps/powersync-sdk-web", + "version": "0.2.0", + "description": "A Web SDK for JourneyApps PowerSync", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "repository": "https://github.com/powersync-ja/powersync-web-sdk", + "bugs": { + "url": "https://github.com/powersync-ja/powersync-web-sdk/issues" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "homepage": "https://docs.powersync.co", + "scripts": { + "build": "tsc --build", + "clean": "rm -rf dist tsconfig.tsbuildinfo", + "watch": "tsc --build -w", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "data sync", + "offline-first", + "sqlite", + "real-time data stream", + "live data" + ], + "author": "JOURNEYAPPS", + "license": "Apache-2.0", + "devDependencies": { + "@journeyapps/wa-sqlite": "~0.1.1", + "@types/lodash": "^4.14.200", + "@types/uuid": "^9.0.6", + "typescript": "^5.2.2" + }, + "peerDependencies": { + "@journeyapps/wa-sqlite": "~0.1.1" + }, + "dependencies": { + "@journeyapps/powersync-sdk-common": "workspace:*", + "async-mutex": "^0.4.0", + "comlink": "^4.4.1", + "js-logger": "^1.6.1", + "lodash": "^4.17.21", + "uuid": "^9.0.1" + } +} diff --git a/packages/powersync-sdk-web/src/db/PowerSyncDatabase.ts b/packages/powersync-sdk-web/src/db/PowerSyncDatabase.ts new file mode 100644 index 00000000..bdd8c3c0 --- /dev/null +++ b/packages/powersync-sdk-web/src/db/PowerSyncDatabase.ts @@ -0,0 +1,70 @@ +import { + AbstractPowerSyncDatabase, + AbstractStreamingSyncImplementation, + PowerSyncBackendConnector, + SqliteBucketStorage, + BucketStorageAdapter, + PowerSyncDatabaseOptions, +} from '@journeyapps/powersync-sdk-common'; + +import { WebRemote } from './sync/WebRemote'; +import { SharedWebStreamingSyncImplementation } from './sync/SharedWebStreamingSyncImplementation'; +import { SSRStreamingSyncImplementation } from './sync/SSRWebStreamingSyncImplementation'; +import { + WebStreamingSyncImplementation, + WebStreamingSyncImplementationOptions +} from './sync/WebStreamingSyncImplementation'; + +export interface WebPowerSyncFlags { + /** + * Enables multi tab support + */ + enableMultiTabs?: boolean; + /** + * Open in SSR placeholder mode. DB operations and Sync operations will be a No-op + */ + ssrMode?: boolean; +} + +export interface WebPowerSyncDatabaseOptions extends PowerSyncDatabaseOptions { + flags?: WebPowerSyncFlags; +} + +export class PowerSyncDatabase extends AbstractPowerSyncDatabase { + constructor(protected options: WebPowerSyncDatabaseOptions) { + super(options); + } + + async _initialize(): Promise { } + + protected generateBucketStorageAdapter(): BucketStorageAdapter { + return new SqliteBucketStorage(this.database, AbstractPowerSyncDatabase.transactionMutex); + } + + protected generateSyncStreamImplementation( + connector: PowerSyncBackendConnector + ): AbstractStreamingSyncImplementation { + const remote = new WebRemote(connector); + + const syncOptions: WebStreamingSyncImplementationOptions = { + ...this.options, + adapter: this.bucketStorageAdapter, + remote, + uploadCrud: async () => { + await this.waitForReady(); + await connector.uploadData(this); + }, + identifier: this.options.database.name + }; + + const { flags } = this.options; + switch (true) { + case flags?.ssrMode: + return new SSRStreamingSyncImplementation(syncOptions); + case flags?.enableMultiTabs: + return new SharedWebStreamingSyncImplementation(syncOptions); + default: + return new WebStreamingSyncImplementation(syncOptions); + } + } +} diff --git a/packages/powersync-sdk-web/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts b/packages/powersync-sdk-web/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts new file mode 100644 index 00000000..e4caf2c7 --- /dev/null +++ b/packages/powersync-sdk-web/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts @@ -0,0 +1,85 @@ +import _ from 'lodash'; +import { + AbstractPowerSyncDatabase, + AbstractPowerSyncDatabaseOpenFactory, + PowerSyncDatabaseOptions, + PowerSyncOpenFactoryOptions +} from '@journeyapps/powersync-sdk-common'; +import { PowerSyncDatabase, WebPowerSyncDatabaseOptions, WebPowerSyncFlags } from '../../db/PowerSyncDatabase'; +import { SSRDBAdapter } from './SSRDBAdapter'; + +export type WebPowerSyncOpenFlags = { + enableMultiTabs?: boolean; + disableSSRWarning?: boolean; +}; + +export interface WebPowerSyncOpenFactoryOptions extends PowerSyncOpenFactoryOptions { + flags?: WebPowerSyncOpenFlags; +} + +export const DEFAULT_POWERSYNC_FLAGS: WebPowerSyncOpenFlags = { + /** + * Multiple tabs are by default not supported on Android, iOS and Safari. + * Other platforms will have multiple tabs enabled by default. + */ + enableMultiTabs: + typeof globalThis.navigator !== 'undefined' && // For SSR purposes + typeof SharedWorker !== 'undefined' && + !navigator.userAgent.match(/(Android|iPhone|iPod|iPad)/i) && + !(window as any).safari +}; + +/** + * Intermediate PowerSync Database Open factory for Web which uses a mock + * SSR DB Adapter if running on server side. + * Most SQLite DB implementations only run on client side, this will safely return + * empty query results in SSR which will allow for generating server partial views. + */ +export abstract class AbstractWebPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory { + protected isServerSide() { + return typeof window == 'undefined'; + } + + constructor(protected options: WebPowerSyncOpenFactoryOptions) { + super(options); + } + + generateOptions(): WebPowerSyncDatabaseOptions { + const isServerSide = this.isServerSide(); + if (isServerSide && !this.options.flags?.disableSSRWarning) { + console.warn( + ` + Running PowerSync in SSR mode. + Only empty query results will be returned. + Disable this warning by setting 'disableSSRWarning: true' in options.` + ); + } + + // Resolve flags for PowerSync DB client + const resolvedFlags = this.resolveDBFlags(); + + if (!resolvedFlags.enableMultiTabs) { + console.warn( + 'Multiple tab support is not enabled. Using this site across multiple tabs may not function correctly.' + ); + } + + return { + ...this.options, + database: isServerSide ? new SSRDBAdapter() : this.openDB(), + schema: this.schema, + flags: resolvedFlags + }; + } + + protected resolveDBFlags(): WebPowerSyncFlags { + return _.merge(_.clone(DEFAULT_POWERSYNC_FLAGS), { + ssrMode: this.isServerSide(), + enableMultiTabs: this.options.flags?.enableMultiTabs + }); + } + + generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase { + return new PowerSyncDatabase(options); + } +} diff --git a/packages/powersync-sdk-web/src/db/adapters/SSRDBAdapter.ts b/packages/powersync-sdk-web/src/db/adapters/SSRDBAdapter.ts new file mode 100644 index 00000000..760e34d9 --- /dev/null +++ b/packages/powersync-sdk-web/src/db/adapters/SSRDBAdapter.ts @@ -0,0 +1,84 @@ +import { + BaseObserver, + DBAdapterListener, + DBAdapter, + DBLockOptions, + LockContext, + QueryResult, + Transaction +} from '@journeyapps/powersync-sdk-common'; + +import { Mutex } from 'async-mutex'; + +const MOCK_QUERY_RESPONSE: QueryResult = { + rowsAffected: 0 +}; + +/** + * Implements a Mock DB adapter for use in Server Side Rendering (SSR). + * This adapter will return empty results for queries, which will allow + * server rendered views to initially generate scaffolding components + */ +export class SSRDBAdapter extends BaseObserver implements DBAdapter { + name: string; + readMutex: Mutex; + writeMutex: Mutex; + + constructor() { + super(); + this.name = 'SSR DB'; + this.readMutex = new Mutex(); + this.writeMutex = new Mutex(); + } + + close() {} + + async readLock(fn: (tx: LockContext) => Promise, options?: DBLockOptions) { + return this.readMutex.runExclusive(() => fn(this)); + } + + async readTransaction(fn: (tx: Transaction) => Promise, options?: DBLockOptions) { + return this.readLock(() => fn(this.generateMockTransactionContext())); + } + + async writeLock(fn: (tx: LockContext) => Promise, options?: DBLockOptions) { + return this.writeMutex.runExclusive(() => fn(this)); + } + + async writeTransaction(fn: (tx: Transaction) => Promise, options?: DBLockOptions) { + return this.writeLock(() => fn(this.generateMockTransactionContext())); + } + + async execute(query: string, params?: any[]): Promise { + return this.writeMutex.runExclusive(async () => MOCK_QUERY_RESPONSE); + } + + async getAll(sql: string, parameters?: any[]): Promise { + return []; + } + + async getOptional(sql: string, parameters?: any[] | undefined): Promise { + return null; + } + + async get(sql: string, parameters?: any[] | undefined): Promise { + throw new Error(`No values are returned in SSR mode`); + } + + /** + * Generates a mock context for use in read/write transactions. + * `this` already mocks most of the API, commit and rollback mocks + * are added here + */ + private generateMockTransactionContext(): Transaction { + return { + ...this, + commit: async () => { + return MOCK_QUERY_RESPONSE; + }, + rollback: async () => { + return MOCK_QUERY_RESPONSE; + } + }; + } +} diff --git a/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts b/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts new file mode 100644 index 00000000..9738373c --- /dev/null +++ b/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts @@ -0,0 +1,243 @@ +import { + BaseObserver, + DBAdapter, + DBAdapterListener, + DBGetUtils, + DBLockOptions, + LockContext, + PowerSyncOpenFactoryOptions, + QueryResult, + Transaction +} from '@journeyapps/powersync-sdk-common'; +import _ from 'lodash'; +import * as Comlink from 'comlink'; +import Logger, { ILogger } from 'js-logger'; +import type { DBWorkerInterface, OpenDB } from '../../../worker/db/open-db'; + +export type WASQLiteFlags = { + enableMultiTabs?: boolean; +}; + +export interface WASQLiteDBAdapterOptions extends Omit { + flags?: WASQLiteFlags; +} + +/** + * Adapter for WA-SQLite + */ +export class WASQLiteDBAdapter extends BaseObserver implements DBAdapter { + private initialized: Promise; + private logger: ILogger; + private dbGetHelpers: DBGetUtils | null; + private workerMethods: DBWorkerInterface | null; + + constructor(protected options: WASQLiteDBAdapterOptions) { + super(); + this.logger = Logger.get('WASQLite'); + this.dbGetHelpers = null; + this.workerMethods = null; + this.initialized = this.init(); + this.dbGetHelpers = this.generateDBHelpers({ execute: this._execute.bind(this) }); + } + + get name() { + return this.options.dbFilename; + } + + protected get flags(): WASQLiteFlags { + return this.options.flags ?? {}; + } + + getWorker() {} + + protected async init() { + const { enableMultiTabs } = this.flags; + if (!enableMultiTabs) { + this.logger.warn('Multiple tabs are not enabled in this browser'); + } + /** + * Webpack V5 can bundle the worker automatically if the full Worker constructor syntax is used + * https://webpack.js.org/guides/web-workers/ + * This enables multi tab support by default, but falls back if SharedWorker is not available + * (in the case of Android) + */ + const openDB = enableMultiTabs + ? Comlink.wrap( + new SharedWorker(new URL('../../../worker/db/SharedWASQLiteDB.worker.js', import.meta.url), { + /* @vite-ignore */ + name: `shared-DB-worker-${this.name}`, + type: 'module' + }).port + ) + : Comlink.wrap( + new Worker(new URL('../../../worker/db/WASQLiteDB.worker.js', import.meta.url), { + /* @vite-ignore */ + name: `DB-worker-${this.name}`, + type: 'module' + }) + ); + + this.workerMethods = await openDB(this.options.dbFilename); + + this.workerMethods.registerOnTableChange( + Comlink.proxy((opType: number, tableName: string, rowId: number) => { + this.iterateListeners((cb) => cb.tablesUpdated?.({ opType, table: tableName, rowId })); + }) + ); + } + + async execute(query: string, params?: any[] | undefined): Promise { + return this.writeLock((ctx) => ctx.execute(query, params)); + } + + /** + * Wraps the worker execute function, awaiting for it to be available + */ + private _execute = async (sql: string, bindings?: any[]): Promise => { + await this.initialized; + const result = await this.workerMethods!.execute!(sql, bindings); + return { + ...result, + rows: { + ...result.rows, + item: (idx: number) => result.rows._array[idx] + } + }; + }; + + close() { + if (!this.flags.enableMultiTabs) { + this.workerMethods?.close?.(); + } + } + + async getAll(sql: string, parameters?: any[] | undefined): Promise { + await this.initialized; + return this.dbGetHelpers!.getAll(sql, parameters); + } + + async getOptional(sql: string, parameters?: any[] | undefined): Promise { + await this.initialized; + return this.dbGetHelpers!.getOptional(sql, parameters); + } + + async get(sql: string, parameters?: any[] | undefined): Promise { + await this.initialized; + return this.dbGetHelpers!.get(sql, parameters); + } + + async readLock(fn: (tx: LockContext) => Promise, options?: DBLockOptions | undefined): Promise { + await this.initialized; + return new Promise((resolve, reject) => { + this.acquireLock(async () => { + try { + const res = await fn(this.generateDBHelpers({ execute: this._execute })); + resolve(res); + } catch (ex) { + reject(ex); + } + }); + }); + } + + async writeLock(fn: (tx: LockContext) => Promise, options?: DBLockOptions | undefined): Promise { + await this.initialized; + return new Promise((resolve, reject) => { + // This implementation currently only uses a single connection. Locking is ensured by navigator locks + this.acquireLock(async () => { + try { + const res = await fn(this.generateDBHelpers({ execute: this._execute })); + resolve(res); + } catch (ex) { + reject(ex); + } + }); + }); + } + + protected acquireLock(callback: () => Promise): Promise { + return navigator.locks.request(`db-lock-${this.options.dbFilename}`, callback); + } + + async readTransaction(fn: (tx: Transaction) => Promise, options?: DBLockOptions | undefined): Promise { + return this.readLock(this.wrapTransaction(fn)); + } + + writeTransaction(fn: (tx: Transaction) => Promise, options?: DBLockOptions | undefined): Promise { + return this.writeLock(this.wrapTransaction(fn)); + } + + /** + * Wraps a lock context into a transaction context + */ + private wrapTransaction(cb: (tx: Transaction) => Promise) { + return async (tx: LockContext): Promise => { + await this._execute('BEGIN TRANSACTION'); + let finalized = false; + const commit = async (): Promise => { + if (finalized) { + return { rowsAffected: 0 }; + } + finalized = true; + return this._execute('COMMIT'); + }; + + const rollback = () => { + finalized = true; + return this._execute('ROLLBACK'); + }; + + try { + const result = await cb({ + ...tx, + commit, + rollback + }); + + if (!finalized) { + await commit(); + } + return result; + } catch (ex) { + this.logger.debug('Caught ex in transaction', ex); + await rollback(); + throw ex; + } + }; + } + + private generateDBHelpers Promise }>( + tx: T + ): T & DBGetUtils { + return { + ...tx, + /** + * Execute a read-only query and return results + */ + async getAll(sql: string, parameters?: any[]): Promise { + const res = await tx.execute(sql, parameters); + return res.rows?._array ?? []; + }, + + /** + * Execute a read-only query and return the first result, or null if the ResultSet is empty. + */ + async getOptional(sql: string, parameters?: any[]): Promise { + const res = await tx.execute(sql, parameters); + return res.rows?.item(0) ?? null; + }, + + /** + * Execute a read-only query and return the first result, error if the ResultSet is empty. + */ + async get(sql: string, parameters?: any[]): Promise { + const res = await tx.execute(sql, parameters); + const first = res.rows?.item(0); + if (!first) { + throw new Error('Result set is empty'); + } + return first; + } + }; + } +} diff --git a/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts b/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts new file mode 100644 index 00000000..113968dd --- /dev/null +++ b/packages/powersync-sdk-web/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts @@ -0,0 +1,14 @@ +import { AbstractPowerSyncDatabase, DBAdapter, PowerSyncDatabaseOptions } from '@journeyapps/powersync-sdk-common'; +import { PowerSyncDatabase } from '../../../db/PowerSyncDatabase'; +import { WASQLiteDBAdapter } from './WASQLiteDBAdapter'; +import { AbstractWebPowerSyncDatabaseOpenFactory } from '../AbstractWebPowerSyncDatabaseOpenFactory'; + +export class WASQLitePowerSyncDatabaseOpenFactory extends AbstractWebPowerSyncDatabaseOpenFactory { + protected openDB(): DBAdapter { + return new WASQLiteDBAdapter({ ...this.options, flags: this.resolveDBFlags() }); + } + + generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase { + return new PowerSyncDatabase(options); + } +} diff --git a/packages/powersync-sdk-web/src/db/sync/SSRWebStreamingSyncImplementation.ts b/packages/powersync-sdk-web/src/db/sync/SSRWebStreamingSyncImplementation.ts new file mode 100644 index 00000000..6b084bc6 --- /dev/null +++ b/packages/powersync-sdk-web/src/db/sync/SSRWebStreamingSyncImplementation.ts @@ -0,0 +1,24 @@ +import _ from 'lodash'; +import { + AbstractStreamingSyncImplementation, + AbstractStreamingSyncImplementationOptions, + LockOptions, + LockType +} from '@journeyapps/powersync-sdk-common'; +import { Mutex } from 'async-mutex'; + +export class SSRStreamingSyncImplementation extends AbstractStreamingSyncImplementation { + syncMutex: Mutex; + crudMutex: Mutex; + + constructor(options: AbstractStreamingSyncImplementationOptions) { + super(options); + this.syncMutex = new Mutex(); + this.crudMutex = new Mutex(); + } + + obtainLock(lockOptions: LockOptions): Promise { + const mutex = lockOptions.type == LockType.CRUD ? this.crudMutex : this.syncMutex; + return mutex.runExclusive(lockOptions.callback); + } +} diff --git a/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts b/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts new file mode 100644 index 00000000..82616294 --- /dev/null +++ b/packages/powersync-sdk-web/src/db/sync/SharedWebStreamingSyncImplementation.ts @@ -0,0 +1,70 @@ +import _ from 'lodash'; +import { v4 as uuid } from 'uuid'; +import * as Comlink from 'comlink'; +import { + WebStreamingSyncImplementation, + WebStreamingSyncImplementationOptions +} from './WebStreamingSyncImplementation'; +import { + SharedSyncImplementation, + SharedSyncMessage, + SharedSyncMessageType, + SharedSyncStatus +} from '../../worker/sync/SharedSyncImplementation'; + +export class SharedWebStreamingSyncImplementation extends WebStreamingSyncImplementation { + protected stateManager: Comlink.Remote; + + /** + * ID for the tab running this sync implementation + */ + protected syncTabId: string; + + constructor(options: WebStreamingSyncImplementationOptions) { + super(options); + + this.syncTabId = uuid(); + const worker = new SharedWorker(new URL('../../worker/sync/SharedSyncImplementation.worker.js', import.meta.url), { + /* @vite-ignore */ + name: `shared-sync-${this.webOptions.identifier}`, + type: 'module' + }); + + const { port } = worker; + this.stateManager = Comlink.wrap(port); + + port.onmessage = (event: MessageEvent) => { + const { + data: { type, payload } + } = event; + if (type !== SharedSyncMessageType.UPDATE || payload.tabId == this.syncTabId) { + // Don't update from own updates + return; + } + // Don't broadcast this to the shared implementation + this.internalUpdateStatus(payload); + }; + + // Load the initial state + this.stateManager.getState().then((state) => { + this.internalUpdateStatus(state); + }); + } + + /** + * Triggers update of sync status without broadcasting to shared sync + * manager + */ + protected internalUpdateStatus(state: SharedSyncStatus) { + return super.updateSyncStatus(state); + } + + protected updateSyncStatus(state: SharedSyncStatus): void { + super.updateSyncStatus(state); + // Broadcast this update to shared sync manager + this.stateManager.updateState({ + ...state, + tabId: this.syncTabId + }); + } +} diff --git a/packages/powersync-sdk-web/src/db/sync/WebRemote.ts b/packages/powersync-sdk-web/src/db/sync/WebRemote.ts new file mode 100644 index 00000000..8f11ea8b --- /dev/null +++ b/packages/powersync-sdk-web/src/db/sync/WebRemote.ts @@ -0,0 +1,98 @@ +import { AbstractRemote } from '@journeyapps/powersync-sdk-common'; + +export class WebRemote extends AbstractRemote { + async post(path: string, data: any, headers: Record = {}): Promise { + const credentials = await this.getCredentials(); + const res = await fetch(credentials.endpoint + path, { + method: 'POST', + headers: { + ...headers, + ...(await this.getHeaders()) + }, + body: JSON.stringify(data) + }); + + if (!res.ok) { + throw new Error(`Received ${res.status} - ${res.statusText} when posting to ${path}: ${await res.text()}}`); + } + + return res.json(); + } + + async get(path: string, headers?: Record): Promise { + const credentials = await this.getCredentials(); + + const res = await fetch(credentials.endpoint + path, { + method: 'GET', + headers: { + ...headers, + ...(await this.getHeaders()) + } + }); + + if (!res.ok) { + throw new Error(`Received ${res.status} - ${res.statusText} when getting from ${path}: ${await res.text()}}`); + } + + return res.json(); + } + + async postStreaming( + path: string, + data: any, + headers: Record = {}, + signal?: AbortSignal + ): Promise { + const credentials = await this.getCredentials(); + + const res = await fetch(credentials.endpoint + path, { + method: 'POST', + headers: { ...headers, ...(await this.getHeaders()) }, + body: JSON.stringify(data), + signal, + cache: 'no-store' + }); + + if (!res.ok || !res.body) { + const text = await res.text(); + console.error(`Could not POST streaming to ${path} - ${res.status} - ${res.statusText}: ${text}`); + const error: any = new Error(`HTTP ${res.statusText}: ${text}`); + error.status = res.status; + throw error; + } + + /** + * The can-ndjson-stream does not handle aborted streams well on web. + * This will intercept the readable stream and close the stream if + * aborted. + */ + const reader = res.body.getReader(); + const outputStream = new ReadableStream({ + start(controller) { + return processStream(); + + async function processStream(): Promise { + if (signal?.aborted) { + controller.close(); + } + try { + const { done, value } = await reader.read(); + // When no more data needs to be consumed, close the stream + if (done) { + controller.close(); + return; + } + // Enqueue the next data chunk into our target stream + controller.enqueue(value); + return processStream(); + } catch (ex) { + controller.close(); + } + } + } + }); + + // Create a new response out of the intercepted stream + return new Response(outputStream).body; + } +} diff --git a/packages/powersync-sdk-web/src/db/sync/WebStreamingSyncImplementation.ts b/packages/powersync-sdk-web/src/db/sync/WebStreamingSyncImplementation.ts new file mode 100644 index 00000000..076e02cd --- /dev/null +++ b/packages/powersync-sdk-web/src/db/sync/WebStreamingSyncImplementation.ts @@ -0,0 +1,26 @@ +import _ from 'lodash'; +import { + AbstractStreamingSyncImplementation, + AbstractStreamingSyncImplementationOptions, + LockOptions, + LockType +} from '@journeyapps/powersync-sdk-common'; + +export interface WebStreamingSyncImplementationOptions extends AbstractStreamingSyncImplementationOptions {} + +export class WebStreamingSyncImplementation extends AbstractStreamingSyncImplementation { + constructor(options: WebStreamingSyncImplementationOptions) { + // Super will store and provide default values for options + super(options); + } + + get webOptions(): WebStreamingSyncImplementationOptions { + return this.options as WebStreamingSyncImplementationOptions; + } + + obtainLock(lockOptions: LockOptions): Promise { + const identifier = `streaming-sync-${lockOptions.type}-${this.webOptions.identifier}`; + lockOptions.type == LockType.SYNC && console.debug('requesting lock for ', identifier); + return navigator.locks.request(identifier, { signal: lockOptions.signal }, lockOptions.callback); + } +} diff --git a/packages/powersync-sdk-web/src/index.ts b/packages/powersync-sdk-web/src/index.ts new file mode 100644 index 00000000..6495734a --- /dev/null +++ b/packages/powersync-sdk-web/src/index.ts @@ -0,0 +1,6 @@ +export * from '@journeyapps/powersync-sdk-common'; +export * from './db/PowerSyncDatabase'; +export * from './db/sync/WebRemote'; +export * from './db/sync/WebStreamingSyncImplementation'; +export * from './db/adapters/wa-sqlite/WASQLiteDBAdapter'; +export * from './db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory'; diff --git a/packages/powersync-sdk-web/src/worker/db/SharedWASQLiteDB.worker.ts b/packages/powersync-sdk-web/src/worker/db/SharedWASQLiteDB.worker.ts new file mode 100644 index 00000000..ebf7dcda --- /dev/null +++ b/packages/powersync-sdk-web/src/worker/db/SharedWASQLiteDB.worker.ts @@ -0,0 +1,35 @@ +import '@journeyapps/wa-sqlite'; + +import _ from 'lodash'; +import * as Comlink from 'comlink'; +import { DBWorkerInterface, _openDB } from './open-db'; + +const _self: SharedWorkerGlobalScope = self as any; + +const DBMap = new Map>(); + +const openDB = async (dbFileName: string): Promise => { + if (!DBMap.has(dbFileName)) { + const openPromise = _openDB(dbFileName); + DBMap.set(dbFileName, openPromise); + openPromise.catch((error) => { + // Allow for retries if an error ocurred + console.error(error); + DBMap.delete(dbFileName); + }); + } + return Comlink.proxy(await DBMap.get(dbFileName)!); +}; + +_self.onconnect = function (event: MessageEvent) { + const port = event.ports[0]; + console.debug('Exposing db on port', port); + Comlink.expose(openDB, port); +}; + +addEventListener('beforeunload', (event) => { + Array.from(DBMap.values()).forEach(async (dbPromise) => { + const db = await dbPromise; + db.close?.(); + }); +}); diff --git a/packages/powersync-sdk-web/src/worker/db/WASQLiteDB.worker.ts b/packages/powersync-sdk-web/src/worker/db/WASQLiteDB.worker.ts new file mode 100644 index 00000000..043a45a3 --- /dev/null +++ b/packages/powersync-sdk-web/src/worker/db/WASQLiteDB.worker.ts @@ -0,0 +1,4 @@ +import * as Comlink from 'comlink'; +import { _openDB } from './open-db'; + +Comlink.expose(async (dbFileName: string) => Comlink.proxy(await _openDB(dbFileName))); diff --git a/packages/powersync-sdk-web/src/worker/db/open-db.ts b/packages/powersync-sdk-web/src/worker/db/open-db.ts new file mode 100644 index 00000000..7d0cf531 --- /dev/null +++ b/packages/powersync-sdk-web/src/worker/db/open-db.ts @@ -0,0 +1,132 @@ +import * as SQLite from '@journeyapps/wa-sqlite'; +import '@journeyapps/wa-sqlite'; +import _ from 'lodash'; +import * as Comlink from 'comlink'; +import { v4 as uuid } from 'uuid'; +import { QueryResult } from '@journeyapps/powersync-sdk-common'; + +export type WASQLExecuteResult = Omit & { + rows: { + _array: any[]; + length: number; + }; +}; + +export type DBWorkerInterface = { + // Close is only exposed when used in a single non shared webworker + close?: () => void; + execute: WASQLiteExecuteMethod; + registerOnTableChange: (callback: OnTableChangeCallback) => void; +}; + +export type WASQLiteExecuteMethod = (sql: string, params?: any[]) => Promise; + +export type OnTableChangeCallback = (opType: number, tableName: string, rowId: number) => void; +export type OpenDB = (dbFileName: string) => DBWorkerInterface; + +export async function _openDB(dbFileName: string): Promise { + const { default: moduleFactory } = await import('@journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs'); + const module = await moduleFactory(); + const sqlite3 = SQLite.Factory(module); + + const { IDBBatchAtomicVFS } = await import('@journeyapps/wa-sqlite/src/examples/IDBBatchAtomicVFS.js'); + const vfs = new IDBBatchAtomicVFS(dbFileName); + sqlite3.vfs_register(vfs, true); + + const db = await sqlite3.open_v2(dbFileName); + + /** + * Listeners are exclusive to the DB connection. + */ + const listeners = new Map(); + + sqlite3.register_table_onchange_hook(db, (opType: number, tableName: string, rowId: number) => { + Array.from(listeners.values()).forEach((l) => l(opType, tableName, rowId)); + }); + + const registerOnTableChange = (callback: OnTableChangeCallback) => { + const id = uuid(); + listeners.set(id, callback); + return Comlink.proxy(() => { + listeners.delete(id); + }); + }; + + /** + * This executes SQL statements. + */ + const execute = async (sql: string | TemplateStringsArray, bindings?: any[]): Promise => { + // Running multiple statements on the same connection concurrently should not be allowed + return navigator.locks.request(`db-execute-${dbFileName}`, async () => { + const results = []; + for await (const stmt of sqlite3.statements(db, sql as string)) { + let columns; + const wrappedBindings = bindings ? [bindings] : [[]]; + for (const binding of wrappedBindings) { + // TODO not sure why this is needed currently, but booleans break + binding.forEach((b, index, arr) => { + if (typeof b == 'boolean') { + arr[index] = b ? 1 : 0; + } + }); + + sqlite3.reset(stmt); + if (bindings) { + sqlite3.bind_collection(stmt, binding); + } + + const rows = []; + while ((await sqlite3.step(stmt)) === SQLite.SQLITE_ROW) { + const row = sqlite3.row(stmt); + rows.push(row); + } + + columns = columns ?? sqlite3.column_names(stmt); + if (columns.length) { + results.push({ columns, rows }); + } + } + + // When binding parameters, only a single statement is executed. + if (bindings) { + break; + } + } + + const rows = _.chain(results) + .filter(({ rows }) => !!rows.length) + .flatMap(({ columns, rows }) => + _.map(rows, (row) => + _.reduce( + columns, + (out: Record, key: string, index) => { + out[key] = row[index]; + return out; + }, + {} + ) + ) + ) + .value(); + + const result = { + insertId: sqlite3.last_insert_id(db), + rowsAffected: sqlite3.changes(db), + rows: { + _array: rows, + length: rows.length + } + }; + + return result; + }); + }; + + return { + execute: Comlink.proxy(execute), + registerOnTableChange: Comlink.proxy(registerOnTableChange), + close: Comlink.proxy(() => { + sqlite3.close(db); + }) + }; +} diff --git a/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts new file mode 100644 index 00000000..81d960b4 --- /dev/null +++ b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.ts @@ -0,0 +1,44 @@ +import _ from 'lodash'; +import { BaseListener, BaseObserver, SyncStatusOptions } from '@journeyapps/powersync-sdk-common'; + +export enum SharedSyncMessageType { + UPDATE = 'sync-status-update' +} + +export type SharedSyncStatus = SyncStatusOptions & { + tabId?: string; +}; + +export type SharedSyncMessage = { + type: SharedSyncMessageType; + payload: SharedSyncStatus; +}; + +export interface SharedSyncImplementationListener extends BaseListener { + statusChanged: (status: SharedSyncStatus) => void; +} + +export class SharedSyncImplementation extends BaseObserver { + protected status: SharedSyncStatus; + + constructor() { + super(); + this.status = { + connected: false + }; + } + + /** + * Provides a method to get the current state + * This is needed for a new tab to initialize it's local state + * before relying on the next broadcast update. + */ + getState(): SharedSyncStatus { + return this.status; + } + + updateState(status: SharedSyncStatus) { + this.status = _.merge(this.status, status); + this.iterateListeners((cb) => cb.statusChanged?.(status)); + } +} diff --git a/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.worker.ts b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.worker.ts new file mode 100644 index 00000000..24de577b --- /dev/null +++ b/packages/powersync-sdk-web/src/worker/sync/SharedSyncImplementation.worker.ts @@ -0,0 +1,22 @@ +import _ from 'lodash'; +import * as Comlink from 'comlink'; +import { SharedSyncImplementation, SharedSyncMessageType } from './SharedSyncImplementation'; + +const _self: SharedWorkerGlobalScope = self as any; + +const sharedSyncImplementation = new SharedSyncImplementation(); + +_self.onconnect = function (event: MessageEvent) { + const port = event.ports[0]; + + Comlink.expose(sharedSyncImplementation, port); + + sharedSyncImplementation.registerListener({ + statusChanged: (status) => { + port.postMessage({ + type: SharedSyncMessageType.UPDATE, + payload: status + }); + } + }); +}; diff --git a/packages/powersync-sdk-web/tsconfig.json b/packages/powersync-sdk-web/tsconfig.json new file mode 100644 index 00000000..089cf87c --- /dev/null +++ b/packages/powersync-sdk-web/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "composite": true, + "declaration": true /* Generates corresponding '.d.ts' file. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "lib": ["DOM", "ES2020", "WebWorker"] /* Specify library files to be included in the compilation. */, + "module": "es2020" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + "outDir": "./dist" /* Redirect output structure to the directory. */, + "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + "strict": true /* Enable all strict type-checking options. */, + "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abe2bd00..67cc27b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,292 @@ importers: specifier: ^3.2.4 version: 3.2.4 + demos/example-vite: + dependencies: + '@journeyapps/powersync-sdk-web': + specifier: workspace:* + version: link:../../packages/powersync-sdk-web + devDependencies: + vite: + specifier: ^5.0.12 + version: 5.0.12 + + demos/example-webpack: + dependencies: + '@journeyapps/powersync-sdk-web': + specifier: workspace:* + version: link:../../packages/powersync-sdk-web + devDependencies: + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5(webpack-cli@5.1.4) + html-webpack-plugin: + specifier: ^5.6.0 + version: 5.6.0(webpack@5.90.1) + serve: + specifier: ^14.2.1 + version: 14.2.1 + webpack: + specifier: ^5.90.1 + version: 5.90.1(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack@5.90.1) + + demos/powersync-nextjs-demo: + dependencies: + '@ducanh2912/next-pwa': + specifier: 9.7.2 + version: 9.7.2(next@14.1.0)(webpack@5.90.1) + '@emotion/react': + specifier: ^11.11.3 + version: 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0) + '@fontsource/roboto': + specifier: ^5.0.8 + version: 5.0.8 + '@journeyapps/powersync-react': + specifier: workspace:* + version: link:../../packages/powersync-react + '@journeyapps/powersync-sdk-web': + specifier: workspace:* + version: link:../../packages/powersync-sdk-web + '@journeyapps/wa-sqlite': + specifier: ~0.1.1 + version: 0.1.1 + '@mui/icons-material': + specifier: ^5.15.8 + version: 5.15.8(@mui/material@5.15.7)(@types/react@18.2.55)(react@18.2.0) + '@mui/material': + specifier: ^5.15.7 + version: 5.15.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@mui/x-data-grid': + specifier: ^6.19.3 + version: 6.19.3(@mui/material@5.15.7)(@mui/system@5.15.8)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@supabase/supabase-js': + specifier: ^2.39.3 + version: 2.39.3 + formik: + specifier: ^2.4.5 + version: 2.4.5(react@18.2.0) + js-logger: + specifier: ^1.6.1 + version: 1.6.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + next: + specifier: 14.1.0 + version: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + '@types/node': + specifier: ^20.11.16 + version: 20.11.16 + '@types/react': + specifier: ^18.2.55 + version: 18.2.55 + '@types/react-dom': + specifier: ^18.2.19 + version: 18.2.19 + autoprefixer: + specifier: ^10.4.17 + version: 10.4.17(postcss@8.4.35) + babel-loader: + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.23.9)(webpack@5.90.1) + eslint: + specifier: ^8 + version: 8.56.0 + eslint-config-next: + specifier: 14.0.0 + version: 14.0.0(eslint@8.56.0)(typescript@5.3.3) + postcss: + specifier: ^8.4.35 + version: 8.4.35 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 + typescript: + specifier: ^5 + version: 5.3.3 + + demos/powersync-supabase-yjs-text-collab-demo: + dependencies: + '@emotion/react': + specifier: ^11.11.3 + version: 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0) + '@fontsource/roboto': + specifier: ^5.0.8 + version: 5.0.8 + '@journeyapps/powersync-react': + specifier: workspace:* + version: link:../../packages/powersync-react + '@journeyapps/powersync-sdk-web': + specifier: workspace:* + version: link:../../packages/powersync-sdk-web + '@journeyapps/wa-sqlite': + specifier: ~0.1.1 + version: 0.1.1 + '@lexical/react': + specifier: ^0.11.1 + version: 0.11.3(lexical@0.11.3)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.11) + '@mui/icons-material': + specifier: ^5.15.8 + version: 5.15.8(@mui/material@5.15.7)(@types/react@18.2.55)(react@18.2.0) + '@mui/material': + specifier: ^5.15.7 + version: 5.15.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@mui/x-data-grid': + specifier: ^6.19.3 + version: 6.19.3(@mui/material@5.15.7)(@mui/system@5.15.8)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@supabase/supabase-js': + specifier: ^2.39.3 + version: 2.39.3 + '@tiptap/extension-collaboration': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2)(y-prosemirror@1.0.20) + '@tiptap/extension-collaboration-cursor': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2)(y-prosemirror@1.0.20) + '@tiptap/extension-highlight': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-task-item': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-task-list': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2) + '@tiptap/react': + specifier: 2.2.2 + version: 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2)(react-dom@18.2.0)(react@18.2.0) + '@tiptap/starter-kit': + specifier: 2.2.2 + version: 2.2.2(@tiptap/pm@2.2.2) + d3: + specifier: ^7.8.5 + version: 7.8.5 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + formik: + specifier: ^2.4.5 + version: 2.4.5(react@18.2.0) + highlight.js: + specifier: ^11.9.0 + version: 11.9.0 + js-logger: + specifier: ^1.6.1 + version: 1.6.1 + lato-font: + specifier: ^3.0.0 + version: 3.0.0 + lexical: + specifier: ^0.11.3 + version: 0.11.3 + lib0: + specifier: ^0.2.88 + version: 0.2.88 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + lowlight: + specifier: ^2.9.0 + version: 2.9.0 + next: + specifier: 14.1.0 + version: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next-images: + specifier: 1.8.5 + version: 1.8.5(webpack@5.90.1) + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + remixicon: + specifier: ^2.5.0 + version: 2.5.0 + shiki: + specifier: ^0.10.0 + version: 0.10.1 + simplify-js: + specifier: ^1.2.4 + version: 1.2.4 + uuid: + specifier: 9.0.1 + version: 9.0.1 + y-prosemirror: + specifier: 1.0.20 + version: 1.0.20(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.11) + yjs: + specifier: ^13.6.11 + version: 13.6.11 + devDependencies: + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + '@types/node': + specifier: ^20.11.16 + version: 20.11.16 + '@types/react': + specifier: ^18.2.55 + version: 18.2.55 + '@types/react-dom': + specifier: ^18.2.19 + version: 18.2.19 + '@types/uuid': + specifier: 9.0.8 + version: 9.0.8 + autoprefixer: + specifier: ^10.4.17 + version: 10.4.17(postcss@8.4.35) + babel-loader: + specifier: ^9.1.3 + version: 9.1.3(@babel/core@7.23.9)(webpack@5.90.1) + css-loader: + specifier: ^6.10.0 + version: 6.10.0(webpack@5.90.1) + eslint: + specifier: ^8 + version: 8.56.0 + eslint-config-next: + specifier: 14.0.0 + version: 14.0.0(eslint@8.56.0)(typescript@5.3.3) + postcss: + specifier: ^8.4.35 + version: 8.4.35 + sass: + specifier: ^1.49.7 + version: 1.70.0 + sass-loader: + specifier: ^13.3.3 + version: 13.3.3(sass@1.70.0)(webpack@5.90.1) + style-loader: + specifier: ^3.3.4 + version: 3.3.4(webpack@5.90.1) + supabase: + specifier: 1.142.2 + version: 1.142.2 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 + demos/supabase-todo-list-react-native: dependencies: '@azure/core-asynciterator-polyfill': @@ -203,13 +489,13 @@ importers: version: 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/preset-classic': specifier: ^3.1.1 - version: 3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) + version: 3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) '@docusaurus/theme-search-algolia': specifier: ^3.1.1 - version: 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) + version: 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) '@mdx-js/react': specifier: ^3.0.0 - version: 3.0.0(@types/react@18.2.48)(react@18.2.0) + version: 3.0.0(@types/react@18.2.55)(react@18.2.0) clsx: specifier: ^1.2.1 version: 1.2.1 @@ -231,7 +517,7 @@ importers: version: 3.1.1(react-dom@18.2.0)(react@18.2.0) '@docusaurus/theme-classic': specifier: ^3.1.1 - version: 3.1.1(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + version: 3.1.1(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/tsconfig': specifier: 3.1.1 version: 3.1.1 @@ -401,6 +687,11 @@ importers: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: @@ -539,6 +830,11 @@ packages: '@algolia/requester-common': 4.22.1 dev: false + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -546,6 +842,18 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + /@azure/core-asynciterator-polyfill@1.0.2: resolution: {integrity: sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==} engines: {node: '>=12.0.0'} @@ -2135,7 +2443,7 @@ packages: resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.22.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): + /@docsearch/react@3.5.2(@algolia/client-search@4.22.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -2155,7 +2463,7 @@ packages: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) '@docsearch/css': 3.5.2 - '@types/react': 18.2.48 + '@types/react': 18.2.55 algoliasearch: 4.22.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2191,7 +2499,7 @@ packages: '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 - autoprefixer: 10.4.17(postcss@8.4.33) + autoprefixer: 10.4.17(postcss@8.4.35) babel-loader: 9.1.3(@babel/core@7.23.9)(webpack@5.90.1) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 @@ -2205,7 +2513,7 @@ packages: core-js: 3.35.1 css-loader: 6.10.0(webpack@5.90.1) css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.3)(webpack@5.90.1) - cssnano: 5.1.15(postcss@8.4.33) + cssnano: 5.1.15(postcss@8.4.35) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 @@ -2218,8 +2526,8 @@ packages: leven: 3.1.0 lodash: 4.17.21 mini-css-extract-plugin: 2.8.0(webpack@5.90.1) - postcss: 8.4.33 - postcss-loader: 7.3.4(postcss@8.4.33)(typescript@5.3.3)(webpack@5.90.1) + postcss: 8.4.35 + postcss-loader: 7.3.4(postcss@8.4.35)(typescript@5.3.3)(webpack@5.90.1) prompts: 2.4.2 react: 18.2.0 react-dev-utils: 12.0.1(typescript@5.3.3)(webpack@5.90.1) @@ -2238,7 +2546,7 @@ packages: tslib: 2.6.2 update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.90.1) - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.10.1 webpack-dev-server: 4.15.1(webpack@5.90.1) webpack-merge: 5.10.0 @@ -2266,9 +2574,9 @@ packages: resolution: {integrity: sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==} engines: {node: '>=18.0'} dependencies: - cssnano-preset-advanced: 5.3.10(postcss@8.4.33) - postcss: 8.4.33 - postcss-sort-media-queries: 4.4.1(postcss@8.4.33) + cssnano-preset-advanced: 5.3.10(postcss@8.4.35) + postcss: 8.4.35 + postcss-sort-media-queries: 4.4.1(postcss@8.4.35) tslib: 2.6.2 /@docusaurus/logger@3.1.1: @@ -2312,7 +2620,7 @@ packages: unist-util-visit: 5.0.0 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.90.1) vfile: 6.0.1 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2330,7 +2638,7 @@ packages: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 '@types/react-router-config': 5.0.11 '@types/react-router-dom': 5.3.3 react: 18.2.0 @@ -2369,7 +2677,7 @@ packages: tslib: 2.6.2 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -2411,7 +2719,7 @@ packages: react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 utility-types: 3.11.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -2446,7 +2754,7 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -2633,7 +2941,7 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3): + /@docusaurus/preset-classic@3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3): resolution: {integrity: sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==} engines: {node: '>=18.0'} peerDependencies: @@ -2649,9 +2957,9 @@ packages: '@docusaurus/plugin-google-gtag': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/plugin-google-tag-manager': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/plugin-sitemap': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) - '@docusaurus/theme-classic': 3.1.1(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + '@docusaurus/theme-classic': 3.1.1(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) - '@docusaurus/theme-search-algolia': 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) + '@docusaurus/theme-search-algolia': 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3) '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2682,11 +2990,11 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.55 prop-types: 15.8.1 react: 18.2.0 - /@docusaurus/theme-classic@3.1.1(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3): + /@docusaurus/theme-classic@3.1.1(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3): resolution: {integrity: sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==} engines: {node: '>=18.0'} peerDependencies: @@ -2705,13 +3013,13 @@ packages: '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) - '@mdx-js/react': 3.0.0(@types/react@18.2.48)(react@18.2.0) + '@mdx-js/react': 3.0.0(@types/react@18.2.55)(react@18.2.0) clsx: 2.1.0 copy-text-to-clipboard: 3.2.0 infima: 0.2.0-alpha.43 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.33 + postcss: 8.4.35 prism-react-renderer: 2.3.1(react@18.2.0) prismjs: 1.29.0 react: 18.2.0 @@ -2754,7 +3062,7 @@ packages: '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 '@types/react-router-config': 5.0.11 clsx: 2.1.0 parse-numeric-range: 1.3.0 @@ -2782,14 +3090,14 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/theme-search-algolia@3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3): + /@docusaurus/theme-search-algolia@3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.3.3): resolution: {integrity: sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.22.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) + '@docsearch/react': 3.5.2(@algolia/client-search@4.22.1)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@docusaurus/logger': 3.1.1 '@docusaurus/plugin-content-docs': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) @@ -2849,14 +3157,14 @@ packages: dependencies: '@mdx-js/mdx': 3.0.0 '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 commander: 5.1.0 joi: 17.12.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) utility-types: 3.11.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -2920,7 +3228,7 @@ packages: shelljs: 0.8.5 tslib: 2.6.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.90.1) - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -2928,6 +3236,30 @@ packages: - uglify-js - webpack-cli + /@ducanh2912/next-pwa@9.7.2(next@14.1.0)(webpack@5.90.1): + resolution: {integrity: sha512-KNdWIr8297L6TRyEeJQUzZqgP+m10GmaV6tacZ6wIcON9J+b6Nz34eLx6B5Q5mQKxqbYHTDayVoMRc2uuA/Ahg==} + peerDependencies: + next: '>=11.0.0' + webpack: '>=5.9.0' + dependencies: + clean-webpack-plugin: 4.0.0(webpack@5.90.1) + fast-glob: 3.3.1 + next: 14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + semver: 7.5.4 + terser-webpack-plugin: 5.3.9(webpack@5.90.1) + webpack: 5.90.1(webpack-cli@5.1.4) + workbox-build: 7.0.0 + workbox-core: 7.0.0 + workbox-webpack-plugin: 7.0.0(webpack@5.90.1) + workbox-window: 7.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@types/babel__core' + - esbuild + - supports-color + - uglify-js + dev: false + /@egjs/hammerjs@2.0.17: resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} engines: {node: '>=0.8.0'} @@ -2935,166 +3267,526 @@ packages: '@types/hammerjs': 2.0.45 dev: false - /@expo/bunyan@4.0.0: - resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} - engines: {'0': node >=0.10.0} + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: - uuid: 8.3.2 - optionalDependencies: - mv: 2.1.1 - safe-json-stringify: 1.2.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.9 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 dev: false - /@expo/cli@0.17.3(@react-native/babel-preset@0.73.20)(expo-modules-autolinking@1.10.2): - resolution: {integrity: sha512-lIK8igsEQxTh4WuDlcEhE0wAJcDrAyjWDF00phdmwuSCpE5SaEXNlddOXvGxEVKPhUxHZUFo9NbfoQC+JVmkfA==} - hasBin: true + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} dependencies: - '@babel/runtime': 7.23.9 - '@expo/code-signing-certificates': 0.0.5 - '@expo/config': 8.5.4 - '@expo/config-plugins': 7.8.4 - '@expo/devcert': 1.1.0 - '@expo/env': 0.2.1 - '@expo/image-utils': 0.4.1 - '@expo/json-file': 8.3.0 - '@expo/metro-config': 0.17.3(@react-native/babel-preset@0.73.20) - '@expo/osascript': 2.1.0 - '@expo/package-manager': 1.4.2 - '@expo/plist': 0.1.0 - '@expo/prebuild-config': 6.7.4(expo-modules-autolinking@1.10.2) - '@expo/rudder-sdk-node': 1.1.1 - '@expo/spawn-async': 1.5.0 - '@expo/xcpretty': 4.3.1 - '@react-native/dev-middleware': 0.73.7 - '@urql/core': 2.3.6(graphql@15.8.0) - '@urql/exchange-retry': 0.3.0(graphql@15.8.0) - accepts: 1.3.8 - arg: 5.0.2 - better-opn: 3.0.2 - bplist-parser: 0.3.2 - cacache: 15.3.0 - chalk: 4.1.2 - ci-info: 3.9.0 - connect: 3.7.0 - debug: 4.3.4 - env-editor: 0.4.2 - find-yarn-workspace-root: 2.0.0 - form-data: 3.0.1 - freeport-async: 2.0.0 - fs-extra: 8.1.0 - getenv: 1.0.0 - glob: 7.2.3 - graphql: 15.8.0 - graphql-tag: 2.12.6(graphql@15.8.0) - https-proxy-agent: 5.0.1 - internal-ip: 4.3.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - json-schema-deref-sync: 0.13.0 - lodash.debounce: 4.0.8 - md5hex: 1.0.0 - minimatch: 3.1.2 - minipass: 3.3.6 - node-fetch: 2.7.0 - node-forge: 1.3.1 - npm-package-arg: 7.0.0 - open: 8.4.2 - ora: 3.4.0 - picomatch: 3.0.1 - pretty-bytes: 5.6.0 - progress: 2.0.3 - prompts: 2.4.2 - qrcode-terminal: 0.11.0 - require-from-string: 2.0.2 - requireg: 0.2.2 - resolve: 1.22.8 - resolve-from: 5.0.0 - resolve.exports: 2.0.2 - semver: 7.5.4 - send: 0.18.0 - slugify: 1.6.6 - source-map-support: 0.5.21 - structured-headers: 0.4.1 - tar: 6.2.0 - temp-dir: 2.0.0 - tempy: 0.7.1 - terminal-link: 2.1.1 - text-table: 0.2.0 - url-join: 4.0.0 - wrap-ansi: 7.0.0 - ws: 8.16.0 - transitivePeerDependencies: - - '@react-native/babel-preset' - - bluebird - - bufferutil - - encoding - - expo-modules-autolinking - - supports-color - - utf-8-validate + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 dev: false - /@expo/code-signing-certificates@0.0.5: - resolution: {integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==} - dependencies: - node-forge: 1.3.1 - nullthrows: 1.1.1 + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} dev: false - /@expo/config-plugins@7.8.4: - resolution: {integrity: sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg==} + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} dependencies: - '@expo/config-types': 50.0.0 - '@expo/fingerprint': 0.6.0 - '@expo/json-file': 8.3.0 - '@expo/plist': 0.1.0 - '@expo/sdk-runtime-versions': 1.0.0 - '@react-native/normalize-color': 2.1.0 - chalk: 4.1.2 - debug: 4.3.4 - find-up: 5.0.0 - getenv: 1.0.0 - glob: 7.1.6 - resolve-from: 5.0.0 - semver: 7.5.4 - slash: 3.0.0 - slugify: 1.6.6 - xcode: 3.0.1 - xml2js: 0.6.0 - transitivePeerDependencies: - - supports-color + '@emotion/memoize': 0.8.1 dev: false - /@expo/config-types@50.0.0: - resolution: {integrity: sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw==} + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@expo/config@8.5.4: - resolution: {integrity: sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q==} + /@emotion/react@11.11.3(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 7.8.4 - '@expo/config-types': 50.0.0 - '@expo/json-file': 8.3.0 - getenv: 1.0.0 - glob: 7.1.6 - require-from-string: 2.0.2 - resolve-from: 5.0.0 - semver: 7.5.3 - slugify: 1.6.6 - sucrase: 3.34.0 - transitivePeerDependencies: - - supports-color + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.55 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 dev: false - /@expo/devcert@1.1.0: - resolution: {integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==} + /@emotion/serialize@1.1.3: + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} dependencies: - application-config-path: 0.1.1 - command-exists: 1.2.9 - debug: 3.2.7 - eol: 0.9.1 - get-port: 3.2.0 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/styled@11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@types/react': 18.2.55 + react: 18.2.0 + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@expo/bunyan@4.0.0: + resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} + engines: {'0': node >=0.10.0} + dependencies: + uuid: 8.3.2 + optionalDependencies: + mv: 2.1.1 + safe-json-stringify: 1.2.0 + dev: false + + /@expo/cli@0.17.3(@react-native/babel-preset@0.73.20)(expo-modules-autolinking@1.10.2): + resolution: {integrity: sha512-lIK8igsEQxTh4WuDlcEhE0wAJcDrAyjWDF00phdmwuSCpE5SaEXNlddOXvGxEVKPhUxHZUFo9NbfoQC+JVmkfA==} + hasBin: true + dependencies: + '@babel/runtime': 7.23.9 + '@expo/code-signing-certificates': 0.0.5 + '@expo/config': 8.5.4 + '@expo/config-plugins': 7.8.4 + '@expo/devcert': 1.1.0 + '@expo/env': 0.2.1 + '@expo/image-utils': 0.4.1 + '@expo/json-file': 8.3.0 + '@expo/metro-config': 0.17.3(@react-native/babel-preset@0.73.20) + '@expo/osascript': 2.1.0 + '@expo/package-manager': 1.4.2 + '@expo/plist': 0.1.0 + '@expo/prebuild-config': 6.7.4(expo-modules-autolinking@1.10.2) + '@expo/rudder-sdk-node': 1.1.1 + '@expo/spawn-async': 1.5.0 + '@expo/xcpretty': 4.3.1 + '@react-native/dev-middleware': 0.73.7 + '@urql/core': 2.3.6(graphql@15.8.0) + '@urql/exchange-retry': 0.3.0(graphql@15.8.0) + accepts: 1.3.8 + arg: 5.0.2 + better-opn: 3.0.2 + bplist-parser: 0.3.2 + cacache: 15.3.0 + chalk: 4.1.2 + ci-info: 3.9.0 + connect: 3.7.0 + debug: 4.3.4 + env-editor: 0.4.2 + find-yarn-workspace-root: 2.0.0 + form-data: 3.0.1 + freeport-async: 2.0.0 + fs-extra: 8.1.0 + getenv: 1.0.0 + glob: 7.2.3 + graphql: 15.8.0 + graphql-tag: 2.12.6(graphql@15.8.0) + https-proxy-agent: 5.0.1 + internal-ip: 4.3.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + js-yaml: 3.14.1 + json-schema-deref-sync: 0.13.0 + lodash.debounce: 4.0.8 + md5hex: 1.0.0 + minimatch: 3.1.2 + minipass: 3.3.6 + node-fetch: 2.7.0 + node-forge: 1.3.1 + npm-package-arg: 7.0.0 + open: 8.4.2 + ora: 3.4.0 + picomatch: 3.0.1 + pretty-bytes: 5.6.0 + progress: 2.0.3 + prompts: 2.4.2 + qrcode-terminal: 0.11.0 + require-from-string: 2.0.2 + requireg: 0.2.2 + resolve: 1.22.8 + resolve-from: 5.0.0 + resolve.exports: 2.0.2 + semver: 7.5.4 + send: 0.18.0 + slugify: 1.6.6 + source-map-support: 0.5.21 + structured-headers: 0.4.1 + tar: 6.2.0 + temp-dir: 2.0.0 + tempy: 0.7.1 + terminal-link: 2.1.1 + text-table: 0.2.0 + url-join: 4.0.0 + wrap-ansi: 7.0.0 + ws: 8.16.0 + transitivePeerDependencies: + - '@react-native/babel-preset' + - bluebird + - bufferutil + - encoding + - expo-modules-autolinking + - supports-color + - utf-8-validate + dev: false + + /@expo/code-signing-certificates@0.0.5: + resolution: {integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==} + dependencies: + node-forge: 1.3.1 + nullthrows: 1.1.1 + dev: false + + /@expo/config-plugins@7.8.4: + resolution: {integrity: sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg==} + dependencies: + '@expo/config-types': 50.0.0 + '@expo/fingerprint': 0.6.0 + '@expo/json-file': 8.3.0 + '@expo/plist': 0.1.0 + '@expo/sdk-runtime-versions': 1.0.0 + '@react-native/normalize-color': 2.1.0 + chalk: 4.1.2 + debug: 4.3.4 + find-up: 5.0.0 + getenv: 1.0.0 + glob: 7.1.6 + resolve-from: 5.0.0 + semver: 7.5.4 + slash: 3.0.0 + slugify: 1.6.6 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/config-types@50.0.0: + resolution: {integrity: sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw==} + dev: false + + /@expo/config@8.5.4: + resolution: {integrity: sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q==} + dependencies: + '@babel/code-frame': 7.10.4 + '@expo/config-plugins': 7.8.4 + '@expo/config-types': 50.0.0 + '@expo/json-file': 8.3.0 + getenv: 1.0.0 + glob: 7.1.6 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + semver: 7.5.3 + slugify: 1.6.6 + sucrase: 3.34.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/devcert@1.1.0: + resolution: {integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==} + dependencies: + application-config-path: 0.1.1 + command-exists: 1.2.9 + debug: 3.2.7 + eol: 0.9.1 + get-port: 3.2.0 glob: 7.2.3 lodash: 4.17.21 mkdirp: 0.5.6 @@ -3119,404 +3811,970 @@ packages: - supports-color dev: false - /@expo/fingerprint@0.6.0: - resolution: {integrity: sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==} - hasBin: true + /@expo/fingerprint@0.6.0: + resolution: {integrity: sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + debug: 4.3.4 + find-up: 5.0.0 + minimatch: 3.1.2 + p-limit: 3.1.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/image-utils@0.4.1: + resolution: {integrity: sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw==} + dependencies: + '@expo/spawn-async': 1.5.0 + chalk: 4.1.2 + fs-extra: 9.0.0 + getenv: 1.0.0 + jimp-compact: 0.16.1 + node-fetch: 2.7.0 + parse-png: 2.1.0 + resolve-from: 5.0.0 + semver: 7.3.2 + tempy: 0.3.0 + transitivePeerDependencies: + - encoding + dev: false + + /@expo/json-file@8.3.0: + resolution: {integrity: sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g==} + dependencies: + '@babel/code-frame': 7.10.4 + json5: 2.2.3 + write-file-atomic: 2.4.3 + dev: false + + /@expo/metro-config@0.17.3(@react-native/babel-preset@0.73.20): + resolution: {integrity: sha512-YW8ixbaz6yL7/Mg1rJJejiAAVQQKjGY1wXvT2Dh487r/r9/j1yE1YRS/oRY1yItYzbnHvO0p0jMnEGfiFYL3Tg==} + peerDependencies: + '@react-native/babel-preset': '*' + dependencies: + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@expo/config': 8.5.4 + '@expo/env': 0.2.1 + '@expo/json-file': 8.3.0 + '@expo/spawn-async': 1.7.2 + '@react-native/babel-preset': 0.73.20(@babel/core@7.23.9)(@babel/preset-env@7.23.9) + babel-preset-fbjs: 3.4.0(@babel/core@7.23.9) + chalk: 4.1.2 + debug: 4.3.4 + find-yarn-workspace-root: 2.0.0 + fs-extra: 9.1.0 + getenv: 1.0.0 + glob: 7.2.3 + jsc-safe-url: 0.2.4 + lightningcss: 1.19.0 + postcss: 8.4.35 + resolve-from: 5.0.0 + sucrase: 3.34.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/metro-runtime@3.1.2(react-native@0.73.2): + resolution: {integrity: sha512-Wekv2AZ3HY0NG9Im8AMB1KHGyHjmALg6xekVK34724I/DLtcocLKtQEP04oI9GcAZBotAhROHH5E4ADhJAEgYg==} + peerDependencies: + react-native: '*' + dependencies: + react-native: 0.73.2(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) + dev: false + + /@expo/osascript@2.1.0: + resolution: {integrity: sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow==} + engines: {node: '>=12'} + dependencies: + '@expo/spawn-async': 1.7.2 + exec-async: 2.2.0 + dev: false + + /@expo/package-manager@1.4.2: + resolution: {integrity: sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg==} + dependencies: + '@expo/json-file': 8.3.0 + '@expo/spawn-async': 1.7.2 + ansi-regex: 5.0.1 + chalk: 4.1.2 + find-up: 5.0.0 + find-yarn-workspace-root: 2.0.0 + js-yaml: 3.14.1 + micromatch: 4.0.5 + npm-package-arg: 7.0.0 + ora: 3.4.0 + split: 1.0.1 + sudo-prompt: 9.1.1 + dev: false + + /@expo/plist@0.1.0: + resolution: {integrity: sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g==} + dependencies: + '@xmldom/xmldom': 0.7.13 + base64-js: 1.5.1 + xmlbuilder: 14.0.0 + dev: false + + /@expo/prebuild-config@6.7.4(expo-modules-autolinking@1.10.2): + resolution: {integrity: sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA==} + peerDependencies: + expo-modules-autolinking: '>=0.8.1' + dependencies: + '@expo/config': 8.5.4 + '@expo/config-plugins': 7.8.4 + '@expo/config-types': 50.0.0 + '@expo/image-utils': 0.4.1 + '@expo/json-file': 8.3.0 + debug: 4.3.4 + expo-modules-autolinking: 1.10.2 + fs-extra: 9.1.0 + resolve-from: 5.0.0 + semver: 7.5.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@expo/rudder-sdk-node@1.1.1: + resolution: {integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==} + engines: {node: '>=12'} + dependencies: + '@expo/bunyan': 4.0.0 + '@segment/loosely-validate-event': 2.0.0 + fetch-retry: 4.1.1 + md5: 2.3.0 + node-fetch: 2.7.0 + remove-trailing-slash: 0.1.1 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + dev: false + + /@expo/sdk-runtime-versions@1.0.0: + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + dev: false + + /@expo/server@0.3.0: + resolution: {integrity: sha512-5oIqedpLVMnf1LGI9Xd5OOGmK3DjgH9VpuqVN4e/6DwLT05RZJMyI7ylfG6QSy1e44yOgjv242tLyg0e/zdZ+A==} + dependencies: + '@remix-run/node': 1.19.3 + abort-controller: 3.0.0 + debug: 4.3.4 + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/spawn-async@1.5.0: + resolution: {integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 6.0.5 + dev: false + + /@expo/spawn-async@1.7.2: + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + dependencies: + cross-spawn: 7.0.3 + dev: false + + /@expo/vector-icons@14.0.0: + resolution: {integrity: sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA==} + dev: false + + /@expo/xcpretty@4.3.1: + resolution: {integrity: sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==} + hasBin: true + dependencies: + '@babel/code-frame': 7.10.4 + chalk: 4.1.2 + find-up: 5.0.0 + js-yaml: 4.1.0 + dev: false + + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.6.1: + resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + + /@fontsource/roboto@5.0.8: + resolution: {integrity: sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==} + dev: false + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + + /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 15.8.0 + dev: false + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} dependencies: - '@expo/spawn-async': 1.7.2 - chalk: 4.1.2 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 - find-up: 5.0.0 minimatch: 3.1.2 - p-limit: 3.1.0 - resolve-from: 5.0.0 transitivePeerDependencies: - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + + /@isaacs/ttlcache@1.4.1: + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} dev: false - /@expo/image-utils@0.4.1: - resolution: {integrity: sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw==} + /@jest/create-cache-key-function@29.7.0: + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@expo/spawn-async': 1.5.0 + '@jest/types': 29.6.3 + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.16 + jest-mock: 29.7.0 + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.11.16 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + + /@jest/types@26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.16 + '@types/yargs': 15.0.19 chalk: 4.1.2 - fs-extra: 9.0.0 - getenv: 1.0.0 - jimp-compact: 0.16.1 - node-fetch: 2.7.0 - parse-png: 2.1.0 - resolve-from: 5.0.0 - semver: 7.3.2 - tempy: 0.3.0 - transitivePeerDependencies: - - encoding + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.16 + '@types/yargs': 16.0.9 + chalk: 4.1.2 + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.16 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + /@journeyapps/react-native-quick-sqlite@1.1.1(react-native@0.72.4)(react@18.2.0): + resolution: {integrity: sha512-5I8zUZoFRgtnagjQygqnSyWG0L39ycFvum+ytsMmFW8LY1GpEZ+a3I6fWggwM82/Cc9YOheCVRIz47g0uBBZug==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-native: 0.72.4(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) + uuid: 3.4.0 + dev: true + + /@journeyapps/react-native-quick-sqlite@1.1.1(react-native@0.73.2)(react@18.2.0): + resolution: {integrity: sha512-5I8zUZoFRgtnagjQygqnSyWG0L39ycFvum+ytsMmFW8LY1GpEZ+a3I6fWggwM82/Cc9YOheCVRIz47g0uBBZug==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-native: 0.73.2(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) + uuid: 3.4.0 dev: false - /@expo/json-file@8.3.0: - resolution: {integrity: sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g==} + /@journeyapps/wa-sqlite@0.1.1: + resolution: {integrity: sha512-cLPddbJYBpzII7ZBAA4fNKW2yLf3H03cGrz+JteXCfSjzxbYhnflAGD8WjefmeLXQUr2vcOYm3SgC82LJYZyzQ==} + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} dependencies: - '@babel/code-frame': 7.10.4 - json5: 2.2.3 - write-file-atomic: 2.4.3 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + + /@lexical/clipboard@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-6xggT8b0hd4OQy25mBH+yiJsr3Bm8APHjDOd3yINCGeiiHXIC+2qKQn3MG70euxQQuyzq++tYHcSsFq42g8Jyw==} + peerDependencies: + lexical: 0.11.3 + dependencies: + '@lexical/html': 0.11.3(lexical@0.11.3) + '@lexical/list': 0.11.3(lexical@0.11.3) + '@lexical/selection': 0.11.3(lexical@0.11.3) + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/metro-config@0.17.3(@react-native/babel-preset@0.73.20): - resolution: {integrity: sha512-YW8ixbaz6yL7/Mg1rJJejiAAVQQKjGY1wXvT2Dh487r/r9/j1yE1YRS/oRY1yItYzbnHvO0p0jMnEGfiFYL3Tg==} + /@lexical/code@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-BIMPd2op65iP4N9SkKIUVodZoWeSsnk6skNJ8UHBO/Rg0ZxyAqxLpnBhEgHq2QOoTBbEW6OEFtkc7/+f9LINZg==} peerDependencies: - '@react-native/babel-preset': '*' + lexical: 0.11.3 dependencies: - '@babel/core': 7.23.9 - '@babel/generator': 7.23.6 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - '@expo/config': 8.5.4 - '@expo/env': 0.2.1 - '@expo/json-file': 8.3.0 - '@expo/spawn-async': 1.7.2 - '@react-native/babel-preset': 0.73.20(@babel/core@7.23.9)(@babel/preset-env@7.23.9) - babel-preset-fbjs: 3.4.0(@babel/core@7.23.9) - chalk: 4.1.2 - debug: 4.3.4 - find-yarn-workspace-root: 2.0.0 - fs-extra: 9.1.0 - getenv: 1.0.0 - glob: 7.2.3 - jsc-safe-url: 0.2.4 - lightningcss: 1.19.0 - postcss: 8.4.33 - resolve-from: 5.0.0 - sucrase: 3.34.0 - transitivePeerDependencies: - - supports-color + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 + prismjs: 1.29.0 dev: false - /@expo/metro-runtime@3.1.2(react-native@0.73.2): - resolution: {integrity: sha512-Wekv2AZ3HY0NG9Im8AMB1KHGyHjmALg6xekVK34724I/DLtcocLKtQEP04oI9GcAZBotAhROHH5E4ADhJAEgYg==} + /@lexical/dragon@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-S18uwqOOpV2yIAFVWqSvBdhZ5BGadPQO4ejZF15wP8LUuqkxCs+0I/MjLovQ7tx0Cx34KdDaOXtM6XeG74ixYw==} peerDependencies: - react-native: '*' + lexical: 0.11.3 dependencies: - react-native: 0.73.2(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) + lexical: 0.11.3 dev: false - /@expo/osascript@2.1.0: - resolution: {integrity: sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow==} - engines: {node: '>=12'} + /@lexical/hashtag@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-7auoaWp2QhsX9/Bq0SxLXatUaSwqoT9HlWNTH2vKsw8tdeUBYacTHLuBNncTGrznXLG0/B5+FWoLuM6Pzqq4Ig==} + peerDependencies: + lexical: 0.11.3 dependencies: - '@expo/spawn-async': 1.7.2 - exec-async: 2.2.0 + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/package-manager@1.4.2: - resolution: {integrity: sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg==} + /@lexical/history@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-QLJQRH2rbadRwXd4c/U4TqjLWDQna6Q43nCocIZF+SdVG9TlASp7m6dS7hiHfPtV1pkxJUxPhZY6EsB/Ok5WGA==} + peerDependencies: + lexical: 0.11.3 dependencies: - '@expo/json-file': 8.3.0 - '@expo/spawn-async': 1.7.2 - ansi-regex: 5.0.1 - chalk: 4.1.2 - find-up: 5.0.0 - find-yarn-workspace-root: 2.0.0 - js-yaml: 3.14.1 - micromatch: 4.0.5 - npm-package-arg: 7.0.0 - ora: 3.4.0 - split: 1.0.1 - sudo-prompt: 9.1.1 + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/plist@0.1.0: - resolution: {integrity: sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g==} + /@lexical/html@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-+8AYnxxml9PneZLkGfdTenqDjE2yD1ZfCmQLrD/L1TEn22OjZh4uvKVHb13wEhgUZTuLKF0PNdnuecko9ON/aQ==} + peerDependencies: + lexical: 0.11.3 dependencies: - '@xmldom/xmldom': 0.7.13 - base64-js: 1.5.1 - xmlbuilder: 14.0.0 + '@lexical/selection': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/prebuild-config@6.7.4(expo-modules-autolinking@1.10.2): - resolution: {integrity: sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA==} + /@lexical/link@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-stAjIrDrF18dPKK25ExPwMCcMe0KKD0FWVzo3F7ejh9DvrQcLFeBPcs8ze71chS3D5fQDB/CzdwvMjEViKmq2A==} peerDependencies: - expo-modules-autolinking: '>=0.8.1' + lexical: 0.11.3 dependencies: - '@expo/config': 8.5.4 - '@expo/config-plugins': 7.8.4 - '@expo/config-types': 50.0.0 - '@expo/image-utils': 0.4.1 - '@expo/json-file': 8.3.0 - debug: 4.3.4 - expo-modules-autolinking: 1.10.2 - fs-extra: 9.1.0 - resolve-from: 5.0.0 - semver: 7.5.3 - xml2js: 0.6.0 - transitivePeerDependencies: - - encoding - - supports-color + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/rudder-sdk-node@1.1.1: - resolution: {integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==} - engines: {node: '>=12'} + /@lexical/list@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-Cs9071wDfqi4j1VgodceiR1jTHj13eCoEJDhr3e/FW0x5we7vfbTMtWlOWbveIoryAh+rQNgiD5e8SrAm6Zs3g==} + peerDependencies: + lexical: 0.11.3 dependencies: - '@expo/bunyan': 4.0.0 - '@segment/loosely-validate-event': 2.0.0 - fetch-retry: 4.1.1 - md5: 2.3.0 - node-fetch: 2.7.0 - remove-trailing-slash: 0.1.1 - uuid: 8.3.2 + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 + dev: false + + /@lexical/mark@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-0wAtufmaA0rMVFXoiJ0sY/tiJsQbHuDpgywb1Qa8qnZZcg7ZTrQMz9Go0fEWYcbSp8OH2o0cjbDTz3ACS1qCUA==} + peerDependencies: + lexical: 0.11.3 + dependencies: + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 + dev: false + + /@lexical/markdown@0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(lexical@0.11.3): + resolution: {integrity: sha512-sF8ow32BDme3UvxaKpf+j+vMc4T/XvDEzteZHmvvP7NX/iUtK3yUkTyT7rKuGwiKLYfMBwQaKMGjU3/nlIOzUg==} + peerDependencies: + lexical: 0.11.3 + dependencies: + '@lexical/code': 0.11.3(lexical@0.11.3) + '@lexical/link': 0.11.3(lexical@0.11.3) + '@lexical/list': 0.11.3(lexical@0.11.3) + '@lexical/rich-text': 0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(@lexical/utils@0.11.3)(lexical@0.11.3) + '@lexical/text': 0.11.3(lexical@0.11.3) + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 transitivePeerDependencies: - - encoding + - '@lexical/clipboard' + - '@lexical/selection' + dev: false + + /@lexical/offset@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-3H9X8iqDSk0LrMOHZuqYuqX4EYGb78TIhtjrFbLJi/OgKmHaSeLx59xcMZdgd5kBdRitzQYMmvbRDvbLfMgWrA==} + peerDependencies: + lexical: 0.11.3 + dependencies: + lexical: 0.11.3 + dev: false + + /@lexical/overflow@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-ShjCG8lICShOBKwrpP+9PjRFKEBCSUUMjbIGZfLnoL//3hyRtGv5aRgRyfJlRgDhCve0ROt5znLJV88EXzGRyA==} + peerDependencies: + lexical: 0.11.3 + dependencies: + lexical: 0.11.3 dev: false - /@expo/sdk-runtime-versions@1.0.0: - resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + /@lexical/plain-text@0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(@lexical/utils@0.11.3)(lexical@0.11.3): + resolution: {integrity: sha512-cQ5Us+GNzShyjjgRqWTnYv0rC+jHJ96LvBA1aSieM77H8/Im5BeoLl6TgBK2NqPkp8fGpj8JnDEdT8h9Qh1jtA==} + peerDependencies: + '@lexical/clipboard': 0.11.3 + '@lexical/selection': 0.11.3 + '@lexical/utils': 0.11.3 + lexical: 0.11.3 + dependencies: + '@lexical/clipboard': 0.11.3(lexical@0.11.3) + '@lexical/selection': 0.11.3(lexical@0.11.3) + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/server@0.3.0: - resolution: {integrity: sha512-5oIqedpLVMnf1LGI9Xd5OOGmK3DjgH9VpuqVN4e/6DwLT05RZJMyI7ylfG6QSy1e44yOgjv242tLyg0e/zdZ+A==} + /@lexical/react@0.11.3(lexical@0.11.3)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.11): + resolution: {integrity: sha512-Rn0Agnrz3uLIWbNyS9PRlkxOxcIDl2kxaVfgBacqQtYKR0ZVB2Hnoi89Cq6VmWPovauPyryx4Q3FC8Y11X7Otg==} + peerDependencies: + lexical: 0.11.3 + react: '>=17.x' + react-dom: '>=17.x' dependencies: - '@remix-run/node': 1.19.3 - abort-controller: 3.0.0 - debug: 4.3.4 - source-map-support: 0.5.21 + '@lexical/clipboard': 0.11.3(lexical@0.11.3) + '@lexical/code': 0.11.3(lexical@0.11.3) + '@lexical/dragon': 0.11.3(lexical@0.11.3) + '@lexical/hashtag': 0.11.3(lexical@0.11.3) + '@lexical/history': 0.11.3(lexical@0.11.3) + '@lexical/link': 0.11.3(lexical@0.11.3) + '@lexical/list': 0.11.3(lexical@0.11.3) + '@lexical/mark': 0.11.3(lexical@0.11.3) + '@lexical/markdown': 0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(lexical@0.11.3) + '@lexical/overflow': 0.11.3(lexical@0.11.3) + '@lexical/plain-text': 0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(@lexical/utils@0.11.3)(lexical@0.11.3) + '@lexical/rich-text': 0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(@lexical/utils@0.11.3)(lexical@0.11.3) + '@lexical/selection': 0.11.3(lexical@0.11.3) + '@lexical/table': 0.11.3(lexical@0.11.3) + '@lexical/text': 0.11.3(lexical@0.11.3) + '@lexical/utils': 0.11.3(lexical@0.11.3) + '@lexical/yjs': 0.11.3(lexical@0.11.3)(yjs@13.6.11) + lexical: 0.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-error-boundary: 3.1.4(react@18.2.0) transitivePeerDependencies: - - supports-color + - yjs dev: false - /@expo/spawn-async@1.5.0: - resolution: {integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==} - engines: {node: '>=4'} + /@lexical/rich-text@0.11.3(@lexical/clipboard@0.11.3)(@lexical/selection@0.11.3)(@lexical/utils@0.11.3)(lexical@0.11.3): + resolution: {integrity: sha512-fBFs6wMS7GFLbk+mzIWtwpP+EmnTZZ5bHpveuQ5wXONBuUuLcsYF5KO7UhLxXNLmiViV6lxatZPavEzgZdW7oQ==} + peerDependencies: + '@lexical/clipboard': 0.11.3 + '@lexical/selection': 0.11.3 + '@lexical/utils': 0.11.3 + lexical: 0.11.3 dependencies: - cross-spawn: 6.0.5 + '@lexical/clipboard': 0.11.3(lexical@0.11.3) + '@lexical/selection': 0.11.3(lexical@0.11.3) + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/spawn-async@1.7.2: - resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} - engines: {node: '>=12'} + /@lexical/selection@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-15lQpcKT/vd7XZ5pnF1nb+kpKb72e9Yi1dVqieSxTeXkzt1cAZFKP3NB4RlhOKCv1N+glSBnjSxRwgsFfbD+NQ==} + peerDependencies: + lexical: 0.11.3 dependencies: - cross-spawn: 7.0.3 + lexical: 0.11.3 dev: false - /@expo/vector-icons@14.0.0: - resolution: {integrity: sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA==} + /@lexical/table@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-EyRnN39CSPsMceADBR7Kf+sBHNpNQlPEkn/52epeDSnakR6s80woyrA3kIzKo6mLB4afvoqdYc7RfR96M9JLIA==} + peerDependencies: + lexical: 0.11.3 + dependencies: + '@lexical/utils': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@expo/xcpretty@4.3.1: - resolution: {integrity: sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==} - hasBin: true + /@lexical/text@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-gCEN8lJyR6b+yaOwKWGj79pbOfCQPWU/PHWyoNFUkEJXn3KydCzr2EYb6ta2cvQWRQU4G2BClKCR56jL4NS+qg==} + peerDependencies: + lexical: 0.11.3 dependencies: - '@babel/code-frame': 7.10.4 - chalk: 4.1.2 - find-up: 5.0.0 - js-yaml: 4.1.0 + lexical: 0.11.3 dev: false - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + /@lexical/utils@0.11.3(lexical@0.11.3): + resolution: {integrity: sha512-vC4saCrlcmyIJnvrYKw1uYxZojlD1DCIBsFlgmO8kXyRYXjj+o/8PBdn2dsgSQ3rADrC2mUloOm/maekDcYe9Q==} + peerDependencies: + lexical: 0.11.3 + dependencies: + '@lexical/list': 0.11.3(lexical@0.11.3) + '@lexical/selection': 0.11.3(lexical@0.11.3) + '@lexical/table': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 dev: false - /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): - resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + /@lexical/yjs@0.11.3(lexical@0.11.3)(yjs@13.6.11): + resolution: {integrity: sha512-TLDQG2FSEw/aOfppEBb0wRlIuzJ57W//8ImfzyZvckSC12tvU0YKQQX8nQz/rybXdyfRy5eN+8gX5K2EyZx+pQ==} peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + lexical: 0.11.3 + yjs: '>=13.5.22' dependencies: - graphql: 15.8.0 + '@lexical/offset': 0.11.3(lexical@0.11.3) + lexical: 0.11.3 + yjs: 13.6.11 dev: false - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + /@manypkg/find-root@1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.23.9 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + /@manypkg/get-packages@1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@hapi/hoek': 9.3.0 + '@babel/runtime': 7.23.9 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true - /@isaacs/ttlcache@1.4.1: - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} - engines: {node: '>=12'} - dev: false + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.4 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.11 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color - /@jest/create-cache-key-function@29.7.0: - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@mdx-js/react@3.0.0(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' dependencies: - '@jest/types': 29.6.3 + '@types/mdx': 2.0.11 + '@types/react': 18.2.55 + react: 18.2.0 - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@mui/base@5.0.0-beta.34(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.11.16 - jest-mock: 29.7.0 + '@babel/runtime': 7.23.9 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.55) + '@mui/utils': 5.15.8(@types/react@18.2.55)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@types/react': 18.2.55 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@mui/core-downloads-tracker@5.15.8: + resolution: {integrity: sha512-W6R1dZJgbYfLmQKf7Es2WUw0pkDkEVUf2jA22DYu0JOa9M3pjvOqoC9HgOPGNNJTu6SCWLSWh3euv1Jn2NmeQA==} + dev: false + + /@mui/icons-material@5.15.8(@mui/material@5.15.7)(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-3Ikivf+BOJ7jT1/71HrbKeicgF9ENM4qo+J1050HMJLtLiJEVXbicnsg2oWJZL+0AsrOMaKnTmx1URBpkctLWg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.16 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@babel/runtime': 7.23.9 + '@mui/material': 5.15.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.55 + react: 18.2.0 + dev: false - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@mui/material@5.15.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-l6+AiKZH3iOJmZCnlpel8ghYQe9Lq0BEuKP8fGj3g5xz4arO9GydqYAtLPMvuHKtArj8lJGNuT2yHYxmejincA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: - '@sinclair/typebox': 0.27.8 + '@babel/runtime': 7.23.9 + '@emotion/react': 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0) + '@mui/base': 5.0.0-beta.34(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.8 + '@mui/system': 5.15.8(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.55) + '@mui/utils': 5.15.8(@types/react@18.2.55)(react@18.2.0) + '@types/react': 18.2.55 + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} + /@mui/private-theming@5.15.8(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-HMDPO416iMZPqs8nGUL3GJMDNpJtE1Uefw/Aw+zTKJHX5JnT+Bms41e2065BUT/zR5dYcKjFP4gQMwW5QX7nvA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.16 - '@types/yargs': 15.0.19 - chalk: 4.1.2 + '@babel/runtime': 7.23.9 + '@mui/utils': 5.15.8(@types/react@18.2.55)(react@18.2.0) + '@types/react': 18.2.55 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@mui/styled-engine@5.15.8(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-31ZKPGsS0OiSwuzi8RWoTiWRdUWXPRiOQkyG9bRYX/zvoYeBXEdbsLEgbryug5mVRsPpvwbH5q/i/t6MkjQ71g==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.16 - '@types/yargs': 16.0.9 - chalk: 4.1.2 + '@babel/runtime': 7.23.9 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0) + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@mui/system@5.15.8(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-BUMJvlz1UqIqDPyrvc+MwjOUkWKskUPAOUuRh2KMAworiXuuUmtIivxSfdGll2ex6RHSylu4yc5dJZByOI8EcQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.16 - '@types/yargs': 17.0.32 - chalk: 4.1.2 + '@babel/runtime': 7.23.9 + '@emotion/react': 11.11.3(@types/react@18.2.55)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.55)(react@18.2.0) + '@mui/private-theming': 5.15.8(@types/react@18.2.55)(react@18.2.0) + '@mui/styled-engine': 5.15.8(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.55) + '@mui/utils': 5.15.8(@types/react@18.2.55)(react@18.2.0) + '@types/react': 18.2.55 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@journeyapps/react-native-quick-sqlite@1.1.1(react-native@0.72.4)(react@18.2.0): - resolution: {integrity: sha512-5I8zUZoFRgtnagjQygqnSyWG0L39ycFvum+ytsMmFW8LY1GpEZ+a3I6fWggwM82/Cc9YOheCVRIz47g0uBBZug==} + /@mui/types@7.2.13(@types/react@18.2.55): + resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} peerDependencies: - react: '*' - react-native: '*' + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - lodash: 4.17.21 + '@types/react': 18.2.55 + dev: false + + /@mui/utils@5.15.8(@types/react@18.2.55)(react@18.2.0): + resolution: {integrity: sha512-Q6Z/xSxi1Z6xQ5Qj9p4ZTHudwfrrwFALtU6H1O222pXudg9Qm0zHdiwJQiHT9L6jMIN78ZujEfGHserMoHUrQw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.9 + '@types/prop-types': 15.7.11 + '@types/react': 18.2.55 + prop-types: 15.8.1 react: 18.2.0 - react-native: 0.72.4(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) - uuid: 3.4.0 - dev: true + react-is: 18.2.0 + dev: false - /@journeyapps/react-native-quick-sqlite@1.1.1(react-native@0.73.2)(react@18.2.0): - resolution: {integrity: sha512-5I8zUZoFRgtnagjQygqnSyWG0L39ycFvum+ytsMmFW8LY1GpEZ+a3I6fWggwM82/Cc9YOheCVRIz47g0uBBZug==} + /@mui/x-data-grid@6.19.3(@mui/material@5.15.7)(@mui/system@5.15.8)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RHt+MhTgvpXTWY0MYvzSNLF8npo+mlmWuTO+qKRt42Zj634IlUYDwW5jjQ9fWZnIpWJLunw253KqHoAlSAOXaw==} + engines: {node: '>=14.0.0'} peerDependencies: - react: '*' - react-native: '*' + '@mui/material': ^5.4.1 + '@mui/system': ^5.4.1 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 dependencies: - lodash: 4.17.21 + '@babel/runtime': 7.23.9 + '@mui/material': 5.15.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.8(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.55)(react@18.2.0) + '@mui/utils': 5.15.8(@types/react@18.2.55)(react@18.2.0) + clsx: 2.1.0 + prop-types: 15.8.1 react: 18.2.0 - react-native: 0.73.2(@babel/core@7.23.9)(@babel/preset-env@7.23.9)(react@18.2.0) - uuid: 3.4.0 + react-dom: 18.2.0(react@18.2.0) + reselect: 4.1.8 + transitivePeerDependencies: + - '@types/react' dev: false - /@journeyapps/wa-sqlite@0.1.1: - resolution: {integrity: sha512-cLPddbJYBpzII7ZBAA4fNKW2yLf3H03cGrz+JteXCfSjzxbYhnflAGD8WjefmeLXQUr2vcOYm3SgC82LJYZyzQ==} - dev: true + /@next/env@14.1.0: + resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} + dev: false - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + /@next/eslint-plugin-next@14.0.0: + resolution: {integrity: sha512-Ye37nNI09V3yt7pzuzSQtwlvuJ2CGzFszHXkcTHHZgNr7EhTMFLipn3VSJChy+e5+ahTdNApPphc3qCPUsn10A==} dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + glob: 7.1.7 + dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + /@next/swc-darwin-arm64@14.1.0: + resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + /@next/swc-darwin-x64@14.1.0: + resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@next/swc-linux-arm64-gnu@14.1.0: + resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + /@next/swc-linux-arm64-musl@14.1.0: + resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + /@next/swc-linux-x64-gnu@14.1.0: + resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - dependencies: - '@babel/runtime': 7.23.9 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: true + /@next/swc-linux-x64-musl@14.1.0: + resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - dependencies: - '@babel/runtime': 7.23.9 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - dev: true + /@next/swc-win32-arm64-msvc@14.1.0: + resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true - /@mdx-js/mdx@3.0.0: - resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.4 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.11 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 - estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color + /@next/swc-win32-ia32-msvc@14.1.0: + resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true - /@mdx-js/react@3.0.0(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - dependencies: - '@types/mdx': 2.0.11 - '@types/react': 18.2.48 - react: 18.2.0 + /@next/swc-win32-x64-msvc@14.1.0: + resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -3573,6 +4831,10 @@ packages: /@polka/url@1.0.0-next.24: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -4352,6 +5614,34 @@ packages: nanoid: 3.3.7 dev: false + /@remirror/core-constants@2.0.2: + resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} + dev: false + + /@remirror/core-helpers@3.0.0: + resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==} + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/types': 1.0.1 + '@types/object.omit': 3.0.3 + '@types/object.pick': 1.3.4 + '@types/throttle-debounce': 2.1.0 + case-anything: 2.1.13 + dash-get: 1.0.2 + deepmerge: 4.3.1 + fast-deep-equal: 3.1.3 + make-error: 1.3.6 + object.omit: 3.0.0 + object.pick: 1.3.0 + throttle-debounce: 3.0.1 + dev: false + + /@remirror/types@1.0.1: + resolution: {integrity: sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==} + dependencies: + type-fest: 2.19.0 + dev: false + /@remix-run/node@1.19.3: resolution: {integrity: sha512-z5qrVL65xLXIUpU4mkR4MKlMeKARLepgHAk4W5YY3IBXOreRqOGUC70POViYmY7x38c2Ia1NwqL80H+0h7jbMw==} engines: {node: '>=14.0.0'} @@ -4423,6 +5713,168 @@ packages: web-streams-polyfill: 3.3.2 dev: false + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.9)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-imports': 7.22.15 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: false + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.79.1 + dev: false + + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: false + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false + + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.7.2: + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + dev: true + /@segment/loosely-validate-event@2.0.0: resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} dependencies: @@ -4534,6 +5986,15 @@ packages: - utf-8-validate dev: false + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.10 + dev: false + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} @@ -4673,12 +6134,315 @@ packages: transitivePeerDependencies: - supports-color + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + dependencies: + tslib: 2.6.2 + dev: false + /@szmarczak/http-timer@5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} dependencies: defer-to-connect: 2.0.1 + /@tiptap/core@2.2.2(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-fec26LtNgYFGhKzEA9+Of+qLKIKUxDL/XZQofoPcxP71NffcmpZ+ZjAx9NjnvuYtvylUSySZiPauY6WhN3aprw==} + peerDependencies: + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-blockquote@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-ENCGx/yhNdUQ0epGOeTN4HFeUSfQDK2CQBy2szkQVtzG/Vhv8ExxBWTxHJcMoeSfEVmKag4B506vfRkKH24IMA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-bold@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-8/KLpPHwO+GXlWsXEION7ppLfFIaSpnw5m2QYXz/LGRK32hzpTavbdXV3rx9+Vu+7Z+0yQF9G/ro1z9dqTQHpw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-bubble-menu@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-W3OvoHxgBdQSrlX8FXvIs5wA+eHXe/0jGsqQdwLXPtqZOSR4Ks9OLmxDk2+O8ci0KCLPb6/doJYg7j/8Ic4KRg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + tippy.js: 6.3.7 + dev: false + + /@tiptap/extension-bullet-list@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-mZznxwymWitQRHYxEN8LX7theJdQ1/O6kUsvwDyHw42+jaCsZumTHEWGckBwkxk3BWWKbrkRGv/cC78sa3cNJw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-code-block@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-CKn4xqhpCfwkVdkj//A+LVf0hFrRkBbDx8u3KG+I7cegjXxvDSqb2OGhn/tXpFatLAE50GJiPIvqf+TmhIWBvA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-code@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-CHMHK76fGFrY3TpsyNmPB393VvRgjnvLVOfc0Qx4KKEkntDQ1v2jg90XupLf0+H0aq0KQBHlSooW0Bh+7SxbmQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-collaboration-cursor@2.2.2(@tiptap/core@2.2.2)(y-prosemirror@1.0.20): + resolution: {integrity: sha512-98h1N5oP3E0jGOFLUa2e1gmrgRxlvHh2qULVkvvQo5et9tjPlKu7eCatCbFNnR5+jRoQSN1t77GZ9GcfIETVVw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + y-prosemirror: ^1.2.1 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + y-prosemirror: 1.0.20(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.11) + dev: false + + /@tiptap/extension-collaboration@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2)(y-prosemirror@1.0.20): + resolution: {integrity: sha512-tbElPmwAFIbsE/2hF9TaZJPjc37X8HKmbDES/KB9gdf6g/RL1MQiDOeO0j/8szbIUBiBHnh8jejl2Pd9D8lz+A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + y-prosemirror: ^1.2.1 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + y-prosemirror: 1.0.20(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.11) + dev: false + + /@tiptap/extension-document@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-eUhpYq8ErVAlxuTg5wslc96mniEQs+VN+tFmRrx9Q0n0nG/aDKUQFDgcSMpAMpHK7+h7tGc/rDq+ydpzZhFXlQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-dropcursor@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-HxXEf6m+W3PnT63Ib49qAmcwmapZvmyWgq9cvB5kSfl/znQT04wBgShEigkgUBLqgcM/R/RI8NS1GQl1Zpv9iQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-floating-menu@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-DRz9kzcPt7S8s22EQC+KS/ghnHRV6j7Qequ+0kLjfLYPdqj2u4G5xTrFM7sWfzUqf2HdH8SS8Yo9WFMYm69D9w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + tippy.js: 6.3.7 + dev: false + + /@tiptap/extension-gapcursor@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-qsE8yI9nZOLHg6XdFwn4BYMhR2f/50gppHJdsHx53575y2ci6uowMI+WjdEentl6yR9ctgV1jelHLs9ShmPzwQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-hard-break@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-zbG6/7xyMim2fnRESIx2FiFHjdY7BXKMe+GUgLGPnRfXrJqSZhdVguBrtYGBnBFCnuSiOZZ6rFy+k5uORGSrhA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-heading@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-oCd8VsLnrqJFY+lgA+5I/2EjBa4mQzB5DFLzCI460PfZnQJ2DmaNUdpY38BpHUv8E2PbBXzxxWS9h88yycW6yw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-highlight@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-tNDx0u54H/cnBVfGflq7a9WHzPTOdDgz0BzSj3ujHT8xAZG+yQWhm8bnq0BZc+7xODbGIQ22ZEzypIC7KNUzZQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-history@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-hcCEh7mP5H38ZY3YtbyyUOTNfKWAvITkJhVqjKbrRI3E+FOlG3pWPH3wz4srW5bHK38oUsiKwyP9FqC3C2Mixg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-horizontal-rule@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-5hun56M9elO6slOoDH03q2of06KB1rX8MLvfiKpfAvjbhmuQJav20fz2MQ2lCunek0D8mUIySwhfMvBrTcd90A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-italic@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-l9NZK4vYqYY9Y5UskLQpdbvi0sXG4I/MuhRxPdjitK8E3SVhZxMnoNwCTkq0+I1xBjCD/jSrDMV4FqkKesrl2w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-list-item@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-VuHlbhLePXvKTx55X0iIZ1EXARAoOf6lpbKJK8180jny2gpYxGhk7rwG1G8s6G6ZDST+kyVa04gncxz8F/z6oA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-ordered-list@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-TgG+mJyQB5CfeqCD65B9CLesl2IQTjc7tAKm8ZxRzF80GrCrmWNnoXi424TWmSF6cUV/4TY0G5dTkc9kB+S2tw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-paragraph@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-USTzajni/hsQXsBF0Lbw++FyPJKCDlROyaKbZi77QQoUsU2MbJIka7k4tGc0kwyTB04aAl+E6+0iS4xIhC3rug==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-strike@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-0wsqiZPatw9QrK3DJ1jCMukenc8DRQtEXo4/dQjtnzNDhe7ZySed6kPpGO9A4lASG7NV7GmYZ/k5iEELr+iE6Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-task-item@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-VAfVCw8FRsRmkT5UAejxqlEtfOBV5aYvnu+14+bXFUHV+9Re++9YaERbm4qF0S/NLvUVEXMow+tc0kbl87AFpQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + dev: false + + /@tiptap/extension-task-list@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-Q9/UdEVkVpMN6yAPowiAjdsXp5KU05vX5+Ne05zjuQALn2BPHfu2/F+CKE5fykQkAfEaI0OgVRvvXf0890Woqw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/extension-text@2.2.2(@tiptap/core@2.2.2): + resolution: {integrity: sha512-Zj53Vp/9MSQj5uiaObFaD3y7grUpMy+PfHmrK5XAZSFhRx+QpGUp+oItlKod6IJEIu8rq4dChgE7i6kT9uwWlA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + dev: false + + /@tiptap/pm@2.2.2: + resolution: {integrity: sha512-TcUxqevVcqLYOcbAGlmvZfOB5LL5zZmb6jxSHyevl41SRpGZLe9Jt0e1v98jS0o9GMS7nvcTK/scYQu9e0HqTA==} + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.5.2 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.3.2 + prosemirror-inputrules: 1.4.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.12.0 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.19.4 + prosemirror-schema-basic: 1.2.2 + prosemirror-schema-list: 1.3.0 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.3.5 + prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7) + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.7 + dev: false + + /@tiptap/react@2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9jRaY7Clrtb23itFyTGgLEo5SO0shR/kxlFN3G6Wyda6S6SduY9ERX93ffRdvzbJKcbEptcko0KqUZ/MD0eDnA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/extension-bubble-menu': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-floating-menu': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/pm': 2.2.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@tiptap/starter-kit@2.2.2(@tiptap/pm@2.2.2): + resolution: {integrity: sha512-J8nbrVBggGJwO7CPEwdUqG6Q8btiQJjjnYWZEs+ImM9GMUfXJ8lyaGT0My3wDvTeq537N9BjTEcQ88pMtOqbOw==} + dependencies: + '@tiptap/core': 2.2.2(@tiptap/pm@2.2.2) + '@tiptap/extension-blockquote': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-bold': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-bullet-list': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-code': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-code-block': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-document': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-dropcursor': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-gapcursor': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-hard-break': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-heading': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-history': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-horizontal-rule': 2.2.2(@tiptap/core@2.2.2)(@tiptap/pm@2.2.2) + '@tiptap/extension-italic': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-list-item': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-ordered-list': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-paragraph': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-strike': 2.2.2(@tiptap/core@2.2.2) + '@tiptap/extension-text': 2.2.2(@tiptap/core@2.2.2) + transitivePeerDependencies: + - '@tiptap/pm' + dev: false + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -4744,6 +6508,10 @@ packages: dependencies: '@types/estree': 1.0.5 + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: false + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -4763,6 +6531,13 @@ packages: '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.11.16 + dev: false + /@types/gtag.js@0.0.12: resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} dev: false @@ -4771,6 +6546,12 @@ packages: resolution: {integrity: sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==} dev: false + /@types/hast@2.3.10: + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + /@types/hast@3.0.4: resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: @@ -4779,6 +6560,13 @@ packages: /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + /@types/hoist-non-react-statics@3.3.5: + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + dependencies: + '@types/react': 18.2.55 + hoist-non-react-statics: 3.3.2 + dev: false + /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -4809,6 +6597,10 @@ packages: /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} dev: true @@ -4827,6 +6619,10 @@ packages: /@types/mime@3.0.4: resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: false + /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true @@ -4866,6 +6662,14 @@ packages: resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} dev: true + /@types/object.omit@3.0.3: + resolution: {integrity: sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==} + dev: false + + /@types/object.pick@1.3.4: + resolution: {integrity: sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA==} + dev: false + /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4885,38 +6689,50 @@ packages: /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + /@types/react-dom@18.2.19: + resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} + dependencies: + '@types/react': 18.2.55 + dev: true + /@types/react-native-vector-icons@6.4.18: resolution: {integrity: sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==} dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.55 '@types/react-native': 0.70.19 dev: false /@types/react-native@0.70.19: resolution: {integrity: sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==} dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.55 dev: false /@types/react-router-config@5.0.11: resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 '@types/react-router': 5.1.20 /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 '@types/react-router': 5.1.20 /@types/react-router@5.1.20: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.48 + '@types/react': 18.2.55 + + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + dependencies: + '@types/react': 18.2.55 + dev: false /@types/react@18.2.48: resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} @@ -4924,6 +6740,20 @@ packages: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.3 + dev: true + + /@types/react@18.2.55: + resolution: {integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.11.16 + dev: false /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -4967,6 +6797,14 @@ packages: /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + /@types/throttle-debounce@2.1.0: + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + dev: false + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false + /@types/unist@2.0.10: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -4981,6 +6819,19 @@ packages: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true + /@types/webpack@5.28.5(webpack-cli@5.1.4): + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + dependencies: + '@types/node': 20.11.16 + tapable: 2.2.1 + webpack: 5.90.1(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: @@ -5004,6 +6855,70 @@ packages: dependencies: '@types/yargs-parser': 21.0.3 + /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + dev: true + + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -5122,6 +7037,40 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.90.1): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.90.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.90.1) + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.90.1): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.90.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.90.1) + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.90.1): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.90.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.90.1) + /@xmldom/xmldom@0.7.13: resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -5138,6 +7087,10 @@ packages: /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + /@zeit/schemas@2.29.0: + resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} + dev: true + /@zxing/text-encoding@0.9.0: resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} requiresBuild: true @@ -5193,6 +7146,15 @@ packages: - supports-color dev: false + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -5233,6 +7195,15 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + /ajv@8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: @@ -5346,7 +7317,6 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -5362,9 +7332,12 @@ packages: resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} dev: false + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -5374,20 +7347,70 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.5 - is-array-buffer: 3.0.2 + is-array-buffer: 3.0.2 + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + /array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: false /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.findlastindex@1.2.4: + resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} @@ -5398,6 +7421,26 @@ packages: es-shim-unscopables: 1.0.2 dev: true + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + /arraybuffer.prototype.slice@1.0.2: resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} @@ -5409,7 +7452,6 @@ packages: get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} @@ -5419,6 +7461,10 @@ packages: /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + /ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} @@ -5449,6 +7495,12 @@ packages: /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -5457,7 +7509,7 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - /autoprefixer@10.4.17(postcss@8.4.33): + /autoprefixer@10.4.17(postcss@8.4.35): resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -5469,13 +7521,24 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + /babel-core@7.0.0-bridge.0(@babel/core@7.23.9): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: @@ -5493,13 +7556,22 @@ packages: '@babel/core': 7.23.9 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /babel-plugin-dynamic-import-node@2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: object.assign: 4.1.5 + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.9 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: @@ -5639,6 +7711,16 @@ packages: /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + /bin-links@4.0.3: + resolution: {integrity: sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + cmd-shim: 6.0.2 + npm-normalize-package-bin: 3.0.1 + read-cmd-shim: 4.0.0 + write-file-atomic: 5.0.1 + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -5695,6 +7777,20 @@ packages: widest-line: 4.0.1 wrap-ansi: 8.1.0 + /boxen@7.0.0: + resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + /boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -5738,7 +7834,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -5791,10 +7886,22 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: false + /builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: false + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -5878,6 +7985,11 @@ packages: pascal-case: 3.1.2 tslib: 2.6.2 + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -5920,9 +8032,21 @@ packages: /caniuse-lite@1.0.30001581: resolution: {integrity: sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==} + /case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + dev: false + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + /chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + dependencies: + chalk: 4.1.2 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5938,6 +8062,11 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.0.1: + resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -6005,7 +8134,6 @@ packages: /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: false /chrome-launcher@0.15.2: resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} @@ -6054,6 +8182,16 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + /clean-webpack-plugin@4.0.0(webpack@5.90.1): + resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: '>=4.0.0 <6.0.0' + dependencies: + del: 4.1.1 + webpack: 5.90.1(webpack-cli@5.1.4) + dev: false + /cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -6098,6 +8236,19 @@ packages: string-width: 7.1.0 dev: true + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: true + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -6147,6 +8298,11 @@ packages: resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} engines: {node: '>=6'} + /cmd-shim@6.0.2: + resolution: {integrity: sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -6237,7 +8393,6 @@ packages: /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: false /commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} @@ -6258,6 +8413,11 @@ packages: /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: false + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -6336,6 +8496,10 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6372,7 +8536,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /core-js-compat@3.35.1: resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} @@ -6434,6 +8598,10 @@ packages: path-type: 4.0.0 typescript: 5.3.3 + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: @@ -6489,13 +8657,13 @@ packages: dependencies: type-fest: 1.4.0 - /css-declaration-sorter@6.4.1(postcss@8.4.33): + /css-declaration-sorter@6.4.1(postcss@8.4.35): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 /css-loader@6.10.0(webpack@5.90.1): resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} @@ -6509,15 +8677,15 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.33) - postcss: 8.4.33 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.33) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.33) - postcss-modules-scope: 3.1.1(postcss@8.4.33) - postcss-modules-values: 4.0.0(postcss@8.4.33) + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) + postcss-modules-scope: 3.1.1(postcss@8.4.35) + postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.3)(webpack@5.90.1): resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} @@ -6545,13 +8713,13 @@ packages: optional: true dependencies: clean-css: 5.3.3 - cssnano: 5.1.15(postcss@8.4.33) + cssnano: 5.1.15(postcss@8.4.35) jest-worker: 29.7.0 - postcss: 8.4.33 + postcss: 8.4.35 schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -6578,125 +8746,386 @@ packages: mdn-data: 2.0.14 source-map: 0.6.1 - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /cssnano-preset-advanced@5.3.10(postcss@8.4.35): + resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + autoprefixer: 10.4.17(postcss@8.4.35) + cssnano-preset-default: 5.2.14(postcss@8.4.35) + postcss: 8.4.35 + postcss-discard-unused: 5.1.0(postcss@8.4.35) + postcss-merge-idents: 5.1.1(postcss@8.4.35) + postcss-reduce-idents: 5.2.0(postcss@8.4.35) + postcss-zindex: 5.1.0(postcss@8.4.35) + + /cssnano-preset-default@5.2.14(postcss@8.4.35): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.4.35) + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-calc: 8.2.4(postcss@8.4.35) + postcss-colormin: 5.3.1(postcss@8.4.35) + postcss-convert-values: 5.1.3(postcss@8.4.35) + postcss-discard-comments: 5.1.2(postcss@8.4.35) + postcss-discard-duplicates: 5.1.0(postcss@8.4.35) + postcss-discard-empty: 5.1.1(postcss@8.4.35) + postcss-discard-overridden: 5.1.0(postcss@8.4.35) + postcss-merge-longhand: 5.1.7(postcss@8.4.35) + postcss-merge-rules: 5.1.4(postcss@8.4.35) + postcss-minify-font-values: 5.1.0(postcss@8.4.35) + postcss-minify-gradients: 5.1.1(postcss@8.4.35) + postcss-minify-params: 5.1.4(postcss@8.4.35) + postcss-minify-selectors: 5.2.1(postcss@8.4.35) + postcss-normalize-charset: 5.1.0(postcss@8.4.35) + postcss-normalize-display-values: 5.1.0(postcss@8.4.35) + postcss-normalize-positions: 5.1.1(postcss@8.4.35) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.35) + postcss-normalize-string: 5.1.0(postcss@8.4.35) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.35) + postcss-normalize-unicode: 5.1.1(postcss@8.4.35) + postcss-normalize-url: 5.1.0(postcss@8.4.35) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.35) + postcss-ordered-values: 5.1.3(postcss@8.4.35) + postcss-reduce-initial: 5.1.2(postcss@8.4.35) + postcss-reduce-transforms: 5.1.0(postcss@8.4.35) + postcss-svgo: 5.1.0(postcss@8.4.35) + postcss-unique-selectors: 5.1.1(postcss@8.4.35) + + /cssnano-utils@3.1.0(postcss@8.4.35): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.35 + + /cssnano@5.1.15(postcss@8.4.35): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.35) + lilconfig: 2.1.0 + postcss: 8.4.35 + yaml: 1.10.2 + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false + + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + dependencies: + delaunator: 5.0.1 + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: false + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false - /cssnano-preset-advanced@5.3.10(postcss@8.4.33): - resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - autoprefixer: 10.4.17(postcss@8.4.33) - cssnano-preset-default: 5.2.14(postcss@8.4.33) - postcss: 8.4.33 - postcss-discard-unused: 5.1.0(postcss@8.4.33) - postcss-merge-idents: 5.1.1(postcss@8.4.33) - postcss-reduce-idents: 5.2.0(postcss@8.4.33) - postcss-zindex: 5.1.0(postcss@8.4.33) + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false - /cssnano-preset-default@5.2.14(postcss@8.4.33): - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.33) - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 - postcss-calc: 8.2.4(postcss@8.4.33) - postcss-colormin: 5.3.1(postcss@8.4.33) - postcss-convert-values: 5.1.3(postcss@8.4.33) - postcss-discard-comments: 5.1.2(postcss@8.4.33) - postcss-discard-duplicates: 5.1.0(postcss@8.4.33) - postcss-discard-empty: 5.1.1(postcss@8.4.33) - postcss-discard-overridden: 5.1.0(postcss@8.4.33) - postcss-merge-longhand: 5.1.7(postcss@8.4.33) - postcss-merge-rules: 5.1.4(postcss@8.4.33) - postcss-minify-font-values: 5.1.0(postcss@8.4.33) - postcss-minify-gradients: 5.1.1(postcss@8.4.33) - postcss-minify-params: 5.1.4(postcss@8.4.33) - postcss-minify-selectors: 5.2.1(postcss@8.4.33) - postcss-normalize-charset: 5.1.0(postcss@8.4.33) - postcss-normalize-display-values: 5.1.0(postcss@8.4.33) - postcss-normalize-positions: 5.1.1(postcss@8.4.33) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.33) - postcss-normalize-string: 5.1.0(postcss@8.4.33) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.33) - postcss-normalize-unicode: 5.1.1(postcss@8.4.33) - postcss-normalize-url: 5.1.0(postcss@8.4.33) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.33) - postcss-ordered-values: 5.1.3(postcss@8.4.33) - postcss-reduce-initial: 5.1.2(postcss@8.4.33) - postcss-reduce-transforms: 5.1.0(postcss@8.4.33) - postcss-svgo: 5.1.0(postcss@8.4.33) - postcss-unique-selectors: 5.1.1(postcss@8.4.33) - - /cssnano-utils@3.1.0(postcss@8.4.33): - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} dependencies: - postcss: 8.4.33 + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false - /cssnano@5.1.15(postcss@8.4.33): - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.33) - lilconfig: 2.1.0 - postcss: 8.4.33 - yaml: 1.10.2 + d3-path: 3.1.0 + dev: false - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} dependencies: - css-tree: 1.1.3 + d3-time: 3.1.0 + dev: false - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + /d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - dev: true + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dev: false /dag-map@1.0.2: resolution: {integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==} dev: false + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dash-get@1.0.2: + resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} + dev: false + /data-uri-to-buffer@3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} dev: false + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} @@ -6722,7 +9151,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: false /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -6767,6 +9195,15 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + dev: false + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -6814,6 +9251,19 @@ packages: has-property-descriptors: 1.0.1 object-keys: 1.1.1 + /del@4.1.1: + resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} + engines: {node: '>=6'} + dependencies: + '@types/glob': 7.2.0 + globby: 6.1.0 + is-path-cwd: 2.2.0 + is-path-in-cwd: 2.1.0 + p-map: 2.1.0 + pify: 4.0.1 + rimraf: 2.7.1 + dev: false + /del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -6827,6 +9277,12 @@ packages: rimraf: 3.0.2 slash: 3.0.0 + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + dependencies: + robust-predicates: 3.0.2 + dev: false + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6905,18 +9361,40 @@ packages: dependencies: dequal: 2.0.3 + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + /dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} dependencies: '@leichtgewicht/ip-codec': 2.0.4 + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /docusaurus-plugin-typedoc@0.22.0(typedoc-plugin-markdown@3.17.1)(typedoc@0.25.7): resolution: {integrity: sha512-5q+oT+iq3g9DvsMin11pSSmqHRw0i62csHBzkWVtgmsqN/BwGDHnxDiTbHhhkBNQpmRIRgltyNdMnO5x+JUK8Q==} peerDependencies: @@ -6932,6 +9410,13 @@ packages: dependencies: utila: 0.4.0 + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.23.9 + csstype: 3.1.3 + dev: false + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -7011,6 +9496,14 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: false + /electron-to-chromium@1.4.650: resolution: {integrity: sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==} @@ -7140,6 +9633,33 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.13 + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.0 dev: true /es-module-lexer@1.4.1: @@ -7149,52 +9669,263 @@ packages: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + /eslint-config-next@14.0.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-jtXeE+/pGQ3h9n11QyyuPN50kO13GO5XvjU5ZRq6W+XTpOMjyobWmK2s7aowy0FtzA49krJzYzEU9s1RMwoJ6g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.0.0 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) + eslint-plugin-react: 7.33.2(eslint@8.56.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.56.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: + '@babel/runtime': 7.23.9 + aria-query: 5.3.0 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.15 + eslint: 8.56.0 hasown: 2.0.0 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + eslint: 8.56.0 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + /eslint-plugin-react@7.33.2(eslint@8.56.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.56.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + dev: true /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -7203,11 +9934,87 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -7258,6 +10065,10 @@ packages: '@types/estree-jsx': 1.0.4 '@types/unist': 3.0.2 + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: false + /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: @@ -7613,6 +10424,17 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -7626,6 +10448,10 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: @@ -7637,6 +10463,10 @@ packages: dependencies: strnum: 1.0.5 + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + /fastq@1.17.0: resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} dependencies: @@ -7690,10 +10520,25 @@ packages: dependencies: xml-js: 1.6.11 + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.2 + dev: true + /fetch-retry@4.1.1: resolution: {integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==} dev: false + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + /file-loader@6.2.0(webpack@5.90.1): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -7702,7 +10547,13 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: false /filesize@8.0.7: resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} @@ -7762,6 +10613,10 @@ packages: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -7802,10 +10657,23 @@ packages: micromatch: 4.0.5 dev: false + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} @@ -7863,7 +10731,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} @@ -7882,6 +10750,29 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /formik@2.4.5(react@18.2.0): + resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + deepmerge: 2.2.1 + hoist-non-react-statics: 3.3.2 + lodash: 4.17.21 + lodash-es: 4.17.21 + react: 18.2.0 + react-fast-compare: 2.0.4 + tiny-warning: 1.0.3 + tslib: 2.6.2 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7947,7 +10838,6 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: false /fs-monkey@1.0.5: resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} @@ -7973,11 +10863,9 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 - dev: true /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -8000,6 +10888,17 @@ packages: has-symbols: 1.0.3 hasown: 2.0.0 + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -8030,6 +10929,11 @@ packages: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 + + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 dev: true /getenv@1.0.0: @@ -8076,7 +10980,17 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -8112,12 +11026,18 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -8140,6 +11060,17 @@ packages: merge2: 1.4.1 slash: 4.0.0 + /globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: false + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -8171,6 +11102,10 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + /graphql-tag@2.12.6(graphql@15.8.0): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -8224,7 +11159,6 @@ packages: /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -8403,6 +11337,16 @@ packages: dependencies: source-map: 0.7.4 + /highlight.js@11.8.0: + resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==} + engines: {node: '>=12.0.0'} + dev: false + + /highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: false + /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: @@ -8497,7 +11441,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -8588,6 +11532,16 @@ packages: - supports-color dev: false + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true @@ -8613,13 +11567,24 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.33): + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /icss-utils@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8638,6 +11603,9 @@ packages: /immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + /immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + /import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -8656,6 +11624,14 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -8712,12 +11688,20 @@ packages: get-intrinsic: 1.2.2 hasown: 2.0.0 side-channel: 1.0.4 - dev: true + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -8762,7 +11746,6 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -8771,11 +11754,17 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -8789,7 +11778,6 @@ packages: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: true /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -8815,7 +11803,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -8833,6 +11820,13 @@ packages: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: false + /is-extglob@1.0.0: resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} engines: {node: '>=0.10.0'} @@ -8842,6 +11836,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -8867,7 +11867,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: false /is-glob@2.0.1: resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} @@ -8903,10 +11902,17 @@ packages: is-glob: 2.0.1 dev: false + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: false + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - dev: true /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} @@ -8917,7 +11923,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -8935,6 +11940,20 @@ packages: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} + /is-path-in-cwd@2.1.0: + resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} + engines: {node: '>=6'} + dependencies: + is-path-inside: 2.1.0 + dev: false + + /is-path-inside@2.1.0: + resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} + engines: {node: '>=6'} + dependencies: + path-is-inside: 1.0.2 + dev: false + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -8962,6 +11981,11 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + /is-port-reachable@4.0.0: + resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: @@ -8973,7 +11997,6 @@ packages: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: true /is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} @@ -8983,11 +12006,14 @@ packages: resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} engines: {node: '>=6'} + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.5 - dev: true /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -9008,7 +12034,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} @@ -9022,7 +12047,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} @@ -9044,10 +12068,20 @@ packages: is-invalid-path: 0.1.0 dev: false + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.5 + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.4 dev: true /is-windows@1.0.2: @@ -9077,7 +12111,6 @@ packages: /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -9086,6 +12119,31 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + /isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + dev: false + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.5 + set-function-name: 2.0.1 + dev: true + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: false + /jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9160,6 +12218,15 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.11.16 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: false + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -9291,6 +12358,21 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -9298,7 +12380,6 @@ packages: /jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -9312,6 +12393,21 @@ packages: optionalDependencies: graceful-fs: 4.2.11 + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + dev: true + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -9330,12 +12426,27 @@ packages: engines: {node: '>=6'} dev: true + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + /latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} dependencies: package-json: 8.1.1 + /lato-font@3.0.0: + resolution: {integrity: sha512-wKhFCh9XX91Lepf38ynnZTNpkQD1OWuXV1RwFgcchUVQZzBixJ/yXCaVCIrNI3CbgT9pLcLzWKgn+6OETzAnug==} + dev: false + /launch-editor@2.6.1: resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} dependencies: @@ -9346,6 +12457,26 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lexical@0.11.3: + resolution: {integrity: sha512-xsMKgx/Fa+QHg/nweemU04lCy7TnEr8LyeDtsKUC7fIDN9wH3GqbnQ0+e3Hbg4FmxlhDCiPPt0GcZAROq3R8uw==} + dev: false + + /lib0@0.2.88: + resolution: {integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + isomorphic.js: 0.2.5 + dev: false + /lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} dependencies: @@ -9455,6 +12586,12 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.0.0 + dev: false + /lint-staged@15.2.0: resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} engines: {node: '>=18.12.0'} @@ -9537,6 +12674,10 @@ packages: dependencies: p-locate: 6.0.0 + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -9547,6 +12688,14 @@ packages: /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -9611,6 +12760,14 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /lowlight@2.9.0: + resolution: {integrity: sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==} + dependencies: + '@types/hast': 2.3.10 + fault: 2.0.1 + highlight.js: 11.8.0 + dev: false + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -9633,6 +12790,12 @@ packages: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -9640,6 +12803,10 @@ packages: pify: 4.0.1 semver: 5.7.2 + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -9659,6 +12826,18 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} + /markdown-it@14.0.0: + resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.0.0 + dev: false + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} @@ -9908,6 +13087,10 @@ packages: /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: false + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -11153,7 +14336,7 @@ packages: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -11163,6 +14346,13 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -11208,12 +14398,10 @@ packages: engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: false /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - dev: false /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -11221,7 +14409,6 @@ packages: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: false /mixme@0.5.10: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} @@ -11238,7 +14425,6 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} @@ -11282,13 +14468,16 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + /ncp@2.0.0: resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true @@ -11307,6 +14496,56 @@ packages: resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} dev: false + /next-images@1.8.5(webpack@5.90.1): + resolution: {integrity: sha512-YLBERp92v+Nu2EVxI9+wa32KRuxyxTC8ItbiHUWVPlatUoTl0yRqsNtP39c2vYv27VRvY4LlYcUGjNRBSMUIZA==} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + file-loader: 6.2.0(webpack@5.90.1) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.90.1) + webpack: 5.90.1(webpack-cli@5.1.4) + dev: false + + /next@14.1.0(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0): + resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.1.0 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001581 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + sass: 1.70.0 + styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.0 + '@next/swc-darwin-x64': 14.1.0 + '@next/swc-linux-arm64-gnu': 14.1.0 + '@next/swc-linux-arm64-musl': 14.1.0 + '@next/swc-linux-x64-gnu': 14.1.0 + '@next/swc-linux-x64-musl': 14.1.0 + '@next/swc-win32-arm64-msvc': 14.1.0 + '@next/swc-win32-ia32-msvc': 14.1.0 + '@next/swc-win32-x64-msvc': 14.1.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false @@ -11330,6 +14569,11 @@ packages: dependencies: minimatch: 3.1.2 + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + /node-emoji@2.1.3: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} @@ -11350,6 +14594,15 @@ packages: dependencies: whatwg-url: 5.0.0 + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -11389,6 +14642,11 @@ packages: resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /npm-package-arg@7.0.0: resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} dependencies: @@ -11449,7 +14707,6 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: false /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -11467,6 +14724,64 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.2: + resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + dependencies: + array.prototype.filter: 1.0.3 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-errors: 1.3.0 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.omit@3.0.0: + resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 1.0.1 + dev: false + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -11542,6 +14857,18 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /ora@3.4.0: resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} engines: {node: '>=6'} @@ -11568,6 +14895,10 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + /os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -11654,7 +14985,6 @@ packages: /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - dev: true /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -11836,10 +15166,26 @@ packages: hasBin: true dev: true + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: false + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -11855,7 +15201,6 @@ packages: engines: {node: '>=8'} dependencies: find-up: 4.1.0 - dev: true /pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} @@ -11883,16 +15228,16 @@ packages: engines: {node: '>=4.0.0'} dev: false - /postcss-calc@8.2.4(postcss@8.4.33): + /postcss-calc@8.2.4(postcss@8.4.35): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 - /postcss-colormin@5.3.1(postcss@8.4.33): + /postcss-colormin@5.3.1(postcss@8.4.35): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -11901,61 +15246,100 @@ packages: browserslist: 4.22.3 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-convert-values@5.1.3(postcss@8.4.33): + /postcss-convert-values@5.1.3(postcss@8.4.35): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.3 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-discard-comments@5.1.2(postcss@8.4.33): + /postcss-discard-comments@5.1.2(postcss@8.4.35): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-discard-duplicates@5.1.0(postcss@8.4.33): + /postcss-discard-duplicates@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-discard-empty@5.1.1(postcss@8.4.33): + /postcss-discard-empty@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-discard-overridden@5.1.0(postcss@8.4.33): + /postcss-discard-overridden@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-discard-unused@5.1.0(postcss@8.4.33): + /postcss-discard-unused@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 - /postcss-loader@7.3.4(postcss@8.4.33)(typescript@5.3.3)(webpack@5.90.1): + /postcss-import@15.1.0(postcss@8.4.35): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.35): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.35 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.35): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.35 + yaml: 2.3.4 + dev: true + + /postcss-loader@7.3.4(postcss@8.4.35)(typescript@5.3.3)(webpack@5.90.1): resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -11964,33 +15348,33 @@ packages: dependencies: cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 - postcss: 8.4.33 + postcss: 8.4.35 semver: 7.5.4 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - /postcss-merge-idents@5.1.1(postcss@8.4.33): + /postcss-merge-idents@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-merge-longhand@5.1.7(postcss@8.4.33): + /postcss-merge-longhand@5.1.7(postcss@8.4.35): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.33) + stylehacks: 5.1.1(postcss@8.4.35) - /postcss-merge-rules@5.1.4(postcss@8.4.33): + /postcss-merge-rules@5.1.4(postcss@8.4.35): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -11998,189 +15382,199 @@ packages: dependencies: browserslist: 4.22.3 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-selector-parser: 6.0.15 - /postcss-minify-font-values@5.1.0(postcss@8.4.33): + /postcss-minify-font-values@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-minify-gradients@5.1.1(postcss@8.4.33): + /postcss-minify-gradients@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-minify-params@5.1.4(postcss@8.4.33): + /postcss-minify-params@5.1.4(postcss@8.4.35): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.3 - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-minify-selectors@5.2.1(postcss@8.4.33): + /postcss-minify-selectors@5.2.1(postcss@8.4.35): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 - /postcss-modules-extract-imports@3.0.0(postcss@8.4.33): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-modules-local-by-default@4.0.4(postcss@8.4.33): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.33) - postcss: 8.4.33 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.1.1(postcss@8.4.33): + /postcss-modules-scope@3.1.1(postcss@8.4.35): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 - /postcss-modules-values@4.0.0(postcss@8.4.33): + /postcss-modules-values@4.0.0(postcss@8.4.35): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.33) - postcss: 8.4.33 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 + + /postcss-nested@6.0.1(postcss@8.4.35): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.33): + /postcss-normalize-charset@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-normalize-display-values@5.1.0(postcss@8.4.33): + /postcss-normalize-display-values@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-positions@5.1.1(postcss@8.4.33): + /postcss-normalize-positions@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.33): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-string@5.1.0(postcss@8.4.33): + /postcss-normalize-string@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.33): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-unicode@5.1.1(postcss@8.4.33): + /postcss-normalize-unicode@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.3 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-url@5.1.0(postcss@8.4.33): + /postcss-normalize-url@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-normalize-whitespace@5.1.1(postcss@8.4.33): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-ordered-values@5.1.3(postcss@8.4.33): + /postcss-ordered-values@5.1.3(postcss@8.4.35): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.33) - postcss: 8.4.33 + cssnano-utils: 3.1.0(postcss@8.4.35) + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-reduce-idents@5.2.0(postcss@8.4.33): + /postcss-reduce-idents@5.2.0(postcss@8.4.35): resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 - /postcss-reduce-initial@5.1.2(postcss@8.4.33): + /postcss-reduce-initial@5.1.2(postcss@8.4.35): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -12188,15 +15582,15 @@ packages: dependencies: browserslist: 4.22.3 caniuse-api: 3.0.0 - postcss: 8.4.33 + postcss: 8.4.35 - /postcss-reduce-transforms@5.1.0(postcss@8.4.33): + /postcss-reduce-transforms@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 /postcss-selector-parser@6.0.15: @@ -12206,44 +15600,53 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-sort-media-queries@4.4.1(postcss@8.4.33): + /postcss-sort-media-queries@4.4.1(postcss@8.4.35): resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.16 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 sort-css-media-queries: 2.1.0 - /postcss-svgo@5.1.0(postcss@8.4.33): + /postcss-svgo@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 svgo: 2.8.0 - /postcss-unique-selectors@5.1.1(postcss@8.4.33): + /postcss-unique-selectors@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss-zindex@5.1.0(postcss@8.4.33): + /postcss-zindex@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false /postcss@8.4.33: resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} @@ -12252,6 +15655,15 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true + + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 /preferred-pm@3.1.2: resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} @@ -12263,6 +15675,11 @@ packages: which-pm: 2.0.0 dev: true + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -12365,6 +15782,149 @@ packages: /property-information@6.4.1: resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + /prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + dependencies: + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + dependencies: + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.7 + dev: false + + /prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.32.7 + dev: false + + /prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.7 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-markdown@1.12.0: + resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + dependencies: + markdown-it: 14.0.0 + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.5.2 + prosemirror-history: 1.3.2 + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-model@1.19.4: + resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-basic@1.2.2: + resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} + dependencies: + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.7 + dev: false + + /prosemirror-tables@1.3.5: + resolution: {integrity: sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.7 + dev: false + + /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7): + resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} + peerDependencies: + prosemirror-model: ^1.19.0 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.31.2 + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/core-helpers': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.32.7 + dev: false + + /prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + dependencies: + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-view@1.32.7: + resolution: {integrity: sha512-pvxiOoD4shW41X5bYDjRQk3DSG4fMqxh36yPMt7VYgU3dWRmqFzWJM/R6zeo1KtC8nyk717ZbQND3CC9VNeptw==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -12386,6 +15946,11 @@ packages: once: 1.4.0 dev: false + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: false + /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -12513,7 +16078,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -12537,9 +16102,23 @@ packages: react: 18.2.0 scheduler: 0.23.0 + /react-error-boundary@3.1.4(react@18.2.0): + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.23.9 + react: 18.2.0 + dev: false + /react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + /react-fast-compare@2.0.4: + resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} + dev: false + /react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -12593,7 +16172,7 @@ packages: dependencies: '@babel/runtime': 7.23.9 react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /react-native-elements@3.4.3(react-native-safe-area-context@4.8.2)(react-native-vector-icons@10.0.3)(react-native@0.73.2)(react@18.2.0): resolution: {integrity: sha512-VtZc25EecPZyUBER85zFK9ZbY6kkUdcm1ZwJ9hdoGSCr1R/GFgxor4jngOcSYeMvQ+qimd5No44OVJW3rSJECA==} @@ -13024,12 +16603,37 @@ packages: react: 18.2.0 react-is: 18.2.0 + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.9 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -13105,6 +16709,12 @@ packages: dependencies: resolve: 1.22.8 + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} engines: {node: '>=6.0.0'} @@ -13119,6 +16729,19 @@ packages: strip-indent: 3.0.0 dev: true + /reflect.getprototypeof@1.0.5: + resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -13146,7 +16769,6 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: true /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -13159,12 +16781,26 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 + /registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + dev: true + /registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} dependencies: '@pnpm/npm-conf': 2.2.2 + /registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + dependencies: + rc: 1.2.8 + dev: true + /registry-url@6.0.1: resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} engines: {node: '>=12'} @@ -13264,6 +16900,10 @@ packages: mdast-util-to-markdown: 2.1.0 unified: 11.0.4 + /remixicon@2.5.0: + resolution: {integrity: sha512-q54ra2QutYDZpuSnFjmeagmEiN9IMo56/zz5dDNitzKD23oFRw77cWo4TsrAdmdkPiEn8mxlrTqxnkujDbEGww==} + dev: false + /remove-trailing-slash@0.1.1: resolution: {integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==} dev: false @@ -13303,9 +16943,19 @@ packages: /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -13321,6 +16971,10 @@ packages: /resolve-pathname@3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -13340,6 +16994,15 @@ packages: path-parse: 1.0.7 dev: false + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -13409,6 +17072,58 @@ packages: dependencies: glob: 7.2.3 + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.23.5 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.27.0 + dev: false + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 + fsevents: 2.3.3 + dev: true + + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false + /rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -13419,7 +17134,7 @@ packages: dependencies: escalade: 3.1.1 picocolors: 1.0.0 - postcss: 8.4.33 + postcss: 8.4.35 strip-json-comments: 3.1.1 /run-parallel@1.2.0: @@ -13427,6 +17142,10 @@ packages: dependencies: queue-microtask: 1.2.3 + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + /safe-array-concat@1.1.0: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} @@ -13435,7 +17154,6 @@ packages: get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -13456,11 +17174,43 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-regex: 1.1.4 - dev: true /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /sass-loader@13.3.3(sass@1.70.0)(webpack@5.90.1): + resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + dependencies: + neo-async: 2.6.2 + sass: 1.70.0 + webpack: 5.90.1(webpack-cli@5.1.4) + dev: true + + /sass@1.70.0: + resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.5 + source-map-js: 1.0.2 + /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -13579,6 +17329,12 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: false + /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: @@ -13621,6 +17377,26 @@ packages: transitivePeerDependencies: - supports-color + /serve@14.2.1: + resolution: {integrity: sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==} + engines: {node: '>= 14'} + hasBin: true + dependencies: + '@zeit/schemas': 2.29.0 + ajv: 8.11.0 + arg: 5.0.2 + boxen: 7.0.0 + chalk: 5.0.1 + chalk-template: 0.4.0 + clipboardy: 3.0.0 + compression: 1.7.4 + is-port-reachable: 4.0.0 + serve-handler: 6.1.5 + update-check: 1.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -13645,7 +17421,6 @@ packages: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.1 - dev: true /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -13698,6 +17473,14 @@ packages: interpret: 1.4.0 rechoir: 0.6.2 + /shiki@0.10.1: + resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} + dependencies: + jsonc-parser: 3.2.1 + vscode-oniguruma: 1.7.0 + vscode-textmate: 5.2.0 + dev: false + /shiki@0.14.7: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} dependencies: @@ -13736,6 +17519,10 @@ packages: is-arrayish: 0.3.2 dev: false + /simplify-js@1.2.4: + resolution: {integrity: sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg==} + dev: false + /sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -13825,6 +17612,10 @@ packages: resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} engines: {node: '>= 6.3.0'} + /source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -13847,6 +17638,18 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: false + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -13973,6 +17776,11 @@ packages: mixme: 0.5.10 dev: true + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -14008,6 +17816,19 @@ packages: strip-ansi: 7.1.0 dev: true + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + /string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} @@ -14015,7 +17836,6 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} @@ -14023,7 +17843,6 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} @@ -14031,7 +17850,6 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -14084,6 +17902,11 @@ packages: engines: {node: '>=4'} dev: true + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: false + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -14120,6 +17943,15 @@ packages: resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} dev: false + /style-loader@3.3.4(webpack@5.90.1): + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.90.1(webpack-cli@5.1.4) + dev: true + /style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: @@ -14128,18 +17960,40 @@ packages: /style-to-object@1.0.5: resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} dependencies: - inline-style-parser: 0.2.2 + inline-style-parser: 0.2.2 + + /styled-jsx@5.1.1(@babel/core@7.23.9)(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.23.9 + client-only: 0.0.1 + react: 18.2.0 + dev: false - /stylehacks@5.1.1(postcss@8.4.33): + /stylehacks@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.22.3 - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + /sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} @@ -14152,7 +18006,6 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: false /sudo-prompt@8.2.5: resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==} @@ -14165,6 +18018,20 @@ packages: /sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + /supabase@1.142.2: + resolution: {integrity: sha512-CWe6+WIGnWg8rHXngDwlJX1A3DyEpZLD2EMnA0YKUU1WdnpbdUQsu5vVWbiybFxOC2SPdbylzEyV5iFy6qa7Nw==} + engines: {npm: '>=8'} + hasBin: true + requiresBuild: true + dependencies: + bin-links: 4.0.3 + https-proxy-agent: 7.0.2 + node-fetch: 3.3.2 + tar: 6.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -14211,6 +18078,37 @@ packages: picocolors: 1.0.0 stable: 0.1.8 + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.35 + postcss-import: 15.1.0(postcss@8.4.35) + postcss-js: 4.0.1(postcss@8.4.35) + postcss-load-config: 4.0.2(postcss@8.4.35) + postcss-nested: 6.0.1(postcss@8.4.35) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -14229,7 +18127,6 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: false /temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} @@ -14256,6 +18153,16 @@ packages: unique-string: 1.0.0 dev: false + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: false + /tempy@0.7.1: resolution: {integrity: sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==} engines: {node: '>=10'} @@ -14301,7 +18208,31 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.27.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) + + /terser-webpack-plugin@5.3.9(webpack@5.90.1): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.1(webpack-cli@5.1.4) + dev: false /terser@5.27.0: resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} @@ -14326,17 +18257,20 @@ packages: engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: false /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: false /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: @@ -14356,6 +18290,12 @@ packages: /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + /tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + dependencies: + '@popperjs/core': 2.11.8 + dev: false + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -14386,6 +18326,12 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: false + /traverse@0.6.8: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} @@ -14402,9 +18348,26 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + /ts-api-utils@1.2.1(typescript@5.3.3): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -14423,6 +18386,13 @@ packages: yargs: 17.7.2 dev: true + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -14437,6 +18407,11 @@ packages: engines: {node: '>=10'} dev: false + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -14488,7 +18463,6 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} @@ -14498,7 +18472,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} @@ -14509,7 +18482,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} @@ -14517,7 +18489,6 @@ packages: call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: true /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -14556,6 +18527,10 @@ packages: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: false + /uc.micro@2.0.0: + resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==} + dev: false + /uglify-es@3.3.9: resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} engines: {node: '>=0.8.0'} @@ -14580,7 +18555,6 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -14707,6 +18681,11 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.3): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -14717,6 +18696,13 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + dependencies: + registry-auth-token: 3.3.2 + registry-url: 3.1.0 + dev: true + /update-notifier@6.0.2: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} @@ -14759,7 +18745,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /use-latest-callback@0.1.9(react@18.2.0): resolution: {integrity: sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw==} @@ -14862,17 +18848,59 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 + /vite@5.0.12: + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.12 + postcss: 8.4.33 + rollup: 4.9.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true + + /vscode-textmate@5.2.0: + resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} + dev: false /vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -14913,11 +18941,14 @@ packages: /web-streams-polyfill@3.3.2: resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} engines: {node: '>= 8'} - dev: false /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false + /webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} @@ -14945,6 +18976,38 @@ packages: - bufferutil - utf-8-validate + /webpack-cli@5.1.4(webpack@5.90.1): + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.90.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.90.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.90.1) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.11.0 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.90.1(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + /webpack-dev-middleware@5.3.3(webpack@5.90.1): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} @@ -14956,7 +19019,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /webpack-dev-server@4.15.1(webpack@5.90.1): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} @@ -14999,7 +19062,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) webpack-dev-middleware: 5.3.3(webpack@5.90.1) ws: 8.16.0 transitivePeerDependencies: @@ -15016,11 +19079,18 @@ packages: flat: 5.0.2 wildcard: 2.0.1 + /webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: false + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.90.1: + /webpack@5.90.1(webpack-cli@5.1.4): resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} engines: {node: '>=10.13.0'} hasBin: true @@ -15053,6 +19123,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(webpack@5.90.1) watchpack: 2.4.0 + webpack-cli: 5.1.4(webpack@5.90.1) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -15069,7 +19140,7 @@ packages: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.90.1 + webpack: 5.90.1(webpack-cli@5.1.4) /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} @@ -15101,6 +19172,14 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -15109,6 +19188,32 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 dev: true /which-module@2.0.1: @@ -15162,6 +19267,169 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true + /workbox-background-sync@7.0.0: + resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: false + + /workbox-broadcast-update@7.0.0: + resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-build@7.0.0: + resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} + engines: {node: '>=16.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.23.9 + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/runtime': 7.23.9 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.9)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.0.0 + workbox-broadcast-update: 7.0.0 + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-google-analytics: 7.0.0 + workbox-navigation-preload: 7.0.0 + workbox-precaching: 7.0.0 + workbox-range-requests: 7.0.0 + workbox-recipes: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + workbox-streams: 7.0.0 + workbox-sw: 7.0.0 + workbox-window: 7.0.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: false + + /workbox-cacheable-response@7.0.0: + resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-core@7.0.0: + resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} + dev: false + + /workbox-expiration@7.0.0: + resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: false + + /workbox-google-analytics@7.0.0: + resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + dependencies: + workbox-background-sync: 7.0.0 + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-navigation-preload@7.0.0: + resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-precaching@7.0.0: + resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-range-requests@7.0.0: + resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-recipes@7.0.0: + resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + dependencies: + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-precaching: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-routing@7.0.0: + resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-strategies@7.0.0: + resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-streams@7.0.0: + resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + dev: false + + /workbox-sw@7.0.0: + resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} + dev: false + + /workbox-webpack-plugin@7.0.0(webpack@5.90.1): + resolution: {integrity: sha512-R1ZzCHPfzeJjLK2/TpKUhxSQ3fFDCxlWxgRhhSjMQLz3G2MlBnyw/XeYb34e7SGgSv0qG22zEhMIzjMNqNeKbw==} + engines: {node: '>=16.0.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + dependencies: + fast-json-stable-stringify: 2.1.0 + pretty-bytes: 5.6.0 + upath: 1.2.0 + webpack: 5.90.1(webpack-cli@5.1.4) + webpack-sources: 1.4.3 + workbox-build: 7.0.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: false + + /workbox-window@7.0.0: + resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.0.0 + dev: false + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -15213,6 +19481,14 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: @@ -15295,6 +19571,33 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + /y-prosemirror@1.0.20(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.32.7)(y-protocols@1.0.6)(yjs@13.6.11): + resolution: {integrity: sha512-LVMtu3qWo0emeYiP+0jgNcvZkqhzE/otOoro+87q0iVKxy/sMKuiJZnokfJdR4cn9qKx0Un5fIxXqbAlR2bFkA==} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.3.2 + dependencies: + lib0: 0.2.88 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.32.7 + y-protocols: 1.0.6(yjs@13.6.11) + yjs: 13.6.11 + dev: false + + /y-protocols@1.0.6(yjs@13.6.11): + resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + dependencies: + lib0: 0.2.88 + yjs: 13.6.11 + dev: false + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -15377,6 +19680,13 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 + /yjs@13.6.11: + resolution: {integrity: sha512-FvRRJKX9u270dOLkllGF/UDCWwmIv2Z+ucM4v1QO1TuxdmoiMnSUXH1HAcOKOrkBEhQtPTkxep7tD2DrQB+l0g==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + dependencies: + lib0: 0.2.88 + dev: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'}