diff --git a/.github/workflows/pull_request_ci.yml b/.github/workflows/pull_request_ci.yml index c682d3bba..383a3d133 100644 --- a/.github/workflows/pull_request_ci.yml +++ b/.github/workflows/pull_request_ci.yml @@ -18,7 +18,7 @@ jobs: fetch-depth: 0 - name: Check for git variance in the /core directory - run: git diff --quiet origin/main origin/${{ github.head_ref }} -- core + run: git diff --quiet origin/main origin/${{ github.head_ref }} -- packages/core id: core_diff shell: bash {0} continue-on-error: true diff --git a/.github/workflows/thoth-core-release.yml b/.github/workflows/thoth-core-release.yml index 538db89b9..6b0f9d268 100644 --- a/.github/workflows/thoth-core-release.yml +++ b/.github/workflows/thoth-core-release.yml @@ -24,7 +24,7 @@ jobs: git config --global user.name 'Thoth CI' git config --global user.email 'sean+thothci@latitude.io' - name: set git tag name to enviroment - working-directory: core + working-directory: packages/core run: echo "LATEST_TAG=v$(node -pe "require('./package.json').version")" >> $GITHUB_ENV - name: add git tag and push run: | @@ -33,13 +33,13 @@ jobs: - name: Install Dependencies run: yarn install - name: Prepare and Release - working-directory: core + working-directory: packages/core run: yarn release - name: Publish to GitHub Packages - working-directory: core + working-directory: packages/core run: npm publish - name: Increment package for future prelease, commit and push - working-directory: core + working-directory: packages/core run: | cd ../client yarn add @latitudegames/thoth-core diff --git a/client/src/components/Modals/InfoModal.jsx b/client/src/components/Modals/InfoModal.jsx deleted file mode 100644 index 64bd3fe4e..000000000 --- a/client/src/components/Modals/InfoModal.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import Modal from '../Modal/Modal' - -const InfoModal = ({ title, content }) => { - return ( - -

{content}

-
- ) -} - -export default InfoModal diff --git a/client/src/database/models/moduleModel.ts.bak b/client/src/database/models/moduleModel.ts.bak deleted file mode 100644 index cb29430c9..000000000 --- a/client/src/database/models/moduleModel.ts.bak +++ /dev/null @@ -1,122 +0,0 @@ -import { v4 as uuidv4 } from 'uuid' -//Still need to type the returns -// export interface ModuleModal { -// getModule: (moduleName, callback) => {} -// findOneModule: (_query, callback) => {} -// updateModule: (moduleName: string, update: object) => {} -// updateOrCreate: (doc) => {} -// getNestedModules: (moduleNames: string[]) => {} -// getSpellModules: (spell) => {} -// } - -const loadModuleModel = db => { - const getModules = async callback => { - const query = db.modules.find() - return callback ? query.$.subscribe(callback) : await query.exec() - } - - const getModule = async (moduleName, callback = null) => { - const query = db.modules.findOne({ - selector: { - name: moduleName, - }, - }) - return callback ? query.$.subscribe(callback) : await query.exec() - } - - const findOneModule = async (_query, callback = null) => { - const query = await db.modules.findOne({ - selector: _query, - }) - - return callback ? query.$.subscribe(callback) : query.exec() - } - - const updateModule = async (moduleName: string, update: object) => { - const module = await getModule(moduleName) - - const updatedModule = await module.atomicUpdate(oldData => { - return { - ...oldData, - ...update, - } - }) - - return updatedModule - } - - const updateOrCreate = async doc => { - let existing = await getModule(doc.name) - - if (!existing) { - existing = await insert(doc) - } else { - const moduleName = doc.name - // avoid conflict - delete doc.name - existing = await updateModule(moduleName, doc) - } - - return existing - } - - const insert = async doc => { - if (!doc.id) doc.id = uuidv4() - return await db.modules.insert(doc) - } - - const newModule = async ({ name }) => { - const newModule = { - name, - id: uuidv4(), - } - - return await db.modules.insert(newModule) - } - - const getNestedModules = async (moduleNames: string[]) => { - const moduleDocs = await Promise.all( - moduleNames.map(moduleName => getModule(moduleName)) - ) - if (moduleDocs.length === 0) return [] - const modules = moduleDocs.filter(Boolean).map(module => module.toJSON()) - const nestedModules = await Promise.all( - modules.map(async module => { - const nestedModuleNames = Object.values(module.data.nodes) - .filter((n: any) => n.data.module) - .map((n: any) => n.data.module) - if (nestedModuleNames.length === 0) { - return [] - } else { - const nextModuleLayer = await getNestedModules(nestedModuleNames) - return nextModuleLayer.flat() - } - }) - ) - return modules.concat(nestedModules.flat()) - } - - const getSpellModules = async spell => { - const nodes = spell?.chain?.nodes || spell?.graph?.nodes - if (!nodes) return - - const moduleNames = Object.values(nodes) - .filter((n: any) => n.data.module) - .map((n: any) => n.data.module) - - const modules = await getNestedModules(moduleNames) - return modules - } - - return { - insert, - getModules, - getModule, - newModule, - updateModule, - findOneModule, - updateOrCreate, - getSpellModules, - } -} -export default loadModuleModel diff --git a/client/src/services/Modals.ts b/client/src/services/Modals.ts deleted file mode 100644 index 122a1d5ec..000000000 --- a/client/src/services/Modals.ts +++ /dev/null @@ -1,8 +0,0 @@ -import ExampleModal from '../components/Modals/ExampleModal' -import InfoModal from '../components/Modals/InfoModal' - -const modals = { example: ExampleModal, infoModal: InfoModal } - -export const getModals = () => { - return modals -} diff --git a/client/src/services/Modals/ExampleModal.jsx b/client/src/services/Modals/ExampleModal.jsx deleted file mode 100644 index 9f3441d88..000000000 --- a/client/src/services/Modals/ExampleModal.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useModal } from '../../../contexts/ModalProvider' -import Modal from '../Modal/Modal' - -const ExampleModal = ({ content }) => { - const { closeModal } = useModal() - const options = [ - { label: 'Oki doki', className: 'primary', onClick: closeModal }, - ] - return ( - -

{content}

-
- ) -} - -export default ExampleModal diff --git a/client/src/services/Modals/InfoModal.jsx b/client/src/services/Modals/InfoModal.jsx deleted file mode 100644 index 64bd3fe4e..000000000 --- a/client/src/services/Modals/InfoModal.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import Modal from '../Modal/Modal' - -const InfoModal = ({ title, content }) => { - return ( - -

{content}

-
- ) -} - -export default InfoModal diff --git a/core/.babelrc b/core/.babelrc deleted file mode 100644 index 3f720373b..000000000 --- a/core/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - "@babel/env", - [ - "@babel/preset-react", - { - "runtime": "automatic" - } - ], - "@babel/preset-typescript" - ], - "plugins": ["@babel/plugin-proposal-class-properties"] -} diff --git a/core/src/plugins/areaPlugin/style.css.d.ts b/core/src/plugins/areaPlugin/style.css.d.ts deleted file mode 100644 index 132b232e8..000000000 --- a/core/src/plugins/areaPlugin/style.css.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - -} -export const cssExports: CssExports; -export default cssExports; diff --git a/docs/docs/developers/getting started/installingThoth.md b/docs/docs/developers/getting started/installingThoth.md index 3d4f02dd1..47277fb86 100644 --- a/docs/docs/developers/getting started/installingThoth.md +++ b/docs/docs/developers/getting started/installingThoth.md @@ -1,5 +1,5 @@ --- -title: Installing THoth +title: Installing Thoth description: This is where you will find information relevant to the Stargate Design System. hide_table_of_contents: false sidebar_position: 1 diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e21a23bcb..11b6117f6 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -7,7 +7,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula') /** @type {import('@docusaurus/types').Config} */ const config = { title: 'Thoth', - tagline: 'Spell composer', + tagline: 'A visual node editor for building AI powered data pipelines', url: 'https://thoth.latitude.io', baseUrl: '/', onBrokenLinks: 'throw', @@ -122,6 +122,9 @@ const config = { darkTheme: darkCodeTheme, }, }), + customFields: { + thothLogo: 'img/thoth-logo.png', + }, } module.exports = config diff --git a/docs/src/components/HomepageFeatures/ThothDemo.js b/docs/src/components/HomepageFeatures/ThothDemo.js new file mode 100644 index 000000000..483d246ea --- /dev/null +++ b/docs/src/components/HomepageFeatures/ThothDemo.js @@ -0,0 +1,14 @@ +import React from 'react' +import styles from './styles.module.css' + +export default function ThothDemo() { + return ( +
+
+
+ +
+
+
+ ) +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 00966558c..1dd3fad09 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -1,32 +1,53 @@ -import React from "react"; -import clsx from "clsx"; -import Layout from "@theme/Layout"; -import Link from "@docusaurus/Link"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import styles from "./index.module.css"; -import HomepageFeatures from "@site/src/components/HomepageFeatures"; +import React from 'react' +import clsx from 'clsx' +import Layout from '@theme/Layout' +import Link from '@docusaurus/Link' +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' +import styles from './index.module.css' +import HomepageFeatures from '@site/src/components/HomepageFeatures' +import ThothDemo from '../components/HomepageFeatures/ThothDemo' function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext() + return ( -
+
-

{siteConfig.title}

+ {/*

{siteConfig.title}

*/} +

{siteConfig.tagline}

- {/* + Creators + + - Docusaurus Tutorial - 5min ⏱️ - */} + to="/docs/developers/getting%20started/installingThoth" + > + Developers + +
+ +
- ); + ) } export default function Home() { - const { siteConfig } = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext() return (
- + {/* */} +
- ); + ) } diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index 9f71a5da7..1744fe234 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -8,6 +8,7 @@ text-align: center; position: relative; overflow: hidden; + background: '#424242'; } @media screen and (max-width: 996px) { @@ -21,3 +22,9 @@ align-items: center; justify-content: center; } + +.githubButtons { + display: flex; + left: 1%; + position: relative; +} diff --git a/docs/static/img/Thoth-Screen.png b/docs/static/img/Thoth-Screen.png new file mode 100644 index 000000000..53a219eec Binary files /dev/null and b/docs/static/img/Thoth-Screen.png differ diff --git a/lerna.json b/lerna.json index ff92410eb..0fa3dd610 100644 --- a/lerna.json +++ b/lerna.json @@ -1,8 +1,5 @@ { - "packages": [ - "client", - "core" - ], + "packages": ["packages/*"], "npmClient": "yarn", "useWorkspaces": true, "version": "0.0.0" diff --git a/netlify/plugins/conditional-canary/index.js b/netlify/plugins/conditional-canary/index.js index 2f7bbd16c..fd41f615e 100644 --- a/netlify/plugins/conditional-canary/index.js +++ b/netlify/plugins/conditional-canary/index.js @@ -2,8 +2,7 @@ module.exports = { onPreBuild: ({ netlifyConfig, utils: { git } }) => { const coreChanges = git.fileMatch('core/**/*') const coreChanged = coreChanges.edited.length !== 0 - const installCanary = - 'cd client && yarn add @latitudegames/thoth-core@canary && cd ..' + const installCanary = 'yarn add @latitudegames/thoth-core@canary' netlifyConfig.build.command = coreChanged ? `${installCanary} && ${netlifyConfig.build.command}` : netlifyConfig.build.command diff --git a/netlify/plugins/staging-canary/index.js b/netlify/plugins/staging-canary/index.js index 1be3e5bf5..a7c92bd9d 100644 --- a/netlify/plugins/staging-canary/index.js +++ b/netlify/plugins/staging-canary/index.js @@ -1,5 +1,5 @@ module.exports = { onPreBuild: ({ netlifyConfig, utils: { git } }) => { - netlifyConfig.build.command = `cd client && yarn add @latitudegames/thoth-core@canary && cd .. && ${netlifyConfig.build.command}` + netlifyConfig.build.command = `yarn add @latitudegames/thoth-core@canary && ${netlifyConfig.build.command}` }, } diff --git a/package.json b/package.json index 34e73dbbd..dae3c9a64 100644 --- a/package.json +++ b/package.json @@ -11,22 +11,26 @@ ], "workspaces": { "packages": [ - "client", - "core", - "sharedb" + "packages/*" ] }, + "resolutions": { + "@types/react": "17.0.2" + }, "scripts": { "start:core": "lerna exec --scope @latitudegames/thoth-core -- yarn start", "start:client": "lerna exec --scope @thoth/client -- yarn start", + "stop:client": "lerna exec --scope @thoth/client -- yarn stop", "start:sharedb": "lerna exec --scope @thoth/sharedb -- yarn start", + "start:runner": "lerna exec --scope @thoth/runner -- yarn start", "start": "run-p start:core start:client", "lint": "lerna run lint --parallel", "lint:fix": "lerna run lint:fix --parallel", "build": "copyfiles LICENSE.txt client && lerna exec --scope @thoth/client -- yarn build", "build:core": "copyfiles LICENSE.txt core && lerna exec --scope @latitudegames/thoth-core -- yarn build", "publish:canary": "lerna exec --scope @latitudegames/thoth-core -- yarn canary", - "install:canary": "lerna exec --scope @thoth/client -- yarn install:canary" + "install:canary": "lerna exec --scope @thoth/client -- yarn install:canary", + "nukefromorbit": "rimraf ./packages/**/node_modules && rimraf ./node_modules" }, "engines": { "node": ">=14.17.6", @@ -35,7 +39,8 @@ }, "devDependencies": { "craco": "^0.0.3", - "lerna": "^4.0.0" + "lerna": "^4.0.0", + "rimraf": "^3.0.2" }, "dependencies": { "@plotdb/json0": "^0.0.5", diff --git a/client/.babelrc b/packages/client/.babelrc similarity index 100% rename from client/.babelrc rename to packages/client/.babelrc diff --git a/client/.env b/packages/client/.env similarity index 100% rename from client/.env rename to packages/client/.env diff --git a/client/.env.example b/packages/client/.env.example similarity index 100% rename from client/.env.example rename to packages/client/.env.example diff --git a/client/.eslintignore b/packages/client/.eslintignore similarity index 100% rename from client/.eslintignore rename to packages/client/.eslintignore diff --git a/client/.eslintrc.js b/packages/client/.eslintrc.js similarity index 100% rename from client/.eslintrc.js rename to packages/client/.eslintrc.js diff --git a/client/.gitignore b/packages/client/.gitignore similarity index 100% rename from client/.gitignore rename to packages/client/.gitignore diff --git a/packages/client/.npmrc b/packages/client/.npmrc new file mode 100644 index 000000000..8f34f30da --- /dev/null +++ b/packages/client/.npmrc @@ -0,0 +1,4 @@ +# Add Github npm package registry, so we can install private npm packages +@latitudegames:registry=https://npm.pkg.github.com/ +//npm.pkg.github.com/:_authToken=${NPM_TOKEN} + diff --git a/client/README.md b/packages/client/README.md similarity index 100% rename from client/README.md rename to packages/client/README.md diff --git a/client/index.ejs b/packages/client/index.ejs similarity index 100% rename from client/index.ejs rename to packages/client/index.ejs diff --git a/netlify.toml b/packages/client/netlify.toml similarity index 87% rename from netlify.toml rename to packages/client/netlify.toml index 19ef49149..ccfa36d8c 100644 --- a/netlify.toml +++ b/packages/client/netlify.toml @@ -12,15 +12,15 @@ status = 200 # ALL DEPLOY PREVIEWS -[[context.deploy-preview.plugins]] - package = "/netlify/plugins/conditional-canary" +# [[context.deploy-preview.plugins]] +# package = "../../netlify/plugins/conditional-canary" [context.deploy-preview.environment] REACT_APP_API_URL="https://latitude-api-staging.herokuapp.com" # STAGING DEPLOYMENT [[context.staging.plugins]] - package = "/netlify/plugins/staging-canary" + package = "../../netlify/plugins/staging-canary" [context.staging.environment] REACT_APP_LAPI_ROOT_URL_PROD="https://latitude-api-staging.herokuapp.com" diff --git a/client/package.json b/packages/client/package.json similarity index 92% rename from client/package.json rename to packages/client/package.json index ed204003c..98e586978 100644 --- a/client/package.json +++ b/packages/client/package.json @@ -11,6 +11,7 @@ "private": true, "scripts": { "start": "NODE_ENV=development webpack serve --config webpack.dev.js", + "stop": "pid=$(lsof -ti tcp:3003) && [[ $pid ]] && kill -9 $pid fi", "clean": "rimraf ../build", "lint": "eslint . --ignore-path ../.eslintignore --ext ts --ext tsx --ext js --ext jsx", "lint:fix": "eslint . --ignore-path ../.eslintignore --ext ts --ext tsx --ext js --ext jsx --fix", @@ -19,11 +20,16 @@ "test": "echo test", "install:canary": "yarn add @latitudegames/thoth-core@canary" }, + "resolutions": { + "@types/react": "17.0.24" + }, "dependencies": { "@callstack/async-storage": "^2.0.3", "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", - "@latitudegames/thoth-core": "^0.0.67", + "@feathersjs/client": "^4.5.14", + "@feathersjs/feathers": "^4.5.12", + "@latitudegames/thoth-core": "0.0.68", "@monaco-editor/react": "^4.2.1", "@mui/icons-material": "^5.5.1", "@mui/material": "^5.5.3", @@ -34,6 +40,7 @@ "classnames": "^2.3.1", "deep-equal": "^2.0.5", "eslint-config-react-app": "^6.0.0", + "feathers-authentication-client": "^0.3.3", "flexlayout-react": "^0.5.12", "handlebars": "^4.7.7", "history": "^5.0.1", @@ -80,7 +87,7 @@ "@testing-library/user-event": "^12.1.10", "@types/jest": "^26.0.24", "@types/node": "^16.4.3", - "@types/react": "^17.0.15", + "@types/react": "^17.0.24", "@types/react-dom": "^17.0.9", "@types/react-redux": "^7.1.18", "@welldone-software/why-did-you-render": "^6.2.1", diff --git a/client/public/_redirects b/packages/client/public/_redirects similarity index 100% rename from client/public/_redirects rename to packages/client/public/_redirects diff --git a/client/public/favicon.ico b/packages/client/public/favicon.ico similarity index 100% rename from client/public/favicon.ico rename to packages/client/public/favicon.ico diff --git a/client/public/logo192.png b/packages/client/public/logo192.png similarity index 100% rename from client/public/logo192.png rename to packages/client/public/logo192.png diff --git a/client/public/logo512.png b/packages/client/public/logo512.png similarity index 100% rename from client/public/logo512.png rename to packages/client/public/logo512.png diff --git a/client/public/manifest.json b/packages/client/public/manifest.json similarity index 100% rename from client/public/manifest.json rename to packages/client/public/manifest.json diff --git a/client/public/robots.txt b/packages/client/public/robots.txt similarity index 100% rename from client/public/robots.txt rename to packages/client/public/robots.txt diff --git a/client/scripts/engine.ts b/packages/client/scripts/engine.ts similarity index 100% rename from client/scripts/engine.ts rename to packages/client/scripts/engine.ts diff --git a/client/scripts/module.ts b/packages/client/scripts/module.ts similarity index 100% rename from client/scripts/module.ts rename to packages/client/scripts/module.ts diff --git a/client/scripts/package-lock.json b/packages/client/scripts/package-lock.json similarity index 100% rename from client/scripts/package-lock.json rename to packages/client/scripts/package-lock.json diff --git a/client/scripts/package.json b/packages/client/scripts/package.json similarity index 100% rename from client/scripts/package.json rename to packages/client/scripts/package.json diff --git a/client/scripts/spell.ts b/packages/client/scripts/spell.ts similarity index 100% rename from client/scripts/spell.ts rename to packages/client/scripts/spell.ts diff --git a/client/scripts/tsconfig.json b/packages/client/scripts/tsconfig.json similarity index 100% rename from client/scripts/tsconfig.json rename to packages/client/scripts/tsconfig.json diff --git a/client/src/App.css b/packages/client/src/App.css similarity index 100% rename from client/src/App.css rename to packages/client/src/App.css diff --git a/client/src/App.css.d.ts b/packages/client/src/App.css.d.ts similarity index 100% rename from client/src/App.css.d.ts rename to packages/client/src/App.css.d.ts diff --git a/client/src/App.tsx b/packages/client/src/App.tsx similarity index 100% rename from client/src/App.tsx rename to packages/client/src/App.tsx diff --git a/client/src/components/Accordion.tsx b/packages/client/src/components/Accordion.tsx similarity index 100% rename from client/src/components/Accordion.tsx rename to packages/client/src/components/Accordion.tsx diff --git a/client/src/components/Button/button.module.css b/packages/client/src/components/Button/button.module.css similarity index 100% rename from client/src/components/Button/button.module.css rename to packages/client/src/components/Button/button.module.css diff --git a/client/src/components/Chip/Chip.tsx b/packages/client/src/components/Chip/Chip.tsx similarity index 100% rename from client/src/components/Chip/Chip.tsx rename to packages/client/src/components/Chip/Chip.tsx diff --git a/client/src/components/Chip/chip.module.css b/packages/client/src/components/Chip/chip.module.css similarity index 100% rename from client/src/components/Chip/chip.module.css rename to packages/client/src/components/Chip/chip.module.css diff --git a/client/src/components/Chip/chip.module.css.d.ts b/packages/client/src/components/Chip/chip.module.css.d.ts similarity index 100% rename from client/src/components/Chip/chip.module.css.d.ts rename to packages/client/src/components/Chip/chip.module.css.d.ts diff --git a/client/src/components/Icon/Icon.tsx b/packages/client/src/components/Icon/Icon.tsx similarity index 100% rename from client/src/components/Icon/Icon.tsx rename to packages/client/src/components/Icon/Icon.tsx diff --git a/client/src/components/Icon/Lock.svg b/packages/client/src/components/Icon/Lock.svg similarity index 100% rename from client/src/components/Icon/Lock.svg rename to packages/client/src/components/Icon/Lock.svg diff --git a/client/src/components/Icon/account.svg b/packages/client/src/components/Icon/account.svg similarity index 100% rename from client/src/components/Icon/account.svg rename to packages/client/src/components/Icon/account.svg diff --git a/client/src/components/Icon/add.svg b/packages/client/src/components/Icon/add.svg similarity index 100% rename from client/src/components/Icon/add.svg rename to packages/client/src/components/Icon/add.svg diff --git a/client/src/components/Icon/ankh.svg b/packages/client/src/components/Icon/ankh.svg similarity index 100% rename from client/src/components/Icon/ankh.svg rename to packages/client/src/components/Icon/ankh.svg diff --git a/client/src/components/Icon/bird.svg b/packages/client/src/components/Icon/bird.svg similarity index 100% rename from client/src/components/Icon/bird.svg rename to packages/client/src/components/Icon/bird.svg diff --git a/client/src/components/Icon/close.svg b/packages/client/src/components/Icon/close.svg similarity index 100% rename from client/src/components/Icon/close.svg rename to packages/client/src/components/Icon/close.svg diff --git a/client/src/components/Icon/cloth.svg b/packages/client/src/components/Icon/cloth.svg similarity index 100% rename from client/src/components/Icon/cloth.svg rename to packages/client/src/components/Icon/cloth.svg diff --git a/client/src/components/Icon/cup.svg b/packages/client/src/components/Icon/cup.svg similarity index 100% rename from client/src/components/Icon/cup.svg rename to packages/client/src/components/Icon/cup.svg diff --git a/client/src/components/Icon/dangerTrash.svg b/packages/client/src/components/Icon/dangerTrash.svg similarity index 100% rename from client/src/components/Icon/dangerTrash.svg rename to packages/client/src/components/Icon/dangerTrash.svg diff --git a/client/src/components/Icon/feathers.svg b/packages/client/src/components/Icon/feathers.svg similarity index 100% rename from client/src/components/Icon/feathers.svg rename to packages/client/src/components/Icon/feathers.svg diff --git a/client/src/components/Icon/fewshot.svg b/packages/client/src/components/Icon/fewshot.svg similarity index 100% rename from client/src/components/Icon/fewshot.svg rename to packages/client/src/components/Icon/fewshot.svg diff --git a/client/src/components/Icon/folder.svg b/packages/client/src/components/Icon/folder.svg similarity index 100% rename from client/src/components/Icon/folder.svg rename to packages/client/src/components/Icon/folder.svg diff --git a/client/src/components/Icon/hand.svg b/packages/client/src/components/Icon/hand.svg similarity index 100% rename from client/src/components/Icon/hand.svg rename to packages/client/src/components/Icon/hand.svg diff --git a/client/src/components/Icon/icon.module.css b/packages/client/src/components/Icon/icon.module.css similarity index 100% rename from client/src/components/Icon/icon.module.css rename to packages/client/src/components/Icon/icon.module.css diff --git a/client/src/components/Icon/icon.module.css.d.ts b/packages/client/src/components/Icon/icon.module.css.d.ts similarity index 100% rename from client/src/components/Icon/icon.module.css.d.ts rename to packages/client/src/components/Icon/icon.module.css.d.ts diff --git a/client/src/components/Icon/info.svg b/packages/client/src/components/Icon/info.svg similarity index 100% rename from client/src/components/Icon/info.svg rename to packages/client/src/components/Icon/info.svg diff --git a/client/src/components/Icon/merge.svg b/packages/client/src/components/Icon/merge.svg similarity index 100% rename from client/src/components/Icon/merge.svg rename to packages/client/src/components/Icon/merge.svg diff --git a/client/src/components/Icon/minus.svg b/packages/client/src/components/Icon/minus.svg similarity index 100% rename from client/src/components/Icon/minus.svg rename to packages/client/src/components/Icon/minus.svg diff --git a/client/src/components/Icon/moon.svg b/packages/client/src/components/Icon/moon.svg similarity index 100% rename from client/src/components/Icon/moon.svg rename to packages/client/src/components/Icon/moon.svg diff --git a/client/src/components/Icon/newnode.svg b/packages/client/src/components/Icon/newnode.svg similarity index 100% rename from client/src/components/Icon/newnode.svg rename to packages/client/src/components/Icon/newnode.svg diff --git a/client/src/components/Icon/node-lock.svg b/packages/client/src/components/Icon/node-lock.svg similarity index 100% rename from client/src/components/Icon/node-lock.svg rename to packages/client/src/components/Icon/node-lock.svg diff --git a/client/src/components/Icon/pause.svg b/packages/client/src/components/Icon/pause.svg similarity index 100% rename from client/src/components/Icon/pause.svg rename to packages/client/src/components/Icon/pause.svg diff --git a/client/src/components/Icon/person.svg b/packages/client/src/components/Icon/person.svg similarity index 100% rename from client/src/components/Icon/person.svg rename to packages/client/src/components/Icon/person.svg diff --git a/client/src/components/Icon/play-print.svg b/packages/client/src/components/Icon/play-print.svg similarity index 100% rename from client/src/components/Icon/play-print.svg rename to packages/client/src/components/Icon/play-print.svg diff --git a/client/src/components/Icon/play.svg b/packages/client/src/components/Icon/play.svg similarity index 100% rename from client/src/components/Icon/play.svg rename to packages/client/src/components/Icon/play.svg diff --git a/client/src/components/Icon/properties.svg b/packages/client/src/components/Icon/properties.svg similarity index 100% rename from client/src/components/Icon/properties.svg rename to packages/client/src/components/Icon/properties.svg diff --git a/client/src/components/Icon/refresh.svg b/packages/client/src/components/Icon/refresh.svg similarity index 100% rename from client/src/components/Icon/refresh.svg rename to packages/client/src/components/Icon/refresh.svg diff --git a/client/src/components/Icon/search.svg b/packages/client/src/components/Icon/search.svg similarity index 100% rename from client/src/components/Icon/search.svg rename to packages/client/src/components/Icon/search.svg diff --git a/client/src/components/Icon/seive.svg b/packages/client/src/components/Icon/seive.svg similarity index 100% rename from client/src/components/Icon/seive.svg rename to packages/client/src/components/Icon/seive.svg diff --git a/client/src/components/Icon/snake.svg b/packages/client/src/components/Icon/snake.svg similarity index 100% rename from client/src/components/Icon/snake.svg rename to packages/client/src/components/Icon/snake.svg diff --git a/client/src/components/Icon/state-read.svg b/packages/client/src/components/Icon/state-read.svg similarity index 100% rename from client/src/components/Icon/state-read.svg rename to packages/client/src/components/Icon/state-read.svg diff --git a/client/src/components/Icon/state-write.svg b/packages/client/src/components/Icon/state-write.svg similarity index 100% rename from client/src/components/Icon/state-write.svg rename to packages/client/src/components/Icon/state-write.svg diff --git a/client/src/components/Icon/state.svg b/packages/client/src/components/Icon/state.svg similarity index 100% rename from client/src/components/Icon/state.svg rename to packages/client/src/components/Icon/state.svg diff --git a/client/src/components/Icon/stop-sign.svg b/packages/client/src/components/Icon/stop-sign.svg similarity index 100% rename from client/src/components/Icon/stop-sign.svg rename to packages/client/src/components/Icon/stop-sign.svg diff --git a/client/src/components/Icon/stop.svg b/packages/client/src/components/Icon/stop.svg similarity index 100% rename from client/src/components/Icon/stop.svg rename to packages/client/src/components/Icon/stop.svg diff --git a/client/src/components/Icon/switch.svg b/packages/client/src/components/Icon/switch.svg similarity index 100% rename from client/src/components/Icon/switch.svg rename to packages/client/src/components/Icon/switch.svg diff --git a/client/src/components/Icon/temperature.svg b/packages/client/src/components/Icon/temperature.svg similarity index 100% rename from client/src/components/Icon/temperature.svg rename to packages/client/src/components/Icon/temperature.svg diff --git a/client/src/components/Icon/text.svg b/packages/client/src/components/Icon/text.svg similarity index 100% rename from client/src/components/Icon/text.svg rename to packages/client/src/components/Icon/text.svg diff --git a/client/src/components/Icon/tiles.svg b/packages/client/src/components/Icon/tiles.svg similarity index 100% rename from client/src/components/Icon/tiles.svg rename to packages/client/src/components/Icon/tiles.svg diff --git a/client/src/components/Icon/time.svg b/packages/client/src/components/Icon/time.svg similarity index 100% rename from client/src/components/Icon/time.svg rename to packages/client/src/components/Icon/time.svg diff --git a/client/src/components/Icon/trash.svg b/packages/client/src/components/Icon/trash.svg similarity index 100% rename from client/src/components/Icon/trash.svg rename to packages/client/src/components/Icon/trash.svg diff --git a/client/src/components/Icon/warn.svg b/packages/client/src/components/Icon/warn.svg similarity index 100% rename from client/src/components/Icon/warn.svg rename to packages/client/src/components/Icon/warn.svg diff --git a/client/src/components/Icon/water-play.svg b/packages/client/src/components/Icon/water-play.svg similarity index 100% rename from client/src/components/Icon/water-play.svg rename to packages/client/src/components/Icon/water-play.svg diff --git a/client/src/components/Icon/water-run.svg b/packages/client/src/components/Icon/water-run.svg similarity index 100% rename from client/src/components/Icon/water-run.svg rename to packages/client/src/components/Icon/water-run.svg diff --git a/client/src/components/Icon/water.svg b/packages/client/src/components/Icon/water.svg similarity index 100% rename from client/src/components/Icon/water.svg rename to packages/client/src/components/Icon/water.svg diff --git a/client/src/components/Input/Input.tsx b/packages/client/src/components/Input/Input.tsx similarity index 100% rename from client/src/components/Input/Input.tsx rename to packages/client/src/components/Input/Input.tsx diff --git a/client/src/components/Input/input.module.css b/packages/client/src/components/Input/input.module.css similarity index 100% rename from client/src/components/Input/input.module.css rename to packages/client/src/components/Input/input.module.css diff --git a/client/src/components/LoadingScreen/LoadingScreen.jsx b/packages/client/src/components/LoadingScreen/LoadingScreen.jsx similarity index 100% rename from client/src/components/LoadingScreen/LoadingScreen.jsx rename to packages/client/src/components/LoadingScreen/LoadingScreen.jsx diff --git a/client/src/components/LoadingScreen/ankh.gif b/packages/client/src/components/LoadingScreen/ankh.gif similarity index 100% rename from client/src/components/LoadingScreen/ankh.gif rename to packages/client/src/components/LoadingScreen/ankh.gif diff --git a/client/src/components/MenuBar/MenuBar.tsx b/packages/client/src/components/MenuBar/MenuBar.tsx similarity index 84% rename from client/src/components/MenuBar/MenuBar.tsx rename to packages/client/src/components/MenuBar/MenuBar.tsx index f67acd12c..2a7c00b47 100644 --- a/client/src/components/MenuBar/MenuBar.tsx +++ b/packages/client/src/components/MenuBar/MenuBar.tsx @@ -6,14 +6,19 @@ import { usePubSub } from '../../contexts/PubSubProvider' import css from './menuBar.module.css' import thothlogo from './thoth.png' import { useNavigate } from 'react-router-dom' -import { useSelector } from 'react-redux' +import { useDispatch, useSelector } from 'react-redux' import { activeTabSelector, Tab } from '@/state/tabs' +import { toggleAutoSave } from '@/state/preferences' +import { RootState } from '@/state/store' const MenuBar = () => { const navigate = useNavigate() const { publish, events } = usePubSub() + const dispatch = useDispatch() const activeTab = useSelector(activeTabSelector) + const preferences = useSelector((state: RootState) => state.preferences) + const { openModal } = useModal() const activeTabRef = useRef(null) @@ -31,6 +36,7 @@ const MenuBar = () => { $CREATE_INSPECTOR, $CREATE_TEXT_EDITOR, $CREATE_CONSOLE, + $CREATE_SETTINGS_WINDOW, $SERIALIZE, $EXPORT, $UNDO, @@ -101,6 +107,11 @@ const MenuBar = () => { publish($CREATE_TEXT_EDITOR(activeTabRef.current.id)) } + const onSettingsCreate = () => { + if (!activeTabRef.current) return + publish($CREATE_SETTINGS_WINDOW(activeTabRef.current.id)) + } + const onExport = () => { if (!activeTabRef.current) return publish($EXPORT(activeTabRef.current.id)) @@ -121,6 +132,9 @@ const MenuBar = () => { publish($REDO(activeTabRef.current.id)) } + const toggleSave = () => { + dispatch(toggleAutoSave()) + } //Menu bar entries const menuBarItems = { file: { @@ -187,6 +201,18 @@ const MenuBar = () => { console: { onClick: onConsole, }, + settings: { + onClick: onSettingsCreate, + }, + }, + }, + settings: { + items: { + 'Auto Save': { + onClick: toggleSave, + hotKey: 'option+shift+a', + isActive: preferences.autoSave, + }, }, }, } @@ -240,7 +266,26 @@ const MenuBar = () => { className={`${css[topLevel ? 'menu-bar-item' : 'list-item']}`} onClick={onClick} > - {label} + + {Object.entries(item).map( + ([key, value]: [string, Record]) => { + if (key === 'isActive') + return ( + + ●{' '} + + ) + } + )} + {label} + {hotKeyLabel && {parseStringToUnicode(hotKeyLabel)}} {children &&
} {/* {!topLevel &&
} */} diff --git a/client/src/components/MenuBar/menuBar.module.css b/packages/client/src/components/MenuBar/menuBar.module.css similarity index 96% rename from client/src/components/MenuBar/menuBar.module.css rename to packages/client/src/components/MenuBar/menuBar.module.css index 55a42ba10..224b850ca 100644 --- a/client/src/components/MenuBar/menuBar.module.css +++ b/packages/client/src/components/MenuBar/menuBar.module.css @@ -116,3 +116,11 @@ li.list-item:only-child { right: var(--small); transform: translateY(-50%); } + +.preference-active { + color: green; +} + +.preference-notActive { + color: rgb(183, 0, 0); +} diff --git a/client/src/components/MenuBar/menuBar.module.css.d.ts b/packages/client/src/components/MenuBar/menuBar.module.css.d.ts similarity index 82% rename from client/src/components/MenuBar/menuBar.module.css.d.ts rename to packages/client/src/components/MenuBar/menuBar.module.css.d.ts index 7211823c7..42917489d 100644 --- a/client/src/components/MenuBar/menuBar.module.css.d.ts +++ b/packages/client/src/components/MenuBar/menuBar.module.css.d.ts @@ -6,6 +6,8 @@ interface CssExports { 'menu-bar': string; 'menu-bar-item': string; 'menu-panel': string; + 'preference-active': string; + 'preference-notActive': string; 'thoth-logo': string; } export const cssExports: CssExports; diff --git a/client/src/components/MenuBar/thoth.png b/packages/client/src/components/MenuBar/thoth.png similarity index 100% rename from client/src/components/MenuBar/thoth.png rename to packages/client/src/components/MenuBar/thoth.png diff --git a/client/src/components/Modal/Modal.jsx b/packages/client/src/components/Modal/Modal.jsx similarity index 100% rename from client/src/components/Modal/Modal.jsx rename to packages/client/src/components/Modal/Modal.jsx diff --git a/client/src/components/Modal/modal.module.css b/packages/client/src/components/Modal/modal.module.css similarity index 100% rename from client/src/components/Modal/modal.module.css rename to packages/client/src/components/Modal/modal.module.css diff --git a/client/src/components/Modal/modal.module.css.d.ts b/packages/client/src/components/Modal/modal.module.css.d.ts similarity index 100% rename from client/src/components/Modal/modal.module.css.d.ts rename to packages/client/src/components/Modal/modal.module.css.d.ts diff --git a/client/src/components/Modals/DeployModal.jsx b/packages/client/src/components/Modals/DeployModal.jsx similarity index 100% rename from client/src/components/Modals/DeployModal.jsx rename to packages/client/src/components/Modals/DeployModal.jsx diff --git a/client/src/components/Modals/EditSpellModal.tsx b/packages/client/src/components/Modals/EditSpellModal.tsx similarity index 100% rename from client/src/components/Modals/EditSpellModal.tsx rename to packages/client/src/components/Modals/EditSpellModal.tsx diff --git a/client/src/components/Modals/ExampleModal.jsx b/packages/client/src/components/Modals/ExampleModal.jsx similarity index 100% rename from client/src/components/Modals/ExampleModal.jsx rename to packages/client/src/components/Modals/ExampleModal.jsx diff --git a/packages/client/src/components/Modals/InfoModal.tsx b/packages/client/src/components/Modals/InfoModal.tsx new file mode 100644 index 000000000..89ee2149d --- /dev/null +++ b/packages/client/src/components/Modals/InfoModal.tsx @@ -0,0 +1,35 @@ +import Modal from '../../components/Modal/Modal' + +interface InfoModal { + title: string + content: string + checkbox?: { + onClick: () => {} + label: string + } +} + +const InfoModal = ({ title, content, checkbox }: InfoModal) => { + return ( + +

{content}

+ {checkbox && ( +
+ + +
+ )} +
+ ) +} + +export default InfoModal diff --git a/client/src/components/Modals/SaveAsModal.tsx b/packages/client/src/components/Modals/SaveAsModal.tsx similarity index 100% rename from client/src/components/Modals/SaveAsModal.tsx rename to packages/client/src/components/Modals/SaveAsModal.tsx diff --git a/client/src/components/Modals/index.ts b/packages/client/src/components/Modals/index.ts similarity index 100% rename from client/src/components/Modals/index.ts rename to packages/client/src/components/Modals/index.ts diff --git a/client/src/components/Modals/loginModal.module.css.d.ts b/packages/client/src/components/Modals/loginModal.module.css.d.ts similarity index 100% rename from client/src/components/Modals/loginModal.module.css.d.ts rename to packages/client/src/components/Modals/loginModal.module.css.d.ts diff --git a/client/src/components/Modals/modalForms.module.css b/packages/client/src/components/Modals/modalForms.module.css similarity index 100% rename from client/src/components/Modals/modalForms.module.css rename to packages/client/src/components/Modals/modalForms.module.css diff --git a/client/src/components/Modals/modalForms.module.css.d.ts b/packages/client/src/components/Modals/modalForms.module.css.d.ts similarity index 100% rename from client/src/components/Modals/modalForms.module.css.d.ts rename to packages/client/src/components/Modals/modalForms.module.css.d.ts diff --git a/client/src/components/Node/Node.module.css b/packages/client/src/components/Node/Node.module.css similarity index 100% rename from client/src/components/Node/Node.module.css rename to packages/client/src/components/Node/Node.module.css diff --git a/client/src/components/Node/Node.module.css.d.ts b/packages/client/src/components/Node/Node.module.css.d.ts similarity index 100% rename from client/src/components/Node/Node.module.css.d.ts rename to packages/client/src/components/Node/Node.module.css.d.ts diff --git a/client/src/components/Node/Node.tsx b/packages/client/src/components/Node/Node.tsx similarity index 100% rename from client/src/components/Node/Node.tsx rename to packages/client/src/components/Node/Node.tsx diff --git a/client/src/components/Panel/Panel.tsx b/packages/client/src/components/Panel/Panel.tsx similarity index 100% rename from client/src/components/Panel/Panel.tsx rename to packages/client/src/components/Panel/Panel.tsx diff --git a/client/src/components/Panel/panel.module.css b/packages/client/src/components/Panel/panel.module.css similarity index 100% rename from client/src/components/Panel/panel.module.css rename to packages/client/src/components/Panel/panel.module.css diff --git a/client/src/components/Panel/panel.module.css.d.ts b/packages/client/src/components/Panel/panel.module.css.d.ts similarity index 100% rename from client/src/components/Panel/panel.module.css.d.ts rename to packages/client/src/components/Panel/panel.module.css.d.ts diff --git a/client/src/components/RequireAuth/RequireAuth.tsx b/packages/client/src/components/RequireAuth/RequireAuth.tsx similarity index 100% rename from client/src/components/RequireAuth/RequireAuth.tsx rename to packages/client/src/components/RequireAuth/RequireAuth.tsx diff --git a/client/src/components/Select/Select.tsx b/packages/client/src/components/Select/Select.tsx similarity index 100% rename from client/src/components/Select/Select.tsx rename to packages/client/src/components/Select/Select.tsx diff --git a/client/src/components/Select/select.module.css b/packages/client/src/components/Select/select.module.css similarity index 100% rename from client/src/components/Select/select.module.css rename to packages/client/src/components/Select/select.module.css diff --git a/client/src/components/Select/select.module.css.d.ts b/packages/client/src/components/Select/select.module.css.d.ts similarity index 100% rename from client/src/components/Select/select.module.css.d.ts rename to packages/client/src/components/Select/select.module.css.d.ts diff --git a/client/src/components/Switch/Switch.tsx b/packages/client/src/components/Switch/Switch.tsx similarity index 100% rename from client/src/components/Switch/Switch.tsx rename to packages/client/src/components/Switch/Switch.tsx diff --git a/client/src/components/TabBar/CreateTab.tsx b/packages/client/src/components/TabBar/CreateTab.tsx similarity index 100% rename from client/src/components/TabBar/CreateTab.tsx rename to packages/client/src/components/TabBar/CreateTab.tsx diff --git a/client/src/components/TabBar/TabBar.tsx b/packages/client/src/components/TabBar/TabBar.tsx similarity index 100% rename from client/src/components/TabBar/TabBar.tsx rename to packages/client/src/components/TabBar/TabBar.tsx diff --git a/client/src/components/TabBar/tabBar.module.css b/packages/client/src/components/TabBar/tabBar.module.css similarity index 100% rename from client/src/components/TabBar/tabBar.module.css rename to packages/client/src/components/TabBar/tabBar.module.css diff --git a/client/src/components/TabBar/tabBar.module.css.d.ts b/packages/client/src/components/TabBar/tabBar.module.css.d.ts similarity index 100% rename from client/src/components/TabBar/tabBar.module.css.d.ts rename to packages/client/src/components/TabBar/tabBar.module.css.d.ts diff --git a/client/src/components/TabLayout/TabLayout.jsx b/packages/client/src/components/TabLayout/TabLayout.jsx similarity index 100% rename from client/src/components/TabLayout/TabLayout.jsx rename to packages/client/src/components/TabLayout/TabLayout.jsx diff --git a/client/src/components/TabLayout/TabLayout.module.css b/packages/client/src/components/TabLayout/TabLayout.module.css similarity index 100% rename from client/src/components/TabLayout/TabLayout.module.css rename to packages/client/src/components/TabLayout/TabLayout.module.css diff --git a/client/src/components/TabLayout/TabLayout.module.css.d.ts b/packages/client/src/components/TabLayout/TabLayout.module.css.d.ts similarity index 100% rename from client/src/components/TabLayout/TabLayout.module.css.d.ts rename to packages/client/src/components/TabLayout/TabLayout.module.css.d.ts diff --git a/client/src/components/ThothPage/ThothPageWrapper.tsx b/packages/client/src/components/ThothPage/ThothPageWrapper.tsx similarity index 100% rename from client/src/components/ThothPage/ThothPageWrapper.tsx rename to packages/client/src/components/ThothPage/ThothPageWrapper.tsx diff --git a/client/src/components/ThothPage/pagewrapper.module.css b/packages/client/src/components/ThothPage/pagewrapper.module.css similarity index 100% rename from client/src/components/ThothPage/pagewrapper.module.css rename to packages/client/src/components/ThothPage/pagewrapper.module.css diff --git a/client/src/components/ThothPage/pagewrapper.module.css.d.ts b/packages/client/src/components/ThothPage/pagewrapper.module.css.d.ts similarity index 100% rename from client/src/components/ThothPage/pagewrapper.module.css.d.ts rename to packages/client/src/components/ThothPage/pagewrapper.module.css.d.ts diff --git a/client/src/components/Toolbar/Toolbar.tsx b/packages/client/src/components/Toolbar/Toolbar.tsx similarity index 100% rename from client/src/components/Toolbar/Toolbar.tsx rename to packages/client/src/components/Toolbar/Toolbar.tsx diff --git a/client/src/components/Toolbar/toolbar.module.css b/packages/client/src/components/Toolbar/toolbar.module.css similarity index 100% rename from client/src/components/Toolbar/toolbar.module.css rename to packages/client/src/components/Toolbar/toolbar.module.css diff --git a/client/src/components/Window/Window.tsx b/packages/client/src/components/Window/Window.tsx similarity index 100% rename from client/src/components/Window/Window.tsx rename to packages/client/src/components/Window/Window.tsx diff --git a/client/src/components/Window/WindowToolbar.tsx b/packages/client/src/components/Window/WindowToolbar.tsx similarity index 100% rename from client/src/components/Window/WindowToolbar.tsx rename to packages/client/src/components/Window/WindowToolbar.tsx diff --git a/client/src/components/Window/window.module.css b/packages/client/src/components/Window/window.module.css similarity index 100% rename from client/src/components/Window/window.module.css rename to packages/client/src/components/Window/window.module.css diff --git a/client/src/components/Window/window.module.css.d.ts b/packages/client/src/components/Window/window.module.css.d.ts similarity index 100% rename from client/src/components/Window/window.module.css.d.ts rename to packages/client/src/components/Window/window.module.css.d.ts diff --git a/client/src/components/accordion-overrides.css b/packages/client/src/components/accordion-overrides.css similarity index 100% rename from client/src/components/accordion-overrides.css rename to packages/client/src/components/accordion-overrides.css diff --git a/client/src/components/accordion-overrides.css.d.ts b/packages/client/src/components/accordion-overrides.css.d.ts similarity index 100% rename from client/src/components/accordion-overrides.css.d.ts rename to packages/client/src/components/accordion-overrides.css.d.ts diff --git a/client/src/components/accordion.module.css b/packages/client/src/components/accordion.module.css similarity index 100% rename from client/src/components/accordion.module.css rename to packages/client/src/components/accordion.module.css diff --git a/client/src/components/accordion.module.css.d.ts b/packages/client/src/components/accordion.module.css.d.ts similarity index 100% rename from client/src/components/accordion.module.css.d.ts rename to packages/client/src/components/accordion.module.css.d.ts diff --git a/client/src/components/z. Don't use/TextInput/TextInput.tsx b/packages/client/src/components/z. Don't use/TextInput/TextInput.tsx similarity index 100% rename from client/src/components/z. Don't use/TextInput/TextInput.tsx rename to packages/client/src/components/z. Don't use/TextInput/TextInput.tsx diff --git a/client/src/components/z. Don't use/TextInput/textinput.module.css b/packages/client/src/components/z. Don't use/TextInput/textinput.module.css similarity index 100% rename from client/src/components/z. Don't use/TextInput/textinput.module.css rename to packages/client/src/components/z. Don't use/TextInput/textinput.module.css diff --git a/client/src/config.ts b/packages/client/src/config.ts similarity index 84% rename from client/src/config.ts rename to packages/client/src/config.ts index 98d363c7c..4ef6b2e95 100644 --- a/client/src/config.ts +++ b/packages/client/src/config.ts @@ -13,4 +13,6 @@ export const appRootUrl = // coercing this into a boolean export const sharedb = process.env.REACT_APP_SHAREDB === 'true' export const websockets = process.env.REACT_APP_WEBSOCKETS === 'true' +export const feathers = process.env.REACT_APP_FEATHERS === 'true' +export const feathersUrl = 'http://localhost:3030' export const websocketUrl = 'ws://localhost:8080' diff --git a/client/src/contexts/AppProviders.tsx b/packages/client/src/contexts/AppProviders.tsx similarity index 95% rename from client/src/contexts/AppProviders.tsx rename to packages/client/src/contexts/AppProviders.tsx index 5d3adec95..e5b372e5f 100644 --- a/client/src/contexts/AppProviders.tsx +++ b/packages/client/src/contexts/AppProviders.tsx @@ -6,6 +6,7 @@ import { } from '@mui/material/styles' import AuthProvider from './AuthProvider' +import FeathersProvider from './FeathersProvider' import PubSubProvider from './PubSubProvider' import SharedbProvider from './SharedbProvider' import ToastProvider from './ToastProvider' @@ -29,6 +30,7 @@ const providers = [ [ThemeProvider, { theme: darkTheme }], ToastProvider, AuthProvider, + FeathersProvider, WebSocketProvider, SharedbProvider, ] diff --git a/client/src/contexts/AuthProvider.tsx b/packages/client/src/contexts/AuthProvider.tsx similarity index 99% rename from client/src/contexts/AuthProvider.tsx rename to packages/client/src/contexts/AuthProvider.tsx index 8327b9027..0ae7e5c8f 100644 --- a/client/src/contexts/AuthProvider.tsx +++ b/packages/client/src/contexts/AuthProvider.tsx @@ -34,6 +34,7 @@ const initialState = { logoutAndRedirect: () => {}, loginRedirect: (force?: boolean, returnToPath?: string) => {}, refreshSession: (origin: string) => {}, + done: false, } const AuthContext = createContext(initialState) @@ -216,6 +217,7 @@ const AuthProvider = ({ children }: { children: ReactElement }) => { logoutAndRedirect, loginRedirect, refreshSession, + done, } if (!done) return diff --git a/packages/client/src/contexts/FeathersProvider.tsx b/packages/client/src/contexts/FeathersProvider.tsx new file mode 100644 index 000000000..474914e2d --- /dev/null +++ b/packages/client/src/contexts/FeathersProvider.tsx @@ -0,0 +1,68 @@ +import feathers from '@feathersjs/client' +import io from 'socket.io-client' +import { useContext, createContext, useEffect, useState } from 'react' + +import { feathers as feathersFlag, feathersUrl } from '@/config' +// import { Application } from '@feathersjs/feathers' + +import { getAuthHeader, useAuth } from './AuthProvider' + +const buildFeathersClient = async () => { + const feathersClient = feathers() + const authHeaders = await getAuthHeader() + const socket = io(feathersUrl, { + // Send the authorization header in the initial connection request + transportOptions: { + polling: { + withCredentials: true, + extraHeaders: authHeaders, + }, + }, + }) + feathersClient.configure(feathers.socketio(socket, { timeout: 10000 })) + + // No idea how to type feathers to add io properties to root client. + return feathersClient as any +} + +interface FeathersContext { + client: any | null +} + +const Context = createContext(undefined!) + +export const useFeathers = () => useContext(Context) + +// Might want to namespace these +const FeathersProvider = ({ children }) => { + const [client, setClient] = useState(null) + + const { done } = useAuth() + + useEffect(() => { + // We only want to create the feathers connection once we have a user to handle + if (!done) return + ;(async () => { + const client = await buildFeathersClient() + client.io.on('connected', () => { + setClient(client) + }) + })() + }, [done]) + + const publicInterface: FeathersContext = { + client, + } + + // if (!client) return + + return {children} +} + +const ConditionalProvider = props => { + if (!feathersFlag) return props.children + + return +} + +export default ConditionalProvider diff --git a/client/src/contexts/ModalProvider.jsx b/packages/client/src/contexts/ModalProvider.jsx similarity index 100% rename from client/src/contexts/ModalProvider.jsx rename to packages/client/src/contexts/ModalProvider.jsx diff --git a/client/src/contexts/ModuleProvider.tsx.bak b/packages/client/src/contexts/ModuleProvider.tsx.bak similarity index 100% rename from client/src/contexts/ModuleProvider.tsx.bak rename to packages/client/src/contexts/ModuleProvider.tsx.bak diff --git a/client/src/contexts/PubSubProvider.tsx b/packages/client/src/contexts/PubSubProvider.tsx similarity index 91% rename from client/src/contexts/PubSubProvider.tsx rename to packages/client/src/contexts/PubSubProvider.tsx index 426e8bcda..fa2eebb59 100644 --- a/client/src/contexts/PubSubProvider.tsx +++ b/packages/client/src/contexts/PubSubProvider.tsx @@ -23,7 +23,7 @@ export const events = { UPDATE_SUBSPELL: 'updateSubspell', DELETE_SUBSPELL: 'deleteSubspell', $SUBSPELL_UPDATED: spellId => `subspellUpdated:${spellId}`, - $TRIGGER: (tabId, nodeId) => `triggerNode:${tabId}:${nodeId}`, + $TRIGGER: (tabId, nodeId) => `triggerNode:${tabId}:${nodeId ?? 'default'}`, $PLAYTEST_INPUT: tabId => `playtestInput:${tabId}`, $PLAYTEST_PRINT: tabId => `playtestPrint:${tabId}`, $DEBUG_PRINT: tabId => `debugPrint:${tabId}`, @@ -34,7 +34,8 @@ export const events = { $CLOSE_EDITOR: tabId => `closeEditor:${tabId}`, $NODE_SET: (tabId, nodeId) => `nodeSet:${tabId}:${nodeId}`, $SAVE_SPELL: tabId => `saveSpell:${tabId}`, - $SAVE_SPELL_DIFF: tabId => `saveSpell:${tabId}`, + $SAVE_SPELL_DIFF: tabId => `saveSpellDiff:${tabId}`, + $CREATE_SETTINGS_WINDOW: tabId => `createSettingsWindow:${tabId}`, $CREATE_STATE_MANAGER: tabId => `createStateManage:${tabId}`, $CREATE_PLAYTEST: tabId => `createPlaytest:${tabId}`, $CREATE_INSPECTOR: tabId => `createInspector:${tabId}`, diff --git a/client/src/contexts/SharedbProvider.tsx b/packages/client/src/contexts/SharedbProvider.tsx similarity index 100% rename from client/src/contexts/SharedbProvider.tsx rename to packages/client/src/contexts/SharedbProvider.tsx diff --git a/client/src/contexts/ToastProvider.jsx b/packages/client/src/contexts/ToastProvider.jsx similarity index 100% rename from client/src/contexts/ToastProvider.jsx rename to packages/client/src/contexts/ToastProvider.jsx diff --git a/client/src/contexts/WebSocketProvider.tsx b/packages/client/src/contexts/WebSocketProvider.tsx similarity index 100% rename from client/src/contexts/WebSocketProvider.tsx rename to packages/client/src/contexts/WebSocketProvider.tsx diff --git a/client/src/data/chains/default.ts b/packages/client/src/data/chains/default.ts similarity index 100% rename from client/src/data/chains/default.ts rename to packages/client/src/data/chains/default.ts diff --git a/client/src/data/layouts/defaultLayout.json b/packages/client/src/data/layouts/defaultLayout.json similarity index 100% rename from client/src/data/layouts/defaultLayout.json rename to packages/client/src/data/layouts/defaultLayout.json diff --git a/client/src/design-globals/design-globals.css b/packages/client/src/design-globals/design-globals.css similarity index 100% rename from client/src/design-globals/design-globals.css rename to packages/client/src/design-globals/design-globals.css diff --git a/client/src/design-globals/design-globals.css.d.ts b/packages/client/src/design-globals/design-globals.css.d.ts similarity index 100% rename from client/src/design-globals/design-globals.css.d.ts rename to packages/client/src/design-globals/design-globals.css.d.ts diff --git a/client/src/global.d.ts b/packages/client/src/global.d.ts similarity index 100% rename from client/src/global.d.ts rename to packages/client/src/global.d.ts diff --git a/client/src/grid.png b/packages/client/src/grid.png similarity index 100% rename from client/src/grid.png rename to packages/client/src/grid.png diff --git a/client/src/helpers/Expire.ts b/packages/client/src/helpers/Expire.ts similarity index 100% rename from client/src/helpers/Expire.ts rename to packages/client/src/helpers/Expire.ts diff --git a/client/src/hooks/useQuery.ts b/packages/client/src/hooks/useQuery.ts similarity index 100% rename from client/src/hooks/useQuery.ts rename to packages/client/src/hooks/useQuery.ts diff --git a/client/src/index.tsx b/packages/client/src/index.tsx similarity index 100% rename from client/src/index.tsx rename to packages/client/src/index.tsx diff --git a/client/src/react-app-env.d.ts b/packages/client/src/react-app-env.d.ts similarity index 100% rename from client/src/react-app-env.d.ts rename to packages/client/src/react-app-env.d.ts diff --git a/client/src/reportWebVitals.js b/packages/client/src/reportWebVitals.js similarity index 100% rename from client/src/reportWebVitals.js rename to packages/client/src/reportWebVitals.js diff --git a/client/src/screens/HomeScreen/HomeScreen.tsx b/packages/client/src/screens/HomeScreen/HomeScreen.tsx similarity index 100% rename from client/src/screens/HomeScreen/HomeScreen.tsx rename to packages/client/src/screens/HomeScreen/HomeScreen.tsx diff --git a/client/src/screens/HomeScreen/components/FileInput.jsx b/packages/client/src/screens/HomeScreen/components/FileInput.jsx similarity index 100% rename from client/src/screens/HomeScreen/components/FileInput.jsx rename to packages/client/src/screens/HomeScreen/components/FileInput.jsx diff --git a/client/src/screens/HomeScreen/components/ProjectRow.tsx b/packages/client/src/screens/HomeScreen/components/ProjectRow.tsx similarity index 100% rename from client/src/screens/HomeScreen/components/ProjectRow.tsx rename to packages/client/src/screens/HomeScreen/components/ProjectRow.tsx diff --git a/client/src/screens/HomeScreen/components/TemplatePanel.jsx b/packages/client/src/screens/HomeScreen/components/TemplatePanel.jsx similarity index 100% rename from client/src/screens/HomeScreen/components/TemplatePanel.jsx rename to packages/client/src/screens/HomeScreen/components/TemplatePanel.jsx diff --git a/client/src/screens/HomeScreen/empty.png b/packages/client/src/screens/HomeScreen/empty.png similarity index 100% rename from client/src/screens/HomeScreen/empty.png rename to packages/client/src/screens/HomeScreen/empty.png diff --git a/client/src/screens/HomeScreen/enki.png b/packages/client/src/screens/HomeScreen/enki.png similarity index 100% rename from client/src/screens/HomeScreen/enki.png rename to packages/client/src/screens/HomeScreen/enki.png diff --git a/client/src/screens/HomeScreen/homeScreen.module.css b/packages/client/src/screens/HomeScreen/homeScreen.module.css similarity index 100% rename from client/src/screens/HomeScreen/homeScreen.module.css rename to packages/client/src/screens/HomeScreen/homeScreen.module.css diff --git a/client/src/screens/HomeScreen/homeScreen.module.css.d.ts b/packages/client/src/screens/HomeScreen/homeScreen.module.css.d.ts similarity index 100% rename from client/src/screens/HomeScreen/homeScreen.module.css.d.ts rename to packages/client/src/screens/HomeScreen/homeScreen.module.css.d.ts diff --git a/client/src/screens/HomeScreen/lang.png b/packages/client/src/screens/HomeScreen/lang.png similarity index 100% rename from client/src/screens/HomeScreen/lang.png rename to packages/client/src/screens/HomeScreen/lang.png diff --git a/client/src/screens/HomeScreen/screens/AllProjects.jsx b/packages/client/src/screens/HomeScreen/screens/AllProjects.jsx similarity index 100% rename from client/src/screens/HomeScreen/screens/AllProjects.jsx rename to packages/client/src/screens/HomeScreen/screens/AllProjects.jsx diff --git a/client/src/screens/HomeScreen/screens/CreateNew.tsx b/packages/client/src/screens/HomeScreen/screens/CreateNew.tsx similarity index 94% rename from client/src/screens/HomeScreen/screens/CreateNew.tsx rename to packages/client/src/screens/HomeScreen/screens/CreateNew.tsx index d09683506..c87194714 100644 --- a/client/src/screens/HomeScreen/screens/CreateNew.tsx +++ b/packages/client/src/screens/HomeScreen/screens/CreateNew.tsx @@ -11,8 +11,8 @@ import { useNavigate } from 'react-router-dom' import { useNewSpellMutation } from '@/state/api/spells' import Panel from '../../../components/Panel/Panel' import emptyImg from '../empty.png' -import enkiImg from '../enki.png' -import langImg from '../lang.png' +// import enkiImg from '../enki.png' +// import langImg from '../lang.png' import css from '../homeScreen.module.css' import TemplatePanel from '../components/TemplatePanel' import defaultChain from '../../../data/chains/default' @@ -32,8 +32,8 @@ export type Template = { export const thothTemplates = [ { label: 'Starter', bg: emptyImg, chain: defaultChain }, - { label: 'Language example', bg: langImg, chain: defaultChain }, - { label: 'Enki example', bg: enkiImg, chain: defaultChain }, + // { label: 'Language example', bg: langImg, chain: defaultChain }, + // { label: 'Enki example', bg: enkiImg, chain: defaultChain }, ] const CreateNew = () => { diff --git a/client/src/screens/HomeScreen/screens/OpenProject.tsx b/packages/client/src/screens/HomeScreen/screens/OpenProject.tsx similarity index 97% rename from client/src/screens/HomeScreen/screens/OpenProject.tsx rename to packages/client/src/screens/HomeScreen/screens/OpenProject.tsx index 8ee7a4737..0859d16c0 100644 --- a/client/src/screens/HomeScreen/screens/OpenProject.tsx +++ b/packages/client/src/screens/HomeScreen/screens/OpenProject.tsx @@ -10,7 +10,8 @@ import { useSelector } from 'react-redux' import { selectAllTabs } from '@/state/tabs' import { RootState } from '@/state/store' -const getThothVersion = () => '0.0.1' +//TODO: this should be dynamic +const getThothVersion = () => '0.0.67' const OpenProject = ({ spells, diff --git a/client/src/screens/HomeScreen/version-banner-0.0.0beta.jpg b/packages/client/src/screens/HomeScreen/version-banner-0.0.0beta.jpg similarity index 100% rename from client/src/screens/HomeScreen/version-banner-0.0.0beta.jpg rename to packages/client/src/screens/HomeScreen/version-banner-0.0.0beta.jpg diff --git a/client/src/screens/Thoth/Thoth.tsx b/packages/client/src/screens/Thoth/Thoth.tsx similarity index 100% rename from client/src/screens/Thoth/Thoth.tsx rename to packages/client/src/screens/Thoth/Thoth.tsx diff --git a/client/src/screens/Thoth/components/EventHandler.tsx b/packages/client/src/screens/Thoth/components/EventHandler.tsx similarity index 81% rename from client/src/screens/Thoth/components/EventHandler.tsx rename to packages/client/src/screens/Thoth/components/EventHandler.tsx index db96c05fa..36af0a684 100644 --- a/client/src/screens/Thoth/components/EventHandler.tsx +++ b/packages/client/src/screens/Thoth/components/EventHandler.tsx @@ -18,6 +18,10 @@ import { diff } from '@/utils/json0' import { useSnackbar } from 'notistack' import { sharedb } from '@/config' import { useSharedb } from '@/contexts/SharedbProvider' +import { useFeathers } from '@/contexts/FeathersProvider' +import { feathers as feathersFlag } from '@/config' +import { RootState } from '@/state/store' +import { useSelector } from 'react-redux' // Config for unique name generator const customConfig = { @@ -35,10 +39,13 @@ const EventHandler = ({ pubSub, tab }) => { const [saveSpellMutation] = useSaveSpellMutation() const [saveDiff] = useSaveDiffMutation() const { data: spell } = useGetSpellQuery(tab.spellId) + const preferences = useSelector((state: RootState) => state.preferences) // Spell ref because callbacks cant hold values from state without them const spellRef = useRef(null) + const FeathersContext = useFeathers() + const client = FeathersContext?.client useEffect(() => { if (!spell) return spellRef.current = spell @@ -55,6 +62,7 @@ const EventHandler = ({ pubSub, tab }) => { $SAVE_SPELL, $SAVE_SPELL_DIFF, $CREATE_STATE_MANAGER, + $CREATE_SETTINGS_WINDOW, $CREATE_PLAYTEST, $CREATE_INSPECTOR, $CREATE_CONSOLE, @@ -69,7 +77,18 @@ const EventHandler = ({ pubSub, tab }) => { const currentSpell = spellRef.current const chain = serialize() as ChainData - await saveSpellMutation({ ...currentSpell, chain }) + const response = await saveSpellMutation({ ...currentSpell, chain }) + + if ('error' in response) { + enqueueSnackbar('Error saving spell', { + variant: 'error', + }) + return + } + + enqueueSnackbar('Spell saved', { + variant: 'success', + }) } const sharedbDiff = async (event, update) => { @@ -109,16 +128,34 @@ const EventHandler = ({ pubSub, tab }) => { diff: jsonDiff, }) - if ('error' in response) { - enqueueSnackbar('Error saving spell', { - variant: 'error', + if (preferences.autoSave) { + if ('error' in response) { + enqueueSnackbar('Error saving spell', { + variant: 'error', + }) + return + } + + enqueueSnackbar('Spell saved', { + variant: 'success', }) - return } - enqueueSnackbar('Spell saved', { - variant: 'success', - }) + if (feathersFlag) { + try { + await client.service('spell-runner').update(currentSpell.name, { + diff: jsonDiff, + }) + enqueueSnackbar('Spell saved', { + variant: 'success', + }) + } catch { + enqueueSnackbar('Error saving spell', { + variant: 'error', + }) + return + } + } } const createStateManager = () => { @@ -141,6 +178,10 @@ const EventHandler = ({ pubSub, tab }) => { createOrFocus(windowTypes.CONSOLE, 'Console') } + const createSettingsWindow = () => { + createOrFocus(windowTypes.SETTINGS, 'Settings') + } + const onSerialize = () => { // eslint-disable-next-line no-console console.log(serialize()) @@ -201,6 +242,7 @@ const EventHandler = ({ pubSub, tab }) => { const handlerMap = { [$SAVE_SPELL(tab.id)]: saveSpell, [$CREATE_STATE_MANAGER(tab.id)]: createStateManager, + [$CREATE_SETTINGS_WINDOW(tab.id)]: createSettingsWindow, [$CREATE_PLAYTEST(tab.id)]: createPlaytest, [$CREATE_INSPECTOR(tab.id)]: createInspector, [$CREATE_TEXT_EDITOR(tab.id)]: createTextEditor, @@ -216,7 +258,7 @@ const EventHandler = ({ pubSub, tab }) => { } useEffect(() => { - if (!tab && !spell) return + if (!tab && !spell && !client) return const subscriptions = Object.entries(handlerMap).map(([event, handler]) => { return subscribe(event, handler) @@ -228,7 +270,7 @@ const EventHandler = ({ pubSub, tab }) => { unsubscribe() }) } - }, [tab]) + }, [tab, client]) return null } diff --git a/client/src/screens/Thoth/thoth.module.css b/packages/client/src/screens/Thoth/thoth.module.css similarity index 100% rename from client/src/screens/Thoth/thoth.module.css rename to packages/client/src/screens/Thoth/thoth.module.css diff --git a/client/src/screens/Thoth/thoth.module.css.d.ts b/packages/client/src/screens/Thoth/thoth.module.css.d.ts similarity index 100% rename from client/src/screens/Thoth/thoth.module.css.d.ts rename to packages/client/src/screens/Thoth/thoth.module.css.d.ts diff --git a/client/src/services/game-api/enki.ts b/packages/client/src/services/game-api/enki.ts similarity index 100% rename from client/src/services/game-api/enki.ts rename to packages/client/src/services/game-api/enki.ts diff --git a/client/src/services/game-api/text.ts b/packages/client/src/services/game-api/text.ts similarity index 100% rename from client/src/services/game-api/text.ts rename to packages/client/src/services/game-api/text.ts diff --git a/client/src/state/api/api.ts b/packages/client/src/state/api/api.ts similarity index 100% rename from client/src/state/api/api.ts rename to packages/client/src/state/api/api.ts diff --git a/client/src/state/api/spells.ts b/packages/client/src/state/api/spells.ts similarity index 100% rename from client/src/state/api/spells.ts rename to packages/client/src/state/api/spells.ts diff --git a/client/src/state/api/visualGenerationsApi.ts b/packages/client/src/state/api/visualGenerationsApi.ts similarity index 100% rename from client/src/state/api/visualGenerationsApi.ts rename to packages/client/src/state/api/visualGenerationsApi.ts diff --git a/client/src/state/hooks.ts b/packages/client/src/state/hooks.ts similarity index 100% rename from client/src/state/hooks.ts rename to packages/client/src/state/hooks.ts diff --git a/packages/client/src/state/preferences.ts b/packages/client/src/state/preferences.ts new file mode 100644 index 000000000..dfddea268 --- /dev/null +++ b/packages/client/src/state/preferences.ts @@ -0,0 +1,30 @@ +import { createSlice } from '@reduxjs/toolkit' + +export interface Preference { + autoSave: boolean + doNotShowUnlockWarning: boolean +} + +export const preferenceSlice = createSlice({ + name: 'preferences', + initialState: { + autoSave: true, + doNotShowUnlockWarning: false, + }, + reducers: { + toggleAutoSave: state => { + const newState = state.autoSave === true ? false : true + state.autoSave = newState + }, + toggleDoNotShowUnlockWarning: state => { + const newState = state.doNotShowUnlockWarning === true ? false : true + state.doNotShowUnlockWarning = newState + }, + }, +}) + +// actions +export const { toggleAutoSave, toggleDoNotShowUnlockWarning } = + preferenceSlice.actions + +export default preferenceSlice.reducer diff --git a/client/src/state/reducers.ts b/packages/client/src/state/reducers.ts similarity index 73% rename from client/src/state/reducers.ts rename to packages/client/src/state/reducers.ts index 96948d7c8..d2ee62748 100644 --- a/client/src/state/reducers.ts +++ b/packages/client/src/state/reducers.ts @@ -2,8 +2,10 @@ import { combineReducers } from '@reduxjs/toolkit' import { spellApi } from './api/spells' import tabReducer from './tabs' +import preferencesReducer from './preferences' export default combineReducers({ tabs: tabReducer, + preferences: preferencesReducer, [spellApi.reducerPath]: spellApi.reducer, }) diff --git a/client/src/state/store.ts b/packages/client/src/state/store.ts similarity index 100% rename from client/src/state/store.ts rename to packages/client/src/state/store.ts diff --git a/client/src/state/tabs.ts b/packages/client/src/state/tabs.ts similarity index 100% rename from client/src/state/tabs.ts rename to packages/client/src/state/tabs.ts diff --git a/client/src/types.ts b/packages/client/src/types.ts similarity index 100% rename from client/src/types.ts rename to packages/client/src/types.ts diff --git a/client/src/utils/AsyncStorage.ts b/packages/client/src/utils/AsyncStorage.ts similarity index 100% rename from client/src/utils/AsyncStorage.ts rename to packages/client/src/utils/AsyncStorage.ts diff --git a/client/src/utils/debounce.js b/packages/client/src/utils/debounce.js similarity index 100% rename from client/src/utils/debounce.js rename to packages/client/src/utils/debounce.js diff --git a/client/src/utils/enkiHelpers.js b/packages/client/src/utils/enkiHelpers.js similarity index 100% rename from client/src/utils/enkiHelpers.js rename to packages/client/src/utils/enkiHelpers.js diff --git a/client/src/utils/huggingfaceHelper.js b/packages/client/src/utils/huggingfaceHelper.js similarity index 100% rename from client/src/utils/huggingfaceHelper.js rename to packages/client/src/utils/huggingfaceHelper.js diff --git a/client/src/utils/json0.ts b/packages/client/src/utils/json0.ts similarity index 100% rename from client/src/utils/json0.ts rename to packages/client/src/utils/json0.ts diff --git a/client/src/utils/uuid.ts b/packages/client/src/utils/uuid.ts similarity index 100% rename from client/src/utils/uuid.ts rename to packages/client/src/utils/uuid.ts diff --git a/client/src/wdyr.ts b/packages/client/src/wdyr.ts similarity index 100% rename from client/src/wdyr.ts rename to packages/client/src/wdyr.ts diff --git a/client/src/workspaces/contexts/EditorProvider.tsx b/packages/client/src/workspaces/contexts/EditorProvider.tsx similarity index 94% rename from client/src/workspaces/contexts/EditorProvider.tsx rename to packages/client/src/workspaces/contexts/EditorProvider.tsx index 1273e6435..3b1c9f0c1 100644 --- a/client/src/workspaces/contexts/EditorProvider.tsx +++ b/packages/client/src/workspaces/contexts/EditorProvider.tsx @@ -3,8 +3,8 @@ import { ChainData, EditorContext, Spell, - ThothEditor, } from '@latitudegames/thoth-core/dist/types' +import { ThothEditor } from '@latitudegames/thoth-core/dist/src/editor' import React, { useRef, useContext, @@ -20,6 +20,8 @@ import { MyNode } from '../../components/Node/Node' import gridimg from '@/grid.png' import { usePubSub } from '../../contexts/PubSubProvider' import { useThothInterface } from './ThothInterfaceProvider' +import { useFeathers } from '@/contexts/FeathersProvider' +import { feathers } from '@/config' export type ThothTab = { layoutJson: string @@ -60,6 +62,8 @@ export const useEditor = () => useContext(Context) const EditorProvider = ({ children }) => { const [editor, setEditorState] = useState(null) const editorRef = useRef(null) + const FeathersContext = useFeathers() + const client = FeathersContext?.client const pubSub = usePubSub() const setEditor = editor => { @@ -82,6 +86,8 @@ const EditorProvider = ({ children }) => { tab, // MyNode is a custom default style for nodes node: MyNode, + client, + feathers, }) // set editor to the map diff --git a/client/src/workspaces/contexts/InspectorProvider.tsx b/packages/client/src/workspaces/contexts/InspectorProvider.tsx similarity index 100% rename from client/src/workspaces/contexts/InspectorProvider.tsx rename to packages/client/src/workspaces/contexts/InspectorProvider.tsx diff --git a/client/src/workspaces/contexts/LayoutProvider.tsx b/packages/client/src/workspaces/contexts/LayoutProvider.tsx similarity index 99% rename from client/src/workspaces/contexts/LayoutProvider.tsx rename to packages/client/src/workspaces/contexts/LayoutProvider.tsx index 037f6a752..cd0c46180 100644 --- a/client/src/workspaces/contexts/LayoutProvider.tsx +++ b/packages/client/src/workspaces/contexts/LayoutProvider.tsx @@ -19,6 +19,7 @@ const windowTypes: WindowTypes = { EDITOR: 'editor', PLAYTEST: 'playtest', CONSOLE: 'debugConsole', + SETTINGS: 'settings', } type WindowType = @@ -28,6 +29,7 @@ type WindowType = | 'editor' | 'playtest' | 'debugConsole' + | 'settings' type WindowTypes = Record diff --git a/client/src/workspaces/contexts/ThothInterfaceProvider.tsx b/packages/client/src/workspaces/contexts/ThothInterfaceProvider.tsx similarity index 92% rename from client/src/workspaces/contexts/ThothInterfaceProvider.tsx rename to packages/client/src/workspaces/contexts/ThothInterfaceProvider.tsx index ed6a5de58..c0ed8a702 100644 --- a/client/src/workspaces/contexts/ThothInterfaceProvider.tsx +++ b/packages/client/src/workspaces/contexts/ThothInterfaceProvider.tsx @@ -12,11 +12,6 @@ import { usePubSub } from '../../contexts/PubSubProvider' import { useFetchFromImageCacheMutation } from '@/state/api/visualGenerationsApi' import { useGetSpellQuery, useRunSpellMutation } from '@/state/api/spells' -/* -Some notes here. The new rete provider, not to be confused with the old rete provider renamed to the editor provider, is designed to serve as the single source of truth for interfacing with the rete internal system. This unified interface will also allow us to replicate the same API in the server, where rete expects certain functions to exist but doesn't care what is behind these functions so long as they work. -Not all functions will be needed on the server, and functions which are not will be labeled as such. -*/ - const Context = createContext(undefined!) export const useThothInterface = () => useContext(Context) @@ -189,7 +184,6 @@ const ThothInterfaceProvider = ({ children, tab }) => { const update = { gameState: newState, } - publish($SAVE_SPELL_DIFF(tab.id), update) } @@ -214,7 +208,6 @@ const ThothInterfaceProvider = ({ children, tab }) => { ...spell, ...update, } - publish($SAVE_SPELL_DIFF(tab.id), update) } diff --git a/client/src/workspaces/contexts/WorkspaceProvider.jsx b/packages/client/src/workspaces/contexts/WorkspaceProvider.jsx similarity index 100% rename from client/src/workspaces/contexts/WorkspaceProvider.jsx rename to packages/client/src/workspaces/contexts/WorkspaceProvider.jsx diff --git a/client/src/workspaces/index.tsx b/packages/client/src/workspaces/index.tsx similarity index 100% rename from client/src/workspaces/index.tsx rename to packages/client/src/workspaces/index.tsx diff --git a/client/src/workspaces/spells/DataControls/CodeControl.jsx b/packages/client/src/workspaces/spells/DataControls/CodeControl.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/CodeControl.jsx rename to packages/client/src/workspaces/spells/DataControls/CodeControl.jsx diff --git a/client/src/workspaces/spells/DataControls/DataControls.jsx b/packages/client/src/workspaces/spells/DataControls/DataControls.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/DataControls.jsx rename to packages/client/src/workspaces/spells/DataControls/DataControls.jsx diff --git a/client/src/workspaces/spells/DataControls/DropdownSelect.tsx b/packages/client/src/workspaces/spells/DataControls/DropdownSelect.tsx similarity index 100% rename from client/src/workspaces/spells/DataControls/DropdownSelect.tsx rename to packages/client/src/workspaces/spells/DataControls/DropdownSelect.tsx diff --git a/client/src/workspaces/spells/DataControls/EnkiSelect.jsx b/packages/client/src/workspaces/spells/DataControls/EnkiSelect.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/EnkiSelect.jsx rename to packages/client/src/workspaces/spells/DataControls/EnkiSelect.jsx diff --git a/client/src/workspaces/spells/DataControls/Info.jsx b/packages/client/src/workspaces/spells/DataControls/Info.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/Info.jsx rename to packages/client/src/workspaces/spells/DataControls/Info.jsx diff --git a/client/src/workspaces/spells/DataControls/Input.jsx b/packages/client/src/workspaces/spells/DataControls/Input.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/Input.jsx rename to packages/client/src/workspaces/spells/DataControls/Input.jsx diff --git a/client/src/workspaces/spells/DataControls/InputGenerator.jsx b/packages/client/src/workspaces/spells/DataControls/InputGenerator.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/InputGenerator.jsx rename to packages/client/src/workspaces/spells/DataControls/InputGenerator.jsx diff --git a/client/src/workspaces/spells/DataControls/LongTextControl.jsx b/packages/client/src/workspaces/spells/DataControls/LongTextControl.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/LongTextControl.jsx rename to packages/client/src/workspaces/spells/DataControls/LongTextControl.jsx diff --git a/client/src/workspaces/spells/DataControls/ModelSelect.jsx b/packages/client/src/workspaces/spells/DataControls/ModelSelect.jsx similarity index 72% rename from client/src/workspaces/spells/DataControls/ModelSelect.jsx rename to packages/client/src/workspaces/spells/DataControls/ModelSelect.jsx index 2a5c18415..106c593f1 100644 --- a/client/src/workspaces/spells/DataControls/ModelSelect.jsx +++ b/packages/client/src/workspaces/spells/DataControls/ModelSelect.jsx @@ -9,11 +9,18 @@ const ModelSelect = ({ control, updateData, initialValue }) => { const { defaultValue } = data const [values, setValues] = useState([initialValue]) + const [descriptionList, setDescriptionList] = useState([]) + const [description, setDescription] = useState('') useEffect(async () => { const models = await getModels() console.log({ models }) - if (models) setValues(models.map(x => x.alias)) + if (models) { + const descList = {} + models.map(x => (descList[x.alias] = x.description)) + setDescriptionList(descList) + setValues(models.map(x => x.alias)) + } }, []) const options = values.map(value => ({ @@ -26,6 +33,7 @@ const ModelSelect = ({ control, updateData, initialValue }) => { const defaultVal = { value, label: value } const onChange = async ({ value }) => { + setDescription(descriptionList[value]) update(value) } @@ -33,6 +41,8 @@ const ModelSelect = ({ control, updateData, initialValue }) => { updateData({ [dataKey]: update }) } + console.log({ description }) + if (!defaultVal) return return (
@@ -43,6 +53,7 @@ const ModelSelect = ({ control, updateData, initialValue }) => { placeholder="select value" creatable={false} /> +

{description}

) } diff --git a/client/src/workspaces/spells/DataControls/OutputGenerator.jsx b/packages/client/src/workspaces/spells/DataControls/OutputGenerator.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/OutputGenerator.jsx rename to packages/client/src/workspaces/spells/DataControls/OutputGenerator.jsx diff --git a/client/src/workspaces/spells/DataControls/PlaytestControl.tsx b/packages/client/src/workspaces/spells/DataControls/PlaytestControl.tsx similarity index 100% rename from client/src/workspaces/spells/DataControls/PlaytestControl.tsx rename to packages/client/src/workspaces/spells/DataControls/PlaytestControl.tsx diff --git a/client/src/workspaces/spells/DataControls/SocketGenerator.jsx b/packages/client/src/workspaces/spells/DataControls/SocketGenerator.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/SocketGenerator.jsx rename to packages/client/src/workspaces/spells/DataControls/SocketGenerator.jsx diff --git a/client/src/workspaces/spells/DataControls/SpellSelect.tsx b/packages/client/src/workspaces/spells/DataControls/SpellSelect.tsx similarity index 100% rename from client/src/workspaces/spells/DataControls/SpellSelect.tsx rename to packages/client/src/workspaces/spells/DataControls/SpellSelect.tsx diff --git a/client/src/workspaces/spells/DataControls/SwitchControl.tsx b/packages/client/src/workspaces/spells/DataControls/SwitchControl.tsx similarity index 100% rename from client/src/workspaces/spells/DataControls/SwitchControl.tsx rename to packages/client/src/workspaces/spells/DataControls/SwitchControl.tsx diff --git a/client/src/workspaces/spells/DataControls/datacontrols.module.css b/packages/client/src/workspaces/spells/DataControls/datacontrols.module.css similarity index 100% rename from client/src/workspaces/spells/DataControls/datacontrols.module.css rename to packages/client/src/workspaces/spells/DataControls/datacontrols.module.css diff --git a/client/src/workspaces/spells/DataControls/datacontrols.module.css.d.ts b/packages/client/src/workspaces/spells/DataControls/datacontrols.module.css.d.ts similarity index 100% rename from client/src/workspaces/spells/DataControls/datacontrols.module.css.d.ts rename to packages/client/src/workspaces/spells/DataControls/datacontrols.module.css.d.ts diff --git a/client/src/workspaces/spells/DataControls/index.jsx b/packages/client/src/workspaces/spells/DataControls/index.jsx similarity index 100% rename from client/src/workspaces/spells/DataControls/index.jsx rename to packages/client/src/workspaces/spells/DataControls/index.jsx diff --git a/client/src/workspaces/spells/components/WindowMessage.jsx b/packages/client/src/workspaces/spells/components/WindowMessage.jsx similarity index 100% rename from client/src/workspaces/spells/components/WindowMessage.jsx rename to packages/client/src/workspaces/spells/components/WindowMessage.jsx diff --git a/client/src/workspaces/spells/index.tsx b/packages/client/src/workspaces/spells/index.tsx similarity index 78% rename from client/src/workspaces/spells/index.tsx rename to packages/client/src/workspaces/spells/index.tsx index 2abf78ae6..17038da24 100644 --- a/client/src/workspaces/spells/index.tsx +++ b/packages/client/src/workspaces/spells/index.tsx @@ -9,6 +9,7 @@ import EventHandler from '@/screens/Thoth/components/EventHandler' import Inspector from './windows/InspectorWindow' import Playtest from './windows/PlaytestWindow' import StateManager from '@/workspaces/spells/windows/StateManagerWindow' +import SettingsWindow from './windows/SettingsWindow' import TextEditor from './windows/TextEditorWindow' import DebugConsole from './windows/DebugConsole' import { Spell } from '@latitudegames/thoth-core/types' @@ -16,6 +17,10 @@ import { usePubSub } from '@/contexts/PubSubProvider' import { useSharedb } from '@/contexts/SharedbProvider' import { sharedb } from '@/config' import { ThothComponent } from '@latitudegames/thoth-core/src/thoth-component' +import { RootState } from '@/state/store' +import { useSelector } from 'react-redux' +import { useFeathers } from '@/contexts/FeathersProvider' +import { feathers as feathersFlag } from '@/config' const Workspace = ({ tab, tabs, pubSub }) => { const spellRef = useRef() @@ -23,21 +28,33 @@ const Workspace = ({ tab, tabs, pubSub }) => { const { getSpellDoc } = useSharedb() const [loadSpell, { data: spellData }] = useLazyGetSpellQuery() const { serialize, editor } = useEditor() + const FeathersContext = useFeathers() + const client = FeathersContext?.client + const preferences = useSelector((state: RootState) => state.preferences) const [docLoaded, setDocLoaded] = useState(false) // Set up autosave for the workspaces useEffect(() => { if (!editor?.on) return - const unsubscribe = editor.on( // Comment events: commentremoved commentcreated addcomment removecomment editcomment connectionpath - 'save nodecreated noderemoved connectioncreated connectionremoved nodetranslated', + 'nodecreated noderemoved connectioncreated connectionremoved nodetranslated', debounce(async data => { if (tab.type === 'spell' && spellRef.current) { + if (!preferences.autoSave) return publish(events.$SAVE_SPELL_DIFF(tab.id), { chain: serialize() }) } - }, 1000) + }, 2000) + ) + + return unsubscribe as () => void + }, [editor, preferences.autoSave]) + + useEffect(() => { + if (!editor?.on) return + const unsubscribe = editor.on('save', () => + publish(events.$SAVE_SPELL_DIFF(tab.id), { chain: serialize() }) ) return unsubscribe as () => void @@ -91,6 +108,14 @@ const Workspace = ({ tab, tabs, pubSub }) => { loadSpell(tab.spellId) }, [tab]) + useEffect(() => { + if (!client || !feathersFlag) return + ;(async () => { + if (!client || !tab || !tab.spellId) return + await client.service('spell-runner').get(tab.spellId) + })() + }, [client, feathersFlag]) + const factory = tab => { return node => { const props = { @@ -111,6 +136,8 @@ const Workspace = ({ tab, tabs, pubSub }) => { return case 'debugConsole': return + case 'settings': + return default: return

} diff --git a/client/src/workspaces/spells/windows/DebugConsole/index.tsx b/packages/client/src/workspaces/spells/windows/DebugConsole/index.tsx similarity index 94% rename from client/src/workspaces/spells/windows/DebugConsole/index.tsx rename to packages/client/src/workspaces/spells/windows/DebugConsole/index.tsx index c14c06bdf..d0e598133 100644 --- a/client/src/workspaces/spells/windows/DebugConsole/index.tsx +++ b/packages/client/src/workspaces/spells/windows/DebugConsole/index.tsx @@ -33,8 +33,8 @@ const DebugConsole = ({ tab }) => { } const formatErrorMessage = message => - `> Node ${message.nodeId}: Error in ${message.from} component ${ - message.name ?? 'unnamed' + `> Node ${message.nodeId}: Error in ${message.from} component${ + message.name ? ' ' + message.name : '' }.` const formatLogMessage = message => @@ -119,16 +119,14 @@ const DebugConsole = ({ tab }) => { diff --git a/client/src/workspaces/spells/windows/EditorWindow/Deployment.tsx b/packages/client/src/workspaces/spells/windows/EditorWindow/Deployment.tsx similarity index 100% rename from client/src/workspaces/spells/windows/EditorWindow/Deployment.tsx rename to packages/client/src/workspaces/spells/windows/EditorWindow/Deployment.tsx diff --git a/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css b/packages/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css similarity index 100% rename from client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css rename to packages/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css diff --git a/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css.d.ts b/packages/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css.d.ts similarity index 100% rename from client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css.d.ts rename to packages/client/src/workspaces/spells/windows/EditorWindow/editorwindow.module.css.d.ts diff --git a/client/src/workspaces/spells/windows/EditorWindow/index.jsx b/packages/client/src/workspaces/spells/windows/EditorWindow/index.jsx similarity index 97% rename from client/src/workspaces/spells/windows/EditorWindow/index.jsx rename to packages/client/src/workspaces/spells/windows/EditorWindow/index.jsx index 4b45406d7..0929915f2 100644 --- a/client/src/workspaces/spells/windows/EditorWindow/index.jsx +++ b/packages/client/src/workspaces/spells/windows/EditorWindow/index.jsx @@ -40,6 +40,9 @@ const EditorWindow = ({ tab }) => { //Categorize node list into respective categories if (nodeList) Object.keys(nodeList).map(item => { + if (nodeList[item].deprecated) { + return + } if (doesCategoryExist(arr, nodeList[item].category) !== false) { return arr[ doesCategoryExist(arr, nodeList[item].category) diff --git a/client/src/workspaces/spells/windows/InspectorWindow.tsx b/packages/client/src/workspaces/spells/windows/InspectorWindow.tsx similarity index 85% rename from client/src/workspaces/spells/windows/InspectorWindow.tsx rename to packages/client/src/workspaces/spells/windows/InspectorWindow.tsx index 8571cca1b..c5c3893dc 100644 --- a/client/src/workspaces/spells/windows/InspectorWindow.tsx +++ b/packages/client/src/workspaces/spells/windows/InspectorWindow.tsx @@ -9,11 +9,18 @@ import { useInspector } from '@/workspaces/contexts/InspectorProvider' import { InspectorData } from '@latitudegames/thoth-core/types' import SwitchComponent from '@/components/Switch/Switch' import css from '../../../components/Icon/icon.module.css' +import { RootState } from '@/state/store' +import { debounce } from '@/utils/debounce' + +import { useSelector, useDispatch } from 'react-redux' +import { toggleDoNotShowUnlockWarning } from '@/state/preferences' const Inspector = props => { const { inspectorData, saveInspector } = useInspector() const [width, setWidth] = useState() const { openModal } = useModal() + const preferences = useSelector((state: RootState) => state.preferences) + const dispatch = useDispatch() useEffect(() => { if (props?.node?._rect?.width) { @@ -55,15 +62,26 @@ const Inspector = props => { }, } - saveInspector(newData) + debounce(() => { + if (!preferences.autoSave) return + saveInspector(newData) + }, 2000) } const onLock = () => { - if (inspectorData?.data.nodeLocked && inspectorData?.category === 'I/O') { + if ( + !preferences.doNotShowUnlockWarning && + inspectorData?.data.nodeLocked && + inspectorData?.category === 'I/O' + ) { openModal({ modal: 'infoModal', content: 'Editing this node could break connection with your app.', title: 'Warning', + checkbox: { + onClick: () => dispatch(toggleDoNotShowUnlockWarning()), + label: 'Do not show this again', + }, }) } diff --git a/client/src/workspaces/spells/windows/PlaytestWindow.jsx b/packages/client/src/workspaces/spells/windows/PlaytestWindow.tsx similarity index 77% rename from client/src/workspaces/spells/windows/PlaytestWindow.jsx rename to packages/client/src/workspaces/spells/windows/PlaytestWindow.tsx index a0ed73ae1..a0ef39843 100644 --- a/client/src/workspaces/spells/windows/PlaytestWindow.jsx +++ b/packages/client/src/workspaces/spells/windows/PlaytestWindow.tsx @@ -5,16 +5,19 @@ import { useHotkeys } from 'react-hotkeys-hook' import { usePubSub } from '../../../contexts/PubSubProvider' import Window from '../../../components/Window/Window' import css from '../../../screens/Thoth/thoth.module.css' +import { useFeathers } from '@/contexts/FeathersProvider' +import { feathers as feathersFlag } from '@/config' const Input = props => { - const ref = useRef() + const ref = useRef() as React.MutableRefObject useHotkeys( 'return', () => { if (ref.current !== document.activeElement) return props.onSend() }, - { enableOnTags: 'INPUT' }, + // Not sure why it says INPUT is not a valid AvailableTag when it clearly is + { enableOnTags: 'INPUT' as any }, [props, ref] ) @@ -38,14 +41,15 @@ const Playtest = ({ tab }) => { const [value, setValue] = useState('') const { publish, subscribe, events } = usePubSub() - + const FeathersContext = useFeathers() + const client = FeathersContext?.client const { $PLAYTEST_INPUT, $PLAYTEST_PRINT } = events const printToConsole = useCallback( (_, _text) => { let text = typeof _text === 'object' ? JSON.stringify(_text) : _text const newHistory = [...history, text] - setHistory(newHistory) + setHistory(newHistory as []) }, [history] ) @@ -54,14 +58,23 @@ const Playtest = ({ tab }) => { const unsubscribe = subscribe($PLAYTEST_PRINT(tab.id), printToConsole) // return a clean up function - return unsubscribe + return unsubscribe as () => void }, [subscribe, printToConsole, $PLAYTEST_PRINT]) const printItem = (text, key) =>
  • {text}
  • const onSend = () => { const newHistory = [...history, `You: ${value}`] - setHistory(newHistory) + setHistory(newHistory as []) + if (feathersFlag) { + client.service('spell-runner').create({ + spellId: tab.spellId, + inputs: { + Input: value, + }, + }) + } + publish($PLAYTEST_INPUT(tab.id), value) setValue('') } diff --git a/packages/client/src/workspaces/spells/windows/SettingsWindow/index.tsx b/packages/client/src/workspaces/spells/windows/SettingsWindow/index.tsx new file mode 100644 index 000000000..315890aeb --- /dev/null +++ b/packages/client/src/workspaces/spells/windows/SettingsWindow/index.tsx @@ -0,0 +1,55 @@ +import { RootState } from '@/state/store' +import { useSelector, useDispatch } from 'react-redux' +import Window from '@/components/Window/Window' +import { + toggleDoNotShowUnlockWarning, + toggleAutoSave, +} from '@/state/preferences' +import SwitchComponent from '@/components/Switch/Switch' + +const SettingsWindow = ({ tab }) => { + const preferences = useSelector((state: RootState) => state.preferences) + + const dispatch = useDispatch() + + const settingControls = { + doNotShowUnlock: () => dispatch(toggleDoNotShowUnlockWarning()), + autoSave: () => dispatch(toggleAutoSave()), + } + + const toolbar = ( +
    Glabal Settings
    + ) + + type PreferenceType = { + onClick: () => {} + label: string + checked: boolean + } + + const Setting = (preference: PreferenceType) => ( + + ) + + if (!preferences) return <> + return ( + + + + + ) +} + +export default SettingsWindow diff --git a/client/src/workspaces/spells/windows/StateManagerWindow.tsx b/packages/client/src/workspaces/spells/windows/StateManagerWindow.tsx similarity index 93% rename from client/src/workspaces/spells/windows/StateManagerWindow.tsx rename to packages/client/src/workspaces/spells/windows/StateManagerWindow.tsx index 229f2f64c..c473b6e83 100644 --- a/client/src/workspaces/spells/windows/StateManagerWindow.tsx +++ b/packages/client/src/workspaces/spells/windows/StateManagerWindow.tsx @@ -7,9 +7,12 @@ import Window from '../../../components/Window/Window' import '../../../screens/Thoth/thoth.module.css' import WindowMessage from '../components/WindowMessage' import { usePubSub } from '@/contexts/PubSubProvider' +import { RootState } from '@/state/store' +import { useSelector } from 'react-redux' const StateManager = ({ tab, ...props }) => { const { publish, events } = usePubSub() + const preferences = useSelector((state: RootState) => state.preferences) const { data: spell } = useGetSpellQuery(tab.spellId, { skip: !tab.spellId, }) @@ -55,8 +58,9 @@ const StateManager = ({ tab, ...props }) => { if (!typing) return const delayDebounceFn = setTimeout(() => { - // Send Axios request here - onSave() + if (preferences.autoSave) { + onSave() + } setTyping(false) }, 5000) @@ -75,8 +79,8 @@ const StateManager = ({ tab, ...props }) => { } const onChange = code => { - setCode(code) setTyping(true) + setCode(code) } const onSave = async () => { diff --git a/client/src/workspaces/spells/windows/TextEditorWindow.tsx b/packages/client/src/workspaces/spells/windows/TextEditorWindow.tsx similarity index 85% rename from client/src/workspaces/spells/windows/TextEditorWindow.tsx rename to packages/client/src/workspaces/spells/windows/TextEditorWindow.tsx index 8538274f5..631d2595c 100644 --- a/client/src/workspaces/spells/windows/TextEditorWindow.tsx +++ b/packages/client/src/workspaces/spells/windows/TextEditorWindow.tsx @@ -1,5 +1,5 @@ import Editor from '@monaco-editor/react' -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef } from 'react' import Window from '@components/Window/Window' import WindowMessage from '../components/WindowMessage' @@ -9,14 +9,18 @@ import { TextEditorData, useInspector, } from '@/workspaces/contexts/InspectorProvider' +import { RootState } from '@/state/store' +import { useSelector } from 'react-redux' const TextEditor = props => { - const [code, setCode] = useState(undefined) + const [code, setCodeState] = useState(undefined) const [data, setData] = useState(null) // const [height, setHeight] = useState() const [editorOptions, setEditorOptions] = useState>() const [typing, setTyping] = useState(false) const [language, setLanguage] = useState(undefined) + const codeRef = useRef() + const preferences = useSelector((state: RootState) => state.preferences) const { textEditorData, saveTextEditor } = useInspector() @@ -63,11 +67,11 @@ const TextEditor = props => { // debounce for delayed save useEffect(() => { if (!typing) return - + if (!preferences.autoSave) return const delayDebounceFn = setTimeout(() => { save(code) setTyping(false) - }, 5000) + }, 2500) return () => clearTimeout(delayDebounceFn) }, [code]) @@ -82,7 +86,7 @@ const TextEditor = props => { } const onSave = () => { - save(code) + save(codeRef.current) } const updateCode = (rawCode: string) => { @@ -96,6 +100,11 @@ const TextEditor = props => { setTyping(true) } + const setCode = update => { + setCodeState(update) + codeRef.current = update + } + const toolbar = ( <>
    diff --git a/client/tsconfig.json b/packages/client/tsconfig.json similarity index 94% rename from client/tsconfig.json rename to packages/client/tsconfig.json index 6d2a12b17..a98a49e08 100644 --- a/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "module": "esnext", "moduleResolution": "node", diff --git a/client/webpack.common.js b/packages/client/webpack.common.js similarity index 98% rename from client/webpack.common.js rename to packages/client/webpack.common.js index 6e39464dc..b69564ed6 100644 --- a/client/webpack.common.js +++ b/packages/client/webpack.common.js @@ -27,7 +27,7 @@ module.exports = () => { return { entry: ['regenerator-runtime/runtime.js', './src/index.tsx'], output: { - path: path.resolve(__dirname, '../build'), + path: path.resolve(__dirname, './build'), filename: '[name].[contenthash].bundle.js', clean: true, }, diff --git a/client/webpack.dev.js b/packages/client/webpack.dev.js similarity index 100% rename from client/webpack.dev.js rename to packages/client/webpack.dev.js diff --git a/client/webpack.prod.js b/packages/client/webpack.prod.js similarity index 100% rename from client/webpack.prod.js rename to packages/client/webpack.prod.js diff --git a/packages/core/.babelrc b/packages/core/.babelrc new file mode 100644 index 000000000..74cf64400 --- /dev/null +++ b/packages/core/.babelrc @@ -0,0 +1,38 @@ +{ + "env": { + "production": { + "presets": [ + "@babel/env", + [ + "@babel/preset-react", + { + "runtime": "automatic" + } + ], + "@babel/preset-typescript" + ], + "plugins": ["@babel/plugin-proposal-class-properties"] + }, + "development": { + "presets": [ + "@babel/env", + [ + "@babel/preset-react", + { + "runtime": "automatic" + } + ], + "@babel/preset-typescript" + ], + "plugins": ["@babel/plugin-proposal-class-properties"] + }, + "test": { + "plugins": ["@babel/plugin-transform-runtime"], + "presets": [ + "@babel/preset-env", + "@babel/preset-typescript", + "@babel/preset-react" + ] + } + } +} diff --git a/core/.env.example b/packages/core/.env.example similarity index 100% rename from core/.env.example rename to packages/core/.env.example diff --git a/core/.eslintignore b/packages/core/.eslintignore similarity index 100% rename from core/.eslintignore rename to packages/core/.eslintignore diff --git a/core/.eslintrc.js b/packages/core/.eslintrc.js similarity index 100% rename from core/.eslintrc.js rename to packages/core/.eslintrc.js diff --git a/core/.gitignore b/packages/core/.gitignore similarity index 100% rename from core/.gitignore rename to packages/core/.gitignore diff --git a/core/.npmignore b/packages/core/.npmignore similarity index 100% rename from core/.npmignore rename to packages/core/.npmignore diff --git a/core/.npmrc b/packages/core/.npmrc similarity index 100% rename from core/.npmrc rename to packages/core/.npmrc diff --git a/core/@types/deepEqual.d.ts b/packages/core/@types/deepEqual.d.ts similarity index 100% rename from core/@types/deepEqual.d.ts rename to packages/core/@types/deepEqual.d.ts diff --git a/core/@types/rete-comment-plugin.d.ts b/packages/core/@types/rete-comment-plugin.d.ts similarity index 100% rename from core/@types/rete-comment-plugin.d.ts rename to packages/core/@types/rete-comment-plugin.d.ts diff --git a/core/@types/rete-connection-reroute-plugin.d.ts b/packages/core/@types/rete-connection-reroute-plugin.d.ts similarity index 100% rename from core/@types/rete-connection-reroute-plugin.d.ts rename to packages/core/@types/rete-connection-reroute-plugin.d.ts diff --git a/core/@types/rete-context-menu-plugin.d.ts b/packages/core/@types/rete-context-menu-plugin.d.ts similarity index 100% rename from core/@types/rete-context-menu-plugin.d.ts rename to packages/core/@types/rete-context-menu-plugin.d.ts diff --git a/core/@types/rete-react-render-plugin.d.ts b/packages/core/@types/rete-react-render-plugin.d.ts similarity index 100% rename from core/@types/rete-react-render-plugin.d.ts rename to packages/core/@types/rete-react-render-plugin.d.ts diff --git a/core/README.md b/packages/core/README.md similarity index 100% rename from core/README.md rename to packages/core/README.md diff --git a/packages/core/data/booleanGateSpell.thoth b/packages/core/data/booleanGateSpell.thoth new file mode 100644 index 000000000..ddb4f81b1 --- /dev/null +++ b/packages/core/data/booleanGateSpell.thoth @@ -0,0 +1 @@ +{"id":"9b970450-4a0f-43cd-8763-ce0920f9ce1e","name":"unfortunate olive","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"success":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":764,"input":"trigger","data":{"pins":[]}}]}},"position":[-1735.7923282597962,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because","success":false,"socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":756,"output":"result","data":{"pins":[]}},{"node":757,"output":"nope","data":{"pins":[]}}]},"trigger":{"connections":[{"node":756,"output":"trigger","data":{"pins":[]}},{"node":757,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-179.2551319405378,-378.55595753684764],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"yes","display":"yes","success":false,"socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"no","playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":764,"input":"input","data":{"pins":[]}}]}},"position":[-1756.7490443350143,-376.7788066492969],"name":"Universal Input"},"756":{"id":756,"data":{"stop":"\\n","temp":0.7,"error":false,"display":"Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because","fewshot":"Generate","success":false,"maxTokens":50,"dataControls":{"name":{"expanded":true},"stop":{"expanded":true},"temp":{"expanded":true},"model":{"expanded":true},"inputs":{"expanded":true},"fewshot":{"expanded":true},"maxTokens":{"expanded":true},"frequencyPenalty":{"expanded":true}}},"inputs":{"trigger":{"connections":[{"node":765,"output":"true","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"result":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]},"composed":{"connections":[]}},"position":[-582.8705727637084,-690.7753442242042],"name":"Generator"},"757":{"id":757,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {nope: 'nope'}\n}\n","display":"{\"nope\":\"nope\"}","outputs":[{"name":"nope","taskType":"output","socketKey":"nope","socketType":"anySocket","connectionType":"output"}],"success":false,"dataControls":{"code":{"expanded":true},"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true}}},"inputs":{"trigger":{"connections":[{"node":765,"output":"false","data":{"pins":[]}}]}},"outputs":{"nope":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]},"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]}},"position":[-559.1233977692019,-158.30703900660217],"name":"Code"},"764":{"id":764,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: inputs.input === 'yes'}\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"name":"is yes","inputs":[{"name":"input","taskType":"output","socketKey":"input","connectionType":"input","socketType":"anySocket"}],"outputs":[{"name":"output","taskType":"output","socketKey":"output","connectionType":"output","socketType":"anySocket"}],"display":"{\"output\":true}","success":false},"inputs":{"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]},"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":765,"input":"trigger","data":{"pins":[]}}]},"output":{"connections":[{"node":765,"input":"boolean","data":{"pins":[]}}]}},"position":[-1347.904741156958,-331.91528521654504],"name":"Code"},"765":{"id":765,"data":{"success":false},"inputs":{"boolean":{"connections":[{"node":764,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":764,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"true":{"connections":[{"node":756,"input":"trigger","data":{"pins":[]}}]},"false":{"connections":[{"node":757,"input":"trigger","data":{"pins":[]}}]}},"position":[-948.140606080078,-344.29304631970314],"name":"Boolean Gate"}}},"createdAt":"2022-06-01T22:46:39.699Z","updatedAt":"2022-06-02T01:44:07.070Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"introText":"This is a simple AI generator app. Type anything and let the AI continue "}} \ No newline at end of file diff --git a/packages/core/data/booleanGateSpell.ts b/packages/core/data/booleanGateSpell.ts new file mode 100644 index 000000000..47c78893b --- /dev/null +++ b/packages/core/data/booleanGateSpell.ts @@ -0,0 +1,252 @@ +import { Spell } from '@latitudegames/thoth-core/types' +export default { + id: '9b970450-4a0f-43cd-8763-ce0920f9ce1e', + name: 'unfortunate olive', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + success: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 764, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1735.7923282597962, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: + 'Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because', + success: false, + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [ + { node: 756, output: 'result', data: { pins: [] } }, + { node: 757, output: 'nope', data: { pins: [] } }, + ], + }, + trigger: { + connections: [ + { node: 756, output: 'trigger', data: { pins: [] } }, + { node: 757, output: 'trigger', data: { pins: [] } }, + ], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-179.2551319405378, -378.55595753684764], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'yes', + display: 'yes', + success: false, + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'no', + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 764, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1756.7490443350143, -376.7788066492969], + name: 'Universal Input', + }, + '756': { + id: 756, + data: { + stop: '\\n', + temp: 0.7, + error: false, + display: + 'Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because', + fewshot: 'Generate', + success: false, + maxTokens: 50, + dataControls: { + name: { expanded: true }, + stop: { expanded: true }, + temp: { expanded: true }, + model: { expanded: true }, + inputs: { expanded: true }, + fewshot: { expanded: true }, + maxTokens: { expanded: true }, + frequencyPenalty: { expanded: true }, + }, + }, + inputs: { + trigger: { + connections: [{ node: 765, output: 'true', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + result: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + composed: { connections: [] }, + }, + position: [-582.8705727637084, -690.7753442242042], + name: 'Generator', + }, + '757': { + id: 757, + data: { + code: "\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {nope: 'nope'}\n}\n", + display: '{"nope":"nope"}', + outputs: [ + { + name: 'nope', + taskType: 'output', + socketKey: 'nope', + socketType: 'anySocket', + connectionType: 'output', + }, + ], + success: false, + dataControls: { + code: { expanded: true }, + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + }, + }, + inputs: { + trigger: { + connections: [{ node: 765, output: 'false', data: { pins: [] } }], + }, + }, + outputs: { + nope: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-559.1233977692019, -158.30703900660217], + name: 'Code', + }, + '764': { + id: 764, + data: { + code: "\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: inputs.input === 'yes'}\n}\n", + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + name: 'is yes', + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + connectionType: 'input', + socketType: 'anySocket', + }, + ], + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: '{"output":true}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 765, input: 'trigger', data: { pins: [] } }], + }, + output: { + connections: [{ node: 765, input: 'boolean', data: { pins: [] } }], + }, + }, + position: [-1347.904741156958, -331.91528521654504], + name: 'Code', + }, + '765': { + id: 765, + data: { success: false }, + inputs: { + boolean: { + connections: [{ node: 764, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 764, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + true: { + connections: [{ node: 756, input: 'trigger', data: { pins: [] } }], + }, + false: { + connections: [{ node: 757, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-948.140606080078, -344.29304631970314], + name: 'Boolean Gate', + }, + }, + }, + createdAt: '2022-06-01T22:46:39.699Z', + updatedAt: '2022-06-02T01:44:07.070Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + }, +} as unknown as Spell diff --git a/packages/core/data/codeSpell.thoth b/packages/core/data/codeSpell.thoth new file mode 100644 index 000000000..6581ed5b6 --- /dev/null +++ b/packages/core/data/codeSpell.thoth @@ -0,0 +1 @@ +{"id":"3b7add2b-0f49-4c6b-8db9-18ecbb34602c","name":"accurate white","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":754,"input":"trigger","data":{"pins":[]}}]}},"position":[-1556.5668566017482,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"test modified","socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true,"success":false},"inputs":{"input":{"connections":[{"node":754,"output":"modifiedInput","data":{"pins":[]}}]},"trigger":{"connections":[{"node":754,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-760.5421829740567,-356.3230037609839],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"test","socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"display":"test","success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":754,"input":"input","data":{"pins":[]}}]}},"position":[-1555.1553378286703,-376.7788066492969],"name":"Universal Input"},"754":{"id":754,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {modifiedInput: inputs.input + ' modified'}\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"outputs":[{"name":"modifiedInput","taskType":"output","socketKey":"modifiedInput","connectionType":"output","socketType":"anySocket"}],"display":"{\"modifiedInput\":\"test modified\"}","success":false},"inputs":{"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]},"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"modifiedInput":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1133.8938776147565,-354.9392611868693],"name":"Code"}}},"createdAt":"2022-05-25T22:31:10.259Z","updatedAt":"2022-05-25T22:33:55.441Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"introText":"This is a simple AI generator app. Type anything and let the AI continue "}} \ No newline at end of file diff --git a/packages/core/data/codeSpell.ts b/packages/core/data/codeSpell.ts new file mode 100644 index 000000000..faafdf647 --- /dev/null +++ b/packages/core/data/codeSpell.ts @@ -0,0 +1,138 @@ +import { Spell } from '../types' + +export default { + id: '3b7add2b-0f49-4c6b-8db9-18ecbb34602c', + name: 'accurate white', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 754, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1556.5668566017482, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: 'test modified', + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + success: false, + }, + inputs: { + input: { + connections: [ + { node: 754, output: 'modifiedInput', data: { pins: [] } }, + ], + }, + trigger: { + connections: [{ node: 754, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-760.5421829740567, -356.3230037609839], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'test', + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + display: 'test', + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 754, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1555.1553378286703, -376.7788066492969], + name: 'Universal Input', + }, + '754': { + id: 754, + data: { + code: "\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {modifiedInput: inputs.input + ' modified'}\n}\n", + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + outputs: [ + { + name: 'modifiedInput', + taskType: 'output', + socketKey: 'modifiedInput', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: '{"modifiedInput":"test modified"}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + modifiedInput: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1133.8938776147565, -354.9392611868693], + name: 'Code', + }, + }, + }, + createdAt: '2022-05-25T22:31:10.259Z', + updatedAt: '2022-05-25T22:33:55.441Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + }, +} as unknown as Spell diff --git a/packages/core/data/forEachSpell.thoth b/packages/core/data/forEachSpell.thoth new file mode 100644 index 000000000..1f6d976a6 --- /dev/null +++ b/packages/core/data/forEachSpell.thoth @@ -0,0 +1 @@ +{"id":"9b970450-4a0f-43cd-8763-ce0920f9ce1e","name":"instant tan","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"success":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":764,"input":"trigger","data":{"pins":[]}}]}},"position":[-1735.7923282597962,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because","success":false,"socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":769,"output":"list","data":{"pins":[]}}]},"trigger":{"connections":[{"node":766,"output":"done","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-333.00667343275376,-154.40816046144414],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"test","display":"yes","success":false,"socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"no","playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":764,"input":"input","data":{"pins":[]}}]}},"position":[-1756.7490443350143,-376.7788066492969],"name":"Universal Input"},"764":{"id":764,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: [1,2,3]}\n}\n","name":"list return","inputs":[{"name":"input","taskType":"output","socketKey":"input","socketType":"anySocket","connectionType":"input"}],"display":"{\"output\":[1,2,3]}","outputs":[{"name":"output","taskType":"output","socketKey":"output","socketType":"anySocket","connectionType":"output"}],"success":false,"dataControls":{"code":{"expanded":true},"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true}}},"inputs":{"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"output":{"connections":[{"node":766,"input":"array","data":{"pins":[]}}]},"trigger":{"connections":[{"node":766,"input":"act1","data":{"pins":[]}}]}},"position":[-1348.7560502830124,-331.3813133122548],"name":"Code"},"766":{"id":766,"data":{"error":false},"inputs":{"act1":{"connections":[{"node":764,"output":"trigger","data":{"pins":[]}}]},"array":{"connections":[{"node":764,"output":"output","data":{"pins":[]}}]}},"outputs":{"act":{"connections":[{"node":767,"input":"trigger","data":{"pins":[]}}]},"element":{"connections":[{"node":767,"input":"list","data":{"pins":[]}}]},"done":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]}},"position":[-912.7229115653838,-394.39695880949944],"name":"ForEach"},"767":{"id":767,"data":{"inputs":[{"name":"list","taskType":"output","socketKey":"list","socketType":"anySocket","connectionType":"input"}],"dataControls":{"inputs":{"expanded":true}}},"inputs":{"list":{"connections":[{"node":766,"output":"element","data":{"pins":[]}}]},"trigger":{"connections":[{"node":766,"output":"act","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-436.4064615045899,-505.59288512311963],"name":"State Write"},"769":{"id":769,"data":{"outputs":[{"name":"list","taskType":"output","socketKey":"list","socketType":"anySocket","connectionType":"output"}],"dataControls":{"outputs":{"expanded":true}}},"inputs":{},"outputs":{"list":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-898.2551611087029,-48.60770873229342],"name":"State Read"}}},"createdAt":"2022-06-01T22:46:39.699Z","updatedAt":"2022-06-02T01:48:11.483Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"list":[]}} \ No newline at end of file diff --git a/packages/core/data/forEachSpell.ts b/packages/core/data/forEachSpell.ts new file mode 100644 index 000000000..6b7675444 --- /dev/null +++ b/packages/core/data/forEachSpell.ts @@ -0,0 +1,218 @@ +import { Spell } from './../types' +export default { + id: '9b970450-4a0f-43cd-8763-ce0920f9ce1e', + name: 'instant tan', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + success: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 764, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1735.7923282597962, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: + 'Press is a free WordPress theme made by Tom Usborne, a programmer from Canada. I’ve really seen it for many years from the WordPress repository. Most of you know that I am fairly picky when it comes to web performance, and so I tend to ignore everything from the repository. Typically because', + success: false, + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [{ node: 769, output: 'list', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 766, output: 'done', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-333.00667343275376, -154.40816046144414], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'test', + display: 'yes', + success: false, + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'no', + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 764, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1756.7490443350143, -376.7788066492969], + name: 'Universal Input', + }, + '764': { + id: 764, + data: { + code: '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: [1,2,3]}\n}\n', + name: 'list return', + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + socketType: 'anySocket', + connectionType: 'input', + }, + ], + display: '{"output":[1,2,3]}', + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + socketType: 'anySocket', + connectionType: 'output', + }, + ], + success: false, + dataControls: { + code: { expanded: true }, + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + }, + }, + inputs: { + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + output: { + connections: [{ node: 766, input: 'array', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 766, input: 'act1', data: { pins: [] } }], + }, + }, + position: [-1348.7560502830124, -331.3813133122548], + name: 'Code', + }, + '766': { + id: 766, + data: { error: false }, + inputs: { + act1: { + connections: [{ node: 764, output: 'trigger', data: { pins: [] } }], + }, + array: { + connections: [{ node: 764, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + act: { + connections: [{ node: 767, input: 'trigger', data: { pins: [] } }], + }, + element: { + connections: [{ node: 767, input: 'list', data: { pins: [] } }], + }, + done: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-912.7229115653838, -394.39695880949944], + name: 'ForEach', + }, + '767': { + id: 767, + data: { + inputs: [ + { + name: 'list', + taskType: 'output', + socketKey: 'list', + socketType: 'anySocket', + connectionType: 'input', + }, + ], + dataControls: { inputs: { expanded: true } }, + }, + inputs: { + list: { + connections: [{ node: 766, output: 'element', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 766, output: 'act', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-436.4064615045899, -505.59288512311963], + name: 'State Write', + }, + '769': { + id: 769, + data: { + outputs: [ + { + name: 'list', + taskType: 'output', + socketKey: 'list', + socketType: 'anySocket', + connectionType: 'output', + }, + ], + dataControls: { outputs: { expanded: true } }, + }, + inputs: {}, + outputs: { + list: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-898.2551611087029, -48.60770873229342], + name: 'State Read', + }, + }, + }, + createdAt: '2022-06-01T22:46:39.699Z', + updatedAt: '2022-06-02T01:48:11.483Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { list: [] }, +} as unknown as Spell diff --git a/packages/core/data/generatorSpell.thoth b/packages/core/data/generatorSpell.thoth new file mode 100644 index 000000000..f2d47690f --- /dev/null +++ b/packages/core/data/generatorSpell.thoth @@ -0,0 +1 @@ +{"id":"3b7add2b-0f49-4c6b-8db9-18ecbb34602c","name":"square amaranth","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":499,"input":"trigger","data":{"pins":[]}}]}},"position":[-1556.5668566017482,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"Continue the story from here:\nOnce there was a poor dude. He had nothing. He lived in a village in the country, and he spent his days working fishing nets. It was a shitty job, and he always got cold and wet. He never had any decent clothes and he could never afford a beer at","socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":499,"output":"composed","data":{"pins":[]}}]},"trigger":{"connections":[{"node":499,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-761.8236637217791,-374.13333794248774],"name":"Output"},"499":{"id":499,"data":{"stop":"\\n","temp":"0.8","error":false,"inputs":[{"name":"input","taskType":"output","socketKey":"input","socketType":"anySocket","connectionType":"input"}],"fewshot":"{{input}}","maxTokens":50,"dataControls":{"name":{"expanded":true},"stop":{"expanded":true},"temp":{"expanded":true},"inputs":{"expanded":true},"fewshot":{"expanded":true},"maxTokens":{"expanded":true},"frequencyPenalty":{"expanded":true}}},"inputs":{"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"result":{"connections":[]},"composed":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1145.130755699551,-375.2348763349078],"name":"Generator"},"646":{"id":646,"data":{"name":"input","text":"Input text here","socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":499,"input":"input","data":{"pins":[]}}]}},"position":[-1555.1553378286703,-376.7788066492969],"name":"Universal Input"}}},"createdAt":"2022-05-25T22:31:10.259Z","updatedAt":"2022-05-25T22:31:41.984Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"introText":"This is a simple AI generator app. Type anything and let the AI continue "}} \ No newline at end of file diff --git a/packages/core/data/generatorSpell.ts b/packages/core/data/generatorSpell.ts new file mode 100644 index 000000000..9c7c83fa5 --- /dev/null +++ b/packages/core/data/generatorSpell.ts @@ -0,0 +1,140 @@ +import { Spell } from '../types' +export default { + id: '3b7add2b-0f49-4c6b-8db9-18ecbb34602c', + name: 'square amaranth', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 499, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1556.5668566017482, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: + 'Continue the story from here:\nOnce there was a poor dude. He had nothing. He lived in a village in the country, and he spent his days working fishing nets. It was a shitty job, and he always got cold and wet. He never had any decent clothes and he could never afford a beer at', + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [ + { node: 499, output: 'composed', data: { pins: [] } }, + ], + }, + trigger: { + connections: [{ node: 499, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-761.8236637217791, -374.13333794248774], + name: 'Output', + }, + '499': { + id: 499, + data: { + stop: '\\n', + temp: '0.8', + error: false, + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + socketType: 'anySocket', + connectionType: 'input', + }, + ], + fewshot: '{{input}}', + maxTokens: 50, + dataControls: { + name: { expanded: true }, + stop: { expanded: true }, + temp: { expanded: true }, + inputs: { expanded: true }, + fewshot: { expanded: true }, + maxTokens: { expanded: true }, + frequencyPenalty: { expanded: true }, + }, + }, + inputs: { + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + result: { connections: [] }, + composed: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1145.130755699551, -375.2348763349078], + name: 'Generator', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'Input text here', + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 499, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1555.1553378286703, -376.7788066492969], + name: 'Universal Input', + }, + }, + }, + createdAt: '2022-05-25T22:31:10.259Z', + updatedAt: '2022-05-25T22:31:41.984Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + }, +} as unknown as Spell diff --git a/packages/core/data/generatorSwitchSpell.thoth b/packages/core/data/generatorSwitchSpell.thoth new file mode 100644 index 000000000..719d14a83 --- /dev/null +++ b/packages/core/data/generatorSwitchSpell.thoth @@ -0,0 +1 @@ +{"id":"3b7add2b-0f49-4c6b-8db9-18ecbb34602c","name":"wee silver","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":755,"input":"trigger","data":{"pins":[]}}]}},"position":[-1556.5668566017482,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"nope","socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true,"success":false},"inputs":{"input":{"connections":[{"node":756,"output":"result","data":{"pins":[]}},{"node":757,"output":"nope","data":{"pins":[]}}]},"trigger":{"connections":[{"node":756,"output":"trigger","data":{"pins":[]}},{"node":757,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-355.34246696789677,-379.7943353508476],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"no","socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"display":"no","success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":755,"input":"input","data":{"pins":[]}}]}},"position":[-1555.1553378286703,-376.7788066492969],"name":"Universal Input"},"755":{"id":755,"data":{"dataControls":{"outputs":{"expanded":true}},"outputs":[{"name":"yes","taskType":"option","socketKey":"yes","connectionType":"output","socketType":"triggerSocket"},{"name":"no","taskType":"option","socketKey":"no","connectionType":"output","socketType":"triggerSocket"}],"success":false},"inputs":{"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"default":{"connections":[]},"yes":{"connections":[{"node":756,"input":"trigger","data":{"pins":[]}}]},"no":{"connections":[{"node":757,"input":"trigger","data":{"pins":[]}}]}},"position":[-1176.2411766908515,-306.22492046552907],"name":"Switch"},"756":{"id":756,"data":{"stop":"\\n","temp":0.7,"maxTokens":50,"error":false,"dataControls":{"name":{"expanded":true},"model":{"expanded":true},"inputs":{"expanded":true},"fewshot":{"expanded":true},"stop":{"expanded":true},"temp":{"expanded":true},"maxTokens":{"expanded":true},"frequencyPenalty":{"expanded":true}},"fewshot":"Generate","display":"s a printable report for a given period.\nGenerated report will have following sections.\nTotal number of accounts, Class A, Class B, Class C, Class D, Class E.\nTotal number of accounts with","success":false},"inputs":{"trigger":{"connections":[{"node":755,"output":"yes","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"result":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]},"composed":{"connections":[]}},"position":[-756.0054171828833,-686.5866282949149],"name":"Generator"},"757":{"id":757,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {nope: 'nope'}\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"outputs":[{"name":"nope","taskType":"output","socketKey":"nope","connectionType":"output","socketType":"anySocket"}],"display":"{\"nope\":\"nope\"}","success":false},"inputs":{"trigger":{"connections":[{"node":755,"output":"no","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"nope":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-763.6582824038765,-158.00935186007678],"name":"Code"}}},"createdAt":"2022-05-25T22:31:10.259Z","updatedAt":"2022-05-25T22:36:33.629Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"introText":"This is a simple AI generator app. Type anything and let the AI continue "}} \ No newline at end of file diff --git a/packages/core/data/generatorSwitchSpell.ts b/packages/core/data/generatorSwitchSpell.ts new file mode 100644 index 000000000..ca99e1341 --- /dev/null +++ b/packages/core/data/generatorSwitchSpell.ts @@ -0,0 +1,220 @@ +import { Spell } from '../types' + +export default { + id: '3b7add2b-0f49-4c6b-8db9-18ecbb34602c', + name: 'wee silver', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 755, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1556.5668566017482, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: 'nope', + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + success: false, + }, + inputs: { + input: { + connections: [ + { node: 756, output: 'result', data: { pins: [] } }, + { node: 757, output: 'nope', data: { pins: [] } }, + ], + }, + trigger: { + connections: [ + { node: 756, output: 'trigger', data: { pins: [] } }, + { node: 757, output: 'trigger', data: { pins: [] } }, + ], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-355.34246696789677, -379.7943353508476], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'no', + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + display: 'no', + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 755, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1555.1553378286703, -376.7788066492969], + name: 'Universal Input', + }, + '755': { + id: 755, + data: { + dataControls: { outputs: { expanded: true } }, + outputs: [ + { + name: 'yes', + taskType: 'option', + socketKey: 'yes', + connectionType: 'output', + socketType: 'triggerSocket', + }, + { + name: 'no', + taskType: 'option', + socketKey: 'no', + connectionType: 'output', + socketType: 'triggerSocket', + }, + ], + success: false, + }, + inputs: { + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + default: { connections: [] }, + yes: { + connections: [{ node: 756, input: 'trigger', data: { pins: [] } }], + }, + no: { + connections: [{ node: 757, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1176.2411766908515, -306.22492046552907], + name: 'Switch', + }, + '756': { + id: 756, + data: { + stop: '\\n', + temp: 0.7, + maxTokens: 50, + error: false, + dataControls: { + name: { expanded: true }, + model: { expanded: true }, + inputs: { expanded: true }, + fewshot: { expanded: true }, + stop: { expanded: true }, + temp: { expanded: true }, + maxTokens: { expanded: true }, + frequencyPenalty: { expanded: true }, + }, + fewshot: 'Generate', + display: + 's a printable report for a given period.\nGenerated report will have following sections.\nTotal number of accounts, Class A, Class B, Class C, Class D, Class E.\nTotal number of accounts with', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 755, output: 'yes', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + result: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + composed: { connections: [] }, + }, + position: [-756.0054171828833, -686.5866282949149], + name: 'Generator', + }, + '757': { + id: 757, + data: { + code: "\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {nope: 'nope'}\n}\n", + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + outputs: [ + { + name: 'nope', + taskType: 'output', + socketKey: 'nope', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: '{"nope":"nope"}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 755, output: 'no', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + nope: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-763.6582824038765, -158.00935186007678], + name: 'Code', + }, + }, + }, + createdAt: '2022-05-25T22:31:10.259Z', + updatedAt: '2022-05-25T22:36:33.629Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + }, +} as unknown as Spell diff --git a/packages/core/data/imageGeneratorSpell.thoth b/packages/core/data/imageGeneratorSpell.thoth new file mode 100644 index 000000000..5aeafa606 --- /dev/null +++ b/packages/core/data/imageGeneratorSpell.thoth @@ -0,0 +1 @@ +{"id":"3b7add2b-0f49-4c6b-8db9-18ecbb34602c","name":"like coral","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":758,"input":"trigger","data":{"pins":[]}}]}},"position":[-1556.5668566017482,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/7ceeda0b-b9a6-4c8e-a8a8-7f5b32af5c80.png","socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true,"success":false},"inputs":{"input":{"connections":[{"node":760,"output":"image","data":{"pins":[]}}]},"trigger":{"connections":[{"node":760,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-376.65549182217944,-309.8030022739871],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"image","socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"display":"image","success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":758,"input":"caption","data":{"pins":[]}}]}},"position":[-1555.1553378286703,-376.7788066492969],"name":"Universal Input"},"758":{"id":758,"data":{"success":false},"inputs":{"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]},"caption":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":760,"input":"trigger","data":{"pins":[]}}]},"images":{"connections":[{"node":760,"input":"images","data":{"pins":[]}}]}},"position":[-1133.9388446003131,-290.6268952113074],"name":"VisualGeneration"},"760":{"id":760,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {image: inputs.images[0].imageUrl}\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"inputs":[{"name":"images","taskType":"output","socketKey":"images","connectionType":"input","socketType":"anySocket"}],"outputs":[{"name":"image","taskType":"output","socketKey":"image","connectionType":"output","socketType":"anySocket"}],"display":"{\"image\":\"https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/7ceeda0b-b9a6-4c8e-a8a8-7f5b32af5c80.png\"}","success":false},"inputs":{"trigger":{"connections":[{"node":758,"output":"trigger","data":{"pins":[]}}]},"images":{"connections":[{"node":758,"output":"images","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"image":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-764.5575615198208,-302.86167492665004],"name":"Code"}}},"createdAt":"2022-05-25T22:31:10.259Z","updatedAt":"2022-05-25T22:38:42.619Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"introText":"This is a simple AI generator app. Type anything and let the AI continue "}} \ No newline at end of file diff --git a/packages/core/data/imageGeneratorSpell.ts b/packages/core/data/imageGeneratorSpell.ts new file mode 100644 index 000000000..6614908ea --- /dev/null +++ b/packages/core/data/imageGeneratorSpell.ts @@ -0,0 +1,169 @@ +import { Spell } from '../types' + +export default { + id: '3b7add2b-0f49-4c6b-8db9-18ecbb34602c', + name: 'like coral', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 758, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1556.5668566017482, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: + 'https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/7ceeda0b-b9a6-4c8e-a8a8-7f5b32af5c80.png', + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + success: false, + }, + inputs: { + input: { + connections: [{ node: 760, output: 'image', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 760, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-376.65549182217944, -309.8030022739871], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'image', + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + display: 'image', + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 758, input: 'caption', data: { pins: [] } }], + }, + }, + position: [-1555.1553378286703, -376.7788066492969], + name: 'Universal Input', + }, + '758': { + id: 758, + data: { success: false }, + inputs: { + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + caption: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 760, input: 'trigger', data: { pins: [] } }], + }, + images: { + connections: [{ node: 760, input: 'images', data: { pins: [] } }], + }, + }, + position: [-1133.9388446003131, -290.6268952113074], + name: 'VisualGeneration', + }, + '760': { + id: 760, + data: { + code: '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {image: inputs.images[0].imageUrl}\n}\n', + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + inputs: [ + { + name: 'images', + taskType: 'output', + socketKey: 'images', + connectionType: 'input', + socketType: 'anySocket', + }, + ], + outputs: [ + { + name: 'image', + taskType: 'output', + socketKey: 'image', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: + '{"image":"https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/7ceeda0b-b9a6-4c8e-a8a8-7f5b32af5c80.png"}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 758, output: 'trigger', data: { pins: [] } }], + }, + images: { + connections: [{ node: 758, output: 'images', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + image: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-764.5575615198208, -302.86167492665004], + name: 'Code', + }, + }, + }, + createdAt: '2022-05-25T22:31:10.259Z', + updatedAt: '2022-05-25T22:38:42.619Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + }, +} as unknown as Spell diff --git a/packages/core/data/inputOutputSpell.thoth b/packages/core/data/inputOutputSpell.thoth new file mode 100644 index 000000000..67e770656 --- /dev/null +++ b/packages/core/data/inputOutputSpell.thoth @@ -0,0 +1 @@ +{"id":"3e645657-ec88-43e7-9b4d-6c177219c8f2","name":"modest bronze","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","dataControls":{"name":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]}},"position":[-1555.4724883179474,-132.7648214211178],"name":"Module Trigger In"},"232":{"id":232,"data":{"name":"Input","text":"Input text here","outputs":[],"socketKey":"9d61118c-3c5a-4379-9dae-41965e56207f","dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"Input text here","playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1554.8394720686588,-362.87891510530955],"name":"Universal Input"},"233":{"id":233,"data":{"name":"output-233","socketKey":"5fc83754-ddf3-43fc-a7e2-992c5009f853","dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":232,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-1134.1518031360474,-300.2158528655752],"name":"Output"}}},"createdAt":"2022-06-08T03:41:18.512Z","updatedAt":"2022-06-08T03:41:18.512Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{}} \ No newline at end of file diff --git a/packages/core/data/inputOutputSpell.ts b/packages/core/data/inputOutputSpell.ts new file mode 100644 index 000000000..03e9ef938 --- /dev/null +++ b/packages/core/data/inputOutputSpell.ts @@ -0,0 +1,80 @@ +import { Spell } from './../types' +export default { + id: '3e645657-ec88-43e7-9b4d-6c177219c8f2', + name: 'modest bronze', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + dataControls: { name: { expanded: true } }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1555.4724883179474, -132.7648214211178], + name: 'Module Trigger In', + }, + '232': { + id: 232, + data: { + name: 'Input', + text: 'Input text here', + outputs: [], + socketKey: '9d61118c-3c5a-4379-9dae-41965e56207f', + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'Input text here', + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1554.8394720686588, -362.87891510530955], + name: 'Universal Input', + }, + '233': { + id: 233, + data: { + name: 'output-233', + socketKey: '5fc83754-ddf3-43fc-a7e2-992c5009f853', + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [{ node: 232, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-1134.1518031360474, -300.2158528655752], + name: 'Output', + }, + }, + }, + createdAt: '2022-06-08T03:41:18.512Z', + updatedAt: '2022-06-08T03:41:18.512Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: {}, +} as unknown as Spell diff --git a/packages/core/data/joinListSpell.thoth b/packages/core/data/joinListSpell.thoth new file mode 100644 index 000000000..a097019f8 --- /dev/null +++ b/packages/core/data/joinListSpell.thoth @@ -0,0 +1 @@ +{"id":"9b970450-4a0f-43cd-8763-ce0920f9ce1e","name":"inappropriate apricot","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"success":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":764,"input":"trigger","data":{"pins":[]}}]}},"position":[-1735.7923282597962,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"1 2 3","success":false,"socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":771,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":771,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-33.11208105562871,-319.205540485338],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"test","display":"test","success":false,"socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"no","playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":764,"input":"input","data":{"pins":[]}}]}},"position":[-1756.7490443350143,-376.7788066492969],"name":"Universal Input"},"764":{"id":764,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: [1,2,3]}\n}\n","name":"list return","inputs":[{"name":"input","taskType":"output","socketKey":"input","socketType":"anySocket","connectionType":"input"}],"display":"{\"output\":[1,2,3]}","outputs":[{"name":"output","taskType":"output","socketKey":"output","socketType":"anySocket","connectionType":"output"}],"success":false,"dataControls":{"code":{"expanded":true},"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true}}},"inputs":{"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"output":{"connections":[{"node":770,"input":"list","data":{"pins":[]}}]},"trigger":{"connections":[{"node":771,"input":"trigger","data":{"pins":[]}}]}},"position":[-1348.7560502830124,-331.3813133122548],"name":"Code"},"770":{"id":770,"data":{"separator":" ","success":false},"inputs":{"list":{"connections":[{"node":764,"output":"output","data":{"pins":[]}}]}},"outputs":{"text":{"connections":[{"node":771,"input":"output","data":{"pins":[]}}]}},"position":[-937.1562595051406,-331.62751718913506],"name":"Join List"},"771":{"id":771,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return inputs\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"inputs":[{"name":"output","taskType":"output","socketKey":"output","connectionType":"input","socketType":"anySocket"}],"outputs":[{"name":"output","taskType":"output","socketKey":"output","connectionType":"output","socketType":"anySocket"}],"display":"{\"output\":\"1 2 3\"}","success":false},"inputs":{"trigger":{"connections":[{"node":764,"output":"trigger","data":{"pins":[]}}]},"output":{"connections":[{"node":770,"output":"text","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"output":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-449.8833497648249,-311.4641422266668],"name":"Code"}}},"createdAt":"2022-06-01T22:46:39.699Z","updatedAt":"2022-06-02T01:50:25.520Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"list":[]}} \ No newline at end of file diff --git a/packages/core/data/joinListSpell.ts b/packages/core/data/joinListSpell.ts new file mode 100644 index 000000000..816e57ca9 --- /dev/null +++ b/packages/core/data/joinListSpell.ts @@ -0,0 +1,209 @@ +import { Spell } from './../types' +export default { + id: '9b970450-4a0f-43cd-8763-ce0920f9ce1e', + name: 'inappropriate apricot', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + success: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 764, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1735.7923282597962, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: '1 2 3', + success: false, + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [{ node: 771, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 771, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-33.11208105562871, -319.205540485338], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'test', + display: 'test', + success: false, + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'no', + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 764, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1756.7490443350143, -376.7788066492969], + name: 'Universal Input', + }, + '764': { + id: 764, + data: { + code: '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {output: [1,2,3]}\n}\n', + name: 'list return', + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + socketType: 'anySocket', + connectionType: 'input', + }, + ], + display: '{"output":[1,2,3]}', + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + socketType: 'anySocket', + connectionType: 'output', + }, + ], + success: false, + dataControls: { + code: { expanded: true }, + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + }, + }, + inputs: { + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + output: { + connections: [{ node: 770, input: 'list', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 771, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1348.7560502830124, -331.3813133122548], + name: 'Code', + }, + '770': { + id: 770, + data: { separator: ' ', success: false }, + inputs: { + list: { + connections: [{ node: 764, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + text: { + connections: [{ node: 771, input: 'output', data: { pins: [] } }], + }, + }, + position: [-937.1562595051406, -331.62751718913506], + name: 'Join List', + }, + '771': { + id: 771, + data: { + code: '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return inputs\n}\n', + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + inputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + connectionType: 'input', + socketType: 'anySocket', + }, + ], + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: '{"output":"1 2 3"}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 764, output: 'trigger', data: { pins: [] } }], + }, + output: { + connections: [{ node: 770, output: 'text', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + output: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-449.8833497648249, -311.4641422266668], + name: 'Code', + }, + }, + }, + createdAt: '2022-06-01T22:46:39.699Z', + updatedAt: '2022-06-02T01:50:25.520Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { list: [] }, +} as unknown as Spell diff --git a/packages/core/data/parentSpell.thoth b/packages/core/data/parentSpell.thoth new file mode 100644 index 000000000..40cb1e718 --- /dev/null +++ b/packages/core/data/parentSpell.thoth @@ -0,0 +1 @@ +{"id":"801b7a36-9468-402a-8ecd-aed4038dfcd5","name":"whole amethyst","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","dataControls":{"name":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":238,"input":"20c0d2db-1916-433f-88c6-69d3ae123217","data":{"pins":[]}}]}},"position":[-1555.4724883179474,-132.7648214211178],"name":"Module Trigger In"},"232":{"id":232,"data":{"name":"Input","text":"test","outputs":[],"socketKey":"9d61118c-3c5a-4379-9dae-41965e56207f","dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true},"useDefault":{"expanded":true}},"defaultValue":"Input text here","playtestToggle":{"receivePlaytest":true},"display":"test","success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":238,"input":"9d61118c-3c5a-4379-9dae-41965e56207f","data":{"pins":[]}}]}},"position":[-1554.5293524397525,-362.87500885530955],"name":"Universal Input"},"233":{"id":233,"data":{"name":"output-233","socketKey":"79aca82e-995f-451c-aa3b-8abe81e30cdb","display":"test","success":false},"inputs":{"input":{"connections":[{"node":238,"output":"940dc29f-91be-4d23-88a6-2b91d41aef15","data":{"pins":[]}}]},"trigger":{"connections":[{"node":238,"output":"02de01cf-48c8-4a90-b9ac-997fb3ce9cf5","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-758.8511439563598,-344.4560872405752],"name":"Output"},"238":{"id":238,"data":{"name":"bored ivory","spell":"bored ivory","inputs":[{"name":"Input","taskType":"output","socketKey":"9d61118c-3c5a-4379-9dae-41965e56207f","socketType":"anySocket","useSocketName":true,"connectionType":"input"},{"name":"default","taskType":"option","socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","socketType":"triggerSocket","useSocketName":true,"connectionType":"input"}],"outputs":[{"name":"output-233","taskType":"output","socketKey":"940dc29f-91be-4d23-88a6-2b91d41aef15","socketType":"anySocket","useSocketName":true,"connectionType":"output"},{"name":"trigger-out-247","taskType":"option","socketKey":"02de01cf-48c8-4a90-b9ac-997fb3ce9cf5","socketType":"triggerSocket","useSocketName":true,"connectionType":"output"}],"spellId":"bored ivory","dataControls":{"spell":{"expanded":true}},"display":"{\"output-233\":\"test\"}","success":false},"inputs":{"9d61118c-3c5a-4379-9dae-41965e56207f":{"connections":[{"node":232,"output":"output","data":{"pins":[]}}]},"20c0d2db-1916-433f-88c6-69d3ae123217":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"940dc29f-91be-4d23-88a6-2b91d41aef15":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]},"02de01cf-48c8-4a90-b9ac-997fb3ce9cf5":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]}},"position":[-1138.9208374023438,-368.720703125],"name":"Spell"}}},"createdAt":"2022-06-10T06:48:49.841Z","updatedAt":"2022-06-07T23:26:14.112Z","deletedAt":null,"userId":"29476106","modules":[],"gameState":null} \ No newline at end of file diff --git a/packages/core/data/parentSpell.ts b/packages/core/data/parentSpell.ts new file mode 100644 index 000000000..d3e50782e --- /dev/null +++ b/packages/core/data/parentSpell.ts @@ -0,0 +1,169 @@ +import { Spell } from '@latitudegames/thoth-core/dist/types' +export default { + id: '801b7a36-9468-402a-8ecd-aed4038dfcd5', + name: 'whole amethyst', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + dataControls: { name: { expanded: true } }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [ + { + node: 238, + input: '20c0d2db-1916-433f-88c6-69d3ae123217', + data: { pins: [] }, + }, + ], + }, + }, + position: [-1555.4724883179474, -132.7648214211178], + name: 'Module Trigger In', + }, + '232': { + id: 232, + data: { + name: 'Input', + text: 'test', + outputs: [], + socketKey: '9d61118c-3c5a-4379-9dae-41965e56207f', + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + useDefault: { expanded: true }, + }, + defaultValue: 'Input text here', + playtestToggle: { receivePlaytest: true }, + display: 'test', + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [ + { + node: 238, + input: '9d61118c-3c5a-4379-9dae-41965e56207f', + data: { pins: [] }, + }, + ], + }, + }, + position: [-1554.5293524397525, -362.87500885530955], + name: 'Universal Input', + }, + '233': { + id: 233, + data: { + name: 'output-233', + socketKey: '79aca82e-995f-451c-aa3b-8abe81e30cdb', + display: 'test', + success: false, + }, + inputs: { + input: { + connections: [ + { + node: 238, + output: '940dc29f-91be-4d23-88a6-2b91d41aef15', + data: { pins: [] }, + }, + ], + }, + trigger: { + connections: [ + { + node: 238, + output: '02de01cf-48c8-4a90-b9ac-997fb3ce9cf5', + data: { pins: [] }, + }, + ], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-758.8511439563598, -344.4560872405752], + name: 'Output', + }, + '238': { + id: 238, + data: { + name: 'expected amethyst', + spell: 'expected amethyst', + inputs: [ + { + name: 'Input', + taskType: 'output', + socketKey: '9d61118c-3c5a-4379-9dae-41965e56207f', + socketType: 'anySocket', + useSocketName: true, + connectionType: 'input', + }, + { + name: 'default', + taskType: 'option', + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + socketType: 'triggerSocket', + useSocketName: true, + connectionType: 'input', + }, + ], + outputs: [ + { + name: 'output-233', + taskType: 'output', + socketKey: '940dc29f-91be-4d23-88a6-2b91d41aef15', + socketType: 'anySocket', + useSocketName: true, + connectionType: 'output', + }, + { + name: 'trigger-out-247', + taskType: 'option', + socketKey: '02de01cf-48c8-4a90-b9ac-997fb3ce9cf5', + socketType: 'triggerSocket', + useSocketName: true, + connectionType: 'output', + }, + ], + spellId: 'expected amethyst', + dataControls: { spell: { expanded: true } }, + display: '{"output-233":"test"}', + success: false, + }, + inputs: { + '9d61118c-3c5a-4379-9dae-41965e56207f': { + connections: [{ node: 232, output: 'output', data: { pins: [] } }], + }, + '20c0d2db-1916-433f-88c6-69d3ae123217': { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + '940dc29f-91be-4d23-88a6-2b91d41aef15': { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + '02de01cf-48c8-4a90-b9ac-997fb3ce9cf5': { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1138.9208374023438, -368.720703125], + name: 'Spell', + }, + }, + }, + createdAt: '2022-06-10T06:48:49.841Z', + updatedAt: '2022-06-07T23:26:14.112Z', + deletedAt: null, + userId: '29476106', + modules: [], + gameState: null, +} as unknown as Spell diff --git a/packages/core/data/readWriteStateSpell.thoth b/packages/core/data/readWriteStateSpell.thoth new file mode 100644 index 000000000..083c3b2f0 --- /dev/null +++ b/packages/core/data/readWriteStateSpell.thoth @@ -0,0 +1 @@ +{"id":"3b7add2b-0f49-4c6b-8db9-18ecbb34602c","name":"ridiculous orange","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":763,"input":"trigger","data":{"pins":[]}}]}},"position":[-1556.5668566017482,-114.13292905935491],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"test","socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true,"success":false},"inputs":{"input":{"connections":[{"node":764,"output":"input","data":{"pins":[]}}]},"trigger":{"connections":[{"node":764,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-362.4726875921044,-309.7961029517374],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"test","socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"display":"test","success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":763,"input":"input","data":{"pins":[]}}]}},"position":[-1555.1553378286703,-376.7788066492969],"name":"Universal Input"},"763":{"id":763,"data":{"dataControls":{"inputs":{"expanded":true}},"inputs":[{"name":"input","taskType":"output","socketKey":"input","connectionType":"input","socketType":"anySocket"}],"success":false},"inputs":{"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]},"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":764,"input":"trigger","data":{"pins":[]}}]}},"position":[-1145.6038660676775,-248.81348929917337],"name":"State Write"},"764":{"id":764,"data":{"code":"\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return inputs\n}\n","dataControls":{"name":{"expanded":true},"inputs":{"expanded":true},"outputs":{"expanded":true},"code":{"expanded":true}},"inputs":[{"name":"input","taskType":"output","socketKey":"input","connectionType":"input","socketType":"anySocket"}],"outputs":[{"name":"input","taskType":"output","socketKey":"input","connectionType":"output","socketType":"anySocket"}],"display":"{\"input\":\"test\"}","success":false},"inputs":{"trigger":{"connections":[{"node":763,"output":"trigger","data":{"pins":[]}}]},"input":{"connections":[{"node":765,"output":"input","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"input":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-782.550724272031,-514.965542121559],"name":"Code"},"765":{"id":765,"data":{"dataControls":{"outputs":{"expanded":true}},"outputs":[{"name":"input","taskType":"output","socketKey":"input","connectionType":"output","socketType":"anySocket"}],"success":false},"inputs":{},"outputs":{"input":{"connections":[{"node":764,"input":"input","data":{"pins":[]}}]}},"position":[-1166.008967431614,-530.4797901925313],"name":"State Read"}}},"createdAt":"2022-05-25T22:31:10.259Z","updatedAt":"2022-05-25T22:42:08.703Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"input":"test","introText":"This is a simple AI generator app. Type anything and let the AI continue ","stateValue":"value"}} \ No newline at end of file diff --git a/packages/core/data/readWriteStateSpell.ts b/packages/core/data/readWriteStateSpell.ts new file mode 100644 index 000000000..560bbb214 --- /dev/null +++ b/packages/core/data/readWriteStateSpell.ts @@ -0,0 +1,202 @@ +import { Spell } from '../types' + +export default { + id: '3b7add2b-0f49-4c6b-8db9-18ecbb34602c', + name: 'ridiculous orange', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 763, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1556.5668566017482, -114.13292905935491], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: 'test', + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + success: false, + }, + inputs: { + input: { + connections: [{ node: 764, output: 'input', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 764, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-362.4726875921044, -309.7961029517374], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'test', + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + display: 'test', + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 763, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1555.1553378286703, -376.7788066492969], + name: 'Universal Input', + }, + '763': { + id: 763, + data: { + dataControls: { inputs: { expanded: true } }, + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + connectionType: 'input', + socketType: 'anySocket', + }, + ], + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 764, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1145.6038660676775, -248.81348929917337], + name: 'State Write', + }, + '764': { + id: 764, + data: { + code: '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return inputs\n}\n', + dataControls: { + name: { expanded: true }, + inputs: { expanded: true }, + outputs: { expanded: true }, + code: { expanded: true }, + }, + inputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + connectionType: 'input', + socketType: 'anySocket', + }, + ], + outputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + display: '{"input":"test"}', + success: false, + }, + inputs: { + trigger: { + connections: [{ node: 763, output: 'trigger', data: { pins: [] } }], + }, + input: { + connections: [{ node: 765, output: 'input', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + input: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-782.550724272031, -514.965542121559], + name: 'Code', + }, + '765': { + id: 765, + data: { + dataControls: { outputs: { expanded: true } }, + outputs: [ + { + name: 'input', + taskType: 'output', + socketKey: 'input', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + success: false, + }, + inputs: {}, + outputs: { + input: { + connections: [{ node: 764, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1166.008967431614, -530.4797901925313], + name: 'State Read', + }, + }, + }, + createdAt: '2022-05-25T22:31:10.259Z', + updatedAt: '2022-05-25T22:42:08.703Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { + input: 'test', + introText: + 'This is a simple AI generator app. Type anything and let the AI continue ', + stateValue: 'value', + }, +} as unknown as Spell diff --git a/packages/core/data/stateReadOutputSpell.thoth b/packages/core/data/stateReadOutputSpell.thoth new file mode 100644 index 000000000..c946195f5 --- /dev/null +++ b/packages/core/data/stateReadOutputSpell.thoth @@ -0,0 +1 @@ +{"id":"3e645657-ec88-43e7-9b4d-6c177219c8f2","name":"genetic crimson","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","dataControls":{"name":{"expanded":true}},"playtestToggle":{"receivePlaytest":true},"success":false},"inputs":{},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]}},"position":[-1555.4724883179474,-132.7648214211178],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output-233","socketKey":"5fc83754-ddf3-43fc-a7e2-992c5009f853","dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true,"display":"stateOutput","success":false},"inputs":{"input":{"connections":[{"node":776,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-971.6674208065258,-230.93850108116374],"name":"Output"},"776":{"id":776,"data":{"dataControls":{"outputs":{"expanded":true}},"outputs":[{"name":"output","taskType":"output","socketKey":"output","connectionType":"output","socketType":"anySocket"}],"success":false},"inputs":{},"outputs":{"output":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1349.40625,-385.50390625],"name":"State Read"}}},"createdAt":"2022-06-09T15:41:18.512Z","updatedAt":"2022-06-08T03:42:12.331Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"output":"stateOutput"}} \ No newline at end of file diff --git a/packages/core/data/stateReadOutputSpell.ts b/packages/core/data/stateReadOutputSpell.ts new file mode 100644 index 000000000..991e1afb0 --- /dev/null +++ b/packages/core/data/stateReadOutputSpell.ts @@ -0,0 +1,84 @@ +import { Spell } from '../types' + +export default { + id: '3e645657-ec88-43e7-9b4d-6c177219c8f2', + name: 'genetic crimson', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + dataControls: { name: { expanded: true } }, + playtestToggle: { receivePlaytest: true }, + success: false, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1555.4724883179474, -132.7648214211178], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output-233', + socketKey: '5fc83754-ddf3-43fc-a7e2-992c5009f853', + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + display: 'stateOutput', + success: false, + }, + inputs: { + input: { + connections: [{ node: 776, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-971.6674208065258, -230.93850108116374], + name: 'Output', + }, + '776': { + id: 776, + data: { + dataControls: { outputs: { expanded: true } }, + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + connectionType: 'output', + socketType: 'anySocket', + }, + ], + success: false, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1349.40625, -385.50390625], + name: 'State Read', + }, + }, + }, + createdAt: '2022-06-09T15:41:18.512Z', + updatedAt: '2022-06-08T03:42:12.331Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { output: 'stateOutput' }, +} as unknown as Spell diff --git a/packages/core/data/stringProcessorSpell.thoth b/packages/core/data/stringProcessorSpell.thoth new file mode 100644 index 000000000..a0d009481 --- /dev/null +++ b/packages/core/data/stringProcessorSpell.thoth @@ -0,0 +1 @@ +{"id":"9b970450-4a0f-43cd-8763-ce0920f9ce1e","name":"gradual blush","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","error":false,"success":false,"socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","nodeLocked":true,"dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":772,"input":"trigger","data":{"pins":[]}}]}},"position":[-1756.3467650623343,-115.72306980887628],"name":"Module Trigger In"},"233":{"id":233,"data":{"name":"output","error":false,"display":"You said test!","success":false,"socketKey":"ba6ed95b-3aac-49e9-91ae-a33f5510c83b","nodeLocked":true,"dataControls":{"name":{"expanded":true},"sendToPlaytest":{"expanded":true}},"sendToPlaytest":true},"inputs":{"input":{"connections":[{"node":772,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":772,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[]}},"position":[-995.0405138261826,-295.3801234200136],"name":"Output"},"646":{"id":646,"data":{"name":"input","text":"test","display":"test","success":false,"socketKey":"3a9cfde5-32a0-4e96-9de7-7571a7a4e784","nodeLocked":true,"dataControls":{"name":{"expanded":true},"useDefault":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"no","playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"output":{"connections":[{"node":772,"input":"input","data":{"pins":[]}}]}},"position":[-1756.7490443350143,-376.7788066492969],"name":"Universal Input"},"772":{"id":772,"data":{"code":"(inputStr) => {\n return { \"output\": `You said ${inputStr}!` }\n}","dataControls":{"outputs":{"expanded":true},"code":{"expanded":true}},"outputs":[{"name":"output","taskType":"output","socketKey":"output","connectionType":"output","socketType":"stringSocket"}],"success":false},"inputs":{"input":{"connections":[{"node":646,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"output":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1386.0319940412824,-303.81826315707195],"name":"String Processor"}}},"createdAt":"2022-06-01T22:46:39.699Z","updatedAt":"2022-06-02T01:54:30.536Z","deletedAt":null,"userId":"2508068","modules":[],"gameState":{"list":[]}} \ No newline at end of file diff --git a/packages/core/data/stringProcessorSpell.ts b/packages/core/data/stringProcessorSpell.ts new file mode 100644 index 000000000..01959362a --- /dev/null +++ b/packages/core/data/stringProcessorSpell.ts @@ -0,0 +1,130 @@ +import { Spell } from './../types' +export default { + id: '9b970450-4a0f-43cd-8763-ce0920f9ce1e', + name: 'gradual blush', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + error: false, + success: false, + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 772, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1756.3467650623343, -115.72306980887628], + name: 'Module Trigger In', + }, + '233': { + id: 233, + data: { + name: 'output', + error: false, + display: 'You said test!', + success: false, + socketKey: 'ba6ed95b-3aac-49e9-91ae-a33f5510c83b', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + sendToPlaytest: { expanded: true }, + }, + sendToPlaytest: true, + }, + inputs: { + input: { + connections: [{ node: 772, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 772, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { trigger: { connections: [] } }, + position: [-995.0405138261826, -295.3801234200136], + name: 'Output', + }, + '646': { + id: 646, + data: { + name: 'input', + text: 'test', + display: 'test', + success: false, + socketKey: '3a9cfde5-32a0-4e96-9de7-7571a7a4e784', + nodeLocked: true, + dataControls: { + name: { expanded: true }, + useDefault: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'no', + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + output: { + connections: [{ node: 772, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1756.7490443350143, -376.7788066492969], + name: 'Universal Input', + }, + '772': { + id: 772, + data: { + code: '(inputStr) => {\n return { "output": `You said ${inputStr}!` }\n}', + dataControls: { + outputs: { expanded: true }, + code: { expanded: true }, + }, + outputs: [ + { + name: 'output', + taskType: 'output', + socketKey: 'output', + connectionType: 'output', + socketType: 'stringSocket', + }, + ], + success: false, + }, + inputs: { + input: { + connections: [{ node: 646, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + output: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1386.0319940412824, -303.81826315707195], + name: 'String Processor', + }, + }, + }, + createdAt: '2022-06-01T22:46:39.699Z', + updatedAt: '2022-06-02T01:54:30.536Z', + deletedAt: null, + userId: '2508068', + modules: [], + gameState: { list: [] }, +} as unknown as Spell diff --git a/packages/core/data/subSpell.thoth b/packages/core/data/subSpell.thoth new file mode 100644 index 000000000..1a0105921 --- /dev/null +++ b/packages/core/data/subSpell.thoth @@ -0,0 +1 @@ +{"id":"e19d34b1-65ac-42ff-ac98-88b8cd14cf6a","name":"expected amethyst","chain":{"id":"demo@0.1.0","nodes":{"124":{"id":124,"data":{"name":"default","socketKey":"20c0d2db-1916-433f-88c6-69d3ae123217","dataControls":{"name":{"expanded":true}},"playtestToggle":{"receivePlaytest":true}},"inputs":{},"outputs":{"trigger":{"connections":[{"node":246,"input":"trigger","data":{"pins":[]}}]}},"position":[-1555.4724883179474,-132.7648214211178],"name":"Module Trigger In"},"232":{"id":232,"data":{"name":"Input","text":"Input text here","outputs":[],"socketKey":"9d61118c-3c5a-4379-9dae-41965e56207f","dataControls":{"name":{"expanded":true},"playtestToggle":{"expanded":true}},"defaultValue":"Input text here","playtestToggle":{"outputs":[],"receivePlaytest":false}},"inputs":{},"outputs":{"output":{"connections":[{"node":246,"input":"string","data":{"pins":[{"x":-1219.0300903320312,"y":-278.76190185546875}]}}]}},"position":[-1554.8394720686588,-362.87500885530955],"name":"Universal Input"},"233":{"id":233,"data":{"name":"output-233","socketKey":"940dc29f-91be-4d23-88a6-2b91d41aef15"},"inputs":{"input":{"connections":[{"node":246,"output":"output","data":{"pins":[]}}]},"trigger":{"connections":[{"node":246,"output":"trigger","data":{"pins":[]}}]}},"outputs":{"trigger":{"connections":[{"node":247,"input":"trigger","data":{"pins":[]}}]}},"position":[-783.9329310657348,-406.1566487640127],"name":"Output"},"246":{"id":246,"data":{},"inputs":{"trigger":{"connections":[{"node":124,"output":"trigger","data":{"pins":[]}}]},"string":{"connections":[{"node":232,"output":"output","data":{"pins":[{"x":-1219.0300903320312,"y":-278.76190185546875}]}}]}},"outputs":{"trigger":{"connections":[{"node":233,"input":"trigger","data":{"pins":[]}}]},"output":{"connections":[{"node":233,"input":"input","data":{"pins":[]}}]}},"position":[-1179.3508911132812,-273.85870361328125],"name":"Echo"},"247":{"id":247,"data":{"name":"trigger-out-247","socketKey":"02de01cf-48c8-4a90-b9ac-997fb3ce9cf5"},"inputs":{"trigger":{"connections":[{"node":233,"output":"trigger","data":{"pins":[]}}]}},"outputs":{},"position":[-689.080810546875,-83.10272216796875],"name":"Module Trigger Out"}}},"createdAt":"2022-06-09T10:51:18.973Z","updatedAt":"2022-06-07T23:22:58.901Z","deletedAt":null,"userId":"29476106","modules":[],"gameState":null} \ No newline at end of file diff --git a/packages/core/data/subSpell.ts b/packages/core/data/subSpell.ts new file mode 100644 index 000000000..f90240616 --- /dev/null +++ b/packages/core/data/subSpell.ts @@ -0,0 +1,131 @@ +import { Spell } from '@latitudegames/thoth-core/dist/types' +export default { + id: 'e19d34b1-65ac-42ff-ac98-88b8cd14cf6a', + name: 'expected amethyst', + chain: { + id: 'demo@0.1.0', + nodes: { + '124': { + id: 124, + data: { + name: 'default', + socketKey: '20c0d2db-1916-433f-88c6-69d3ae123217', + dataControls: { name: { expanded: true } }, + playtestToggle: { receivePlaytest: true }, + }, + inputs: {}, + outputs: { + trigger: { + connections: [{ node: 246, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-1555.4724883179474, -132.7648214211178], + name: 'Module Trigger In', + }, + '232': { + id: 232, + data: { + name: 'Input', + text: 'Input text here', + outputs: [], + socketKey: '9d61118c-3c5a-4379-9dae-41965e56207f', + dataControls: { + name: { expanded: true }, + playtestToggle: { expanded: true }, + }, + defaultValue: 'Input text here', + playtestToggle: { outputs: [], receivePlaytest: false }, + }, + inputs: {}, + outputs: { + output: { + connections: [ + { + node: 246, + input: 'string', + data: { + pins: [{ x: -1219.0300903320312, y: -278.76190185546875 }], + }, + }, + ], + }, + }, + position: [-1554.8394720686588, -362.87500885530955], + name: 'Universal Input', + }, + '233': { + id: 233, + data: { + name: 'output-233', + socketKey: '940dc29f-91be-4d23-88a6-2b91d41aef15', + }, + inputs: { + input: { + connections: [{ node: 246, output: 'output', data: { pins: [] } }], + }, + trigger: { + connections: [{ node: 246, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: { + trigger: { + connections: [{ node: 247, input: 'trigger', data: { pins: [] } }], + }, + }, + position: [-783.9329310657348, -406.1566487640127], + name: 'Output', + }, + '246': { + id: 246, + data: {}, + inputs: { + trigger: { + connections: [{ node: 124, output: 'trigger', data: { pins: [] } }], + }, + string: { + connections: [ + { + node: 232, + output: 'output', + data: { + pins: [{ x: -1219.0300903320312, y: -278.76190185546875 }], + }, + }, + ], + }, + }, + outputs: { + trigger: { + connections: [{ node: 233, input: 'trigger', data: { pins: [] } }], + }, + output: { + connections: [{ node: 233, input: 'input', data: { pins: [] } }], + }, + }, + position: [-1179.3508911132812, -273.85870361328125], + name: 'Echo', + }, + '247': { + id: 247, + data: { + name: 'trigger-out-247', + socketKey: '02de01cf-48c8-4a90-b9ac-997fb3ce9cf5', + }, + inputs: { + trigger: { + connections: [{ node: 233, output: 'trigger', data: { pins: [] } }], + }, + }, + outputs: {}, + position: [-689.080810546875, -83.10272216796875], + name: 'Module Trigger Out', + }, + }, + }, + createdAt: '2022-06-09T10:51:18.973Z', + updatedAt: '2022-06-07T23:22:58.901Z', + deletedAt: null, + userId: '29476106', + modules: [], + gameState: null, +} as unknown as Spell diff --git a/packages/core/data/thothInterfaceStub.ts b/packages/core/data/thothInterfaceStub.ts new file mode 100644 index 000000000..c21707cba --- /dev/null +++ b/packages/core/data/thothInterfaceStub.ts @@ -0,0 +1,70 @@ +import { + ImageCacheResponse, + OpenAIResultChoice, + ThothWorkerInputs, +} from '../types' +import { VM } from 'vm2' +export default { + completion: () => { + return new Promise(resolve => resolve('string')) as Promise< + string | OpenAIResultChoice + > + }, + enkiCompletion: (): Promise<{ outputs: string[] }> => { + return new Promise(resolve => resolve({ outputs: ['string'] })) + }, + huggingface: (): Promise<{ outputs: string[] }> => { + return new Promise(resolve => resolve({ outputs: ['string'] })) + }, + getCurrentGameState: () => { + return {} + }, + setCurrentGameState: (state: Record) => {}, + updateCurrentGameState: (state: Record) => {}, + runSpell: (flattenedInputs: Record, spellId: string) => { + return new Promise(resolve => resolve({ outputs: ['string'] })) + }, + readFromImageCache: (caption: string): Promise => { + return new Promise(resolve => resolve({} as ImageCacheResponse)) + }, + processCode: ( + code: unknown, + inputs: ThothWorkerInputs, + data: Record, + state: Record + ) => { + const logValues: any[] = [] + + const sandboxConsole = { + log: (val: any, ...rest: any[]) => { + if (rest.length) { + logValues.push(JSON.stringify([val, ...rest], null, 2)) + } else { + logValues.push(JSON.stringify(val, null, 2)) + } + }, + } + + const flattenedInputs = Object.entries(inputs as ThothWorkerInputs).reduce( + (acc, [key, value]) => { + // eslint-disable-next-line prefer-destructuring + acc[key as string] = value[0] // as any[][0] <- this change was made 2 days ago + return acc + }, + {} as Record + ) + const vm = new VM() + vm.protect(state, 'state') + + vm.freeze(flattenedInputs, 'input') + vm.freeze(data, 'data') + vm.freeze(sandboxConsole, 'console') + + const codeToRun = `"use strict"; function runFn(input,data,state){ const copyFn=${code}; return copyFn(input,data,state)}; runFn(input,data,state);` + try { + return vm.run(codeToRun) + } catch (err) { + throw new Error('Error in runChain: processCode.') + } + }, +} diff --git a/core/index.ts b/packages/core/index.ts similarity index 100% rename from core/index.ts rename to packages/core/index.ts diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js new file mode 100644 index 000000000..8dca67369 --- /dev/null +++ b/packages/core/jest.config.js @@ -0,0 +1,5 @@ +module.exports = { + testEnvironment: 'node', + testPathIgnorePatterns: ['/node_modules/'], + testMatch: ['**/test/**/*.test.ts?(x)'], +} diff --git a/core/package.json b/packages/core/package.json similarity index 88% rename from core/package.json rename to packages/core/package.json index 7ffce11d0..f1a1f126e 100644 --- a/core/package.json +++ b/packages/core/package.json @@ -23,7 +23,9 @@ "postpublish": "yarn clean", "canary": "yarn build && auto canary", "ship": "auto release --prerelease --base-branch main", - "release": "yarn build && yarn ship" + "release": "yarn build && yarn ship", + "test": "jest", + "test:watch": "jest --watch" }, "dependencies": { "deep-equal": "^2.0.5", @@ -39,11 +41,13 @@ "rete-context-menu-plugin": "^0.6.0-rc.1", "rete-module-plugin": "^0.4.1", "rete-react-render-plugin": "^0.2.1", + "socket.io": "^4.5.0", "uuid": "^8.3.2" }, "devDependencies": { + "@babel/plugin-transform-runtime": "^7.18.2", "@rollup/plugin-babel": "^5.3.0", - "@types/jest": "^26.0.24", + "@types/jest": "^27.5.1", "@types/lodash": "^4.14.172", "@types/node": "^16.4.3", "@types/pubsub-js": "^1.8.2", @@ -52,11 +56,14 @@ "auto": "^10.32.0", "babel-loader": "^8.2.2", "copyfiles": "^2.4.1", + "jest": "^28.1.0", "rimraf": "^3.0.2", "style-loader": "^3.3.0", "terser-webpack-plugin": "^5.2.4", + "ts-jest": "^28.0.3", "ts-loader": "^9.2.6", - "typescript": "^4.2.0", + "typescript": "^4.6.4", + "vm2": "^3.9.9", "webpack": "^5.54.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.3.0" diff --git a/core/server.ts b/packages/core/server.ts similarity index 85% rename from core/server.ts rename to packages/core/server.ts index 81d2836d6..cae557439 100644 --- a/core/server.ts +++ b/packages/core/server.ts @@ -2,12 +2,12 @@ import { getComponents, components } from './src/components/components' import { initSharedEngine } from './src/engine' import { Task } from './src/plugins/taskPlugin/task' import { ThothComponent } from './src/thoth-component' -import SpellRunner from './src/utils/SpellRunner' export { getComponents } from './src/components/components' export { Task } from './src/plugins/taskPlugin/task' export { initSharedEngine } -export { SpellRunner } + +export * from './src/spellManager' export * from './src/utils/chainHelpers' export default { @@ -16,5 +16,4 @@ export default { initSharedEngine, Task, ThothComponent, - SpellRunner, } diff --git a/core/src/components/BooleanGate.ts b/packages/core/src/components/BooleanGate.ts similarity index 100% rename from core/src/components/BooleanGate.ts rename to packages/core/src/components/BooleanGate.ts diff --git a/core/src/components/Code.ts b/packages/core/src/components/Code.ts similarity index 100% rename from core/src/components/Code.ts rename to packages/core/src/components/Code.ts diff --git a/core/src/components/DifficultyDetector.ts b/packages/core/src/components/DifficultyDetector.ts similarity index 100% rename from core/src/components/DifficultyDetector.ts rename to packages/core/src/components/DifficultyDetector.ts diff --git a/core/src/components/EnkiTask.ts b/packages/core/src/components/EnkiTask.ts similarity index 100% rename from core/src/components/EnkiTask.ts rename to packages/core/src/components/EnkiTask.ts diff --git a/core/src/components/Generator.ts b/packages/core/src/components/Generator.ts similarity index 98% rename from core/src/components/Generator.ts rename to packages/core/src/components/Generator.ts index b96148d77..a6e525be2 100644 --- a/core/src/components/Generator.ts +++ b/packages/core/src/components/Generator.ts @@ -137,7 +137,7 @@ export class Generator extends ThothComponent> { const stop = node?.data?.stop ? stopSequence.split(',').map(i => { - if (i.includes('\n')) return i + if (i.includes('\\n')) return '\n' return i.trim() }) : '' @@ -164,7 +164,7 @@ export class Generator extends ThothComponent> { try { const raw = (await completion(body)) as string const result = raw - const composed = `${prompt} ${result}` + const composed = `${prompt}${result}` if (!silent) node.display(result) diff --git a/core/src/components/Huggingface.ts b/packages/core/src/components/Huggingface.ts similarity index 100% rename from core/src/components/Huggingface.ts rename to packages/core/src/components/Huggingface.ts diff --git a/packages/core/src/components/InRange.ts b/packages/core/src/components/InRange.ts new file mode 100644 index 000000000..0c52a8a82 --- /dev/null +++ b/packages/core/src/components/InRange.ts @@ -0,0 +1,76 @@ +import Rete from 'rete' + +import { NodeData, ThothNode, ThothWorkerInputs } from '../../types' +import { InputControl } from '../dataControls/InputControl' +import { triggerSocket, numSocket } from '../sockets' +import { ThothComponent } from '../thoth-component' + +const info = `The In Range component takes either a manually input set of numbers or a dynamically generated set of numbers as a boundary. When supplied with a value to test its existance between the set range, will trigger 1 of 2 outputs. If the number exists within the range including the start and end number, will trigger the true output else will trigger the false output.` + +export class InRange extends ThothComponent { + constructor() { + super('In Range') + + this.task = { + outputs: { true: 'option', false: 'option' }, + } + this.category = 'Logic' + this.info = info + } + + builder(node: ThothNode) { + const startNumSocket = new Rete.Input( + 'startNumber', + 'Start Number', + numSocket, + false + ) + + const endNumSocket = new Rete.Input( + 'endNumber', + 'End Number', + numSocket, + false + ) + const inspectorStartNumSocket = new InputControl({ + dataKey: 'startNumber', + name: 'Start Number', + defaultValue: 10, + }) + const inspectorEndNumSocket = new InputControl({ + dataKey: 'endNumber', + name: 'End Number', + defaultValue: 100, + }) + + const dataInput = new Rete.Input('trigger', 'Trigger', triggerSocket, true) + const testInput = new Rete.Input('input', 'Input To Test', numSocket) + + const isTrue = new Rete.Output('true', 'True', triggerSocket) + const isFalse = new Rete.Output('false', 'False', triggerSocket) + + node + .addInput(testInput) + .addInput(startNumSocket) + .addInput(endNumSocket) + .addInput(dataInput) + .addOutput(isTrue) + .addOutput(isFalse) + + node.inspector.add(inspectorStartNumSocket).add(inspectorEndNumSocket) + } + + worker(node: NodeData, inputs: ThothWorkerInputs) { + const startRange = + (inputs['startNumber'][0] as number) ?? (node.data.startNumber as number) + const endRange = + (inputs['endNumber'][0] as number) ?? (node.data.endNumber as number) + const numberToTest = inputs['input'][0] as number + + if (numberToTest >= startRange && numberToTest <= endRange) { + this._task.closed = ['false'] + } else { + this._task.closed = ['true'] + } + } +} diff --git a/core/src/components/Input.ts b/packages/core/src/components/Input.ts similarity index 94% rename from core/src/components/Input.ts rename to packages/core/src/components/Input.ts index 4e2650deb..764bcc917 100644 --- a/core/src/components/Input.ts +++ b/packages/core/src/components/Input.ts @@ -126,10 +126,13 @@ export class InputComponent extends ThothComponent { node.inspector.add(nameInput).add(togglePlaytest).add(toggleDefault) const value = node.data.text ? node.data.text : 'Input text here' - const input = new TextInputControl({ + + node.data.defaultValue = value + + const defaultInput = new TextInputControl({ editor: this.editor, key: 'text', - value, + value: node.data.defaultValue, label: 'Default value', }) @@ -137,7 +140,7 @@ export class InputComponent extends ThothComponent { // todo add this somewhere automated? Maybe wrap the modules builder in the plugin node.data.socketKey = node?.data?.socketKey || uuidv4() - return node.addOutput(out).addControl(input) + return node.addOutput(out).addControl(defaultInput) } worker( @@ -162,10 +165,10 @@ export class InputComponent extends ThothComponent { } } - // send default value if use default is explicity toggled on + // send default value if 'use default' is explicity toggled on if (node.data.useDefault) { return { - output: node.data.text as string, + output: node.data.defaultValue as string, } } diff --git a/core/src/components/JoinList.ts b/packages/core/src/components/JoinList.ts similarity index 100% rename from core/src/components/JoinList.ts rename to packages/core/src/components/JoinList.ts diff --git a/core/src/components/Output.ts b/packages/core/src/components/Output.ts similarity index 98% rename from core/src/components/Output.ts rename to packages/core/src/components/Output.ts index a250140a6..2cbc1cf9e 100644 --- a/core/src/components/Output.ts +++ b/packages/core/src/components/Output.ts @@ -78,6 +78,7 @@ export class Output extends ThothComponent { { silent, thoth }: { silent: boolean; thoth: EditorContext } ) { if (!inputs.input) throw new Error('No input provided to output component') + console.log({ inputs }) const text = inputs.input.filter(Boolean)[0] as string diff --git a/core/src/components/Spell.ts b/packages/core/src/components/Spell.ts similarity index 100% rename from core/src/components/Spell.ts rename to packages/core/src/components/Spell.ts diff --git a/core/src/components/StateRead.ts b/packages/core/src/components/StateRead.ts similarity index 100% rename from core/src/components/StateRead.ts rename to packages/core/src/components/StateRead.ts diff --git a/core/src/components/StateWrite.ts b/packages/core/src/components/StateWrite.ts similarity index 100% rename from core/src/components/StateWrite.ts rename to packages/core/src/components/StateWrite.ts diff --git a/core/src/components/StringProcessor.ts b/packages/core/src/components/StringProcessor.ts similarity index 100% rename from core/src/components/StringProcessor.ts rename to packages/core/src/components/StringProcessor.ts diff --git a/core/src/components/SwitchGate.ts b/packages/core/src/components/SwitchGate.ts similarity index 100% rename from core/src/components/SwitchGate.ts rename to packages/core/src/components/SwitchGate.ts diff --git a/core/src/components/TriggerIn.ts b/packages/core/src/components/TriggerIn.ts similarity index 97% rename from core/src/components/TriggerIn.ts rename to packages/core/src/components/TriggerIn.ts index e1bbee639..c6844ce8e 100644 --- a/core/src/components/TriggerIn.ts +++ b/packages/core/src/components/TriggerIn.ts @@ -101,10 +101,11 @@ export class TriggerIn extends ThothComponent { destroyed(node: ThothNode) { if (this.subscriptionMap[node.id]) this.subscriptionMap[node.id]() delete this.subscriptionMap[node.id] - if (this.triggerSubscriptionMap[node.id]) this.subscriptionMap[node.id]() + if (this.triggerSubscriptionMap[node.id]) + this.triggerSubscriptionMap[node.id]() delete this.triggerSubscriptionMap[node.id] if (this.triggerSubscriptionMap['default']) - this.subscriptionMap['default']() + this.triggerSubscriptionMap['default']() delete this.triggerSubscriptionMap['default'] } diff --git a/core/src/components/TriggerOut.ts b/packages/core/src/components/TriggerOut.ts similarity index 100% rename from core/src/components/TriggerOut.ts rename to packages/core/src/components/TriggerOut.ts diff --git a/core/src/components/VisualGeneration.ts b/packages/core/src/components/VisualGeneration.ts similarity index 100% rename from core/src/components/VisualGeneration.ts rename to packages/core/src/components/VisualGeneration.ts diff --git a/core/src/components/components.ts b/packages/core/src/components/components.ts similarity index 84% rename from core/src/components/components.ts rename to packages/core/src/components/components.ts index a2208ba7a..e52d76877 100644 --- a/core/src/components/components.ts +++ b/packages/core/src/components/components.ts @@ -1,6 +1,7 @@ -import { ActionTypeComponent } from './ActionType' +import { ActionTypeComponent } from './deprecated/ActionType' import { Alert } from './utility/AlertMessage' import { BooleanGate } from './BooleanGate' +import { InRange } from './InRange' import { Code } from './Code' import { InputFieldComponent } from './deprecated/InputField' import { ModuleInput } from './deprecated/ModuleInput' @@ -10,23 +11,23 @@ import { PlaytestPrint } from './deprecated/PlaytestPrint' import { RunInputComponent } from './deprecated/RunInput' import { DifficultyDetectorComponent } from './DifficultyDetector' import { EnkiTask } from './EnkiTask' -import { EntityDetector } from './EntityDetector' -import { ForEach } from './ForEach' +import { EntityDetector } from './deprecated/EntityDetector' +import { ForEach } from './deprecated/ForEach' import { Generator } from './Generator' import { HuggingfaceComponent } from './Huggingface' import { InputComponent } from './Input' -import { ItemTypeComponent } from './ItemDetector' +import { ItemTypeComponent } from './deprecated/ItemDetector' import { JoinListComponent } from './JoinList' import { Output } from './Output' -import { ProseToScript } from './ProseToScript' -import { SafetyVerifier } from './SafetyVerifier' +import { ProseToScript } from './deprecated/ProseToScript' +import { SafetyVerifier } from './deprecated/SafetyVerifier' import { SpellComponent } from './Spell' import { StateRead } from './StateRead' import { StateWrite } from './StateWrite' import { StringProcessor } from './StringProcessor' import { SwitchGate } from './SwitchGate' -import { TenseTransformer } from './TenseTransformer' -import { TimeDetectorComponent } from './TimeDetector' +import { TenseTransformer } from './deprecated/TenseTransformer' +import { TimeDetectorComponent } from './deprecated/TimeDetector' import { TriggerIn } from './TriggerIn' import { TriggerOut } from './TriggerOut' import { VisualGeneration } from './VisualGeneration' @@ -39,6 +40,7 @@ export const components = { actionTypeComponent: () => new ActionTypeComponent(), alert: () => new Alert(), booleanGate: () => new BooleanGate(), + inRange: () => new InRange(), code: () => new Code(), difficultyDetectorComponent: () => new DifficultyDetectorComponent(), echoComponent: () => new Echo(), diff --git a/core/src/components/ActionType.ts b/packages/core/src/components/deprecated/ActionType.ts similarity index 90% rename from core/src/components/ActionType.ts rename to packages/core/src/components/deprecated/ActionType.ts index e4b490ca4..c4ea5c6db 100644 --- a/core/src/components/ActionType.ts +++ b/packages/core/src/components/deprecated/ActionType.ts @@ -6,10 +6,10 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { stringSocket, triggerSocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { stringSocket, triggerSocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' const fewshot = `Given an action classify the type of action it is Types: look, get, use, craft, dialog, movement, travel, combat, consume, other @@ -48,6 +48,9 @@ export class ActionTypeComponent extends ThothComponent> { this.category = 'AI/ML' this.info = info this.display = true + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } // the builder is used to "assemble" the node component. diff --git a/core/src/components/EntityDetector.ts b/packages/core/src/components/deprecated/EntityDetector.ts similarity index 91% rename from core/src/components/EntityDetector.ts rename to packages/core/src/components/deprecated/EntityDetector.ts index db3ec3db9..404144efe 100644 --- a/core/src/components/EntityDetector.ts +++ b/packages/core/src/components/deprecated/EntityDetector.ts @@ -5,12 +5,12 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { EngineContext } from '../../types' -import { TaskOptions } from '../plugins/taskPlugin/task' -import { stringSocket, triggerSocket, arraySocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { EngineContext } from '../../../types' +import { TaskOptions } from '../../plugins/taskPlugin/task' +import { stringSocket, triggerSocket, arraySocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' const fewshot = `Given an action, detect what entities the player is interacting with. Ignore entities that the player is just asking about. Entity types: food, person, creature, object, place, other, none @@ -131,7 +131,7 @@ type WorkerReturn = { } export class EntityDetector extends ThothComponent< - Promise + Promise > { constructor() { // Name of the component @@ -148,6 +148,9 @@ export class EntityDetector extends ThothComponent< this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } // the builder is used to "assemble" the node component. diff --git a/core/src/components/ForEach.ts b/packages/core/src/components/deprecated/ForEach.ts similarity index 85% rename from core/src/components/ForEach.ts rename to packages/core/src/components/deprecated/ForEach.ts index cd569396d..d3cc90ad5 100644 --- a/core/src/components/ForEach.ts +++ b/packages/core/src/components/deprecated/ForEach.ts @@ -5,15 +5,17 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { arraySocket, triggerSocket, anySocket } from '../sockets' -import { ThothComponent, ThothTask } from '../thoth-component' +} from '../../../types' +import { arraySocket, triggerSocket, anySocket } from '../../sockets' +import { ThothComponent, ThothTask } from '../../thoth-component' const info = `The forEach component takes in an array, and will iterate over each item in the array, firing a new trigger signal with the appropriate value, until all items in the array have been processed.` type WorkerReturn = { element: string | string[] | unknown } export class ForEach extends ThothComponent> { + dev: true + constructor() { super('ForEach') this.task = { @@ -21,6 +23,9 @@ export class ForEach extends ThothComponent> { } this.category = 'Logic' this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated, it will be re-enabled once stabilized.' } builder(node: ThothNode) { diff --git a/core/src/components/deprecated/InputField.ts b/packages/core/src/components/deprecated/InputField.ts similarity index 100% rename from core/src/components/deprecated/InputField.ts rename to packages/core/src/components/deprecated/InputField.ts diff --git a/core/src/components/ItemDetector.ts b/packages/core/src/components/deprecated/ItemDetector.ts similarity index 84% rename from core/src/components/ItemDetector.ts rename to packages/core/src/components/deprecated/ItemDetector.ts index d272eb8b3..2d1f2df84 100644 --- a/core/src/components/ItemDetector.ts +++ b/packages/core/src/components/deprecated/ItemDetector.ts @@ -5,11 +5,11 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { EngineContext } from '../../types' -import { stringSocket, triggerSocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { EngineContext } from '../../../types' +import { stringSocket, triggerSocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' // For simplicity quests should be ONE thing not complete X and Y const fewshot = `Given an action, detect the item which is taken. @@ -38,6 +38,9 @@ export class ItemTypeComponent extends ThothComponent> { this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } builder(node: ThothNode) { diff --git a/core/src/components/deprecated/ModuleInput.ts b/packages/core/src/components/deprecated/ModuleInput.ts similarity index 100% rename from core/src/components/deprecated/ModuleInput.ts rename to packages/core/src/components/deprecated/ModuleInput.ts diff --git a/core/src/components/deprecated/ModuleOutput.ts b/packages/core/src/components/deprecated/ModuleOutput.ts similarity index 100% rename from core/src/components/deprecated/ModuleOutput.ts rename to packages/core/src/components/deprecated/ModuleOutput.ts diff --git a/core/src/components/deprecated/PlaytestInput.ts b/packages/core/src/components/deprecated/PlaytestInput.ts similarity index 100% rename from core/src/components/deprecated/PlaytestInput.ts rename to packages/core/src/components/deprecated/PlaytestInput.ts diff --git a/core/src/components/deprecated/PlaytestPrint.ts b/packages/core/src/components/deprecated/PlaytestPrint.ts similarity index 100% rename from core/src/components/deprecated/PlaytestPrint.ts rename to packages/core/src/components/deprecated/PlaytestPrint.ts diff --git a/core/src/components/ProseToScript.ts b/packages/core/src/components/deprecated/ProseToScript.ts similarity index 94% rename from core/src/components/ProseToScript.ts rename to packages/core/src/components/deprecated/ProseToScript.ts index 46e0cf081..95a53e529 100644 --- a/core/src/components/ProseToScript.ts +++ b/packages/core/src/components/deprecated/ProseToScript.ts @@ -5,10 +5,10 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { EngineContext } from '../../types' -import { stringSocket, triggerSocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { EngineContext } from '../../../types' +import { stringSocket, triggerSocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' const fewshot = (prose: string) => { const prompt = `Rewrite narrative snippets as a script: @@ -83,6 +83,9 @@ export class ProseToScript extends ThothComponent> { this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } builder(node: ThothNode) { diff --git a/core/src/components/deprecated/RunInput.ts b/packages/core/src/components/deprecated/RunInput.ts similarity index 100% rename from core/src/components/deprecated/RunInput.ts rename to packages/core/src/components/deprecated/RunInput.ts diff --git a/core/src/components/SafetyVerifier.ts b/packages/core/src/components/deprecated/SafetyVerifier.ts similarity index 88% rename from core/src/components/SafetyVerifier.ts rename to packages/core/src/components/deprecated/SafetyVerifier.ts index 4e675204b..64578c5bb 100644 --- a/core/src/components/SafetyVerifier.ts +++ b/packages/core/src/components/deprecated/SafetyVerifier.ts @@ -5,11 +5,11 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { EngineContext } from '../../types' -import { stringSocket, triggerSocket, booleanSocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { EngineContext } from '../../../types' +import { stringSocket, triggerSocket, booleanSocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' const fewshot = `Rate the actions according to the following content categories X: Explicit sexual content, rape, cannibalism, incest @@ -98,6 +98,9 @@ export class SafetyVerifier extends ThothComponent> { this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } builder(node: ThothNode) { diff --git a/core/src/components/TenseTransformer.ts b/packages/core/src/components/deprecated/TenseTransformer.ts similarity index 91% rename from core/src/components/TenseTransformer.ts rename to packages/core/src/components/deprecated/TenseTransformer.ts index 3966d6ae2..50931b8f5 100644 --- a/core/src/components/TenseTransformer.ts +++ b/packages/core/src/components/deprecated/TenseTransformer.ts @@ -5,14 +5,14 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { EngineContext } from '../../types' -import { stringSocket, triggerSocket } from '../sockets' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { EngineContext } from '../../../types' +import { stringSocket, triggerSocket } from '../../sockets' // @seang todo: convert data controls to typescript to remove this // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore -import { ThothComponent } from '../thoth-component' +import { ThothComponent } from '../../thoth-component' const fewshot = `Change each statement to be in the third person present tense and correct all grammar. Matt: am sleepy. @@ -93,6 +93,9 @@ export class TenseTransformer extends ThothComponent> { this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } // the builder is used to "assemble" the node component. diff --git a/core/src/components/TimeDetector.ts b/packages/core/src/components/deprecated/TimeDetector.ts similarity index 87% rename from core/src/components/TimeDetector.ts rename to packages/core/src/components/deprecated/TimeDetector.ts index ea31e9eb7..60fe2321d 100644 --- a/core/src/components/TimeDetector.ts +++ b/packages/core/src/components/deprecated/TimeDetector.ts @@ -5,11 +5,11 @@ import { ThothNode, ThothWorkerInputs, ThothWorkerOutputs, -} from '../../types' -import { FewshotControl } from '../dataControls/FewshotControl' -import { EngineContext } from '../../types' -import { stringSocket, triggerSocket } from '../sockets' -import { ThothComponent } from '../thoth-component' +} from '../../../types' +import { FewshotControl } from '../../dataControls/FewshotControl' +import { EngineContext } from '../../../types' +import { stringSocket, triggerSocket } from '../../sockets' +import { ThothComponent } from '../../thoth-component' // For simplicity quests should be ONE thing not complete X and Y const fewshot = `Given an action, predict how long it would take to complete out of the following categories: seconds, minutes, hours, days, weeks, years. @@ -55,6 +55,9 @@ export class TimeDetectorComponent extends ThothComponent< this.category = 'AI/ML' this.display = true this.info = info + this.deprecated = true + this.deprecationMessage = + 'This component has been deprecated. You can get similar functionality by using a generator with your own fewshots.' } builder(node: ThothNode) { diff --git a/core/src/components/utility/AlertMessage.ts b/packages/core/src/components/utility/AlertMessage.ts similarity index 100% rename from core/src/components/utility/AlertMessage.ts rename to packages/core/src/components/utility/AlertMessage.ts diff --git a/core/src/components/utility/Echo.ts b/packages/core/src/components/utility/Echo.ts similarity index 100% rename from core/src/components/utility/Echo.ts rename to packages/core/src/components/utility/Echo.ts diff --git a/core/src/controls/DisplayControl.js b/packages/core/src/controls/DisplayControl.js similarity index 100% rename from core/src/controls/DisplayControl.js rename to packages/core/src/controls/DisplayControl.js diff --git a/core/src/controls/RunButtonControl.js b/packages/core/src/controls/RunButtonControl.js similarity index 100% rename from core/src/controls/RunButtonControl.js rename to packages/core/src/controls/RunButtonControl.js diff --git a/core/src/controls/TextInputControl.js b/packages/core/src/controls/TextInputControl.js similarity index 100% rename from core/src/controls/TextInputControl.js rename to packages/core/src/controls/TextInputControl.js diff --git a/core/src/dataControls/CodeControl.js b/packages/core/src/dataControls/CodeControl.js similarity index 100% rename from core/src/dataControls/CodeControl.js rename to packages/core/src/dataControls/CodeControl.js diff --git a/core/src/dataControls/DropdownControl.ts b/packages/core/src/dataControls/DropdownControl.ts similarity index 100% rename from core/src/dataControls/DropdownControl.ts rename to packages/core/src/dataControls/DropdownControl.ts diff --git a/core/src/dataControls/EmptyControl.js b/packages/core/src/dataControls/EmptyControl.js similarity index 100% rename from core/src/dataControls/EmptyControl.js rename to packages/core/src/dataControls/EmptyControl.js diff --git a/core/src/dataControls/EnkiThroughputControl.js b/packages/core/src/dataControls/EnkiThroughputControl.js similarity index 100% rename from core/src/dataControls/EnkiThroughputControl.js rename to packages/core/src/dataControls/EnkiThroughputControl.js diff --git a/core/src/dataControls/FewshotControl.js b/packages/core/src/dataControls/FewshotControl.js similarity index 100% rename from core/src/dataControls/FewshotControl.js rename to packages/core/src/dataControls/FewshotControl.js diff --git a/core/src/dataControls/InputControl.ts b/packages/core/src/dataControls/InputControl.ts similarity index 100% rename from core/src/dataControls/InputControl.ts rename to packages/core/src/dataControls/InputControl.ts diff --git a/core/src/dataControls/InputGenerator.js b/packages/core/src/dataControls/InputGenerator.js similarity index 100% rename from core/src/dataControls/InputGenerator.js rename to packages/core/src/dataControls/InputGenerator.js diff --git a/core/src/dataControls/ModelControl.ts b/packages/core/src/dataControls/ModelControl.ts similarity index 100% rename from core/src/dataControls/ModelControl.ts rename to packages/core/src/dataControls/ModelControl.ts diff --git a/core/src/dataControls/OutputGenerator.js b/packages/core/src/dataControls/OutputGenerator.js similarity index 100% rename from core/src/dataControls/OutputGenerator.js rename to packages/core/src/dataControls/OutputGenerator.js diff --git a/core/src/dataControls/PlaytestControl.js b/packages/core/src/dataControls/PlaytestControl.js similarity index 100% rename from core/src/dataControls/PlaytestControl.js rename to packages/core/src/dataControls/PlaytestControl.js diff --git a/core/src/dataControls/SocketGenerator.ts b/packages/core/src/dataControls/SocketGenerator.ts similarity index 100% rename from core/src/dataControls/SocketGenerator.ts rename to packages/core/src/dataControls/SocketGenerator.ts diff --git a/core/src/dataControls/SpellControl.ts b/packages/core/src/dataControls/SpellControl.ts similarity index 100% rename from core/src/dataControls/SpellControl.ts rename to packages/core/src/dataControls/SpellControl.ts diff --git a/core/src/dataControls/SwitchControl.ts b/packages/core/src/dataControls/SwitchControl.ts similarity index 100% rename from core/src/dataControls/SwitchControl.ts rename to packages/core/src/dataControls/SwitchControl.ts diff --git a/core/src/editor.ts b/packages/core/src/editor.ts similarity index 90% rename from core/src/editor.ts rename to packages/core/src/editor.ts index 4c3096bfd..90a800274 100644 --- a/core/src/editor.ts +++ b/packages/core/src/editor.ts @@ -5,10 +5,9 @@ import ConnectionReroutePlugin from 'rete-connection-reroute-plugin' import ContextMenuPlugin from 'rete-context-menu-plugin' import ReactRenderPlugin from 'rete-react-render-plugin' import { Data } from 'rete/types/core/data' - import { EventsTypes, EditorContext } from '../types' import { getComponents } from './components/components' -import { initSharedEngine } from './engine' +import { initSharedEngine, ThothEngine } from './engine' // import CommentPlugin from './plugins/commentPlugin' import AreaPlugin from './plugins/areaPlugin' import DisplayPlugin from './plugins/displayPlugin' @@ -17,12 +16,19 @@ import InspectorPlugin from './plugins/inspectorPlugin' import LifecyclePlugin from './plugins/lifecyclePlugin' import { ModuleManager } from './plugins/modulePlugin/module-manager' import SocketGenerator from './plugins/socketGenerator' +import SocketOverridePlugin from './plugins/socketPlugin/socketOverridePlugin' import TaskPlugin, { Task } from './plugins/taskPlugin' import { PubSubContext, ThothComponent } from './thoth-component' import DebuggerPlugin from './plugins/debuggerPlugin' import KeyCodePlugin from './plugins/keyCodePlugin' import ModulePlugin from './plugins/modulePlugin' +import SocketPlugin from './plugins/socketPlugin' // import SelectionPlugin from './plugins/selectionPlugin' +import errorPlugin from './plugins/errorPlugin' + +interface ThothEngineClient extends ThothEngine { + thoth: EditorContext +} export class ThothEditor extends NodeEditor { tasks: Task[] pubSub: PubSubContext @@ -47,12 +53,16 @@ export const initEditor = async function ({ thoth, tab, node, + client, + feathers, }: { container: any pubSub: any thoth: any tab: any node: any + client?: any + feathers?: any }) { if (editorTabMap[tab.id]) editorTabMap[tab.id].clear() @@ -75,6 +85,10 @@ export const initEditor = async function ({ // ██║ ███████╗╚██████╔╝╚██████╔╝██║██║ ╚████║███████║ // ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝╚══════╝ + if (client && feathers) { + editor.use(SocketOverridePlugin, { client }) + } + // History plugin for undo/redo editor.use(HistoryPlugin, { keyboard: false }) @@ -135,18 +149,25 @@ export const initEditor = async function ({ components, server: false, modules: {}, - }) + }) as ThothEngineClient + engine.use(errorPlugin) + engine.thoth = thoth // @seang TODO: update types for editor.use rather than casting as unknown here, we may want to bring our custom rete directly into the monorepo at this point editor.onSpellUpdated = (spellId: string, callback: Function) => { return thoth.onSubspellUpdated(spellId, callback) } - // WARNING: ModulePlugin needs to be initialized before TaskPlugin during engine setup - editor.use(ModulePlugin, { engine, modules: {} } as unknown as void) - editor.use(TaskPlugin) editor.use(KeyCodePlugin) + if (client && feathers) { + editor.use(SocketPlugin, { client }) + } else { + // WARNING: ModulePlugin needs to be initialized before TaskPlugin during engine setup + editor.use(ModulePlugin, { engine, modules: {} } as unknown as void) + editor.use(TaskPlugin) + } + // editor.use(SelectionPlugin, { enabled: true }) // editor.use(CommentPlugin, { diff --git a/core/src/engine.ts b/packages/core/src/engine.ts similarity index 91% rename from core/src/engine.ts rename to packages/core/src/engine.ts index 5eb19934f..77afd336f 100644 --- a/core/src/engine.ts +++ b/packages/core/src/engine.ts @@ -1,6 +1,8 @@ +import io from 'socket.io' import Rete, { Engine } from 'rete' import { ChainData, ModuleType, NodeData, ThothWorkerInputs } from '../types' +import SocketPlugin from './plugins/socketPlugin' import debuggerPlugin from './plugins/debuggerPlugin' import ModulePlugin from './plugins/modulePlugin' import TaskPlugin, { Task } from './plugins/taskPlugin' @@ -28,6 +30,7 @@ export abstract class ThothEngineComponent { node: NodeData, inputs: ThothWorkerInputs, outputs: WorkerOutputs, + context: Record, ...args: unknown[] ): WorkerReturnType } @@ -40,6 +43,7 @@ export type InitEngineArguments = { server: boolean modules?: Record throwError?: Function + socket?: io.Socket } // @seang TODO: update this to not use positional arguments export const initSharedEngine = ({ @@ -48,6 +52,7 @@ export const initSharedEngine = ({ server = false, modules = {}, throwError, + socket, }: InitEngineArguments) => { const engine = new Rete.Engine(name) as ThothEngine @@ -55,6 +60,9 @@ export const initSharedEngine = ({ // WARNING: ModulePlugin needs to be initialized before TaskPlugin during engine setup engine.use(debuggerPlugin, { server: true, throwError }) engine.use(ModulePlugin, { engine, modules } as any) + if (socket) { + engine.use(SocketPlugin, { socket, server: true }) + } engine.use(TaskPlugin) } diff --git a/core/src/index.ts b/packages/core/src/index.ts similarity index 100% rename from core/src/index.ts rename to packages/core/src/index.ts diff --git a/core/src/plugins/areaPlugin/background.js b/packages/core/src/plugins/areaPlugin/background.js similarity index 100% rename from core/src/plugins/areaPlugin/background.js rename to packages/core/src/plugins/areaPlugin/background.js diff --git a/core/src/plugins/areaPlugin/index.js b/packages/core/src/plugins/areaPlugin/index.js similarity index 100% rename from core/src/plugins/areaPlugin/index.js rename to packages/core/src/plugins/areaPlugin/index.js diff --git a/core/src/plugins/areaPlugin/restrictor.js b/packages/core/src/plugins/areaPlugin/restrictor.js similarity index 100% rename from core/src/plugins/areaPlugin/restrictor.js rename to packages/core/src/plugins/areaPlugin/restrictor.js diff --git a/core/src/plugins/areaPlugin/snap.js b/packages/core/src/plugins/areaPlugin/snap.js similarity index 100% rename from core/src/plugins/areaPlugin/snap.js rename to packages/core/src/plugins/areaPlugin/snap.js diff --git a/core/src/plugins/areaPlugin/style.css b/packages/core/src/plugins/areaPlugin/style.css similarity index 100% rename from core/src/plugins/areaPlugin/style.css rename to packages/core/src/plugins/areaPlugin/style.css diff --git a/core/src/plugins/areaPlugin/utils.js b/packages/core/src/plugins/areaPlugin/utils.js similarity index 100% rename from core/src/plugins/areaPlugin/utils.js rename to packages/core/src/plugins/areaPlugin/utils.js diff --git a/core/src/plugins/areaPlugin/zoom-at.js b/packages/core/src/plugins/areaPlugin/zoom-at.js similarity index 100% rename from core/src/plugins/areaPlugin/zoom-at.js rename to packages/core/src/plugins/areaPlugin/zoom-at.js diff --git a/core/src/plugins/commentPlugin/comment.js b/packages/core/src/plugins/commentPlugin/comment.js similarity index 100% rename from core/src/plugins/commentPlugin/comment.js rename to packages/core/src/plugins/commentPlugin/comment.js diff --git a/core/src/plugins/commentPlugin/draggable.js b/packages/core/src/plugins/commentPlugin/draggable.js similarity index 100% rename from core/src/plugins/commentPlugin/draggable.js rename to packages/core/src/plugins/commentPlugin/draggable.js diff --git a/core/src/plugins/commentPlugin/frame-comment.js b/packages/core/src/plugins/commentPlugin/frame-comment.js similarity index 100% rename from core/src/plugins/commentPlugin/frame-comment.js rename to packages/core/src/plugins/commentPlugin/frame-comment.js diff --git a/core/src/plugins/commentPlugin/index.js b/packages/core/src/plugins/commentPlugin/index.js similarity index 100% rename from core/src/plugins/commentPlugin/index.js rename to packages/core/src/plugins/commentPlugin/index.js diff --git a/core/src/plugins/commentPlugin/inline-comment.js b/packages/core/src/plugins/commentPlugin/inline-comment.js similarity index 100% rename from core/src/plugins/commentPlugin/inline-comment.js rename to packages/core/src/plugins/commentPlugin/inline-comment.js diff --git a/core/src/plugins/commentPlugin/manager.js b/packages/core/src/plugins/commentPlugin/manager.js similarity index 100% rename from core/src/plugins/commentPlugin/manager.js rename to packages/core/src/plugins/commentPlugin/manager.js diff --git a/core/src/plugins/commentPlugin/style.css b/packages/core/src/plugins/commentPlugin/style.css similarity index 100% rename from core/src/plugins/commentPlugin/style.css rename to packages/core/src/plugins/commentPlugin/style.css diff --git a/core/src/plugins/commentPlugin/utils.js b/packages/core/src/plugins/commentPlugin/utils.js similarity index 100% rename from core/src/plugins/commentPlugin/utils.js rename to packages/core/src/plugins/commentPlugin/utils.js diff --git a/core/src/plugins/debuggerPlugin/ThothConsole.ts b/packages/core/src/plugins/debuggerPlugin/ThothConsole.ts similarity index 93% rename from core/src/plugins/debuggerPlugin/ThothConsole.ts rename to packages/core/src/plugins/debuggerPlugin/ThothConsole.ts index 02336b4e7..bb4fb01f7 100644 --- a/core/src/plugins/debuggerPlugin/ThothConsole.ts +++ b/packages/core/src/plugins/debuggerPlugin/ThothConsole.ts @@ -8,6 +8,7 @@ type ConsoleConstructor = { node: NodeData server: boolean throwError?: Function + isEngine?: boolean } export type Message = { @@ -25,6 +26,7 @@ export class ThothConsole { nodeView: NodeView isServer: boolean throwError?: Function + isEngine: boolean constructor({ component, @@ -32,14 +34,16 @@ export class ThothConsole { node, server, throwError, + isEngine = false, }: ConsoleConstructor) { this.component = component this.editor = editor this.node = node this.isServer = server + this.isEngine = isEngine if (throwError) this.throwError = throwError - if (server) return + if (server || isEngine) return const nodeValues = Array.from(editor.view.nodes) const foundNode = nodeValues.find(([, n]) => n.node.id === node.id) @@ -69,6 +73,7 @@ export class ThothConsole { } renderError() { + if (this.isEngine) return this.node.data.error = true this.updateNodeView() this.node.data.error = false diff --git a/core/src/plugins/debuggerPlugin/index.ts b/packages/core/src/plugins/debuggerPlugin/index.ts similarity index 58% rename from core/src/plugins/debuggerPlugin/index.ts rename to packages/core/src/plugins/debuggerPlugin/index.ts index 852a1bac4..7f460f2dd 100644 --- a/core/src/plugins/debuggerPlugin/index.ts +++ b/packages/core/src/plugins/debuggerPlugin/index.ts @@ -1,20 +1,11 @@ import { IRunContextEditor } from '../../../types' import { ThothComponent } from '../../thoth-component' -import { outputNameFromSocketKey } from '../../utils/nodeHelpers' import { ThothConsole } from './ThothConsole' function install( editor: IRunContextEditor, { server = false, throwError }: { server?: boolean; throwError?: Function } ) { - // const _log = console.log - - // console.log = function (message) { - // // if (editor.thoth.sendToDebug) editor.thoth.sendToDebug(message) - // console.warn('testing') - // return Function.prototype.bind.call(_log, arguments) - // } - editor.on('componentregister', (component: ThothComponent) => { const worker = component.worker @@ -36,17 +27,6 @@ function install( ...args, ]) - // Hacky way to handle when the spell component returns a response with a UUID in it - if (component.name === 'Spell') { - result = Object.entries(result).reduce((acc, [uuid, value]) => { - const name = outputNameFromSocketKey(node, uuid) - if (!name) return acc - - acc[name] = value - return acc - }, {} as Record) - } - node.console.log(result) return result diff --git a/core/src/plugins/displayPlugin/DisplayControl.js b/packages/core/src/plugins/displayPlugin/DisplayControl.js similarity index 100% rename from core/src/plugins/displayPlugin/DisplayControl.js rename to packages/core/src/plugins/displayPlugin/DisplayControl.js diff --git a/core/src/plugins/displayPlugin/index.js b/packages/core/src/plugins/displayPlugin/index.js similarity index 100% rename from core/src/plugins/displayPlugin/index.js rename to packages/core/src/plugins/displayPlugin/index.js diff --git a/packages/core/src/plugins/errorPlugin/index.ts b/packages/core/src/plugins/errorPlugin/index.ts new file mode 100644 index 000000000..1e4cfa54a --- /dev/null +++ b/packages/core/src/plugins/errorPlugin/index.ts @@ -0,0 +1,41 @@ +import { ThothComponent } from '@latitudegames/thoth-core/src/thoth-component' +import { IRunContextEditor, NodeData } from '../../../types' +import { ThothConsole } from '../debuggerPlugin/ThothConsole' + +function install( + engine: IRunContextEditor, + { server = false, throwError }: { server?: boolean; throwError?: Function } +) { + engine.on( + 'error', + ({ message, data }: { message: string; data: NodeData }) => { + const component = engine.components.get( + data.name + ) as unknown as ThothComponent + + if (!component) return + + const console = new ThothConsole({ + node: data, + component, + editor: engine, + server, + throwError, + isEngine: true, + }) + + if (message === 'Recursion detected') { + const error = new Error(`Recursion occured in node ID ${data.id}`) + + console.error(error) + } + } + ) +} + +const defaultExport = { + name: 'errorPlugin', + install, +} + +export default defaultExport diff --git a/core/src/plugins/historyPlugin/action.js b/packages/core/src/plugins/historyPlugin/action.js similarity index 100% rename from core/src/plugins/historyPlugin/action.js rename to packages/core/src/plugins/historyPlugin/action.js diff --git a/core/src/plugins/historyPlugin/actions/connection.js b/packages/core/src/plugins/historyPlugin/actions/connection.js similarity index 100% rename from core/src/plugins/historyPlugin/actions/connection.js rename to packages/core/src/plugins/historyPlugin/actions/connection.js diff --git a/core/src/plugins/historyPlugin/actions/node.js b/packages/core/src/plugins/historyPlugin/actions/node.js similarity index 100% rename from core/src/plugins/historyPlugin/actions/node.js rename to packages/core/src/plugins/historyPlugin/actions/node.js diff --git a/core/src/plugins/historyPlugin/history.js b/packages/core/src/plugins/historyPlugin/history.js similarity index 100% rename from core/src/plugins/historyPlugin/history.js rename to packages/core/src/plugins/historyPlugin/history.js diff --git a/core/src/plugins/historyPlugin/index.js b/packages/core/src/plugins/historyPlugin/index.js similarity index 100% rename from core/src/plugins/historyPlugin/index.js rename to packages/core/src/plugins/historyPlugin/index.js diff --git a/core/src/plugins/inspectorPlugin/DataControl.ts b/packages/core/src/plugins/inspectorPlugin/DataControl.ts similarity index 100% rename from core/src/plugins/inspectorPlugin/DataControl.ts rename to packages/core/src/plugins/inspectorPlugin/DataControl.ts diff --git a/core/src/plugins/inspectorPlugin/Inspector.ts b/packages/core/src/plugins/inspectorPlugin/Inspector.ts similarity index 99% rename from core/src/plugins/inspectorPlugin/Inspector.ts rename to packages/core/src/plugins/inspectorPlugin/Inspector.ts index cc40608c7..2ab437791 100644 --- a/core/src/plugins/inspectorPlugin/Inspector.ts +++ b/packages/core/src/plugins/inspectorPlugin/Inspector.ts @@ -264,6 +264,7 @@ export class Inspector { // update the node at the end ofthid this.node.update() + this.editor.trigger('save') } get() {} diff --git a/core/src/plugins/inspectorPlugin/dataControls/InfoControl.js b/packages/core/src/plugins/inspectorPlugin/dataControls/InfoControl.js similarity index 100% rename from core/src/plugins/inspectorPlugin/dataControls/InfoControl.js rename to packages/core/src/plugins/inspectorPlugin/dataControls/InfoControl.js diff --git a/core/src/plugins/inspectorPlugin/index.ts b/packages/core/src/plugins/inspectorPlugin/index.ts similarity index 100% rename from core/src/plugins/inspectorPlugin/index.ts rename to packages/core/src/plugins/inspectorPlugin/index.ts diff --git a/core/src/plugins/keyCodePlugin/index.ts b/packages/core/src/plugins/keyCodePlugin/index.ts similarity index 100% rename from core/src/plugins/keyCodePlugin/index.ts rename to packages/core/src/plugins/keyCodePlugin/index.ts diff --git a/core/src/plugins/lifecyclePlugin/index.ts b/packages/core/src/plugins/lifecyclePlugin/index.ts similarity index 100% rename from core/src/plugins/lifecyclePlugin/index.ts rename to packages/core/src/plugins/lifecyclePlugin/index.ts diff --git a/core/src/plugins/lifecyclePlugin/interfaces.ts b/packages/core/src/plugins/lifecyclePlugin/interfaces.ts similarity index 100% rename from core/src/plugins/lifecyclePlugin/interfaces.ts rename to packages/core/src/plugins/lifecyclePlugin/interfaces.ts diff --git a/core/src/plugins/lifecyclePlugin/utils.ts b/packages/core/src/plugins/lifecyclePlugin/utils.ts similarity index 100% rename from core/src/plugins/lifecyclePlugin/utils.ts rename to packages/core/src/plugins/lifecyclePlugin/utils.ts diff --git a/core/src/plugins/modulePlugin/index.ts b/packages/core/src/plugins/modulePlugin/index.ts similarity index 100% rename from core/src/plugins/modulePlugin/index.ts rename to packages/core/src/plugins/modulePlugin/index.ts diff --git a/core/src/plugins/modulePlugin/module-manager.ts b/packages/core/src/plugins/modulePlugin/module-manager.ts similarity index 100% rename from core/src/plugins/modulePlugin/module-manager.ts rename to packages/core/src/plugins/modulePlugin/module-manager.ts diff --git a/core/src/plugins/modulePlugin/module.ts b/packages/core/src/plugins/modulePlugin/module.ts similarity index 100% rename from core/src/plugins/modulePlugin/module.ts rename to packages/core/src/plugins/modulePlugin/module.ts diff --git a/core/src/plugins/modulePlugin/utils.ts b/packages/core/src/plugins/modulePlugin/utils.ts similarity index 100% rename from core/src/plugins/modulePlugin/utils.ts rename to packages/core/src/plugins/modulePlugin/utils.ts diff --git a/core/src/plugins/selectionPlugin/index.ts b/packages/core/src/plugins/selectionPlugin/index.ts similarity index 100% rename from core/src/plugins/selectionPlugin/index.ts rename to packages/core/src/plugins/selectionPlugin/index.ts diff --git a/core/src/plugins/socketGenerator/index.ts b/packages/core/src/plugins/socketGenerator/index.ts similarity index 100% rename from core/src/plugins/socketGenerator/index.ts rename to packages/core/src/plugins/socketGenerator/index.ts diff --git a/core/src/plugins/socketGenerator/socketManager.ts b/packages/core/src/plugins/socketGenerator/socketManager.ts similarity index 84% rename from core/src/plugins/socketGenerator/socketManager.ts rename to packages/core/src/plugins/socketGenerator/socketManager.ts index dbb6826ac..a48bba595 100644 --- a/core/src/plugins/socketGenerator/socketManager.ts +++ b/packages/core/src/plugins/socketGenerator/socketManager.ts @@ -1,9 +1,5 @@ -import { - ChainData, - DataSocketType, - ThothEditor, - ThothNode, -} from '../../../types' +import { ChainData, DataSocketType, ThothNode } from '../../../types' +import { ThothEditor } from '../../editor' import { ModuleSocketType } from '../modulePlugin/module-manager' export default class SocketManager { diff --git a/packages/core/src/plugins/socketPlugin/index.ts b/packages/core/src/plugins/socketPlugin/index.ts new file mode 100644 index 000000000..111a8ac57 --- /dev/null +++ b/packages/core/src/plugins/socketPlugin/index.ts @@ -0,0 +1,65 @@ +import io from 'socket.io' +import { IRunContextEditor, ThothComponent } from '../../../types' + +function install( + editor: IRunContextEditor, + // Need to better type the feathers client here + { + server = false, + socket, + client, + }: { server?: boolean; socket?: io.Socket; client?: any } +) { + const subscriptionMap = new Map() + + editor.on('componentregister', (component: ThothComponent) => { + const worker = component.worker + + component.worker = async (node, inputs, outputs, context, ...args) => { + if (server) { + const result = await worker.apply(component, [ + node, + inputs, + outputs, + context, + ...args, + ]) + + socket?.emit(`${node.id}`, { + output: result?.output, + }) + return result + } + + if (client) { + if (subscriptionMap.has(node.id)) return + // We may need to namespace this by spell as well + const unsubscribe = client.io.on( + node.id, + async (socketData: unknown) => { + const newContext = { + ...context, + socketOutput: socketData, + } + await worker.apply(component, [ + node, + inputs, + outputs, + newContext, + ...args, + ]) + } + ) + + subscriptionMap.set(node.id, unsubscribe) + } + } + }) +} + +const defaultExport = { + name: 'socketPlugin', + install, +} + +export default defaultExport diff --git a/packages/core/src/plugins/socketPlugin/socketOverridePlugin.ts b/packages/core/src/plugins/socketPlugin/socketOverridePlugin.ts new file mode 100644 index 000000000..a98dc617b --- /dev/null +++ b/packages/core/src/plugins/socketPlugin/socketOverridePlugin.ts @@ -0,0 +1,27 @@ +import io from 'socket.io' +import { IRunContextEditor, ThothComponent } from '../../../types' + +function install( + editor: IRunContextEditor, + // Need to better type the feathers client here + { + server = false, + socket, + client, + }: { server?: boolean; socket?: io.Socket; client?: any } +) { + editor.on('componentregister', (component: ThothComponent) => { + component.worker = async (node, inputs, outputs, context, ta, ...args) => { + if (context.socketOutput) { + return context.socketOutput + } + } + }) +} + +const defaultExport = { + name: 'socketOverridePlugin', + install, +} + +export default defaultExport diff --git a/core/src/plugins/taskPlugin/index.ts b/packages/core/src/plugins/taskPlugin/index.ts similarity index 96% rename from core/src/plugins/taskPlugin/index.ts rename to packages/core/src/plugins/taskPlugin/index.ts index 4c7d5b920..29a6ccf6c 100644 --- a/core/src/plugins/taskPlugin/index.ts +++ b/packages/core/src/plugins/taskPlugin/index.ts @@ -1,7 +1,7 @@ import { Component } from 'rete' import { NodeData } from 'rete/types/core/data' - -import { ThothEditor, ThothWorkerInputs } from '../../../types' +import { ThothEditor } from '../../editor' +import { ThothWorkerInputs } from '../../../types' import { ThothComponent } from '../../thoth-component' import { Task } from './task' diff --git a/core/src/plugins/taskPlugin/task.ts b/packages/core/src/plugins/taskPlugin/task.ts similarity index 97% rename from core/src/plugins/taskPlugin/task.ts rename to packages/core/src/plugins/taskPlugin/task.ts index 98f854a30..9432b33f5 100644 --- a/core/src/plugins/taskPlugin/task.ts +++ b/packages/core/src/plugins/taskPlugin/task.ts @@ -116,7 +116,12 @@ export class Task { const inputPromises = this.inputs[key] .filter((con: ThothReteInput) => { // only filter inputs to remove ones that are not the origin if a task option is true + console.log({ component: this.component, fromNode, con }) if (!this.component.task.runOneInput || !fromNode) return true + + // return true if the input is from a triggerless component + if (!con.task.node.outputs.trigger) return true + return con.task.node.id === fromNode.id }) .map(async (con: ThothReteInput) => { diff --git a/core/src/sockets.ts b/packages/core/src/sockets.ts similarity index 100% rename from core/src/sockets.ts rename to packages/core/src/sockets.ts diff --git a/packages/core/src/spellManager/SpellManager.ts b/packages/core/src/spellManager/SpellManager.ts new file mode 100644 index 000000000..c740cf6aa --- /dev/null +++ b/packages/core/src/spellManager/SpellManager.ts @@ -0,0 +1,41 @@ +import io from 'socket.io' +import { EngineContext, Spell } from '../../types' +import SpellRunner from './SpellRunner' + +export default class SpellManager { + spellRunnerMap: Map = new Map() + socket: io.Socket + thothInterface: EngineContext + + constructor(thothInterface: EngineContext, socket: io.Socket) { + this.socket = socket + this.thothInterface = thothInterface + } + + getSpellRunner(spellId: string) { + return this.spellRunnerMap.get(spellId) + } + + load(spell: Spell, overload: boolean = false) { + if (this.spellRunnerMap.has(spell.name) && !overload) + return this.getSpellRunner(spell.name) + + const spellRunner = new SpellRunner({ + thothInterface: this.thothInterface, + socket: this.socket, + }) + + spellRunner.loadSpell(spell) + + this.spellRunnerMap.set(spell.name, spellRunner) + + return spellRunner + } + + async run(spellId: string, inputs: Record) { + const runner = this.getSpellRunner(spellId) + const result = await runner?.defaultRun(inputs) + + return result + } +} diff --git a/core/src/utils/SpellRunner.ts b/packages/core/src/spellManager/SpellRunner.ts similarity index 93% rename from core/src/utils/SpellRunner.ts rename to packages/core/src/spellManager/SpellRunner.ts index 9ccb5de96..556b88943 100644 --- a/core/src/utils/SpellRunner.ts +++ b/packages/core/src/spellManager/SpellRunner.ts @@ -1,3 +1,4 @@ +import io from 'socket.io' import { EngineContext, ChainData, @@ -7,10 +8,11 @@ import { import { getComponents } from '../components/components' import { extractNodes, initSharedEngine, ThothEngine } from '../engine' import { Module } from '../plugins/modulePlugin/module' -import { extractModuleInputKeys } from './chainHelpers' +import { extractModuleInputKeys } from '../utils/chainHelpers' type RunSpellConstructor = { thothInterface: EngineContext + socket?: io.Socket } class SpellRunner { @@ -19,19 +21,23 @@ class SpellRunner { module: Module thothInterface: EngineContext ranSpells: string[] = [] + socket?: io.Socket | null = null - constructor({ thothInterface }: RunSpellConstructor) { + constructor({ thothInterface, socket }: RunSpellConstructor) { // Initialize the engine this.engine = initSharedEngine({ name: 'demo@0.1.0', components: getComponents(), server: true, modules: {}, + socket: socket || undefined, }) as ThothEngine // Set up the module to interface with the runtime processes this.module = new Module() + if (socket) this.socket = socket + // Set the interface that this runner will use when running workers this.thothInterface = thothInterface @@ -175,7 +181,7 @@ class SpellRunner { /** * Main spell runner for now. Processes inputs, gets the right component that starts the - * running. Would be even better iof we just took a node identifier, got its + * running. Would be even better if we just took a node identifier, got its * component, and ran the one triggered rather than this slightly hacky hard coded * method. */ @@ -192,7 +198,7 @@ class SpellRunner { // Set the current spell into the cache of spells that have run now. if (runSubspell) this.ranSpells.push(this.currentSpell.name) - // ensaure we run from a clean sloate + // ensure we run from a clean slate this._resetTasks() // load the inputs into module memory diff --git a/packages/core/src/spellManager/configureManager.ts b/packages/core/src/spellManager/configureManager.ts new file mode 100644 index 000000000..8db1bb9e2 --- /dev/null +++ b/packages/core/src/spellManager/configureManager.ts @@ -0,0 +1,8 @@ +const configureManager = () => { + // we need to fix this typing here to extend from express application instead (or feathers application?) + return (app: any) => { + app.userSpellManagers = new Map() + } +} + +export default configureManager diff --git a/packages/core/src/spellManager/index.ts b/packages/core/src/spellManager/index.ts new file mode 100644 index 000000000..b29ed481f --- /dev/null +++ b/packages/core/src/spellManager/index.ts @@ -0,0 +1,5 @@ +import SpellManager from './SpellManager' +import SpellRunner from './SpellRunner' +import configureManager from './configureManager' + +export { SpellManager, SpellRunner, configureManager } diff --git a/core/src/thoth-component.ts b/packages/core/src/thoth-component.ts similarity index 95% rename from core/src/thoth-component.ts rename to packages/core/src/thoth-component.ts index 70e02f7a2..b917d4cf5 100644 --- a/core/src/thoth-component.ts +++ b/packages/core/src/thoth-component.ts @@ -1,6 +1,6 @@ import { Node, Socket } from 'rete' - -import { PubSubBase, ThothEditor, ThothNode } from '../types' +import { ThothEditor } from './editor' +import { PubSubBase, ThothNode } from '../types' import { ThothEngineComponent } from './engine' import { Task, TaskOptions } from './plugins/taskPlugin/task' diff --git a/core/src/utils/chainHelpers.ts b/packages/core/src/utils/chainHelpers.ts similarity index 100% rename from core/src/utils/chainHelpers.ts rename to packages/core/src/utils/chainHelpers.ts diff --git a/core/src/utils/nodeHelpers.ts b/packages/core/src/utils/nodeHelpers.ts similarity index 100% rename from core/src/utils/nodeHelpers.ts rename to packages/core/src/utils/nodeHelpers.ts diff --git a/core/src/utils/runChain.ts b/packages/core/src/utils/runChain.ts similarity index 100% rename from core/src/utils/runChain.ts rename to packages/core/src/utils/runChain.ts diff --git a/packages/core/test/spellManager/SpellRunner.test.ts b/packages/core/test/spellManager/SpellRunner.test.ts new file mode 100644 index 000000000..cfc02934c --- /dev/null +++ b/packages/core/test/spellManager/SpellRunner.test.ts @@ -0,0 +1,337 @@ +import { ImageCacheResponse, OpenAIResultChoice } from './../../types' +import SpellRunner from '../../src/spellManager/SpellRunner' +import imageGeneratorSpell from '../../data/imageGeneratorSpell' +import thothInterfaceStub from '../../data/thothInterfaceStub' +import generatorSpell from '../../data/generatorSpell' +import codeSpell from '../../data/codeSpell' +import generatorSwitchSpell from '../../data/generatorSwitchSpell' +import readWriteStateSpell from '../../data/readWriteStateSpell' +import parentSpell from '../../data/parentSpell' +import subSpell from '../../data/subSpell' +import booleanGateSpell from '../../data/booleanGateSpell' +import joinListSpell from '../../data/joinListSpell' +import stringProcessorSpell from '../../data/stringProcessorSpell' +import inputOutputSpell from '../../data/inputOutputSpell' +import stateReadOutputSpell from '../../data/stateReadOutputSpell' + +require('regenerator-runtime/runtime') + +describe('SpellRunner', () => { + it('Returns an Image Cache Response from an Image Generator Component Spell', async () => { + const imageCacheMock = jest + .fn() + .mockImplementation((caption: string): Promise => { + return new Promise(resolve => + resolve({ + images: [ + { + imageUrl: + 'https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/48b384e5-823b-44de-a77a-5aad3ee03908.png', + }, + ], + } as ImageCacheResponse) + ) + }) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + readFromImageCache: imageCacheMock, + }, + }) + await runnerInstance.loadSpell(imageGeneratorSpell) + const imageSpellResult = await runnerInstance.defaultRun({ + input: 'imageprompt', + }) + expect(imageCacheMock).toBeCalledWith('imageprompt', undefined, undefined) + expect(imageSpellResult).toEqual({ + output: + 'https://aidungeon-images.s3.us-east-2.amazonaws.com/generated_images/48b384e5-823b-44de-a77a-5aad3ee03908.png', + }) + }) + it('Returns a Text Completion from an Generator Component Spell', async () => { + const completionMock = jest.fn().mockImplementation(() => { + return new Promise(resolve => resolve('completionresult')) as Promise< + string | OpenAIResultChoice + > + }) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + completion: completionMock, + }, + }) + await runnerInstance.loadSpell(generatorSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + input: 'textprompt', + }) + expect(completionMock).toBeCalledWith({ + frequencyPenalty: 0, + maxTokens: 50, + model: 'vanilla-jumbo', + prompt: 'textprompt', + stop: ['\n'], + temperature: 0.8, + }) + expect(generatorSpellResult).toEqual({ + output: 'textpromptcompletionresult', + }) + }) + it('Returns a Text Completion from an Generator Spell that uses a Switch Component', async () => { + const completionMock = jest.fn().mockImplementation(() => { + return new Promise(resolve => resolve('completionresult')) as Promise< + string | OpenAIResultChoice + > + }) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + completion: completionMock, + }, + }) + await runnerInstance.loadSpell(generatorSwitchSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + input: 'yes', + }) + expect(completionMock).toBeCalledWith({ + frequencyPenalty: 0, + maxTokens: 50, + model: 'vanilla-jumbo', + prompt: 'Generate', + stop: ['\n'], + temperature: 0.7, + }) + expect(generatorSpellResult).toEqual({ + output: 'completionresult', + }) + }) + it('Returns a Code component result from an Generator Spell that uses a Switch Component', async () => { + const completionMock = jest.fn().mockImplementation(() => { + return new Promise(resolve => resolve('completionresult')) as Promise< + string | OpenAIResultChoice + > + }) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + completion: completionMock, + }, + }) + await runnerInstance.loadSpell(generatorSwitchSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + input: 'no', + }) + expect(generatorSpellResult).toEqual({ + output: 'nope', + }) + }) + it('Returns result from an Code Component Spell', async () => { + const codeMock = jest + .fn() + .mockImplementation(thothInterfaceStub.processCode) + const runnerInstance = new SpellRunner({ + thothInterface: { ...thothInterfaceStub, processCode: codeMock }, + }) + await runnerInstance.loadSpell(codeSpell) + const codeSpellResult = await runnerInstance.defaultRun({ + input: 'textprompt', + }) + expect(codeMock).toBeCalledWith( + "\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return {modifiedInput: inputs.input + ' modified'}\n}\n", + { input: ['textprompt'] }, + {}, + {} + ) + expect(codeSpellResult).toEqual({ + output: 'textprompt modified', + }) + }) + + it('Returns result from an Read/Write State Component Spell', async () => { + let spellState = {} + const codeMock = jest + .fn() + .mockImplementation(thothInterfaceStub.processCode) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + processCode: codeMock, + getCurrentGameState: () => spellState, + setCurrentGameState: (state: Record) => { + spellState = state + }, + updateCurrentGameState: (state: Record) => { + spellState = { ...spellState, ...state } + }, + }, + }) + + await runnerInstance.loadSpell(readWriteStateSpell) + const readWriteStateSpellResult = await runnerInstance.defaultRun({ + input: 'textprompt', + }) + expect(codeMock).toBeCalledWith( + '\n// inputs: dictionary of inputs based on socket names\n// data: internal data of the node to read or write to nodes data state\n// state: access to the current game state in the state manager window. Return state to update the state.\nfunction worker(inputs, data, state) {\n\n // Keys of the object returned must match the names \n // of your outputs you defined.\n // To update the state, you must return the modified state.\n return inputs\n}\n', + { input: ['textprompt'] }, + {}, + { + input: 'textprompt', + } + ) + expect(readWriteStateSpellResult).toEqual({ + output: 'textprompt', + }) + }) + it('Returns an Echo component result from a SubSpell one layer down', async () => { + const nestedRunnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + }, + }) + const runSpellMock = jest + .fn() + .mockImplementation( + async ( + flattenedInputs: Record, + spellId: string, + state: Record + ) => { + await nestedRunnerInstance.loadSpell(subSpell) + const nestedSpellResult = await nestedRunnerInstance.defaultRun( + flattenedInputs + ) + console.log({ flattenedInputs, nestedSpellResult }) + return nestedSpellResult + } + ) + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + runSpell: runSpellMock, + }, + }) + await runnerInstance.loadSpell(parentSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + Input: 'echoThisInput', + }) + expect(runSpellMock).toHaveBeenCalledWith( + { + Input: 'echoThisInput', + }, + 'expected amethyst', + {} + ) + expect(generatorSpellResult).toEqual({ + 'output-233': 'echoThisInput', + }) + }) + it('Returns a Generator component result from a Boolean gate component', async () => { + const nestedRunnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + }, + }) + + const completionMock = jest.fn().mockImplementation(() => { + return new Promise(resolve => resolve('completionresult')) as Promise< + string | OpenAIResultChoice + > + }) + + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + completion: completionMock, + }, + }) + await runnerInstance.loadSpell(booleanGateSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + input: 'yes', + }) + + expect(generatorSpellResult).toEqual({ + output: 'completionresult', + }) + }) + it('Returns a Code component result from a Boolean gate component', async () => { + const nestedRunnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + }, + }) + + const completionMock = jest.fn().mockImplementation(() => { + return new Promise(resolve => resolve('completionresult')) as Promise< + string | OpenAIResultChoice + > + }) + + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + completion: completionMock, + }, + }) + await runnerInstance.loadSpell(booleanGateSpell) + const generatorSpellResult = await runnerInstance.defaultRun({ + input: 'maybe not', + }) + + expect(generatorSpellResult).toEqual({ + output: 'nope', + }) + }) + + it('Returns result from a Join List Component Spell', async () => { + const runnerInstance = new SpellRunner({ + thothInterface: { ...thothInterfaceStub }, + }) + await runnerInstance.loadSpell(joinListSpell) + const codeSpellResult = await runnerInstance.defaultRun({ + input: ['text', 'prompt'], + }) + expect(codeSpellResult).toEqual({ + output: '1 2 3', + }) + }) + + it('Returns result from a String Processor Component Spell', async () => { + const runnerInstance = new SpellRunner({ + thothInterface: { ...thothInterfaceStub }, + }) + await runnerInstance.loadSpell(stringProcessorSpell) + const codeSpellResult = await runnerInstance.defaultRun({ + input: ['text', 'prompt'], + }) + expect(codeSpellResult).toEqual({ + output: 'You said text,prompt!', + }) + }) + + it('Returns result from a Input Component Spell', async () => { + const runnerInstance = new SpellRunner({ + thothInterface: { ...thothInterfaceStub }, + }) + await runnerInstance.loadSpell(inputOutputSpell) + const codeSpellResult = await runnerInstance.defaultRun({ + Input: 'You said text,prompt!', + }) + expect(codeSpellResult).toEqual({ + 'output-233': 'You said text,prompt!', + }) + }) + it('Returns result from a State Read Component Spell', async () => { + const runnerInstance = new SpellRunner({ + thothInterface: { + ...thothInterfaceStub, + getCurrentGameState: () => { + return stateReadOutputSpell.gameState + }, + }, + }) + await runnerInstance.loadSpell(stateReadOutputSpell) + const codeSpellResult = await runnerInstance.defaultRun({}) + expect(codeSpellResult).toEqual({ + 'output-233': 'stateOutput', + }) + }) +}) diff --git a/core/tsconfig-release.json b/packages/core/tsconfig-release.json similarity index 100% rename from core/tsconfig-release.json rename to packages/core/tsconfig-release.json diff --git a/core/tsconfig.json b/packages/core/tsconfig.json similarity index 79% rename from core/tsconfig.json rename to packages/core/tsconfig.json index 142b03a2f..574168878 100644 --- a/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "allowJs": true, "module": "commonjs", @@ -17,5 +17,5 @@ "sourceMap": true }, "include": ["./"], - "exclude": ["./node_modules/", "./dist/"] + "exclude": ["./node_modules/", "./dist/", "./test", "./data"] } diff --git a/core/types.ts b/packages/core/types.ts similarity index 98% rename from core/types.ts rename to packages/core/types.ts index 1802993a5..9bef5117a 100644 --- a/core/types.ts +++ b/packages/core/types.ts @@ -17,8 +17,8 @@ import { ThothTask } from './src/thoth-component' import { ThothConsole } from './src/plugins/debuggerPlugin/ThothConsole' import { Data } from 'rete/types/core/data' export { ThothComponent } from './src/thoth-component' - -export { ThothEditor } from './src/editor' +//@seang this was causing test enviroment issues to have it shared client/server +// export { ThothEditor } from './src/editor' export type { InspectorData } from './src/plugins/inspectorPlugin/Inspector' diff --git a/core/webpack.common.js b/packages/core/webpack.common.js similarity index 91% rename from core/webpack.common.js rename to packages/core/webpack.common.js index 53a8cb607..6d5554096 100644 --- a/core/webpack.common.js +++ b/packages/core/webpack.common.js @@ -7,8 +7,8 @@ const LicenseWebpackPlugin = module.exports = () => { const config = { entry: { - index: './index.ts', - server: './server.ts', + index: ['regenerator-runtime/runtime.js', './index.ts'], + server: ['regenerator-runtime/runtime.js', './server.ts'], }, output: { path: path.join(__dirname, 'dist'), diff --git a/core/webpack.dev.js b/packages/core/webpack.dev.js similarity index 100% rename from core/webpack.dev.js rename to packages/core/webpack.dev.js diff --git a/core/webpack.prod.js b/packages/core/webpack.prod.js similarity index 100% rename from core/webpack.prod.js rename to packages/core/webpack.prod.js diff --git a/packages/runner/.editorconfig b/packages/runner/.editorconfig new file mode 100644 index 000000000..e717f5eb6 --- /dev/null +++ b/packages/runner/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/packages/runner/.env.example b/packages/runner/.env.example new file mode 100644 index 000000000..5f0601024 --- /dev/null +++ b/packages/runner/.env.example @@ -0,0 +1,2 @@ +LATITUDE_API_URL=https://api.latitude.io/ +LATITUDE_API_KEY=yoursupersecretapitoken \ No newline at end of file diff --git a/packages/runner/.eslintrc.json b/packages/runner/.eslintrc.json new file mode 100644 index 000000000..d0fbe2014 --- /dev/null +++ b/packages/runner/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "env": { + "es6": true, + "node": true, + "jest": true + }, + "parserOptions": { + "parser": "@typescript-eslint/parser", + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "indent": [ + "error", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-interface": "off" + } +} diff --git a/packages/runner/.gitignore b/packages/runner/.gitignore new file mode 100644 index 000000000..3a6182fbf --- /dev/null +++ b/packages/runner/.gitignore @@ -0,0 +1,113 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Users Environment Variables +.lock-wscript + +# IDEs and editors (shamelessly copied from @angular/cli's .gitignore) +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### OSX ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Others +lib/ +data/ +.env \ No newline at end of file diff --git a/packages/runner/README.md b/packages/runner/README.md new file mode 100644 index 000000000..a15854810 --- /dev/null +++ b/packages/runner/README.md @@ -0,0 +1,45 @@ +# @thoth/runner + +> Realtime spell running server + +## About + +This project uses [Feathers](http://feathersjs.com). An open source web framework for building modern real-time applications. + +## Getting Started + +Getting up and running is as easy as 1, 2, 3. + +1. Make sure you have [NodeJS](https://nodejs.org/) and [yarn](https://yarnpkg.com/) installed. +2. Install your dependencies + + ``` + cd path/to/@thoth/runner + yarn + ``` + +3. Start your app + + ``` + yarn start + ``` + +## Testing + +Simply run `yarn test` and all your tests in the `test/` directory will be run. + +## Scaffolding + +Feathers has a powerful command line interface. Here are a few things it can do: + +``` +$ yarn global add @feathersjs/cli # Install Feathers CLI + +$ feathers generate service # Generate a new Service +$ feathers generate hook # Generate a new Hook +$ feathers help # Show all commands +``` + +## Help + +For more information on all the things you can do with Feathers visit [docs.feathersjs.com](http://docs.feathersjs.com). diff --git a/packages/runner/config/default.json b/packages/runner/config/default.json new file mode 100644 index 000000000..ba1d3f01e --- /dev/null +++ b/packages/runner/config/default.json @@ -0,0 +1,31 @@ +{ + "host": "localhost", + "port": 3030, + "public": "../public/", + "paginate": { + "default": 10, + "max": 50 + }, + "authentication": { + "entity": "user", + "service": "users", + "secret": "hmjvvOTQU/JYpfaajnb8W0aXfps=", + "authStrategies": [ + "jwt", + "local" + ], + "jwtOptions": { + "header": { + "typ": "access" + }, + "audience": "https://yourdomain.com", + "issuer": "feathers", + "algorithm": "HS256", + "expiresIn": "1d" + }, + "local": { + "usernameField": "email", + "passwordField": "password" + } + } +} diff --git a/packages/runner/config/production.json b/packages/runner/config/production.json new file mode 100644 index 000000000..61c41d582 --- /dev/null +++ b/packages/runner/config/production.json @@ -0,0 +1,4 @@ +{ + "host": "@thoth/runner-app.feathersjs.com", + "port": "PORT" +} diff --git a/packages/runner/config/test.json b/packages/runner/config/test.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/runner/config/test.json @@ -0,0 +1 @@ +{} diff --git a/packages/runner/jest.config.js b/packages/runner/jest.config.js new file mode 100644 index 000000000..570708985 --- /dev/null +++ b/packages/runner/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + globals: { + 'ts-jest': { + diagnostics: false + } + } +}; diff --git a/packages/runner/package.json b/packages/runner/package.json new file mode 100644 index 000000000..62f7ed71e --- /dev/null +++ b/packages/runner/package.json @@ -0,0 +1,73 @@ +{ + "name": "@thoth/runner", + "description": "Realtime spell running server", + "version": "0.0.0", + "homepage": "", + "private": true, + "main": "src", + "keywords": [ + "feathers" + ], + "author": { + "name": "Michael Sharpe", + "email": "m.sharpe@project89.org" + }, + "contributors": [], + "bugs": {}, + "directories": { + "lib": "src", + "test": "test/", + "config": "config/" + }, + "scripts": { + "test": "yarn lint && yarn compile && yarn jest", + "lint": "eslint src/. test/. --config .eslintrc.json --ext .ts --fix", + "dev": "ts-node-dev --no-notify src/", + "start": "yarn compile && node lib/", + "jest": "jest --forceExit", + "compile": "shx rm -rf lib/ && tsc" + }, + "standard": { + "env": [ + "jest" + ], + "ignore": [] + }, + "types": "lib/", + "dependencies": { + "@feathersjs/authentication": "^4.5.11", + "@feathersjs/authentication-local": "^4.5.11", + "@feathersjs/authentication-oauth": "^4.5.11", + "@feathersjs/configuration": "^4.5.11", + "@feathersjs/errors": "^4.5.11", + "@feathersjs/express": "^4.5.11", + "@feathersjs/feathers": "^4.5.11", + "@feathersjs/socketio": "^4.5.11", + "@feathersjs/transport-commons": "^4.5.14", + "@latitudegames/thoth-core": "^0.0.68", + "@typescript-eslint/eslint-plugin": "^5.22.0", + "@typescript-eslint/parser": "^5.22.0", + "axios": "^0.27.2", + "compression": "^1.7.4", + "cors": "^2.8.5", + "dotenv": "^16.0.1", + "helmet": "^4.6.0", + "serve-favicon": "^2.5.0", + "vm2": "^3.9.9", + "winston": "^3.0.0" + }, + "devDependencies": { + "@types/compression": "^1.7.2", + "@types/cors": "^2.8.12", + "@types/jest": "^27.4.1", + "@types/jsonwebtoken": "^8.5.8", + "@types/serve-favicon": "^2.5.3", + "axios": "^0.27.2", + "eslint": "^8.6.0", + "jest": "^28.0.3", + "shx": "^0.3.4", + "ts-jest": "^27.1.4", + "ts-node-dev": "^2.0.0", + "typescript": "^4.5.4" + } +} diff --git a/packages/runner/public/favicon.ico b/packages/runner/public/favicon.ico new file mode 100644 index 000000000..7ed25a60b Binary files /dev/null and b/packages/runner/public/favicon.ico differ diff --git a/packages/runner/public/index.html b/packages/runner/public/index.html new file mode 100644 index 000000000..73128e5b0 --- /dev/null +++ b/packages/runner/public/index.html @@ -0,0 +1,75 @@ + + + + A FeathersJS application + + + + + +
    + + + +
    + + diff --git a/packages/runner/src/@types/index.d.ts b/packages/runner/src/@types/index.d.ts new file mode 100644 index 000000000..0c554cfab --- /dev/null +++ b/packages/runner/src/@types/index.d.ts @@ -0,0 +1 @@ +declare module 'ot-json0' diff --git a/packages/runner/src/api/axios.ts b/packages/runner/src/api/axios.ts new file mode 100644 index 000000000..42758e82e --- /dev/null +++ b/packages/runner/src/api/axios.ts @@ -0,0 +1,9 @@ +import axios from 'axios' +import { LATITUDE_API_KEY, LATITUDE_API_URL } from '../config' + +export const authRequest = axios.create({ + baseURL: LATITUDE_API_URL, + headers: { + 'x-api-key': LATITUDE_API_KEY, + }, +}) diff --git a/packages/runner/src/api/completion.ts b/packages/runner/src/api/completion.ts new file mode 100644 index 000000000..b10857a18 --- /dev/null +++ b/packages/runner/src/api/completion.ts @@ -0,0 +1,18 @@ +import { authRequest } from './axios' + +export const completion = async (request: Record) => { + try { + const response = await authRequest({ + url: '/text/completions_v2', + data: JSON.stringify(request), + }) + + console.log('response from completion', response) + + return response.data + } catch (err) { + console.log('Error in completion!') + console.log('Err', err) + return {} + } +} diff --git a/packages/runner/src/api/spell.ts b/packages/runner/src/api/spell.ts new file mode 100644 index 000000000..23f4bb384 --- /dev/null +++ b/packages/runner/src/api/spell.ts @@ -0,0 +1,46 @@ +import { authRequest } from './axios' + +export const getSpell = async (spellId: string) => { + try { + const response = await authRequest({ + url: `/game/spells/${spellId}`, + }) + + return response.data + } catch (err) { + console.log('Error getting spell!') + console.log('Err', err) + return {} + } +} + +type RunSpellArguments = { + spellId: string + inputs: Record + state?: Record + version?: string +} + +export const runSpell = async ({ + spellId, + version = 'latest', + inputs, + state = {}, +}: RunSpellArguments) => { + try { + const data = { + inputs, + state, + } + const response = await authRequest({ + url: `game/chains/${spellId}/${version}`, + data: JSON.stringify(data), + }) + + return response.data + } catch (err) { + console.log('Error running spell!') + console.log('Err', err) + return {} + } +} diff --git a/packages/runner/src/app.hooks.ts b/packages/runner/src/app.hooks.ts new file mode 100644 index 000000000..1be533832 --- /dev/null +++ b/packages/runner/src/app.hooks.ts @@ -0,0 +1,34 @@ +// Application hooks that run for every service +// Don't remove this comment. It's needed to format import lines nicely. + +export default { + before: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] + }, + + after: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] + }, + + error: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] + } +}; diff --git a/packages/runner/src/app.ts b/packages/runner/src/app.ts new file mode 100644 index 000000000..9686a3440 --- /dev/null +++ b/packages/runner/src/app.ts @@ -0,0 +1,85 @@ +import io from 'socket.io' +import path from 'path' +import favicon from 'serve-favicon' +import compress from 'compression' +import helmet from 'helmet' +import cors from 'cors' + +import feathers from '@feathersjs/feathers' +import configuration from '@feathersjs/configuration' +import express from '@feathersjs/express' +import socketio from '@feathersjs/socketio' + +import { Application } from './declarations' +import logger from './logger' +import middleware from './middleware' +import services from './services' +import appHooks from './app.hooks' +import channels from './channels' +import { HookContext as FeathersHookContext } from '@feathersjs/feathers' +import handleSockets from './sockets' +// import authentication from './authentication' +import { configureManager } from '@latitudegames/thoth-core/dist/server' +// Don't remove this comment. It's needed to format import lines nicely. + +const app: Application = express(feathers()) +export type HookContext = { app: Application } & FeathersHookContext + +// Load app configuration +app.configure(configuration()) +// Enable security, CORS, compression, favicon and body parsing +app.use( + helmet({ + contentSecurityPolicy: false, + }) +) +app.use(cors()) + +app.use(compress()) +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) +app.use(favicon(path.join(app.get('public'), 'favicon.ico'))) +// Host the public folder +app.use('/', express.static(app.get('public'))) + +// Set up Plugins and providers +app.configure(express.rest()) + +const socketOptions = { + origins: ['http://localhost:3003'], + + handlePreflightRequest: (_: any, res: any) => { + console.log('HANDLING PREFLIGHT!!') + res.writeHead(200, { + 'Access-Control-Allow-Origin': 'http://localhost:3003', + 'Access-Control-Allow-Methods': 'GET,POST', + 'Access-Control-Allow-Headers': 'Authorization', + 'Access-Control-Allow-Credentials': true, + }) + res.end() + }, +} + +// configures this needed for the spellManager +app.configure(configureManager()) +// Begins the entrypoint or where we handle our sockets +app.configure( + // This is hacky. But some socket options are required by typescript, but the library uses defaults. + socketio(socketOptions as unknown as io.ServerOptions, handleSockets(app)) +) + +// Configure other middleware (see `middleware/index.ts`) +app.configure(middleware) +// app.configure(authentication) +// Set up our services (see `services/index.ts`) +app.configure(services) +// Set up event channels (see channels.ts) +app.configure(channels) + +// Configure a middleware for 404s and the error handler +app.use(express.notFound()) +app.use(express.errorHandler({ logger } as any)) + +app.hooks(appHooks) + +export default app diff --git a/packages/runner/src/authentication.ts b/packages/runner/src/authentication.ts new file mode 100644 index 000000000..d95d01c8e --- /dev/null +++ b/packages/runner/src/authentication.ts @@ -0,0 +1,22 @@ +import { ServiceAddons } from '@feathersjs/feathers'; +import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication'; +import { LocalStrategy } from '@feathersjs/authentication-local'; +import { expressOauth } from '@feathersjs/authentication-oauth'; + +import { Application } from './declarations'; + +declare module './declarations' { + interface ServiceTypes { + 'authentication': AuthenticationService & ServiceAddons; + } +} + +export default function(app: Application): void { + const authentication = new AuthenticationService(app); + + authentication.register('jwt', new JWTStrategy()); + authentication.register('local', new LocalStrategy()); + + app.use('/authentication', authentication); + app.configure(expressOauth()); +} diff --git a/packages/runner/src/channels.ts b/packages/runner/src/channels.ts new file mode 100644 index 000000000..65d213bd0 --- /dev/null +++ b/packages/runner/src/channels.ts @@ -0,0 +1,65 @@ +import '@feathersjs/transport-commons'; +import { HookContext } from '@feathersjs/feathers'; +import { Application } from './declarations'; + +export default function(app: Application): void { + if(typeof app.channel !== 'function') { + // If no real-time functionality has been configured just return + return; + } + + app.on('connection', (connection: any): void => { + // On a new real-time connection, add it to the anonymous channel + app.channel('anonymous').join(connection); + }); + + app.on('login', (authResult: any, { connection }: any): void => { + // connection can be undefined if there is no + // real-time connection, e.g. when logging in via REST + if(connection) { + // Obtain the logged in user from the connection + // const user = connection.user; + + // The connection is no longer anonymous, remove it + app.channel('anonymous').leave(connection); + + // Add it to the authenticated user channel + app.channel('authenticated').join(connection); + + // Channels can be named anything and joined on any condition + + // E.g. to send real-time events only to admins use + // if(user.isAdmin) { app.channel('admins').join(connection); } + + // If the user has joined e.g. chat rooms + // if(Array.isArray(user.rooms)) user.rooms.forEach(room => app.channel(`rooms/${room.id}`).join(connection)); + + // Easily organize users by email and userid for things like messaging + // app.channel(`emails/${user.email}`).join(connection); + // app.channel(`userIds/${user.id}`).join(connection); + } + }); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + app.publish((data: any, hook: HookContext) => { + // Here you can add event publishers to channels set up in `channels.ts` + // To publish only for a specific event use `app.publish(eventname, () => {})` + + console.log('Publishing all events to all authenticated users. See `channels.ts` and https://docs.feathersjs.com/api/channels.html for more information.'); // eslint-disable-line + + // e.g. to publish all service events to all authenticated users use + return app.channel('authenticated'); + }); + + // Here you can also add service specific event publishers + // e.g. the publish the `users` service `created` event to the `admins` channel + // app.service('users').publish('created', () => app.channel('admins')); + + // With the userid and email organization from above you can easily select involved users + // app.service('messages').publish(() => { + // return [ + // app.channel(`userIds/${data.createdBy}`), + // app.channel(`emails/${data.recipientEmail}`) + // ]; + // }); +}; diff --git a/packages/runner/src/config.ts b/packages/runner/src/config.ts new file mode 100644 index 000000000..b0b6373d8 --- /dev/null +++ b/packages/runner/src/config.ts @@ -0,0 +1,4 @@ +export const LATITUDE_API_URL = + process.env.LATITUDE_API_URL || 'https://api.latitude.io/' + +export const LATITUDE_API_KEY = process.env.LATITUDE_API_KEY || 'youneedakey' diff --git a/packages/runner/src/declarations.d.ts b/packages/runner/src/declarations.d.ts new file mode 100644 index 000000000..948931f5f --- /dev/null +++ b/packages/runner/src/declarations.d.ts @@ -0,0 +1,9 @@ +import { Application as ExpressFeathers } from '@feathersjs/express' +import { SpellManager } from '@latitudegames/thoth-core/dist/server' + +// A mapping of service names to types. Will be extended in service files. +export interface ServiceTypes {} +// The application instance type that will be used everywhere else +export interface Application extends ExpressFeathers { + userSpellManagers?: Map +} diff --git a/packages/runner/src/index.ts b/packages/runner/src/index.ts new file mode 100644 index 000000000..1c62795b5 --- /dev/null +++ b/packages/runner/src/index.ts @@ -0,0 +1,18 @@ +import 'dotenv/config' +import logger from './logger' +import app from './app' + +const port = app.get('port') +const server = app.listen(port) + +process.on('unhandledRejection', (reason, p) => + logger.error('Unhandled Rejection at: Promise ', p, reason) +) + +server.on('listening', () => + logger.info( + 'Feathers application started on http://%s:%d', + app.get('host'), + port + ) +) diff --git a/packages/runner/src/logger.ts b/packages/runner/src/logger.ts new file mode 100644 index 000000000..739c222b0 --- /dev/null +++ b/packages/runner/src/logger.ts @@ -0,0 +1,16 @@ +import { createLogger, format, transports } from 'winston'; + +// Configure the Winston logger. For the complete documentation see https://github.com/winstonjs/winston +const logger = createLogger({ + // To see more detailed errors, change this to 'debug' + level: 'info', + format: format.combine( + format.splat(), + format.simple() + ), + transports: [ + new transports.Console() + ], +}); + +export default logger; diff --git a/packages/runner/src/middleware/index.ts b/packages/runner/src/middleware/index.ts new file mode 100644 index 000000000..e78268375 --- /dev/null +++ b/packages/runner/src/middleware/index.ts @@ -0,0 +1,6 @@ +import { Application } from '../declarations'; +// Don't remove this comment. It's needed to format import lines nicely. + +// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function +export default function (app: Application): void { +} diff --git a/packages/runner/src/services/index.ts b/packages/runner/src/services/index.ts new file mode 100644 index 000000000..d9adbdc5d --- /dev/null +++ b/packages/runner/src/services/index.ts @@ -0,0 +1,9 @@ +import { Application } from '../declarations'; +import users from './users/users.service'; +import spellRunner from './spell-runner/spell-runner.service'; +// Don't remove this comment. It's needed to format import lines nicely. + +export default function (app: Application): void { + app.configure(users); + app.configure(spellRunner); +} diff --git a/packages/runner/src/services/spell-runner/spell-runner.class.ts b/packages/runner/src/services/spell-runner/spell-runner.class.ts new file mode 100644 index 000000000..b2273d7f3 --- /dev/null +++ b/packages/runner/src/services/spell-runner/spell-runner.class.ts @@ -0,0 +1,125 @@ +import otJson0 from 'ot-json0' +import { + Id, + NullableId, + Paginated, + Params, + ServiceMethods, +} from '@feathersjs/feathers' +import { getSpell } from '../../api/spell' +import { Application } from '../../declarations' + +interface Data {} + +interface CreateData { + inputs: Record + spellId: string +} + +interface ServiceOptions {} + +type UserInfo = { + id: string +} +interface SpellRunnerParams extends Params { + user: UserInfo +} + +export class SpellRunner implements ServiceMethods { + app: Application + options: ServiceOptions + + constructor(options: ServiceOptions = {}, app: Application) { + this.options = options + this.app = app + } + + // eslint-disable-next-line @typescript-eslint/no-unused-varswaaaa + async find(params?: Params): Promise> { + return [] + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async get(id: Id, params?: SpellRunnerParams): Promise { + if (!this.app.userSpellManagers) return {} + if (!params) throw new Error('No params present in service') + + const { user } = params + + if (!user) throw new Error('No user is present in service') + // Here we get the users spellManagerApp + const spellManager = this.app.userSpellManagers.get(user.id) + + if (!spellManager) throw new Error('No spell manager created for user!') + + const spell = await getSpell(id as string) + + // Load the spell into the spellManager. If there is no spell runner, we make one. + const spellRunner = spellManager.load(spell) + + console.log('spellRunner loaded!', spellRunner) + + return spell + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async create( + data: CreateData, + params?: Params + ): Promise> { + if (!this.app.userSpellManagers) return {} + if (!params) throw new Error('No params present in service') + + const { user } = params + + if (!user) throw new Error('No user is present in service') + + const { inputs, spellId } = data + + const spellManager = this.app.userSpellManagers.get(user.id) + + if (!spellManager) throw new Error('No spell manager found for user!') + + const result = await spellManager.run(spellId, inputs) + + return result || {} + } + + async update( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + spellId: string, + data: { diff: Record }, + params?: Params + ): Promise { + if (!this.app.userSpellManagers) return {} + if (!params) throw new Error('No params present in service') + + const { user } = params + + if (!user) throw new Error('No user present in service') + + const { diff } = data + + const spellManager = this.app.userSpellManagers.get(user.id) + if (!spellManager) throw new Error('No spell manager found for user!') + + const spellRunner = spellManager.getSpellRunner(spellId) + if (!spellRunner) throw new Error('No spell runner found!') + + const spell = spellRunner.currentSpell + const updatedSpell = otJson0.type.apply(spell, diff) + + spellManager.load(updatedSpell, true) + return updatedSpell + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async patch(id: NullableId, data: Data, params?: Params): Promise { + return data + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async remove(id: NullableId, params?: Params): Promise { + return { id } + } +} diff --git a/packages/runner/src/services/spell-runner/spell-runner.hooks.ts b/packages/runner/src/services/spell-runner/spell-runner.hooks.ts new file mode 100644 index 000000000..82a8fcbc8 --- /dev/null +++ b/packages/runner/src/services/spell-runner/spell-runner.hooks.ts @@ -0,0 +1,39 @@ +// import { HooksObject } from '@feathersjs/feathers' +// import * as authentication from '@feathersjs/authentication' +// Don't remove this comment. It's needed to format import lines nicely. + +// const { authenticate } = authentication.hooks; + +export default { + before: { + // turning off authentication here for now. + // all: [ authenticate('jwt') ], + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [], + }, + + after: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [], + }, + + error: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [], + }, +} diff --git a/packages/runner/src/services/spell-runner/spell-runner.service.ts b/packages/runner/src/services/spell-runner/spell-runner.service.ts new file mode 100644 index 000000000..b3f7d0bbb --- /dev/null +++ b/packages/runner/src/services/spell-runner/spell-runner.service.ts @@ -0,0 +1,26 @@ +// Initializes the `spellRunner` service on path `/spell-runner` +import { ServiceAddons } from '@feathersjs/feathers'; +import { Application } from '../../declarations'; +import { SpellRunner } from './spell-runner.class'; +import hooks from './spell-runner.hooks'; + +// Add this service to the service type index +declare module '../../declarations' { + interface ServiceTypes { + 'spell-runner': SpellRunner & ServiceAddons; + } +} + +export default function (app: Application): void { + const options = { + paginate: app.get('paginate') + }; + + // Initialize our service with any options it requires + app.use('/spell-runner', new SpellRunner(options, app)); + + // Get our initialized service so that we can register hooks + const service = app.service('spell-runner'); + + service.hooks(hooks); +} diff --git a/packages/runner/src/services/users/users.class.ts b/packages/runner/src/services/users/users.class.ts new file mode 100644 index 000000000..9046baac3 --- /dev/null +++ b/packages/runner/src/services/users/users.class.ts @@ -0,0 +1,52 @@ +import { Id, NullableId, Paginated, Params, ServiceMethods } from '@feathersjs/feathers'; +import { Application } from '../../declarations'; + +interface Data {} + +interface ServiceOptions {} + +export class Users implements ServiceMethods { + app: Application; + options: ServiceOptions; + + constructor (options: ServiceOptions = {}, app: Application) { + this.options = options; + this.app = app; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async find (params?: Params): Promise> { + return []; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async get (id: Id, params?: Params): Promise { + return { + id, text: `A new message with ID: ${id}!` + }; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async create (data: Data, params?: Params): Promise { + if (Array.isArray(data)) { + return Promise.all(data.map(current => this.create(current, params))); + } + + return data; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async update (id: NullableId, data: Data, params?: Params): Promise { + return data; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async patch (id: NullableId, data: Data, params?: Params): Promise { + return data; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async remove (id: NullableId, params?: Params): Promise { + return { id }; + } +} diff --git a/packages/runner/src/services/users/users.hooks.ts b/packages/runner/src/services/users/users.hooks.ts new file mode 100644 index 000000000..b3429ce85 --- /dev/null +++ b/packages/runner/src/services/users/users.hooks.ts @@ -0,0 +1,42 @@ +import * as feathersAuthentication from '@feathersjs/authentication'; +import * as local from '@feathersjs/authentication-local'; +// Don't remove this comment. It's needed to format import lines nicely. + +const { authenticate } = feathersAuthentication.hooks; +const { hashPassword, protect } = local.hooks; + +export default { + before: { + all: [], + find: [ authenticate('jwt') ], + get: [ authenticate('jwt') ], + create: [ hashPassword('password') ], + update: [ hashPassword('password'), authenticate('jwt') ], + patch: [ hashPassword('password'), authenticate('jwt') ], + remove: [ authenticate('jwt') ] + }, + + after: { + all: [ + // Make sure the password field is never sent to the client + // Always must be the last hook + protect('password') + ], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] + }, + + error: { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] + } +}; diff --git a/packages/runner/src/services/users/users.service.ts b/packages/runner/src/services/users/users.service.ts new file mode 100644 index 000000000..0950123c6 --- /dev/null +++ b/packages/runner/src/services/users/users.service.ts @@ -0,0 +1,26 @@ +// Initializes the `users` service on path `/users` +import { ServiceAddons } from '@feathersjs/feathers'; +import { Application } from '../../declarations'; +import { Users } from './users.class'; +import hooks from './users.hooks'; + +// Add this service to the service type index +declare module '../../declarations' { + interface ServiceTypes { + 'users': Users & ServiceAddons; + } +} + +export default function (app: Application): void { + const options = { + paginate: app.get('paginate') + }; + + // Initialize our service with any options it requires + app.use('/users', new Users(options, app)); + + // Get our initialized service so that we can register hooks + const service = app.service('users'); + + service.hooks(hooks); +} diff --git a/packages/runner/src/sockets.ts b/packages/runner/src/sockets.ts new file mode 100644 index 000000000..8c457ce8c --- /dev/null +++ b/packages/runner/src/sockets.ts @@ -0,0 +1,53 @@ +// import io from 'socket.io' +import axios from 'axios' +import { SpellManager } from '@latitudegames/thoth-core/dist/server' +import { buildThothInterface } from './thothInterface' + +// interface FeathersSocket extends io.Socket { +// feathers: any +// } + +const getUserInfo = async (sessionId: string) => { + try { + const response = await axios({ + url: 'https://api.latitude.io/user/info', + headers: { + Authorization: `session ${sessionId}`, + }, + }) + + return response.data + } catch (err) { + console.log('Error getting usert info!') + console.log(err) + } +} + +const handleSockets = (app: any) => { + return (io: any) => { + // Another gross 'any' here + io.on('connection', async function (socket: any) { + console.log('CONNECTION ESTABLISHED') + const sessionId = socket.handshake.headers.authorization.split(' ')[1] + + if (!sessionId) throw new Error('No session id provided for handshake') + // Authenticate with the auth headers here + const user = await getUserInfo(sessionId) + + // Attach the user info to the params or use in services + socket.feathers.user = user + + // probably need to move interface instantiation into the runner rather than the spell manager. + // Doing it this way makes the interface shared across all spells + // Which messes up state stuff. + const thothInterface = buildThothInterface({}) + const spellManager = new SpellManager(thothInterface, socket) + + app.userSpellManagers.set(user.id, spellManager) + + socket.emit('connected') + }) + } +} + +export default handleSockets diff --git a/packages/runner/src/thothInterface.ts b/packages/runner/src/thothInterface.ts new file mode 100644 index 000000000..aed2d769e --- /dev/null +++ b/packages/runner/src/thothInterface.ts @@ -0,0 +1,93 @@ +import vm2 from 'vm2' +import { + EngineContext, + ThothWorkerInputs, +} from '@latitudegames/thoth-core/dist/types' +import { completion } from './api/completion' +import { runSpell } from './api/spell' + +export const buildThothInterface = ( + defaultState: Record +): EngineContext => { + // notes: need a way to replace state between runs? + + let gameState = { + ...defaultState, + } + + return { + // would be good to get a proper type in here + async completion(request: Record) { + const response = await completion(request) + return response + }, + getCurrentGameState: () => gameState, + setCurrentGameState: (state: Record) => { + gameState = state + }, + updateCurrentGameState: (update: Record) => { + const newState = { + ...gameState, + ...update, + } + gameState = newState + }, + async enkiCompletion() { + // Hit enki endpoint? + return { outputs: [] } + }, + async huggingface() { + return {} + }, + async runSpell(inputs: Record, spellId: string) { + return runSpell({ spellId, inputs }) + }, + async readFromImageCache() { + return { images: [] } + }, + processCode: ( + code: unknown, + inputs: ThothWorkerInputs, + data: Record, + state: Record + ) => { + const { VM } = vm2 + + const logValues: any[] = [] + + const sandboxConsole = { + log: (val: any, ...rest: any[]) => { + if (rest.length) { + logValues.push(JSON.stringify([val, ...rest], null, 2)) + } else { + logValues.push(JSON.stringify(val, null, 2)) + } + }, + } + + const flattenedInputs = Object.entries( + inputs as ThothWorkerInputs + ).reduce((acc, [key, value]) => { + // eslint-disable-next-line prefer-destructuring + acc[key as string] = value[0] // as any[][0] <- this change was made 2 days ago + return acc + }, {} as Record) + + const vm = new VM() + + vm.protect(state, 'state') + + vm.freeze(flattenedInputs, 'input') + vm.freeze(data, 'data') + vm.freeze(sandboxConsole, 'console') + + const codeToRun = `"use strict"; function runFn(input,data,state){ const copyFn=${code}; return copyFn(input,data,state)}; runFn(input,data,state);` + try { + return vm.run(codeToRun) + } catch (err) { + console.log({ err }) + throw new Error('Error in runChain: processCode.') + } + }, + } +} diff --git a/packages/runner/test/app.test.ts b/packages/runner/test/app.test.ts new file mode 100644 index 000000000..4f7d365eb --- /dev/null +++ b/packages/runner/test/app.test.ts @@ -0,0 +1,69 @@ +import assert from 'assert'; +import { Server } from 'http'; +import url from 'url'; +import axios from 'axios'; + +import app from '../src/app'; + +const port = app.get('port') || 8998; +const getUrl = (pathname?: string): string => url.format({ + hostname: app.get('host') || 'localhost', + protocol: 'http', + port, + pathname +}); + +describe('Feathers application tests (with jest)', () => { + let server: Server; + + beforeAll(done => { + server = app.listen(port); + server.once('listening', () => done()); + }); + + afterAll(done => { + server.close(done); + }); + + it('starts and shows the index page', async () => { + expect.assertions(1); + + const { data } = await axios.get(getUrl()); + + expect(data.indexOf('')).not.toBe(-1); + }); + + describe('404', () => { + it('shows a 404 HTML page', async () => { + expect.assertions(2); + + try { + await axios.get(getUrl('path/to/nowhere'), { + headers: { + 'Accept': 'text/html' + } + }); + } catch (error: any) { + const { response } = error; + + expect(response.status).toBe(404); + expect(response.data.indexOf('')).not.toBe(-1); + } + }); + + it('shows a 404 JSON error without stack trace', async () => { + expect.assertions(4); + + try { + await axios.get(getUrl('path/to/nowhere')); + } catch (error: any) { + const { response } = error; + + expect(response.status).toBe(404); + expect(response.data.code).toBe(404); + expect(response.data.message).toBe('Page not found'); + expect(response.data.name).toBe('NotFound'); + } + }); + }); +}); diff --git a/packages/runner/test/authentication.test.ts b/packages/runner/test/authentication.test.ts new file mode 100644 index 000000000..c92c9bb96 --- /dev/null +++ b/packages/runner/test/authentication.test.ts @@ -0,0 +1,32 @@ +import app from '../src/app'; + +describe('authentication', () => { + it('registered the authentication service', () => { + expect(app.service('authentication')).toBeTruthy(); + }); + + describe('local strategy', () => { + const userInfo = { + email: 'someone@example.com', + password: 'supersecret' + }; + + beforeAll(async () => { + try { + await app.service('users').create(userInfo); + } catch (error) { + // Do nothing, it just means the user already exists and can be tested + } + }); + + it('authenticates user and creates accessToken', async () => { + const { user, accessToken } = await app.service('authentication').create({ + strategy: 'local', + ...userInfo + }, {}); + + expect(accessToken).toBeTruthy(); + expect(user).toBeTruthy(); + }); + }); +}); diff --git a/packages/runner/test/services/spell-runner.test.ts b/packages/runner/test/services/spell-runner.test.ts new file mode 100644 index 000000000..41e1e8e98 --- /dev/null +++ b/packages/runner/test/services/spell-runner.test.ts @@ -0,0 +1,8 @@ +import app from '../../src/app'; + +describe('\'spellRunner\' service', () => { + it('registered the service', () => { + const service = app.service('spell-runner'); + expect(service).toBeTruthy(); + }); +}); diff --git a/packages/runner/test/services/users.test.ts b/packages/runner/test/services/users.test.ts new file mode 100644 index 000000000..20d1ebb3e --- /dev/null +++ b/packages/runner/test/services/users.test.ts @@ -0,0 +1,8 @@ +import app from '../../src/app'; + +describe('\'users\' service', () => { + it('registered the service', () => { + const service = app.service('users'); + expect(service).toBeTruthy(); + }); +}); diff --git a/packages/runner/tsconfig.json b/packages/runner/tsconfig.json new file mode 100644 index 000000000..116c0244d --- /dev/null +++ b/packages/runner/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2018", + "module": "commonjs", + "outDir": "./lib", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "typeRoots": ["./@types"] + }, + "exclude": ["test", "jest.config.js"] +} diff --git a/sharedb/@types/@teamwork/websocket-json-stream.d.ts b/packages/sharedb/@types/@teamwork/websocket-json-stream.d.ts similarity index 100% rename from sharedb/@types/@teamwork/websocket-json-stream.d.ts rename to packages/sharedb/@types/@teamwork/websocket-json-stream.d.ts diff --git a/sharedb/index.ts b/packages/sharedb/index.ts similarity index 100% rename from sharedb/index.ts rename to packages/sharedb/index.ts diff --git a/sharedb/package.json b/packages/sharedb/package.json similarity index 100% rename from sharedb/package.json rename to packages/sharedb/package.json diff --git a/sharedb/src/thothInterface.ts b/packages/sharedb/src/thothInterface.ts similarity index 100% rename from sharedb/src/thothInterface.ts rename to packages/sharedb/src/thothInterface.ts diff --git a/sharedb/tsconfig.json b/packages/sharedb/tsconfig.json similarity index 100% rename from sharedb/tsconfig.json rename to packages/sharedb/tsconfig.json diff --git a/runner-notes.md b/runner-notes.md new file mode 100644 index 000000000..0bc1e3190 --- /dev/null +++ b/runner-notes.md @@ -0,0 +1,29 @@ +- feathers server for primary work using socket IO +- user connects to the server with proper authentication headers right away +- when socket connects, we add a spellManager to the socket for use during the lifetime of the socket connection + - spell manager contains a map of all spell runners or each spell + - spell manager is responsible for initiating spell runners for spells not in the map + - spell manager is responsible for destroying a spell runner when a spell is removed from the session +- each open tab will request that spell connection, which will cause the spell manager to load the spell into memory for that sessions usage + - when a tab closes, we will remove that spell form the spell manager to conserve memory +- we can send custom events UP to the client, which we use to publish the events required by the spell runner + - node id of the worker that was ruin, as well as any results + - this comes from passing in the IO and socket connection to the spell manager + - spell manager boots up each spell runner with the IO and the socket +- we will likely want to create "channels" for the userId and the running spell. + - this channel would allow us to restrict the running of an individual spell to the owner itself + - allows us to target the right user when we are sending results of spell running +- when a spell "runs" we send a message to the spellRunner service with the spell we want to "run" + - spell runner service will then use the spell manager to find the spell loaded in memory + - spell runner runs that spell runner, which triggers off the sequence of emitted messages of each node + - should also send a "completed" message at the end of the runtime + - or perhaps we send back the result of the spell runner as the result of that running. + - this will keep us REST compliant as well, as the service will still return a result event without sockets + +Implementation notes + +- we want to find a way to still "run" the graph to take advantage of other plugins, like console. However we want this run of the graph to just be populated with cached data from the REAL run that happened on the server. +- As the spell is running on the server, it is pushing up values to the socket plugin which is caching those values for that node run. +- When the spell runner is done running the spell, it sends up a 'completed' event. When the client receives this event, it will trigger off the graph to "run" as normal. However, in doing so, each worker will only return the cached output data that was received during the server run phase. +- the worker returns this value, passing to the next node as normal. +- not sure quite how this will interact with having components which connect to full streams of data. In this case we actually just "play" and "pause" spells, and when playing they are streaming their events up to the client. diff --git a/yarn.lock b/yarn.lock index 628e4e1f9..6813229c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@auto-it/bot-list@10.32.0": version "10.32.0" resolved "https://registry.yarnpkg.com/@auto-it/bot-list/-/bot-list-10.32.0.tgz#3614b5fd04041f486b62fea98cc137ec83dc2f98" @@ -99,11 +107,23 @@ dependencies: "@babel/highlight" "^7.14.5" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + "@babel/core@^7.1.0", "@babel/core@^7.6.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": version "7.15.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" @@ -125,6 +145,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + "@babel/generator@^7.15.4", "@babel/generator@^7.7.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" @@ -134,6 +175,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" @@ -159,6 +209,16 @@ browserslist "^4.16.6" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" @@ -207,6 +267,13 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" @@ -223,6 +290,14 @@ "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" @@ -237,6 +312,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" @@ -272,6 +354,20 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" +"@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" @@ -289,6 +385,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== +"@babel/helper-plugin-utils@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" @@ -315,6 +416,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + "@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" @@ -329,6 +437,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" @@ -344,6 +459,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + "@babel/helper-wrap-function@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" @@ -363,6 +483,15 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" + "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -372,11 +501,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.16.7": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== +"@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" @@ -896,6 +1039,18 @@ babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" +"@babel/plugin-transform-runtime@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d" + integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" @@ -1098,6 +1253,15 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" @@ -1113,6 +1277,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.15.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" @@ -1129,6 +1309,14 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.17.0", "@babel/types@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1141,6 +1329,11 @@ dependencies: lodash.merge "^4.6.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@craco/craco@^5.5.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-5.9.0.tgz#dcd34330b558596a4841374743071b7fa041dce9" @@ -1150,6 +1343,15 @@ lodash "^4.17.15" webpack-merge "^4.2.2" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.5" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" @@ -1387,11 +1589,153 @@ ts-node "^9" tslib "^2" +"@eslint/eslintrc@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae" + integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@feathersjs/authentication-local@^4.5.11": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/authentication-local/-/authentication-local-4.5.14.tgz#512a27f914b383b18003bc74c9ab0139278a9340" + integrity sha512-kxMh62qsAghifpA7WTwGZufkf2w3Xlb63di/t+BDgPbMTHV5Tgk0r/TylTYuTGh/S5eKkj+Hdf9ZA125Gf4dgw== + dependencies: + "@feathersjs/authentication" "^4.5.14" + "@feathersjs/errors" "^4.5.12" + "@feathersjs/feathers" "^4.5.12" + bcryptjs "^2.4.3" + debug "^4.3.3" + lodash "^4.17.21" + +"@feathersjs/authentication-oauth@^4.5.11": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/authentication-oauth/-/authentication-oauth-4.5.14.tgz#7d5ef39daed75d182f28828affc2a0af58d87de6" + integrity sha512-U2Mw8Jig7T8UCg9+uu+vkfynIUwEbWDPcMflAjEBn8S4Hc5sRhGIXomHRgXqFoR7st6FslTWpcGQLLavjRCxBQ== + dependencies: + "@feathersjs/authentication" "^4.5.14" + "@feathersjs/errors" "^4.5.12" + "@feathersjs/express" "^4.5.14" + "@feathersjs/feathers" "^4.5.12" + debug "^4.3.3" + express-session "^1.17.2" + grant "^4.7.0" + grant-profile "^0.0.11" + lodash "^4.17.21" + +"@feathersjs/authentication@^4.5.11", "@feathersjs/authentication@^4.5.14": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/authentication/-/authentication-4.5.14.tgz#f69b9c031d0dd87e6772d108bdeb8dc034eec732" + integrity sha512-i/29Kcndacs7KpzDRZGI+P2stgDH3Fq8WU3OxFy2q7H3aAntX7gV74brBZZQdx0EQpfpWcyY4qXXRUDNnMohwQ== + dependencies: + "@feathersjs/errors" "^4.5.12" + "@feathersjs/feathers" "^4.5.12" + "@feathersjs/transport-commons" "^4.5.14" + "@types/jsonwebtoken" "^8.5.6" + debug "^4.3.3" + jsonwebtoken "^8.5.1" + lodash "^4.17.21" + long-timeout "^0.1.1" + uuid "^8.3.2" + +"@feathersjs/client@^4.5.14": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/client/-/client-4.5.14.tgz#d2573e7c59bb1586919e58d16ef45ed8bed2bd1c" + integrity sha512-hnZdLpSkTC+1dO3qezEtLTYUt6Nkw/jXD1DZqZaD/VeAsjcAA8z25lmdSa0VV6GZV/DuNApYsJwZxaj3MkP8Cw== + +"@feathersjs/commons@^4.5.12": + version "4.5.12" + resolved "https://registry.yarnpkg.com/@feathersjs/commons/-/commons-4.5.12.tgz#42e60e933849905b8803a3ebd7d4424f85ee7d3f" + integrity sha512-ss3yyk8HurmOCSD+wvENIrT9iSa8vg9SmikoP5c9JaLkbtMmKpH88jCjgRl7jiO54f2+UcjW3PqccNgUGSNSDQ== + +"@feathersjs/configuration@^4.5.11": + version "4.5.12" + resolved "https://registry.yarnpkg.com/@feathersjs/configuration/-/configuration-4.5.12.tgz#599fe446ff728c9c1008be05002e6aca47e9b44f" + integrity sha512-9fmEcz/yCB8lpzo3cB5uwiAp7rDzSSxGv+pHh6O5a3ZZoCL/7AZrh7/mZB2fFIBK2yAVE1GNdHkLXJI4OMWDGA== + dependencies: + "@feathersjs/feathers" "^4.5.12" + config "^3.3.6" + debug "^4.3.3" + +"@feathersjs/errors@^4.5.11", "@feathersjs/errors@^4.5.12": + version "4.5.12" + resolved "https://registry.yarnpkg.com/@feathersjs/errors/-/errors-4.5.12.tgz#c9d408a103e2ead228e6c61ea24516e6fe635a43" + integrity sha512-xIQJ7t/acTuL1fTC6mpf0qlcWfJkA9x0rRMrSgjD3mzUnJU6VqxXFxusL8895ksGD0vQHwPueblbm8Hn6Ifqqw== + dependencies: + debug "^4.3.3" + +"@feathersjs/express@^4.5.11", "@feathersjs/express@^4.5.14": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/express/-/express-4.5.14.tgz#5616bf76b32b83dc755ea9af33cbf1d6348599c0" + integrity sha512-kVMRiilBw767K1rYBOdLXYZGzwJb3pzKiOygUtSaZe6FsUmjJTycUz6pM7/ij1bI6WhzmSW0O4cfzmfoEXdejg== + dependencies: + "@feathersjs/commons" "^4.5.12" + "@feathersjs/errors" "^4.5.12" + "@types/express" "^4.17.13" + debug "^4.3.3" + express "^4.17.2" + lodash "^4.17.21" + uberproto "^2.0.6" + +"@feathersjs/feathers@^4.5.11", "@feathersjs/feathers@^4.5.12": + version "4.5.12" + resolved "https://registry.yarnpkg.com/@feathersjs/feathers/-/feathers-4.5.12.tgz#86a99e601a99cd3a30f9e8841039b052676f5168" + integrity sha512-24bxpMpheBrDmVwwByNPPfXnXk2KkeiW3NvE3xXHbt7QzZj3OrPJ8WS5MqUZMPMFSLMyqlhRKs+hpQgfWhuxrA== + dependencies: + "@feathersjs/commons" "^4.5.12" + debug "^4.3.3" + events "^3.3.0" + uberproto "^2.0.6" + +"@feathersjs/socketio@^4.5.11": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/socketio/-/socketio-4.5.14.tgz#1d36ed05625972dca42fcaf0aec7e9a91accd08b" + integrity sha512-FWs6kg2Nqsa+vZFmqlK88Cn+b2Ouj3IfEoVmH0Wtc/U68ikQWw+98Do1hG6xnhTd1HUEdekZ6k5JAAKsA+mGig== + dependencies: + "@feathersjs/transport-commons" "^4.5.14" + "@types/socket.io" "^2.1.11" + debug "^4.3.3" + socket.io "^2.3.0" + uberproto "^2.0.6" + +"@feathersjs/transport-commons@^4.5.14": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@feathersjs/transport-commons/-/transport-commons-4.5.14.tgz#d4797bdf881604bb426d0a67664407c2ec170db0" + integrity sha512-9cmWTB3+ewsVpdgO9tnz4nnw5XnbbblK9ofpWDw6crz3RlFnTVXS8icZa/qXKiMPhaYOL2oxnxCWWvuFnZ7nGw== + dependencies: + "@feathersjs/commons" "^4.5.12" + "@feathersjs/errors" "^4.5.12" + debug "^4.3.3" + lodash "^4.17.21" + radix-router "^3.0.1" + "@gar/promisify@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -1425,6 +1769,30 @@ jest-util "^27.2.3" slash "^3.0.0" +"@jest/console@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.0.2.tgz#d11e8b43ae431ae9b3112656848417ae4008fcad" + integrity sha512-tiRpnMeeyQuuzgL5UNSeiqMwF8UOWPbAE5rzcu/1zyq4oPG2Ox6xm4YCOruwbp10F8odWc+XwVxTyGzMSLMqxA== + dependencies: + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.0.2" + jest-util "^28.0.2" + slash "^3.0.0" + +"@jest/console@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176" + integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + "@jest/core@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.2.3.tgz#b21a3ffb69bef017c4562d27689bb798c0194501" @@ -1460,6 +1828,76 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.0.3.tgz#2b8223914ef6ae16ff740e65235ef8ef49c46d52" + integrity sha512-cCQW06vEZ+5r50SB06pOnSWsOBs7F+lswPYnKKfBz1ncLlj1sMqmvjgam8q40KhlZ8Ut4eNAL2Hvfx4BKIO2FA== + dependencies: + "@jest/console" "^28.0.2" + "@jest/reporters" "^28.0.3" + "@jest/test-result" "^28.0.2" + "@jest/transform" "^28.0.3" + "@jest/types" "^28.0.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.0.2" + jest-config "^28.0.3" + jest-haste-map "^28.0.2" + jest-message-util "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.0.3" + jest-resolve-dependencies "^28.0.3" + jest-runner "^28.0.3" + jest-runtime "^28.0.3" + jest-snapshot "^28.0.3" + jest-util "^28.0.2" + jest-validate "^28.0.2" + jest-watcher "^28.0.2" + micromatch "^4.0.4" + pretty-format "^28.0.2" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.0.tgz#784a1e6ce5358b46fcbdcfbbd93b1b713ed4ea80" + integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g== + dependencies: + "@jest/console" "^28.1.0" + "@jest/reporters" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.0.2" + jest-config "^28.1.0" + jest-haste-map "^28.1.0" + jest-message-util "^28.1.0" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-resolve-dependencies "^28.1.0" + jest-runner "^28.1.0" + jest-runtime "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + jest-watcher "^28.1.0" + micromatch "^4.0.4" + pretty-format "^28.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.2.3.tgz#3ae328d778a67e027bad27541d1c09ed94312609" @@ -1470,6 +1908,56 @@ "@types/node" "*" jest-mock "^27.2.3" +"@jest/environment@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.0.2.tgz#a865949d876b2d364b979bbc0a46338ffd23de26" + integrity sha512-IvI7dEfqVEffDYlw9FQfVBt6kXt/OI38V7QUIur0ulOQgzpKYJDVvLzj4B1TVmHWTGW5tcnJdlZ3hqzV6/I9Qg== + dependencies: + "@jest/fake-timers" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/node" "*" + jest-mock "^28.0.2" + +"@jest/environment@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.0.tgz#dedf7d59ec341b9292fcf459fd0ed819eb2e228a" + integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA== + dependencies: + "@jest/fake-timers" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + jest-mock "^28.1.0" + +"@jest/expect-utils@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.0.2.tgz#0a055868d225261eac82a12013e2e0735238774d" + integrity sha512-YryfH2zN5c7M8eLtn9oTBRj1sfD+X4cHNXJnTejqCveOS33wADEZUxJ7de5++lRvByNpRpfAnc8zTK7yrUJqgA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect-utils@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.0.tgz#a5cde811195515a9809b96748ae8bcc331a3538a" + integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.0.3.tgz#80e0233bee62586e1112f904d28b904dd1143ef2" + integrity sha512-VEzZr85bqNomgayQkR7hWG5HnbZYWYWagQriZsixhLmOzU6PCpMP61aeVhkCoRrg7ri5f7JDpeTPzDAajIwFHw== + dependencies: + expect "^28.0.2" + jest-snapshot "^28.0.3" + +"@jest/expect@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.0.tgz#2e5a31db692597070932366a1602b5157f0f217c" + integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA== + dependencies: + expect "^28.1.0" + jest-snapshot "^28.1.0" + "@jest/fake-timers@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.3.tgz#21cdef9cb9edd30c80026a0176eba58f5fbcaa67" @@ -1482,6 +1970,30 @@ jest-mock "^27.2.3" jest-util "^27.2.3" +"@jest/fake-timers@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.0.2.tgz#d36e62bc58f39d65ea6adac1ff7749e63aff05f3" + integrity sha512-R75yUv+WeybPa4ZVhX9C+8XN0TKjUoceUX+/QEaDVQGxZZOK50eD74cs7iMDTtpodh00d8iLlc9197vgF6oZjA== + dependencies: + "@jest/types" "^28.0.2" + "@sinonjs/fake-timers" "^9.1.1" + "@types/node" "*" + jest-message-util "^28.0.2" + jest-mock "^28.0.2" + jest-util "^28.0.2" + +"@jest/fake-timers@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.0.tgz#ea77878aabd5c5d50e1fc53e76d3226101e33064" + integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg== + dependencies: + "@jest/types" "^28.1.0" + "@sinonjs/fake-timers" "^9.1.1" + "@types/node" "*" + jest-message-util "^28.1.0" + jest-mock "^28.1.0" + jest-util "^28.1.0" + "@jest/globals@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.3.tgz#6b8d652083d78709b243d9571457058f1c6c5fea" @@ -1491,6 +2003,24 @@ "@jest/types" "^27.2.3" expect "^27.2.3" +"@jest/globals@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.0.3.tgz#70f68a06c863d1c9d14aea151c69b9690e3efeb4" + integrity sha512-q/zXYI6CKtTSIt1WuTHBYizJhH7K8h+xG5PE3C0oawLlPIvUMDYmpj0JX0XsJwPRLCsz/fYXHZVG46AaEhSPmw== + dependencies: + "@jest/environment" "^28.0.2" + "@jest/expect" "^28.0.3" + "@jest/types" "^28.0.2" + +"@jest/globals@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.0.tgz#a4427d2eb11763002ff58e24de56b84ba79eb793" + integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/expect" "^28.1.0" + "@jest/types" "^28.1.0" + "@jest/reporters@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.3.tgz#47c27be7c3e2069042b6fba12c1f8f62f91302db" @@ -1521,6 +2051,72 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" +"@jest/reporters@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.0.3.tgz#9996189e5552e37fcdffe0f41c07754f5d2ea854" + integrity sha512-xrbIc7J/xwo+D7AY3enAR9ZWYCmJ8XIkstTukTGpKDph0gLl/TJje9jl3dssvE4KJzYqMKiSrnE5Nt68I4fTEg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.0.2" + "@jest/test-result" "^28.0.2" + "@jest/transform" "^28.0.3" + "@jest/types" "^28.0.2" + "@jridgewell/trace-mapping" "^0.3.7" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-util "^28.0.2" + jest-worker "^28.0.2" + slash "^3.0.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.0" + +"@jest/reporters@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.0.tgz#5183a28b9b593b6000fa9b89b031c7216b58a9a0" + integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@jridgewell/trace-mapping" "^0.3.7" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-util "^28.1.0" + jest-worker "^28.1.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.0" + +"@jest/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + "@jest/source-map@^27.0.6": version "27.0.6" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" @@ -1530,6 +2126,15 @@ graceful-fs "^4.2.4" source-map "^0.6.0" +"@jest/source-map@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" + integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/test-result@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.2.3.tgz#7d8f790186c7ec7600edc1d8781656268f038255" @@ -1540,6 +2145,26 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.0.2.tgz#bc8e15a95347e3c2149572ae06a5a6fed939c522" + integrity sha512-4EUqgjq9VzyUiVTvZfI9IRJD6t3NYBNP4f+Eq8Zr93+hkJ0RrGU4OBTw8tfNzidKX+bmuYzn8FxqpxOPIGGCMA== + dependencies: + "@jest/console" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c" + integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ== + dependencies: + "@jest/console" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.2.3.tgz#a9e376b91a64c6f5ab37f05e9d304340609125d7" @@ -1550,6 +2175,26 @@ jest-haste-map "^27.2.3" jest-runtime "^27.2.3" +"@jest/test-sequencer@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.0.2.tgz#7669b7d8ff2aa7a8221b11bb37cce552de81b1bb" + integrity sha512-zhnZ8ydkZQTPL7YucB86eOlD79zPy5EGSUKiR2Iv93RVEDU6OEP33kwDBg70ywOcxeJGDRhyo09q7TafNCBiIg== + dependencies: + "@jest/test-result" "^28.0.2" + graceful-fs "^4.2.9" + jest-haste-map "^28.0.2" + slash "^3.0.0" + +"@jest/test-sequencer@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz#ce7294bbe986415b9a30e218c7e705e6ebf2cdf2" + integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ== + dependencies: + "@jest/test-result" "^28.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + slash "^3.0.0" + "@jest/transform@^27.2.3": version "27.2.3" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.2.3.tgz#1df37dbfe5bc29c00f227acae11348437a76b77e" @@ -1571,6 +2216,48 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.0.3.tgz#591fb5ebc1d84db5c5f21e1225c7406c35f5eb1e" + integrity sha512-+Y0ikI7SwoW/YbK8t9oKwC70h4X2Gd0OVuz5tctRvSV/EDQU00AAkoqevXgPSSFimUmp/sp7Yl8s/1bExDqOIg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.0.2" + "@jridgewell/trace-mapping" "^0.3.7" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.0.2" + jest-regex-util "^28.0.2" + jest-util "^28.0.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/transform@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.0.tgz#224a3c9ba4cc98e2ff996c0a89a2d59db15c74ce" + integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.0" + "@jridgewell/trace-mapping" "^0.3.7" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-regex-util "^28.0.2" + jest-util "^28.1.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1604,6 +2291,102 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.0.2.tgz#70b9538c1863fb060b2f438ca008b5563d00c5b4" + integrity sha512-hi3jUdm9iht7I2yrV5C4s3ucCJHUP8Eh3W6rQ1s4n/Qw9rQgsda4eqCt+r3BKRi7klVmZfQlMx1nGlzNMP2d8A== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519" + integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@latitudegames/thoth-core@0.0.69--canary.b8d4448.0": + version "0.0.69--canary.b8d4448.0" + resolved "https://npm.pkg.github.com/download/@latitudegames/thoth-core/0.0.69--canary.b8d4448.0/d15f186093165625dbc5dbfe8782588579f94473f168262b3cd00292a0c74db5#a45d886bbc67b6f33094b03df4468fe447b14ff9" + integrity sha512-8RbeqAQ6vNgt1u6RWWPHYsojkVtB1HwM0Y1btSqA2huosK0xo8LUsks2xCXg5Md/DoWdZlehYL+fGSrKDjzrnA== + dependencies: + deep-equal "^2.0.5" + handlebars "^4.7.7" + jsdom "^17.0.0" + license-webpack-plugin "^4.0.2" + path "^0.12.7" + react "^17.0.2" + regenerator-runtime "^0.13.9" + rete "https://github.com/latitudegames/rete.git#master" + rete-area-plugin "^0.2.1" + rete-connection-plugin "^0.9.0" + rete-context-menu-plugin "^0.6.0-rc.1" + rete-module-plugin "^0.4.1" + rete-react-render-plugin "^0.2.1" + socket.io "^4.5.0" + uuid "^8.3.2" + +"@latitudegames/thoth-core@^0.0.67": + version "0.0.67" + resolved "https://npm.pkg.github.com/download/@latitudegames/thoth-core/0.0.67/41babd5d6341947adce89dc7d6027bda9529a212617925c23d8a22146467f54b#e30318b84f1b3224edf3f9622fe8f9f7c09a2a15" + integrity sha512-Y6i1O1NI62R5fqewSnCM7ixXbr9VrraKN7lTGafhJCBrVVyi2r+8eOO2rCEJ+Hs4+0NbDTa01NaS8oViDL1HdA== + dependencies: + deep-equal "^2.0.5" + handlebars "^4.7.7" + jsdom "^17.0.0" + license-webpack-plugin "^4.0.2" + path "^0.12.7" + react "^17.0.2" + regenerator-runtime "^0.13.9" + rete "https://github.com/latitudegames/rete.git#master" + rete-area-plugin "^0.2.1" + rete-connection-plugin "^0.9.0" + rete-context-menu-plugin "^0.6.0-rc.1" + rete-module-plugin "^0.4.1" + rete-react-render-plugin "^0.2.1" + uuid "^8.3.2" + "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -2669,6 +3452,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@sinclair/typebox@^0.23.3": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -2688,6 +3476,18 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^9.1.1": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + "@styled-system/background@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba" @@ -2911,6 +3711,18 @@ resolved "https://registry.yarnpkg.com/@types/command-line-usage/-/command-line-usage-5.0.2.tgz#ba5e3f6ae5a2009d466679cc431b50635bf1a064" integrity sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg== +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/compression@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.2.tgz#7cc1cdb01b4730eea284615a68fc70a2cdfd5e71" + integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg== + dependencies: + "@types/express" "*" + "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -2918,6 +3730,23 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/engine.io@*": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/engine.io/-/engine.io-3.1.7.tgz#86e541a5dc52fb7e97735383564a6ae4cfe2e8f5" + integrity sha512-qNjVXcrp+1sS8YpRUa714r0pgzOwESdW5UjHL7D/2ZFdBX0BXUXtg1LUrp+ylvqbvMcMWUy73YpRoxPN2VoKAQ== + dependencies: + "@types/node" "*" + "@types/eslint-scope@^3.7.0": version "3.7.1" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" @@ -2953,7 +3782,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@^4.17.13": +"@types/express@*", "@types/express@^4.17.13": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -2963,7 +3792,7 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/graceful-fs@^4.1.2": +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== @@ -3025,16 +3854,44 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" +"@types/jest@^27.4.1": + version "27.4.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" + integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/jest@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.1.tgz#2c8b6dc6ff85c33bcd07d0b62cb3d19ddfdb3ab9" + integrity sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/jsonwebtoken@^8.5.6", "@types/jsonwebtoken@^8.5.8": + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" + integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== + dependencies: + "@types/node" "*" + "@types/lodash@^4.14.172": version "4.14.174" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.174.tgz#b4b06b6eced9850eed6b6a8f1abdd0f5192803c1" @@ -3060,6 +3917,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.1.tgz#f3647623199ca920960006b3dccf633ea905f243" integrity sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w== +"@types/node@>=10.0.0": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -3126,13 +3988,12 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.15": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.24.tgz#7e1b3f78d0fc53782543f9bce6d949959a5880bd" - integrity sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg== +"@types/react@*", "@types/react@17.0.2", "@types/react@^17.0.15", "@types/react@^17.0.24": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" + integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/regenerator-runtime@^0.13.1": @@ -3145,10 +4006,12 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/serve-favicon@^2.5.3": + version "2.5.3" + resolved "https://registry.yarnpkg.com/@types/serve-favicon/-/serve-favicon-2.5.3.tgz#6380c875059711090631abea8f3edc5906cccd32" + integrity sha512-HirXLRJjLXzwiSnjhE1vMu55X7+qaY+noXsKqi/7eK1uByl3L6TwkcALZuJnQXqOalMdmBz3b662yXvaR+89Vw== + dependencies: + "@types/express" "*" "@types/serve-static@*": version "1.13.10" @@ -3163,8 +4026,24 @@ resolved "https://registry.yarnpkg.com/@types/sharedb/-/sharedb-2.2.0.tgz#61a1ab5d1bc5596bf8b0933a7eafb5b7fad8b2f6" integrity sha512-VbsWaKdU/m9I9CUBtBSj+hcWMT8jr0mEg0qAebUxEwR2nreRKHC6/3WbhXKYqqaC36jDXleKv3TXnMMgTUioSQ== -"@types/source-list-map@*": - version "0.1.2" +"@types/socket.io-parser@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/socket.io-parser/-/socket.io-parser-3.0.0.tgz#9726d3ab9235757a0a30dd5ccf8975dce54e5e2c" + integrity sha512-Ry/rbTE6HQNL9eu3LpL1Ocup5VexXu1bSSGlSho/IR5LuRc8YvxwSNJ3JxqTltVJEATLbZkMQETSbxfKNgp4Ew== + dependencies: + socket.io-parser "*" + +"@types/socket.io@^2.1.11": + version "2.1.13" + resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.13.tgz#b6d694234e99956c96ff99e197eda824b6f9dc48" + integrity sha512-JRgH3nCgsWel4OPANkhH8TelpXvacAJ9VeryjuqCDiaVDMpLysd6sbt0dr6Z15pqH3p2YpOT3T1C5vQ+O/7uyg== + dependencies: + "@types/engine.io" "*" + "@types/node" "*" + "@types/socket.io-parser" "*" + +"@types/source-list-map@*": + version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== @@ -3173,6 +4052,16 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + "@types/tapable@^1": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" @@ -3244,6 +4133,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^4.31.1": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz#46d2370ae9311092f2a6f7246d28357daf2d4e89" @@ -3258,6 +4154,21 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a" + integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/type-utils" "5.22.0" + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/experimental-utils@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz#53a8267d16ca5a79134739129871966c56a59dc4" @@ -3280,6 +4191,16 @@ "@typescript-eslint/typescript-estree" "4.32.0" debug "^4.3.1" +"@typescript-eslint/parser@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178" + integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + debug "^4.3.2" + "@typescript-eslint/scope-manager@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz#e03c8668f8b954072b3f944d5b799c0c9225a7d5" @@ -3288,11 +4209,33 @@ "@typescript-eslint/types" "4.32.0" "@typescript-eslint/visitor-keys" "4.32.0" +"@typescript-eslint/scope-manager@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24" + integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + +"@typescript-eslint/type-utils@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19" + integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA== + dependencies: + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + tsutils "^3.21.0" + "@typescript-eslint/types@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.32.0.tgz#52c633c18da47aee09449144bf59565ab36df00d" integrity sha512-LE7Z7BAv0E2UvqzogssGf1x7GPpUalgG07nGCBYb1oK4mFsOiFC/VrSMKbZQzFJdN2JL5XYmsx7C7FX9p9ns0w== +"@typescript-eslint/types@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0" + integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw== + "@typescript-eslint/typescript-estree@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz#db00ccc41ccedc8d7367ea3f50c6994b8efa9f3b" @@ -3306,6 +4249,31 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97" + integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8" + integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/visitor-keys@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz#455ba8b51242f2722a497ffae29313f33b14cb7f" @@ -3314,6 +4282,14 @@ "@typescript-eslint/types" "4.32.0" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c" + integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg== + dependencies: + "@typescript-eslint/types" "5.22.0" + eslint-visitor-keys "^3.0.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -3661,12 +4637,17 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78" integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0: +acorn-walk@^8.0.0, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -3686,6 +4667,11 @@ acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +acorn@^8.7.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + add-px-to-style@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-px-to-style/-/add-px-to-style-1.0.0.tgz#d0c135441fa8014a8137904531096f67f28f263a" @@ -3701,6 +4687,11 @@ add@^2.0.6: resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" integrity sha1-JI8Kn25aUo7yKV2+7DBTITCuIjU= +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3750,7 +4741,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3874,6 +4865,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -3988,6 +4984,11 @@ array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.4: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + arraydiff@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/arraydiff/-/arraydiff-0.1.3.tgz#86a5436d7b72f1bdda5fd6d74e8724e42f83ce4d" @@ -4055,6 +5056,11 @@ async@^2.6.2, async@^2.6.3: dependencies: lodash "^4.17.14" +async@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -4112,6 +5118,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -4154,6 +5168,32 @@ babel-jest@^27.2.3: graceful-fs "^4.2.4" slash "^3.0.0" +babel-jest@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.0.3.tgz#843dc170da5b9671d4054ada9fdcd28f85f92a6e" + integrity sha512-S0ADyYdcrt5fp9YldRYWCUHdk1BKt9AkvBkLWBoNAEV9NoWZPIj5+MYhPcGgTS65mfv3a+Ymf2UqgWoAVd41cA== + dependencies: + "@jest/transform" "^28.0.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.0.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.0.tgz#95a67f8e2e7c0042e7b3ad3951b8af41a533b5ea" + integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w== + dependencies: + "@jest/transform" "^28.1.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.0.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -4205,6 +5245,17 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + babel-plugin-jest-hoist@^27.2.0: version "27.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" @@ -4215,6 +5266,16 @@ babel-plugin-jest-hoist@^27.2.0: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz#9307d03a633be6fc4b1a6bc5c3a87e22bd01dd3b" + integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.6.1: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" @@ -4318,6 +5379,14 @@ babel-preset-jest@^27.2.0: babel-plugin-jest-hoist "^27.2.0" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz#d8210fe4e46c1017e9fa13d7794b166e93aa9f89" + integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ== + dependencies: + babel-plugin-jest-hoist "^28.0.2" + babel-preset-current-node-syntax "^1.0.0" + babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -4367,16 +5436,31 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -4402,6 +5486,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bcryptjs@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= + before-after-hook@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" @@ -4429,6 +5518,11 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4476,6 +5570,24 @@ body-parser@1.19.2: raw-body "2.4.3" type-is "~1.6.18" +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -4636,6 +5748,17 @@ browserslist@^4.19.1: node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.20.2: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -4650,6 +5773,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4834,6 +5962,11 @@ caniuse-lite@^1.0.30001317: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz#c1546d7d7bb66506f0ccdad6a7d07fc6d668c858" integrity sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w== +caniuse-lite@^1.0.30001332: + version "1.0.30001335" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" + integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4983,6 +6116,11 @@ ci-info@^3.1.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5105,7 +6243,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -5124,11 +6262,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" @@ -5139,6 +6293,14 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.12.tgz#7938ab254e7bb1bba29b0fd1b4cc168889ca4d74" integrity sha512-lHID0PU+NtFzeNCwTL6JzUKdb6kDpyEjrwTD1H0cDZswTbsjLh2wTV2Eo2sNZLc0oSg0a5W1AI4Nj7bX4iIdjA== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -5221,11 +6383,26 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -5287,6 +6464,13 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" +config@^3.3.6: + version "3.3.7" + resolved "https://registry.yarnpkg.com/config/-/config-3.3.7.tgz#4310410dc2bf4e0effdca21a12a4035860a24ee4" + integrity sha512-mX/n7GKDYZMqvvkY6e6oBY49W8wxdmQt+ho/5lhwFDXqQW9gI+Ahp8EKp8VAbISPnmf2+Bv5uZK7lKXZ6pf1aA== + dependencies: + json5 "^2.1.1" + configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -5442,11 +6626,21 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@0.4.2: +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +cookie@0.4.2, cookie@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -5526,6 +6720,14 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cors@^2.8.5, cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" @@ -5617,7 +6819,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5816,13 +7018,34 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.7: +debug@^3.0.0, debug@^3.1.1, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.3.2, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -5901,7 +7124,7 @@ deep-extend@^0.6.0, deep-extend@~0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -5988,6 +7211,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -6006,6 +7234,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -6054,6 +7287,16 @@ diff-sequences@^27.0.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41" + integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -6114,6 +7357,13 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-accessibility-api@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz#8c2aa6325968f2933160a0b7dbb380893ddf3e7d" @@ -6221,6 +7471,11 @@ dotenv-webpack@^7.0.3: dependencies: dotenv-defaults "^2.0.2" +dotenv@^16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" + integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== + dotenv@^8.0.0, dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" @@ -6246,6 +7501,13 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + dependencies: + xtend "^4.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -6254,6 +7516,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -6264,6 +7533,11 @@ electron-to-chromium@^1.3.846: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.850.tgz#c56c72abfeab051b4b328beb894461c5912d0456" integrity sha512-ZzkDcdzePeF4dhoGZQT77V2CyJOpwfTZEOg4h0x6R/jQhGt/rIRpbRyVreWLtD7B/WsVxo91URm2WxMKR9JQZA== +electron-to-chromium@^1.4.118: + version "1.4.129" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz#c675793885721beefff99da50f57c6525c2cd238" + integrity sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ== + electron-to-chromium@^1.4.84: version "1.4.106" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a" @@ -6282,6 +7556,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -6297,6 +7576,11 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -6325,6 +7609,67 @@ endent@^2.0.1: fast-json-parse "^1.0.3" objectorarray "^1.0.5" +engine.io-client@~3.5.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" + integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + xmlhttprequest-ssl "~1.6.2" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.4.2" + +engine.io@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" + integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -6661,6 +8006,14 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -6673,11 +8026,73 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.6.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239" + integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw== + dependencies: + "@eslint/eslintrc" "^1.2.2" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -6690,6 +8105,11 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" @@ -6715,7 +8135,7 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0, events@^3.2.0: +events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6795,6 +8215,42 @@ expect@^27.2.3: jest-message-util "^27.2.3" jest-regex-util "^27.0.6" +expect@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.0.2.tgz#86f0d6fa971bc533faf68d4d103d00f343d6a4b3" + integrity sha512-X0qIuI/zKv98k34tM+uGeOgAC73lhs4vROF9MkPk94C1zujtwv4Cla8SxhWn0G1OwvG9gLLL7RjFBkwGVaZ83w== + dependencies: + "@jest/expect-utils" "^28.0.2" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.0.2" + jest-message-util "^28.0.2" + jest-util "^28.0.2" + +expect@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.0.tgz#10e8da64c0850eb8c39a480199f14537f46e8360" + integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw== + dependencies: + "@jest/expect-utils" "^28.1.0" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + +express-session@^1.17.2: + version "1.17.2" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.2.tgz#397020374f9bf7997f891b85ea338767b30d0efd" + integrity sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ== + dependencies: + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -6831,6 +8287,43 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +express@^4.17.2: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -6925,7 +8418,7 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -6946,6 +8439,17 @@ fast-glob@^3.1.1, fast-glob@^3.2.5: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-parse@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" @@ -6956,7 +8460,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -6987,6 +8491,27 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +feathers-authentication-client@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/feathers-authentication-client/-/feathers-authentication-client-0.3.3.tgz#d2183e4b08287dfd3ecb4a96eb081cf0b4e7c263" + integrity sha512-JWixbDrGnfAkc4i90HDDANms9AeDybckhOyYse9hTuN34JPMF+dXX4p0M6mXgRkYwa4N8GUxO1E3OuaiwcyF9w== + dependencies: + debug "^2.2.0" + feathers-errors "^2.4.0" + jwt-decode "^2.1.0" + +feathers-errors@^2.4.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/feathers-errors/-/feathers-errors-2.9.2.tgz#96ca0e5fe50cc56f0eccc90ce3fa5e1f8840828d" + integrity sha512-qwIX97bNW7+1tWVG073+omUA0rCYKJtTtwuzTrrvfrtdr8J8Dk1Fy4iaV9Fa6/YBD5AZu0lsplPE0iu4u/d4GQ== + dependencies: + debug "^3.0.0" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -7006,6 +8531,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -7041,6 +8573,19 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -7106,7 +8651,20 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flexlayout-react@^0.5.12: +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +flexlayout-react@^0.5.12: version "0.5.14" resolved "https://registry.yarnpkg.com/flexlayout-react/-/flexlayout-react-0.5.14.tgz#d4dcbcf3a152020abb403426298c38bcc64f4111" integrity sha512-blgap+7MxTr0PkANV/ya/RvCcmcGeqOA5N2bRpAsX4plexqsFN2RSbvdQlqt+z7uqJ7fmHLby6U2Md97DZPRww== @@ -7119,11 +8677,21 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.0.0: version "1.14.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== +follow-redirects@^1.14.9: + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -7462,12 +9030,19 @@ glob-parent@^6.0.0: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -7491,6 +9066,13 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.6.0, globals@^13.9.0: + version "13.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" + integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -7508,6 +9090,18 @@ globby@^11.0.1, globby@^11.0.2, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" @@ -7542,6 +9136,29 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grant-profile@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/grant-profile/-/grant-profile-0.0.11.tgz#1a3986f5721a12ad223394dcd400d194a781bac1" + integrity sha512-gfSFCZC2zmwkWYQ3rb2J6JbINbgExQgkjssOMJrKg1nq9izjP0Yzj5F0HzQuRUMi84onAo7dQJN4ZDVYXzavhw== + dependencies: + qs "^6.9.1" + request-compose "^1.2.1" + request-oauth "0.0.3" + +grant@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/grant/-/grant-4.7.0.tgz#ab879a38ced7860df668db6c66012aa02402f49b" + integrity sha512-QGPjCYDrBnb/OIiTRxbK3TnNOE6Ycgfc/GcgPzI4vyNIr+b7yisEexYp7VM74zj6bxr+mDTzfGONRLzzsVPJIA== + dependencies: + qs "^6.9.1" + request-compose "^1.2.1" + request-oauth "0.0.3" + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -7596,6 +9213,18 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -7693,6 +9322,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +helmet@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-4.6.0.tgz#579971196ba93c5978eb019e4e8ec0e50076b4df" + integrity sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg== + history@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/history/-/history-5.0.1.tgz#de35025ed08bce0db62364b47ebbf9d97b5eb06a" @@ -7841,6 +9475,17 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -7991,6 +9636,11 @@ ignore@^5.1.4, ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + immer@^9.0.6: version "9.0.6" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" @@ -8003,7 +9653,7 @@ import-cwd@^3.0.0: dependencies: import-from "^3.0.0" -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8041,6 +9691,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -8130,6 +9785,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -8194,6 +9854,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -8254,6 +9919,13 @@ is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.6.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -8351,6 +10023,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" @@ -8583,6 +10262,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -8615,6 +10299,11 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== +istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" @@ -8625,6 +10314,17 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -8651,6 +10351,14 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +istanbul-reports@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + java-properties@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" @@ -8665,6 +10373,14 @@ jest-changed-files@^27.2.3: execa "^5.0.0" throat "^6.0.1" +jest-changed-files@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" + integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== + dependencies: + execa "^5.0.0" + throat "^6.0.1" + jest-circus@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.2.3.tgz#e46ed567b316323f0b7c12dc72cd12fe46656356" @@ -8690,6 +10406,56 @@ jest-circus@^27.2.3: stack-utils "^2.0.3" throat "^6.0.1" +jest-circus@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.0.3.tgz#45f77090b4b9fe5c1b84f72816868c9d4c0f57b1" + integrity sha512-HJ3rUCm3A3faSy7KVH5MFCncqJLtrjEFkTPn9UIcs4Kq77+TXqHsOaI+/k73aHe6DJQigLUXq9rCYj3MYFlbIw== + dependencies: + "@jest/environment" "^28.0.2" + "@jest/expect" "^28.0.3" + "@jest/test-result" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.0.2" + jest-matcher-utils "^28.0.2" + jest-message-util "^28.0.2" + jest-runtime "^28.0.3" + jest-snapshot "^28.0.3" + jest-util "^28.0.2" + pretty-format "^28.0.2" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-circus@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.0.tgz#e229f590911bd54d60efaf076f7acd9360296dae" + integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/expect" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.0" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-runtime "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + pretty-format "^28.1.0" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + jest-cli@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.2.3.tgz#68add5b1626bd5502df6c7a4a4d574ebf797221a" @@ -8708,6 +10474,42 @@ jest-cli@^27.2.3: prompts "^2.0.1" yargs "^16.0.3" +jest-cli@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.0.3.tgz#4a4e55078ec772e0ea2583dd4c4b38fb306dc556" + integrity sha512-NCPTEONCnhYGo1qzPP4OOcGF04YasM5GZSwQLI1HtEluxa3ct4U65IbZs6DSRt8XN1Rq0jhXwv02m5lHB28Uyg== + dependencies: + "@jest/core" "^28.0.3" + "@jest/test-result" "^28.0.2" + "@jest/types" "^28.0.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.0.3" + jest-util "^28.0.2" + jest-validate "^28.0.2" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-cli@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.0.tgz#cd1d8adb9630102d5ba04a22895f63decdd7ac1f" + integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ== + dependencies: + "@jest/core" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + prompts "^2.0.1" + yargs "^17.3.1" + jest-config@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.2.3.tgz#64606cd1f194fb9527cbbc3e4ff23b324653b992" @@ -8735,6 +10537,62 @@ jest-config@^27.2.3: micromatch "^4.0.4" pretty-format "^27.2.3" +jest-config@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.0.3.tgz#9c0556d60d692153a6bc8652974182c22db9244f" + integrity sha512-3gWOEHwGpNhyYOk9vnUMv94x15QcdjACm7A3lERaluwnyD6d1WZWe9RFCShgIXVOHzRfG1hWxsI2U0gKKSGgDQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.0.2" + "@jest/types" "^28.0.2" + babel-jest "^28.0.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.0.3" + jest-environment-node "^28.0.2" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.0.3" + jest-runner "^28.0.3" + jest-util "^28.0.2" + jest-validate "^28.0.2" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.0.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.0.tgz#fca22ca0760e746fe1ce1f9406f6b307ab818501" + integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.0" + "@jest/types" "^28.1.0" + babel-jest "^28.1.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.0" + jest-environment-node "^28.1.0" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-runner "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-diff@^26.0.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" @@ -8765,6 +10623,36 @@ jest-diff@^27.2.3: jest-get-type "^27.0.6" pretty-format "^27.2.3" +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.0.2.tgz#a543c90082560cd6cb14c5f28c39e6d4618ad7a6" + integrity sha512-33Rnf821Y54OAloav0PGNWHlbtEorXpjwchnToyyWbec10X74FOW7hGfvrXLGz7xOe2dz0uo9JVFAHHj/2B5pg== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.0.2" + jest-get-type "^28.0.2" + pretty-format "^28.0.2" + +jest-diff@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269" + integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.0.2" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + jest-docblock@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" @@ -8772,6 +10660,13 @@ jest-docblock@^27.0.6: dependencies: detect-newline "^3.0.0" +jest-docblock@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2" + integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg== + dependencies: + detect-newline "^3.0.0" + jest-each@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.2.3.tgz#7eaf7c7b362019f23c5a7998b57d82e78e6f6672" @@ -8783,6 +10678,28 @@ jest-each@^27.2.3: jest-util "^27.2.3" pretty-format "^27.2.3" +jest-each@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.0.2.tgz#fcf6843e9afe5a3f2d0b1c02aab1f41889d92f1d" + integrity sha512-/W5Wc0b+ipR36kDaLngdVEJ/5UYPOITK7rW0djTlCCQdMuWpCFJweMW4TzAoJ6GiRrljPL8FwiyOSoSHKrda2w== + dependencies: + "@jest/types" "^28.0.2" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.0.2" + pretty-format "^28.0.2" + +jest-each@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.0.tgz#54ae66d6a0a5b1913e9a87588d26c2687c39458b" + integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg== + dependencies: + "@jest/types" "^28.1.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.0" + pretty-format "^28.1.0" + jest-environment-jsdom@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.2.3.tgz#36ad673f93f1948dd5daa6dcb1c9b1ad09d60165" @@ -8808,6 +10725,30 @@ jest-environment-node@^27.2.3: jest-mock "^27.2.3" jest-util "^27.2.3" +jest-environment-node@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.0.2.tgz#bd58e192b8f36a37e52c52fac812bd24b360c0b9" + integrity sha512-o9u5UHZ+NCuIoa44KEF0Behhsz/p1wMm0WumsZfWR1k4IVoWSt3aN0BavSC5dd26VxSGQvkrCnJxxOzhhUEG3Q== + dependencies: + "@jest/environment" "^28.0.2" + "@jest/fake-timers" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/node" "*" + jest-mock "^28.0.2" + jest-util "^28.0.2" + +jest-environment-node@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.0.tgz#6ed2150aa31babba0c488c5b4f4d813a585c68e6" + integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/fake-timers" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + jest-mock "^28.1.0" + jest-util "^28.1.0" + jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" @@ -8818,6 +10759,16 @@ jest-get-type@^27.0.6: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + jest-haste-map@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.3.tgz#cec807c59c312872f0ea4cc1b6b5ca7b46131705" @@ -8838,6 +10789,44 @@ jest-haste-map@^27.2.3: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.0.2.tgz#0c768f43680013cfd2a4471a3ec76c47bfb9e7c6" + integrity sha512-EokdL7l5uk4TqWGawwrIt8w3tZNcbeiRxmKGEURf42pl+/rWJy3sCJlon5HBhJXZTW978jk6600BLQOI7i25Ig== + dependencies: + "@jest/types" "^28.0.2" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.0.2" + jest-worker "^28.0.2" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.0.tgz#6c1ee2daf1c20a3e03dbd8e5b35c4d73d2349cf0" + integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw== + dependencies: + "@jest/types" "^28.1.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.0" + jest-worker "^28.1.0" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + jest-jasmine2@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.2.3.tgz#19fe549b7e86128cd7d0d1668ebf4377dd3981f9" @@ -8870,6 +10859,32 @@ jest-leak-detector@^27.2.3: jest-get-type "^27.0.6" pretty-format "^27.2.3" +jest-leak-detector@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.0.2.tgz#cbde3d22d09bd690ececdc2ed01c608435328456" + integrity sha512-UGaSPYtxKXl/YKacq6juRAKmMp1z2os8NaU8PSC+xvNikmu3wF6QFrXrihMM4hXeMr9HuNotBrQZHmzDY8KIBQ== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.0.2" + +jest-leak-detector@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz#b65167776a8787443214d6f3f54935a4c73c8a45" + integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + +jest-matcher-utils@^27.0.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-matcher-utils@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.3.tgz#db7f992f3921f5004f4de36aafa0c03f2565122a" @@ -8880,6 +10895,26 @@ jest-matcher-utils@^27.2.3: jest-get-type "^27.0.6" pretty-format "^27.2.3" +jest-matcher-utils@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.0.2.tgz#eb461af204b6d0f05281e9228094f0ab7e9e8537" + integrity sha512-SxtTiI2qLJHFtOz/bySStCnwCvISAuxQ/grS+74dfTy5AuJw3Sgj9TVUvskcnImTfpzLoMCDJseRaeRrVYbAOA== + dependencies: + chalk "^4.0.0" + jest-diff "^28.0.2" + jest-get-type "^28.0.2" + pretty-format "^28.0.2" + +jest-matcher-utils@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf" + integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.0" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + jest-message-util@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.3.tgz#cd1091a3f0f3ff919756b15cfccc0ba43eeeeff0" @@ -8895,6 +10930,36 @@ jest-message-util@^27.2.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.0.2.tgz#f3cf36be72be4c4c4058cb34bd6673996d26dee3" + integrity sha512-knK7XyojvwYh1XiF2wmVdskgM/uN11KsjcEWWHfnMZNEdwXCrqB4sCBO94F4cfiAwCS8WFV6CDixDwPlMh/wdA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.0.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.0.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af" + integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.2.3.tgz#f532d2c8c158e8b899f2a0a5bd3077af37619c29" @@ -8903,6 +10968,22 @@ jest-mock@^27.2.3: "@jest/types" "^27.2.3" "@types/node" "*" +jest-mock@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.0.2.tgz#059b500b34c1dd76474ebcdeccc249fe4dd0249f" + integrity sha512-vfnJ4zXRB0i24jOTGtQJyl26JKsgBKtqRlCnsrORZbG06FToSSn33h2x/bmE8XxqxkLWdZBRo+/65l8Vi3nD+g== + dependencies: + "@jest/types" "^28.0.2" + "@types/node" "*" + +jest-mock@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.0.tgz#ccc7cc12a9b330b3182db0c651edc90d163ff73e" + integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" @@ -8913,6 +10994,11 @@ jest-regex-util@^27.0.6: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-resolve-dependencies@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.3.tgz#fcb620684108fe7a099185052434d26f17de98e6" @@ -8922,6 +11008,22 @@ jest-resolve-dependencies@^27.2.3: jest-regex-util "^27.0.6" jest-snapshot "^27.2.3" +jest-resolve-dependencies@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.0.3.tgz#76d8f59f7e76ba36d76a1677eeaaed24560da7e0" + integrity sha512-lCgHMm0/5p0qHemrOzm7kI6JDei28xJwIf7XOEcv1HeAVHnsON8B8jO/woqlU+/GcOXb58ymieYqhk3zjGWnvQ== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.0.3" + +jest-resolve-dependencies@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz#167becb8bee6e20b5ef4a3a728ec67aef6b0b79b" + integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.0" + jest-resolve@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.2.3.tgz#868911cf705c537f433befcfc65e6ddc70c9d7f9" @@ -8938,6 +11040,36 @@ jest-resolve@^27.2.3: resolve "^1.20.0" slash "^3.0.0" +jest-resolve@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.0.3.tgz#63f8e6b53e40f265b3ca9116195221dd43e3d16d" + integrity sha512-lfgjd9JhEjpjIN3HLUfdysdK+A7ePQoYmd7WL9DUEWqdnngb1rF56eee6iDXJxl/3eSolpP43VD7VrhjL3NsoQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.0.2" + jest-pnp-resolver "^1.2.2" + jest-util "^28.0.2" + jest-validate "^28.0.2" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.0.tgz#b1f32748a6cee7d1779c7ef639c0a87078de3d35" + integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.0" + jest-validate "^28.1.0" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + jest-runner@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.2.3.tgz#22f6ef7bd4140fec74cec18eef29c24d07cb6ad5" @@ -8966,6 +11098,60 @@ jest-runner@^27.2.3: source-map-support "^0.5.6" throat "^6.0.1" +jest-runner@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.0.3.tgz#a8a409c685ad3081a44b149b2eb04bc4d47faaf9" + integrity sha512-4OsHMjBLtYUWCENucAQ4Za0jGfEbOFi/Fusv6dzUuaweqx8apb4+5p2LR2yvgF4StFulmxyC238tGLftfu+zBA== + dependencies: + "@jest/console" "^28.0.2" + "@jest/environment" "^28.0.2" + "@jest/test-result" "^28.0.2" + "@jest/transform" "^28.0.3" + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.0.2" + jest-environment-node "^28.0.2" + jest-haste-map "^28.0.2" + jest-leak-detector "^28.0.2" + jest-message-util "^28.0.2" + jest-resolve "^28.0.3" + jest-runtime "^28.0.3" + jest-util "^28.0.2" + jest-watcher "^28.0.2" + jest-worker "^28.0.2" + source-map-support "0.5.13" + throat "^6.0.1" + +jest-runner@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.0.tgz#aefe2a1e618a69baa0b24a50edc54fdd7e728eaa" + integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w== + dependencies: + "@jest/console" "^28.1.0" + "@jest/environment" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.0.2" + jest-environment-node "^28.1.0" + jest-haste-map "^28.1.0" + jest-leak-detector "^28.1.0" + jest-message-util "^28.1.0" + jest-resolve "^28.1.0" + jest-runtime "^28.1.0" + jest-util "^28.1.0" + jest-watcher "^28.1.0" + jest-worker "^28.1.0" + source-map-support "0.5.13" + throat "^6.0.1" + jest-runtime@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.2.3.tgz#e6fc25bbbc63b19fae50c3994060efb1b2922b7e" @@ -8999,6 +11185,62 @@ jest-runtime@^27.2.3: strip-bom "^4.0.0" yargs "^16.0.3" +jest-runtime@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.0.3.tgz#02346a34de0ac61d23bdb0e8c035ad973d7bb087" + integrity sha512-7FtPUmvbZEHLOdjsF6dyHg5Pe4E0DU+f3Vvv8BPzVR7mQA6nFR4clQYLAPyJGnsUvN8WRWn+b5a5SVwnj1WaGg== + dependencies: + "@jest/environment" "^28.0.2" + "@jest/fake-timers" "^28.0.2" + "@jest/globals" "^28.0.3" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.0.2" + "@jest/transform" "^28.0.3" + "@jest/types" "^28.0.2" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.0.2" + jest-message-util "^28.0.2" + jest-mock "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.0.3" + jest-snapshot "^28.0.3" + jest-util "^28.0.2" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-runtime@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.0.tgz#4847dcb2a4eb4b0f9eaf41306897e51fb1665631" + integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/fake-timers" "^28.1.0" + "@jest/globals" "^28.1.0" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-message-util "^28.1.0" + jest-mock "^28.1.0" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-serializer@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" @@ -9037,6 +11279,64 @@ jest-snapshot@^27.2.3: pretty-format "^27.2.3" semver "^7.3.2" +jest-snapshot@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.0.3.tgz#9a768d0c617d070e87c1bd37240f22b344616154" + integrity sha512-nVzAAIlAbrMuvVUrS1YxmAeo1TfSsDDU+K5wv/Ow56MBp+L+Y71ksAbwRp3kGCgZAz4oOXcAMPAwtT9Yh1hlQQ== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.0.2" + "@jest/transform" "^28.0.3" + "@jest/types" "^28.0.2" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.0.2" + graceful-fs "^4.2.9" + jest-diff "^28.0.2" + jest-get-type "^28.0.2" + jest-haste-map "^28.0.2" + jest-matcher-utils "^28.0.2" + jest-message-util "^28.0.2" + jest-util "^28.0.2" + natural-compare "^1.4.0" + pretty-format "^28.0.2" + semver "^7.3.5" + +jest-snapshot@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.0.tgz#4b74fa8816707dd10fe9d551c2c258e5a67b53b6" + integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.0" + graceful-fs "^4.2.9" + jest-diff "^28.1.0" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.0" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + natural-compare "^1.4.0" + pretty-format "^28.1.0" + semver "^7.3.5" + jest-util@^27.0.0, jest-util@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.2.3.tgz#f766354b7c489c1f9ea88cd1d96d044fbd2b5d4d" @@ -9049,6 +11349,30 @@ jest-util@^27.0.0, jest-util@^27.2.3: is-ci "^3.0.0" picomatch "^2.2.3" +jest-util@^28.0.0, jest-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5" + integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.0.2.tgz#8e22cdd6e0549e0a393055f0e2da7eacc334b143" + integrity sha512-EVdpIRCC8lzqhp9A0u0aAKlsFIzufK6xKxNK7awsnebTdOP4hpyQW5o6Ox2qPl8gbeUKYF+POLyItaND53kpGA== + dependencies: + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.3.tgz#4fcc49e581f13fbe260a77e711a80f0256138a7a" @@ -9061,6 +11385,30 @@ jest-validate@^27.2.3: leven "^3.1.0" pretty-format "^27.2.3" +jest-validate@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.0.2.tgz#58bb7e826c054a8bb3b54c05f73758d96cf6dbef" + integrity sha512-nr0UOvCTtxP0YPdsk01Gk7e7c0xIiEe2nncAe3pj0wBfUvAykTVrMrdeASlAJnlEQCBuwN/GF4hKoCzbkGNCNw== + dependencies: + "@jest/types" "^28.0.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.0.2" + +jest-validate@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.0.tgz#8a6821f48432aba9f830c26e28226ad77b9a0e18" + integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ== + dependencies: + "@jest/types" "^28.1.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.0" + jest-watcher@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.2.3.tgz#2989228bdd05138094f7ec19a23cbb2665f2efb7" @@ -9074,6 +11422,34 @@ jest-watcher@^27.2.3: jest-util "^27.2.3" string-length "^4.0.1" +jest-watcher@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.0.2.tgz#649fa24df531d4071be5784b6274d494d788c88b" + integrity sha512-uIVJLpQ/5VTGQWBiBatHsi7jrCqHjHl0e0dFHMWzwuIfUbdW/muk0DtSr0fteY2T7QTFylv+7a5Rm8sBKrE12Q== + dependencies: + "@jest/test-result" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.0.2" + string-length "^4.0.1" + +jest-watcher@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf" + integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA== + dependencies: + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.0" + string-length "^4.0.1" + jest-worker@^27.0.6: version "27.2.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.2.tgz#636deeae8068abbf2b34b4eb9505f8d4e5bd625c" @@ -9092,6 +11468,24 @@ jest-worker@^27.2.3: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.0.2.tgz#75f7e5126541289ba02e9c1a67e46349ddb8141d" + integrity sha512-pijNxfjxT0tGAx+8+OzZ+eayVPCwy/rsZFhebmC0F4YnXu1EHPEPxg7utL3m5uX3EaFH1/jwDxGa1EbjJCST2g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.0.tgz#ced54757a035e87591e1208253a6e3aac1a855e5" + integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^27.2.3: version "27.2.3" resolved "https://registry.yarnpkg.com/jest/-/jest-27.2.3.tgz#9c2af9ce874a3eb202f83d92fbc1cc61ccc73248" @@ -9101,6 +11495,24 @@ jest@^27.2.3: import-local "^3.0.2" jest-cli "^27.2.3" +jest@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.0.3.tgz#92a7d6ee097b61de4ba2db7f3ab723e81a99b32d" + integrity sha512-uS+T5J3w5xyzd1KSJCGKhCo8WTJXbNl86f5SW11wgssbandJOVLRKKUxmhdFfmKxhPeksl1hHZ0HaA8VBzp7xA== + dependencies: + "@jest/core" "^28.0.3" + import-local "^3.0.2" + jest-cli "^28.0.3" + +jest@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.0.tgz#f420e41c8f2395b9a30445a97189ebb57593d831" + integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg== + dependencies: + "@jest/core" "^28.1.0" + import-local "^3.0.2" + jest-cli "^28.1.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9119,6 +11531,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -9230,6 +11649,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -9256,6 +11680,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.1, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -9270,6 +11699,22 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -9350,6 +11795,28 @@ jss@10.9.0, jss@^10.8.2: is-in-browser "^1.1.3" tiny-warning "^1.0.2" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +jwt-decode@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" + integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -9386,6 +11853,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" @@ -9427,6 +11899,14 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9586,21 +12066,61 @@ lodash.get@^4: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= -lodash.merge@^4.6.0: +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.0, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -9629,6 +12149,22 @@ log-symbols@^4.0.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logform@^2.3.2, logform@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe" + integrity sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw== + dependencies: + "@colors/colors" "1.5.0" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +long-timeout@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" + integrity sha1-lyHXiLR+C8taJMLivuGg2lXatRQ= + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -9843,7 +12379,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -9978,6 +12514,11 @@ minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.3: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -10360,6 +12901,11 @@ node-releases@^2.0.2: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + nodemon@^2.0.15: version "2.0.15" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" @@ -10593,12 +13139,17 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +oauth-sign@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -10701,6 +13252,13 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10720,6 +13278,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -10753,6 +13318,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -11002,7 +13579,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11049,6 +13626,16 @@ parse5@6.0.1, parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -11102,7 +13689,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -11190,6 +13777,11 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + pkg-conf@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" @@ -11295,6 +13887,11 @@ prefix-style@2.0.1: resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" integrity sha1-ZrupqHDP2jCKXcIOhekSCTLJWgY= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -11355,6 +13952,35 @@ pretty-format@^27.2.3: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.0.2.tgz#6a24d71cbb61a5e5794ba7513fe22101675481bc" + integrity sha512-UmGZ1IERwS3yY35LDMTaBUYI1w4udZDdJGGT/DqQeKG9ZLDn7/K2Jf/JtYSRiHCCKMHvUA+zsEGSmHdpaVp1yw== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55" + integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-ms@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" @@ -11530,6 +14156,13 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qs@6.10.3, qs@^6.5.1, qs@^6.9.1: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -11582,6 +14215,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +radix-router@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/radix-router/-/radix-router-3.0.1.tgz#5522c829f7100e60c58fd1acf8803e0b2b312d97" + integrity sha512-jpHXHgP+ZmVzEfmZ7WVRSvc/EqMoAqYuMtBsHd9s47Hs9Iy8FDJhkweMrDH0wmdxanLzVIWhq0UpomLXNpW8tg== + raf@^3.1.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -11602,6 +14240,11 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -11642,6 +14285,16 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.2.8, rc@~1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -11730,6 +14383,11 @@ react-is@^17.0.1, react-is@^17.0.2: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + react-redux@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.5.tgz#213c1b05aa1187d9c940ddfc0b29450957f6a3b8" @@ -11916,7 +14574,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11968,6 +14626,13 @@ rebass@^4.0.7: dependencies: reflexbox "^4.0.6" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -12071,7 +14736,7 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -12150,6 +14815,20 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +request-compose@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/request-compose/-/request-compose-1.2.3.tgz#b04110786cc25e3af6b1757553f5abcfefe0887b" + integrity sha512-i2m8y3kEveoaAVTsTqig2LmWI10bUdakqzIVHkTEAK8kcsr4a/+iL93tsujsLaMiCZmnB1Osdk3WEMsB//H66A== + +request-oauth@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/request-oauth/-/request-oauth-0.0.3.tgz#b3ea1ff857b9add3b0d49e42993a88e256d791ab" + integrity sha512-q7WdJlpIcPaIDac0FZSy/yH37FO3UkUuPDIsiLALiLjuC6vzvuKIU14YIC3Lm0wtQRXS9GqvSo/fCYj8n75xSw== + dependencies: + oauth-sign "^0.8.2" + qs "^6.5.1" + uuid "^3.2.1" + request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -12222,6 +14901,20 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.0.0, resolve@^1.1.6: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -12298,6 +14991,14 @@ rete-react-render-plugin@^0.2.1: resolved "https://registry.yarnpkg.com/rete-react-render-plugin/-/rete-react-render-plugin-0.2.1.tgz#71a6d73f18f850b85262563f678b40080a7b0e32" integrity sha512-2ZMXUP0v+EiejHVMqdrOmUwyDBHC2UDOJ/pFkElaZL1Kn/E40JZA5yzdBXi6ajYZI2DCzoW5ZBcA2Ihjtur8MQ== +"rete@git+https://github.com/latitudegames/rete.git#master": + version "1.4.5" + uid "24565a81a2bbcdd4cd73b0a725977550cc8ff988" + resolved "git+https://github.com/latitudegames/rete.git#24565a81a2bbcdd4cd73b0a725977550cc8ff988" + dependencies: + lodash "^4.17.21" + watch "^1.0.2" + "rete@https://github.com/latitudegames/rete.git#master": version "1.4.5" resolved "https://github.com/latitudegames/rete.git#24565a81a2bbcdd4cd73b0a725977550cc8ff988" @@ -12320,7 +15021,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12376,6 +15077,11 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -12393,6 +15099,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-stable-stringify@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" + integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -12527,6 +15238,25 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -12541,6 +15271,17 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serve-favicon@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" + integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -12574,6 +15315,16 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -12664,6 +15415,23 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" + integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.5" + side-channel@^1.0.3, side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -12678,6 +15446,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" @@ -12687,6 +15460,13 @@ signale@^1.4.0: figures "^2.0.0" pkg-conf "^2.1.0" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + sirv@^1.0.7: version "1.0.17" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.17.tgz#86e2c63c612da5a1dace1c16c46f524aaa26ac45" @@ -12751,6 +15531,92 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + +socket.io-client@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@*: + version "4.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.0.tgz#3f01e5bc525d94aa52a97ed5cbc12e229bbc4d6b" + integrity sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== + dependencies: + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + +socket.io@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.0.tgz#78ae2e84784c29267086a416620c18ef95b37186" + integrity sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.2.0" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.0.4" + sockjs@^0.3.21: version "0.3.21" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" @@ -12838,6 +15704,22 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.12: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.20" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" @@ -12975,6 +15857,11 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" @@ -12995,6 +15882,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -13070,7 +15962,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13182,11 +16074,16 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -13264,6 +16161,11 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -13397,6 +16299,16 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" @@ -13456,6 +16368,11 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -13585,11 +16502,21 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + ts-jest@^27.0.5: version "27.0.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.5.tgz#0b0604e2271167ec43c12a69770f0bb65ad1b750" @@ -13604,6 +16531,34 @@ ts-jest@^27.0.5: semver "7.x" yargs-parser "20.x" +ts-jest@^27.1.4: + version "27.1.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" + integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-jest@^28.0.3: + version "28.0.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.3.tgz#d1c47f167e56eef3989bb51afaf7fc1c87a04c52" + integrity sha512-HzgbEDQ2KgVtDmpXToqAcKTyGHdHsG23i/iUjfxji92G5eT09S1m9UHZd7csF0Bfgh9txM4JzwHnv7r1waFPlw== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^20.x" + ts-loader@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.2.0.tgz#6a3aeaa378aecda543e2ed2c332d3123841d52e0" @@ -13625,7 +16580,23 @@ ts-loader@^9.2.6: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^9, ts-node@^9.1.1: +ts-node-dev@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066" + integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.5" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^9.0.0" + tsconfig "^7.0.0" + +ts-node@^9, ts-node@^9.0.0, ts-node@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== @@ -13647,6 +16618,16 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + tslib@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" @@ -13691,6 +16672,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -13763,6 +16751,11 @@ typescript@^4.2.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== +typescript@^4.5.4, typescript@^4.6.4: + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" @@ -13773,6 +16766,11 @@ typical@^5.2.0: resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== +uberproto@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/uberproto/-/uberproto-2.0.6.tgz#709274d183bce6fb734dfd3880d2086ed72b69e5" + integrity sha512-68H97HffZoFaa3HFtpstahWorN9dSp5uTU6jo3GjIQ6JkJBR3hC2Nx/e/HFOoYHdUyT/Z1MRWfxN1EiQJZUyCQ== + uglify-js@^3.1.4: version "3.14.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" @@ -13783,6 +16781,13 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -14012,7 +17017,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.2.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -14022,7 +17027,7 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.2.0: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -14036,6 +17041,15 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" + integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -14051,7 +17065,7 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -14070,6 +17084,14 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vm2@^3.9.9: + version "3.9.9" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.9.tgz#c0507bc5fbb99388fad837d228badaaeb499ddc5" + integrity sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + vue@2.6.10: version "2.6.10" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" @@ -14502,7 +17524,32 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -word-wrap@~1.2.3: +winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.0.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.7.2.tgz#95b4eeddbec902b3db1424932ac634f887c400b1" + integrity sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -14560,6 +17607,14 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" @@ -14598,7 +17653,7 @@ ws@^7.3.1, ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== -ws@^8.0.0: +ws@^8.0.0, ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== @@ -14613,6 +17668,11 @@ ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" @@ -14628,6 +17688,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlhttprequest-ssl@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -14663,11 +17728,16 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.x: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + yargs@^16.0.3, yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -14681,6 +17751,24 @@ yargs@^16.0.3, yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" + integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"