├── client
└── acp
│ ├── model
│ ├── constants.js
│ ├── selectors.js
│ ├── action-types.js
│ ├── socket-methods.js
│ ├── reducers.js
│ └── store.js
│ ├── .eslintrc
│ ├── util
│ ├── is-rule-valid.js
│ └── get-sanitized-name.js
│ ├── controller
│ ├── change-rule-field.js
│ ├── change-new-rule-field.js
│ └── actions.js
│ ├── package.json
│ ├── webpack.config.js
│ ├── view
│ ├── utils.js
│ ├── rule-details.js
│ ├── rule-create.js
│ ├── admin.js
│ ├── form-actions.js
│ ├── rules.js
│ └── rule-form.js
│ ├── index.js
│ ├── service
│ └── socket-service.js
│ └── package-lock.json
├── screenshot.png
├── public
├── templates
│ └── admin
│ │ └── plugins
│ │ └── embed.tpl
├── css
│ └── acp.css
└── js
│ └── acp.js.LICENSE.txt
├── plugin
├── constants.js
├── utils.js
├── logger.js
├── filters.js
├── index.js
├── sockets.js
├── rules.js
├── nodebb.js
├── database.js
└── controller.js
├── style
├── _vars.scss
├── forum.scss
├── main.scss
└── _palette.scss
├── .github
├── workflows
│ └── nodejs.yml
└── FUNDING.yml
├── LICENSE
├── package.json
├── README.md
├── plugin.json
├── .gitignore
├── CHANGELOG.md
├── data
└── default-rules.json
├── docs
└── community-rules.md
└── test
└── regexRules.spec.js
/client/acp/model/constants.js:
--------------------------------------------------------------------------------
1 | export const DEFAULT_RULE_ACTION = 'createRule';
2 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NicolasSiver/nodebb-plugin-ns-embed/HEAD/screenshot.png
--------------------------------------------------------------------------------
/public/templates/admin/plugins/embed.tpl:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/plugin/constants.js:
--------------------------------------------------------------------------------
1 | module.exports = Object.freeze({
2 | 'COUNTER' : 'nextNsEmbedRule',
3 | 'NAMESPACE' : 'ns:embed',
4 | 'SOCKET_NAMESPACE': 'ns-embed'
5 | });
6 |
--------------------------------------------------------------------------------
/client/acp/model/selectors.js:
--------------------------------------------------------------------------------
1 | export const getNewRule = state => state.newRule;
2 |
3 | export const getRules = state => state.rules;
4 |
5 | export const getSelectedRule = state => state.selectedRule;
6 |
--------------------------------------------------------------------------------
/style/_vars.scss:
--------------------------------------------------------------------------------
1 | @use "sass:math";
2 |
3 | $rhythm: 8px;
4 |
5 | $margin-xs: math.div($rhythm, 2);
6 | $margin-s: $rhythm;
7 | $margin: $rhythm * 2;
8 | $margin-l: $rhythm * 3;
9 | $margin-xl: $rhythm * 4;
--------------------------------------------------------------------------------
/client/acp/model/action-types.js:
--------------------------------------------------------------------------------
1 | export const NEW_RULE_DID_CHANGE = 'newRuleDidChange';
2 |
3 | export const RULES_DID_CHANGE = 'rulesDidChange';
4 |
5 | export const SELECTED_RULE_DID_CHANGE = 'selectedRuleDidChange';
6 |
--------------------------------------------------------------------------------
/client/acp/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "es6": true
4 | },
5 | "rules": {
6 | "no-multi-spaces": 0,
7 | "quotes": [
8 | 2,
9 | "single"
10 | ]
11 | },
12 | "ecmaFeatures": {
13 | "modules": true,
14 | "jsx": true
15 | }
16 | }
--------------------------------------------------------------------------------
/client/acp/util/is-rule-valid.js:
--------------------------------------------------------------------------------
1 | export function isRuleValid(...fields) {
2 | for (let field of fields) {
3 | if (field === null || field === undefined || typeof field === 'string' && field.length === 0) {
4 | return false;
5 | }
6 | }
7 |
8 | return true;
9 | }
10 |
--------------------------------------------------------------------------------
/client/acp/util/get-sanitized-name.js:
--------------------------------------------------------------------------------
1 | const specialChars = /[^\w]/gi;
2 |
3 | export function getSanitizedName(value) {
4 | let result = value;
5 |
6 | if (value !== null && value !== undefined) {
7 | value = value.toLowerCase();
8 | value = value.replace(specialChars, '');
9 | result = value;
10 | }
11 |
12 | return result;
13 | }
14 |
--------------------------------------------------------------------------------
/client/acp/model/socket-methods.js:
--------------------------------------------------------------------------------
1 | export const CREATE_RULE = 'admin.plugins.ns-embed.ruleCreate';
2 |
3 | export const DELETE_RULE = 'admin.plugins.ns-embed.ruleDelete';
4 |
5 | export const GET_ALL_RULES = 'admin.plugins.ns-embed.embedRulesGet';
6 |
7 | export const INSTALL_DEFAULT_RULES = 'admin.plugins.ns-embed.defaultRulesInstall';
8 |
9 | export const SAVE_RULE = 'admin.plugins.ns-embed.ruleSave';
10 |
--------------------------------------------------------------------------------
/client/acp/controller/change-rule-field.js:
--------------------------------------------------------------------------------
1 | import {setRules} from './actions';
2 | import {getRules} from '../model/selectors';
3 |
4 | export function changeRuleField(ruleSelected, field, value, store) {
5 | let rules = getRules(store.getState()).slice();
6 | let editRule = rules.find(rule => rule.rid === ruleSelected.rid);
7 |
8 | editRule[field] = value;
9 |
10 | store.dispatch(setRules(rules));
11 | }
12 |
--------------------------------------------------------------------------------
/client/acp/controller/change-new-rule-field.js:
--------------------------------------------------------------------------------
1 | import {setNewRule} from './actions';
2 | import {getSanitizedName} from '../util/get-sanitized-name';
3 | import {getNewRule} from '../model/selectors';
4 |
5 | export function changeNewRuleField(field, value, store) {
6 | let rule = {...getNewRule(store.getState())};
7 |
8 | rule[field] = field === 'name' ? getSanitizedName(value) : value;
9 |
10 | store.dispatch(setNewRule(rule));
11 | }
12 |
--------------------------------------------------------------------------------
/style/forum.scss:
--------------------------------------------------------------------------------
1 | .embed-wrapper {
2 | width: 100%;
3 | max-width: 640px;
4 | overflow: hidden;
5 |
6 | &.embed-vine {
7 | max-width: 480px;
8 |
9 | .embed-container {
10 | padding-bottom: 100%;
11 | }
12 | }
13 |
14 | .embed-container {
15 | position: relative;
16 | padding-bottom: 56.25%; /* 16:9 */
17 | height: 0;
18 |
19 | iframe {
20 | position: absolute;
21 | top: 0;
22 | left: 0;
23 | width: 100%;
24 | height: 100%;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/client/acp/controller/actions.js:
--------------------------------------------------------------------------------
1 | import * as ActionTypes from '../model/action-types';
2 |
3 | export function setNewRule(rule) {
4 | return {
5 | type : ActionTypes.NEW_RULE_DID_CHANGE,
6 | payload: rule
7 | };
8 | }
9 |
10 | export function setRules(rules) {
11 | return {
12 | type : ActionTypes.RULES_DID_CHANGE,
13 | payload: rules
14 | };
15 | }
16 |
17 | export function setSelectedRule(rule) {
18 | return {
19 | type : ActionTypes.SELECTED_RULE_DID_CHANGE,
20 | payload: rule
21 | };
22 | }
23 |
--------------------------------------------------------------------------------
/.github/workflows/nodejs.yml:
--------------------------------------------------------------------------------
1 | name: Node.js CI
2 |
3 | on:
4 | push:
5 | branches: [ main, master ]
6 | pull_request:
7 | branches: [ main, master ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 | strategy:
13 | matrix:
14 | node-version: [14]
15 | steps:
16 | - uses: actions/checkout@v4
17 | - name: Use Node.js ${{ matrix.node-version }}
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: ${{ matrix.node-version }}
21 | cache: 'npm'
22 | - run: npm install
23 | - run: npm test
24 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: NicolasSiver
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/public/css/acp.css:
--------------------------------------------------------------------------------
1 | /**
2 | * google-material-color v1.2.6
3 | * https://github.com/danlevan/google-material-color
4 | */
5 | .plugin-embed .actions button + button {
6 | margin-left: 8px;
7 | }
8 | .plugin-embed .rules {
9 | display: flex;
10 | flex-flow: row wrap;
11 | }
12 | .plugin-embed .rules .item {
13 | cursor: pointer;
14 | border-radius: 4px;
15 | border: 1px solid #EEEEEE;
16 | width: 160px;
17 | padding: 16px;
18 | margin: 4px;
19 | flex: 0 1 auto;
20 | }
21 | .plugin-embed .rules .item.selected {
22 | border: 1px solid #1976D2;
23 | background-color: #2196F3;
24 | color: #ffffff;
25 | }
26 | .plugin-embed .utils-info {
27 | font-size: 0.8em;
28 | line-height: 1.2em;
29 | color: #455A64;
30 | }
31 |
--------------------------------------------------------------------------------
/plugin/utils.js:
--------------------------------------------------------------------------------
1 | function isInList(field, value, list) {
2 | let i, listItem;
3 | let result = false;
4 | let len = list.length;
5 |
6 | for (i = 0; i < len; ++i) {
7 | listItem = list[i];
8 |
9 | if (listItem[field] === value) {
10 | result = true;
11 | break;
12 | }
13 | }
14 |
15 | return result;
16 | }
17 |
18 | function payloadToRule(payload) {
19 | let rule = {};
20 |
21 | // TODO Validation?
22 |
23 | rule.name = payload.name;
24 | rule.displayName = payload.displayName;
25 | rule.regex = payload.regex;
26 | rule.replacement = payload.replacement;
27 | rule.icon = payload.icon || 'fa-cogs';
28 |
29 | return rule;
30 | }
31 |
32 | module.exports = {isInList, payloadToRule};
--------------------------------------------------------------------------------
/plugin/logger.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by Nicolas on 10/25/15.
3 | */
4 | (function (Module) {
5 | 'use strict';
6 |
7 | var winston = require('winston');
8 |
9 | Module.exports = new (winston.Logger)({
10 | transports: [
11 | new (winston.transports.Console)({
12 | colorize : true,
13 | timestamp: function () {
14 | var date = new Date();
15 | return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 5) + ' [' + global.process.pid + ']';
16 | },
17 | level : global.env === 'production' ? 'info' : 'verbose',
18 | label : 'plugins/embed'
19 | })
20 | ]
21 | });
22 |
23 | })(module);
--------------------------------------------------------------------------------
/client/acp/model/reducers.js:
--------------------------------------------------------------------------------
1 | import * as ActionTypes from './action-types';
2 |
3 | export function newRule(state, action) {
4 | switch (action.type) {
5 | case ActionTypes.NEW_RULE_DID_CHANGE:
6 | return action.payload;
7 | default:
8 | return state;
9 | }
10 | }
11 |
12 | export function rules(state, action) {
13 | switch (action.type) {
14 | case ActionTypes.RULES_DID_CHANGE:
15 | return action.payload;
16 | default:
17 | return state;
18 | }
19 | }
20 |
21 | export function selectedRule(state, action) {
22 | switch (action.type) {
23 | case ActionTypes.SELECTED_RULE_DID_CHANGE:
24 | return action.payload;
25 | default:
26 | return state;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/style/main.scss:
--------------------------------------------------------------------------------
1 | @import "palette";
2 | @import "vars";
3 |
4 | .plugin-embed {
5 | .actions {
6 | button + button {
7 | margin-left: $margin-s;
8 | }
9 | }
10 |
11 | .rules {
12 | display: flex;
13 | flex-flow: row wrap;
14 |
15 | .item {
16 | cursor: pointer;
17 | border-radius: $margin-xs;
18 | border: 1px solid palette(Grey, 200);
19 | width: 160px;
20 | padding: $margin;
21 | margin: $margin-xs;
22 | flex: 0 1 auto;
23 |
24 | &.selected {
25 | border: 1px solid palette(Blue, 700);
26 | background-color: palette(Blue, 500);
27 | color: palette(White, 500);
28 | }
29 |
30 | }
31 | }
32 |
33 | .utils-info {
34 | font-size: 0.8em;
35 | line-height: 1.2em;
36 | color: palette(Blue Grey, 700);
37 | }
38 | }
--------------------------------------------------------------------------------
/client/acp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "embed-acp",
3 | "version": "2.1.0",
4 | "description": "ACP for Embed Plugin - control available embeds, edit rules, etc.",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --env production",
8 | "test": "echo \"Error: no test specified\" && exit 1",
9 | "watch": "webpack watch"
10 | },
11 | "keywords": [
12 | "acp",
13 | "ux",
14 | "ui"
15 | ],
16 | "author": "Nicolas Siver",
17 | "license": "MIT",
18 | "devDependencies": {
19 | "@babel/core": "^7.14.3",
20 | "@babel/preset-react": "^7.13.13",
21 | "babel-loader": "^8.2.2",
22 | "webpack": "^5.38.1",
23 | "webpack-cli": "^4.7.0"
24 | },
25 | "dependencies": {
26 | "classnames": "^2.2.3",
27 | "react": "^17.0.2",
28 | "react-dom": "^17.0.2"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/client/acp/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = env => {
4 | return {
5 | entry : "./index.js",
6 | mode : env.production === true ? 'production' : 'development',
7 | module: {
8 | rules: [
9 | {
10 | test: /\.jsx?$/,
11 | use : {
12 | loader : 'babel-loader',
13 | options: {
14 | exclude: /node_modules/,
15 | presets: ['@babel/preset-react']
16 | }
17 | }
18 | }
19 | ]
20 | },
21 | output: {
22 | path : path.resolve(__dirname, '../../public/js'),
23 | filename : "acp.js",
24 | libraryTarget: "amd",
25 | library : "admin/plugins/embed"
26 | },
27 | };
28 | };
29 |
--------------------------------------------------------------------------------
/client/acp/view/utils.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const Utils = props => {
4 | return (
5 |
6 |
Utils
7 |
8 |
9 | Install the rules shipped with the plugin, such as YouTube and Vimeo.
10 | Please, check the plugin documentation for the full list.
11 | If a rule with the same name is installed already, the rule from the default pack will be skipped.
12 |
13 |
14 |
props.installDefaultRules()}
17 | type="button">
18 | Install Default Rules
19 |
20 |
21 |
22 | );
23 | };
24 |
--------------------------------------------------------------------------------
/client/acp/view/rule-details.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import {FormActions} from './form-actions';
4 | import {RuleForm} from './rule-form';
5 |
6 | export const RuleDetails = props => {
7 | let name = 'Rule: ' + props.rule.displayName;
8 |
9 | return (
10 |
11 |
{name}
12 |
13 | props.fieldWillChange(props.rule, property, value)}
15 | {...props}/>
16 |
17 | props.ruleWillDelete(props.rule)}
20 | dangerValid={true}
21 | okButton="Save"
22 | okButtonClick={() => props.ruleWillSave(props.rule)}
23 | okValid={true}/>
24 |
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/public/js/acp.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*
2 | object-assign
3 | (c) Sindre Sorhus
4 | @license MIT
5 | */
6 |
7 | /*!
8 | Copyright (c) 2016 Jed Watson.
9 | Licensed under the MIT License (MIT), see
10 | http://jedwatson.github.io/classnames
11 | */
12 |
13 | /** @license React v0.20.2
14 | * scheduler.production.min.js
15 | *
16 | * Copyright (c) Facebook, Inc. and its affiliates.
17 | *
18 | * This source code is licensed under the MIT license found in the
19 | * LICENSE file in the root directory of this source tree.
20 | */
21 |
22 | /** @license React v17.0.2
23 | * react-dom.production.min.js
24 | *
25 | * Copyright (c) Facebook, Inc. and its affiliates.
26 | *
27 | * This source code is licensed under the MIT license found in the
28 | * LICENSE file in the root directory of this source tree.
29 | */
30 |
31 | /** @license React v17.0.2
32 | * react.production.min.js
33 | *
34 | * Copyright (c) Facebook, Inc. and its affiliates.
35 | *
36 | * This source code is licensed under the MIT license found in the
37 | * LICENSE file in the root directory of this source tree.
38 | */
39 |
--------------------------------------------------------------------------------
/client/acp/view/rule-create.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import {FormActions} from './form-actions';
4 | import {isRuleValid} from '../util/is-rule-valid';
5 | import {RuleForm} from './rule-form';
6 |
7 | export const RuleCreate = props => {
8 | let valid = isRuleValid(props.rule.name, props.rule.displayName, props.rule.regex, props.rule.replacement);
9 |
10 | return (
11 |
12 |
Create Rule
13 |
14 | props.newRuleFieldWillChange(property, value)}
16 | {...props}/>
17 |
18 | props.ruleWillCreate()}
21 | okValid={valid}
22 | warningButton="Reset"
23 | warningButtonClick={() => props.ruleWillReset()}
24 | warningValid={true}/>
25 |
26 |
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Nicolas Siver
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nodebb-plugin-ns-embed",
3 | "version": "7.0.0",
4 | "description": "Embed media and rich content in posts: youtube, vimeo, twitch etc. All embeds are based on the rules. You are encouraged to build your own rules to embed everything what is embeddable.",
5 | "main": "./plugin/index.js",
6 | "scripts": {
7 | "compile-acp-styles": "sass --no-source-map ./style/main.scss ./public/css/acp.css",
8 | "test": "mocha --recursive"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/NicolasSiver/nodebb-plugin-ns-embed.git"
13 | },
14 | "keywords": [
15 | "embed",
16 | "youtube",
17 | "vimeo",
18 | "video",
19 | "audio",
20 | "ria"
21 | ],
22 | "author": "Nicolas Siver",
23 | "license": "MIT",
24 | "bugs": {
25 | "url": "https://github.com/NicolasSiver/nodebb-plugin-ns-embed/issues"
26 | },
27 | "homepage": "https://github.com/NicolasSiver/nodebb-plugin-ns-embed#readme",
28 | "dependencies": {
29 | "async": "^3.1.0",
30 | "winston": "^2.3.1"
31 | },
32 | "devDependencies": {
33 | "chai": "^4.3.4",
34 | "mocha": "^8.4.0",
35 | "sass": "^1.34.0"
36 | },
37 | "nbbpm": {
38 | "compatibility": "^3.0.0"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/plugin/filters.js:
--------------------------------------------------------------------------------
1 | (function (Filters) {
2 | 'use strict';
3 |
4 | let controller = require('./controller');
5 |
6 | Filters.adminHeaderBuild = function (header, callback) {
7 | header.plugins.push({
8 | route: '/plugins/embed',
9 | icon : 'fa-share-alt',
10 | name : 'Embed'
11 | });
12 | callback(null, header);
13 | };
14 |
15 | Filters.adminScripts = function (list, callback) {
16 | list.push('https://checkout.stripe.com/checkout.js');
17 | callback(null, list);
18 | };
19 |
20 | Filters.parsePost = function (payload, callback) {
21 | controller.parsePost(payload, callback);
22 | };
23 |
24 | Filters.parseRaw = function (payload, callback) {
25 | controller.parseContent(payload, callback);
26 | };
27 |
28 | // Full list of the attributes: https://github.com/NodeBB/NodeBB/blob/21c992242e1219c8d726ddc5b3b661adc9fd44c2/src/posts/parse.js#L21
29 | Filters.sanitizeConfig = function (payload, callback) {
30 | let iframeConfig = payload.allowedAttributes.iframe;
31 |
32 | iframeConfig.push('allowfullscreen');
33 | iframeConfig.push('frameborder');
34 | callback(null, payload);
35 | };
36 |
37 | })(module.exports);
38 |
--------------------------------------------------------------------------------
/client/acp/view/admin.js:
--------------------------------------------------------------------------------
1 | import React, {useContext} from 'react';
2 |
3 | import * as Constants from '../model/constants';
4 | import {RuleCreate} from './rule-create';
5 | import {RuleDetails} from './rule-details';
6 | import {Rules} from './rules';
7 | import {getNewRule, getSelectedRule} from '../model/selectors';
8 | import {StoreContext} from '../model/store';
9 | import {Utils} from './utils';
10 |
11 | export const Admin = props => {
12 | let {store} = useContext(StoreContext);
13 |
14 | function renderExtendedView() {
15 | let view = null;
16 | let state = store.getState();
17 | let selectedRule = getSelectedRule(state);
18 |
19 | if (selectedRule !== null) {
20 | if (selectedRule.name === Constants.DEFAULT_RULE_ACTION) {
21 | view = ;
22 | } else {
23 | view = ;
24 | }
25 | }
26 |
27 | return view;
28 | }
29 |
30 | return (
31 |
32 |
33 |
34 |
35 |
36 |
37 | {renderExtendedView()}
38 |
39 |
40 | );
41 | };
42 |
--------------------------------------------------------------------------------
/client/acp/view/form-actions.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const FormActions = props => {
4 | let okButton = (props.okButton) ? createButton(
5 | props.okButton,
6 | 'btn btn-primary',
7 | props.okValid,
8 | props.okButtonClick
9 | ) : null;
10 | let warningButton = (props.warningButton) ? createButton(
11 | props.warningButton,
12 | 'btn btn-warning',
13 | props.warningValid,
14 | props.warningButtonClick
15 | ) : null;
16 | let dangerButton = (props.dangerButton) ? createButton(
17 | props.dangerButton,
18 | 'btn btn-danger',
19 | props.dangerValid,
20 | props.dangerButtonClick
21 | ) : null;
22 |
23 | function createButton(text, style, valid, callback) {
24 | callback = callback || (event => {
25 | console.warn('Action Callback is not provided');
26 | });
27 | return (
28 |
33 | {text}
34 |
35 | );
36 | }
37 |
38 | return (
39 |
40 | {okButton}
41 | {warningButton}
42 | {dangerButton}
43 |
44 | );
45 | }
46 |
--------------------------------------------------------------------------------
/plugin/index.js:
--------------------------------------------------------------------------------
1 | (function (Plugin) {
2 | 'use strict';
3 |
4 | var async = require('async'),
5 |
6 | filters = require('./filters'),
7 | rules = require('./rules'),
8 | sockets = require('./sockets');
9 |
10 | //NodeBB list of Hooks: https://github.com/NodeBB/NodeBB/wiki/Hooks
11 | Plugin.hooks = {
12 | filters: filters,
13 | statics: {
14 | load: function (params, callback) {
15 | var router = params.router,
16 | middleware = params.middleware,
17 | controllers = params.controllers,
18 | pluginUri = '/admin/plugins/embed',
19 | apiUri = '/api' + pluginUri,
20 | renderAdmin = function (req, res, next) {
21 | res.render(
22 | 'admin/plugins/embed', {
23 | title:'Embed',
24 | }
25 | );
26 | };
27 |
28 | router.get(pluginUri, middleware.admin.buildHeader, renderAdmin);
29 | router.get(apiUri, renderAdmin);
30 |
31 | async.series([
32 | async.apply(sockets.init),
33 | async.apply(rules.invalidate)
34 | ], callback);
35 | }
36 | }
37 | };
38 |
39 | })(module.exports);
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NodeBB Embed
2 |
3 | Embed media and rich content in posts: youtube, vimeo, twitch etc. All embeds are based on the rules. You are encouraged to build your own rules to embed everything what is embeddable.
4 |
5 | 
6 | 
7 | 
8 |
9 | ## Table of Contents
10 |
11 |
12 |
13 |
14 |
15 | - [Embeds Supported by Default](#embeds-supported-by-default)
16 | - [Screenshots](#screenshots)
17 |
18 |
19 |
20 | The plugin works well with default `Markdown` plugin or without it, i.e. there is no alteration of links in user's posts.
21 |
22 | ## Embeds Supported by Default
23 |
24 | Most embeds are responsive with a limited width to `640px`
25 |
26 | - Coub
27 | - Twitch (video and channel)
28 | - Vimeo
29 | - Vine
30 | - Youtube (short and normal URL)
31 |
32 | If you would like to have more embeddable services, please refer to the [Community Embed Rules](docs/community-rules.md).
33 |
34 | ## Screenshots
35 |
36 | 
--------------------------------------------------------------------------------
/plugin.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "nodebb-plugin-ns-embed",
3 | "name": "NodeBB Embed",
4 | "description": "Embed media and rich content in posts: Youtube, Vimeo, Twitch etc. All embeds are based on the rules. You are encouraged to build your own rules to embed everything what is embeddable.",
5 | "url": "https://github.com/NicolasSiver/nodebb-plugin-ns-embed",
6 | "library": "./plugin/index.js",
7 | "hooks": [
8 | {
9 | "hook": "filter:admin.header.build",
10 | "method": "hooks.filters.adminHeaderBuild"
11 | },
12 | {
13 | "hook": "filter:admin.scripts.get",
14 | "method": "hooks.filters.adminScripts"
15 | },
16 | {
17 | "hook": "static:app.load",
18 | "method": "hooks.statics.load"
19 | },
20 | {
21 | "hook": "filter:parse.post",
22 | "method": "hooks.filters.parsePost",
23 | "priority": 8
24 | },
25 | {
26 | "hook": "filter:parse.raw",
27 | "method": "hooks.filters.parseRaw"
28 | },
29 | {
30 | "hook": "filter:sanitize.config",
31 | "method": "hooks.filters.sanitizeConfig"
32 | }
33 | ],
34 | "scss": [
35 | "style/forum.scss"
36 | ],
37 | "modules": {
38 | "../admin/plugins/embed.js": "./public/js/acp.js"
39 | },
40 | "scripts": [],
41 | "staticDirs": {
42 | "acp": "./client/acp",
43 | "css": "./public/css",
44 | "js": "./public/js"
45 | },
46 | "templates": "./public/templates"
47 | }
48 |
--------------------------------------------------------------------------------
/client/acp/model/store.js:
--------------------------------------------------------------------------------
1 | import React, {createContext, useReducer} from 'react';
2 |
3 | import {newRule, rules, selectedRule} from './reducers';
4 |
5 | export const StoreContext = createContext(null);
6 |
7 | export function createInitialState() {
8 | return {
9 | newRule : {},
10 | rules : [],
11 | selectedRule: null
12 | };
13 | }
14 |
15 | /**
16 | * Experimental Store Implementation to represent the possibility to have lightweight Store solution with centralized reducer like Redux
17 | */
18 | export function createStore(initialState) {
19 | let state, dispatch;
20 |
21 | function invalidate() {
22 | let [currentState, dispatchRef] = useReducer((state, action) => {
23 | return {
24 | newRule : newRule(state.newRule, action),
25 | rules : rules(state.rules, action),
26 | selectedRule: selectedRule(state.selectedRule, action)
27 | };
28 | }, initialState);
29 |
30 | state = currentState;
31 | dispatch = dispatchRef;
32 | }
33 |
34 | return {
35 | dispatch : action => dispatch(action),
36 | getState : () => state,
37 | invalidate: () => invalidate()
38 | };
39 | }
40 |
41 | export function createStoreProvider(store) {
42 | return ({children}) => {
43 | store.invalidate();
44 |
45 | // A component calling useContext will always re-render when the context value changes.
46 | return {children} ;
47 | };
48 | }
49 |
--------------------------------------------------------------------------------
/client/acp/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDom from 'react-dom';
3 |
4 | import { setNewRule } from './controller/actions';
5 | import { Admin } from './view/admin';
6 | import { changeNewRuleField } from './controller/change-new-rule-field';
7 | import { changeRuleField } from './controller/change-rule-field';
8 | import { getNewRule } from './model/selectors';
9 | import { SocketService } from './service/socket-service';
10 | import { createInitialState, createStore, createStoreProvider } from './model/store';
11 |
12 | export const init = async () => {
13 | console.info('Initiate ACP: Embed');
14 |
15 | let alerts = await window.app.require('alerts');
16 | let store = createStore(createInitialState());
17 | let Provider = createStoreProvider(store);
18 | let socketService = new SocketService(store, alerts);
19 |
20 | ReactDom.render(
21 |
22 | changeRuleField(rule, field, value, store)}
24 | installDefaultRules={() => socketService.installDefaultRules()}
25 | newRuleFieldWillChange={(field, value) => changeNewRuleField(field, value, store)}
26 | ruleWillCreate={() => socketService.createNewRule(getNewRule(store.getState()))}
27 | ruleWillDelete={rule => socketService.deleteRule(rule)}
28 | ruleWillReset={() => store.dispatch(setNewRule({}))}
29 | ruleWillSave={rule => socketService.saveRule(rule)} />
30 | ,
31 | document.getElementById('acpEmbedContainer')
32 | );
33 |
34 | socketService.getAllRules();
35 | };
36 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 |
29 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
30 |
31 | *.iml
32 |
33 | ## Directory-based project format:
34 | .idea/
35 | # if you remove the above rule, at least ignore the following:
36 |
37 | # User-specific stuff:
38 | # .idea/workspace.xml
39 | # .idea/tasks.xml
40 | # .idea/dictionaries
41 | # .idea/shelf
42 |
43 | # Sensitive or high-churn files:
44 | # .idea/dataSources.ids
45 | # .idea/dataSources.xml
46 | # .idea/sqlDataSources.xml
47 | # .idea/dynamic.xml
48 | # .idea/uiDesigner.xml
49 |
50 | # Gradle:
51 | # .idea/gradle.xml
52 | # .idea/libraries
53 |
54 | # Mongo Explorer plugin:
55 | # .idea/mongoSettings.xml
56 |
57 | ## File-based project format:
58 | *.ipr
59 | *.iws
60 |
61 | ## Plugin-specific files:
62 |
63 | # IntelliJ
64 | /out/
65 |
66 | # mpeltonen/sbt-idea plugin
67 | .idea_modules/
68 |
69 | # JIRA plugin
70 | atlassian-ide-plugin.xml
71 |
72 | # Crashlytics plugin (for Android Studio and IntelliJ)
73 | com_crashlytics_export_strings.xml
74 | crashlytics.properties
75 | crashlytics-build.properties
76 | fabric.properties
--------------------------------------------------------------------------------
/client/acp/view/rules.js:
--------------------------------------------------------------------------------
1 | import classNames from 'classnames';
2 | import React, {useContext} from 'react';
3 |
4 | import {setSelectedRule} from '../controller/actions';
5 | import * as Constants from '../model/constants';
6 | import {getSelectedRule, getRules} from '../model/selectors';
7 | import {StoreContext} from '../model/store';
8 |
9 | export const Rules = () => {
10 | let {store} = useContext(StoreContext);
11 | let state = store.getState();
12 | let selectedRule = getSelectedRule(state);
13 | let rules = getRules(state);
14 |
15 | let RuleItem = data => {
16 | let icon = classNames('fa', data.icon || 'fa-cogs');
17 | let item = classNames('item', {
18 | selected: selectedRule !== null && data.name === selectedRule.name
19 | });
20 |
21 | return (
22 | store.dispatch(setSelectedRule(data))}>
25 | {data.displayName}
26 |
27 | );
28 | };
29 |
30 | function renderRules(rules) {
31 | let ruleCreate = RuleItem({
32 | displayName: 'Create Rule',
33 | icon : 'fa-plus',
34 | name : Constants.DEFAULT_RULE_ACTION,
35 | rid : Constants.DEFAULT_RULE_ACTION
36 | });
37 | let ruleComponents = rules.map(rule => RuleItem(rule));
38 |
39 | return [ruleCreate, ...ruleComponents];
40 | }
41 |
42 | return (
43 |
44 |
Installed Rules
45 |
46 |
47 | {renderRules(rules)}
48 |
49 |
50 |
51 | );
52 | };
53 |
--------------------------------------------------------------------------------
/plugin/sockets.js:
--------------------------------------------------------------------------------
1 | (function (Sockets) {
2 | 'use strict';
3 |
4 | var constants = require('./constants'),
5 | controller = require('./controller'),
6 | nodebb = require('./nodebb');
7 |
8 | var adminSockets = nodebb.adminSockets,
9 | serverSockets = nodebb.serverSockets,
10 | emitNamespace = 'admin.plugins.' + constants.SOCKET_NAMESPACE + '.';
11 |
12 | Sockets.init = function (callback) {
13 | adminSockets[constants.SOCKET_NAMESPACE] = {};
14 |
15 | //Acknowledgements
16 | adminSockets[constants.SOCKET_NAMESPACE].defaultRulesInstall = Sockets.defaultRulesInstall;
17 | adminSockets[constants.SOCKET_NAMESPACE].embedRulesGet = Sockets.embedRulesGet;
18 | adminSockets[constants.SOCKET_NAMESPACE].ruleCreate = Sockets.ruleCreate;
19 | adminSockets[constants.SOCKET_NAMESPACE].ruleDelete = Sockets.ruleDelete;
20 | adminSockets[constants.SOCKET_NAMESPACE].ruleSave = Sockets.ruleSave;
21 |
22 | callback();
23 | };
24 |
25 | Sockets.defaultRulesInstall = function (socket, payload, callback) {
26 | controller.installDefaultRules(callback);
27 | };
28 |
29 | Sockets.embedRulesGet = function (socket, payload, callback) {
30 | controller.getAllRules(callback);
31 | };
32 |
33 | Sockets.emit = function (eventName, payload) {
34 | serverSockets.emit(emitNamespace + eventName, payload);
35 | };
36 |
37 | Sockets.ruleCreate = function (socket, payload, callback) {
38 | controller.createRule(payload, callback);
39 | };
40 |
41 | Sockets.ruleDelete = function (socket, payload, callback) {
42 | controller.deleteRule(payload, callback);
43 | };
44 |
45 | Sockets.ruleSave = function (socket, payload, callback) {
46 | controller.saveRule(payload, callback);
47 | };
48 |
49 | })(module.exports);
--------------------------------------------------------------------------------
/plugin/rules.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by Nicolas on 10/25/15.
3 | */
4 | (function (Rules) {
5 | 'use strict';
6 |
7 | var database = require('./database'),
8 | logger = require('./logger'),
9 | nodebb = require('./nodebb');
10 |
11 | var cache = nodebb.cache;
12 |
13 | var rulesList = [];
14 |
15 | Rules.invalidate = function (done) {
16 | database.getRules(function (error, rules) {
17 | if (error) {
18 | return done(error);
19 | }
20 |
21 | logger.log('verbose', 'Updating rules...');
22 |
23 | // Re-compile regular expressions
24 | var i, len = rules.length, rule, ruleEntity;
25 | rulesList.length = 0;
26 | for (i = 0; i < len; ++i) {
27 | rule = rules[i];
28 | try {
29 | ruleEntity = {
30 | match : new RegExp(rule.regex, "g"),
31 | replacement: rule.replacement
32 | };
33 | rulesList.push(ruleEntity);
34 | } catch (e) {
35 | console.error('Rule is skipped', e);
36 | }
37 | }
38 |
39 | cache.reset();
40 |
41 | logger.log('verbose', 'Updating rule list, total rules: %d', rulesList.length);
42 |
43 | done();
44 | });
45 | };
46 |
47 | Rules.parse = function (content, done) {
48 | if (content) {
49 | var i = 0, len = rulesList.length, rule;
50 |
51 | for (i; i < len; ++i) {
52 | rule = rulesList[i];
53 | content = content.replace(rule.match, rule.replacement);
54 | }
55 |
56 | done(null, content);
57 | } else {
58 | done(null, content);
59 | }
60 | };
61 |
62 | })(module.exports);
63 |
--------------------------------------------------------------------------------
/plugin/nodebb.js:
--------------------------------------------------------------------------------
1 | (function (Module, NodeBB) {
2 | 'use strict';
3 |
4 | Module.exports = {
5 | adminSockets : NodeBB.require('./src/socket.io/admin').plugins,
6 | cache : NodeBB.require('./src/posts/cache'),
7 | db : NodeBB.require('./src/database'),
8 | groups : NodeBB.require('./src/groups'),
9 | meta : NodeBB.require('./src/meta'),
10 | pluginSockets: NodeBB.require('./src/socket.io/plugins'),
11 | postTools : NodeBB.require('./src/posts/tools'),
12 | serverSockets: NodeBB.require('./src/socket.io').server.sockets,
13 | settings : NodeBB.require('./src/settings'),
14 | socketIndex : NodeBB.require('./src/socket.io/index'),
15 | topics : NodeBB.require('./src/topics'),
16 | user : NodeBB.require('./src/user'),
17 |
18 | utils : NodeBB.require('./src/utils'),
19 | helpers: NodeBB.require('./src/controllers/helpers'),
20 |
21 | /**
22 | * List is incomplete
23 | *
24 | * base_dir: '/path/to/NodeBB',
25 | * themes_path: '/path/to/NodeBB/node_modules',
26 | * views_dir: '/path/to/NodeBB/public/templates',
27 | * version: 'NodeBB Version',
28 | * url: 'http://localhost:4567',
29 | * core_templates_path: '/path/to/NodeBB/src/views',
30 | * base_templates_path: '/path/to/NodeBB/node_modules/nodebb-theme-vanilla/templates',
31 | * upload_path: '/public/uploads',
32 | * relative_path: '',
33 | * port: '4567',
34 | * upload_url: '/uploads/',
35 | * theme_templates_path: '/path/to/NodeBB/node_modules/nodebb-theme-lavender/templates',
36 | * theme_config: '/path/to/NodeBB/node_modules/nodebb-theme-lavender/theme.json',
37 | * NODE_ENV: 'development'
38 | */
39 | nconf : NodeBB.require('nconf'),
40 | passport: NodeBB.require('passport'),
41 | express : NodeBB.require('express')
42 | };
43 | })(module, require.main);
44 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## [7.0.0] - 2025-06-11
9 |
10 | - Changed compatibility with NodeBB v3.x (kudos to Barış Soner Uşaklı)
11 | - Changed ACP to use NodeBB v3 common UI patterns (kudos to Barış Soner Uşaklı)
12 | - Changed ACP to resolve all vulnerabilities
13 |
14 | ## [6.0.0] - 2022-07-02
15 |
16 | - Changed compatibility with NodeBB v2.2.x (kudos to Barış Soner Uşaklı)
17 | - Changed ACP to use modules
18 |
19 | ## [5.0.0] - 2021-06-02
20 |
21 | - Added new notifications in ACP for manipulations around rules
22 | - Changed project dependencies to rely on fewer libraries
23 | - Changed integration with NodeBB to preserve ability to enter Fullscreen (kudos to Revir Yang)
24 | - Changed compatibility with NodeBB v1.17.x
25 | - Changed ACP to rely on latest UI library
26 | - Removed Babel for unit tests around the rules
27 | - Removed Gulp as orchestration tool for SASS styles
28 |
29 | ## [4.0.0] - 2019-12-29
30 |
31 | - Added support for post preview of the embedded content
32 | - Changed dependencies to comply with the most security updates
33 | - Changed compatibility with NodeBB v1.13.x
34 |
35 | ## [3.0.1] - 2018-12-26
36 |
37 | - Added community embed rules
38 | - Removed Code Climate integration
39 |
40 | ## [3.0.0] - 2018-11-29
41 |
42 | - Changed compatibility for NodeBB v1.11.0
43 | - Removed Emitter NodeBB dependency
44 |
45 | ## [2.1.1] - 2017-02-26
46 |
47 | - Changed Youtube default rule to ignore Youtube channels
48 |
49 | ## [2.1.0] - 2017-01-11
50 |
51 | - Added Twitch Default rule for Live content
52 | - Added Twitch Default rule for VoD
53 |
54 | ## [2.0.1] - 2016-05-02
55 |
56 | - Changed Youtube default rule to ignore Youtube profiles
57 |
58 | ## [2.0.0] - 2016-03-22
59 |
60 | - Added compatibility with Markdown plugin
61 | - Added compatibility with content plugins
62 | - Changed ACP scripts to follow best practice
63 | - Changed all dependencies
64 |
65 | ## [1.1.0] - 2015-12-16
66 |
67 | - Added ability to skip invalid regular expressions
68 | - Changed default Youtube rule
69 |
70 | ## [1.0.0] - 2015-11-29
71 |
72 | - Initial release with predefined set of embeds
73 |
--------------------------------------------------------------------------------
/plugin/database.js:
--------------------------------------------------------------------------------
1 | (function (Database) {
2 | 'use strict';
3 |
4 | const async = require('async');
5 |
6 | const nodebb = require('./nodebb'),
7 | constants = require('./constants');
8 |
9 | const db = nodebb.db;
10 |
11 | Database.createRule = function (data, done) {
12 | async.waterfall([
13 | async.apply(db.incrObjectField, 'global', constants.COUNTER),
14 | function (id, next) {
15 | let createTime = Date.now();
16 | let additionalData = {
17 | rid : id,
18 | createtime: createTime
19 | };
20 | let ruleData = Object.assign({}, data, additionalData);
21 |
22 | async.parallel([
23 | async.apply(db.sortedSetAdd, constants.NAMESPACE + ':rule', createTime, id),
24 | async.apply(db.setObject, constants.NAMESPACE + ':rule:' + id, ruleData)
25 | ], function (error) {
26 | if (error) {
27 | return next(error);
28 | }
29 | next(null, ruleData);
30 | });
31 | }
32 | ], done);
33 | };
34 |
35 | Database.deleteRule = function (id, done) {
36 | async.parallel([
37 | async.apply(db.delete, constants.NAMESPACE + ':rule:' + id),
38 | async.apply(db.sortedSetRemove, constants.NAMESPACE + ':rule', id)
39 | ], function (error) {
40 | if (error) {
41 | return done(error);
42 | }
43 | //Filter null responses from DB delete methods
44 | done(null);
45 | });
46 | };
47 |
48 | Database.getRule = function (id, done) {
49 | db.getObject(constants.NAMESPACE + ':rule:' + id, done);
50 | };
51 |
52 | Database.getRules = function (done) {
53 | async.waterfall([
54 | async.apply(db.getSortedSetRange, constants.NAMESPACE + ':rule', 0, -1),
55 | function (ids, next) {
56 | if (!ids.length) {
57 | return next(null, ids);
58 | }
59 | db.getObjects(ids.map(function (id) {
60 | return constants.NAMESPACE + ':rule:' + id;
61 | }), next);
62 | }
63 | ], done);
64 | };
65 |
66 | Database.updateRule = function (id, data, done) {
67 | db.setObject(constants.NAMESPACE + ':rule:' + id, data, done);
68 | };
69 |
70 | })(module.exports);
71 |
--------------------------------------------------------------------------------
/data/default-rules.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": [
3 | {
4 | "name": "youtube",
5 | "displayName": "Youtube",
6 | "icon": "fa-youtube",
7 | "regex": "(?:)?",
8 | "replacement": ""
9 | },
10 | {
11 | "name": "vimeo",
12 | "displayName": "Vimeo",
13 | "icon": "fa-vimeo",
14 | "regex": "(?:)?",
15 | "replacement": ""
16 | },
17 | {
18 | "name": "vine",
19 | "displayName": "Vine",
20 | "icon": "fa-vine",
21 | "regex": "(?:)?",
22 | "replacement": ""
23 | },
24 | {
25 | "name": "coub",
26 | "displayName": "Coub",
27 | "icon": "fa-cube",
28 | "regex": "(?:)?",
29 | "replacement": ""
30 | },
31 | {
32 | "name": "twitch-live",
33 | "displayName": "Twitch Live",
34 | "icon": "fa-twitch",
35 | "regex": "(?:)?",
36 | "replacement": ""
37 | },
38 | {
39 | "name": "twitch-vod",
40 | "displayName": "Twitch VoD",
41 | "icon": "fa-twitch",
42 | "regex": "(?:)?",
43 | "replacement": ""
44 | }
45 | ]
46 | }
47 |
--------------------------------------------------------------------------------
/client/acp/service/socket-service.js:
--------------------------------------------------------------------------------
1 | import {setNewRule, setRules, setSelectedRule} from '../controller/actions';
2 | import * as SocketMethods from '../model/socket-methods';
3 |
4 | export class SocketService {
5 | constructor(store, alerts) {
6 | this.store = store;
7 | this.alerts = alerts;
8 | }
9 |
10 | createNewRule(rule) {
11 | window.socket.emit(
12 | SocketMethods.CREATE_RULE,
13 | rule,
14 | (error, rule) => {
15 | if (error) {
16 | return this.alerts.error(error.message);
17 | }
18 |
19 | this.alerts.success('Rule "' + rule.displayName + '" has been created');
20 | this.store.dispatch(setNewRule({}));
21 | this.getAllRules();
22 | }
23 | );
24 | }
25 |
26 | deleteRule(rule) {
27 | window.socket.emit(
28 | SocketMethods.DELETE_RULE,
29 | rule,
30 | (error, rule) => {
31 | if (error) {
32 | return this.alerts.error(error.message);
33 | }
34 |
35 | this.alerts.success('Rule "' + rule.displayName + '" is deleted');
36 | this.store.dispatch(setSelectedRule(null));
37 | this.getAllRules();
38 | }
39 | );
40 | }
41 |
42 | getAllRules() {
43 | window.socket.emit(
44 | SocketMethods.GET_ALL_RULES,
45 | {},
46 | (error, rules) => {
47 | if (error) {
48 | return this.alerts.error(error.message);
49 | }
50 |
51 | this.store.dispatch(setRules(rules));
52 | }
53 | );
54 | }
55 |
56 | installDefaultRules() {
57 | console.info('Installing Default rules...');
58 |
59 | window.socket.emit(
60 | SocketMethods.INSTALL_DEFAULT_RULES,
61 | {},
62 | (error, installedRules) => {
63 | if (error) {
64 | return this.alerts.error(error.message);
65 | }
66 |
67 | this.alerts.success('Installed rules: ' + installedRules.join(', '));
68 | this.getAllRules();
69 | }
70 | );
71 | }
72 |
73 | saveRule(rule) {
74 | window.socket.emit(
75 | SocketMethods.SAVE_RULE,
76 | rule,
77 | (error, rule) => {
78 | if (error) {
79 | return this.alerts.error(error.message);
80 | }
81 |
82 | this.alerts.success('Rule "' + rule.displayName + '" is updated');
83 | this.getAllRules();
84 | }
85 | );
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/client/acp/view/rule-form.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const RuleForm = props => {
4 | return (
5 |
6 |
7 |
8 |
9 | Name
10 | props.propDidChange('name', event.target.value)}
15 | value={props.rule.name || ''}
16 | placeholder="name (Ex: youtube)"/>
17 |
18 |
19 |
20 |
21 | Display Name
22 | props.propDidChange('displayName', event.target.value)}
27 | value={props.rule.displayName || ''}
28 | placeholder="Display Name (Ex: Youtube)"/>
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | Watch
37 | props.propDidChange('regex', event.target.value)}
42 | value={props.rule.regex || ''}
43 | placeholder="Regular expression"/>
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Replace
52 |
60 |
61 |
62 |
63 | );
64 | }
65 |
--------------------------------------------------------------------------------
/docs/community-rules.md:
--------------------------------------------------------------------------------
1 | # Community Embed Rules
2 |
3 | All rules are sorted alphabetically.
4 |
5 | ## Table of Contents
6 |
7 |
8 |
9 |
10 |
11 | - [Blender Tube](#blender-tube)
12 | - [Dailymotion](#dailymotion)
13 | - [FramaTube](#framatube)
14 | - [MixCloud](#mixcloud)
15 | - [SoundCloud](#soundcloud)
16 | - [Spotify](#spotify)
17 | - [Twitter](#twitter)
18 |
19 |
20 |
21 | ### Blender Tube
22 |
23 | Watch
24 |
25 | ```regex
26 | (?:)?
27 | ```
28 |
29 | Replace
30 |
31 | ```html
32 |
33 | ```
34 |
35 | ### Dailymotion
36 |
37 | Watch
38 |
39 | ```regex
40 | (?:)?
41 | ```
42 |
43 | Replace
44 |
45 | ```html
46 |
47 | ```
48 |
49 | ### FramaTube
50 |
51 | Watch
52 |
53 | ```regex
54 | (?:)?
55 | ```
56 |
57 | Replace
58 |
59 | ```html
60 |
61 | ```
62 |
63 | ### MixCloud
64 |
65 | Watch
66 |
67 | ```regex
68 | (?:)?
69 | ```
70 |
71 | Replace
72 |
73 | ```html
74 |
75 | ```
76 |
77 | ### SoundCloud
78 |
79 | Watch
80 |
81 | ```regex
82 | (?:)?
83 | ```
84 |
85 | Replace
86 |
87 | ```html
88 |
89 | ```
90 |
91 | ### Spotify
92 |
93 | Watch
94 |
95 | ```regex
96 | (?:)?
97 | ```
98 |
99 | Replace
100 |
101 | ```html
102 |
103 | ```
104 |
105 | ### Twitter
106 |
107 | Watch
108 |
109 | ```regex
110 | (?:.+?<\\/a>
111 | ```
112 |
113 | Replace
114 |
115 | ```html
116 |
117 | ```
118 |
--------------------------------------------------------------------------------
/plugin/controller.js:
--------------------------------------------------------------------------------
1 | const async = require('async');
2 |
3 | const database = require('./database'),
4 | logger = require('./logger'),
5 | rules = require('./rules'),
6 | Utils = require('./utils');
7 |
8 | (function (Controller) {
9 |
10 | Controller.createRule = function (payload, done) {
11 | async.series([
12 | async.apply(database.createRule, Utils.payloadToRule(payload)),
13 | async.apply(rules.invalidate)
14 | ], function (error, results) {
15 | if (error) {
16 | return done(error);
17 | }
18 |
19 | done(null, results[0]);
20 | });
21 | };
22 |
23 | Controller.deleteRule = function (rule, done) {
24 | async.series([
25 | async.apply(database.deleteRule, rule.rid),
26 | async.apply(rules.invalidate)
27 | ], function (error) {
28 | if (error) {
29 | return done(error);
30 | }
31 |
32 | done(null, rule);
33 | });
34 | };
35 |
36 | Controller.getAllRules = function (done) {
37 | database.getRules(done);
38 | };
39 |
40 | Controller.installDefaultRules = function (done) {
41 | let data = require('../data/default-rules');
42 | let installed = [];
43 |
44 | async.waterfall([
45 | async.apply(database.getRules),
46 | function (rules, callback) {
47 | let toInstall = [], i = 0, len = data.rules.length, defaultRule;
48 |
49 | for (i; i < len; ++i) {
50 | defaultRule = data.rules[i];
51 |
52 | if (Utils.isInList('name', defaultRule.name, rules)) {
53 | logger.log('verbose', 'Rule "%s" is skipped. Reason: already installed', defaultRule.displayName);
54 | } else {
55 | toInstall.push(defaultRule);
56 | }
57 | }
58 |
59 | callback(null, toInstall);
60 | },
61 | function (install, callback) {
62 | async.eachSeries(install, function (defaultRule, next) {
63 | database.createRule(Utils.payloadToRule(defaultRule), function (error) {
64 | if (error) {
65 | return next(error);
66 | }
67 | installed.push(defaultRule);
68 | next();
69 | });
70 | }, callback);
71 | },
72 | function (callback) {
73 | if (installed.length > 0) {
74 | rules.invalidate(callback);
75 | } else {
76 | callback(null);
77 | }
78 | }
79 | ], function (error) {
80 | if (error) {
81 | return done(error);
82 | }
83 |
84 | done(null, installed.map(function (rule) {
85 | return rule.displayName;
86 | }));
87 | });
88 | };
89 |
90 | Controller.parseContent = function (content, done) {
91 | rules.parse(content, function (error, result) {
92 | if (error == null) {
93 | done(null, result);
94 | } else {
95 | done(error);
96 | }
97 | });
98 | };
99 |
100 | /**
101 | * Main parsing method.
102 | * Performs replacements on content field.
103 | *
104 | * @param {Object} payload {object} includes full post entity Payload.postData.content
105 | * @param {Function} done returns updated content
106 | */
107 | Controller.parsePost = function (payload, done) {
108 | Controller.parseContent(payload.postData.content, function (error, content) {
109 | if (error == null) {
110 | payload.postData.content = content;
111 | done(null, payload);
112 | } else {
113 | done(error);
114 | }
115 | });
116 | };
117 |
118 | Controller.saveRule = function (rule, done) {
119 | async.series({
120 | save: async.apply(database.updateRule, rule.rid, Utils.payloadToRule(rule)),
121 | rule: async.apply(database.getRule, rule.rid),
122 | sync: async.apply(rules.invalidate)
123 | }, function (error, results) {
124 | if (error) {
125 | return done(error);
126 | }
127 |
128 | done(null, results.rule)
129 | });
130 | };
131 |
132 | })(module.exports);
133 |
--------------------------------------------------------------------------------
/test/regexRules.spec.js:
--------------------------------------------------------------------------------
1 | const chai = require('chai')
2 |
3 | const expect = chai.expect;
4 | const rulesJson = require('../data/default-rules.json');
5 |
6 | const findRule = (name) => {
7 | for (let rule of rulesJson.rules) {
8 | if (rule.name === name) {
9 | return rule;
10 | }
11 | }
12 | }, repl = '---';
13 |
14 | describe('RegExp Rules', () => {
15 |
16 | describe('Youtube', () => {
17 | let regex;
18 | const regular = 'https://www.youtube.com/watch?v=Dwrm0X7RL0c',
19 | regularNoProtocol = 'www.youtube.com/watch?v=Dwrm0X7RL0c',
20 | regularNoZone = 'https://youtube.com/watch?v=Dwrm0X7RL0c',
21 | profileUrl = 'https://www.youtube.com/user/machinima',
22 | channelUrl = 'https://www.youtube.com/channel/UC0fDG3byEcMtbOqPMymDNbw',
23 | regularId = 'Dwrm0X7RL0c';
24 |
25 | const short = 'https://youtu.be/opgt8ZVqP_g',
26 | shortNoProtocol = 'youtu.be/opgt8ZVqP_g',
27 | shortId = 'opgt8ZVqP_g';
28 |
29 | beforeEach(() => {
30 | regex = new RegExp(findRule('youtube').regex, 'g');
31 | });
32 |
33 | it('parses general urls', () => {
34 | expect(regular.replace(regex, repl)).to.equal(repl);
35 | expect(regularNoProtocol.replace(regex, repl)).to.equal(repl);
36 | expect(regularNoZone.replace(regex, repl)).to.equal(repl);
37 | });
38 |
39 | it('parses short urls', () => {
40 | expect(short.replace(regex, repl)).to.equal(repl);
41 | expect(shortNoProtocol.replace(regex, repl)).to.equal(repl);
42 | });
43 |
44 | it('extracts video id from regular urls', () => {
45 | const group = '$1';
46 | expect(regular.replace(regex, group)).to.equal(regularId);
47 | expect(regularNoProtocol.replace(regex, group)).to.equal(regularId);
48 | expect(regularNoZone.replace(regex, group)).to.equal(regularId);
49 | });
50 |
51 | it('extracts video id from short urls', () => {
52 | const group = '$1';
53 | expect(short.replace(regex, group)).to.equal(shortId);
54 | expect(shortNoProtocol.replace(regex, group)).to.equal(shortId);
55 | });
56 |
57 | it('ignores profile urls', () => {
58 | expect(profileUrl.replace(regex, repl)).to.equal(profileUrl);
59 | });
60 |
61 | it('ignores channel urls', () => {
62 | expect(channelUrl.replace(regex, repl)).to.be.equal(channelUrl);
63 | });
64 | });
65 |
66 | describe('Twitch', () => {
67 | let regexLive, regexVod;
68 |
69 | const video = 'https://www.twitch.tv/chess/v/114095976',
70 | channel = 'https://www.twitch.tv/chess',
71 | videoAnchorTag = 'Some Text ',
72 | liveAnchorTag = 'Watch Live ',
73 | emptyAnchorTag = ' ';
74 |
75 | beforeEach(() => {
76 | regexLive = new RegExp(findRule('twitch-live').regex, 'g');
77 | regexVod = new RegExp(findRule('twitch-vod').regex, 'g');
78 | });
79 |
80 | it('parses live url', () => {
81 | expect(channel.replace(regexLive, repl)).to.be.equal(repl);
82 | });
83 |
84 | it('ignores video url for a live rule', () => {
85 | expect(video.replace(regexLive, repl)).to.be.equal(video);
86 | });
87 |
88 | it('ignores video url in anchor tag', () => {
89 | expect(videoAnchorTag.replace(regexLive, repl)).to.be.equal(videoAnchorTag);
90 | });
91 |
92 | it('parses live anchor tag', () => {
93 | expect(liveAnchorTag.replace(regexLive, repl)).to.be.equal(repl);
94 | });
95 |
96 | it('parses empty live anchor tag', () => {
97 | expect(emptyAnchorTag.replace(regexLive, repl)).to.be.equal(repl);
98 | });
99 |
100 | it('parses video url', () => {
101 | expect(video.replace(regexVod, repl)).to.be.equal(repl);
102 | });
103 |
104 | it('ignores live url for a vod rule', () => {
105 | expect(channel.replace(regexVod, repl)).to.be.equal(channel);
106 | });
107 |
108 | it('ignores live url in anchor tag', () => {
109 | expect(liveAnchorTag.replace(regexVod, repl)).to.be.equal(liveAnchorTag);
110 | });
111 |
112 | it('parses vod anchor tag', () => {
113 | expect(videoAnchorTag.replace(regexVod, repl)).to.be.equal(repl);
114 | });
115 |
116 | it('extracts channel name as a first group', () => {
117 | expect(regexLive.exec(channel)[1]).to.be.equal('chess');
118 | });
119 |
120 | it('extracts video id as a first group', () => {
121 | expect(regexVod.exec(video)[1]).to.be.equal('114095976');
122 | });
123 |
124 | });
125 |
126 | });
127 |
--------------------------------------------------------------------------------
/style/_palette.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * google-material-color v1.2.6
3 | * https://github.com/danlevan/google-material-color
4 | */
5 | $palette: (
6 | Red: (
7 | 50: #FFEBEE,
8 | 100: #FFCDD2,
9 | 200: #EF9A9A,
10 | 300: #E57373,
11 | 400: #EF5350,
12 | 500: #F44336,
13 | 600: #E53935,
14 | 700: #D32F2F,
15 | 800: #C62828,
16 | 900: #B71C1C,
17 | A100: #FF8A80,
18 | A200: #FF5252,
19 | A400: #FF1744,
20 | A700: #D50000,
21 | ),
22 | Pink: (
23 | 50: #FCE4EC,
24 | 100: #F8BBD0,
25 | 200: #F48FB1,
26 | 300: #F06292,
27 | 400: #EC407A,
28 | 500: #E91E63,
29 | 600: #D81B60,
30 | 700: #C2185B,
31 | 800: #AD1457,
32 | 900: #880E4F,
33 | A100: #FF80AB,
34 | A200: #FF4081,
35 | A400: #F50057,
36 | A700: #C51162,
37 | ),
38 | Purple: (
39 | 50: #F3E5F5,
40 | 100: #E1BEE7,
41 | 200: #CE93D8,
42 | 300: #BA68C8,
43 | 400: #AB47BC,
44 | 500: #9C27B0,
45 | 600: #8E24AA,
46 | 700: #7B1FA2,
47 | 800: #6A1B9A,
48 | 900: #4A148C,
49 | A100: #EA80FC,
50 | A200: #E040FB,
51 | A400: #D500F9,
52 | A700: #AA00FF,
53 | ),
54 | Deep Purple: (
55 | 50: #EDE7F6,
56 | 100: #D1C4E9,
57 | 200: #B39DDB,
58 | 300: #9575CD,
59 | 400: #7E57C2,
60 | 500: #673AB7,
61 | 600: #5E35B1,
62 | 700: #512DA8,
63 | 800: #4527A0,
64 | 900: #311B92,
65 | A100: #B388FF,
66 | A200: #7C4DFF,
67 | A400: #651FFF,
68 | A700: #6200EA,
69 | ),
70 | Indigo: (
71 | 50: #E8EAF6,
72 | 100: #C5CAE9,
73 | 200: #9FA8DA,
74 | 300: #7986CB,
75 | 400: #5C6BC0,
76 | 500: #3F51B5,
77 | 600: #3949AB,
78 | 700: #303F9F,
79 | 800: #283593,
80 | 900: #1A237E,
81 | A100: #8C9EFF,
82 | A200: #536DFE,
83 | A400: #3D5AFE,
84 | A700: #304FFE,
85 | ),
86 | Blue: (
87 | 50: #E3F2FD,
88 | 100: #BBDEFB,
89 | 200: #90CAF9,
90 | 300: #64B5F6,
91 | 400: #42A5F5,
92 | 500: #2196F3,
93 | 600: #1E88E5,
94 | 700: #1976D2,
95 | 800: #1565C0,
96 | 900: #0D47A1,
97 | A100: #82B1FF,
98 | A200: #448AFF,
99 | A400: #2979FF,
100 | A700: #2962FF,
101 | ),
102 | Light Blue: (
103 | 50: #E1F5FE,
104 | 100: #B3E5FC,
105 | 200: #81D4FA,
106 | 300: #4FC3F7,
107 | 400: #29B6F6,
108 | 500: #03A9F4,
109 | 600: #039BE5,
110 | 700: #0288D1,
111 | 800: #0277BD,
112 | 900: #01579B,
113 | A100: #80D8FF,
114 | A200: #40C4FF,
115 | A400: #00B0FF,
116 | A700: #0091EA,
117 | ),
118 | Cyan: (
119 | 50: #E0F7FA,
120 | 100: #B2EBF2,
121 | 200: #80DEEA,
122 | 300: #4DD0E1,
123 | 400: #26C6DA,
124 | 500: #00BCD4,
125 | 600: #00ACC1,
126 | 700: #0097A7,
127 | 800: #00838F,
128 | 900: #006064,
129 | A100: #84FFFF,
130 | A200: #18FFFF,
131 | A400: #00E5FF,
132 | A700: #00B8D4,
133 | ),
134 | Teal: (
135 | 50: #E0F2F1,
136 | 100: #B2DFDB,
137 | 200: #80CBC4,
138 | 300: #4DB6AC,
139 | 400: #26A69A,
140 | 500: #009688,
141 | 600: #00897B,
142 | 700: #00796B,
143 | 800: #00695C,
144 | 900: #004D40,
145 | A100: #A7FFEB,
146 | A200: #64FFDA,
147 | A400: #1DE9B6,
148 | A700: #00BFA5,
149 | ),
150 | Green: (
151 | 50: #E8F5E9,
152 | 100: #C8E6C9,
153 | 200: #A5D6A7,
154 | 300: #81C784,
155 | 400: #66BB6A,
156 | 500: #4CAF50,
157 | 600: #43A047,
158 | 700: #388E3C,
159 | 800: #2E7D32,
160 | 900: #1B5E20,
161 | A100: #B9F6CA,
162 | A200: #69F0AE,
163 | A400: #00E676,
164 | A700: #00C853,
165 | ),
166 | Light Green: (
167 | 50: #F1F8E9,
168 | 100: #DCEDC8,
169 | 200: #C5E1A5,
170 | 300: #AED581,
171 | 400: #9CCC65,
172 | 500: #8BC34A,
173 | 600: #7CB342,
174 | 700: #689F38,
175 | 800: #558B2F,
176 | 900: #33691E,
177 | A100: #CCFF90,
178 | A200: #B2FF59,
179 | A400: #76FF03,
180 | A700: #64DD17,
181 | ),
182 | Lime: (
183 | 50: #F9FBE7,
184 | 100: #F0F4C3,
185 | 200: #E6EE9C,
186 | 300: #DCE775,
187 | 400: #D4E157,
188 | 500: #CDDC39,
189 | 600: #C0CA33,
190 | 700: #AFB42B,
191 | 800: #9E9D24,
192 | 900: #827717,
193 | A100: #F4FF81,
194 | A200: #EEFF41,
195 | A400: #C6FF00,
196 | A700: #AEEA00,
197 | ),
198 | Yellow: (
199 | 50: #FFFDE7,
200 | 100: #FFF9C4,
201 | 200: #FFF59D,
202 | 300: #FFF176,
203 | 400: #FFEE58,
204 | 500: #FFEB3B,
205 | 600: #FDD835,
206 | 700: #FBC02D,
207 | 800: #F9A825,
208 | 900: #F57F17,
209 | A100: #FFFF8D,
210 | A200: #FFFF00,
211 | A400: #FFEA00,
212 | A700: #FFD600,
213 | ),
214 | Amber: (
215 | 50: #FFF8E1,
216 | 100: #FFECB3,
217 | 200: #FFE082,
218 | 300: #FFD54F,
219 | 400: #FFCA28,
220 | 500: #FFC107,
221 | 600: #FFB300,
222 | 700: #FFA000,
223 | 800: #FF8F00,
224 | 900: #FF6F00,
225 | A100: #FFE57F,
226 | A200: #FFD740,
227 | A400: #FFC400,
228 | A700: #FFAB00,
229 | ),
230 | Orange: (
231 | 50: #FFF3E0,
232 | 100: #FFE0B2,
233 | 200: #FFCC80,
234 | 300: #FFB74D,
235 | 400: #FFA726,
236 | 500: #FF9800,
237 | 600: #FB8C00,
238 | 700: #F57C00,
239 | 800: #EF6C00,
240 | 900: #E65100,
241 | A100: #FFD180,
242 | A200: #FFAB40,
243 | A400: #FF9100,
244 | A700: #FF6D00,
245 | ),
246 | Deep Orange: (
247 | 50: #FBE9E7,
248 | 100: #FFCCBC,
249 | 200: #FFAB91,
250 | 300: #FF8A65,
251 | 400: #FF7043,
252 | 500: #FF5722,
253 | 600: #F4511E,
254 | 700: #E64A19,
255 | 800: #D84315,
256 | 900: #BF360C,
257 | A100: #FF9E80,
258 | A200: #FF6E40,
259 | A400: #FF3D00,
260 | A700: #DD2C00,
261 | ),
262 | Brown: (
263 | 50: #EFEBE9,
264 | 100: #D7CCC8,
265 | 200: #BCAAA4,
266 | 300: #A1887F,
267 | 400: #8D6E63,
268 | 500: #795548,
269 | 600: #6D4C41,
270 | 700: #5D4037,
271 | 800: #4E342E,
272 | 900: #3E2723,
273 | ),
274 | Grey: (
275 | 50: #FAFAFA,
276 | 100: #F5F5F5,
277 | 200: #EEEEEE,
278 | 300: #E0E0E0,
279 | 400: #BDBDBD,
280 | 500: #9E9E9E,
281 | 600: #757575,
282 | 700: #616161,
283 | 800: #424242,
284 | 900: #212121,
285 | ),
286 | Blue Grey: (
287 | 50: #ECEFF1,
288 | 100: #CFD8DC,
289 | 200: #B0BEC5,
290 | 300: #90A4AE,
291 | 400: #78909C,
292 | 500: #607D8B,
293 | 600: #546E7A,
294 | 700: #455A64,
295 | 800: #37474F,
296 | 900: #263238,
297 | ),
298 | Black: (
299 | 500: #000000,
300 | Text: rgba(0,0,0,0.87),
301 | Secondary Text: rgba(0,0,0,0.54),
302 | Icons: rgba(0,0,0,0.54),
303 | Disabled: rgba(0,0,0,0.26),
304 | Hint Text: rgba(0,0,0,0.26),
305 | Dividers: rgba(0,0,0,0.12),
306 | ),
307 | White: (
308 | 500: #ffffff,
309 | Text: #ffffff,
310 | Secondary Text: rgba(255,255,255,0.7),
311 | Icons: #ffffff,
312 | Disabled: rgba(255,255,255,0.3),
313 | Hint Text: rgba(255,255,255,0.3),
314 | Dividers: rgba(255,255,255,0.12),
315 | ),
316 | );
317 |
318 | @function palette($color, $shade: 500) {
319 | $colorMap: map-get($palette, $color);
320 | $result: map-get($colorMap, $shade);
321 | @return $result;
322 | }
323 |
--------------------------------------------------------------------------------
/client/acp/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "embed-acp",
3 | "version": "2.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "embed-acp",
9 | "version": "2.0.0",
10 | "license": "MIT",
11 | "dependencies": {
12 | "classnames": "^2.2.3",
13 | "react": "^17.0.2",
14 | "react-dom": "^17.0.2"
15 | },
16 | "devDependencies": {
17 | "@babel/core": "^7.14.3",
18 | "@babel/preset-react": "^7.13.13",
19 | "babel-loader": "^8.2.2",
20 | "webpack": "^5.38.1",
21 | "webpack-cli": "^4.7.0"
22 | }
23 | },
24 | "node_modules/@babel/code-frame": {
25 | "version": "7.27.1",
26 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
27 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
28 | "dev": true,
29 | "license": "MIT",
30 | "dependencies": {
31 | "@babel/helper-validator-identifier": "^7.27.1",
32 | "js-tokens": "^4.0.0",
33 | "picocolors": "^1.1.1"
34 | },
35 | "engines": {
36 | "node": ">=6.9.0"
37 | }
38 | },
39 | "node_modules/@babel/compat-data": {
40 | "version": "7.14.4",
41 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz",
42 | "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==",
43 | "dev": true
44 | },
45 | "node_modules/@babel/core": {
46 | "version": "7.14.3",
47 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz",
48 | "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==",
49 | "dev": true,
50 | "dependencies": {
51 | "@babel/code-frame": "^7.12.13",
52 | "@babel/generator": "^7.14.3",
53 | "@babel/helper-compilation-targets": "^7.13.16",
54 | "@babel/helper-module-transforms": "^7.14.2",
55 | "@babel/helpers": "^7.14.0",
56 | "@babel/parser": "^7.14.3",
57 | "@babel/template": "^7.12.13",
58 | "@babel/traverse": "^7.14.2",
59 | "@babel/types": "^7.14.2",
60 | "convert-source-map": "^1.7.0",
61 | "debug": "^4.1.0",
62 | "gensync": "^1.0.0-beta.2",
63 | "json5": "^2.1.2",
64 | "semver": "^6.3.0",
65 | "source-map": "^0.5.0"
66 | },
67 | "engines": {
68 | "node": ">=6.9.0"
69 | },
70 | "funding": {
71 | "type": "opencollective",
72 | "url": "https://opencollective.com/babel"
73 | }
74 | },
75 | "node_modules/@babel/core/node_modules/convert-source-map": {
76 | "version": "1.7.0",
77 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
78 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
79 | "dev": true,
80 | "dependencies": {
81 | "safe-buffer": "~5.1.1"
82 | }
83 | },
84 | "node_modules/@babel/core/node_modules/debug": {
85 | "version": "4.3.1",
86 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
87 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
88 | "dev": true,
89 | "dependencies": {
90 | "ms": "2.1.2"
91 | },
92 | "engines": {
93 | "node": ">=6.0"
94 | },
95 | "peerDependenciesMeta": {
96 | "supports-color": {
97 | "optional": true
98 | }
99 | }
100 | },
101 | "node_modules/@babel/core/node_modules/ms": {
102 | "version": "2.1.2",
103 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
104 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
105 | "dev": true
106 | },
107 | "node_modules/@babel/generator": {
108 | "version": "7.27.5",
109 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
110 | "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
111 | "dev": true,
112 | "license": "MIT",
113 | "dependencies": {
114 | "@babel/parser": "^7.27.5",
115 | "@babel/types": "^7.27.3",
116 | "@jridgewell/gen-mapping": "^0.3.5",
117 | "@jridgewell/trace-mapping": "^0.3.25",
118 | "jsesc": "^3.0.2"
119 | },
120 | "engines": {
121 | "node": ">=6.9.0"
122 | }
123 | },
124 | "node_modules/@babel/helper-annotate-as-pure": {
125 | "version": "7.12.13",
126 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
127 | "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
128 | "dev": true,
129 | "dependencies": {
130 | "@babel/types": "^7.12.13"
131 | }
132 | },
133 | "node_modules/@babel/helper-compilation-targets": {
134 | "version": "7.14.4",
135 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz",
136 | "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==",
137 | "dev": true,
138 | "dependencies": {
139 | "@babel/compat-data": "^7.14.4",
140 | "@babel/helper-validator-option": "^7.12.17",
141 | "browserslist": "^4.16.6",
142 | "semver": "^6.3.0"
143 | },
144 | "peerDependencies": {
145 | "@babel/core": "^7.0.0"
146 | }
147 | },
148 | "node_modules/@babel/helper-member-expression-to-functions": {
149 | "version": "7.13.12",
150 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
151 | "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
152 | "dev": true,
153 | "dependencies": {
154 | "@babel/types": "^7.13.12"
155 | }
156 | },
157 | "node_modules/@babel/helper-module-imports": {
158 | "version": "7.13.12",
159 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
160 | "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
161 | "dev": true,
162 | "dependencies": {
163 | "@babel/types": "^7.13.12"
164 | }
165 | },
166 | "node_modules/@babel/helper-module-transforms": {
167 | "version": "7.14.2",
168 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz",
169 | "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==",
170 | "dev": true,
171 | "dependencies": {
172 | "@babel/helper-module-imports": "^7.13.12",
173 | "@babel/helper-replace-supers": "^7.13.12",
174 | "@babel/helper-simple-access": "^7.13.12",
175 | "@babel/helper-split-export-declaration": "^7.12.13",
176 | "@babel/helper-validator-identifier": "^7.14.0",
177 | "@babel/template": "^7.12.13",
178 | "@babel/traverse": "^7.14.2",
179 | "@babel/types": "^7.14.2"
180 | }
181 | },
182 | "node_modules/@babel/helper-optimise-call-expression": {
183 | "version": "7.12.13",
184 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
185 | "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
186 | "dev": true,
187 | "dependencies": {
188 | "@babel/types": "^7.12.13"
189 | }
190 | },
191 | "node_modules/@babel/helper-plugin-utils": {
192 | "version": "7.13.0",
193 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
194 | "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==",
195 | "dev": true
196 | },
197 | "node_modules/@babel/helper-replace-supers": {
198 | "version": "7.14.4",
199 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz",
200 | "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==",
201 | "dev": true,
202 | "dependencies": {
203 | "@babel/helper-member-expression-to-functions": "^7.13.12",
204 | "@babel/helper-optimise-call-expression": "^7.12.13",
205 | "@babel/traverse": "^7.14.2",
206 | "@babel/types": "^7.14.4"
207 | }
208 | },
209 | "node_modules/@babel/helper-simple-access": {
210 | "version": "7.13.12",
211 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
212 | "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
213 | "dev": true,
214 | "dependencies": {
215 | "@babel/types": "^7.13.12"
216 | }
217 | },
218 | "node_modules/@babel/helper-split-export-declaration": {
219 | "version": "7.12.13",
220 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
221 | "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
222 | "dev": true,
223 | "dependencies": {
224 | "@babel/types": "^7.12.13"
225 | }
226 | },
227 | "node_modules/@babel/helper-string-parser": {
228 | "version": "7.27.1",
229 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
230 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
231 | "dev": true,
232 | "license": "MIT",
233 | "engines": {
234 | "node": ">=6.9.0"
235 | }
236 | },
237 | "node_modules/@babel/helper-validator-identifier": {
238 | "version": "7.27.1",
239 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
240 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
241 | "dev": true,
242 | "license": "MIT",
243 | "engines": {
244 | "node": ">=6.9.0"
245 | }
246 | },
247 | "node_modules/@babel/helper-validator-option": {
248 | "version": "7.12.17",
249 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
250 | "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
251 | "dev": true
252 | },
253 | "node_modules/@babel/helpers": {
254 | "version": "7.27.6",
255 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
256 | "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
257 | "dev": true,
258 | "license": "MIT",
259 | "dependencies": {
260 | "@babel/template": "^7.27.2",
261 | "@babel/types": "^7.27.6"
262 | },
263 | "engines": {
264 | "node": ">=6.9.0"
265 | }
266 | },
267 | "node_modules/@babel/parser": {
268 | "version": "7.27.5",
269 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
270 | "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
271 | "dev": true,
272 | "license": "MIT",
273 | "dependencies": {
274 | "@babel/types": "^7.27.3"
275 | },
276 | "bin": {
277 | "parser": "bin/babel-parser.js"
278 | },
279 | "engines": {
280 | "node": ">=6.0.0"
281 | }
282 | },
283 | "node_modules/@babel/plugin-syntax-jsx": {
284 | "version": "7.12.13",
285 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz",
286 | "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==",
287 | "dev": true,
288 | "dependencies": {
289 | "@babel/helper-plugin-utils": "^7.12.13"
290 | },
291 | "peerDependencies": {
292 | "@babel/core": "^7.0.0-0"
293 | }
294 | },
295 | "node_modules/@babel/plugin-transform-react-display-name": {
296 | "version": "7.14.2",
297 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz",
298 | "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==",
299 | "dev": true,
300 | "dependencies": {
301 | "@babel/helper-plugin-utils": "^7.13.0"
302 | },
303 | "peerDependencies": {
304 | "@babel/core": "^7.0.0-0"
305 | }
306 | },
307 | "node_modules/@babel/plugin-transform-react-jsx": {
308 | "version": "7.14.3",
309 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz",
310 | "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==",
311 | "dev": true,
312 | "dependencies": {
313 | "@babel/helper-annotate-as-pure": "^7.12.13",
314 | "@babel/helper-module-imports": "^7.13.12",
315 | "@babel/helper-plugin-utils": "^7.13.0",
316 | "@babel/plugin-syntax-jsx": "^7.12.13",
317 | "@babel/types": "^7.14.2"
318 | },
319 | "peerDependencies": {
320 | "@babel/core": "^7.0.0-0"
321 | }
322 | },
323 | "node_modules/@babel/plugin-transform-react-jsx-development": {
324 | "version": "7.12.17",
325 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz",
326 | "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==",
327 | "dev": true,
328 | "dependencies": {
329 | "@babel/plugin-transform-react-jsx": "^7.12.17"
330 | },
331 | "peerDependencies": {
332 | "@babel/core": "^7.0.0-0"
333 | }
334 | },
335 | "node_modules/@babel/plugin-transform-react-pure-annotations": {
336 | "version": "7.12.1",
337 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz",
338 | "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==",
339 | "dev": true,
340 | "dependencies": {
341 | "@babel/helper-annotate-as-pure": "^7.10.4",
342 | "@babel/helper-plugin-utils": "^7.10.4"
343 | },
344 | "peerDependencies": {
345 | "@babel/core": "^7.0.0-0"
346 | }
347 | },
348 | "node_modules/@babel/preset-react": {
349 | "version": "7.13.13",
350 | "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz",
351 | "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==",
352 | "dev": true,
353 | "dependencies": {
354 | "@babel/helper-plugin-utils": "^7.13.0",
355 | "@babel/helper-validator-option": "^7.12.17",
356 | "@babel/plugin-transform-react-display-name": "^7.12.13",
357 | "@babel/plugin-transform-react-jsx": "^7.13.12",
358 | "@babel/plugin-transform-react-jsx-development": "^7.12.17",
359 | "@babel/plugin-transform-react-pure-annotations": "^7.12.1"
360 | },
361 | "peerDependencies": {
362 | "@babel/core": "^7.0.0-0"
363 | }
364 | },
365 | "node_modules/@babel/template": {
366 | "version": "7.27.2",
367 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
368 | "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
369 | "dev": true,
370 | "license": "MIT",
371 | "dependencies": {
372 | "@babel/code-frame": "^7.27.1",
373 | "@babel/parser": "^7.27.2",
374 | "@babel/types": "^7.27.1"
375 | },
376 | "engines": {
377 | "node": ">=6.9.0"
378 | }
379 | },
380 | "node_modules/@babel/traverse": {
381 | "version": "7.27.4",
382 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
383 | "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
384 | "dev": true,
385 | "license": "MIT",
386 | "dependencies": {
387 | "@babel/code-frame": "^7.27.1",
388 | "@babel/generator": "^7.27.3",
389 | "@babel/parser": "^7.27.4",
390 | "@babel/template": "^7.27.2",
391 | "@babel/types": "^7.27.3",
392 | "debug": "^4.3.1",
393 | "globals": "^11.1.0"
394 | },
395 | "engines": {
396 | "node": ">=6.9.0"
397 | }
398 | },
399 | "node_modules/@babel/traverse/node_modules/debug": {
400 | "version": "4.3.1",
401 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
402 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
403 | "dev": true,
404 | "dependencies": {
405 | "ms": "2.1.2"
406 | },
407 | "engines": {
408 | "node": ">=6.0"
409 | },
410 | "peerDependenciesMeta": {
411 | "supports-color": {
412 | "optional": true
413 | }
414 | }
415 | },
416 | "node_modules/@babel/traverse/node_modules/globals": {
417 | "version": "11.12.0",
418 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
419 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
420 | "dev": true,
421 | "engines": {
422 | "node": ">=4"
423 | }
424 | },
425 | "node_modules/@babel/traverse/node_modules/ms": {
426 | "version": "2.1.2",
427 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
428 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
429 | "dev": true
430 | },
431 | "node_modules/@babel/types": {
432 | "version": "7.27.6",
433 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
434 | "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
435 | "dev": true,
436 | "license": "MIT",
437 | "dependencies": {
438 | "@babel/helper-string-parser": "^7.27.1",
439 | "@babel/helper-validator-identifier": "^7.27.1"
440 | },
441 | "engines": {
442 | "node": ">=6.9.0"
443 | }
444 | },
445 | "node_modules/@discoveryjs/json-ext": {
446 | "version": "0.5.3",
447 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
448 | "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
449 | "dev": true,
450 | "engines": {
451 | "node": ">=10.0.0"
452 | }
453 | },
454 | "node_modules/@jridgewell/gen-mapping": {
455 | "version": "0.3.8",
456 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
457 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
458 | "dev": true,
459 | "license": "MIT",
460 | "dependencies": {
461 | "@jridgewell/set-array": "^1.2.1",
462 | "@jridgewell/sourcemap-codec": "^1.4.10",
463 | "@jridgewell/trace-mapping": "^0.3.24"
464 | },
465 | "engines": {
466 | "node": ">=6.0.0"
467 | }
468 | },
469 | "node_modules/@jridgewell/resolve-uri": {
470 | "version": "3.1.2",
471 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
472 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
473 | "dev": true,
474 | "license": "MIT",
475 | "engines": {
476 | "node": ">=6.0.0"
477 | }
478 | },
479 | "node_modules/@jridgewell/set-array": {
480 | "version": "1.2.1",
481 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
482 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
483 | "dev": true,
484 | "license": "MIT",
485 | "engines": {
486 | "node": ">=6.0.0"
487 | }
488 | },
489 | "node_modules/@jridgewell/source-map": {
490 | "version": "0.3.6",
491 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
492 | "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
493 | "dev": true,
494 | "license": "MIT",
495 | "dependencies": {
496 | "@jridgewell/gen-mapping": "^0.3.5",
497 | "@jridgewell/trace-mapping": "^0.3.25"
498 | }
499 | },
500 | "node_modules/@jridgewell/sourcemap-codec": {
501 | "version": "1.5.0",
502 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
503 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
504 | "dev": true,
505 | "license": "MIT"
506 | },
507 | "node_modules/@jridgewell/trace-mapping": {
508 | "version": "0.3.25",
509 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
510 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
511 | "dev": true,
512 | "license": "MIT",
513 | "dependencies": {
514 | "@jridgewell/resolve-uri": "^3.1.0",
515 | "@jridgewell/sourcemap-codec": "^1.4.14"
516 | }
517 | },
518 | "node_modules/@types/eslint": {
519 | "version": "9.6.1",
520 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
521 | "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
522 | "dev": true,
523 | "license": "MIT",
524 | "dependencies": {
525 | "@types/estree": "*",
526 | "@types/json-schema": "*"
527 | }
528 | },
529 | "node_modules/@types/eslint-scope": {
530 | "version": "3.7.7",
531 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
532 | "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
533 | "dev": true,
534 | "license": "MIT",
535 | "dependencies": {
536 | "@types/eslint": "*",
537 | "@types/estree": "*"
538 | }
539 | },
540 | "node_modules/@types/estree": {
541 | "version": "1.0.8",
542 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
543 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
544 | "dev": true,
545 | "license": "MIT"
546 | },
547 | "node_modules/@types/json-schema": {
548 | "version": "7.0.15",
549 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
550 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
551 | "dev": true,
552 | "license": "MIT"
553 | },
554 | "node_modules/@types/node": {
555 | "version": "24.0.1",
556 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz",
557 | "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==",
558 | "dev": true,
559 | "license": "MIT",
560 | "dependencies": {
561 | "undici-types": "~7.8.0"
562 | }
563 | },
564 | "node_modules/@webassemblyjs/ast": {
565 | "version": "1.14.1",
566 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
567 | "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
568 | "dev": true,
569 | "license": "MIT",
570 | "dependencies": {
571 | "@webassemblyjs/helper-numbers": "1.13.2",
572 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
573 | }
574 | },
575 | "node_modules/@webassemblyjs/floating-point-hex-parser": {
576 | "version": "1.13.2",
577 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
578 | "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
579 | "dev": true,
580 | "license": "MIT"
581 | },
582 | "node_modules/@webassemblyjs/helper-api-error": {
583 | "version": "1.13.2",
584 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
585 | "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
586 | "dev": true,
587 | "license": "MIT"
588 | },
589 | "node_modules/@webassemblyjs/helper-buffer": {
590 | "version": "1.14.1",
591 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
592 | "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
593 | "dev": true,
594 | "license": "MIT"
595 | },
596 | "node_modules/@webassemblyjs/helper-numbers": {
597 | "version": "1.13.2",
598 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
599 | "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
600 | "dev": true,
601 | "license": "MIT",
602 | "dependencies": {
603 | "@webassemblyjs/floating-point-hex-parser": "1.13.2",
604 | "@webassemblyjs/helper-api-error": "1.13.2",
605 | "@xtuc/long": "4.2.2"
606 | }
607 | },
608 | "node_modules/@webassemblyjs/helper-wasm-bytecode": {
609 | "version": "1.13.2",
610 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
611 | "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
612 | "dev": true,
613 | "license": "MIT"
614 | },
615 | "node_modules/@webassemblyjs/helper-wasm-section": {
616 | "version": "1.14.1",
617 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
618 | "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
619 | "dev": true,
620 | "license": "MIT",
621 | "dependencies": {
622 | "@webassemblyjs/ast": "1.14.1",
623 | "@webassemblyjs/helper-buffer": "1.14.1",
624 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
625 | "@webassemblyjs/wasm-gen": "1.14.1"
626 | }
627 | },
628 | "node_modules/@webassemblyjs/ieee754": {
629 | "version": "1.13.2",
630 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
631 | "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
632 | "dev": true,
633 | "license": "MIT",
634 | "dependencies": {
635 | "@xtuc/ieee754": "^1.2.0"
636 | }
637 | },
638 | "node_modules/@webassemblyjs/leb128": {
639 | "version": "1.13.2",
640 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
641 | "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
642 | "dev": true,
643 | "license": "Apache-2.0",
644 | "dependencies": {
645 | "@xtuc/long": "4.2.2"
646 | }
647 | },
648 | "node_modules/@webassemblyjs/utf8": {
649 | "version": "1.13.2",
650 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
651 | "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
652 | "dev": true,
653 | "license": "MIT"
654 | },
655 | "node_modules/@webassemblyjs/wasm-edit": {
656 | "version": "1.14.1",
657 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
658 | "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
659 | "dev": true,
660 | "license": "MIT",
661 | "dependencies": {
662 | "@webassemblyjs/ast": "1.14.1",
663 | "@webassemblyjs/helper-buffer": "1.14.1",
664 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
665 | "@webassemblyjs/helper-wasm-section": "1.14.1",
666 | "@webassemblyjs/wasm-gen": "1.14.1",
667 | "@webassemblyjs/wasm-opt": "1.14.1",
668 | "@webassemblyjs/wasm-parser": "1.14.1",
669 | "@webassemblyjs/wast-printer": "1.14.1"
670 | }
671 | },
672 | "node_modules/@webassemblyjs/wasm-gen": {
673 | "version": "1.14.1",
674 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
675 | "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
676 | "dev": true,
677 | "license": "MIT",
678 | "dependencies": {
679 | "@webassemblyjs/ast": "1.14.1",
680 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
681 | "@webassemblyjs/ieee754": "1.13.2",
682 | "@webassemblyjs/leb128": "1.13.2",
683 | "@webassemblyjs/utf8": "1.13.2"
684 | }
685 | },
686 | "node_modules/@webassemblyjs/wasm-opt": {
687 | "version": "1.14.1",
688 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
689 | "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
690 | "dev": true,
691 | "license": "MIT",
692 | "dependencies": {
693 | "@webassemblyjs/ast": "1.14.1",
694 | "@webassemblyjs/helper-buffer": "1.14.1",
695 | "@webassemblyjs/wasm-gen": "1.14.1",
696 | "@webassemblyjs/wasm-parser": "1.14.1"
697 | }
698 | },
699 | "node_modules/@webassemblyjs/wasm-parser": {
700 | "version": "1.14.1",
701 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
702 | "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
703 | "dev": true,
704 | "license": "MIT",
705 | "dependencies": {
706 | "@webassemblyjs/ast": "1.14.1",
707 | "@webassemblyjs/helper-api-error": "1.13.2",
708 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
709 | "@webassemblyjs/ieee754": "1.13.2",
710 | "@webassemblyjs/leb128": "1.13.2",
711 | "@webassemblyjs/utf8": "1.13.2"
712 | }
713 | },
714 | "node_modules/@webassemblyjs/wast-printer": {
715 | "version": "1.14.1",
716 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
717 | "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
718 | "dev": true,
719 | "license": "MIT",
720 | "dependencies": {
721 | "@webassemblyjs/ast": "1.14.1",
722 | "@xtuc/long": "4.2.2"
723 | }
724 | },
725 | "node_modules/@webpack-cli/configtest": {
726 | "version": "1.0.3",
727 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz",
728 | "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==",
729 | "dev": true,
730 | "peerDependencies": {
731 | "webpack": "4.x.x || 5.x.x",
732 | "webpack-cli": "4.x.x"
733 | }
734 | },
735 | "node_modules/@webpack-cli/info": {
736 | "version": "1.2.4",
737 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz",
738 | "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==",
739 | "dev": true,
740 | "dependencies": {
741 | "envinfo": "^7.7.3"
742 | },
743 | "peerDependencies": {
744 | "webpack-cli": "4.x.x"
745 | }
746 | },
747 | "node_modules/@webpack-cli/serve": {
748 | "version": "1.4.0",
749 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz",
750 | "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==",
751 | "dev": true,
752 | "peerDependencies": {
753 | "webpack-cli": "4.x.x"
754 | },
755 | "peerDependenciesMeta": {
756 | "webpack-dev-server": {
757 | "optional": true
758 | }
759 | }
760 | },
761 | "node_modules/@xtuc/ieee754": {
762 | "version": "1.2.0",
763 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
764 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
765 | "dev": true,
766 | "license": "BSD-3-Clause"
767 | },
768 | "node_modules/@xtuc/long": {
769 | "version": "4.2.2",
770 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
771 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
772 | "dev": true,
773 | "license": "Apache-2.0"
774 | },
775 | "node_modules/acorn": {
776 | "version": "8.15.0",
777 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
778 | "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
779 | "dev": true,
780 | "license": "MIT",
781 | "bin": {
782 | "acorn": "bin/acorn"
783 | },
784 | "engines": {
785 | "node": ">=0.4.0"
786 | }
787 | },
788 | "node_modules/ajv": {
789 | "version": "6.12.6",
790 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
791 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
792 | "dev": true,
793 | "dependencies": {
794 | "fast-deep-equal": "^3.1.1",
795 | "fast-json-stable-stringify": "^2.0.0",
796 | "json-schema-traverse": "^0.4.1",
797 | "uri-js": "^4.2.2"
798 | },
799 | "funding": {
800 | "type": "github",
801 | "url": "https://github.com/sponsors/epoberezkin"
802 | }
803 | },
804 | "node_modules/ajv-formats": {
805 | "version": "2.1.1",
806 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
807 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
808 | "dev": true,
809 | "license": "MIT",
810 | "dependencies": {
811 | "ajv": "^8.0.0"
812 | },
813 | "peerDependencies": {
814 | "ajv": "^8.0.0"
815 | },
816 | "peerDependenciesMeta": {
817 | "ajv": {
818 | "optional": true
819 | }
820 | }
821 | },
822 | "node_modules/ajv-formats/node_modules/ajv": {
823 | "version": "8.17.1",
824 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
825 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
826 | "dev": true,
827 | "license": "MIT",
828 | "dependencies": {
829 | "fast-deep-equal": "^3.1.3",
830 | "fast-uri": "^3.0.1",
831 | "json-schema-traverse": "^1.0.0",
832 | "require-from-string": "^2.0.2"
833 | },
834 | "funding": {
835 | "type": "github",
836 | "url": "https://github.com/sponsors/epoberezkin"
837 | }
838 | },
839 | "node_modules/ajv-formats/node_modules/json-schema-traverse": {
840 | "version": "1.0.0",
841 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
842 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
843 | "dev": true,
844 | "license": "MIT"
845 | },
846 | "node_modules/ajv-keywords": {
847 | "version": "3.5.2",
848 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
849 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
850 | "dev": true,
851 | "peerDependencies": {
852 | "ajv": "^6.9.1"
853 | }
854 | },
855 | "node_modules/babel-loader": {
856 | "version": "8.2.2",
857 | "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
858 | "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
859 | "dev": true,
860 | "dependencies": {
861 | "find-cache-dir": "^3.3.1",
862 | "loader-utils": "^1.4.0",
863 | "make-dir": "^3.1.0",
864 | "schema-utils": "^2.6.5"
865 | },
866 | "engines": {
867 | "node": ">= 8.9"
868 | },
869 | "peerDependencies": {
870 | "@babel/core": "^7.0.0",
871 | "webpack": ">=2"
872 | }
873 | },
874 | "node_modules/big.js": {
875 | "version": "5.2.2",
876 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
877 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
878 | "dev": true,
879 | "engines": {
880 | "node": "*"
881 | }
882 | },
883 | "node_modules/browserslist": {
884 | "version": "4.25.0",
885 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
886 | "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
887 | "dev": true,
888 | "funding": [
889 | {
890 | "type": "opencollective",
891 | "url": "https://opencollective.com/browserslist"
892 | },
893 | {
894 | "type": "tidelift",
895 | "url": "https://tidelift.com/funding/github/npm/browserslist"
896 | },
897 | {
898 | "type": "github",
899 | "url": "https://github.com/sponsors/ai"
900 | }
901 | ],
902 | "license": "MIT",
903 | "dependencies": {
904 | "caniuse-lite": "^1.0.30001718",
905 | "electron-to-chromium": "^1.5.160",
906 | "node-releases": "^2.0.19",
907 | "update-browserslist-db": "^1.1.3"
908 | },
909 | "bin": {
910 | "browserslist": "cli.js"
911 | },
912 | "engines": {
913 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
914 | }
915 | },
916 | "node_modules/buffer-from": {
917 | "version": "1.1.2",
918 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
919 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
920 | "dev": true,
921 | "license": "MIT"
922 | },
923 | "node_modules/caniuse-lite": {
924 | "version": "1.0.30001722",
925 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz",
926 | "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==",
927 | "dev": true,
928 | "funding": [
929 | {
930 | "type": "opencollective",
931 | "url": "https://opencollective.com/browserslist"
932 | },
933 | {
934 | "type": "tidelift",
935 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
936 | },
937 | {
938 | "type": "github",
939 | "url": "https://github.com/sponsors/ai"
940 | }
941 | ],
942 | "license": "CC-BY-4.0"
943 | },
944 | "node_modules/chrome-trace-event": {
945 | "version": "1.0.3",
946 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
947 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
948 | "dev": true,
949 | "engines": {
950 | "node": ">=6.0"
951 | }
952 | },
953 | "node_modules/classnames": {
954 | "version": "2.2.3",
955 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.3.tgz",
956 | "integrity": "sha1-VRt3S2dioMCplxh/e6Tx1gOWGsU="
957 | },
958 | "node_modules/clone-deep": {
959 | "version": "4.0.1",
960 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
961 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
962 | "dev": true,
963 | "dependencies": {
964 | "is-plain-object": "^2.0.4",
965 | "kind-of": "^6.0.2",
966 | "shallow-clone": "^3.0.0"
967 | },
968 | "engines": {
969 | "node": ">=6"
970 | }
971 | },
972 | "node_modules/colorette": {
973 | "version": "1.2.2",
974 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
975 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
976 | "dev": true
977 | },
978 | "node_modules/commander": {
979 | "version": "2.20.3",
980 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
981 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
982 | "dev": true,
983 | "license": "MIT"
984 | },
985 | "node_modules/commondir": {
986 | "version": "1.0.1",
987 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
988 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
989 | "dev": true
990 | },
991 | "node_modules/cross-spawn": {
992 | "version": "7.0.6",
993 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
994 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
995 | "dev": true,
996 | "license": "MIT",
997 | "dependencies": {
998 | "path-key": "^3.1.0",
999 | "shebang-command": "^2.0.0",
1000 | "which": "^2.0.1"
1001 | },
1002 | "engines": {
1003 | "node": ">= 8"
1004 | }
1005 | },
1006 | "node_modules/electron-to-chromium": {
1007 | "version": "1.5.166",
1008 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz",
1009 | "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==",
1010 | "dev": true,
1011 | "license": "ISC"
1012 | },
1013 | "node_modules/emojis-list": {
1014 | "version": "3.0.0",
1015 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
1016 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
1017 | "dev": true,
1018 | "engines": {
1019 | "node": ">= 4"
1020 | }
1021 | },
1022 | "node_modules/enhanced-resolve": {
1023 | "version": "5.18.1",
1024 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
1025 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
1026 | "dev": true,
1027 | "license": "MIT",
1028 | "dependencies": {
1029 | "graceful-fs": "^4.2.4",
1030 | "tapable": "^2.2.0"
1031 | },
1032 | "engines": {
1033 | "node": ">=10.13.0"
1034 | }
1035 | },
1036 | "node_modules/envinfo": {
1037 | "version": "7.8.1",
1038 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
1039 | "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
1040 | "dev": true,
1041 | "bin": {
1042 | "envinfo": "dist/cli.js"
1043 | },
1044 | "engines": {
1045 | "node": ">=4"
1046 | }
1047 | },
1048 | "node_modules/es-module-lexer": {
1049 | "version": "1.7.0",
1050 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
1051 | "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
1052 | "dev": true,
1053 | "license": "MIT"
1054 | },
1055 | "node_modules/escalade": {
1056 | "version": "3.2.0",
1057 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1058 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1059 | "dev": true,
1060 | "license": "MIT",
1061 | "engines": {
1062 | "node": ">=6"
1063 | }
1064 | },
1065 | "node_modules/eslint-scope": {
1066 | "version": "5.1.1",
1067 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
1068 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
1069 | "dev": true,
1070 | "dependencies": {
1071 | "esrecurse": "^4.3.0",
1072 | "estraverse": "^4.1.1"
1073 | },
1074 | "engines": {
1075 | "node": ">=8.0.0"
1076 | }
1077 | },
1078 | "node_modules/esrecurse": {
1079 | "version": "4.3.0",
1080 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1081 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1082 | "dev": true,
1083 | "dependencies": {
1084 | "estraverse": "^5.2.0"
1085 | },
1086 | "engines": {
1087 | "node": ">=4.0"
1088 | }
1089 | },
1090 | "node_modules/esrecurse/node_modules/estraverse": {
1091 | "version": "5.2.0",
1092 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
1093 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
1094 | "dev": true,
1095 | "engines": {
1096 | "node": ">=4.0"
1097 | }
1098 | },
1099 | "node_modules/estraverse": {
1100 | "version": "4.3.0",
1101 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1102 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1103 | "dev": true,
1104 | "engines": {
1105 | "node": ">=4.0"
1106 | }
1107 | },
1108 | "node_modules/events": {
1109 | "version": "3.3.0",
1110 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
1111 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
1112 | "dev": true,
1113 | "engines": {
1114 | "node": ">=0.8.x"
1115 | }
1116 | },
1117 | "node_modules/execa": {
1118 | "version": "5.0.1",
1119 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.1.tgz",
1120 | "integrity": "sha512-4hFTjFbFzQa3aCLobpbPJR/U+VoL1wdV5ozOWjeet0AWDeYr9UFGM1eUFWHX+VtOWFq4p0xXUXfW1YxUaP4fpw==",
1121 | "dev": true,
1122 | "dependencies": {
1123 | "cross-spawn": "^7.0.3",
1124 | "get-stream": "^6.0.0",
1125 | "human-signals": "^2.1.0",
1126 | "is-stream": "^2.0.0",
1127 | "merge-stream": "^2.0.0",
1128 | "npm-run-path": "^4.0.1",
1129 | "onetime": "^5.1.2",
1130 | "signal-exit": "^3.0.3",
1131 | "strip-final-newline": "^2.0.0"
1132 | },
1133 | "engines": {
1134 | "node": ">=10"
1135 | },
1136 | "funding": {
1137 | "url": "https://github.com/sindresorhus/execa?sponsor=1"
1138 | }
1139 | },
1140 | "node_modules/fast-deep-equal": {
1141 | "version": "3.1.3",
1142 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1143 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1144 | "dev": true
1145 | },
1146 | "node_modules/fast-json-stable-stringify": {
1147 | "version": "2.1.0",
1148 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1149 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1150 | "dev": true
1151 | },
1152 | "node_modules/fast-uri": {
1153 | "version": "3.0.6",
1154 | "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
1155 | "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
1156 | "dev": true,
1157 | "funding": [
1158 | {
1159 | "type": "github",
1160 | "url": "https://github.com/sponsors/fastify"
1161 | },
1162 | {
1163 | "type": "opencollective",
1164 | "url": "https://opencollective.com/fastify"
1165 | }
1166 | ],
1167 | "license": "BSD-3-Clause"
1168 | },
1169 | "node_modules/fastest-levenshtein": {
1170 | "version": "1.0.12",
1171 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
1172 | "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
1173 | "dev": true
1174 | },
1175 | "node_modules/find-cache-dir": {
1176 | "version": "3.3.1",
1177 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
1178 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
1179 | "dev": true,
1180 | "dependencies": {
1181 | "commondir": "^1.0.1",
1182 | "make-dir": "^3.0.2",
1183 | "pkg-dir": "^4.1.0"
1184 | },
1185 | "engines": {
1186 | "node": ">=8"
1187 | },
1188 | "funding": {
1189 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
1190 | }
1191 | },
1192 | "node_modules/find-up": {
1193 | "version": "4.1.0",
1194 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1195 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1196 | "dev": true,
1197 | "dependencies": {
1198 | "locate-path": "^5.0.0",
1199 | "path-exists": "^4.0.0"
1200 | },
1201 | "engines": {
1202 | "node": ">=8"
1203 | }
1204 | },
1205 | "node_modules/find-up/node_modules/path-exists": {
1206 | "version": "4.0.0",
1207 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1208 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1209 | "dev": true,
1210 | "engines": {
1211 | "node": ">=8"
1212 | }
1213 | },
1214 | "node_modules/function-bind": {
1215 | "version": "1.1.1",
1216 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1217 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1218 | "dev": true
1219 | },
1220 | "node_modules/gensync": {
1221 | "version": "1.0.0-beta.2",
1222 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1223 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1224 | "dev": true,
1225 | "engines": {
1226 | "node": ">=6.9.0"
1227 | }
1228 | },
1229 | "node_modules/get-stream": {
1230 | "version": "6.0.1",
1231 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
1232 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
1233 | "dev": true,
1234 | "engines": {
1235 | "node": ">=10"
1236 | },
1237 | "funding": {
1238 | "url": "https://github.com/sponsors/sindresorhus"
1239 | }
1240 | },
1241 | "node_modules/glob-to-regexp": {
1242 | "version": "0.4.1",
1243 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
1244 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
1245 | "dev": true,
1246 | "license": "BSD-2-Clause"
1247 | },
1248 | "node_modules/graceful-fs": {
1249 | "version": "4.2.11",
1250 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1251 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1252 | "dev": true,
1253 | "license": "ISC"
1254 | },
1255 | "node_modules/has": {
1256 | "version": "1.0.3",
1257 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1258 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1259 | "dev": true,
1260 | "dependencies": {
1261 | "function-bind": "^1.1.1"
1262 | },
1263 | "engines": {
1264 | "node": ">= 0.4.0"
1265 | }
1266 | },
1267 | "node_modules/has-flag": {
1268 | "version": "4.0.0",
1269 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1270 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1271 | "dev": true,
1272 | "license": "MIT",
1273 | "engines": {
1274 | "node": ">=8"
1275 | }
1276 | },
1277 | "node_modules/human-signals": {
1278 | "version": "2.1.0",
1279 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1280 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1281 | "dev": true,
1282 | "engines": {
1283 | "node": ">=10.17.0"
1284 | }
1285 | },
1286 | "node_modules/import-local": {
1287 | "version": "3.0.2",
1288 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
1289 | "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
1290 | "dev": true,
1291 | "dependencies": {
1292 | "pkg-dir": "^4.2.0",
1293 | "resolve-cwd": "^3.0.0"
1294 | },
1295 | "bin": {
1296 | "import-local-fixture": "fixtures/cli.js"
1297 | },
1298 | "engines": {
1299 | "node": ">=8"
1300 | }
1301 | },
1302 | "node_modules/interpret": {
1303 | "version": "2.2.0",
1304 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
1305 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
1306 | "dev": true,
1307 | "engines": {
1308 | "node": ">= 0.10"
1309 | }
1310 | },
1311 | "node_modules/is-core-module": {
1312 | "version": "2.4.0",
1313 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
1314 | "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
1315 | "dev": true,
1316 | "dependencies": {
1317 | "has": "^1.0.3"
1318 | },
1319 | "funding": {
1320 | "url": "https://github.com/sponsors/ljharb"
1321 | }
1322 | },
1323 | "node_modules/is-plain-object": {
1324 | "version": "2.0.4",
1325 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
1326 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
1327 | "dev": true,
1328 | "dependencies": {
1329 | "isobject": "^3.0.1"
1330 | },
1331 | "engines": {
1332 | "node": ">=0.10.0"
1333 | }
1334 | },
1335 | "node_modules/is-stream": {
1336 | "version": "2.0.0",
1337 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1338 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1339 | "dev": true,
1340 | "engines": {
1341 | "node": ">=8"
1342 | }
1343 | },
1344 | "node_modules/isexe": {
1345 | "version": "2.0.0",
1346 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1347 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1348 | "dev": true
1349 | },
1350 | "node_modules/isobject": {
1351 | "version": "3.0.1",
1352 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
1353 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
1354 | "dev": true,
1355 | "engines": {
1356 | "node": ">=0.10.0"
1357 | }
1358 | },
1359 | "node_modules/jest-worker": {
1360 | "version": "27.5.1",
1361 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
1362 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
1363 | "dev": true,
1364 | "license": "MIT",
1365 | "dependencies": {
1366 | "@types/node": "*",
1367 | "merge-stream": "^2.0.0",
1368 | "supports-color": "^8.0.0"
1369 | },
1370 | "engines": {
1371 | "node": ">= 10.13.0"
1372 | }
1373 | },
1374 | "node_modules/js-tokens": {
1375 | "version": "4.0.0",
1376 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1377 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1378 | },
1379 | "node_modules/jsesc": {
1380 | "version": "3.1.0",
1381 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1382 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1383 | "dev": true,
1384 | "license": "MIT",
1385 | "bin": {
1386 | "jsesc": "bin/jsesc"
1387 | },
1388 | "engines": {
1389 | "node": ">=6"
1390 | }
1391 | },
1392 | "node_modules/json-parse-even-better-errors": {
1393 | "version": "2.3.1",
1394 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
1395 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
1396 | "dev": true,
1397 | "license": "MIT"
1398 | },
1399 | "node_modules/json-schema-traverse": {
1400 | "version": "0.4.1",
1401 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1402 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1403 | "dev": true
1404 | },
1405 | "node_modules/json5": {
1406 | "version": "2.2.3",
1407 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1408 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1409 | "dev": true,
1410 | "license": "MIT",
1411 | "bin": {
1412 | "json5": "lib/cli.js"
1413 | },
1414 | "engines": {
1415 | "node": ">=6"
1416 | }
1417 | },
1418 | "node_modules/kind-of": {
1419 | "version": "6.0.3",
1420 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
1421 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
1422 | "dev": true,
1423 | "engines": {
1424 | "node": ">=0.10.0"
1425 | }
1426 | },
1427 | "node_modules/loader-runner": {
1428 | "version": "4.2.0",
1429 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
1430 | "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
1431 | "dev": true,
1432 | "engines": {
1433 | "node": ">=6.11.5"
1434 | }
1435 | },
1436 | "node_modules/loader-utils": {
1437 | "version": "1.4.2",
1438 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
1439 | "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
1440 | "dev": true,
1441 | "license": "MIT",
1442 | "dependencies": {
1443 | "big.js": "^5.2.2",
1444 | "emojis-list": "^3.0.0",
1445 | "json5": "^1.0.1"
1446 | },
1447 | "engines": {
1448 | "node": ">=4.0.0"
1449 | }
1450 | },
1451 | "node_modules/loader-utils/node_modules/json5": {
1452 | "version": "1.0.2",
1453 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
1454 | "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
1455 | "dev": true,
1456 | "license": "MIT",
1457 | "dependencies": {
1458 | "minimist": "^1.2.0"
1459 | },
1460 | "bin": {
1461 | "json5": "lib/cli.js"
1462 | }
1463 | },
1464 | "node_modules/locate-path": {
1465 | "version": "5.0.0",
1466 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1467 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1468 | "dev": true,
1469 | "dependencies": {
1470 | "p-locate": "^4.1.0"
1471 | },
1472 | "engines": {
1473 | "node": ">=8"
1474 | }
1475 | },
1476 | "node_modules/loose-envify": {
1477 | "version": "1.4.0",
1478 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1479 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1480 | "dependencies": {
1481 | "js-tokens": "^3.0.0 || ^4.0.0"
1482 | },
1483 | "bin": {
1484 | "loose-envify": "cli.js"
1485 | }
1486 | },
1487 | "node_modules/make-dir": {
1488 | "version": "3.1.0",
1489 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1490 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1491 | "dev": true,
1492 | "dependencies": {
1493 | "semver": "^6.0.0"
1494 | },
1495 | "engines": {
1496 | "node": ">=8"
1497 | },
1498 | "funding": {
1499 | "url": "https://github.com/sponsors/sindresorhus"
1500 | }
1501 | },
1502 | "node_modules/merge-stream": {
1503 | "version": "2.0.0",
1504 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1505 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1506 | "dev": true
1507 | },
1508 | "node_modules/mime-db": {
1509 | "version": "1.47.0",
1510 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
1511 | "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
1512 | "dev": true,
1513 | "engines": {
1514 | "node": ">= 0.6"
1515 | }
1516 | },
1517 | "node_modules/mime-types": {
1518 | "version": "2.1.30",
1519 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
1520 | "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
1521 | "dev": true,
1522 | "dependencies": {
1523 | "mime-db": "1.47.0"
1524 | },
1525 | "engines": {
1526 | "node": ">= 0.6"
1527 | }
1528 | },
1529 | "node_modules/mimic-fn": {
1530 | "version": "2.1.0",
1531 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1532 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1533 | "dev": true,
1534 | "engines": {
1535 | "node": ">=6"
1536 | }
1537 | },
1538 | "node_modules/minimist": {
1539 | "version": "1.2.6",
1540 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
1541 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
1542 | "dev": true
1543 | },
1544 | "node_modules/neo-async": {
1545 | "version": "2.6.2",
1546 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
1547 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
1548 | "dev": true
1549 | },
1550 | "node_modules/node-releases": {
1551 | "version": "2.0.19",
1552 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
1553 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
1554 | "dev": true,
1555 | "license": "MIT"
1556 | },
1557 | "node_modules/npm-run-path": {
1558 | "version": "4.0.1",
1559 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1560 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1561 | "dev": true,
1562 | "dependencies": {
1563 | "path-key": "^3.0.0"
1564 | },
1565 | "engines": {
1566 | "node": ">=8"
1567 | }
1568 | },
1569 | "node_modules/onetime": {
1570 | "version": "5.1.2",
1571 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1572 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1573 | "dev": true,
1574 | "dependencies": {
1575 | "mimic-fn": "^2.1.0"
1576 | },
1577 | "engines": {
1578 | "node": ">=6"
1579 | },
1580 | "funding": {
1581 | "url": "https://github.com/sponsors/sindresorhus"
1582 | }
1583 | },
1584 | "node_modules/p-limit": {
1585 | "version": "2.3.0",
1586 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1587 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1588 | "dev": true,
1589 | "dependencies": {
1590 | "p-try": "^2.0.0"
1591 | },
1592 | "engines": {
1593 | "node": ">=6"
1594 | },
1595 | "funding": {
1596 | "url": "https://github.com/sponsors/sindresorhus"
1597 | }
1598 | },
1599 | "node_modules/p-locate": {
1600 | "version": "4.1.0",
1601 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1602 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1603 | "dev": true,
1604 | "dependencies": {
1605 | "p-limit": "^2.2.0"
1606 | },
1607 | "engines": {
1608 | "node": ">=8"
1609 | }
1610 | },
1611 | "node_modules/p-try": {
1612 | "version": "2.2.0",
1613 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1614 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1615 | "dev": true,
1616 | "engines": {
1617 | "node": ">=6"
1618 | }
1619 | },
1620 | "node_modules/path-key": {
1621 | "version": "3.1.1",
1622 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1623 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1624 | "dev": true,
1625 | "engines": {
1626 | "node": ">=8"
1627 | }
1628 | },
1629 | "node_modules/path-parse": {
1630 | "version": "1.0.7",
1631 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1632 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1633 | "dev": true
1634 | },
1635 | "node_modules/picocolors": {
1636 | "version": "1.1.1",
1637 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1638 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1639 | "dev": true,
1640 | "license": "ISC"
1641 | },
1642 | "node_modules/pkg-dir": {
1643 | "version": "4.2.0",
1644 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
1645 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
1646 | "dev": true,
1647 | "dependencies": {
1648 | "find-up": "^4.0.0"
1649 | },
1650 | "engines": {
1651 | "node": ">=8"
1652 | }
1653 | },
1654 | "node_modules/punycode": {
1655 | "version": "2.1.1",
1656 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1657 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1658 | "dev": true,
1659 | "engines": {
1660 | "node": ">=6"
1661 | }
1662 | },
1663 | "node_modules/randombytes": {
1664 | "version": "2.1.0",
1665 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1666 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1667 | "dev": true,
1668 | "license": "MIT",
1669 | "dependencies": {
1670 | "safe-buffer": "^5.1.0"
1671 | }
1672 | },
1673 | "node_modules/react": {
1674 | "version": "17.0.2",
1675 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
1676 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
1677 | "dependencies": {
1678 | "loose-envify": "^1.1.0",
1679 | "object-assign": "^4.1.1"
1680 | },
1681 | "engines": {
1682 | "node": ">=0.10.0"
1683 | }
1684 | },
1685 | "node_modules/react-dom": {
1686 | "version": "17.0.2",
1687 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
1688 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
1689 | "dependencies": {
1690 | "loose-envify": "^1.1.0",
1691 | "object-assign": "^4.1.1",
1692 | "scheduler": "^0.20.2"
1693 | },
1694 | "peerDependencies": {
1695 | "react": "17.0.2"
1696 | }
1697 | },
1698 | "node_modules/react-dom/node_modules/object-assign": {
1699 | "version": "4.1.1",
1700 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1701 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1702 | "engines": {
1703 | "node": ">=0.10.0"
1704 | }
1705 | },
1706 | "node_modules/react/node_modules/object-assign": {
1707 | "version": "4.1.1",
1708 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1709 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1710 | "engines": {
1711 | "node": ">=0.10.0"
1712 | }
1713 | },
1714 | "node_modules/rechoir": {
1715 | "version": "0.7.0",
1716 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
1717 | "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
1718 | "dev": true,
1719 | "dependencies": {
1720 | "resolve": "^1.9.0"
1721 | },
1722 | "engines": {
1723 | "node": ">= 0.10"
1724 | }
1725 | },
1726 | "node_modules/require-from-string": {
1727 | "version": "2.0.2",
1728 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
1729 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1730 | "dev": true,
1731 | "license": "MIT",
1732 | "engines": {
1733 | "node": ">=0.10.0"
1734 | }
1735 | },
1736 | "node_modules/resolve": {
1737 | "version": "1.20.0",
1738 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
1739 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
1740 | "dev": true,
1741 | "dependencies": {
1742 | "is-core-module": "^2.2.0",
1743 | "path-parse": "^1.0.6"
1744 | },
1745 | "funding": {
1746 | "url": "https://github.com/sponsors/ljharb"
1747 | }
1748 | },
1749 | "node_modules/resolve-cwd": {
1750 | "version": "3.0.0",
1751 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
1752 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
1753 | "dev": true,
1754 | "dependencies": {
1755 | "resolve-from": "^5.0.0"
1756 | },
1757 | "engines": {
1758 | "node": ">=8"
1759 | }
1760 | },
1761 | "node_modules/resolve-from": {
1762 | "version": "5.0.0",
1763 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
1764 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
1765 | "dev": true,
1766 | "engines": {
1767 | "node": ">=8"
1768 | }
1769 | },
1770 | "node_modules/safe-buffer": {
1771 | "version": "5.1.2",
1772 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1773 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1774 | "dev": true
1775 | },
1776 | "node_modules/scheduler": {
1777 | "version": "0.20.2",
1778 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
1779 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
1780 | "dependencies": {
1781 | "loose-envify": "^1.1.0",
1782 | "object-assign": "^4.1.1"
1783 | }
1784 | },
1785 | "node_modules/scheduler/node_modules/object-assign": {
1786 | "version": "4.1.1",
1787 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1788 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1789 | "engines": {
1790 | "node": ">=0.10.0"
1791 | }
1792 | },
1793 | "node_modules/schema-utils": {
1794 | "version": "2.7.1",
1795 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
1796 | "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
1797 | "dev": true,
1798 | "dependencies": {
1799 | "@types/json-schema": "^7.0.5",
1800 | "ajv": "^6.12.4",
1801 | "ajv-keywords": "^3.5.2"
1802 | },
1803 | "engines": {
1804 | "node": ">= 8.9.0"
1805 | },
1806 | "funding": {
1807 | "type": "opencollective",
1808 | "url": "https://opencollective.com/webpack"
1809 | }
1810 | },
1811 | "node_modules/semver": {
1812 | "version": "6.3.1",
1813 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1814 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1815 | "dev": true,
1816 | "license": "ISC",
1817 | "bin": {
1818 | "semver": "bin/semver.js"
1819 | }
1820 | },
1821 | "node_modules/serialize-javascript": {
1822 | "version": "6.0.2",
1823 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
1824 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
1825 | "dev": true,
1826 | "license": "BSD-3-Clause",
1827 | "dependencies": {
1828 | "randombytes": "^2.1.0"
1829 | }
1830 | },
1831 | "node_modules/shallow-clone": {
1832 | "version": "3.0.1",
1833 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
1834 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
1835 | "dev": true,
1836 | "dependencies": {
1837 | "kind-of": "^6.0.2"
1838 | },
1839 | "engines": {
1840 | "node": ">=8"
1841 | }
1842 | },
1843 | "node_modules/shebang-command": {
1844 | "version": "2.0.0",
1845 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1846 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1847 | "dev": true,
1848 | "dependencies": {
1849 | "shebang-regex": "^3.0.0"
1850 | },
1851 | "engines": {
1852 | "node": ">=8"
1853 | }
1854 | },
1855 | "node_modules/shebang-regex": {
1856 | "version": "3.0.0",
1857 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1858 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1859 | "dev": true,
1860 | "engines": {
1861 | "node": ">=8"
1862 | }
1863 | },
1864 | "node_modules/signal-exit": {
1865 | "version": "3.0.3",
1866 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1867 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1868 | "dev": true
1869 | },
1870 | "node_modules/source-map": {
1871 | "version": "0.5.7",
1872 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1873 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
1874 | "dev": true,
1875 | "engines": {
1876 | "node": ">=0.10.0"
1877 | }
1878 | },
1879 | "node_modules/source-map-support": {
1880 | "version": "0.5.21",
1881 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
1882 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1883 | "dev": true,
1884 | "license": "MIT",
1885 | "dependencies": {
1886 | "buffer-from": "^1.0.0",
1887 | "source-map": "^0.6.0"
1888 | }
1889 | },
1890 | "node_modules/source-map-support/node_modules/source-map": {
1891 | "version": "0.6.1",
1892 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1893 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1894 | "dev": true,
1895 | "license": "BSD-3-Clause",
1896 | "engines": {
1897 | "node": ">=0.10.0"
1898 | }
1899 | },
1900 | "node_modules/strip-final-newline": {
1901 | "version": "2.0.0",
1902 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1903 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1904 | "dev": true,
1905 | "engines": {
1906 | "node": ">=6"
1907 | }
1908 | },
1909 | "node_modules/supports-color": {
1910 | "version": "8.1.1",
1911 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1912 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1913 | "dev": true,
1914 | "license": "MIT",
1915 | "dependencies": {
1916 | "has-flag": "^4.0.0"
1917 | },
1918 | "engines": {
1919 | "node": ">=10"
1920 | },
1921 | "funding": {
1922 | "url": "https://github.com/chalk/supports-color?sponsor=1"
1923 | }
1924 | },
1925 | "node_modules/tapable": {
1926 | "version": "2.2.2",
1927 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
1928 | "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
1929 | "dev": true,
1930 | "license": "MIT",
1931 | "engines": {
1932 | "node": ">=6"
1933 | }
1934 | },
1935 | "node_modules/terser": {
1936 | "version": "5.42.0",
1937 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz",
1938 | "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==",
1939 | "dev": true,
1940 | "license": "BSD-2-Clause",
1941 | "dependencies": {
1942 | "@jridgewell/source-map": "^0.3.3",
1943 | "acorn": "^8.14.0",
1944 | "commander": "^2.20.0",
1945 | "source-map-support": "~0.5.20"
1946 | },
1947 | "bin": {
1948 | "terser": "bin/terser"
1949 | },
1950 | "engines": {
1951 | "node": ">=10"
1952 | }
1953 | },
1954 | "node_modules/terser-webpack-plugin": {
1955 | "version": "5.3.14",
1956 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
1957 | "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
1958 | "dev": true,
1959 | "license": "MIT",
1960 | "dependencies": {
1961 | "@jridgewell/trace-mapping": "^0.3.25",
1962 | "jest-worker": "^27.4.5",
1963 | "schema-utils": "^4.3.0",
1964 | "serialize-javascript": "^6.0.2",
1965 | "terser": "^5.31.1"
1966 | },
1967 | "engines": {
1968 | "node": ">= 10.13.0"
1969 | },
1970 | "funding": {
1971 | "type": "opencollective",
1972 | "url": "https://opencollective.com/webpack"
1973 | },
1974 | "peerDependencies": {
1975 | "webpack": "^5.1.0"
1976 | },
1977 | "peerDependenciesMeta": {
1978 | "@swc/core": {
1979 | "optional": true
1980 | },
1981 | "esbuild": {
1982 | "optional": true
1983 | },
1984 | "uglify-js": {
1985 | "optional": true
1986 | }
1987 | }
1988 | },
1989 | "node_modules/terser-webpack-plugin/node_modules/ajv": {
1990 | "version": "8.17.1",
1991 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
1992 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
1993 | "dev": true,
1994 | "license": "MIT",
1995 | "dependencies": {
1996 | "fast-deep-equal": "^3.1.3",
1997 | "fast-uri": "^3.0.1",
1998 | "json-schema-traverse": "^1.0.0",
1999 | "require-from-string": "^2.0.2"
2000 | },
2001 | "funding": {
2002 | "type": "github",
2003 | "url": "https://github.com/sponsors/epoberezkin"
2004 | }
2005 | },
2006 | "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
2007 | "version": "5.1.0",
2008 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
2009 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
2010 | "dev": true,
2011 | "license": "MIT",
2012 | "dependencies": {
2013 | "fast-deep-equal": "^3.1.3"
2014 | },
2015 | "peerDependencies": {
2016 | "ajv": "^8.8.2"
2017 | }
2018 | },
2019 | "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
2020 | "version": "1.0.0",
2021 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
2022 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
2023 | "dev": true,
2024 | "license": "MIT"
2025 | },
2026 | "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
2027 | "version": "4.3.2",
2028 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
2029 | "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
2030 | "dev": true,
2031 | "license": "MIT",
2032 | "dependencies": {
2033 | "@types/json-schema": "^7.0.9",
2034 | "ajv": "^8.9.0",
2035 | "ajv-formats": "^2.1.1",
2036 | "ajv-keywords": "^5.1.0"
2037 | },
2038 | "engines": {
2039 | "node": ">= 10.13.0"
2040 | },
2041 | "funding": {
2042 | "type": "opencollective",
2043 | "url": "https://opencollective.com/webpack"
2044 | }
2045 | },
2046 | "node_modules/undici-types": {
2047 | "version": "7.8.0",
2048 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
2049 | "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
2050 | "dev": true,
2051 | "license": "MIT"
2052 | },
2053 | "node_modules/update-browserslist-db": {
2054 | "version": "1.1.3",
2055 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
2056 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
2057 | "dev": true,
2058 | "funding": [
2059 | {
2060 | "type": "opencollective",
2061 | "url": "https://opencollective.com/browserslist"
2062 | },
2063 | {
2064 | "type": "tidelift",
2065 | "url": "https://tidelift.com/funding/github/npm/browserslist"
2066 | },
2067 | {
2068 | "type": "github",
2069 | "url": "https://github.com/sponsors/ai"
2070 | }
2071 | ],
2072 | "license": "MIT",
2073 | "dependencies": {
2074 | "escalade": "^3.2.0",
2075 | "picocolors": "^1.1.1"
2076 | },
2077 | "bin": {
2078 | "update-browserslist-db": "cli.js"
2079 | },
2080 | "peerDependencies": {
2081 | "browserslist": ">= 4.21.0"
2082 | }
2083 | },
2084 | "node_modules/uri-js": {
2085 | "version": "4.4.1",
2086 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2087 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2088 | "dev": true,
2089 | "dependencies": {
2090 | "punycode": "^2.1.0"
2091 | }
2092 | },
2093 | "node_modules/v8-compile-cache": {
2094 | "version": "2.3.0",
2095 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
2096 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
2097 | "dev": true
2098 | },
2099 | "node_modules/watchpack": {
2100 | "version": "2.4.4",
2101 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
2102 | "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
2103 | "dev": true,
2104 | "license": "MIT",
2105 | "dependencies": {
2106 | "glob-to-regexp": "^0.4.1",
2107 | "graceful-fs": "^4.1.2"
2108 | },
2109 | "engines": {
2110 | "node": ">=10.13.0"
2111 | }
2112 | },
2113 | "node_modules/webpack": {
2114 | "version": "5.99.9",
2115 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz",
2116 | "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
2117 | "dev": true,
2118 | "license": "MIT",
2119 | "dependencies": {
2120 | "@types/eslint-scope": "^3.7.7",
2121 | "@types/estree": "^1.0.6",
2122 | "@types/json-schema": "^7.0.15",
2123 | "@webassemblyjs/ast": "^1.14.1",
2124 | "@webassemblyjs/wasm-edit": "^1.14.1",
2125 | "@webassemblyjs/wasm-parser": "^1.14.1",
2126 | "acorn": "^8.14.0",
2127 | "browserslist": "^4.24.0",
2128 | "chrome-trace-event": "^1.0.2",
2129 | "enhanced-resolve": "^5.17.1",
2130 | "es-module-lexer": "^1.2.1",
2131 | "eslint-scope": "5.1.1",
2132 | "events": "^3.2.0",
2133 | "glob-to-regexp": "^0.4.1",
2134 | "graceful-fs": "^4.2.11",
2135 | "json-parse-even-better-errors": "^2.3.1",
2136 | "loader-runner": "^4.2.0",
2137 | "mime-types": "^2.1.27",
2138 | "neo-async": "^2.6.2",
2139 | "schema-utils": "^4.3.2",
2140 | "tapable": "^2.1.1",
2141 | "terser-webpack-plugin": "^5.3.11",
2142 | "watchpack": "^2.4.1",
2143 | "webpack-sources": "^3.2.3"
2144 | },
2145 | "bin": {
2146 | "webpack": "bin/webpack.js"
2147 | },
2148 | "engines": {
2149 | "node": ">=10.13.0"
2150 | },
2151 | "funding": {
2152 | "type": "opencollective",
2153 | "url": "https://opencollective.com/webpack"
2154 | },
2155 | "peerDependenciesMeta": {
2156 | "webpack-cli": {
2157 | "optional": true
2158 | }
2159 | }
2160 | },
2161 | "node_modules/webpack-cli": {
2162 | "version": "4.7.0",
2163 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.0.tgz",
2164 | "integrity": "sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==",
2165 | "dev": true,
2166 | "dependencies": {
2167 | "@discoveryjs/json-ext": "^0.5.0",
2168 | "@webpack-cli/configtest": "^1.0.3",
2169 | "@webpack-cli/info": "^1.2.4",
2170 | "@webpack-cli/serve": "^1.4.0",
2171 | "colorette": "^1.2.1",
2172 | "commander": "^7.0.0",
2173 | "execa": "^5.0.0",
2174 | "fastest-levenshtein": "^1.0.12",
2175 | "import-local": "^3.0.2",
2176 | "interpret": "^2.2.0",
2177 | "rechoir": "^0.7.0",
2178 | "v8-compile-cache": "^2.2.0",
2179 | "webpack-merge": "^5.7.3"
2180 | },
2181 | "bin": {
2182 | "webpack-cli": "bin/cli.js"
2183 | },
2184 | "engines": {
2185 | "node": ">=10.13.0"
2186 | },
2187 | "peerDependencies": {
2188 | "webpack": "4.x.x || 5.x.x"
2189 | },
2190 | "peerDependenciesMeta": {
2191 | "@webpack-cli/generators": {
2192 | "optional": true
2193 | },
2194 | "@webpack-cli/migrate": {
2195 | "optional": true
2196 | },
2197 | "webpack-bundle-analyzer": {
2198 | "optional": true
2199 | },
2200 | "webpack-dev-server": {
2201 | "optional": true
2202 | }
2203 | }
2204 | },
2205 | "node_modules/webpack-cli/node_modules/commander": {
2206 | "version": "7.2.0",
2207 | "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
2208 | "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
2209 | "dev": true,
2210 | "engines": {
2211 | "node": ">= 10"
2212 | }
2213 | },
2214 | "node_modules/webpack-merge": {
2215 | "version": "5.7.3",
2216 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz",
2217 | "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==",
2218 | "dev": true,
2219 | "dependencies": {
2220 | "clone-deep": "^4.0.1",
2221 | "wildcard": "^2.0.0"
2222 | },
2223 | "engines": {
2224 | "node": ">=10.0.0"
2225 | }
2226 | },
2227 | "node_modules/webpack-sources": {
2228 | "version": "3.3.2",
2229 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz",
2230 | "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==",
2231 | "dev": true,
2232 | "license": "MIT",
2233 | "engines": {
2234 | "node": ">=10.13.0"
2235 | }
2236 | },
2237 | "node_modules/webpack/node_modules/ajv": {
2238 | "version": "8.17.1",
2239 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
2240 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
2241 | "dev": true,
2242 | "license": "MIT",
2243 | "dependencies": {
2244 | "fast-deep-equal": "^3.1.3",
2245 | "fast-uri": "^3.0.1",
2246 | "json-schema-traverse": "^1.0.0",
2247 | "require-from-string": "^2.0.2"
2248 | },
2249 | "funding": {
2250 | "type": "github",
2251 | "url": "https://github.com/sponsors/epoberezkin"
2252 | }
2253 | },
2254 | "node_modules/webpack/node_modules/ajv-keywords": {
2255 | "version": "5.1.0",
2256 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
2257 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
2258 | "dev": true,
2259 | "license": "MIT",
2260 | "dependencies": {
2261 | "fast-deep-equal": "^3.1.3"
2262 | },
2263 | "peerDependencies": {
2264 | "ajv": "^8.8.2"
2265 | }
2266 | },
2267 | "node_modules/webpack/node_modules/json-schema-traverse": {
2268 | "version": "1.0.0",
2269 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
2270 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
2271 | "dev": true,
2272 | "license": "MIT"
2273 | },
2274 | "node_modules/webpack/node_modules/schema-utils": {
2275 | "version": "4.3.2",
2276 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
2277 | "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
2278 | "dev": true,
2279 | "license": "MIT",
2280 | "dependencies": {
2281 | "@types/json-schema": "^7.0.9",
2282 | "ajv": "^8.9.0",
2283 | "ajv-formats": "^2.1.1",
2284 | "ajv-keywords": "^5.1.0"
2285 | },
2286 | "engines": {
2287 | "node": ">= 10.13.0"
2288 | },
2289 | "funding": {
2290 | "type": "opencollective",
2291 | "url": "https://opencollective.com/webpack"
2292 | }
2293 | },
2294 | "node_modules/which": {
2295 | "version": "2.0.2",
2296 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2297 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2298 | "dev": true,
2299 | "dependencies": {
2300 | "isexe": "^2.0.0"
2301 | },
2302 | "bin": {
2303 | "node-which": "bin/node-which"
2304 | },
2305 | "engines": {
2306 | "node": ">= 8"
2307 | }
2308 | },
2309 | "node_modules/wildcard": {
2310 | "version": "2.0.0",
2311 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
2312 | "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
2313 | "dev": true
2314 | }
2315 | }
2316 | }
2317 |
--------------------------------------------------------------------------------