├── .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 |
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 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------