├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .prettierignore ├── .prettierrc ├── README.md ├── assets └── icon.png ├── package.json ├── public ├── favicon.ico ├── index.html └── robots.txt ├── snowpack.config.js ├── src ├── main │ ├── functions │ │ ├── createBoilerplate.ts │ │ └── createResource.ts │ ├── index.ts │ ├── stubs │ │ └── fxmanifestTemplate.ts │ └── types │ │ └── project.ts ├── project_templates │ ├── js │ │ ├── client │ │ │ └── cl_main.js │ │ ├── package.json │ │ ├── server │ │ │ └── sv_main.ts │ │ ├── webpack.config.js │ │ └── yarn.lock │ ├── lua │ │ ├── client │ │ │ └── client.lua │ │ └── server │ │ │ └── server.lua │ └── ts │ │ ├── client │ │ ├── cl_main.ts │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── server │ │ ├── sv_main.ts │ │ └── tsconfig.json │ │ ├── webpack.config.js │ │ └── yarn.lock └── renderer │ ├── App.tsx │ ├── assets │ ├── Desktop - 3.png │ ├── backdrop.png │ ├── backdrop2.png │ └── check-mark.svg │ ├── components │ ├── Header │ │ ├── Header.module.scss │ │ └── Header.tsx │ ├── Steps │ │ ├── Steps.module.scss │ │ └── Steps.tsx │ └── Wizard │ │ ├── Completion │ │ ├── WizardCompletion.module.scss │ │ └── WizardCompletion.tsx │ │ ├── Details │ │ └── WizardDetails.tsx │ │ ├── Packages │ │ ├── Package.tsx │ │ ├── WizardPackages.module.scss │ │ └── WizardPackages.tsx │ │ ├── Pagination │ │ └── Pagination.tsx │ │ ├── ProjectWizard.tsx │ │ ├── Template │ │ ├── TemplateItem.tsx │ │ ├── WizardTemplates.module.scss │ │ └── WizardTemplates.tsx │ │ ├── Wizard.module.scss │ │ └── hooks │ │ ├── useErrorHandler.ts │ │ ├── usePagination.ts │ │ └── useProject.ts │ ├── context │ └── WizardProvider.tsx │ ├── index.css │ ├── index.tsx │ ├── logo.svg │ ├── ui │ ├── BorderedInput │ │ ├── BorderedInput.module.scss │ │ └── BorderedInput.tsx │ ├── Button │ │ ├── Button.module.scss │ │ └── Button.tsx │ ├── Checkbox │ │ ├── Checkbox.module.scss │ │ └── Checkbox.tsx │ ├── PaginationButton │ │ ├── PaginationButton.module.scss │ │ └── PaginationButton.tsx │ ├── UnderlineInput │ │ ├── UnderlineInput.module.scss │ │ └── UnderlineInput.tsx │ └── index.ts │ └── vendor │ └── cursor.cur ├── tsconfig.json ├── types └── static.d.ts ├── yarn-error.log └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .snowpack 2 | build 3 | node_modules 4 | .idea 5 | dist 6 | release 7 | *.zip -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn pretty-quick --staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | dist 4 | .idea 5 | coverage -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "tabWidth": 4, 5 | "useTabs": false, 6 | "semi": true, 7 | "jsxSingleQuote": false, 8 | "bracketSpacing": true, 9 | "printWidth": 80 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CFA-GUI 2 | 3 | ## About 4 | 5 | CFA-GUI is a Desktop Application version of the CLI `create-fivem-app`. This project is created to make it easy for 6 | those that does not like CLI's. 7 | 8 | CFA-GUI is built with React and Electron, and contains 3 different templates (JavaScript, TypeScript, Lua), but will 9 | soon have various templates and boilerplates. 10 | 11 | ## Like to contribute? 12 | 13 | See something you'd like to improve or maybe add a feature? Don't hesitate creating a PR! 14 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/assets/icon.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cfa-gui", 3 | "version": "0.0.1", 4 | "description": "Desktop Application for CFA (Create FiveM App)", 5 | "author": "Christopher Gjelten (chip)", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/itschip/cfa-gui.git" 9 | }, 10 | "scripts": { 11 | "build": "electron-snowpack build", 12 | "clean": "electron-snowpack clean", 13 | "dev": "electron-snowpack dev", 14 | "dist": "electron-builder", 15 | "dist:dir": "yarn dist --dir -c.compression=store -c.mac.identity=null", 16 | "open": "open dist/mac/${npm_package_name}.app", 17 | "try": "run-s clean build dist:dir open", 18 | "prepare": "husky install" 19 | }, 20 | "dependencies": { 21 | "@electron/remote": "^1.0.4", 22 | "@types/rimraf": "^3.0.0", 23 | "boxicons": "^2.0.7", 24 | "electron-snowpack": "^0.9.0", 25 | "node-sass": "^5.0.0", 26 | "react": "^17.0.0", 27 | "react-dom": "^17.0.0", 28 | "react-icons": "^4.2.0", 29 | "rimraf": "^3.0.2" 30 | }, 31 | "devDependencies": { 32 | "@snowpack/plugin-dotenv": "^2.0.5", 33 | "@snowpack/plugin-react-refresh": "^2.4.0", 34 | "@snowpack/plugin-sass": "^1.4.0", 35 | "@snowpack/plugin-typescript": "^1.2.0", 36 | "@snowpack/web-test-runner-plugin": "^0.2.0", 37 | "@testing-library/react": "^11.0.0", 38 | "@types/chai": "^4.2.13", 39 | "@types/mocha": "^8.2.0", 40 | "@types/react": "^17.0.0", 41 | "@types/react-dom": "^17.0.0", 42 | "@types/snowpack-env": "^2.3.2", 43 | "@web/test-runner": "^0.12.0", 44 | "chai": "^4.2.0", 45 | "electron": "^12.0.2", 46 | "electron-builder": "^22.10.5", 47 | "husky": "^5.2.0", 48 | "prettier": "^2.0.5", 49 | "pretty-quick": "^3.1.0", 50 | "sass-loader": "^11.0.1", 51 | "snowpack": "^3.0.1", 52 | "typescript": "^4.0.0" 53 | }, 54 | "build": { 55 | "productName": "cfa-gui", 56 | "appId": "com.app.cfagui", 57 | "win": { 58 | "target": [ 59 | "nsis" 60 | ] 61 | }, 62 | "nsis": { 63 | "allowToChangeInstallationDirectory": true, 64 | "oneClick": false, 65 | "createDesktopShortcut": true, 66 | "createStartMenuShortcut": true 67 | }, 68 | "directories": { 69 | "output": "release", 70 | "buildResources": "assets" 71 | }, 72 | "extraFiles": [ 73 | "./src/project_templates" 74 | ], 75 | "extends": "electron-snowpack/config/electron-builder.js" 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | Create FiveM App 11 | 12 | 13 |
14 | 15 | 19 | 29 | 30 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /snowpack.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import("snowpack").SnowpackUserConfig } */ 2 | module.exports = { 3 | /* mount: { 4 | public: { url: '/', static: true }, 5 | src: { url: '/build' }, 6 | }, */ 7 | extends: 'electron-snowpack/config/snowpack.js', 8 | plugins: [ 9 | '@snowpack/plugin-react-refresh', 10 | '@snowpack/plugin-dotenv', 11 | '@snowpack/plugin-typescript', 12 | '@snowpack/plugin-sass', 13 | ], 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/functions/createBoilerplate.ts: -------------------------------------------------------------------------------- 1 | import { ipcMain, Notification } from 'electron'; 2 | import { ProjectObject } from '../types/project'; 3 | import { createResource } from './createResource'; 4 | 5 | ipcMain.on('createBoilerplate', async (event, project: ProjectObject) => { 6 | try { 7 | await createResource(project); 8 | } catch (err) { 9 | // FIXME: Create a notification 10 | console.log(`Something went wrong. Error: ${err.message}`); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /src/main/functions/createResource.ts: -------------------------------------------------------------------------------- 1 | import * as cp from 'child_process'; 2 | import fs from 'fs-extra'; 3 | import path from 'path'; 4 | import { createFxmaniest } from '../stubs/fxmanifestTemplate'; 5 | import { ProjectObject } from '../types/project'; 6 | import { Notification } from 'electron'; 7 | 8 | const TemplateMap: { [key: string]: string } = { 9 | TypeScript: 'ts', 10 | JavaScript: 'js', 11 | Lua: 'lua', 12 | }; 13 | 14 | export async function createResource(project: ProjectObject) { 15 | // First lets copy the folder from our project_templates 16 | try { 17 | const resourcePath = `${project.resourcePath}/${project.resourceName}`; 18 | 19 | // copy template 20 | const type = TemplateMap[project.resourceTemplate]; 21 | await fs.copy(`./src/project_templates/${type}`, resourcePath); 22 | 23 | // writes fxmanifest to resource 24 | const fxmanifest = createFxmaniest(project); 25 | await fs.writeFile(`${resourcePath}/fxmanifest.lua`, fxmanifest); 26 | 27 | if (type !== 'lua') { 28 | cp.exec('yarn', { cwd: resourcePath, windowsHide: true }); 29 | 30 | // loop through selected packages and install them 31 | if (project.resourcePackages.length >= 1) { 32 | for (const pg of project.resourcePackages) { 33 | cp.exec(`yarn add ${pg}`, { 34 | cwd: resourcePath, 35 | windowsHide: true, 36 | }); 37 | console.log(`Installed ${pg}`); 38 | } 39 | } 40 | } 41 | 42 | showSuccessNotification(project.resourceName, resourcePath); 43 | console.log(`Created folder ${type}`); 44 | } catch (error) { 45 | // FIXME: Create a notification 46 | console.log(`Something went wrong. Error: ${error.message}`); 47 | showErrorNotification(project.resourceName); 48 | } 49 | } 50 | 51 | const showSuccessNotification = ( 52 | resourceName: string, 53 | resourcePath: string, 54 | ) => { 55 | const notification = new Notification({ 56 | title: 'Create FiveM App', 57 | body: `Successfully created ${resourceName} resource.`, 58 | }); 59 | 60 | notification.show(); 61 | 62 | notification.on('click', () => { 63 | cp.exec(`start "" "${resourcePath}"`); 64 | }); 65 | }; 66 | 67 | const showErrorNotification = (resourceName: string) => { 68 | const notification: Electron.NotificationConstructorOptions = { 69 | title: 'Create FiveM App', 70 | body: `Failed to create resource: ${resourceName}`, 71 | }; 72 | 73 | new Notification(notification).show(); 74 | }; 75 | -------------------------------------------------------------------------------- /src/main/index.ts: -------------------------------------------------------------------------------- 1 | import { app, BrowserWindow, dialog, ipcMain } from 'electron'; 2 | import { getAssetURL } from 'electron-snowpack'; 3 | require('@electron/remote/main').initialize(); 4 | import './functions/createBoilerplate'; 5 | 6 | let mainWindow: BrowserWindow | null | undefined; 7 | 8 | function createMainWindow(): BrowserWindow { 9 | const window = new BrowserWindow({ 10 | height: 800, 11 | width: 1400, 12 | frame: false, 13 | resizable: false, 14 | webPreferences: { 15 | nodeIntegration: true, 16 | contextIsolation: false, 17 | enableRemoteModule: true, 18 | }, 19 | }); 20 | 21 | if (process.env.MODE !== 'production') { 22 | window.webContents.openDevTools(); 23 | } 24 | 25 | window.loadURL(getAssetURL('index.html')); 26 | 27 | window.on('closed', (): void => { 28 | mainWindow = null; 29 | }); 30 | 31 | window.webContents.on('devtools-opened', (): void => { 32 | window.focus(); 33 | setImmediate((): void => { 34 | window.focus(); 35 | }); 36 | }); 37 | 38 | return window; 39 | } 40 | 41 | // quit application when all windows are closed 42 | app.on('window-all-closed', (): void => { 43 | // on macOS it is common for applications to stay open until the user explicitly quits 44 | if (process.platform !== 'darwin') { 45 | app.quit(); 46 | } 47 | }); 48 | 49 | app.on('activate', (): void => { 50 | // on macOS it is common to re-create a window even after all windows have been closed 51 | if (mainWindow === null) { 52 | mainWindow = createMainWindow(); 53 | } 54 | }); 55 | 56 | // create main BrowserWindow when electron is ready 57 | app.on('ready', (): void => { 58 | mainWindow = createMainWindow(); 59 | }); 60 | -------------------------------------------------------------------------------- /src/main/stubs/fxmanifestTemplate.ts: -------------------------------------------------------------------------------- 1 | import { ProjectObject } from '../types/project'; 2 | 3 | export const createFxmaniest = (project: ProjectObject) => { 4 | if (project.resourceTemplate == 'TypeScript') { 5 | return ` 6 | fx_version "cerulean" 7 | game "gta5" 8 | 9 | author "${project.resourceAuthor}" 10 | version "${project.resourceVersion}" 11 | description "${project.resourceDescription}" 12 | 13 | client_script "dist/client/client.js" 14 | server_script "dist/server/server.js" 15 | `; 16 | } else { 17 | return ` 18 | fx_version "cerulean" 19 | game "gta5" 20 | 21 | author "${project.resourceAuthor}" 22 | version "${project.resourceVersion}" 23 | description "${project.resourceDescription}" 24 | 25 | client_script "client/*.lua" 26 | server_script "server/*.lua" 27 | `; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /src/main/types/project.ts: -------------------------------------------------------------------------------- 1 | export type ProjectObject = { 2 | resourceName: string; 3 | resourcePath: string; 4 | resourceDescription: string; 5 | resourceVersion: string; 6 | resourceAuthor: string; 7 | resourcePackages: string[]; 8 | resourceTemplate: string; 9 | }; 10 | -------------------------------------------------------------------------------- /src/project_templates/js/client/cl_main.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/js/client/cl_main.js -------------------------------------------------------------------------------- /src/project_templates/js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "name", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "your-name", 6 | "private": "true", 7 | "scripts": { 8 | "build": "webpack --color --progress" 9 | }, 10 | "dependencies": { 11 | "webpack": "^5.10.0", 12 | "webpack-cli": "^4.2.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/project_templates/js/server/sv_main.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/js/server/sv_main.ts -------------------------------------------------------------------------------- /src/project_templates/js/webpack.config.js: -------------------------------------------------------------------------------- 1 | //const webpack = require('webpack'); 2 | const path = require('path'); 3 | 4 | const buildPath = path.resolve(__dirname, 'dist'); 5 | 6 | const client = { 7 | entry: './client/client.js', 8 | optimization: { 9 | minimize: true, 10 | }, 11 | resolve: { 12 | extensions: ['.js'], 13 | }, 14 | output: { 15 | path: path.resolve(buildPath, 'client'), 16 | filename: 'client.js', 17 | }, 18 | }; 19 | 20 | const server = { 21 | entry: './server/server.js', 22 | optimization: { 23 | minimize: true, 24 | }, 25 | resolve: { 26 | extensions: ['.js'], 27 | }, 28 | output: { 29 | path: path.resolve(buildPath, 'server'), 30 | filename: 'server.js', 31 | }, 32 | }; 33 | 34 | module.exports = [client, server]; 35 | -------------------------------------------------------------------------------- /src/project_templates/js/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/eslint-scope@^3.7.0": 6 | version "3.7.0" 7 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" 8 | integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== 9 | dependencies: 10 | "@types/eslint" "*" 11 | "@types/estree" "*" 12 | 13 | "@types/eslint@*": 14 | version "7.2.6" 15 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" 16 | integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== 17 | dependencies: 18 | "@types/estree" "*" 19 | "@types/json-schema" "*" 20 | 21 | "@types/estree@*", "@types/estree@^0.0.45": 22 | version "0.0.45" 23 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" 24 | integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== 25 | 26 | "@types/json-schema@*", "@types/json-schema@^7.0.6": 27 | version "7.0.6" 28 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" 29 | integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== 30 | 31 | "@types/node@*": 32 | version "14.14.10" 33 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" 34 | integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== 35 | 36 | "@webassemblyjs/ast@1.9.0": 37 | version "1.9.0" 38 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" 39 | integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== 40 | dependencies: 41 | "@webassemblyjs/helper-module-context" "1.9.0" 42 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 43 | "@webassemblyjs/wast-parser" "1.9.0" 44 | 45 | "@webassemblyjs/floating-point-hex-parser@1.9.0": 46 | version "1.9.0" 47 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" 48 | integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== 49 | 50 | "@webassemblyjs/helper-api-error@1.9.0": 51 | version "1.9.0" 52 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" 53 | integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== 54 | 55 | "@webassemblyjs/helper-buffer@1.9.0": 56 | version "1.9.0" 57 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" 58 | integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== 59 | 60 | "@webassemblyjs/helper-code-frame@1.9.0": 61 | version "1.9.0" 62 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" 63 | integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== 64 | dependencies: 65 | "@webassemblyjs/wast-printer" "1.9.0" 66 | 67 | "@webassemblyjs/helper-fsm@1.9.0": 68 | version "1.9.0" 69 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" 70 | integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== 71 | 72 | "@webassemblyjs/helper-module-context@1.9.0": 73 | version "1.9.0" 74 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" 75 | integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== 76 | dependencies: 77 | "@webassemblyjs/ast" "1.9.0" 78 | 79 | "@webassemblyjs/helper-wasm-bytecode@1.9.0": 80 | version "1.9.0" 81 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" 82 | integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== 83 | 84 | "@webassemblyjs/helper-wasm-section@1.9.0": 85 | version "1.9.0" 86 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" 87 | integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== 88 | dependencies: 89 | "@webassemblyjs/ast" "1.9.0" 90 | "@webassemblyjs/helper-buffer" "1.9.0" 91 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 92 | "@webassemblyjs/wasm-gen" "1.9.0" 93 | 94 | "@webassemblyjs/ieee754@1.9.0": 95 | version "1.9.0" 96 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" 97 | integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== 98 | dependencies: 99 | "@xtuc/ieee754" "^1.2.0" 100 | 101 | "@webassemblyjs/leb128@1.9.0": 102 | version "1.9.0" 103 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" 104 | integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== 105 | dependencies: 106 | "@xtuc/long" "4.2.2" 107 | 108 | "@webassemblyjs/utf8@1.9.0": 109 | version "1.9.0" 110 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" 111 | integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== 112 | 113 | "@webassemblyjs/wasm-edit@1.9.0": 114 | version "1.9.0" 115 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" 116 | integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== 117 | dependencies: 118 | "@webassemblyjs/ast" "1.9.0" 119 | "@webassemblyjs/helper-buffer" "1.9.0" 120 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 121 | "@webassemblyjs/helper-wasm-section" "1.9.0" 122 | "@webassemblyjs/wasm-gen" "1.9.0" 123 | "@webassemblyjs/wasm-opt" "1.9.0" 124 | "@webassemblyjs/wasm-parser" "1.9.0" 125 | "@webassemblyjs/wast-printer" "1.9.0" 126 | 127 | "@webassemblyjs/wasm-gen@1.9.0": 128 | version "1.9.0" 129 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" 130 | integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== 131 | dependencies: 132 | "@webassemblyjs/ast" "1.9.0" 133 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 134 | "@webassemblyjs/ieee754" "1.9.0" 135 | "@webassemblyjs/leb128" "1.9.0" 136 | "@webassemblyjs/utf8" "1.9.0" 137 | 138 | "@webassemblyjs/wasm-opt@1.9.0": 139 | version "1.9.0" 140 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" 141 | integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== 142 | dependencies: 143 | "@webassemblyjs/ast" "1.9.0" 144 | "@webassemblyjs/helper-buffer" "1.9.0" 145 | "@webassemblyjs/wasm-gen" "1.9.0" 146 | "@webassemblyjs/wasm-parser" "1.9.0" 147 | 148 | "@webassemblyjs/wasm-parser@1.9.0": 149 | version "1.9.0" 150 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" 151 | integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== 152 | dependencies: 153 | "@webassemblyjs/ast" "1.9.0" 154 | "@webassemblyjs/helper-api-error" "1.9.0" 155 | "@webassemblyjs/helper-wasm-bytecode" "1.9.0" 156 | "@webassemblyjs/ieee754" "1.9.0" 157 | "@webassemblyjs/leb128" "1.9.0" 158 | "@webassemblyjs/utf8" "1.9.0" 159 | 160 | "@webassemblyjs/wast-parser@1.9.0": 161 | version "1.9.0" 162 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" 163 | integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== 164 | dependencies: 165 | "@webassemblyjs/ast" "1.9.0" 166 | "@webassemblyjs/floating-point-hex-parser" "1.9.0" 167 | "@webassemblyjs/helper-api-error" "1.9.0" 168 | "@webassemblyjs/helper-code-frame" "1.9.0" 169 | "@webassemblyjs/helper-fsm" "1.9.0" 170 | "@xtuc/long" "4.2.2" 171 | 172 | "@webassemblyjs/wast-printer@1.9.0": 173 | version "1.9.0" 174 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" 175 | integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== 176 | dependencies: 177 | "@webassemblyjs/ast" "1.9.0" 178 | "@webassemblyjs/wast-parser" "1.9.0" 179 | "@xtuc/long" "4.2.2" 180 | 181 | "@webpack-cli/info@^1.1.0": 182 | version "1.1.0" 183 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.1.0.tgz#c596d5bc48418b39df00c5ed7341bf0f102dbff1" 184 | integrity sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ== 185 | dependencies: 186 | envinfo "^7.7.3" 187 | 188 | "@webpack-cli/serve@^1.1.0": 189 | version "1.1.0" 190 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.1.0.tgz#13ad38f89b6e53d1133bac0006a128217a6ebf92" 191 | integrity sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg== 192 | 193 | "@xtuc/ieee754@^1.2.0": 194 | version "1.2.0" 195 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 196 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 197 | 198 | "@xtuc/long@4.2.2": 199 | version "4.2.2" 200 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 201 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 202 | 203 | acorn@^8.0.4: 204 | version "8.0.4" 205 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" 206 | integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== 207 | 208 | ajv-keywords@^3.5.2: 209 | version "3.5.2" 210 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 211 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 212 | 213 | ajv@^6.12.5: 214 | version "6.12.6" 215 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 216 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 217 | dependencies: 218 | fast-deep-equal "^3.1.1" 219 | fast-json-stable-stringify "^2.0.0" 220 | json-schema-traverse "^0.4.1" 221 | uri-js "^4.2.2" 222 | 223 | ansi-colors@^4.1.1: 224 | version "4.1.1" 225 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 226 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 227 | 228 | ansi-styles@^3.2.1: 229 | version "3.2.1" 230 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 231 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 232 | dependencies: 233 | color-convert "^1.9.0" 234 | 235 | array-back@^4.0.1: 236 | version "4.0.1" 237 | resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" 238 | integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== 239 | 240 | browserslist@^4.14.5: 241 | version "4.15.0" 242 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.15.0.tgz#3d48bbca6a3f378e86102ffd017d9a03f122bdb0" 243 | integrity sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ== 244 | dependencies: 245 | caniuse-lite "^1.0.30001164" 246 | colorette "^1.2.1" 247 | electron-to-chromium "^1.3.612" 248 | escalade "^3.1.1" 249 | node-releases "^1.1.67" 250 | 251 | buffer-from@^1.0.0: 252 | version "1.1.1" 253 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 254 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 255 | 256 | caniuse-lite@^1.0.30001164: 257 | version "1.0.30001165" 258 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" 259 | integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== 260 | 261 | chalk@^2.4.2: 262 | version "2.4.2" 263 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 264 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 265 | dependencies: 266 | ansi-styles "^3.2.1" 267 | escape-string-regexp "^1.0.5" 268 | supports-color "^5.3.0" 269 | 270 | chrome-trace-event@^1.0.2: 271 | version "1.0.2" 272 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" 273 | integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== 274 | dependencies: 275 | tslib "^1.9.0" 276 | 277 | color-convert@^1.9.0: 278 | version "1.9.3" 279 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 280 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 281 | dependencies: 282 | color-name "1.1.3" 283 | 284 | color-name@1.1.3: 285 | version "1.1.3" 286 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 287 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 288 | 289 | colorette@^1.2.1: 290 | version "1.2.1" 291 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" 292 | integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== 293 | 294 | command-line-usage@^6.1.0: 295 | version "6.1.1" 296 | resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.1.tgz#c908e28686108917758a49f45efb4f02f76bc03f" 297 | integrity sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA== 298 | dependencies: 299 | array-back "^4.0.1" 300 | chalk "^2.4.2" 301 | table-layout "^1.0.1" 302 | typical "^5.2.0" 303 | 304 | commander@^2.20.0: 305 | version "2.20.3" 306 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 307 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 308 | 309 | commander@^6.2.0: 310 | version "6.2.0" 311 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" 312 | integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== 313 | 314 | cross-spawn@^7.0.0: 315 | version "7.0.3" 316 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 317 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 318 | dependencies: 319 | path-key "^3.1.0" 320 | shebang-command "^2.0.0" 321 | which "^2.0.1" 322 | 323 | deep-extend@~0.6.0: 324 | version "0.6.0" 325 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 326 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 327 | 328 | electron-to-chromium@^1.3.612: 329 | version "1.3.616" 330 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.616.tgz#de63d1c79bb8eb61168774df0c11c9e1af69f9e8" 331 | integrity sha512-CI8L38UN2BEnqXw3/oRIQTmde0LiSeqWSRlPA42ZTYgJQ8fYenzAM2Z3ni+jtILTcrs5aiXZCGJ96Pm+3/yGyQ== 332 | 333 | end-of-stream@^1.1.0: 334 | version "1.4.4" 335 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 336 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 337 | dependencies: 338 | once "^1.4.0" 339 | 340 | enhanced-resolve@^5.3.1: 341 | version "5.4.0" 342 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz#a8bcf23b00affac9455cf71efd80844f4054f4dc" 343 | integrity sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ== 344 | dependencies: 345 | graceful-fs "^4.2.4" 346 | tapable "^2.0.0" 347 | 348 | enquirer@^2.3.6: 349 | version "2.3.6" 350 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 351 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 352 | dependencies: 353 | ansi-colors "^4.1.1" 354 | 355 | envinfo@^7.7.3: 356 | version "7.7.3" 357 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" 358 | integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== 359 | 360 | escalade@^3.1.1: 361 | version "3.1.1" 362 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 363 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 364 | 365 | escape-string-regexp@^1.0.5: 366 | version "1.0.5" 367 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 368 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 369 | 370 | eslint-scope@^5.1.1: 371 | version "5.1.1" 372 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 373 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 374 | dependencies: 375 | esrecurse "^4.3.0" 376 | estraverse "^4.1.1" 377 | 378 | esrecurse@^4.3.0: 379 | version "4.3.0" 380 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 381 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 382 | dependencies: 383 | estraverse "^5.2.0" 384 | 385 | estraverse@^4.1.1: 386 | version "4.3.0" 387 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 388 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 389 | 390 | estraverse@^5.2.0: 391 | version "5.2.0" 392 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 393 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 394 | 395 | events@^3.2.0: 396 | version "3.2.0" 397 | resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" 398 | integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== 399 | 400 | execa@^4.1.0: 401 | version "4.1.0" 402 | resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" 403 | integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== 404 | dependencies: 405 | cross-spawn "^7.0.0" 406 | get-stream "^5.0.0" 407 | human-signals "^1.1.1" 408 | is-stream "^2.0.0" 409 | merge-stream "^2.0.0" 410 | npm-run-path "^4.0.0" 411 | onetime "^5.1.0" 412 | signal-exit "^3.0.2" 413 | strip-final-newline "^2.0.0" 414 | 415 | fast-deep-equal@^3.1.1: 416 | version "3.1.3" 417 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 418 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 419 | 420 | fast-json-stable-stringify@^2.0.0: 421 | version "2.1.0" 422 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 423 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 424 | 425 | find-up@^4.0.0: 426 | version "4.1.0" 427 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 428 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 429 | dependencies: 430 | locate-path "^5.0.0" 431 | path-exists "^4.0.0" 432 | 433 | find-up@^5.0.0: 434 | version "5.0.0" 435 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 436 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 437 | dependencies: 438 | locate-path "^6.0.0" 439 | path-exists "^4.0.0" 440 | 441 | function-bind@^1.1.1: 442 | version "1.1.1" 443 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 444 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 445 | 446 | get-stream@^5.0.0: 447 | version "5.2.0" 448 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 449 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 450 | dependencies: 451 | pump "^3.0.0" 452 | 453 | glob-to-regexp@^0.4.1: 454 | version "0.4.1" 455 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 456 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 457 | 458 | graceful-fs@^4.1.2, graceful-fs@^4.2.4: 459 | version "4.2.4" 460 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 461 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 462 | 463 | has-flag@^3.0.0: 464 | version "3.0.0" 465 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 466 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 467 | 468 | has-flag@^4.0.0: 469 | version "4.0.0" 470 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 471 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 472 | 473 | has@^1.0.3: 474 | version "1.0.3" 475 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 476 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 477 | dependencies: 478 | function-bind "^1.1.1" 479 | 480 | human-signals@^1.1.1: 481 | version "1.1.1" 482 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" 483 | integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== 484 | 485 | import-local@^3.0.2: 486 | version "3.0.2" 487 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" 488 | integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== 489 | dependencies: 490 | pkg-dir "^4.2.0" 491 | resolve-cwd "^3.0.0" 492 | 493 | interpret@^2.2.0: 494 | version "2.2.0" 495 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" 496 | integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== 497 | 498 | is-core-module@^2.1.0: 499 | version "2.2.0" 500 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 501 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 502 | dependencies: 503 | has "^1.0.3" 504 | 505 | is-stream@^2.0.0: 506 | version "2.0.0" 507 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 508 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 509 | 510 | isexe@^2.0.0: 511 | version "2.0.0" 512 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 513 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 514 | 515 | jest-worker@^26.6.1: 516 | version "26.6.2" 517 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" 518 | integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== 519 | dependencies: 520 | "@types/node" "*" 521 | merge-stream "^2.0.0" 522 | supports-color "^7.0.0" 523 | 524 | json-parse-better-errors@^1.0.2: 525 | version "1.0.2" 526 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 527 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 528 | 529 | json-schema-traverse@^0.4.1: 530 | version "0.4.1" 531 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 532 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 533 | 534 | leven@^3.1.0: 535 | version "3.1.0" 536 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 537 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 538 | 539 | loader-runner@^4.1.0: 540 | version "4.1.0" 541 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.1.0.tgz#f70bc0c29edbabdf2043e7ee73ccc3fe1c96b42d" 542 | integrity sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA== 543 | 544 | locate-path@^5.0.0: 545 | version "5.0.0" 546 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 547 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 548 | dependencies: 549 | p-locate "^4.1.0" 550 | 551 | locate-path@^6.0.0: 552 | version "6.0.0" 553 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 554 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 555 | dependencies: 556 | p-locate "^5.0.0" 557 | 558 | lodash@^4.17.15: 559 | version "4.17.20" 560 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 561 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 562 | 563 | merge-stream@^2.0.0: 564 | version "2.0.0" 565 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 566 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 567 | 568 | mime-db@1.44.0: 569 | version "1.44.0" 570 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 571 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 572 | 573 | mime-types@^2.1.27: 574 | version "2.1.27" 575 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 576 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 577 | dependencies: 578 | mime-db "1.44.0" 579 | 580 | mimic-fn@^2.1.0: 581 | version "2.1.0" 582 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 583 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 584 | 585 | neo-async@^2.6.2: 586 | version "2.6.2" 587 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 588 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 589 | 590 | node-releases@^1.1.67: 591 | version "1.1.67" 592 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" 593 | integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== 594 | 595 | npm-run-path@^4.0.0: 596 | version "4.0.1" 597 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 598 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 599 | dependencies: 600 | path-key "^3.0.0" 601 | 602 | once@^1.3.1, once@^1.4.0: 603 | version "1.4.0" 604 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 605 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 606 | dependencies: 607 | wrappy "1" 608 | 609 | onetime@^5.1.0: 610 | version "5.1.2" 611 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 612 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 613 | dependencies: 614 | mimic-fn "^2.1.0" 615 | 616 | p-limit@^2.2.0: 617 | version "2.3.0" 618 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 619 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 620 | dependencies: 621 | p-try "^2.0.0" 622 | 623 | p-limit@^3.0.2: 624 | version "3.1.0" 625 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 626 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 627 | dependencies: 628 | yocto-queue "^0.1.0" 629 | 630 | p-locate@^4.1.0: 631 | version "4.1.0" 632 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 633 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 634 | dependencies: 635 | p-limit "^2.2.0" 636 | 637 | p-locate@^5.0.0: 638 | version "5.0.0" 639 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 640 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 641 | dependencies: 642 | p-limit "^3.0.2" 643 | 644 | p-try@^2.0.0: 645 | version "2.2.0" 646 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 647 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 648 | 649 | path-exists@^4.0.0: 650 | version "4.0.0" 651 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 652 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 653 | 654 | path-key@^3.0.0, path-key@^3.1.0: 655 | version "3.1.1" 656 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 657 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 658 | 659 | path-parse@^1.0.6: 660 | version "1.0.6" 661 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 662 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 663 | 664 | pkg-dir@^4.2.0: 665 | version "4.2.0" 666 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 667 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 668 | dependencies: 669 | find-up "^4.0.0" 670 | 671 | pkg-dir@^5.0.0: 672 | version "5.0.0" 673 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" 674 | integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== 675 | dependencies: 676 | find-up "^5.0.0" 677 | 678 | pump@^3.0.0: 679 | version "3.0.0" 680 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 681 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 682 | dependencies: 683 | end-of-stream "^1.1.0" 684 | once "^1.3.1" 685 | 686 | punycode@^2.1.0: 687 | version "2.1.1" 688 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 689 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 690 | 691 | randombytes@^2.1.0: 692 | version "2.1.0" 693 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 694 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 695 | dependencies: 696 | safe-buffer "^5.1.0" 697 | 698 | rechoir@^0.7.0: 699 | version "0.7.0" 700 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" 701 | integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== 702 | dependencies: 703 | resolve "^1.9.0" 704 | 705 | reduce-flatten@^2.0.0: 706 | version "2.0.0" 707 | resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" 708 | integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== 709 | 710 | resolve-cwd@^3.0.0: 711 | version "3.0.0" 712 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 713 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 714 | dependencies: 715 | resolve-from "^5.0.0" 716 | 717 | resolve-from@^5.0.0: 718 | version "5.0.0" 719 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 720 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 721 | 722 | resolve@^1.9.0: 723 | version "1.19.0" 724 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 725 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 726 | dependencies: 727 | is-core-module "^2.1.0" 728 | path-parse "^1.0.6" 729 | 730 | safe-buffer@^5.1.0: 731 | version "5.2.1" 732 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 733 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 734 | 735 | schema-utils@^3.0.0: 736 | version "3.0.0" 737 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" 738 | integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== 739 | dependencies: 740 | "@types/json-schema" "^7.0.6" 741 | ajv "^6.12.5" 742 | ajv-keywords "^3.5.2" 743 | 744 | serialize-javascript@^5.0.1: 745 | version "5.0.1" 746 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" 747 | integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== 748 | dependencies: 749 | randombytes "^2.1.0" 750 | 751 | shebang-command@^2.0.0: 752 | version "2.0.0" 753 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 754 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 755 | dependencies: 756 | shebang-regex "^3.0.0" 757 | 758 | shebang-regex@^3.0.0: 759 | version "3.0.0" 760 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 761 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 762 | 763 | signal-exit@^3.0.2: 764 | version "3.0.3" 765 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 766 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 767 | 768 | source-list-map@^2.0.1: 769 | version "2.0.1" 770 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" 771 | integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== 772 | 773 | source-map-support@~0.5.19: 774 | version "0.5.19" 775 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 776 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 777 | dependencies: 778 | buffer-from "^1.0.0" 779 | source-map "^0.6.0" 780 | 781 | source-map@^0.6.0, source-map@^0.6.1: 782 | version "0.6.1" 783 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 784 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 785 | 786 | source-map@~0.7.2: 787 | version "0.7.3" 788 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 789 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 790 | 791 | strip-final-newline@^2.0.0: 792 | version "2.0.0" 793 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 794 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 795 | 796 | supports-color@^5.3.0: 797 | version "5.5.0" 798 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 799 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 800 | dependencies: 801 | has-flag "^3.0.0" 802 | 803 | supports-color@^7.0.0: 804 | version "7.2.0" 805 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 806 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 807 | dependencies: 808 | has-flag "^4.0.0" 809 | 810 | table-layout@^1.0.1: 811 | version "1.0.1" 812 | resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.1.tgz#8411181ee951278ad0638aea2f779a9ce42894f9" 813 | integrity sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q== 814 | dependencies: 815 | array-back "^4.0.1" 816 | deep-extend "~0.6.0" 817 | typical "^5.2.0" 818 | wordwrapjs "^4.0.0" 819 | 820 | tapable@^2.0.0, tapable@^2.1.1: 821 | version "2.2.0" 822 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" 823 | integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== 824 | 825 | terser-webpack-plugin@^5.0.3: 826 | version "5.0.3" 827 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#ec60542db2421f45735c719d2e17dabfbb2e3e42" 828 | integrity sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ== 829 | dependencies: 830 | jest-worker "^26.6.1" 831 | p-limit "^3.0.2" 832 | schema-utils "^3.0.0" 833 | serialize-javascript "^5.0.1" 834 | source-map "^0.6.1" 835 | terser "^5.3.8" 836 | 837 | terser@^5.3.8: 838 | version "5.5.1" 839 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" 840 | integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== 841 | dependencies: 842 | commander "^2.20.0" 843 | source-map "~0.7.2" 844 | source-map-support "~0.5.19" 845 | 846 | tslib@^1.9.0: 847 | version "1.14.1" 848 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 849 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 850 | 851 | typical@^5.0.0, typical@^5.2.0: 852 | version "5.2.0" 853 | resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" 854 | integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== 855 | 856 | uri-js@^4.2.2: 857 | version "4.4.0" 858 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 859 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 860 | dependencies: 861 | punycode "^2.1.0" 862 | 863 | v8-compile-cache@^2.2.0: 864 | version "2.2.0" 865 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" 866 | integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== 867 | 868 | watchpack@^2.0.0: 869 | version "2.0.1" 870 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.1.tgz#2f2192c542c82a3bcde76acd3411470c120426a8" 871 | integrity sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg== 872 | dependencies: 873 | glob-to-regexp "^0.4.1" 874 | graceful-fs "^4.1.2" 875 | 876 | webpack-cli@^4.2.0: 877 | version "4.2.0" 878 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.2.0.tgz#10a09030ad2bd4d8b0f78322fba6ea43ec56aaaa" 879 | integrity sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA== 880 | dependencies: 881 | "@webpack-cli/info" "^1.1.0" 882 | "@webpack-cli/serve" "^1.1.0" 883 | colorette "^1.2.1" 884 | command-line-usage "^6.1.0" 885 | commander "^6.2.0" 886 | enquirer "^2.3.6" 887 | execa "^4.1.0" 888 | import-local "^3.0.2" 889 | interpret "^2.2.0" 890 | leven "^3.1.0" 891 | rechoir "^0.7.0" 892 | v8-compile-cache "^2.2.0" 893 | webpack-merge "^4.2.2" 894 | 895 | webpack-merge@^4.2.2: 896 | version "4.2.2" 897 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" 898 | integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== 899 | dependencies: 900 | lodash "^4.17.15" 901 | 902 | webpack-sources@^2.1.1: 903 | version "2.2.0" 904 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" 905 | integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== 906 | dependencies: 907 | source-list-map "^2.0.1" 908 | source-map "^0.6.1" 909 | 910 | webpack@^5.10.0: 911 | version "5.10.0" 912 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.10.0.tgz#6f77c31522a2c525152d9c344f9765d168b3df08" 913 | integrity sha512-P0bHAXmIz0zsNcHNLqFmLY1ZtrT+jtBr7FqpuDtA2o7GiHC+zBsfhgK7SmJ1HG7BAEb3G9JoMdSVi7mEDvG3Zg== 914 | dependencies: 915 | "@types/eslint-scope" "^3.7.0" 916 | "@types/estree" "^0.0.45" 917 | "@webassemblyjs/ast" "1.9.0" 918 | "@webassemblyjs/helper-module-context" "1.9.0" 919 | "@webassemblyjs/wasm-edit" "1.9.0" 920 | "@webassemblyjs/wasm-parser" "1.9.0" 921 | acorn "^8.0.4" 922 | browserslist "^4.14.5" 923 | chrome-trace-event "^1.0.2" 924 | enhanced-resolve "^5.3.1" 925 | eslint-scope "^5.1.1" 926 | events "^3.2.0" 927 | glob-to-regexp "^0.4.1" 928 | graceful-fs "^4.2.4" 929 | json-parse-better-errors "^1.0.2" 930 | loader-runner "^4.1.0" 931 | mime-types "^2.1.27" 932 | neo-async "^2.6.2" 933 | pkg-dir "^5.0.0" 934 | schema-utils "^3.0.0" 935 | tapable "^2.1.1" 936 | terser-webpack-plugin "^5.0.3" 937 | watchpack "^2.0.0" 938 | webpack-sources "^2.1.1" 939 | 940 | which@^2.0.1: 941 | version "2.0.2" 942 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 943 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 944 | dependencies: 945 | isexe "^2.0.0" 946 | 947 | wordwrapjs@^4.0.0: 948 | version "4.0.0" 949 | resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.0.tgz#9aa9394155993476e831ba8e59fb5795ebde6800" 950 | integrity sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ== 951 | dependencies: 952 | reduce-flatten "^2.0.0" 953 | typical "^5.0.0" 954 | 955 | wrappy@1: 956 | version "1.0.2" 957 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 958 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 959 | 960 | yocto-queue@^0.1.0: 961 | version "0.1.0" 962 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 963 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 964 | -------------------------------------------------------------------------------- /src/project_templates/lua/client/client.lua: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/lua/client/client.lua -------------------------------------------------------------------------------- /src/project_templates/lua/server/server.lua: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/lua/server/server.lua -------------------------------------------------------------------------------- /src/project_templates/ts/client/cl_main.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/ts/client/cl_main.ts -------------------------------------------------------------------------------- /src/project_templates/ts/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "*": ["types/*"] 6 | }, 7 | "outDir": "./", 8 | "noImplicitAny": true, 9 | "module": "commonjs", 10 | "target": "ES2018", 11 | "allowJs": true, 12 | "lib": ["ES2018"], 13 | "types": ["@citizenfx/client", "@types/node"], 14 | "moduleResolution": "node", 15 | "resolveJsonModule": true, 16 | "esModuleInterop": true 17 | }, 18 | "include": ["./**/*"], 19 | "exclude": ["**/node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /src/project_templates/ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "shit", 6 | "license": "MIT", 7 | "scripts": { 8 | "build": "webpack --color --progress", 9 | "watch": "webpack --mode development --watch" 10 | }, 11 | "dependencies": { 12 | "@citizenfx/client": "^2.0.3764-1", 13 | "@citizenfx/server": "^2.0.3764-1", 14 | "@types/node": "^14.14.31" 15 | }, 16 | "devDependencies": { 17 | "remove-files-webpack-plugin": "^1.4.4", 18 | "ts-loader": "^8.0.17", 19 | "typescript": "^4.2.2", 20 | "webpack": "^5.24.2", 21 | "webpack-cli": "^4.5.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/project_templates/ts/server/sv_main.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/project_templates/ts/server/sv_main.ts -------------------------------------------------------------------------------- /src/project_templates/ts/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "*": ["types/*"] 6 | }, 7 | "outDir": "./", 8 | "noImplicitAny": true, 9 | "module": "commonjs", 10 | "target": "ES2018", 11 | "allowJs": false, 12 | "lib": ["ES2018"], 13 | "types": ["@citizenfx/server", "@types/node"], 14 | "moduleResolution": "node", 15 | "emitDecoratorMetadata": true, 16 | "experimentalDecorators": true, 17 | "resolveJsonModule": true, 18 | "esModuleInterop": true 19 | }, 20 | "include": ["./**/*"], 21 | "exclude": ["**/node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /src/project_templates/ts/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const RemovePlugin = require('remove-files-webpack-plugin'); 4 | 5 | const buildPath = path.resolve(__dirname, 'dist'); 6 | 7 | const server = { 8 | entry: './server/server.ts', 9 | module: { 10 | rules: [ 11 | { 12 | test: /\.ts$/, 13 | use: ['ts-loader'], 14 | exclude: /node_modules/, 15 | }, 16 | ], 17 | }, 18 | plugins: [ 19 | new webpack.DefinePlugin({ 'global.GENTLY': false }), 20 | new RemovePlugin({ 21 | before: { 22 | include: [path.resolve(buildPath, 'server')], 23 | }, 24 | watch: { 25 | include: [path.resolve(buildPath, 'server')], 26 | }, 27 | }), 28 | ], 29 | resolve: { 30 | extensions: ['.ts', '.js'], 31 | }, 32 | output: { 33 | filename: 'server.js', 34 | path: path.resolve(buildPath, 'server'), 35 | }, 36 | target: 'node', 37 | }; 38 | 39 | const client = { 40 | entry: './client/client.ts', 41 | module: { 42 | rules: [ 43 | { 44 | test: /\.ts$/, 45 | use: ['ts-loader'], 46 | exclude: /node_modules/, 47 | }, 48 | ], 49 | }, 50 | plugins: [ 51 | new RemovePlugin({ 52 | before: { 53 | include: [path.resolve(buildPath, 'client')], 54 | }, 55 | watch: { 56 | include: [path.resolve(buildPath, 'client')], 57 | }, 58 | }), 59 | ], 60 | optimization: { 61 | minimize: true, 62 | }, 63 | resolve: { 64 | extensions: ['.ts', '.js'], 65 | }, 66 | output: { 67 | filename: 'client.js', 68 | path: path.resolve(buildPath, 'client'), 69 | }, 70 | }; 71 | 72 | module.exports = [server, client]; 73 | -------------------------------------------------------------------------------- /src/renderer/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import { Header } from './components/Header/Header'; 3 | import { ProjectWizard } from './components/Wizard/ProjectWizard'; 4 | import { WizardProvider } from './context/WizardProvider'; 5 | const { ipcRenderer } = window.require('electron'); 6 | 7 | interface AppProps {} 8 | 9 | function App({}: AppProps) { 10 | const handleError = () => { 11 | ipcRenderer.send('display-error'); 12 | }; 13 | 14 | // Return the App component. 15 | return ( 16 |
17 |
18 | 19 | 20 | 21 |
22 | ); 23 | } 24 | 25 | export default App; 26 | -------------------------------------------------------------------------------- /src/renderer/assets/Desktop - 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/renderer/assets/Desktop - 3.png -------------------------------------------------------------------------------- /src/renderer/assets/backdrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/renderer/assets/backdrop.png -------------------------------------------------------------------------------- /src/renderer/assets/backdrop2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/renderer/assets/backdrop2.png -------------------------------------------------------------------------------- /src/renderer/assets/check-mark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/renderer/components/Header/Header.module.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | justify-items: center; 4 | justify-content: space-between; 5 | width: 100%; 6 | background-color: #151517; 7 | padding: 4px; 8 | box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.75); 9 | 10 | -webkit-app-region: drag; 11 | } 12 | 13 | .headerTitle { 14 | color: #fff; 15 | font-weight: 300; 16 | color: #f40552; 17 | margin-left: 10px; 18 | } 19 | 20 | .headerOptions { 21 | display: flex; 22 | justify-items: center; 23 | justify-content: center; 24 | margin: 10px; 25 | } 26 | 27 | .actionButton { 28 | position: relative; 29 | width: 18px; 30 | height: 18px; 31 | cursor: pointer; 32 | margin-right: 10px; 33 | -webkit-app-region: no-drag; 34 | } 35 | -------------------------------------------------------------------------------- /src/renderer/components/Header/Header.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styles from './Header.module.scss'; 3 | import { MdClose, MdCheckBoxOutlineBlank } from 'react-icons/md'; 4 | import { AiOutlineMinus } from 'react-icons/ai'; 5 | 6 | const { BrowserWindow } = window.require('@electron/remote'); 7 | 8 | export const Header = () => { 9 | const getWindow = () => BrowserWindow.getFocusedWindow(); 10 | 11 | const closeWindow = () => { 12 | getWindow().close(); 13 | }; 14 | const minimizeWindow = () => { 15 | getWindow().minimize(); 16 | }; 17 | 18 | const maximizeWindow = () => { 19 | let win = getWindow(); 20 | win.isMaximized() ? win.restore() : win.maximize(); 21 | }; 22 | 23 | return ( 24 |
25 |
26 |

CFA

27 |
28 |
29 |
30 | {} 31 |
32 |
33 | {} 34 |
35 |
36 |
37 | ); 38 | }; 39 | -------------------------------------------------------------------------------- /src/renderer/components/Steps/Steps.module.scss: -------------------------------------------------------------------------------- 1 | .steps { 2 | margin-top: 1rem; 3 | display: flex; 4 | 5 | h1 { 6 | margin: 0; 7 | padding: 0; 8 | color: #fff; 9 | font-size: 15px; 10 | font-weight: normal; 11 | margin-right: 0.5rem; 12 | border-right: 1px solid white; 13 | padding-right: 0.5rem; 14 | 15 | &:last-child { 16 | border: none; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/renderer/components/Steps/Steps.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styles from './Steps.module.scss'; 3 | 4 | export const Steps = ({ step }: { step: number }) => { 5 | return ( 6 |
7 |

8 | Step 1 9 |

10 |

11 | Step 2 12 |

13 |

14 | Step 3 15 |

16 |

17 | Step 4 18 |

19 |
20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Completion/WizardCompletion.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | margin-top: 20px; 3 | width: 100%; 4 | flex: auto; 5 | 6 | .titleSection { 7 | display: flex; 8 | margin-top: 1rem; 9 | flex-direction: column; 10 | 11 | label { 12 | color: #fff; 13 | font-weight: normal; 14 | } 15 | } 16 | } 17 | 18 | .resultList { 19 | display: flex; 20 | padding: 2rem; 21 | margin-top: 1rem; 22 | justify-content: space-between; 23 | border-radius: 10px; 24 | background-color: rgba(14, 14, 16, 0.5); 25 | overflow-y: scroll; 26 | height: 262px; 27 | 28 | .listTitle { 29 | color: #fff; 30 | font-weight: 400; 31 | margin-bottom: 10px; 32 | } 33 | 34 | .detailsList { 35 | display: flex; 36 | flex-direction: column; 37 | } 38 | 39 | .selectionList { 40 | display: flex; 41 | flex-direction: column; 42 | } 43 | 44 | label { 45 | color: #fff; 46 | margin-bottom: 10px; 47 | 48 | span { 49 | color: #f40552; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Completion/WizardCompletion.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useProject } from '../hooks/useProject'; 3 | import styles from './WizardCompletion.module.scss'; 4 | 5 | export default function WizardCompletion() { 6 | const { 7 | resourcePath, 8 | resourcePackages, 9 | resourceName, 10 | resourceAuthor, 11 | resourceVersion, 12 | resourceTemplate, 13 | resourceDescription, 14 | } = useProject(); 15 | 16 | return ( 17 |
18 |
19 | 20 |
21 | 22 |
23 |
24 |
25 |

Details

26 |
27 | 30 | 33 | 36 | 39 | 42 |
43 |
44 |
45 |

Template

46 |
47 | 50 | 51 | {resourcePackages?.map((pg) => ( 52 | 55 | ))} 56 |
57 |
58 |
59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Details/WizardDetails.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { Button } from '../../../ui'; 3 | import { BorderedInput } from '../../../ui/BorderedInput/BorderedInput'; 4 | import { useProject } from '../hooks/useProject'; 5 | import styles from '../Wizard.module.scss'; 6 | 7 | const { dialog } = window.require('@electron/remote'); 8 | 9 | export const WizardDetails = () => { 10 | const { 11 | resourcePath, 12 | resourceName, 13 | resourceAuthor, 14 | resourceVersion, 15 | resourceDescription, 16 | setResourcePath, 17 | setResourceName, 18 | setResourceAuthor, 19 | setResourceVersion, 20 | setResourceDescription, 21 | } = useProject(); 22 | 23 | const handlePath = () => { 24 | const selectedPath = dialog.showOpenDialogSync({ 25 | title: 'Choose path to install boilerplate', 26 | buttonLabel: 'Select', 27 | properties: ['openDirectory'], 28 | }); 29 | setResourcePath(selectedPath[0]); 30 | localStorage.setItem('previousPath', selectedPath[0]); // Store the new path in local storage 31 | }; 32 | 33 | // Used to check if we have a stored path in our local storage 34 | useEffect(() => { 35 | const prevPath = localStorage.getItem('previousPath'); 36 | if (prevPath) { 37 | setResourcePath(prevPath); 38 | } 39 | }, []); 40 | 41 | return ( 42 |
43 |
44 | 51 | 52 |
53 | 54 | {/* This should def be a reusable component, but rn I am lazy */} 55 |
63 | {/* This should def be a reusable component, but rn I am lazy */} 64 |
65 | 66 | setResourceName(e.currentTarget.value)} 72 | /> 73 |
74 | 75 |
76 | 77 | 83 | setResourceAuthor(e.currentTarget.value) 84 | } 85 | /> 86 |
87 | 88 |
89 | 90 | 96 | setResourceVersion(e.currentTarget.value) 97 | } 98 | /> 99 |
100 |
101 | 102 |
103 |
104 | 105 | 111 | setResourceDescription(e.currentTarget.value) 112 | } 113 | /> 114 |
115 |
116 |
117 | ); 118 | }; 119 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Packages/Package.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Checkbox } from '../../../ui/Checkbox/Checkbox'; 3 | import styles from './WizardPackages.module.scss'; 4 | 5 | interface PackageProps { 6 | packageName: string; 7 | packageTitle: string; 8 | isSelected: boolean; 9 | onClick: (pack: string) => void; 10 | } 11 | 12 | export const Package = ({ 13 | packageName, 14 | isSelected, 15 | packageTitle, 16 | onClick, 17 | }: PackageProps) => { 18 | return ( 19 |
onClick(packageName)}> 20 | 21 |

{packageTitle}

22 |
23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Packages/WizardPackages.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | margin-top: 20px; 3 | width: 100%; 4 | flex: auto; 5 | 6 | .skipText { 7 | color: #f40552; 8 | font-size: 8px; 9 | height: 90%; 10 | font-weight: 400; 11 | display: flex; 12 | justify-content: center; 13 | align-items: center; 14 | } 15 | 16 | .titleSection { 17 | display: flex; 18 | margin-top: 1rem; 19 | flex-direction: column; 20 | 21 | label { 22 | color: #fff; 23 | font-weight: normal; 24 | } 25 | } 26 | 27 | .packageList { 28 | display: flex; 29 | padding: 2rem; 30 | margin-top: 1rem; 31 | flex-direction: column; 32 | border-radius: 10px; 33 | background-color: rgba(14, 14, 16, 0.5); 34 | overflow-y: scroll; 35 | height: 262px; 36 | 37 | .package { 38 | display: flex; 39 | margin-bottom: 1rem; 40 | align-items: center; 41 | 42 | h1 { 43 | margin: 0; 44 | padding: 0; 45 | color: #fff; 46 | font-size: 16px; 47 | margin-left: 0.5rem; 48 | font-weight: normal; 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Packages/WizardPackages.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import { Button } from '../../../ui'; 3 | import { useProject } from '../hooks/useProject'; 4 | import { Package } from './Package'; 5 | import styles from './WizardPackages.module.scss'; 6 | 7 | export const WizardPackages = () => { 8 | const { 9 | setResourcePackages, 10 | resourcePackages, 11 | resourceTemplate, 12 | } = useProject(); 13 | 14 | const handlePackage = (selectedPackage: string) => { 15 | const tempArr = [...resourcePackages]; 16 | const packIndex = tempArr.findIndex((e) => e === selectedPackage); 17 | 18 | if (packIndex >= 0) { 19 | tempArr.splice(packIndex, 1); 20 | } else { 21 | tempArr.push(selectedPackage); 22 | } 23 | 24 | setResourcePackages(tempArr); 25 | }; 26 | 27 | return ( 28 |
29 |
30 | 31 |
32 | 33 | {resourceTemplate === 'Lua' ? ( 34 |
35 |

36 | You are creating a lua resource no need to select 37 | packages! 38 |

39 |
40 | ) : ( 41 |
42 | 48 | 54 | 60 | 66 |
67 | )} 68 |
69 | ); 70 | }; 71 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Pagination/Pagination.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button } from '../../../ui'; 3 | import { useErrorHandler } from '../hooks/useErrorHandler'; 4 | import { usePagination } from '../hooks/usePagination'; 5 | import { useProject } from '../hooks/useProject'; 6 | const { ipcRenderer } = window.require('electron'); 7 | 8 | export default function Pagination() { 9 | const { steps, setSteps } = usePagination(); 10 | const { error, setError } = useErrorHandler(); 11 | 12 | const { 13 | resourcePath, 14 | resourcePackages, 15 | resourceName, 16 | resourceAuthor, 17 | resourceVersion, 18 | resourceTemplate, 19 | resourceDescription, 20 | } = useProject(); 21 | 22 | const handleCreateResource = () => { 23 | ipcRenderer.send('createBoilerplate', { 24 | resourcePath, 25 | resourcePackages, 26 | resourceName, 27 | resourceAuthor, 28 | resourceVersion, 29 | resourceTemplate, 30 | resourceDescription, 31 | }); 32 | }; 33 | 34 | const handleNext = () => { 35 | if (steps === 1) { 36 | if (resourcePath == '') 37 | return setError('Please provide a file path.'); 38 | if (resourceName == '') 39 | return setError('Please provide a resource name.'); 40 | } 41 | 42 | if (steps === 2) { 43 | if (resourceTemplate == '') 44 | return setError('Please select a resource template'); 45 | 46 | if (resourceTemplate === 'Lua') { 47 | setError(null); 48 | return setSteps(4); 49 | } 50 | } 51 | 52 | setSteps(steps + 1); 53 | setError(null); 54 | }; 55 | 56 | const handleBack = () => { 57 | if (resourceTemplate === 'Lua' && steps === 4) { 58 | return setSteps(2); 59 | } 60 | 61 | setSteps(steps - 1); 62 | console.log(steps); 63 | }; 64 | 65 | return ( 66 |
67 | {error && ( 68 |

75 | {error} 76 |

77 | )} 78 |
79 | 82 | {steps === 4 ? ( 83 | 84 | ) : ( 85 | 88 | )} 89 |
90 |
91 | ); 92 | } 93 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/ProjectWizard.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import styles from './Wizard.module.scss'; 3 | import { WizardDetails } from './Details/WizardDetails'; 4 | import Pagination from './Pagination/Pagination'; 5 | import { usePagination } from './hooks/usePagination'; 6 | import { WizardTemplates } from './Template/WizardTemplates'; 7 | import { WizardPackages } from './Packages/WizardPackages'; 8 | import { Steps } from '../Steps/Steps'; 9 | import WizardCompletion from './Completion/WizardCompletion'; 10 | 11 | export const ProjectWizard = () => { 12 | const { steps } = usePagination(); 13 | return ( 14 |
15 |
16 |
17 |

18 | Project Creation Wizard 19 |

20 |
21 | 22 | {steps == 1 && } 23 | {steps == 2 && } 24 | {steps == 3 && } 25 | {steps == 4 && } 26 | 27 | 28 | 29 |
30 |
31 | ); 32 | }; 33 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Template/TemplateItem.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styles from './WizardTemplates.module.scss'; 3 | 4 | interface TemplateItemProps { 5 | thumbnail: React.ReactNode; 6 | title: string; 7 | description: string; 8 | type: string; 9 | active: boolean; 10 | selectTemplate: (e: string) => void; 11 | } 12 | 13 | export const TemplateItem = ({ 14 | thumbnail, 15 | title, 16 | description, 17 | selectTemplate, 18 | type, 19 | active, 20 | }: TemplateItemProps) => { 21 | return ( 22 |
selectTemplate(type)} 26 | > 27 |
{thumbnail}
28 |
29 |

{title}

30 |

{description}

31 |
32 |
33 | ); 34 | }; 35 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Template/WizardTemplates.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | margin-top: 20px; 3 | width: 100%; 4 | flex: auto; 5 | 6 | .searchSection { 7 | display: flex; 8 | margin-top: 1rem; 9 | flex-direction: column; 10 | 11 | label { 12 | color: #fff; 13 | font-weight: normal; 14 | } 15 | } 16 | 17 | .templateList { 18 | display: flex; 19 | padding: 2rem; 20 | margin-top: 1rem; 21 | flex-direction: column; 22 | border-radius: 10px; 23 | background-color: rgba(14, 14, 16, 0.5); 24 | overflow-y: scroll; 25 | height: 262px; 26 | } 27 | 28 | .template { 29 | display: flex; 30 | width: 100%; 31 | height: 90px; 32 | align-items: center; 33 | /*border-radius: 10px;*/ 34 | background-color: #1f2022; 35 | margin-bottom: 1rem; 36 | transition: ease-in 0.1s; 37 | 38 | &:hover { 39 | cursor: pointer; 40 | box-shadow: 0px 0px 3px 2px #f40552; 41 | } 42 | 43 | .thumbnail { 44 | height: 90px; 45 | border-top-left-radius: 10px; 46 | border-bottom-left-radius: 10px; 47 | } 48 | 49 | .info { 50 | margin-left: 1rem; 51 | 52 | .miniIcon { 53 | height: 16px; 54 | margin-left: 0.5rem; 55 | } 56 | 57 | h1 { 58 | display: flex; 59 | align-items: center; 60 | margin: 0; 61 | padding: 0; 62 | color: #fff; 63 | font-weight: normal; 64 | font-size: 18px; 65 | } 66 | 67 | p { 68 | margin: 0; 69 | padding: 0; 70 | margin-top: 0.5rem; 71 | color: #999999; 72 | font-size: 12px; 73 | width: 75%; 74 | } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Template/WizardTemplates.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { useProject } from '../hooks/useProject'; 3 | import { TemplateItem } from './TemplateItem'; 4 | import styles from './WizardTemplates.module.scss'; 5 | import { SiTypescript, SiJavascript, SiLua } from 'react-icons/si'; 6 | 7 | const templates = [ 8 | { 9 | type: 'TypeScript', 10 | title: 'Typescript Resource', 11 | description: 'A complete starter kit with tsconfig and webpack.', 12 | thumbnail: , 13 | }, 14 | { 15 | type: 'JavaScript', 16 | title: 'Javascript Resource', 17 | description: 'A simple boilerplate with webpack.', 18 | thumbnail: , 19 | }, 20 | { 21 | type: 'Lua', 22 | title: 'Lua Resource', 23 | description: 'Includes a client and server file.', 24 | thumbnail: , 25 | }, 26 | ]; 27 | 28 | export const WizardTemplates = () => { 29 | const { resourceTemplate, setResourceTemplate } = useProject(); 30 | 31 | const setTemplate = (temp: string) => { 32 | setResourceTemplate(temp); 33 | }; 34 | 35 | return ( 36 |
37 |
38 | 39 | {/* */} 40 |
41 | 42 |
43 | {templates && 44 | templates.map((temp) => ( 45 | setTemplate(type)} 53 | /> 54 | ))} 55 |
56 |
57 | ); 58 | }; 59 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/Wizard.module.scss: -------------------------------------------------------------------------------- 1 | .projectWrapper { 2 | width: 1400px; 3 | height: 750px; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | } 8 | 9 | .projectContainer { 10 | width: 1100px; 11 | height: 600px; 12 | padding: 2rem; 13 | border-radius: 10px; 14 | background-color: #131517; 15 | display: flex; 16 | flex-direction: column; 17 | align-items: center; 18 | } 19 | 20 | .wizardHeader { 21 | width: 100%; 22 | } 23 | 24 | .wizardHeaderTitle { 25 | color: #fff; 26 | font-weight: 500; 27 | font-size: 22px; 28 | } 29 | 30 | .projectOptions { 31 | margin-top: 20px; 32 | display: flex; 33 | } 34 | 35 | .errorText { 36 | color: red; 37 | } 38 | 39 | /* Options styles */ 40 | .optionLabel { 41 | color: #fff; 42 | font-size: 18px; 43 | } 44 | 45 | .underlineInputWrapper { 46 | display: flex; 47 | flex-direction: column; 48 | width: 50%; 49 | } 50 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/hooks/useErrorHandler.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { WizardContext } from '../../../context/WizardProvider'; 3 | 4 | export const useErrorHandler = () => { 5 | const { error, setError } = useContext(WizardContext); 6 | return { error, setError }; 7 | }; 8 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/hooks/usePagination.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { WizardContext } from '../../../context/WizardProvider'; 3 | 4 | export const usePagination = () => { 5 | const { steps, setSteps } = useContext(WizardContext); 6 | return { steps, setSteps }; 7 | }; 8 | -------------------------------------------------------------------------------- /src/renderer/components/Wizard/hooks/useProject.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { WizardContext } from '../../../context/WizardProvider'; 3 | 4 | export const useProject = () => { 5 | const { 6 | resourcePath, 7 | resourcePackages, 8 | resourceName, 9 | resourceAuthor, 10 | resourceVersion, 11 | resourceTemplate, 12 | resourceDescription, 13 | setResourcePath, 14 | setResourceName, 15 | setResourceAuthor, 16 | setResourceTemplate, 17 | setResourceVersion, 18 | setResourcePackages, 19 | setResourceDescription, 20 | } = useContext(WizardContext); 21 | return { 22 | resourcePath, 23 | resourceName, 24 | resourceAuthor, 25 | resourceVersion, 26 | resourceTemplate, 27 | resourcePackages, 28 | resourceDescription, 29 | setResourcePath, 30 | setResourceTemplate, 31 | setResourceName, 32 | setResourceAuthor, 33 | setResourceVersion, 34 | setResourcePackages, 35 | setResourceDescription, 36 | }; 37 | }; 38 | -------------------------------------------------------------------------------- /src/renderer/context/WizardProvider.tsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState } from 'react'; 2 | 3 | export const WizardContext = createContext(undefined); 4 | 5 | export const WizardProvider = ({ children }: { children: React.ReactNode }) => { 6 | const [resourcePath, setResourcePath] = useState(''); 7 | const [resourceName, setResourceName] = useState(''); 8 | const [resourceAuthor, setResourceAuthor] = useState(''); 9 | const [resourceTemplate, setResourceTemplate] = useState(''); 10 | const [resourceVersion, setResourceVersion] = useState(''); 11 | const [resourceDescription, setResourceDescription] = useState(''); 12 | const [resourcePackages, setResourcePackages] = useState([]); 13 | 14 | const [error, setError] = useState(null); 15 | 16 | const [steps, setSteps] = useState(1); 17 | 18 | const value = { 19 | steps, 20 | setSteps, 21 | error, 22 | setError, 23 | resourcePath, 24 | resourceName, 25 | resourceAuthor, 26 | resourcePackages, 27 | resourceVersion, 28 | resourceTemplate, 29 | resourceDescription, 30 | setResourcePath, 31 | setResourceName, 32 | setResourceAuthor, 33 | setResourceVersion, 34 | setResourceTemplate, 35 | setResourceDescription, 36 | setResourcePackages, 37 | }; 38 | 39 | return ( 40 | 41 | {children} 42 | 43 | ); 44 | }; 45 | 46 | interface WizardProps { 47 | steps: number; 48 | setSteps: (step: number) => void; 49 | error: string | null; 50 | setError: (error: string) => void; 51 | 52 | // Resource related state 53 | resourcePath: string; 54 | resourceName: string; 55 | resourceAuthor: string; 56 | resourceVersion: string; 57 | resourceTemplate: string; 58 | resourceDescription: string; 59 | resourcePackages: string[]; 60 | setResourcePath: (val: string) => void; 61 | setResourceTemplate: (val: string) => void; 62 | setResourceName: (val: string) => void; 63 | setResourcePackages: (val: string[]) => void; 64 | setResourceAuthor: (val: string) => void; 65 | setResourceVersion: (val: string) => void; 66 | setResourceDescription: (val: string) => void; 67 | } 68 | -------------------------------------------------------------------------------- /src/renderer/index.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | box-sizing: border-box; 6 | font-family: 'Rubik', sans-serif; 7 | } 8 | 9 | body { 10 | background-color: #0e0e10; 11 | } 12 | 13 | /* width */ 14 | ::-webkit-scrollbar { 15 | width: 5px; 16 | } 17 | 18 | /* Track */ 19 | ::-webkit-scrollbar-track { 20 | padding: 5px; 21 | border-radius: 10px; 22 | } 23 | 24 | /* Handle */ 25 | ::-webkit-scrollbar-thumb { 26 | background: #f40552; 27 | border-radius: 10px; 28 | } 29 | 30 | /* Handle on hover */ 31 | ::-webkit-scrollbar-thumb:hover { 32 | background: #f40552; 33 | } 34 | -------------------------------------------------------------------------------- /src/renderer/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | import './index.css'; 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById('root'), 11 | ); 12 | 13 | // Hot Module Replacement (HMR) - Remove this snippet to remove HMR. 14 | // Learn more: https://snowpack.dev/concepts/hot-module-replacement 15 | if (import.meta.hot) { 16 | import.meta.hot.accept(); 17 | } 18 | -------------------------------------------------------------------------------- /src/renderer/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/renderer/ui/BorderedInput/BorderedInput.module.scss: -------------------------------------------------------------------------------- 1 | .borderdInput { 2 | border: none; 3 | border-radius: 6px; 4 | background-color: #1e2023; 5 | box-shadow: inset 0 0 2px rgba(255, 255, 255, 0.3); 6 | font-size: 20px; 7 | color: #eee; 8 | margin: 0.5rem 0; 9 | outline: none; 10 | font-size: 15px; 11 | padding: 15px !important; 12 | } 13 | -------------------------------------------------------------------------------- /src/renderer/ui/BorderedInput/BorderedInput.tsx: -------------------------------------------------------------------------------- 1 | import React, { CSSProperties } from 'react'; 2 | import styles from './BorderedInput.module.scss'; 3 | 4 | interface BorderedInputProps 5 | extends React.InputHTMLAttributes { 6 | style?: CSSProperties; 7 | width?: string; 8 | } 9 | 10 | export const BorderedInput = ({ 11 | width = '100%', 12 | style, 13 | ...rest 14 | }: BorderedInputProps) => { 15 | return ( 16 | 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /src/renderer/ui/Button/Button.module.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | color: #fff; 3 | background-color: #1e2023; 4 | box-shadow: inset 0 0 2px rgba(255, 255, 255, 0.3); 5 | padding: 10px 30px; 6 | border: none; 7 | border-radius: 6px; 8 | outline: none; 9 | 10 | font-size: 16px; 11 | 12 | display: flex; 13 | align-items: center; 14 | justify-content: space-evenly; 15 | 16 | cursor: pointer; 17 | margin: 0.5rem 0; 18 | 19 | &:hover { 20 | background-color: rgba(30, 32, 35, 0.5); 21 | } 22 | 23 | &:disabled { 24 | color: #656565; 25 | 26 | &:hover { 27 | background-color: #161923; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/renderer/ui/Button/Button.tsx: -------------------------------------------------------------------------------- 1 | import React, { CSSProperties } from 'react'; 2 | import styles from './Button.module.scss'; 3 | 4 | interface ButtonProps extends React.ButtonHTMLAttributes { 5 | children: React.ReactNode; 6 | onClick: (event: React.MouseEvent) => void; 7 | style?: CSSProperties; 8 | } 9 | 10 | export const Button = ({ children, onClick, style, ...rest }: ButtonProps) => { 11 | return ( 12 | 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /src/renderer/ui/Checkbox/Checkbox.module.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | box-shadow: inset 0 0 2px rgba(255, 255, 255, 0.3); 3 | border: none; 4 | border-radius: 6px; 5 | outline: none; 6 | transition: ease-in 0.2s; 7 | 8 | .checkMark { 9 | height: 18px; 10 | } 11 | 12 | &:hover { 13 | cursor: pointer; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/renderer/ui/Checkbox/Checkbox.tsx: -------------------------------------------------------------------------------- 1 | import React, { CSSProperties } from 'react'; 2 | import styles from './Checkbox.module.scss'; 3 | import CheckMark from '../../assets/check-mark.svg'; 4 | 5 | interface CheckboxProps extends React.ButtonHTMLAttributes { 6 | style?: CSSProperties; 7 | size?: number; 8 | isChecked: boolean; 9 | } 10 | 11 | export const Checkbox = ({ 12 | size = 28, 13 | style, 14 | isChecked, 15 | ...rest 16 | }: CheckboxProps) => { 17 | return ( 18 | 29 | ); 30 | }; 31 | -------------------------------------------------------------------------------- /src/renderer/ui/PaginationButton/PaginationButton.module.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | border: 2px solid #f40552; 3 | margin: 0.5rem 0; 4 | transform: rotate(45deg); 5 | 6 | &:hover { 7 | cursor: pointer; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/ui/PaginationButton/PaginationButton.tsx: -------------------------------------------------------------------------------- 1 | import React, { CSSProperties } from 'react'; 2 | import styles from './PaginationButton.module.scss'; 3 | 4 | interface PaginationButtonProps 5 | extends React.ButtonHTMLAttributes { 6 | style?: CSSProperties; 7 | size?: number; 8 | active: boolean; 9 | } 10 | 11 | export const PaginationButton = ({ 12 | size = 28, 13 | active, 14 | children, 15 | style, 16 | ...rest 17 | }: PaginationButtonProps) => { 18 | return ( 19 | 29 | ); 30 | }; 31 | -------------------------------------------------------------------------------- /src/renderer/ui/UnderlineInput/UnderlineInput.module.scss: -------------------------------------------------------------------------------- 1 | .underlineInput { 2 | border: none; 3 | border-bottom: #c5c5bd 2px solid; 4 | background: #161923; 5 | font-size: 20px; 6 | padding: 5px 10px; 7 | margin: 0.5rem 0; 8 | color: rgba(255, 255, 255, 0.2); 9 | outline: none; 10 | 11 | &:active, 12 | &:focus { 13 | border-bottom: #f40552 2px solid; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/renderer/ui/UnderlineInput/UnderlineInput.tsx: -------------------------------------------------------------------------------- 1 | import React, { CSSProperties } from 'react'; 2 | import styles from './UnderlineInput.module.scss'; 3 | 4 | interface UnderlineInputProps 5 | extends React.InputHTMLAttributes { 6 | style?: CSSProperties; 7 | width?: string; 8 | } 9 | 10 | export const UnderlineInput = ({ 11 | width = '100%', 12 | style, 13 | ...rest 14 | }: UnderlineInputProps) => { 15 | return ( 16 | 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /src/renderer/ui/index.ts: -------------------------------------------------------------------------------- 1 | import { Button } from './Button/Button'; 2 | 3 | export { Button }; 4 | -------------------------------------------------------------------------------- /src/renderer/vendor/cursor.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-error/cfa-gui/6cec44be3fc3935901e0b1a4ce1041960711e715/src/renderer/vendor/cursor.cur -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "electron-snowpack/config/tsconfig.json", 3 | "include": ["src", "types"], 4 | "compilerOptions": { 5 | "module": "esnext", 6 | "target": "esnext", 7 | "moduleResolution": "node", 8 | "jsx": "preserve", 9 | /* noEmit - Snowpack builds (emits) files, not tsc. */ 10 | "noEmit": true, 11 | /* Additional Options */ 12 | "strict": true, 13 | "skipLibCheck": true, 14 | "strictNullChecks": false, 15 | "forceConsistentCasingInFileNames": true, 16 | "resolveJsonModule": true, 17 | "allowSyntheticDefaultImports": true 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /types/static.d.ts: -------------------------------------------------------------------------------- 1 | /* Use this file to declare any custom file extensions for importing */ 2 | /* Use this folder to also add/extend a package d.ts file, if needed. */ 3 | 4 | /* CSS MODULES */ 5 | declare module '*.module.css' { 6 | const classes: { [key: string]: string }; 7 | export default classes; 8 | } 9 | declare module '*.module.scss' { 10 | const classes: { [key: string]: string }; 11 | export default classes; 12 | } 13 | declare module '*.module.sass' { 14 | const classes: { [key: string]: string }; 15 | export default classes; 16 | } 17 | declare module '*.module.less' { 18 | const classes: { [key: string]: string }; 19 | export default classes; 20 | } 21 | declare module '*.module.styl' { 22 | const classes: { [key: string]: string }; 23 | export default classes; 24 | } 25 | 26 | /* CSS */ 27 | declare module '*.css'; 28 | declare module '*.scss'; 29 | declare module '*.sass'; 30 | declare module '*.less'; 31 | declare module '*.styl'; 32 | 33 | /* IMAGES */ 34 | declare module '*.svg' { 35 | const ref: string; 36 | export default ref; 37 | } 38 | declare module '*.bmp' { 39 | const ref: string; 40 | export default ref; 41 | } 42 | declare module '*.gif' { 43 | const ref: string; 44 | export default ref; 45 | } 46 | declare module '*.jpg' { 47 | const ref: string; 48 | export default ref; 49 | } 50 | declare module '*.jpeg' { 51 | const ref: string; 52 | export default ref; 53 | } 54 | declare module '*.png' { 55 | const ref: string; 56 | export default ref; 57 | } 58 | 59 | /* CUSTOM: ADD YOUR OWN HERE */ 60 | declare global { 61 | interface Window { 62 | require(moduleSpecifier: 'electron'); 63 | require(moduleSpecifier: '@electron/remote'); 64 | } 65 | } 66 | --------------------------------------------------------------------------------